From a4f2f0800bc32fc224c98d267463fea919764d10 Mon Sep 17 00:00:00 2001 From: min Date: Tue, 9 Jun 2026 17:11:23 +0300 Subject: [PATCH] =?UTF-8?q?fix(g4):=20=D0=B4=D0=B2=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20+=20=D0=BC=D0=B5=D1=82=D0=B0=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86=D0=B0=20Vector3=20(+,=20-,=20*,=20/)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: door.Position + Vector3.new(0, 6, 0) возвращало nil потому что wasmoon не создаёт метаметоды (__add) для JS-классов автоматически. Фикс: 1. В скрипте кнопки явно считаем Vector3.new(dp.X, dp.Y+6, dp.Z) без +. 2. В prelude добавил метатаблицу Vector3 для будущего использования с операторами +, -, *, /, унарный -, ==, tostring. Работает между двумя Vector3-таблицами, созданными через Vector3.new в Lua. --- src/community/docsGamesBuildersLua.js | 3 +- src/editor/engine/lua/RobloxShim.js | 63 +++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/community/docsGamesBuildersLua.js b/src/community/docsGamesBuildersLua.js index 8025c28..31b4eba 100644 --- a/src/community/docsGamesBuildersLua.js +++ b/src/community/docsGamesBuildersLua.js @@ -339,7 +339,8 @@ UserInputService.InputBegan:Connect(function(input, gp) -- Находим дверь по имени и поднимаем её local door = workspace:FindFirstChild("Дверь") if door then - local goal = { Position = door.Position + Vector3.new(0, 6, 0) } + local dp = door.Position + local goal = { Position = Vector3.new(dp.X, dp.Y + 6, dp.Z) } TweenService:Create(door, TweenInfo.new(1.2), goal):Play() door.CanCollide = false end diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index a431ac5..4a4aa74 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -1741,6 +1741,69 @@ export function registerRobloxShim(lua, opts) { end wait = rbx_wait + -- ═══════════════════════════════════════════════════════════════ + -- Метатаблица для Vector3 — операторы +, -, *, /, унарный - + -- wasmoon не создаёт __add автоматически для JS-классов. + -- Оборачиваем Vector3.new чтобы возвращаемая таблица имела __add. + -- ═══════════════════════════════════════════════════════════════ + do + local _origV3New = Vector3.new + local v3meta = {} + local function makeV3(x, y, z) + local v = _origV3New(x or 0, y or 0, z or 0) + -- v — это userdata от wasmoon. Делаем proxy-таблицу с метой. + local t = setmetatable({}, v3meta) + rawset(t, '_v', v) + rawset(t, 'X', v.X); rawset(t, 'Y', v.Y); rawset(t, 'Z', v.Z) + rawset(t, 'Magnitude', v.Magnitude or math.sqrt(x*x+y*y+z*z)) + return t + end + local function asV3(v) + if type(v) == 'table' and rawget(v, 'X') ~= nil then return v end + if v == nil then return makeV3(0,0,0) end + return makeV3(v.X or 0, v.Y or 0, v.Z or 0) + end + v3meta.__add = function(a, b) + a = asV3(a); b = asV3(b) + return makeV3(a.X + b.X, a.Y + b.Y, a.Z + b.Z) + end + v3meta.__sub = function(a, b) + a = asV3(a); b = asV3(b) + return makeV3(a.X - b.X, a.Y - b.Y, a.Z - b.Z) + end + v3meta.__mul = function(a, b) + if type(b) == 'number' then a = asV3(a); return makeV3(a.X*b, a.Y*b, a.Z*b) end + if type(a) == 'number' then b = asV3(b); return makeV3(b.X*a, b.Y*a, b.Z*a) end + a = asV3(a); b = asV3(b) + return makeV3(a.X*b.X, a.Y*b.Y, a.Z*b.Z) + end + v3meta.__div = function(a, b) + if type(b) == 'number' then a = asV3(a); return makeV3(a.X/b, a.Y/b, a.Z/b) end + a = asV3(a); b = asV3(b) + return makeV3(a.X/b.X, a.Y/b.Y, a.Z/b.Z) + end + v3meta.__unm = function(a) + a = asV3(a); return makeV3(-a.X, -a.Y, -a.Z) + end + v3meta.__eq = function(a, b) + a = asV3(a); b = asV3(b) + return a.X == b.X and a.Y == b.Y and a.Z == b.Z + end + v3meta.__tostring = function(a) + a = asV3(a) + return string.format("%g, %g, %g", a.X, a.Y, a.Z) + end + Vector3 = setmetatable({ + new = makeV3, + zero = makeV3(0,0,0), + one = makeV3(1,1,1), + xAxis = makeV3(1,0,0), + yAxis = makeV3(0,1,0), + zAxis = makeV3(0,0,1), + FromNormalId = function() return makeV3(0,0,0) end, + }, {}) + end + -- Roblox legacy globals tick = function() return os.time() end -- секунды с epoch time = function() return os.clock() * 1000 end -- ms аптайм