-- @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 not target then return end if type(target) == "table" and #target == 0 then return end 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