-- @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) if DEBUG_MODE then print(string.format("%s parsed the .obj", ply:getName())) end self:onPlayerParsedObj(ply) end) net.receive("initialized", function(len, ply) if DEBUG_MODE then print(string.format("%s initialized", ply:getName())) end 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) for object in string.gmatch(objData, "^?\n?o%s([%w_%.%-]+)") do table.insert(self._objectsNames, object) end 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.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) holo:setMaterial(mat) if isValid(parent) then holo:setParent(parent) end table.insert(self._objects, {name = name, 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