feat(rbxl): XML-������ ������ .rbxl + Day/Night + Tool/Mouse/Backpack flow #38
@ -67,6 +67,49 @@ ContextActionResult, UserInputState, BorderMode, FormFactor.
|
|||||||
не должны запускаться при старте. `parseRobloxLuaMeta()` парсит JSON
|
не должны запускаться при старте. `parseRobloxLuaMeta()` парсит JSON
|
||||||
из второй строки packed-кода, при `enabled=false` скрипт идёт в `rbxlSkipped`.
|
из второй строки packed-кода, при `enabled=false` скрипт идёт в `rbxlSkipped`.
|
||||||
|
|
||||||
|
### Tool/Backpack/Mouse flow (Шаг 1)
|
||||||
|
|
||||||
|
Контекст: Roblox-Tool это объект который попадает в Backpack игрока,
|
||||||
|
при экипировке (клавиша 1-9) фейерит Tool.Equipped с настоящим Mouse,
|
||||||
|
скрипты внутри Tool слушают MouseButton1Down/KeyDown.
|
||||||
|
|
||||||
|
**В `RobloxShim.js`:**
|
||||||
|
- `localPlayer.Backpack` — инвентарь.
|
||||||
|
- `localPlayer:GetMouse()` → playerMouse с Button1Down/KeyDown/Hit.Position.
|
||||||
|
- Внутренний `allTools[]` registry + `equippedTool` слот.
|
||||||
|
- `Instance.new('Tool')` теперь:
|
||||||
|
- создаёт виртуальный `Handle` (Part внутри Tool);
|
||||||
|
- регистрирует в `allTools[]`;
|
||||||
|
- шлёт `toolRegistered {index, name}` в GameRuntime.
|
||||||
|
- `fireGlobalEvent` обрабатывает: `equipTool`, `unequipTool`,
|
||||||
|
`toolActivated`, `toolDeactivated`, `mouseButton1Down`/`Up`, `keyDown`/`Up`.
|
||||||
|
- `__rbxl_get_tool_by_name(name)` — для script.Parent резолва.
|
||||||
|
|
||||||
|
**В `LuaSharedSandbox.js`:**
|
||||||
|
- `addScript(id, code, target, name, {toolName})` — расширенная сигнатура.
|
||||||
|
- В `_startSingleScript` если есть `toolName` — `script.Parent` = виртуальный Tool.
|
||||||
|
|
||||||
|
**В `GameRuntime.js`:**
|
||||||
|
- Эвристика: скрипты с `target=null` и содержащие
|
||||||
|
`(script.Parent|Tool).(Equipped|Unequipped|Activated|Deactivated)` →
|
||||||
|
получают `toolName='Tool'`, группируются в один общий Tool.
|
||||||
|
- `_registerRbxlTool(payload)` — кладёт item в InventoryUI.hotbar,
|
||||||
|
слушает `slot` event → шлёт `equipTool`/`unequipTool`.
|
||||||
|
- `canvas.mousedown` → `mouseButton1Down` + `toolActivated` с raycast Hit.
|
||||||
|
- `_raycastFromCamera()` — простой ray из камеры на 50 unit вперёд.
|
||||||
|
|
||||||
|
**Надо ли в JS?** ✅ Да — Tool/Backpack/Mouse это базовый Roblox-game-loop.
|
||||||
|
|
||||||
|
### Импорт изменений в converter.py (не задеплоено)
|
||||||
|
|
||||||
|
Файл изменён локально, но importer на VM 130 — не обновлён. Когда придёт
|
||||||
|
время деплоя, ключевые правки:
|
||||||
|
- `_collect_tool(inst)` — собирает `scene['tools'][]` из Tool/HopperBin;
|
||||||
|
- `_find_ancestor_tool(inst)` — определяет в каком Tool лежит Script;
|
||||||
|
- В `_convert_script` добавлено поле `tool_id` в метадату.
|
||||||
|
|
||||||
|
Это уберёт необходимость эвристики на стороне studio.
|
||||||
|
|
||||||
### Надо ли портировать в JS-движок?
|
### Надо ли портировать в JS-движок?
|
||||||
|
|
||||||
✅ **Да, всё** — это базовый Roblox-совместимый API, который должен работать
|
✅ **Да, всё** — это базовый Roblox-совместимый API, который должен работать
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user