- 拆分: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)
108 lines
4.3 KiB
JavaScript
108 lines
4.3 KiB
JavaScript
// ===== 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');
|
||
});
|
||
});
|
||
}
|
||
});
|