From 86620eee1cddf42e3991aa5717f4c152bee7419b Mon Sep 17 00:00:00 2001 From: min Date: Mon, 15 Jun 2026 22:14:26 +0300 Subject: [PATCH] =?UTF-8?q?feat(player):=20=D0=BD=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20fullscreen-?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BB=D0=B5=D0=B9=20=D0=B2=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=BC=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В Android-приложении (Capacitor) и десктопе (Electron) WebView/окно уже на весь экран — стартовый оверлей «Нажми чтобы играть» избыточен (в браузере он нужен для user-gesture перед fullscreen, в нативе барьера нет). Теперь в нативном приложении игра запускается сразу: - IS_ANDROID_APP: детект по window.Capacitor + метке RubloxAndroid в UA; - IS_NATIVE_APP = desktop || android; - gameStarted инициализируется true в нативе → оверлей пропускается; - handleGameStart/handleMobileStart не дёргают requestFullscreen в нативе. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/KubikonPlayer/KubikonPlayer.jsx | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) 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); -- 2.47.2