feat: ���� 3D-�������-��������� � ����� + dev JWT-������ #9

Merged
min merged 14 commits from feat/arrow-pointer into main 2026-05-30 19:41:40 +00:00
Showing only changes of commit e26f854578 - Show all commits

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);