From 9bce46a86e8d285366049de1968278375c39ffca Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 15 Oct 2026 13:47:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(loader):=20=E6=96=AD=E7=BA=BF=E9=87=8D?= =?UTF-8?q?=E8=BF=9E=E6=AD=BB=E5=BE=AA=E7=8E=AF=20=E2=80=94=E2=80=94=20loc?= =?UTF-8?q?ation.reload=20=E6=8B=A6=E6=88=AA=E6=94=B9=E4=B8=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 游戏断线时靠 location.reload() 刷页重连;此前为看 err toast 接管了 reload,会把刷页吃掉 - 后果:游戏只能反复内部重连 + 反复拉 config.xml(表现为一直重连 c1 / 反复访问 xml,且只在断线时触发,故呈概率性) - 现默认关闭;需保留页面看 err toast 时用 localStorage.hornetBlockReload='1' 临时开启 --- 3dtank.com/play/static/js/main.9f4e7a89.js | 37 +++++++++++----------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/3dtank.com/play/static/js/main.9f4e7a89.js b/3dtank.com/play/static/js/main.9f4e7a89.js index dc17884..c5f2e6b 100644 --- a/3dtank.com/play/static/js/main.9f4e7a89.js +++ b/3dtank.com/play/static/js/main.9f4e7a89.js @@ -101,27 +101,26 @@ try { // ===== 暴露 webpack require(hornet 工具链 hook_gamemode/hornet_lib 依赖)===== window.__wp_require__ = __webpack_require__; - // ===== 出错时不自动刷新页面 ===== - // 游戏在致命错误/断线后会调用 location.reload(),err toast 一闪就被刷掉、看不到原因。 - // 这里拦截自动刷新并保留页面: - // ① 直接接管 location.reload(Chrome 上 Location 成员可能不可写,写入失败则走 ②) - // ② 兜底装 beforeunload 守卫(浏览器会问"确定离开?",取消即可留在页面看 toast) - // 需要刷新时按 F5:会先放行一次守卫,再用原始 reload 真正刷新。 + // ===== 出错时不自动刷新页面(**默认关闭**;localStorage.hornetBlockReload='1' 才开启)===== + // ⚠️ 开启后会接管 location.reload():游戏断线时正是靠刷页来重连,被拦截后它只能反复内部重连 + // + 反复拉 config.xml,表现为「一直重连 + 反复访问 xml」。只在需要看 err toast 时临时开。 var __hornetRealReload__ = window.location.reload.bind(window.location); var __reloadHijacked__ = false; - try { - window.location.reload = function () { - console.warn('[Hornet] 已拦截自动刷新(保留页面,便于查看 err toast)。调用栈:\n' + new Error().stack); - }; - __reloadHijacked__ = (window.location.reload !== __hornetRealReload__); - } catch (__reloadErr__) { __reloadHijacked__ = false; } - window.addEventListener('beforeunload', function (e) { - if (window.__hornetAllowUnload__) { window.__hornetAllowUnload__ = false; return; } // F5 放行一次 - if (__reloadHijacked__) return; // 已由 ① 接管 - e.preventDefault(); - e.returnValue = ''; - }); - console.log('[Hornet] 自动刷新拦截: ' + (__reloadHijacked__ ? 'location.reload 已接管' : 'beforeunload 守卫')); + if (localStorage.getItem('hornetBlockReload') === '1') { + try { + window.location.reload = function () { + console.warn('[Hornet] 已拦截自动刷新(保留页面,便于查看 err toast)。调用栈:\n' + new Error().stack); + }; + __reloadHijacked__ = (window.location.reload !== __hornetRealReload__); + } catch (__reloadErr__) { __reloadHijacked__ = false; } + window.addEventListener('beforeunload', function (e) { + if (window.__hornetAllowUnload__) { window.__hornetAllowUnload__ = false; return; } // F5 放行一次 + if (__reloadHijacked__) return; // 已由 ① 接管 + e.preventDefault(); + e.returnValue = ''; + }); + } + console.log('[Hornet] 自动刷新拦截: ' + (__reloadHijacked__ ? '已启用(会阻断断线重连)' : '关闭(断线可正常刷页重连)')); // ===== F5 刷新页面(游戏会吞掉 F5,这里在捕获阶段兜底)===== window.addEventListener('keydown', function (e) {