diff --git a/src/editor/engine/GameRuntime.js b/src/editor/engine/GameRuntime.js index f8fe371..b051df0 100644 --- a/src/editor/engine/GameRuntime.js +++ b/src/editor/engine/GameRuntime.js @@ -972,11 +972,31 @@ export class GameRuntime { } else if (state?.player) { realPos = { x: state.player.x, y: state.player.y, z: state.player.z }; } + // Собираем актуальные позиции спавненных динамических примитивов + // (id >= 800000) — нужно для AABB-touched-check в Lua-shim, чтобы + // ловить попадание игрока в падающий куб. + let spawnedPositions = null; + try { + const pm = this.scene3d?.primitiveManager; + if (pm && pm.instances) { + for (const [id, data] of pm.instances.entries()) { + if (id < 800000 || data.anchored !== false) continue; + if (!spawnedPositions) spawnedPositions = []; + spawnedPositions.push([id, data.x, data.y, data.z]); + } + } + } catch (_) {} for (const sb of this.sandboxes) { // Обновляем реальную позицию игрока для Lua-shim if (realPos && sb.api?.updatePlayerPos) { try { sb.api.updatePlayerPos(realPos.x, realPos.y, realPos.z); } catch (_) {} } + // Синк спавненных динамических примитивов + if (spawnedPositions && sb.api?.updateSpawnedPos) { + for (const [id, x, y, z] of spawnedPositions) { + try { sb.api.updateSpawnedPos(id, x, y, z); } catch (_) {} + } + } // Для скриптов с target — добавляем актуальную позицию self const stateForSb = sb.target ? { ...state, selfPosition: this._collectSelfPosition(sb.target) } diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index 6f92cf1..a883530 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -2185,6 +2185,16 @@ export function registerRobloxShim(lua, opts) { updatePlayerPos(x, y, z) { api._realPlayerPos = { x: +x, y: +y, z: +z }; }, + // Синхронизация позиций спавненных физических частей (падающие кубы). + // GameRuntime каждый кадр зовёт это с актуальными координатами от + // pm.instances — иначе наш AABB-touched-check считает позиции + // устаревшими (на момент создания) и не ловит касание. + updateSpawnedPos(id, x, y, z) { + const part = partById.get(Number(id)); + if (part && part._state && part._state.Position) { + part._state.Position = new RbxVector3(x, y, z); + } + }, // Доступ к ключевым объектам (для тестов и отладки) partById, localPlayer, humanoid, character, workspace, players, game, };