-- @name koptilnya/mesh_loader/sv_builder -- @server -- @include /koptilnya/libs/workers.txt require("/koptilnya/libs/workers.txt") MeshBuilder = class("MeshBuilder") function MeshBuilder:initialize(link, modelPlaceholder) self.link = link self.modelPlaceholder = modelPlaceholder or "models/holograms/cube.mdl" self._objectsNames = {} self._objects = {} self._objectsToSend = {} self._playersWithAccess = {} self._firstTimePlayers = find.allPlayers() self._firstTimeSended = false net.receive("obj_parsed", function(len, ply) net.start("obj_parsed") net.writeEntity(ply) net.send(owner()) self:onPlayerParsedObj(ply) end) net.receive("initialized", function(len, ply) net.start("initialized") net.writeEntity(ply) net.send(owner()) table.insert(self._playersWithAccess, ply) if self._firstTimeSended then self:_sendObjects(ply) end end) hook.add("ClientInitialized", "MeshBuilder_ClientInitialized", function(ply) if #self._firstTimePlayers > 0 then table.removeByValue(self._firstTimePlayers, ply) if #self._firstTimePlayers == 0 then self:_sendObjects(self._playersWithAccess) self._firstTimeSended = true end end end) hook.add("PlayerConnected", "MeshBuilder_PlayerConnected", function(ply) if not self._firstTimeSended then table.insert(self._firstTimePlayers, ply) end end) hook.add("PlayerDisconnected", "MeshBuilder_PlayerDisconnected", function(ply) table.removeByValue(self._firstTimePlayers, ply) end) addWorker(coroutine.wrap(function() while not http.canRequest() do coroutine.yield(1) end local objData http.get(link, function(response) objData = response end) while not objData do coroutine.yield(1) end self:onObjectLoaded(objData) self:onObjectParsed(self._objectsNames) return 2 end)) end function MeshBuilder:_sendObjects(target) if #self._objectsToSend == 0 then return end net.start("objects") for _, v in pairs(self._objectsToSend) 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 = {} self._objectsToSend = {} 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) if isValid(parent) then holo:setParent(parent) end table.insert(self._objects, {name = name, mat = mat, holo = holo}) return holo end function MeshBuilder:getResult() table.copyFromTo(self._objects, self._objectsToSend) if self._firstTimeSended then self:_sendObjects(self._playersWithAccess) end return self._objectsToSend end -- STUB function MeshBuilder:onObjectLoaded(objData) end function MeshBuilder:onObjectParsed(objectsNames) end function MeshBuilder:onPlayerParsedObj(ply) end