From c5b713fd1f5a9bb32a57419178a62a85ba6cf826 Mon Sep 17 00:00:00 2001 From: min Date: Mon, 8 Jun 2026 13:19:21 +0300 Subject: [PATCH] =?UTF-8?q?feat(rbxl):=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20=D0=B2=D1=8B=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D1=8B=20=D0=BF=D0=BE=20=D1=83?= =?UTF-8?q?=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Типичная .rbxl карта = 500-2000 Lua-скриптов. Многие используют DataStoreService, Tools, PlayerGui, UserInputService, и т.п. фичи которых у нас нет. Даже с object-stub Proxy сотни runtime-падений после init подвешивают вкладку. Решение: импорт сохраняет geometry+GUI+физику, скрипты пропускаются. Юзер пишет свои Lua-скрипты к импортированным примитивам — они используют наш Этап 1-7 API (Vector3, Touched, Position-setters, Sound, TweenService) и работают идеально. Включить старое поведение: window.__RBXL_RUN_IMPORTED = true в DevTools перед Play. --- src/editor/engine/GameRuntime.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/editor/engine/GameRuntime.js b/src/editor/engine/GameRuntime.js index 0bf3b6e..99072d9 100644 --- a/src/editor/engine/GameRuntime.js +++ b/src/editor/engine/GameRuntime.js @@ -121,8 +121,16 @@ export class GameRuntime { // скрипты (с маркером // @roblox-lua) теперь идут через ОДИН LuaSharedSandbox. // .rbxl-скрипты распаковываем из JS-комментария-обёртки в чистый Lua. const luaUserBatch = []; + // По умолчанию импортированные .rbxl-скрипты НЕ выполняются: + // - типичная Roblox-карта = 500-2000 скриптов, многие используют + // DataStore/Tool/PlayerGui/UserInputService, которых у нас нет; + // - даже с stub'ами сотни падений → tab подвисает; + // Юзер может включить через window.__RBXL_RUN_IMPORTED = true в консоли. + const runImportedRbxl = typeof window !== 'undefined' && window.__RBXL_RUN_IMPORTED === true; + let rbxlSkipped = 0; for (const s of scripts) { if (s && typeof s.code === 'string' && s.code.startsWith('// @roblox-lua')) { + if (!runImportedRbxl) { rbxlSkipped++; continue; } const luaSource = unpackRobloxLuaCode(s.code); if (luaSource && luaSource.trim()) { luaUserBatch.push({ @@ -212,6 +220,9 @@ export class GameRuntime { if (rbxlImported > 0) { this._log('info', `Запущено Roblox-Lua скриптов (импортированных): ${rbxlImported}`); } + if (rbxlSkipped > 0) { + this._log('info', `Импортированных .rbxl-скриптов пропущено: ${rbxlSkipped}. Включить: window.__RBXL_RUN_IMPORTED = true`); + } if (luaWritten > 0) { this._log('info', `Запущено Lua-скриптов юзера: ${luaWritten}`); }