117 lines
2.8 KiB
Plaintext
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
|