diff --git a/src/KubikonPlayer/KubikonPlayer.jsx b/src/KubikonPlayer/KubikonPlayer.jsx index 8829d43..4ee3ff0 100644 --- a/src/KubikonPlayer/KubikonPlayer.jsx +++ b/src/KubikonPlayer/KubikonPlayer.jsx @@ -31,6 +31,18 @@ import GameLoadingScreen from './GameLoadingScreen'; // preload выставляет window.__RUBLOX_DESKTOP__. const IS_DESKTOP_APP = typeof window !== 'undefined' && !!window.__RUBLOX_DESKTOP__; +// В Android-приложении (Capacitor-обёртка rublox-android) WebView уже на весь +// экран — браузерный fullscreen не нужен, а стартовый оверлей «Нажми чтобы +// играть» избыточен (в браузере он нужен для user-gesture перед FS, в APK +// этого барьера не требуется). Capacitor выставляет window.Capacitor. +const IS_ANDROID_APP = typeof window !== 'undefined' + && (!!window.Capacitor + || /RubloxAndroid/i.test(navigator.userAgent || '')); + +// Объединённый признак «нативного приложения» (десктоп ИЛИ Android) — там, +// где поведение совпадает (не дёргать fullscreen). +const IS_NATIVE_APP = IS_DESKTOP_APP || IS_ANDROID_APP; + // Плеер живёт на player.rublox.pro — он не знает SPA-роутов Майнкрафтии // (/kubikon, /login, /auth). Поэтому вместо navigate(...) делаем // явный window.location.assign на внешний домен. @@ -236,7 +248,10 @@ const KubikonPlayer = () => { // ВКЛЮЧИТЬ fullscreen и заблокировать Ctrl+W/Ctrl+T и др. системные // хоткеи. Без этого браузер закрывает вкладку при случайном Ctrl+W. // requestFullscreen() требует user gesture — поэтому без клика никак. - const [gameStarted, setGameStarted] = useState(false); + // В нативном приложении (Electron/Capacitor) fullscreen не нужен (окно и + // так на весь экран), поэтому стартовый оверлей пропускаем — игра + // запускается сразу. + const [gameStarted, setGameStarted] = useState(IS_NATIVE_APP); const [hp, setHp] = useState({ hp: 100, maxHp: 100 }); // Скрипт через game.hud.setVisible(false) полностью скрывает стандартный HUD. const [stdHudVisible, setStdHudVisible] = useState(true); @@ -1130,8 +1145,9 @@ const KubikonPlayer = () => { || root.webkitRequestFullscreen || root.mozRequestFullScreen || root.msRequestFullscreen; - // В десктоп-приложении окно и так на весь экран — FS не нужен. - if (req && !IS_DESKTOP_APP) { + // В нативном приложении (Electron/Capacitor) окно и так на весь + // экран — FS не нужен. + if (req && !IS_NATIVE_APP) { try { await req.call(root); } catch (e) { /* отменено */ } } setMobileStartTapped(true); @@ -1139,14 +1155,14 @@ const KubikonPlayer = () => { /** Стартовый клик «Начать игру» — запрашивает fullscreen * (Chrome блокирует Ctrl+W/Ctrl+T в fullscreen) и снимает оверлей. - * В десктоп-приложении FS не нужен (нет вкладок браузера). */ + * В нативном приложении (Electron/Capacitor) FS не нужен. */ const handleGameStart = useCallback(async () => { const root = document.documentElement; const req = root.requestFullscreen || root.webkitRequestFullscreen || root.mozRequestFullScreen || root.msRequestFullscreen; - if (req && !IS_DESKTOP_APP) { + if (req && !IS_NATIVE_APP) { try { await req.call(root); } catch (e) { /* юзер запретил — играем без FS */ } } setGameStarted(true);