From 0bd64a0f78970b018d0720a6d8cc1b6c1326df38 Mon Sep 17 00:00:00 2001 From: Nikita Kruglickiy Date: Mon, 5 Apr 2021 22:38:50 +0600 Subject: [PATCH] fixes --- koptilnya/libs/render.txt | 1 + koptilnya/libs/table.txt | 22 ++++++ koptilnya/libs/utils.txt | 2 + koptilnya/libs/workers.txt | 2 + koptilnya/mesh_loader/builder.txt | 1 + koptilnya/mesh_loader/cl_builder.txt | 4 ++ koptilnya/mesh_loader/obj_parser.txt | 1 + koptilnya/mesh_loader/sv_builder.txt | 34 ++++++--- koptilnya/models/example.txt | 95 ++++++++++++++++++++++++++ koptilnya/models/ford_f-150_raptor.txt | 7 +- koptilnya/models/helicopter.txt | 43 ++++++++++++ koptilnya/models/jdm_wheels.txt | 8 +-- koptilnya/models/toyota_altezza.txt | 2 + koptilnya/models/vaz_2106.txt | 10 +-- 14 files changed, 208 insertions(+), 24 deletions(-) create mode 100644 koptilnya/models/example.txt create mode 100644 koptilnya/models/helicopter.txt diff --git a/koptilnya/libs/render.txt b/koptilnya/libs/render.txt index e933bb3..cc19b92 100644 --- a/koptilnya/libs/render.txt +++ b/koptilnya/libs/render.txt @@ -1,3 +1,4 @@ +-- @name koptilnya/libs/render --@client function render.drawWedge(x, y, w, h, angle, mouthSize, fidelity) diff --git a/koptilnya/libs/table.txt b/koptilnya/libs/table.txt index 6d41495..66af9b1 100644 --- a/koptilnya/libs/table.txt +++ b/koptilnya/libs/table.txt @@ -1,3 +1,5 @@ +-- @name koptilnya/libs/table + function table.chunk(tbl, size) size = size or 1 size = size > 0 and size or 1 @@ -17,3 +19,23 @@ function table.chunk(tbl, size) return result end + +function table.contains(tbl, ...) + local argCount = #arg + + if argCount == 1 then + return table.hasValue(tbl, arg[1]) + elseif argCount > 1 then + local result = true + + for _, v in pairs(arg) do + if not table.hasValue(tbl, v) then + result = true + + break + end + end + + return result + end +end diff --git a/koptilnya/libs/utils.txt b/koptilnya/libs/utils.txt index e7e1032..a4947b1 100644 --- a/koptilnya/libs/utils.txt +++ b/koptilnya/libs/utils.txt @@ -1,3 +1,5 @@ +-- @name koptilnya/libs/utils + function checkVarClass(var, class, message) if type(var) ~= "table" or var["class"] == nil or not var:isInstanceOf(class) then throw(message == nil and "Wrong variable class." or message, 1, true) diff --git a/koptilnya/libs/workers.txt b/koptilnya/libs/workers.txt index 83aac53..0207ae2 100644 --- a/koptilnya/libs/workers.txt +++ b/koptilnya/libs/workers.txt @@ -1,3 +1,5 @@ +-- @name koptilnya/libs/workers + WORKERS = {} WORKERS_QUOTA = 0.4 diff --git a/koptilnya/mesh_loader/builder.txt b/koptilnya/mesh_loader/builder.txt index d4951a2..b8292b0 100644 --- a/koptilnya/mesh_loader/builder.txt +++ b/koptilnya/mesh_loader/builder.txt @@ -1,3 +1,4 @@ +-- @name koptilnya/mesh_loader/builder -- @include sv_builder.txt -- @include cl_builder.txt if SERVER then diff --git a/koptilnya/mesh_loader/cl_builder.txt b/koptilnya/mesh_loader/cl_builder.txt index b40771f..a7676a1 100644 --- a/koptilnya/mesh_loader/cl_builder.txt +++ b/koptilnya/mesh_loader/cl_builder.txt @@ -1,3 +1,4 @@ +-- @name koptilnya/mesh_loader/cl_builder -- @client -- @include /koptilnya/libs/table.txt -- @include obj_parser.txt @@ -26,6 +27,9 @@ function MeshBuilder:initialize(link) self:_applyMeshes() end + net.start("initialized") + net.send() + net.receive("objects", function() self._objects = {} diff --git a/koptilnya/mesh_loader/obj_parser.txt b/koptilnya/mesh_loader/obj_parser.txt index 4b5276f..9b75283 100644 --- a/koptilnya/mesh_loader/obj_parser.txt +++ b/koptilnya/mesh_loader/obj_parser.txt @@ -1,3 +1,4 @@ +-- @name koptilnya/mesh_loader/obj_parser -- @client -- @include /koptilnya/libs/workers.txt require("/koptilnya/libs/workers.txt") diff --git a/koptilnya/mesh_loader/sv_builder.txt b/koptilnya/mesh_loader/sv_builder.txt index 5c59680..72bcf1e 100644 --- a/koptilnya/mesh_loader/sv_builder.txt +++ b/koptilnya/mesh_loader/sv_builder.txt @@ -1,3 +1,4 @@ +-- @name koptilnya/mesh_loader/sv_builder -- @server -- @include /koptilnya/libs/workers.txt require("/koptilnya/libs/workers.txt") @@ -11,25 +12,40 @@ function MeshBuilder:initialize(link, modelPlaceholder) 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(find.allPlayers()) - + self:_sendObjects(self._playersWithAccess) + self._firstTimeSended = true end - else - self:_sendObjects(ply) - end + end end) hook.add("PlayerConnected", "MeshBuilder_PlayerConnected", function(ply) @@ -71,11 +87,7 @@ 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 + end net.start("objects") for _, v in pairs(self._objectsToSend) do @@ -119,7 +131,7 @@ function MeshBuilder:getResult() table.copyFromTo(self._objects, self._objectsToSend) if self._firstTimeSended then - self:_sendObjects() + self:_sendObjects(self._playersWithAccess) end return self._objectsToSend diff --git a/koptilnya/models/example.txt b/koptilnya/models/example.txt new file mode 100644 index 0000000..e4dda49 --- /dev/null +++ b/koptilnya/models/example.txt @@ -0,0 +1,95 @@ +--@name Mesh loader example +--@author Opti1337 +--@shared +-- @include /koptilnya/mesh_loader/builder.txt +require("/koptilnya/mesh_loader/builder.txt") + +local LINK = "https://www.dropbox.com/s/k4rte84qv0s3k1d/vaz_2101_wheel.obj?dl=1" +local SCALE = Vector(1) + +local builder = {} + +if SERVER then + -- Создаем экземпляр MeshBuilder на сервере + builder = MeshBuilder:new(LINK) + + builder.onObjectLoaded = function(builder, objData) + --[[ + Вызывается, когда .obj загружен на сервере + objData {string} - Внутренности .obj + ]] + end + builder.onObjectParsed = function(builder, objectsName) + --[[ + Вызывается, когда .obj разобран на сервере + objectsNames {table} - Таблица с названиями объектов в .obj + ]] + end + + builder.onPlayerParsedObj = function(builder, ply) + --[[ + Вызывается, когда игрок разобрал .obj + ply {player} - Игрок, который разобрал .obj + ]] + end + + --[[ + Настраиваем конкретный меш + (название_объекта, позиция, угол, размер, цвет, материал, парент, относительно_чего_позиционировать) + ]] + builder:build("wheel", Vector(0), Angle(0), SCALE, Color(255, 255, 255), "sprops/textures/sprops_rubber", chip(), chip()) + + --[[ + Получаем текущий результат и отправляем его по возможности клиентам. Обычно вызывается после всех вызовов build + ]] + builder:getResult() +else -- CLIENT + function init() + -- Создаем экземпляр MeshBuilder на клиенте + builder = MeshBuilder:new(LINK) + + builder.onObjLoaded = function(builder, objData) + --[[ + Вызывается, когда .obj загружен на клиенте + objData {string} - Внутренности .obj + ]] + end + + builder.onObjParsed = function(builder, meshData, usedTriangles) + --[[ + Вызывается, когда .obj разобран на клиенте + meshData {table} - Таблица с мешами + usedTriangles {int} - Сколько использовано треугольников + ]] + end + + builder.onHologramsReceived = function(builder, objects) + --[[ + Вызывается, когда были получен список голограмм от сервера + objects {table} - Таблица объектов + name {string} - Имя объекта + holo {entity} - Голограмма + ]] + end + + builder.onMeshesApplied = function(builder) + --[[ + Вызывается, когда меши были применены к голограммам + ]] + end + end + + if hasPermission("http.get") and hasPermission("mesh") and hasPermission("entities.setRenderProperty", chip()) then + init() + else + -- Настраиваем нужные права, если их нет + setupPermissionRequest({"http.get", "mesh", "entities.setRenderProperty"}, "", true) + + -- Хук, который срабатывает при изменении прав + hook.add("permissionrequest", "_permissionrequest", function() + if permissionRequestSatisfied() then + init() + end + end) + end +end \ No newline at end of file diff --git a/koptilnya/models/ford_f-150_raptor.txt b/koptilnya/models/ford_f-150_raptor.txt index e339b05..a9625a8 100644 --- a/koptilnya/models/ford_f-150_raptor.txt +++ b/koptilnya/models/ford_f-150_raptor.txt @@ -4,6 +4,8 @@ -- @include /koptilnya/mesh_loader/builder.txt require("/koptilnya/mesh_loader/builder.txt") +DEBUG_MODE = true + local LINK = "https://drive.google.com/uc?id=1PvM_NNtdl43L_r2LZz_E9lO_JhWexFxW" local SCALE = Vector(0.9) @@ -11,9 +13,6 @@ local builder = {} if SERVER then builder = MeshBuilder:new(LINK) - builder.onPlayerParsedObj = function(builder, ply) - print(ply) - end builder:build("Podnojki", Vector(0), Angle(0), SCALE, Color(200, 200, 200), "sprops/textures/sprops_chrome", chip(), chip()) builder:build("Kenguryatnik", Vector(0), Angle(0), SCALE, Color(200, 200, 200), "sprops/textures/sprops_chrome", chip(), chip()) @@ -21,7 +20,7 @@ if SERVER then builder:build("Vihlop", Vector(0), Angle(0), SCALE, Color(200, 200, 200), "sprops/textures/sprops_chrome", chip(), chip()) builder:build("Podtumanniki", Vector(0), Angle(0), SCALE, Color(100, 100, 100), "models/debug/debugwhite", chip(), chip()) - builder:build("Nomera", Vector(0), Angle(0), SCALE, Color(54, 225, 220), "models/debug/debugwhite", chip(), chip()) + builder:build("Nomera", Vector(0), Angle(0), SCALE, Color(54, 225, 220), "sprops/sprops_grid_orange_12x12", chip(), chip()) builder:build("Okna", Vector(0), Angle(0), SCALE, Color(0, 0, 0, 200), "models/debug/debugwhite", chip(), chip()) builder:build("Skobi", Vector(0), Angle(0), SCALE, Color(55, 55, 55, 255), "models/debug/debugwhite", chip(), chip()) builder:build("Nakladki", Vector(0), Angle(0), SCALE, Color(44, 44, 44, 255), "models/debug/debugwhite", chip(), chip()) diff --git a/koptilnya/models/helicopter.txt b/koptilnya/models/helicopter.txt new file mode 100644 index 0000000..a2f2d65 --- /dev/null +++ b/koptilnya/models/helicopter.txt @@ -0,0 +1,43 @@ +--@name Helicopter +--@author Opti1337 +--@shared +-- @include /koptilnya/mesh_loader/builder.txt +require("/koptilnya/mesh_loader/builder.txt") + +DEBUG_MODE = true + +local LINK = "https://drive.google.com/uc?id=171YCCoAebzS0y1WRLQ8FZ6lyG_aZZtUB" +local SCALE = Vector(0.5) + +local builder = {} + +if SERVER then + builder = MeshBuilder:new(LINK) + + builder:build("heli.016", Vector(0), Angle(0), SCALE, Color(0, 203, 0), "models/debug/debugwhite", chip(), chip()) + builder:build("heli.001_heli.017", Vector(0), Angle(0), SCALE, Color(255, 225, 255, 90), "models/debug/debugwhite", chip(), chip()) + builder:build("heli.002_heli.018", Vector(0), Angle(0), SCALE, Color(255, 225, 255), "models/debug/debugwhite", chip(), chip()) + builder:build("heli.003_heli.019", Vector(0), Angle(0), SCALE, Color(231, 0, 0), "models/debug/debugwhite", chip(), chip()) + builder:build("heli.004_heli.020", Vector(0), Angle(0), SCALE, Color(96, 96, 203), "models/debug/debugwhite", chip(), chip()) + builder:build("heli.005_heli.021", Vector(0), Angle(0), SCALE, Color(130, 130, 130), "models/debug/debugwhite", chip(), chip()) + builder:build("heli.006_heli.022", Vector(0), Angle(0), SCALE, Color(255, 224, 0), "models/debug/debugwhite", chip(), chip()) + builder:build("heli.007_heli.023", Vector(0), Angle(0), SCALE, Color(255, 225, 255), "models/debug/debugwhite", chip(), chip()) + + builder:getResult() +else + function init() + builder = MeshBuilder:new(LINK) + end + + if hasPermission("http.get") and hasPermission("mesh") and hasPermission("entities.setRenderProperty", chip()) then + init() + else + setupPermissionRequest({"http.get", "mesh", "entities.setRenderProperty"}, "", true) + + hook.add("permissionrequest", "_permissionrequest", function() + if permissionRequestSatisfied() then + init() + end + end) + end +end diff --git a/koptilnya/models/jdm_wheels.txt b/koptilnya/models/jdm_wheels.txt index 4e53bd8..6a8f309 100644 --- a/koptilnya/models/jdm_wheels.txt +++ b/koptilnya/models/jdm_wheels.txt @@ -1,7 +1,7 @@ ---@shared ---@name JDM Wheels ---@author Opti1337, .hemp ---@include /koptilnya/mesh_loader/builder.txt +-- @shared +-- @name JDM Wheels +-- @author Opti1337, .hemp +-- @include /koptilnya/mesh_loader/builder.txt require("/koptilnya/mesh_loader/builder.txt") diff --git a/koptilnya/models/toyota_altezza.txt b/koptilnya/models/toyota_altezza.txt index 23eaa3d..eaa32c5 100644 --- a/koptilnya/models/toyota_altezza.txt +++ b/koptilnya/models/toyota_altezza.txt @@ -4,6 +4,8 @@ -- @include /koptilnya/mesh_loader/builder.txt require("/koptilnya/mesh_loader/builder.txt") +DEBUG_MODE = true + local LINK = "https://www.dropbox.com/s/ovw7f8q65tlcdy5/is300.obj?dl=1" local SCALE = Vector(0.8, 0.79, 0.8) diff --git a/koptilnya/models/vaz_2106.txt b/koptilnya/models/vaz_2106.txt index 39a3de0..20e5365 100644 --- a/koptilnya/models/vaz_2106.txt +++ b/koptilnya/models/vaz_2106.txt @@ -1,4 +1,3 @@ --- @shared -- @name VAZ 2106 -- @author Opti1337, DarkSupah -- @include /koptilnya/mesh_loader/builder.txt @@ -68,6 +67,7 @@ local builder = {} if SERVER then builder = MeshBuilder:new(LINK) + builder:build("Body__Exterior", Vector(0), Angle(0), SCALE, COLORS.Exterior, MATERIALS.Exterior, chip(), chip()) builder:build("Glass", Vector(0), Angle(0), SCALE, COLORS.Glass, MATERIALS.Glass, chip(), chip()) @@ -91,11 +91,11 @@ if SERVER then builder:build("Body__DoorsFrame__Chrome", Vector(0), Angle(0), SCALE, COLORS.Chrome, MATERIALS.Chrome, chip(), chip()) - -- builder:build("Body__FrontBumper__Chrome", Vector(0), Angle(0), SCALE, COLORS.Chrome, MATERIALS.Chrome, chip(), chip()) - -- builder:build("Body__FrontBumper__Plastic", Vector(0), Angle(0), SCALE, COLORS.Plastic, MATERIALS.Plastic, chip(), chip()) + builder:build("Body__FrontBumper__Chrome", Vector(0), Angle(0), SCALE, COLORS.Chrome, MATERIALS.Chrome, chip(), chip()) + builder:build("Body__FrontBumper__Plastic", Vector(0), Angle(0), SCALE, COLORS.Plastic, MATERIALS.Plastic, chip(), chip()) - -- builder:build("Body__RearBumper__Chrome", Vector(0), Angle(0), SCALE, COLORS.Chrome, MATERIALS.Chrome, chip(), chip()) - -- builder:build("Body__RearBumper__Plastic", Vector(0), Angle(0), SCALE, COLORS.Plastic, MATERIALS.Plastic, chip(), chip()) + builder:build("Body__RearBumper__Chrome", Vector(2, 0, 0), Angle(0), SCALE, COLORS.Chrome, MATERIALS.Chrome, chip(), chip()) + builder:build("Body__RearBumper__Plastic", Vector(2, 0, 0), Angle(0), SCALE, COLORS.Plastic, MATERIALS.Plastic, chip(), chip()) builder:build("Interior__Floor__InteriorFloor", Vector(0), Angle(0), SCALE, COLORS.InteriorFloor, MATERIALS.InteriorFloor, chip(), chip()) builder:build("Interior__DashBase__Dashboard", Vector(0), Angle(0), SCALE, COLORS.DashboardBase, MATERIALS.DashboardBase, chip(), chip())