13 KiB
13 KiB
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 类)
- 文件: module_87072.js:22015
- 构造参数:
ring,effectStartSound,sonarSound,isEnabled - toString: module_87072.js:81819
默认参数单例(wUt 类,通过 dUt() 获取)
- 文件: module_87072.js:22023
- 默认值:
b17g_1 = 2— 环数/周期c17g_1 = 3— 粒子分组数d17g_1 = 0.5— 淡出阈值e17g_1 = 330— 展开角度(度)f17g_1 = 2— 声纳间隔
4. 过速装置效果实现(mUt 类)
- 文件: module_87072.js:22034
- 构造: 创建4个粒子(
xz(1,1,t)× 4)组成环效果
方法列表
| 方法 | 行号 | 作用 |
|---|---|---|
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 类)
- 文件: module_87072.js:22012
- 继承:
uq - 字段:
y168_1 = false(启用状态)
方法
| 方法 | 行号 | 作用 |
|---|---|---|
z168(t) |
81765 | 设置参数和启用状态 |
vym() |
81768 | 初始化:创建 mUt 实例,注册4个事件回调 |
事件回调
| 事件 | 行号 | 作用 |
|---|---|---|
iOt |
81794 | 如果已启用 → 激活 |
bOt |
81801 | 停用 |
sUt |
81808 | 激活 |
oUt |
81815 | 停用 |
激活/停用函数
aUt(t)— module_87072.js:22005:激活,粒子尺寸 260 或 600cUt(t)— module_87072.js:22009:停用,启动淡出
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标记渲染对象)
- 文件: module_87072.js:8166
- 构造: 创建 HI sprite 对象,应用缩放参数
标记状态选择逻辑(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→ 更新 paramsKPt→ 清空 paramsLrt→ 锁定引用+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 组件被服务器发送时创建:
- 注册位置: module_87072.js:75361-75367
- RadarCC 类型注册: module_87072.js:3235
通常只在装备 Hornet 装甲时服务器才发送此组件。
7. 激活/停用机制
Hornet 过速装置激活流程
- 服务器发送激活事件 →
BU.e7i(t, n)module_85183.js:36539 - 匹配
wnx_1→znx()module_70130.js:8362 znx()→ryp(Nf)→ 触发激活效果- 效果包括: 视觉环效果 + 声纳音效 + 3D透视标记显示
Hornet 过速装置停用流程
- 服务器发送停用事件 →
BU.e7i(t, n) - 匹配
xnx_1→any()module_70130.js:8358 any()→ryp(Pf)→ 触发停用效果- 效果包括: 淡出动画 + 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 渲染循环
- 遍历所有坦克实体
- 在每个坦克位置创建/更新 sprite 标记
- 禁用深度测试(
depthTest = false)实现透视 - 根据队伍设置颜色 优点: 完全独立,不依赖服务器 缺点: 需要自行实现标记渲染逻辑
方案4:Hook set 类强制解锁(推荐)
前提: set 实例存在但被锁定
实现: 直接修改 g11b_1 = false 强制解锁
// 找到 set 实例,设置 g11b_1 = false
radarManager.g11b_1 = false;
优点: 简单直接 缺点: 需要找到 set 实例的引用
推荐实现路径
- 第一步: 在浏览器中注入代码检查
set/Drt是否已存在 - 第二步:
- 如果存在 → 方案1 或 方案4
- 如果不存在 → 方案3