Files
TankIC/docs/Hornet_Radar_Analysis.md
2026-07-28 01:16:15 +08:00

13 KiB
Raw Permalink Blame History

3DTank(Hornet)过速装置与3D透视雷达系统分析

1. 装甲基本信息

属性 值 代码位置
英文名 Hornet(大黄蜂/3DTank) -
Hull 枚举 ID 393 module_36659.js:2609
HUD 图标 ID 206 (hudOverdriveActiveHornet) module_36659.js:2422

2. 过速装置配置类(CC)

HornetUltimateCC(MU 类)

  • 文件: module_85183.js:13275
  • 字段:
    • effectEnabled (ykl_1) — 效果是否启用
    • effectStartSound (zkl_1) — 效果开始音效
    • ring (akm_1) — 环效果资源
    • sonarSound (bkm_1) — 声纳音效资源
  • toString: module_85183.js:36517

BattleUltimateRadarCC(GU 类)

  • 文件: module_85183.js:13325
  • 字段:
    • blueTankMarker (jkm_1) — 友方坦克标记
    • discoveredTanksIds (kkm_1) — 已发现的坦克ID列表
    • neutralTankMarker (nkm_1) — 中立坦克标记
    • redTankMarker (okm_1) — 敌方坦克标记
    • farMarkerDistance (lkm_1) — 远距离标记距离
    • nearMarkerDistance (mkm_1) — 近距离标记距离
  • toString: module_85183.js:36566

3. 过速装置参数类

HornetUltimateEffectParams(lUt 类)

默认参数单例(wUt 类,通过 dUt() 获取)

  • 文件: module_87072.js:22023
  • 默认值:
    • b17g_1 = 2 — 环数/周期
    • c17g_1 = 3 — 粒子分组数
    • d17g_1 = 0.5 — 淡出阈值
    • e17g_1 = 330 — 展开角度(度)
    • f17g_1 = 2 — 声纳间隔

4. 过速装置效果实现(mUt 类)

方法列表

方法 行号 作用
d174(t) 81848 设置所有粒子尺寸
syl(t) 81860 设置容器,初始化粒子
ryh(t,n,i) 81872 每帧更新:计算粒子位置和透明度,声纳音效循环
d15t() 81913 启动淡出
l3c() 81916 清理粒子

渲染逻辑(ryh 方法)

  • 4个粒子围绕坦克展开,展开角度 330 度
  • 粒子位置基于时间累加值和 o17f_1(位置对象)计算
  • 透明度:粒子超过 0.5(d17g_1)角度比例时开始淡出
  • 声纳音效按固定间隔(f17g_1=2)循环播放

5. 过速装置视图类(fUt 类)

方法

方法 行号 作用
z168(t) 81765 设置参数和启用状态
vym() 81768 初始化:创建 mUt 实例,注册4个事件回调

事件回调

事件 行号 作用
iOt 81794 如果已启用 → 激活
bOt 81801 停用
sUt 81808 激活
oUt 81815 停用

激活/停用函数


6. 3D透视雷达标记系统

系统架构

系统 类 文件位置 作用
3D透视标记 set module_87072.js:8240 在3D游戏世界中透过障碍物显示坦克标记
小地图标记 Drt module_87072.js:8090 在小地图上显示坦克标记

RadarMarkerParams(Frt 类)

  • 文件: module_87072.js:8127
  • 字段:
    • textureTankSameLevel (f11a_1) — 同层坦克纹理
    • textureTankAbove (g11a_1) — 上方坦克纹理
    • textureTankBelow (h11a_1) — 下方坦克纹理
    • textureTankDead (i11a_1) — 死亡坦克纹理
    • sizeTankSameLevel (j11a_1) — 同层标记尺寸
    • sizeTankAbove (k11a_1) — 上方标记尺寸
    • sizeTankBelow (l11a_1) — 下方标记尺寸
    • sizeTankDead (m11a_1) — 死亡标记尺寸
  • toString: module_87072.js:57283

全局雷达配置(Wrt 单例,通过 Vrt() 获取)

  • 文件: module_87072.js:8144
  • 值:
    • w11a_1 = vS(3390463) — 友方颜色(绿色)
    • x11a_1 = vS(16737894) — 敌方颜色(橙红色)
    • y11a_1 = 400 — 同层阈值
    • z11a_1 = 480 — 上/下阈值

Zrt 类(3D标记渲染对象)

标记状态选择逻辑(b11b 方法)

