fix(loader): 断线重连死循环 —— location.reload 拦截改为默认关闭

- 游戏断线时靠 location.reload() 刷页重连;此前为看 err toast 接管了 reload,会把刷页吃掉

- 后果:游戏只能反复内部重连 + 反复拉 config.xml(表现为一直重连 c1 / 反复访问 xml,且只在断线时触发,故呈概率性)

- 现默认关闭;需保留页面看 err toast 时用 localStorage.hornetBlockReload='1' 临时开启
This commit is contained in:
TermiNexus committed 2026-10-15 13:47:35 +08:00
1 parent 86aa8bd9bd
commit 9bce46a86e
1 file changed
+6 -7
+6 -7
View File
@@ -101,14 +101,12 @@ 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;
if (localStorage.getItem('hornetBlockReload') === '1') {
try {
window.location.reload = function () {
console.warn('[Hornet] 已拦截自动刷新(保留页面,便于查看 err toast)。调用栈:\n' + new Error().stack);
@@ -121,7 +119,8 @@ try {
e.preventDefault();
e.returnValue = '';
});
console.log('[Hornet] 自动刷新拦截: ' + (__reloadHijacked__ ? 'location.reload 已接管' : 'beforeunload 守卫'));
}
console.log('[Hornet] 自动刷新拦截: ' + (__reloadHijacked__ ? '已启用(会阻断断线重连)' : '关闭(断线可正常刷页重连)'));
// ===== F5 刷新页面(游戏会吞掉 F5,这里在捕获阶段兜底)=====
window.addEventListener('keydown', function (e) {