fix(player): меню больше не открывается на отпускание ПКМ (orbit)

React onLockChange в KubikonPlayer считал ЛЮБУЮ потерю pointer-lock за
нажатие ESC и открывал меню. В third отпускание ПКМ (orbit-камера) тоже
снимает lock → меню выскакивало на каждый поворот камеры.

Теперь меню открывается только если lock потерян в perma-режиме
(first/lockfirst/sideview/shiftLock) — там потеря lock = реальный ESC.
В third отпускание ПКМ игнорируется.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
МИН 2026-05-30 13:15:09 +03:00
parent 66375e26c8
commit e26f854578

View File

@ -711,15 +711,25 @@ const KubikonPlayer = () => {
const s = sceneRef.current; const s = sceneRef.current;
if (!s || !s._isPlaying) return; if (!s || !s._isPlaying) return;
const locked = !!document.pointerLockElement; const locked = !!document.pointerLockElement;
// Lock потерян, мы НЕ в UI-cursor mode пользователь нажал ESC if (locked || !s.player || s.player._uiCursorMode) return;
if (!locked && s.player && !s.player._uiCursorMode) { // Lock потерян. НЕ всякая потеря = ESC! В third-person отпускание
// Синхронно ставим флаг listener PlayerController сработает // ПКМ (orbit-камера) тоже снимает lock это НЕ выход в меню.
// следующим и увидит true, не вызовет _onExitRequest. // Меню открываем ТОЛЬКО если lock был «постоянным» (perma-режим:
s.player._uiCursorMode = true; // first/lockfirst/sideview/shiftLock) там потеря lock = реальный ESC.
// Открываем меню в следующий тик (state-update React) const p = s.player;
const permaLock = (
p._cameraMode === 'first' ||
p._cameraMode === 'lockfirst' ||
p._cameraMode === 'sideview' ||
p._shiftLock
);
// _rmbHeld был выставлен при входе в lock; если ПКМ отпущена в third
// это orbit-завершение, не меню.
if (!permaLock) return;
// Реальный ESC в perma-режиме открываем меню.
p._uiCursorMode = true;
setChatOpen(false); setChatOpen(false);
setTopMenuOpen(true); setTopMenuOpen(true);
}
}; };
// capture-фаза, чтобы успеть раньше PlayerController // capture-фаза, чтобы успеть раньше PlayerController
document.addEventListener('pointerlockchange', onLockChange, true); document.addEventListener('pointerlockchange', onLockChange, true);