Nikita Kruglickiy b5c524705b A
2021-11-29 22:17:45 +03:00

117 lines
2.8 KiB
Plaintext

-- @name koptilnya/mesh_loader/sv_builder
-- @server
-- @include /koptilnya/libs/workers.txt
require("/koptilnya/libs/workers.txt")
local TIMEOUT = 3
MeshBuilder = class("MeshBuilder")
function MeshBuilder:initialize(link, modelPlaceholder)
self.link = link
self.modelPlaceholder = modelPlaceholder or "models/holograms/cube.mdl"
self._objects = {}
self._players = {}
self._timeoutPassed = false
PERMA.onPermissionsGained = function(_, ply)
table.insert(self._players, ply)
net.start("initialized")
net.writeEntity(ply)
net.send(owner())
if self._timeoutPassed then
self:_sendObjects(ply)
end
end
net.receive("obj_parsed", function(len, ply)
net.start("obj_parsed")
net.writeEntity(ply)
net.send(owner())
self:onPlayerParsedObj(ply)
end)
hook.add("PlayerDisconnected", "MeshBuilder_PlayerDisconnected", function(ply)
table.removeByValue(self._players, ply)
net.start("player_disconnect")
net.writeString(tostring(ply:getUserID()))
net.writeString(ply:getName())
net.send(owner())
end)
net.receive("starfall_error", function()
print("starfall_error")
net.readEntity(function(ply)
net.start("starfall_error")
net.writeEntity(ply)
net.send(owner())
end)
end)
end
function MeshBuilder:_sendObjects(target)
if #self._objects == 0 then return end
net.start("objects")
for _, v in pairs(self._objects) do
net.writeBit(1)
net.writeString(v.name)
net.writeTable(type(v.mat) == "table" and v.mat or { basetexture = tostring(v.mat) })
net.writeEntity(v.holo)
end
net.writeBit(0)
net.send(target)
end
function MeshBuilder:reset()
for _, v in pairs(self._objects) do
v.holo:remove()
end
self._objects = {}
end
function MeshBuilder:build(name, pos, ang, scale, color, mat, parent, relativeTo)
if isValid(relativeTo) then
pos = relativeTo:localToWorld(pos)
ang = relativeTo:localToWorldAngles(ang)
end
local holo = holograms.create(pos, ang, self.modelPlaceholder, scale)
holo:setColor(color)
holo:setRenderMode(color.a == 255 and RENDERMODE.NORMAL or RENDERMODE.TRANSCOLOR)
if isValid(parent) then
holo:setParent(parent)
end
table.insert(self._objects, {name = name, mat = mat, holo = holo})
return holo
end
function MeshBuilder:getResult()
if self._timeoutPassed then
self:_sendObjects(self._players)
else
timer.simple(TIMEOUT, function()
self._timeoutPassed = true
self:_sendObjects(self._players)
end)
end
return self._objects
end
-- STUB
function MeshBuilder:onPlayerParsedObj(ply)
end