Nikita Kruglickiy eb6144ae94 Cleaning
2021-04-03 21:08:08 +06:00

138 lines
3.2 KiB
Plaintext

-- @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._firstTimePlayers = find.allPlayers()
self._firstTimeSended = false
net.receive("obj_parsed", function(len, ply)
self:onPlayerParsedObj(ply)
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(find.allPlayers())
self._firstTimeSended = true
end
else
self:_sendObjects(ply)
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
if type(target) == "table" and #target == 0 or type(target) == "Player" 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()
end
return self._objectsToSend
end
-- STUB
function MeshBuilder:onObjectLoaded(objData)
end
function MeshBuilder:onObjectParsed(objectsNames)
end
function MeshBuilder:onPlayerParsedObj(ply)
end