feat: ���� 3D-�������-��������� � ����� + dev JWT-������ #9
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user