高度差(e = tankY - markerY) 标记类型 状态获取函数
e < -480 下方坦克 Jrt() → Xr
e > 480 上方坦克 Xrt() → Yr
` e < 400`
400-480 之间 保持当前 t.r11a_1
死亡状态 死亡坦克 textureTankDead

队伍颜色设置(a11b 方法)

  • 文件: module_87072.js:57368
  • 队伍 0 → Vrt().w11a_1(友方绿色)
  • 队伍 1 → Vrt().x11a_1(敌方橙红色)

set 类(3D标记管理器)

每帧更新逻辑(kak 方法)

对每个坦克:
  1. 获取坦克实体和位置
  2. 计算距离 h
  3. 如果 h < rj7_1(近距离阈值)且队伍是敌方/中立:
     → 创建 Zrt 标记(从对象池获取)
  4. 如果 h > sj7_1(远距离阈值):
     → 移除标记
  5. 否则:
     → 更新标记位置和状态

net 函数(标记添加/更新/移除)

初始化(vym 方法)

  • 文件: module_87072.js:57437
  • 注册4个事件回调:
    • HPt → 更新 params
    • KPt → 清空 params
    • Lrt → 锁定引用+1(显示标记)
    • Brt → 锁定引用-1(隐藏标记)
    • d9 → 坦克移除时清理标记

锁定机制

  • Lrt 事件 → set.m11b_1.m2h(1) → 引用计数+1 → g11b_1 = false → 标记可见
  • Brt 事件 → set.m11b_1.l2h(1) → 引用计数-1 → 归零时 g11b_1 = true → 标记隐藏

触发位置: module_87072.js:8102

i.k118_1 ? i.rym().ryp(Wr) : i.rym().ryp(Vr)
// k118_1=true → ryp(Lrt实例) → 显示标记
// k118_1=false → ryp(Brt实例) → 隐藏标记

创建门控

雷达标记系统在 RadarCC 组件被服务器发送时创建:

通常只在装备 Hornet 装甲时服务器才发送此组件。


7. 激活/停用机制

Hornet 过速装置激活流程

  1. 服务器发送激活事件 → BU.e7i(t, n) module_85183.js:36539
  2. 匹配 wnx_1 → znx() module_70130.js:8362
  3. znx() → ryp(Nf) → 触发激活效果
  4. 效果包括: 视觉环效果 + 声纳音效 + 3D透视标记显示

Hornet 过速装置停用流程

  1. 服务器发送停用事件 → BU.e7i(t, n)
  2. 匹配 xnx_1 → any() module_70130.js:8358
  3. any() → ryp(Pf) → 触发停用效果
  4. 效果包括: 淡出动画 + 3D透视标记隐藏

8. 本地启用方案(不装备3DTank装甲)

数据可用性确认

客户端已有所有坦克的位置和队伍数据:

  • Qrt(this).xzq_1.z11b() 获取所有坦克列表
  • q$(t.q11b_1, n).b11a_1 获取队伍
  • q$(t.p11b_1, n).x11b_1 获取标记位置

方案1:触发 Lrt 事件(最简单)

前提: 雷达系统(set + Drt)已被服务器创建 实现: 直接触发 Lrt 事件解锁标记显示

gameScene.rym().ryp(new Lrt());

优点: 代码量最少 缺点: 依赖服务器已创建雷达系统

方案2:强制创建雷达系统(中等复杂度)

前提: 雷达系统未被创建 实现: 手动创建 set 和 Drt 实例,提供 RadarCC 配置参数 优点: 完整使用游戏内置雷达 缺点: 需要处理复杂的组件注册和资源加载

方案3:独立3D标记渲染(最灵活)

实现: 不依赖游戏内置雷达系统,直接 Hook 渲染循环

  1. 遍历所有坦克实体
  2. 在每个坦克位置创建/更新 sprite 标记
  3. 禁用深度测试(depthTest = false)实现透视
  4. 根据队伍设置颜色 优点: 完全独立,不依赖服务器 缺点: 需要自行实现标记渲染逻辑

方案4:Hook set 类强制解锁(推荐)

前提: set 实例存在但被锁定 实现: 直接修改 g11b_1 = false 强制解锁

// 找到 set 实例,设置 g11b_1 = false
radarManager.g11b_1 = false;

优点: 简单直接 缺点: 需要找到 set 实例的引用

推荐实现路径

  1. 第一步: 在浏览器中注入代码检查 set/Drt 是否已存在
  2. 第二步:
    • 如果存在 → 方案1 或 方案4
    • 如果不存在 → 方案3