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