From 1a174f285428fad27133268efa33147465c416b9 Mon Sep 17 00:00:00 2001 From: min Date: Tue, 9 Jun 2026 18:12:01 +0300 Subject: [PATCH] =?UTF-8?q?fix(g7):=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=80=D0=B0=D0=B4=D0=B8=D1=83=D1=81=20Touched?= =?UTF-8?q?=20=D0=BD=D0=B0=201.2=20=E2=80=94=20=D0=BA=D1=83=D0=B1=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=82=D1=81=D1=8F=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D1=81=D0=B1=D0=BB=D0=B8=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Куб с физикой отталкивается от игрока (DynamicsManager push) и успевает отскочить до следующего кадра. Строгий AABB ловил только при защемлении в углу. Расширение SLACK=1.2 единицы ловит 'почти-контакт' — куб собирается при подходе на ~1 единицу. --- src/editor/engine/lua/RobloxShim.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index a883530..206dc56 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -2039,14 +2039,19 @@ export function registerRobloxShim(lua, opts) { try { HEARTBEAT_SIGNAL.Fire(dt); } catch (_) {} try { STEPPED_SIGNAL.Fire(performance.now() / 1000, dt); } catch (_) {} // Авто-детект Touched на спавненных частях (id >= 800000): - // BabylonScene._detectTouchEvents срабатывает только для скриптов - // с явным target. Спавненные через __rbxl_spawn_part примитивы - // (падающие кубы, снаряды) Babylon не знает, поэтому делаем - // AABB-check игрок↔part прямо в shim каждый кадр. + // Спавненные через __rbxl_spawn_part примитивы (падающие кубы, + // снаряды) Babylon не знает (target=null), поэтому делаем + // proximity-check игрок↔part прямо в shim каждый кадр. + // + // Используем РАСШИРЕННЫЙ радиус (не строгий AABB), потому что + // физтело куба отталкивается от игрока при контакте — куб может + // успеть отскочить ДО следующего кадра. Расширяем зону на 1.2 + // единицы, чтобы поймать "почти-контакт". try { const pp = api._realPlayerPos; if (!pp) return; const phw = 0.4, phh = 0.9, phd = 0.4; + const SLACK = 1.2; // расширение зоны касания for (const [id, part] of partById.entries()) { if (id < 800000) continue; if (!part || part.Destroyed) continue; @@ -2054,9 +2059,9 @@ export function registerRobloxShim(lua, opts) { const pos = part._state?.Position; const size = part._state?.Size; if (!pos || !size) continue; - const hw = size.X / 2 + 0.1; - const hh = size.Y / 2 + 0.1; - const hd = size.Z / 2 + 0.1; + const hw = size.X / 2 + SLACK; + const hh = size.Y / 2 + SLACK; + const hd = size.Z / 2 + SLACK; const overlap = pp.x + phw > pos.X - hw && pp.x - phw < pos.X + hw && pp.y + phh > pos.Y - hh && pp.y - phh < pos.Y + hh &&