Files
TermiNexus fd0dffe31b feat(bundle): 迁移到新版 main.7cfa4058.js(重做拆分 + 移植 7 处针对性修改)
- 拆分:tools/split.js 重切新版(1347 模块 / 126 代码模块),主文件 main.7cfa4058.js,语法验证通过

- 修复 split.js 内自动刷新拦截的 \\n 转义:它在模板字符串里,必须写 \\\\n,否则生成的主文件字符串断行、语法报错

- 符号映射:map_symbols.js 对齐旧→新(qyr→ryz、w187→c18o、z4t→jtn、vgt→rkt、Bmt→Ezt、Qjt→Fjt、txt→Gjt、k15b→s15n、azi_1→vzr_1…)

- 移植 7 处针对性修改:炮塔摆头不回弹(vSt.ryz)、摆头不过冲(case 0)、精准跟手(case 1/2)、悬浮底盘 raw 两级(Ezt.n36 + Zmt 实际速度)、电磁炮蓄力时长(jtn.c18o)

- 重新打包 unpacked.pack.json(127 文件 / 版本 96833eb2b0cf8909)
2026-10-16 14:20:15 +08:00

108 lines
4.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ===== 3DTank Hornet Service Worker =====
// 功能:拦截 main.*.js 请求,注入 window.__wp_require__ 捕获行 + 自动加载 hornet_bundle.js
// 用途:当无法修改 main 文件、无法预 hook 时,通过网络层注入
// SW 放在 /play/hornet_sw.js,scope = /play/ 覆盖 main.*.js 和 unpacked/
//
// 使用方法:
// 1. 确保 hornet_sw.js 在 /play/ 目录(scope 覆盖 /play/static/js/)
// 2. 在浏览器控制台执行:
// navigator.serviceWorker.register('/play/hornet_sw.js')
// .then(() => { console.log('[Hornet] SW 已注册,刷新页面'); location.reload(); });
// 3. 页面刷新后,SW 拦截 main.*.js:
// a) 在 __webpack_require__ 函数体开头注入 window.__wp_require__=__webpack_require__
// b) 在 __webpack_require__(78231) 后注入 hornet_bundle.js 加载
// 4. 游戏正常启动,__wp_require__ 和 hornet_bundle 自动就绪
//
// 卸载方法:
// navigator.serviceWorker.getRegistration().then(r => r.unregister()).then(() => location.reload())
var SW_DEBUG = '[Hornet SW]';
var MAIN_JS_PATTERN = /\/main\.[a-f0-9]+\.js$/;
var INJECT_LINE = 'window.__wp_require__=__webpack_require__;';
// 在入口模块加载后注入 hornet_bundle.js
var BUNDLE_MARKER = '__webpack_require__(78231)';
var BUNDLE_INJECT = ';var __hb=document.createElement("script");__hb.src="/play/static/js/unpacked/hornet_bundle.js";document.head.appendChild(__hb);';
self.addEventListener('install', function(event) {
self.skipWaiting();
});
self.addEventListener('activate', function(event) {
event.waitUntil(self.clients.claim());
});
self.addEventListener('fetch', function(event) {
var url = event.request.url;
// 拦截 main.*.js
if (MAIN_JS_PATTERN.test(url)) {
event.respondWith(
fetch(event.request).then(function(response) {
if (!response.ok) return response;
return response.text().then(function(text) {
// 在 __webpack_require__ 函数定义后注入捕获行
// 匹配模式:function __webpack_require__(t) { ... }
var marker = 'function __webpack_require__(';
var idx = text.indexOf(marker);
if (idx === -1) {
// 尝试 webpack 5 格式
marker = '__webpack_require__ = function';
idx = text.indexOf(marker);
}
if (idx !== -1) {
// 找到函数体的第一个 { 后注入捕获行
var braceIdx = text.indexOf('{', idx);
if (braceIdx !== -1) {
var injectPos = braceIdx + 1;
var modified = text.slice(0, injectPos) + INJECT_LINE + text.slice(injectPos);
// 在入口模块加载后注入 hornet_bundle.js
var bundleIdx = modified.indexOf(BUNDLE_MARKER);
if (bundleIdx !== -1) {
var afterMarker = bundleIdx + BUNDLE_MARKER.length;
modified = modified.slice(0, afterMarker) + BUNDLE_INJECT + modified.slice(afterMarker);
console.log(SW_DEBUG, '注入 __wp_require__ + bundle 加载到', url);
} else {
console.log(SW_DEBUG, '注入 __wp_require__ 捕获行(未找到 bundle marker)', url);
}
return new Response(modified, {
status: response.status,
statusText: response.statusText,
headers: {
'Content-Type': 'application/javascript; charset=utf-8',
'Cache-Control': 'no-cache'
}
});
}
}
console.warn(SW_DEBUG, '未找到 __webpack_require__ 定义,返回原始响应');
return new Response(text, {
status: response.status,
statusText: response.statusText,
headers: response.headers
});
});
}).catch(function(err) {
console.error(SW_DEBUG, '拦截失败:', err);
return fetch(event.request);
})
);
return;
}
// 其他请求正常处理
event.respondWith(fetch(event.request));
});
// 监听消息:手动加载 hornet_bundle
self.addEventListener('message', function(event) {
if (event.data === 'load_bundle') {
self.clients.matchAll().then(function(clients) {
clients.forEach(function(client) {
client.postMessage('load_bundle');
});
});
}
});