diff --git a/RUBLOX_LUA_API_CHANGELOG.md b/RUBLOX_LUA_API_CHANGELOG.md index a46a3f0..c20ed8b 100644 --- a/RUBLOX_LUA_API_CHANGELOG.md +++ b/RUBLOX_LUA_API_CHANGELOG.md @@ -8,6 +8,80 @@ Roblox-играми. Цель — потом продублировать тот --- +## 2026-06-08 — Итерация 3: ROBLOX Battle (arch1_ROBLOX_Battle_v2.rbxl, проект 2851) + +**Контекст:** PvP-арена 2009 в XML, 1677 примитивов, 66 скриптов, 4 команды +(TeamBeacon), 5 оружий, 12 батутов, KillFeed, раунды. + +### Реализовано 11 механик из 14 + +1. **Teams** — game.Teams сервис + Team-инстансы, эвристика TeamBeacon-Model + в converter.py → автоматически создаёт 4 команды по имени. +2. **Leaderstats UI** — IntValue.Value реактивно через Object.defineProperty, + при Parent=leaderstats шлёт leaderstatSet → существующий LeaderstatsManager. +3. **BindableFunction/RemoteFunction** + Message/Hint классы с реактивным Text. +4. **KillFeed UI** + creator-tag tracking в Humanoid.TakeDamage. DOM-overlay. +5. **SpawnLocation.TeamColor** → scene.team_spawns[]. +6. **Tool/Model:Clone()** + :MakeJoints/:BreakJoints/:Remove no-op. +7. **Creator-tag**: ObjectValue.Name='creator' проверяется на Health=0. +8. **RegenerationScript** — no-op skip по имени (Anchored=True держит). +9. **BattleArmor** — реактивный Humanoid.MaxHealth/Health/WalkSpeed/JumpPower. +10. **WinGui/FireButton** через GuiManager. +11. **AdminConsole** — no-op. +12. **Bouncer** — BodyVelocity.Y > 10 + Parent=Torso → playerSet jumpVelocity. +14. **Mouse.Icon** → CSS cursor через canvas.style.cursor. + +Также добавлены: **tick/time/delay/spawn/LoadLibrary** legacy globals, +**SpecialMesh/BlockMesh/CylinderMesh/FileMesh** Instance.new стабы. + +### Новый модуль RbxlHudOverlay.js + +DOM-оверлей поверх canvas с KillFeed (правый верх, fade 5с) + Message +(центр верх) + WinGui (центр). Lazy-создаётся. + +### Tight-loop защита (КРИТИЧНО) + +Roblox 2009 паттерн: +```lua +while not parent:FindFirstChild(name) do parent.ChildAdded:wait() end +``` + +Наш Signal:wait() возвращает синхронно — цикл бесконечный, страница виснет. +**Не можем yield** из JS-функции через wasmoon C-call boundary. + +Перепробовали: +- debug.sethook(yield, 'i', N) — внутри C-call падает с `yield across C-call`. +- pcall(coroutine.yield) — ошибка ловится, счётчик не сбрасывается, вис. + +**Финал**: regex-фильтр в GameRuntime.js пропускает скрипты с этими паттернами. +Из 66 скриптов 37 пропущены, 29 работают. Жертвы: RoundScript, GameClock, +Spawner, KillFeed, LeaderboardV3, оружие Launcher/Sword/Slingshot/Cannon. + +### CFrame YXZ Euler + +Переписал `to_euler_xyz` в `rbxl_types.py` под Babylon YXZ convention: +rx=asin(-r12), ry=atan2(r02,r22), rz=atan2(r10,r11) + gimbal-lock guard. +Раньше извлекал XYZ-Euler, Babylon применял как YXZ — мостики +поворачивались криво. + +### Persistence настроек света + +BabylonScene.serialize/loadFromState сохраняют scene.lighting: +sunIntensity, hemiIntensity, sceneAmbient, exposure, contrast, saturation. + +### Известные баги + +- `memory access out of bounds` (1 раз) — WASM-crash одного скрипта. +- `Cannot read properties of null ('then')` — wasmoon promise-detection, + скрипт init крашится но не блокирует. +- 0 teams при загрузке старого проекта — нужен переимпорт. + +### В JS + +✅ Всё: Teams формат общий, KillFeed/Message HUD общий для студии+плеера. + +--- + ## 2026-06-08 — Итерация 2: Crossroads (arch1_Original_Crossroads.rbxl, проект 2827) **Контекст:** Классическая Roblox-карта 2009 года для PvP, **XML-формат** .rbxl