TermiNexus
|
82ee3fd8a4
|
fix(client): 下发 host 为空时还原为 cN 服务器地址,修复进战斗短命连接
|
2026-10-20 11:19:09 +08:00 |
|
TermiNexus
|
aa3bcba363
|
fix(wireframe): 扫描结果按字段路径缓存并每帧合并,补齐炮塔与车体漏采
|
2026-10-19 22:52:33 +08:00 |
|
TermiNexus
|
41b94ef0f9
|
fix(wireframe): 去重键去掉世界坐标并取消扫描节流,修复模型闪烁
|
2026-10-19 22:37:31 +08:00 |
|
TermiNexus
|
a83f2a5407
|
feat(ws-hook): 控制台实时打印每个 WebSocket 的地址、关闭码与存活时长
|
2026-10-19 22:36:34 +08:00 |
|
TermiNexus
|
797f28c8cd
|
fix(wireframe): 采集改为单路径优先并按 mesh+位置去重,修复重复身体与卡顿
|
2026-10-19 22:32:10 +08:00 |
|
TermiNexus
|
af8cde08d2
|
fix(wireframe): 车身改用皮肤根节点并合并结构扫描,修复漏采与只剩炮塔
|
2026-10-19 22:08:33 +08:00 |
|
TermiNexus
|
526adc760c
|
fix(wireframe): 顶点/索引优先读 CPU 端缓冲区,修复未上传 mesh 采集失败
|
2026-10-19 21:45:54 +08:00 |
|
TermiNexus
|
57481a1d09
|
feat(client-info): 本地镜像的 ClientInfo 显示 SRV: CN1/CN2
|
2026-10-19 21:43:33 +08:00 |
|
TermiNexus
|
2197f23517
|
feat(relay): 接管 _reconnectFast,改写战场服地址并按原 host 切换上游
|
2026-10-19 20:59:20 +08:00 |
|
TermiNexus
|
42e1944cce
|
fix(launcher): 兼容 -SRV=1 等号写法(改用 args 手动解析)
|
2026-10-19 20:30:40 +08:00 |
|
TermiNexus
|
8820639feb
|
feat(launcher): 增加 -SRV 1/2 统一切换前后端服务器(c1/c2)
|
2026-10-19 20:29:24 +08:00 |
|
TermiNexus
|
1dd7143e67
|
fix(wireframe): 去掉炮塔门槛并加实体节点扫描兜底,修复只有点没有模型
|
2026-10-19 20:14:47 +08:00 |
|
TermiNexus
|
dcf9a57456
|
fix(wireframe): GPU 顶点/索引缓冲字段按新版重定位,恢复模型采集
|
2026-10-18 19:37:43 +08:00 |
|
TermiNexus
|
86b9322a9f
|
fix(wireframe): 按新版字段修复模型采集与敌我判定
|
2026-10-18 19:10:22 +08:00 |
|
TermiNexus
|
4d8cbd81d6
|
chore(sw): 本地镜像禁用 Service Worker(自注销旧注册 + 置空游戏 SW 注册模块)
|
2026-10-18 19:00:52 +08:00 |
|
TermiNexus
|
a34cae5474
|
fix(tools): 按新旧差异修复位置与相机链路(雷达/透视恢复绘制)
|
2026-10-17 16:50:54 +08:00 |
|
TermiNexus
|
9506648877
|
fix(lib): 位置探测增加矩阵式兜底([12],[13],[14] 平移分量)
- 旧版位置来自物理组件的世界变换矩阵(K$ 实例,非普通向量),新版字段平移后无法靠名字命中
- 兜底 2:遍历组件找长度 >=15 的矩阵对象,取 [12]/[13]/[14] 作为平移(引擎惯用布局)
|
2026-10-17 16:29:06 +08:00 |
|
TermiNexus
|
67b2ff4a80
|
fix(lib): 坦克位置改为多级字段探测(修复雷达/透视为空)
- 根因:物理组件的位置向量字段每构建都平移,本次 pz7_1→gzh_1→rzf_1 的映射全都指错(gzh_1 是 TerminatorCC、rzf_1 是 RicochetSfxData)
- GetTankPosition 改为多级探测:先试一组成员字段(xzq_1/uzq_1/azr_1/bzr_1/dzr_1/izr_1/jzr_1…),再兜底遍历组件找带 f20_1/g20_1/h20_1 的 O\$ 向量
- 透视的坦克绘制与金箱位置都改用 GetTankPosition
|
2026-10-17 16:19:54 +08:00 |
|
TermiNexus
|
1cc1afdb08
|
fix(hook): GameMode hook 目标改为新版导出键(jc/ic),修复所有工具静默失效
- 根因:新版导出键语义漂移 —— \$.ac 变成两字段数据类 \、\ \$.zb 变成 ydt,不再是「取 gmt 实例 / ght 类」
- 新版对应关系:\ \$.jc = dct(scene) 取 ght 实例;\ \$.ic = wct 即 ght 类;\ \$.kc = gct(scene) 取 GameMode 实体
- hook 目标改为 \ \$.jc,并继续 hook wct.prototype 全方法作为兜底
- 重新生成 hornet_bundle.js 并同步 unpacked
|
2026-10-17 15:57:40 +08:00 |
|
TermiNexus
|
56a1356cce
|
fix(tools): 补全新版符号替换(修复透视/雷达仍不可用)
- 双向校验误判:q100_1 / r11l / jyw / t101_1 在新版同名但含义不同(普通数值 / 别的方法),被当作未变而跳过
- 强制替换:q100_1 到 m10b_1(坦克管理)、r11l 到 j11y(坦克列表)、jyw 到 lz4(取实体)、t101_1 到 p10c_1
- 覆盖 hook_gamemode.js(文件名不匹配 hornet_ 被漏掉)
- 物理组件字段 gzh_1 改为 rzf_1(新版 gzh_1 已是 TerminatorCC 字段,非物理)
- 移除已不存在的 xyu(GameMode),改用 gm.lz4()(等价:取 GameMode 实体)
- 重新生成 hornet_bundle.js(10 模块 / 249229 字节)并同步 unpacked
|
2026-10-17 15:49:50 +08:00 |
|
TermiNexus
|
dcf5dfce5c
|
fix(tools): 工具链符号对齐新版 bundle(修复 HORNET 功能大面积失效)
- 根因:新版 main.7cfa4058 重拆后游戏符号整体平移,工具里写死的字段名(pyt_1/q100_1/r11l/oyz/jyw/cyw_1/dyw_1…)全部对不上 → 找不到组件/相机/场景
- 新增 tools/apply_symbol_map.js:按 map_symbols 映射批量替换,4 道安全规则:① 长名或含下划线 ② 排除 JS 关键字/内置名黑名单 ③ 游戏符号命名特征(含数字或 _数字 结尾) ④ 双向校验(旧名在新 bundle 仍存在→视为未变跳过;新名不存在→映射错误丢弃)
- 单遍替换,避免链式污染(映射表新旧同名复用时会被二次替换)
- 应用到 12 个 hornet_*.js 共 231 处(跳过 25764 个未变符号)
- 重新生成 hornet_bundle.js(10 模块 / 249263 字节)并同步 unpacked
|
2026-10-16 14:55:39 +08:00 |
|
TermiNexus
|
469f913619
|
fix(page): 修复 index.html 主文件引用失配(新主文件没被加载,自动刷新拦截等全部失效)
- 根因:index.html 写死 main.9f4e7a89.js,重拆后主文件改名 main.7cfa4058.js → 请求旧名 404,新主文件里的 HORNET 注入 / 自动刷新拦截 / F5 兜底压根没加载
- 3DTank/web/index.html:引用改为 main.7cfa4058.js
- tools/serve.js:Resolve 增加兜底 —— 请求 main.<hash>.js 但文件不存在时,回退到目录里最新的 main.<hash>.js(以后换 bundle 无需再改 HTML)
- tools/split.js:拆分完成后自动改写 index.html 的主文件引用(防复发)
|
2026-10-16 14:23:02 +08:00 |
|
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 |
|
TermiNexus
|
cbeb78baba
|
feat(page): 自动刷新拦截改为默认开启(便于查看 err toast)
- 原来默认关闭(需 localStorage.hornetBlockReload=1),游戏一遇到致命错误/断线就 location.reload() 刷页,err toast 一闪即没
- 现改为默认开启:localStorage.hornetBlockReload='0' 才关闭;F5 仍然放行一次
- 同步源文件 tools/split.js 与产物 main.9f4e7a89.js
- 注意:拦截期间游戏无法靠刷页重连,只能反复内部重连(临时排查用)
|
2026-10-16 14:14:51 +08:00 |
|
TermiNexus
|
6dbe6c6b24
|
fix(hover): 悬浮底盘 raw 速度补上第二级平滑器(Zmt.wak 的 m14f_1)
- 上一版只改了 Bmt.l36(目标速度那一级),实际速度还在 Zmt.wak 里经 m14f_1.x142 逐帧追赶,所以摆动依旧
- 速度链是两级串联:Bmt.y12d_1(目标速度)→ Zmt.m14f_1(实际速度),现两级都按 raw 直接锁目标
- 回退:window.__hornetHoverRaw__ = false
|
2026-10-15 18:51:41 +08:00 |
|
TermiNexus
|
f8502a0726
|
feat(hover): 悬浮底盘改为 raw 速度(参考炮塔做法,消除无端摆动)
- 位置:module_87072 的 Bmt.l36(悬浮底盘每帧速度推进)
- 原逻辑:y12d_1/z12d_1 两个 vgt 平滑器按加速度 u143_1/v143_1 逐帧逼近目标 → 惯性来回摆
- 改为:直接 na0(w143_1) 把当前值锁成目标值(等同炮塔 qyr 的 i = this.azi_1)
- 回退开关:window.__hornetHoverRaw__ = false
|
2026-10-15 18:20:35 +08:00 |
|
TermiNexus
|
ab4c31311c
|
fix(relay): 上游握手不再发送 Referer(对齐浏览器真实握手)
- 依据:官方 Copy-as-cURL 的握手头里没有 Referer —— 浏览器发起的 WebSocket 握手本身不带它
- 实测:用原版头直连 wss://c1.3dtank.com:9090/ 可保持连接(8s 超时退出);而中继因多带 Referer 被上游 code=1000 关闭(短命连接)
- 仅删 Referer;Origin 仍强制覆盖为 https://3dtank.com(本机 origin 会被上游拒)
|
2026-10-15 16:27:34 +08:00 |
|
TermiNexus
|
1b487fbdd6
|
revert(relay): 回退「按首帧分流上游」(假设已被原始 bundle 证伪)
- 依据:官方 main.9f4e7a89.js 中 config-template = https://c{server}.3dtank.com/config.xml,server 号由 balancer(/s/status.js)决定,与连接类型无关
- 本机镜像走 else 分支:config-template = http://<本机>/config.xml(无 {server} 占位符),根本不参与分服
- 恢复「连上立即建上游」以保持与上游 TLS 建连并行;保留 --upstream-alt 参数与 FirstCmdId 记录备用
|
2026-10-15 16:19:35 +08:00 |
|
TermiNexus
|
941dde0913
|
fix(relay): 按首帧分流上游 —— Hash Request 走 c2(大厅),EnterSpace 走 c1(二次进空间)
- 取证:短命连接是「复用首个会话哈希、跳过 Hash Request 直接 EnterSpace」,被服务器 code=1000 关闭(约 1.2 秒);完整握手的连接可稳定存活(2 分半)
- wss_server:上游改为「首帧到达后再建」——StreamDecoder 记录 FirstCmdId,首帧 ID=3 走备用上游、其余走主上游;首帧仍走 Pending 原序补发
- 新增 --upstream-alt / -UpstreamAlt(默认 wss://c1.3dtank.com:9090/)
|
2026-10-15 16:16:16 +08:00 |
|
TermiNexus
|
529868b194
|
feat(wireframe): 3D 透视里给人机坦克标「人机」文字
- hornet_3d_wireframe:坦克绘制后在其上方投影并写「人机」(先描黑边再填黄字,任何背景下可读)
- 复用 lib.ScanBots / IsBot,节流约每 0.3 秒扫描一次;雷达的方块标记保留
|
2026-10-15 15:47:52 +08:00 |
|
TermiNexus
|
2b64211173
|
feat(radar): 人机识别标记(同队装备分数相同且 < 8000)
- hornet_lib:新增 GetGearScore(BattleGearScoreCC.score → 组件 cjf_1)、ScanBots(按队伍分组,同分且低于阈值判为人机)、GetBotSet/IsBot
- hornet_radar:约每 0.3 秒扫一次;人机画「灰方块 + 黄框」,真人仍「实心圆 + 白边」;顶部统计加 Bot 计数
- 重新生成 hornet_bundle.js 并同步到 unpacked
|
2026-10-15 15:27:34 +08:00 |
|
TermiNexus
|
92b5ca6e9b
|
refactor(panel): 移除左上角常驻 HUD(「3DTank 控制台」小窗)
- tools/hornet_panel.js:HUD 不再挂载到页面(等于不显示),原样式与 appendChild 一并去掉
- 保留 hud 对象与 UpdateHud 循环:循环里还负责 TryAutoEnable()(按保存状态自动开启工具)
- 重新生成 hornet_bundle.js 并同步到 unpacked
|
2026-10-15 15:15:28 +08:00 |
|
TermiNexus
|
cca13974de
|
fix(relay): 上游对齐官方 —— config 回源与中继上游改为 c2
- serve.js:新增 --config-upstream(默认 https://c2.3dtank.com),/config.xml 回源与改写底稿都改用它
- wss_server.js / Start-LocalAndRelay.ps1:上游默认 c1 改为 c2,可用 -Upstream / --upstream 切回
- 依据:客户端 JS 无 c1/c2 硬编码(连谁完全由 config 决定);实测 c1/c2 各自提供指向自己的 config,官方客户端实际连 c2
|
2026-10-15 14:09:25 +08:00 |
|
TermiNexus
|
9bce46a86e
|
fix(loader): 断线重连死循环 —— location.reload 拦截改为默认关闭
- 游戏断线时靠 location.reload() 刷页重连;此前为看 err toast 接管了 reload,会把刷页吃掉
- 后果:游戏只能反复内部重连 + 反复拉 config.xml(表现为一直重连 c1 / 反复访问 xml,且只在断线时触发,故呈概率性)
- 现默认关闭;需保留页面看 err toast 时用 localStorage.hornetBlockReload='1' 临时开启
|
2026-10-15 13:47:35 +08:00 |
|
TermiNexus
|
86aa8bd9bd
|
feat(turret): 炮塔精准跟手加死区消抖(滤掉悬浮底盘的 micro-motion)
- module_87072 oxt.wak case 1/2:目标角变化小于死区(默认 0.5 度)时不搬动炮塔
- 死区可实时调:window.__hornetTurretDeadZone__ = 弧度值
|
2026-10-15 13:35:39 +08:00 |
|
TermiNexus
|
d4c5a89703
|
feat(turret): 炮塔摆头精准跟手(默认开启)+ 探针默认关闭
- module_87072 oxt.wak:case 1/2 直接锁到目标角,去掉速度追赶导致的追过头再回摆
- module_87072 weaponMount.qyr:去掉渲染层二次插值(dzi_1=azi_1、izi_1=gzi_1)
- 回退开关:window.__hornetTurretPrecise__ = 'off' / false
- probe_chassis.js:新增 oxt.wak / weaponMount.qyr 采样链路,用于定位过冲
- main.9f4e7a89.js:探针改为默认关闭(localStorage.hornetProbe='1' 开启)
|
2026-10-15 13:34:25 +08:00 |
|
TermiNexus
|
512c718d38
|
feat(hornet): 十字军底盘控制探针 + 中继 config.xml 动态改写
- 新增 sockets/probe_chassis.js:采样 Cyt.j14k_1 / Zmt.r14f_1 三轴并 hook Cyt.wak / Zmt.wak,转储到 names/probe_chassis.log
- serve.js:新增 /probe_chassis.js 路由与 /__probe__?f= 落盘选择;新增 --relay-port 动态改写 config.xml 指向本机中继(不落盘、不依赖 local/config.xml)
- main.9f4e7a89.js:探针块改为自动加载 railgun + chassis 两个探针
- Start-LocalAndRelay.ps1:-WithRelay 改传 --relay-port,修复「前端未走中继」的根因
|
2026-10-13 17:14:22 +08:00 |
|
TermiNexus
|
12e547f32f
|
docs(3DTank): 电磁炮锁定蓄力改造的计划与进度(机制/门槛/改动/待办/教训)
含:z4t 三条上行(amr/o1ag/tnl)、三个时长(w1al/w187/x187)、FSM(TWt/vWt)结构、实测门槛(1.5s 最低满伤)、已落地改动与 commit 列表、离线解码流水线命令、关键行号速查。
同批提交 decode_space_frames.js 的 --side s2c/c2s 选项(MD 里的解码命令依赖它)。
|
2026-10-12 11:20:34 +08:00 |
|
TermiNexus
|
651e29f8b2
|
feat: 探针改整帧 hex 记录 + 新增 probe_log_to_bins.js 接现有解码流水线
- sockets/probe_railgun.js: SEND 记录整帧字节(流密码跨消息连续,截断/丢帧会导致后续解密全错)
- 3DTank/tools/probe_log_to_bins.js: 把日志里的 c2s 帧还原成 <out>/<label>/session_001/c2s_*.bin,供 decrypt_frames.js → dump_plain.js → decode_space_frames.js 复用
|
2026-10-12 11:11:57 +08:00 |
|
TermiNexus
|
d4c8a843e2
|
feat(panel): 电磁炮锁定时长固定默认 1.5s(面板默认开启覆盖)
面板回填逻辑改为「未显式关闭即开启」,默认值 1.5s(实测满伤的最小值);取消勾选仍可回退原版 3~5s。z4t.w187 的 HORNET-TAG 同步。
|
2026-10-12 11:08:01 +08:00 |
|
TermiNexus
|
db8a92a2f7
|
feat(panel): Alt+T 面板新增「电磁炮设置」——锁定/蓄力时长可实时调
启用时长覆盖(checkbox) + 锁定/蓄力(s) 滑块 0.1~5.0/步进0.05,拖动立即写入 window.__hornetLockSec__ 并持久化到 localStorage(hornet_lock_on/hornet_lock_sec)。实测门槛:1.5s/2.0s 满伤,1.0s/0.1s 无伤害。
|
2026-10-12 11:01:36 +08:00 |
|
TermiNexus
|
1af3b3a7a3
|
feat(mirror): 电磁炮锁定时长支持运行时覆盖(window.__hornetLockSec__)
z4t.w187() 优先读 window.__hornetLockSec__(正数则用它),否则回退 gaussParams.njs_1;便于面板实时调值,不必重打包刷新。
|
2026-10-12 11:01:34 +08:00 |
|
TermiNexus
|
2d2a2c9f61
|
chore(mirror): 电磁炮锁定时长试 0.1s(极端对照,用于离线解码对比)
z4t.w187() 返回 LR(0.1);已知 1.5s/2.0s 满伤、1.0s 掉伤。HORNET-TAG 同步 0.1s。
|
2026-10-12 10:57:50 +08:00 |
|
TermiNexus
|
8e13aac99f
|
feat(mirror): 电磁炮锁定时长 2.0s → 1.5s(二分探门槛)
z4t.w187() 返回 LR(1.5);2.0s 已实测满伤、1.0s 掉伤,门槛在 1.0~2.0s 之间。HORNET-TAG 同步为 1.5s。
|
2026-10-12 10:41:49 +08:00 |
|
TermiNexus
|
e154c1ab14
|
fix(sockets): 探针 WS 字节读取兼容 DataView(此前 hex 恒为空)
游戏实际发的是 DataView(有 byteLength、无 slice),走 buffer+byteOffset 取视图;此前 new Uint8Array(dataView,0,24) 得到长度 0 视图,导致 SEND 行 hex 恒空。
|
2026-10-12 10:35:39 +08:00 |
|
TermiNexus
|
712d24e059
|
fix(mirror): 徽标抗 DOM 裁剪 + 探针块加自证日志
- 徽标每 2s 自检补回(游戏初始化重排 DOM 时会被删掉)
- 打印「版本徽标已注入」「探针块已执行(hornetProbe=…)」两条日志,便于区分是加载器没生效还是探针 fetch 404
|
2026-10-12 10:31:34 +08:00 |
|
TermiNexus
|
dfdd69b375
|
feat(mirror): 探针自动加载并转储(/probe_railgun.js 路由 + 加载器引入)
- tools/serve.js: 新增 /probe_railgun.js 路由,读 sockets/probe_railgun.js
- main.9f4e7a89.js: 等 __gameMode__ 就绪后自动 fetch+eval 探针(localStorage.hornetProbe='0' 可关闭),数据走 POST /__probe__ 落盘 3DTank/names/probe_railgun.log,省去每次手粘控制台
|
2026-10-12 10:23:07 +08:00 |
|
TermiNexus
|
09f8769585
|
feat(mirror): 电磁炮锁定时长 3~5s → 2.0s(z4t.w187,实测满伤)
z4t.w187() 返回 LR(2),不再取 gaussParams.njs_1;冷却 w1al()/x187() 未动(服务端按冷却裁决)。附 HORNET-TAG 供版本徽标显示。
|
2026-10-12 10:21:04 +08:00 |
|
TermiNexus
|
bb3d76117a
|
feat(mirror): 右下角版本徽标(包版本 + 从模块源码读出的 HORNET-TAG)
加载器记录 __hornetPackVersion__ 并渲染固定徽标;TAG 用正则从 __modules__[87072] 源码读取,避免手写常量与真实包不一致。
|
2026-10-12 10:21:03 +08:00 |
|
TermiNexus
|
b63435d401
|
fix(sockets): probe_railgun.js WS 上行改异步读 Blob(此前 hex 恒为空)
游戏 send 的是 Blob,slice 后 new Uint8Array(Blob) 长度为 0,导致 SEND 行 hex 全空;改为 blob.arrayBuffer() 异步读前 24 字节。
|
2026-10-12 10:21:02 +08:00 |
|