diff --git a/src/editor/engine/BabylonScene.js b/src/editor/engine/BabylonScene.js index a7dc045..f16d81f 100644 --- a/src/editor/engine/BabylonScene.js +++ b/src/editor/engine/BabylonScene.js @@ -3271,7 +3271,30 @@ export class BabylonScene { } if (!this.gameRuntime) return; - const pick = this._pickFromCenter(); + // В pointer-lock (1-е лицо) курсор скрыт в центре — пикаем центром. + // В 3-м лице (свободный курсор) — пикаем по координатам клика. + const locked = (document.pointerLockElement === this.canvas); + let pick; + if (!locked && Number.isFinite(clickX) && Number.isFinite(clickY)) { + const pi = this.scene.pick(clickX, clickY, (mesh) => { + if (!mesh.isPickable) return false; + if (mesh === this._ghostMesh) return false; + if (mesh.name && mesh.name.startsWith('gridLine')) return false; + return true; + }); + if (pi?.hit) { + let m = pi.pickedMesh; + if (m?.metadata?._isBlockProto && this.blockManager) { + const proxy = this.blockManager.findProxyByPickInfo(pi); + if (proxy) m = proxy; + } + pick = { mesh: m, point: pi.pickedPoint, pickInfo: pi }; + } else { + pick = null; + } + } else { + pick = this._pickFromCenter(); + } const target = pick?.mesh ? this._meshToTarget(pick.mesh) : null; const point = pick?.point ? { x: pick.point.x, y: pick.point.y, z: pick.point.z } : null; // 1) Self-onClick — только если target есть diff --git a/src/editor/engine/lua/RobloxShim.js b/src/editor/engine/lua/RobloxShim.js index d90a0ea..e56720c 100644 --- a/src/editor/engine/lua/RobloxShim.js +++ b/src/editor/engine/lua/RobloxShim.js @@ -2173,27 +2173,19 @@ export function registerRobloxShim(lua, opts) { if (!p) return; const id = p.primId ?? p.target; const part = partById.get(Number(id)); - if (p.kind === 'click') { - // eslint-disable-next-line no-console - console.warn('[shim fireTargetEvent click] primId=', id, 'part=', !!part); - } if (!part) return; if (p.kind === 'touch' || p.kind === 'touched') { part.Touched.Fire(hrp); } else if (p.kind === 'untouch' || p.kind === 'untouched') { part.TouchEnded.Fire(hrp); } else if (p.kind === 'click') { - // ClickDetector создаётся лениво — стрельба по 3D-объектам. + // ClickDetector — стрельба по 3D-объектам. // Фейерим без аргумента (передача объектов в Lua через wasmoon // может крашить с null.then). try { const cd = part._clickDetector; - // eslint-disable-next-line no-console - console.warn('[shim click]', 'partId=', id, 'cd=', !!cd, 'sig=', !!cd?.MouseClick, 'conns=', cd?.MouseClick?.connections?.length); if (cd && cd.MouseClick) cd.MouseClick.Fire(); - } catch (e) { - console.warn('[shim click err]', e?.message || e); - } + } catch (_) {} try { if (part.Clicked) part.Clicked.Fire(); } catch (_) {}