From ba2f3bb57fbe9d940cbd32497031e794b1781819 Mon Sep 17 00:00:00 2001 From: min Date: Tue, 9 Jun 2026 06:47:17 +0300 Subject: [PATCH] =?UTF-8?q?fix(lua):=20routeEvent=20=D0=B4=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D1=8F=20=D0=B2=20LuaSharedSandbox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: при касании монетки [Touch FIRE] логировалось но скрипт монетки не реагировал. Монетка не исчезала, счёт не менялся. Причина: GameRuntime.routeEvent пропускал sandbox если sb.target=null. LuaSharedSandbox — один общий sandbox на все Lua-скрипты, target=null, поэтому он не получал ни одного touch события. Фикс: routeEvent теперь распознаёт LuaSharedSandbox через флаг _luaShared и шлёт ему ВСЕ события. Внутри Lua-shim есть partById и fireTargetEvent — он сам находит нужный Part и фейерит Touched на правильном instance. Также: LuaSharedSandbox.constructor ставит this._luaShared = true. --- src/editor/engine/GameRuntime.js | 11 +++++++++++ src/editor/engine/lua/LuaSharedSandbox.js | 3 +++ 2 files changed, 14 insertions(+) diff --git a/src/editor/engine/GameRuntime.js b/src/editor/engine/GameRuntime.js index 71d8985..9a24221 100644 --- a/src/editor/engine/GameRuntime.js +++ b/src/editor/engine/GameRuntime.js @@ -1606,6 +1606,17 @@ export class GameRuntime { routeEvent(target, eventType, extra = {}) { if (!target || !eventType) return; for (const sb of this.sandboxes) { + // LuaSharedSandbox = один sandbox на все Lua-скрипты, target=null. + // Шлём ему ВСЕ события — shim сам найдёт соответствующий Part + // через partById и сфейерит Touched на нужной части. + if (sb.constructor?.name === 'LuaSharedSandbox' || sb._luaShared) { + const kind = eventType === 'touch' ? 'touched' + : eventType === 'untouch' ? 'untouched' + : eventType; + const primId = target.id ?? target.ref ?? null; + sb.sendEvent({ kind, primId, target, ...extra }); + continue; + } if (!sb.target) continue; if (!this._targetMatches(sb.target, target)) continue; sb.sendEvent({ type: eventType, ...extra }); diff --git a/src/editor/engine/lua/LuaSharedSandbox.js b/src/editor/engine/lua/LuaSharedSandbox.js index c06a72d..466a257 100644 --- a/src/editor/engine/lua/LuaSharedSandbox.js +++ b/src/editor/engine/lua/LuaSharedSandbox.js @@ -36,6 +36,9 @@ export class LuaSharedSandbox { this._guiTree = null; this._loopHandle = null; this._lastTickAt = 0; + // Маркер для GameRuntime.routeEvent — этот sandbox принимает все + // события и сам маршрутизирует через shim.fireTargetEvent. + this._luaShared = true; } setOnCommand(cb) { this._onCommand = cb; }