feat(player): �� �������� fullscreen � �������-���������� #33

Merged
min merged 1 commits from feat/player-desktop-no-fullscreen-2026-06-15 into main 2026-06-15 17:27:45 +00:00
2 changed files with 29 additions and 8 deletions
Showing only changes of commit f77a741428 - Show all commits

View File

@ -44,6 +44,10 @@ const HUD = {
font: '"Inter", system-ui, -apple-system, sans-serif',
};
// В десктоп-приложении (Electron) пункт «Полноэкранный режим» не нужен
// окно и так на весь экран. preload выставляет window.__RUBLOX_DESKTOP__.
const IS_DESKTOP_APP = typeof window !== 'undefined' && !!window.__RUBLOX_DESKTOP__;
const TABS = [
{ id: 'people', icon: 'users', title: 'Участники' },
{ id: 'settings', icon: 'settings', title: 'Настройки' },
@ -931,6 +935,7 @@ function TabSettings({ sceneRef }) {
/>
<SettingsSection title="Экран" />
{!IS_DESKTOP_APP && (
<ArrowsRow
label="Полноэкранный режим"
hint="Развернуть игру на весь экран"
@ -947,6 +952,7 @@ function TabSettings({ sceneRef }) {
} catch (e) { /* ignore */ }
}}
/>
)}
<SliderRow
label="Качество графики"
hint="Разрешение рендера и тени"

View File

@ -25,6 +25,12 @@ import useDeviceType from '../hooks/useDeviceType';
import KubikonMobileControls from './KubikonMobileControls';
import GameLoadingScreen from './GameLoadingScreen';
// В десктоп-приложении (Electron-обёртка rublox-desktop) окно уже на весь
// экран без браузерной панели и без вкладок fullscreen не нужен (раньше он
// защищал от случайного Ctrl+W/Ctrl+T в браузере; в Electron этого риска нет).
// preload выставляет window.__RUBLOX_DESKTOP__.
const IS_DESKTOP_APP = typeof window !== 'undefined' && !!window.__RUBLOX_DESKTOP__;
// Плеер живёт на player.rublox.pro он не знает SPA-роутов Майнкрафтии
// (/kubikon, /login, /auth). Поэтому вместо navigate(...) делаем
// явный window.location.assign на внешний домен.
@ -1124,21 +1130,23 @@ const KubikonPlayer = () => {
|| root.webkitRequestFullscreen
|| root.mozRequestFullScreen
|| root.msRequestFullscreen;
if (req) {
// В десктоп-приложении окно и так на весь экран FS не нужен.
if (req && !IS_DESKTOP_APP) {
try { await req.call(root); } catch (e) { /* отменено */ }
}
setMobileStartTapped(true);
}, []);
/** Стартовый клик «Начать игру» запрашивает fullscreen
* (Chrome блокирует Ctrl+W/Ctrl+T в fullscreen) и снимает оверлей. */
* (Chrome блокирует Ctrl+W/Ctrl+T в fullscreen) и снимает оверлей.
* В десктоп-приложении FS не нужен (нет вкладок браузера). */
const handleGameStart = useCallback(async () => {
const root = document.documentElement;
const req = root.requestFullscreen
|| root.webkitRequestFullscreen
|| root.mozRequestFullScreen
|| root.msRequestFullscreen;
if (req) {
if (req && !IS_DESKTOP_APP) {
try { await req.call(root); } catch (e) { /* юзер запретил — играем без FS */ }
}
setGameStarted(true);
@ -1286,11 +1294,18 @@ const KubikonPlayer = () => {
lineHeight: 1.4,
padding: '0 24px',
}}>
Игра откроется в полноэкранном режиме
это защитит от случайного закрытия вкладки
(Ctrl+W, Ctrl+T и др.).
<br />
Выход: <b>Esc</b> или <b>F11</b>.
{IS_DESKTOP_APP ? (
<>Управление: <b>WASD</b> движение, <b>пробел</b> прыжок,
мышь камера.</>
) : (
<>
Игра откроется в полноэкранном режиме
это защитит от случайного закрытия вкладки
(Ctrl+W, Ctrl+T и др.).
<br />
Выход: <b>Esc</b> или <b>F11</b>.
</>
)}
</div>
<button
type="button"