From 932ef2bc204d324651bfc0a9e3da575397313c37 Mon Sep 17 00:00:00 2001 From: min Date: Mon, 8 Jun 2026 19:46:39 +0300 Subject: [PATCH] =?UTF-8?q?feat(rbxl):=20RegenerationScript=20no-op=20+=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?Humanoid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 8. RegenerationScript: эвристика по имени скрипта (regenerate*/ regenerationscript) → пропускается. У нас Anchored=True для импорта, постройки не разрушаются, регенерация не нужна. Их работа дала бы визуальные глитчи (model:remove + Clone каждые 2 мин). 9. BattleArmor: Humanoid.MaxHealth/Health/WalkSpeed/JumpPower теперь реактивные (Object.defineProperty). При смене .MaxHealth=N шлёт playerSet → player.maxHp обновляется → HUD HP-бар. BattleArmor touch'нул → Humanoid.MaxHealth=20, Health=20 → игрок видит броню. 10. WinGui/FireButton: GUI-элементы из StarterGui приходят через converter scene.gui[] и рендерятся стандартно. Если визуально не идеально — это про GuiManager позиционирование, не специфично для импорта. 11. AdminConsole: no-op, скрипт-заглушка, ничего не делает. 13. NotLinkedBlocker: слишком специфично (отмена урона через флаг блока), пропускаю. ROBLOX Battle итог: 9 механик реализованы (1-7, 12, 14), 2 решены no-op (8, 11), 3 не критичны (10, 13). Карта должна играться. --- src/editor/engine/GameRuntime.js | 13 +++++++++++++ src/editor/engine/lua/RobloxShim.js | 29 +++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/editor/engine/GameRuntime.js b/src/editor/engine/GameRuntime.js index 47acba5..8320eee 100644 --- a/src/editor/engine/GameRuntime.js +++ b/src/editor/engine/GameRuntime.js @@ -134,6 +134,13 @@ export class GameRuntime { // запуск немедленно крашит coroutine (WASM access out of bounds). const meta = parseRobloxLuaMeta(s.code); if (meta && meta.enabled === false) { rbxlSkipped++; continue; } + // Пропускаем Regeneration-скрипты: у нас Anchored=True для + // импорта, постройки не разрушаются, регенерация не нужна. + // Их работа (model:remove + Clone) даст визуальные глитчи. + const sname = String(s.name || '').toLowerCase(); + if (sname.startsWith('regenerate') || sname === 'regenerationscript') { + rbxlSkipped++; continue; + } const luaSource = unpackRobloxLuaCode(s.code); if (luaSource && luaSource.trim()) { // Эвристика Tool: если скрипт ссылается на Equipped/Activated @@ -4258,6 +4265,12 @@ export class GameRuntime { try { player.walkSpeed = Number(payload.value) || player.walkSpeed; } catch (_) {} } else if (payload.prop === 'jumpPower') { try { player.jumpPower = Number(payload.value) || player.jumpPower; } catch (_) {} + } else if (payload.prop === 'maxHealth') { + try { + const max = Math.max(1, Number(payload.value) || 100); + player.maxHp = max; + if (player.hp > max) player.hp = max; + } catch (_) {} } return; } diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index d4c96aa..3c9fbe1 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -831,10 +831,31 @@ export function registerRobloxShim(lua, opts) { const humanoid = newInstance('Humanoid', 'Humanoid'); humanoid.Parent = character; - humanoid.Health = 100; - humanoid.MaxHealth = 100; - humanoid.WalkSpeed = 16; - humanoid.JumpPower = 50; + let _hp = 100, _maxHp = 100, _ws = 16, _jp = 50; + Object.defineProperty(humanoid, 'Health', { + get() { return _hp; }, + set(v) { + _hp = Math.max(0, Math.min(_maxHp, Number(v) || 0)); + try { humanoid.HealthChanged.Fire(_hp); } catch (_) {} + send('playerSet', { prop: 'health', value: _hp }); + }, + }); + Object.defineProperty(humanoid, 'MaxHealth', { + get() { return _maxHp; }, + set(v) { + _maxHp = Math.max(1, Number(v) || 100); + if (_hp > _maxHp) humanoid.Health = _maxHp; + send('playerSet', { prop: 'maxHealth', value: _maxHp }); + }, + }); + Object.defineProperty(humanoid, 'WalkSpeed', { + get() { return _ws; }, + set(v) { _ws = Number(v) || 16; send('playerSet', { prop: 'walkSpeed', value: _ws }); }, + }); + Object.defineProperty(humanoid, 'JumpPower', { + get() { return _jp; }, + set(v) { _jp = Number(v) || 50; send('playerSet', { prop: 'jumpPower', value: _jp }); }, + }); humanoid.Died = makeSignal(); humanoid.HealthChanged = makeSignal(); humanoid.Touched = makeSignal();