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
This commit is contained in:
1 parent
469f913619
commit
dcf5dfce5c
12 files changed
+638
-538
No files matched your search
+169
-169
@@ -250,9 +250,9 @@
|
||||
// 遍历 entity.wyj_1.r2a_1(Map<组件标识, 组件列表>),value 是列表类(s_),g1(0) 获取实际组件
|
||||
// 注意:用 !== undefined 检查字段存在性,避免 falsy 值(0/""/null/false)漏判
|
||||
function FindComponentByField(entity, fieldName) {
|
||||
if (!entity || !entity.pyt_1 || !entity.pyt_1.s2a_1) return null;
|
||||
if (!entity || !entity.qz1_1 || !entity.qz1_1.s2a_1) return null;
|
||||
var result = null;
|
||||
entity.pyt_1.s2a_1.forEach(function(valueList, key) {
|
||||
entity.qz1_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (result) return;
|
||||
try {
|
||||
var comp = (valueList && typeof valueList.g1 === 'function') ? valueList.g1(0) : valueList;
|
||||
@@ -262,7 +262,7 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
// ===== 获取坦克位置(G$t 物理组件的 pz7_1 = O$向量) =====
|
||||
// ===== 获取坦克位置(G$t 物理组件的 rzf_1 = O$向量) =====
|
||||
// 返回 {x, y, z},x/y 水平面,z 高度
|
||||
function GetTankPosition(tank) {
|
||||
var physicsComp = FindComponentByField(tank, 'gzh_1');
|
||||
@@ -280,21 +280,21 @@
|
||||
// 状态枚举:0=DEAD, 1=DEAD_PHANTOM, 2=SEMI_ACTIVE, 3=ACTIVE, 4=DISABLED
|
||||
// Yjt 特征:有 azs_1(状态机)和 vzr_1(状态枚举)字段
|
||||
function GetTankState(tank) {
|
||||
if (!tank || !tank.pyt_1 || !tank.pyt_1.s2a_1) return -1;
|
||||
if (!tank || !tank.qz1_1 || !tank.qz1_1.s2a_1) return -1;
|
||||
var tankComp = null;
|
||||
tank.pyt_1.s2a_1.forEach(function(valueList, key) {
|
||||
tank.qz1_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (tankComp) return;
|
||||
try {
|
||||
var comp = (valueList && typeof valueList.g1 === 'function') ? valueList.g1(0) : valueList;
|
||||
if (comp && comp.t101_1 && comp.o101_1 !== undefined) tankComp = comp;
|
||||
if (comp && comp.t101_1 && comp.k10c_1 !== undefined) tankComp = comp;
|
||||
} catch(e) {}
|
||||
});
|
||||
if (tankComp && tankComp.o101_1) return tankComp.o101_1.k3_1;
|
||||
if (tankComp && tankComp.k10c_1) return tankComp.k10c_1.k3_1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 可见/战斗中的坦克 = ACTIVE(3) 或 SEMI_ACTIVE(2)
|
||||
// 依据:引擎用 tankComponent.y147()(= SEMI_ACTIVE || ACTIVE)决定该坦克节点是否渲染,
|
||||
// 依据:引擎用 tankComponent.s14j()(= SEMI_ACTIVE || ACTIVE)决定该坦克节点是否渲染,
|
||||
// 只认 ACTIVE 会漏掉半活跃状态(出生/过渡)的坦克
|
||||
function IsTankAlive(tank) {
|
||||
var s = GetTankState(tank);
|
||||
@@ -304,20 +304,20 @@
|
||||
// ===== 获取坦克名称(yot 用户信息组件) =====
|
||||
// s120_1 = userName, u120_1 = clanTag(可为null), t120_1 = userRank
|
||||
function GetTankName(tank) {
|
||||
var userComp = FindComponentByField(tank, 'k12a_1');
|
||||
var userComp = FindComponentByField(tank, 'c12n_1');
|
||||
if (!userComp) return null;
|
||||
var name = userComp.k12a_1 || '';
|
||||
var clanTag = userComp.m12a_1 || '';
|
||||
var name = userComp.c12n_1 || '';
|
||||
var clanTag = userComp.e12n_1 || '';
|
||||
return clanTag ? (clanTag + ' ' + name) : name;
|
||||
}
|
||||
|
||||
// ===== 获取坦克血量(Vkt 血量组件) =====
|
||||
// f122_1 = 最大血量(max), g122_1 = 当前血量(current, 死亡时=0)
|
||||
function GetTankHealth(tank) {
|
||||
var healthComp = FindComponentByField(tank, 'y12b_1');
|
||||
var healthComp = FindComponentByField(tank, 'q12o_1');
|
||||
if (!healthComp) return null;
|
||||
var max = healthComp.x12b_1 || 0;
|
||||
var cur = healthComp.y12b_1 || 0;
|
||||
var max = healthComp.p12o_1 || 0;
|
||||
var cur = healthComp.q12o_1 || 0;
|
||||
if (max <= 0) return null;
|
||||
return { current: cur, max: max, percent: cur / max };
|
||||
}
|
||||
@@ -370,9 +370,9 @@
|
||||
// checkPosition: 是否检查位置有效性(默认true;测试脚本传false以在死亡状态控制)
|
||||
function GetPlayerTank(gm, checkPosition) {
|
||||
if (checkPosition === undefined) checkPosition = true;
|
||||
var t = gm.x100_1;
|
||||
var t = gm.t10b_1;
|
||||
if (t && (!checkPosition || GetTankPosition(t))) return t;
|
||||
t = gm.y100_1;
|
||||
t = gm.u10b_1;
|
||||
if (t && (!checkPosition || GetTankPosition(t))) return t;
|
||||
try {
|
||||
var tl = gm.q100_1.r11l();
|
||||
@@ -397,10 +397,10 @@
|
||||
} catch(e) {}
|
||||
}
|
||||
try {
|
||||
if (gm && gm.z100_1 && ZCt) {
|
||||
if (gm && gm.v10b_1 && ZCt) {
|
||||
var team = ZCt(tank);
|
||||
if (team && gm.z100_1) {
|
||||
return team.equals(gm.z100_1) && m2Fn ? m2Fn(team, gm.z100_1) : team.equals(gm.z100_1);
|
||||
if (team && gm.v10b_1) {
|
||||
return team.equals(gm.v10b_1) && m2Fn ? m2Fn(team, gm.v10b_1) : team.equals(gm.v10b_1);
|
||||
}
|
||||
}
|
||||
} catch(e) {}
|
||||
@@ -410,13 +410,13 @@
|
||||
// ===== 获取相机信息($r/gq 相机组件) =====
|
||||
// 遍历 GameMode entity 和所有坦克 entity 查找活跃相机组件
|
||||
// 策略1:查找 $r/gq 相机组件(有 kym_1 位置 和 lym_1 方向)
|
||||
// 策略2:查找 k7 相机控制器(有 qz9_1 和 gz9_1),从 gz9_1 获取相机组件
|
||||
// 策略2:查找 k7 相机控制器(有 qz9_1 和 jzh_1),从 jzh_1 获取相机组件
|
||||
// 返回 {yaw, pitch, fov, pos:{x,y,z}}
|
||||
// 注意:lym_1.h20_1 是 roll(绕Z),lym_1.f20_1 是 pitch(绕X)
|
||||
function GetCameraInfo(gm) {
|
||||
var entities = [];
|
||||
try {
|
||||
var gameScene = gm.jyw().iyt_1;
|
||||
var gameScene = gm.jyw().jz1_1;
|
||||
var gmEntity = gameScene.xyu("GameMode");
|
||||
if (gmEntity) entities.push(gmEntity);
|
||||
} catch(e) {}
|
||||
@@ -431,9 +431,9 @@
|
||||
|
||||
for (var i = 0; i < entities.length; i++) {
|
||||
var entity = entities[i];
|
||||
if (!entity || !entity.pyt_1 || !entity.pyt_1.s2a_1) continue;
|
||||
if (!entity || !entity.qz1_1 || !entity.qz1_1.s2a_1) continue;
|
||||
var found = null;
|
||||
entity.pyt_1.s2a_1.forEach(function(valueList, key) {
|
||||
entity.qz1_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (found) return;
|
||||
try {
|
||||
var comp = (valueList && typeof valueList.g1 === 'function') ? valueList.g1(0) : valueList;
|
||||
@@ -478,13 +478,13 @@
|
||||
function GetUMtComponent(gm) {
|
||||
try {
|
||||
var gmEntity = gm.jyw();
|
||||
if (!gmEntity || !gmEntity.pyt_1 || !gmEntity.pyt_1.s2a_1) return null;
|
||||
if (!gmEntity || !gmEntity.qz1_1 || !gmEntity.qz1_1.s2a_1) return null;
|
||||
var uMt = null;
|
||||
gmEntity.pyt_1.s2a_1.forEach(function(valueList, key) {
|
||||
gmEntity.qz1_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (uMt) return;
|
||||
try {
|
||||
var comp = (valueList && typeof valueList.g1 === 'function') ? valueList.g1(0) : valueList;
|
||||
if (comp && typeof comp.m179 === 'function') uMt = comp;
|
||||
if (comp && typeof comp.a17p === 'function') uMt = comp;
|
||||
} catch(e) {}
|
||||
});
|
||||
return uMt;
|
||||
@@ -514,24 +514,24 @@
|
||||
y178_1: MkVec(0, 0, 0),
|
||||
z178_1: MkVec(0, 0, 0),
|
||||
a179_1: maxDist,
|
||||
c179_1: null,
|
||||
q17o_1: null,
|
||||
b179_1: null,
|
||||
d179: function(t, n, i, r, e) {
|
||||
r17o: function(t, n, i, r, e) {
|
||||
this.y178_1.k26(t);
|
||||
this.z178_1.k26(n);
|
||||
this.a179_1 = i;
|
||||
this.c179_1 = r;
|
||||
this.q17o_1 = r;
|
||||
this.b179_1 = e;
|
||||
},
|
||||
d3: function() { this.b179_1 = null; }
|
||||
};
|
||||
var filter = {
|
||||
o1co_1: { h1: function() { return false; }, d3: function() {} },
|
||||
l1da_1: { h1: function() { return false; }, d3: function() {} },
|
||||
w179: function() { return true; },
|
||||
d3: function() { this.o1co_1.d3(); },
|
||||
p1co: function() {}
|
||||
d3: function() { this.l1da_1.d3(); },
|
||||
m1da: function() {}
|
||||
};
|
||||
var hit = uMt.m179(startVec, dirVec, maxDist, result, filter);
|
||||
var hit = uMt.a17p(startVec, dirVec, maxDist, result, filter);
|
||||
return (hit && result.a179_1 < maxDist) ? result.a179_1 : -1;
|
||||
} catch(e) {
|
||||
return -1;
|
||||
@@ -750,7 +750,7 @@
|
||||
|
||||
// ===== 获取坦克方向(Kkt 组件的 dzc_1) =====
|
||||
function getTankDirection(tank) {
|
||||
var hullComp = FindComponentByField(tank, 'vzl_1');
|
||||
var hullComp = FindComponentByField(tank, 'qzv_1');
|
||||
if (hullComp && hullComp.wzl_1) {
|
||||
return {
|
||||
x: hullComp.wzl_1.f20_1,
|
||||
@@ -764,13 +764,13 @@
|
||||
// ===== 获取相机方向(gq/$r 组件的 lym_1.h20_1 = 偏航角) =====
|
||||
// 相机组件可能在 GameMode entity、玩家坦克或任何坦克上
|
||||
// 策略1:查找 $r/gq 相机组件(有 kym_1 和 lym_1 字段)
|
||||
// 策略2:查找 k7 相机控制器(有 qz9_1 和 gz9_1 字段),从 gz9_1 获取相机组件
|
||||
// 策略2:查找 k7 相机控制器(有 qz9_1 和 jzh_1 字段),从 jzh_1 获取相机组件
|
||||
function getCameraHeading() {
|
||||
var entities = [];
|
||||
|
||||
// 1. GameMode entity
|
||||
try {
|
||||
var gameScene = gm.jyw().iyt_1;
|
||||
var gameScene = gm.jyw().jz1_1;
|
||||
var gmEntity = gameScene.xyu("GameMode");
|
||||
if (gmEntity) entities.push(gmEntity);
|
||||
} catch(e) {}
|
||||
@@ -788,10 +788,10 @@
|
||||
// 在每个 entity 上查找相机组件
|
||||
for (var i = 0; i < entities.length; i++) {
|
||||
var entity = entities[i];
|
||||
if (!entity || !entity.pyt_1 || !entity.pyt_1.s2a_1) continue;
|
||||
if (!entity || !entity.qz1_1 || !entity.qz1_1.s2a_1) continue;
|
||||
|
||||
var found = null;
|
||||
entity.pyt_1.s2a_1.forEach(function(valueList, key) {
|
||||
entity.qz1_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (found) return;
|
||||
try {
|
||||
var comp = (valueList && typeof valueList.g1 === 'function') ? valueList.g1(0) : valueList;
|
||||
@@ -807,7 +807,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
// 策略2:查找 k7 相机控制器(有 qz9_1 和 gz9_1 字段)
|
||||
// 策略2:查找 k7 相机控制器(有 qz9_1 和 jzh_1 字段)
|
||||
if (comp.jzj_1 && comp.zzi_1) {
|
||||
var camComp = comp.zzi_1;
|
||||
if (camComp && camComp.cyw_1 && camComp.dyw_1 &&
|
||||
@@ -861,12 +861,12 @@
|
||||
if (UMtComponent) return UMtComponent;
|
||||
try {
|
||||
var gmEntity = gm.jyw();
|
||||
if (!gmEntity || !gmEntity.pyt_1 || !gmEntity.pyt_1.s2a_1) return null;
|
||||
gmEntity.pyt_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (!gmEntity || !gmEntity.qz1_1 || !gmEntity.qz1_1.s2a_1) return null;
|
||||
gmEntity.qz1_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (UMtComponent) return;
|
||||
try {
|
||||
var comp = (valueList && typeof valueList.g1 === 'function') ? valueList.g1(0) : valueList;
|
||||
if (comp && typeof comp.m179 === 'function') UMtComponent = comp;
|
||||
if (comp && typeof comp.a17p === 'function') UMtComponent = comp;
|
||||
} catch(e) {}
|
||||
});
|
||||
if (UMtComponent) console.log('[雷达] uMt 碰撞检测器已获取');
|
||||
@@ -889,19 +889,19 @@
|
||||
var dirVec = MkVec(dirX, dirY, dirZ);
|
||||
var result = {
|
||||
y178_1: MkVec(0,0,0), z178_1: MkVec(0,0,0),
|
||||
a179_1: maxDist, c179_1: null, b179_1: null,
|
||||
d179: function(t, n, i, r, e) {
|
||||
a179_1: maxDist, q17o_1: null, b179_1: null,
|
||||
r17o: function(t, n, i, r, e) {
|
||||
this.y178_1.k26(t); this.z178_1.k26(n);
|
||||
this.a179_1 = i; this.c179_1 = r; this.b179_1 = e;
|
||||
this.a179_1 = i; this.q17o_1 = r; this.b179_1 = e;
|
||||
},
|
||||
d3: function() { this.b179_1 = null; }
|
||||
};
|
||||
var filter = {
|
||||
o1co_1: { h1: function() { return false; }, d3: function() {} },
|
||||
l1da_1: { h1: function() { return false; }, d3: function() {} },
|
||||
w179: function() { return true; },
|
||||
d3: function() {}, p1co: function() {}
|
||||
d3: function() {}, m1da: function() {}
|
||||
};
|
||||
var hit = uMt.m179(startVec, dirVec, maxDist, result, filter);
|
||||
var hit = uMt.a17p(startVec, dirVec, maxDist, result, filter);
|
||||
return (hit && result.a179_1 < maxDist) ? result.a179_1 : -1;
|
||||
} catch(e) {
|
||||
return -1;
|
||||
@@ -1460,7 +1460,7 @@
|
||||
ctx.textAlign = 'left';
|
||||
ctx.fillText('Tanks: ' + count + ' (B:' + friendlyCount + ' R:' + enemyCount + ' X:' + deadCount + ' Bot:' + botCount + ')', 5, 12);
|
||||
if (radar.playerFound) {
|
||||
ctx.fillText('Player: ' + (playerTank ? playerTank.hyt_1 : '?'), 5, 24);
|
||||
ctx.fillText('Player: ' + (playerTank ? playerTank.iz1_1 : '?'), 5, 24);
|
||||
} else {
|
||||
ctx.fillText('Player: NOT FOUND', 5, 24);
|
||||
}
|
||||
@@ -1695,12 +1695,12 @@
|
||||
}
|
||||
|
||||
// ===== 获取 KMt / TDt 渲染组件 =====
|
||||
// 新 build:车身皮肤组件字段是 w14w_1(kDt(t)=t.w14w_1,缺失报 "skin";RDt.v16b 里赋值)
|
||||
// 旧 build:u14l_1 / t14l_1 / p14l_1(新版 t14l_1 已改成悬停车体状态 Qmt,务必别再当皮肤用)
|
||||
// 新 build:车身皮肤组件字段是 w14w_1(kDt(t)=t.w14w_1,缺失报 "skin";RDt.j16r 里赋值)
|
||||
// 旧 build:w14x_1 / t14l_1 / p14l_1(新版 t14l_1 已改成悬停车体状态 Qmt,务必别再当皮肤用)
|
||||
function GetKMtComponent(entity) {
|
||||
var comp = FindComponentByField(entity, 'w14w_1');
|
||||
if (comp) return comp;
|
||||
comp = FindComponentByField(entity, 'u14l_1');
|
||||
comp = FindComponentByField(entity, 'w14x_1');
|
||||
if (comp) return comp;
|
||||
comp = FindComponentByField(entity, 't14l_1');
|
||||
if (comp) return comp;
|
||||
@@ -1708,13 +1708,13 @@
|
||||
return comp;
|
||||
}
|
||||
|
||||
// 取车身皮肤对象(含 s17b_1 部件表),跨版本兼容;stats 用于诊断来源
|
||||
// 取车身皮肤对象(含 g17r_1 部件表),跨版本兼容;stats 用于诊断来源
|
||||
function GetHullSkin(tank, stats) {
|
||||
var comp = GetKMtComponent(tank);
|
||||
if (!comp) { if (stats) stats.hullSource = '无组件'; return null; }
|
||||
if (comp.w14w_1 && comp.w14w_1.s17b_1) { if (stats) stats.hullSource = 'w14w_1'; return comp.w14w_1; } // 新 build
|
||||
if (comp.t14l_1 && comp.t14l_1.s17b_1) { if (stats) stats.hullSource = 't14l_1'; return comp.t14l_1; } // 旧 build
|
||||
if (comp.p14l_1 && comp.p14l_1.s17b_1) { if (stats) stats.hullSource = 'p14l_1'; return comp.p14l_1; } // 旧 build
|
||||
if (comp.w14w_1 && comp.w14w_1.g17r_1) { if (stats) stats.hullSource = 'w14w_1'; return comp.w14w_1; } // 新 build
|
||||
if (comp.t14l_1 && comp.t14l_1.g17r_1) { if (stats) stats.hullSource = 't14l_1'; return comp.t14l_1; } // 旧 build
|
||||
if (comp.p14l_1 && comp.p14l_1.g17r_1) { if (stats) stats.hullSource = 'p14l_1'; return comp.p14l_1; } // 旧 build
|
||||
if (stats) stats.hullSource = '有组件但无皮肤';
|
||||
return null;
|
||||
}
|
||||
@@ -1728,14 +1728,14 @@
|
||||
|
||||
// ===== 从GPU读取顶点位置数据(缓冲区[0]) =====
|
||||
function ReadVertexPositionsFromTp(tp) {
|
||||
if (!tp || !tp.t4w_1) return null;
|
||||
var tl = tp.t4w_1.g1(0);
|
||||
if (!tp || !tp.x4w_1) return null;
|
||||
var tl = tp.x4w_1.g1(0);
|
||||
if (!tl || !tl.d3x_1) return null;
|
||||
var vq = tl.d3x_1;
|
||||
var bs = vq.s3h_1;
|
||||
if (!bs || !bs.b74_1) return null;
|
||||
var gl = bs.b74_1;
|
||||
var webglBuf = vq.r3x_1 && vq.r3x_1.z73_1;
|
||||
var webglBuf = vq.v3x_1 && vq.v3x_1.z73_1;
|
||||
if (!webglBuf) return null;
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, webglBuf);
|
||||
var bufSize = gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE);
|
||||
@@ -1753,12 +1753,12 @@
|
||||
var allIndices = [];
|
||||
for (var m = 0; m < meshCount; m++) {
|
||||
var il = tp.y4w_1.g1(m);
|
||||
if (!il || !il.q3p_1) continue;
|
||||
var fq = il.q3p_1;
|
||||
if (!il || !il.u3p_1) continue;
|
||||
var fq = il.u3p_1;
|
||||
var bs = fq.s3h_1;
|
||||
if (!bs || !bs.b74_1) continue;
|
||||
var gl = bs.b74_1;
|
||||
var webglBuf = fq.j3x_1 && fq.j3x_1.z73_1;
|
||||
var webglBuf = fq.n3x_1 && fq.n3x_1.z73_1;
|
||||
if (!webglBuf) continue;
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webglBuf);
|
||||
var bufSize = gl.getBufferParameter(gl.ELEMENT_ARRAY_BUFFER, gl.BUFFER_SIZE);
|
||||
@@ -1815,25 +1815,25 @@
|
||||
function CollectMeshNodes(bpNode, nodes, depth, group, stats) {
|
||||
if (!bpNode || depth > 5) return;
|
||||
if (stats) stats.seen++;
|
||||
var name = bpNode.e35_1 || '';
|
||||
if (bpNode.t3m_1) {
|
||||
var name = bpNode.g35_1 || '';
|
||||
if (bpNode.v3m_1) {
|
||||
if (stats) stats.hasMesh++;
|
||||
var gpuData = GetGpuData(bpNode.t3m_1);
|
||||
var gpuData = GetGpuData(bpNode.v3m_1);
|
||||
if (gpuData) {
|
||||
if (stats) stats.gpuOk++;
|
||||
nodes.push({
|
||||
name: name, node: bpNode, tp: bpNode.t3m_1,
|
||||
name: name, node: bpNode, tp: bpNode.v3m_1,
|
||||
positions: gpuData.positions, indices: gpuData.indices, stride: gpuData.stride, group: group
|
||||
});
|
||||
} else if (stats) stats.gpuFail++;
|
||||
}
|
||||
if (bpNode.q4x_1 && typeof bpNode.q4x_1.e1 === 'function') {
|
||||
if (bpNode.u4x_1 && typeof bpNode.u4x_1.e1 === 'function') {
|
||||
try {
|
||||
var lodCount = bpNode.q4x_1.e1();
|
||||
var lodCount = bpNode.u4x_1.e1();
|
||||
for (var lod = 0; lod < lodCount && lod < 1; lod++) {
|
||||
var lodLevel = bpNode.q4x_1.g1(lod);
|
||||
var lodLevel = bpNode.u4x_1.g1(lod);
|
||||
if (!lodLevel) continue;
|
||||
var lodTp = lodLevel.t3m_1 || lodLevel.v3m_1;
|
||||
var lodTp = lodLevel.v3m_1 || lodLevel.v3m_1;
|
||||
if (!lodTp) continue;
|
||||
var lodGpuData = GetGpuData(lodTp);
|
||||
if (lodGpuData) {
|
||||
@@ -1863,14 +1863,14 @@
|
||||
var skin = GetHullSkin(tank, stats);
|
||||
if (skin) {
|
||||
try {
|
||||
var partCount = skin.s17b_1.e1();
|
||||
var partCount = skin.g17r_1.e1();
|
||||
if (stats) stats.hullParts = partCount;
|
||||
for (var p = 0; p < partCount; p++) {
|
||||
var part = skin.s17b_1.g1(p);
|
||||
if (!part || !part.v17b_1) continue;
|
||||
var nodeCount = part.v17b_1.e1();
|
||||
var part = skin.g17r_1.g1(p);
|
||||
if (!part || !part.j17r_1) continue;
|
||||
var nodeCount = part.j17r_1.e1();
|
||||
for (var n = 0; n < nodeCount; n++) {
|
||||
var bpNode = part.v17b_1.g1(n);
|
||||
var bpNode = part.j17r_1.g1(n);
|
||||
if (!bpNode) continue;
|
||||
CollectMeshNodes(bpNode, nodes, 0, 'hull', stats ? stats.hull : null);
|
||||
}
|
||||
@@ -2437,7 +2437,7 @@
|
||||
var physicsComp = FindComponentByField(tank, 'gzh_1');
|
||||
if (!physicsComp || !physicsComp.gzh_1) continue;
|
||||
var tankState = GetTankState(tank);
|
||||
// 可见坦克 = ACTIVE(3) 或 SEMI_ACTIVE(2)(引擎 y147() 判定),0/1/4 才跳过
|
||||
// 可见坦克 = ACTIVE(3) 或 SEMI_ACTIVE(2)(引擎 s14j() 判定),0/1/4 才跳过
|
||||
if (tankState !== 2 && tankState !== 3) continue;
|
||||
|
||||
var pos = {
|
||||
@@ -2449,7 +2449,7 @@
|
||||
// 本帧该坦克是否在移动(供「残留节点」检测:坦克在动而节点矩阵不动 = 旧位置遗留)
|
||||
// 用位移的指数滑动平均,而不是「单帧位移 > 10 单位」——后者对慢速移动几乎永远为假,
|
||||
// 会让残留检测形同虚设(残留漏掉的根因就在这里)
|
||||
var tankId = tank.hyt_1;
|
||||
var tankId = tank.iz1_1;
|
||||
var prevPos = TankPrevPos.get(tankId);
|
||||
var tankMove = 0;
|
||||
if (prevPos) {
|
||||
@@ -2467,7 +2467,7 @@
|
||||
if (distance > 50000) continue;
|
||||
|
||||
var friendly = IsFriendly(tank, playerTank);
|
||||
var tankName = GetTankName(tank) || ('ID:' + tank.hyt_1);
|
||||
var tankName = GetTankName(tank) || ('ID:' + tank.iz1_1);
|
||||
// 根据 HighlightMode 判断是否渲染该坦克
|
||||
if (!ShouldRender(tankName)) continue;
|
||||
// 颜色按队伍:友方=蓝,敌方=红
|
||||
@@ -2736,11 +2736,11 @@
|
||||
var initError = null;
|
||||
|
||||
try {
|
||||
scene = gm.jyw().iyt_1;
|
||||
scene = gm.jyw().jz1_1;
|
||||
console.log('[后视] 场景对象:', scene);
|
||||
|
||||
// hC 渲染器实例(jr.lye_1)
|
||||
var renderer = scene.fyo_1;
|
||||
var renderer = scene.gyw_1;
|
||||
console.log('[后视] 渲染器:', renderer);
|
||||
|
||||
// Ff 绘制器实例(hC.r74_1)
|
||||
@@ -2748,11 +2748,11 @@
|
||||
console.log('[后视] Ff绘制器:', ff);
|
||||
|
||||
// 场景根节点(jr.kyf_1)
|
||||
rootNode = scene.eyp_1;
|
||||
rootNode = scene.fyx_1;
|
||||
console.log('[后视] 根节点:', rootNode);
|
||||
|
||||
// 主相机 Ha 实例(jr.nyf_1)
|
||||
mainCamera = scene.hyp_1;
|
||||
mainCamera = scene.iyx_1;
|
||||
console.log('[后视] 主相机:', mainCamera);
|
||||
|
||||
// 游戏 gl context(Ff.p39_1.p73_1 = BS.p73_1)
|
||||
@@ -2764,11 +2764,11 @@
|
||||
}
|
||||
|
||||
// 探测相机字段
|
||||
console.log('[后视] 相机s35_1:', mainCamera.s35_1);
|
||||
console.log('[后视] 相机u35_1:', mainCamera.u35_1);
|
||||
console.log('[后视] 相机r35_1:', mainCamera.r35_1);
|
||||
console.log('[后视] 相机b37_1:', mainCamera.b37_1);
|
||||
|
||||
if (!mainCamera.s35_1 || !mainCamera.r35_1) {
|
||||
if (!mainCamera.u35_1 || !mainCamera.r35_1) {
|
||||
throw new Error('相机字段缺失');
|
||||
}
|
||||
|
||||
@@ -2964,14 +2964,14 @@
|
||||
var camPosZ = playerPos.z + Config.cameraHeight;
|
||||
|
||||
// ===== 保存主相机参数 =====
|
||||
var savedPitch = mainCamera.s35_1.f20_1;
|
||||
var savedYaw = mainCamera.s35_1.g20_1;
|
||||
var savedRoll = mainCamera.s35_1.h20_1;
|
||||
var savedPitch = mainCamera.u35_1.f20_1;
|
||||
var savedYaw = mainCamera.u35_1.g20_1;
|
||||
var savedRoll = mainCamera.u35_1.h20_1;
|
||||
var savedX = mainCamera.r35_1.f20_1;
|
||||
var savedY = mainCamera.r35_1.g20_1;
|
||||
var savedZ = mainCamera.r35_1.h20_1;
|
||||
var savedL36 = mainCamera.s36_1;
|
||||
var savedM36 = mainCamera.t36_1;
|
||||
var savedL36 = mainCamera.u36_1;
|
||||
var savedM36 = mainCamera.v36_1;
|
||||
var savedS36 = mainCamera.z36_1;
|
||||
var savedQ36 = mainCamera.x36_1;
|
||||
var savedR36 = mainCamera.y36_1;
|
||||
@@ -2985,14 +2985,14 @@
|
||||
// g=π 使水平方向反向(朝后看),h=yaw+π 保持水平视角正确
|
||||
// f=-pitch 使垂直方向与主视一致(低头看后方地形)
|
||||
// up 朝下 → FBO 画面颠倒 → GL readback Y 翻转修正
|
||||
mainCamera.s35_1.f20_1 = rearPitch;
|
||||
mainCamera.s35_1.g20_1 = Math.PI;
|
||||
mainCamera.s35_1.h20_1 = camInfo.yaw + Math.PI;
|
||||
mainCamera.u35_1.f20_1 = rearPitch;
|
||||
mainCamera.u35_1.g20_1 = Math.PI;
|
||||
mainCamera.u35_1.h20_1 = camInfo.yaw + Math.PI;
|
||||
mainCamera.r35_1.f20_1 = camPosX;
|
||||
mainCamera.r35_1.g20_1 = camPosY;
|
||||
mainCamera.r35_1.h20_1 = camPosZ;
|
||||
mainCamera.s36_1 = rw;
|
||||
mainCamera.t36_1 = rh;
|
||||
mainCamera.u36_1 = rw;
|
||||
mainCamera.v36_1 = rh;
|
||||
mainCamera.z36_1 = Config.fov;
|
||||
mainCamera.x36_1 = Config.near;
|
||||
mainCamera.y36_1 = Config.far;
|
||||
@@ -3004,14 +3004,14 @@
|
||||
var rearViewMatrix = new Float32Array(mainCamera.b37_1);
|
||||
|
||||
// ===== 保存并禁用阴影/后处理(避免它们切换 FBO 覆盖 rearFbo)=====
|
||||
// p38_1.x3n_1 控制 z39_1(阴影),y3n_1 控制 c3a_1/d3a_1(后处理),z3n_1 控制 f3a_1
|
||||
// p38_1.b3o_1 控制 z39_1(阴影),c3o_1 控制 c3a_1/d3a_1(后处理),z3n_1 控制 f3a_1
|
||||
// 禁用后 y3s 只执行主场景渲染 z3k,跳过所有 FBO 切换的 pass
|
||||
var savedX3n = ff.w38_1.e3o_1;
|
||||
var savedY3n = ff.w38_1.f3o_1;
|
||||
var savedZ3n = ff.w38_1.g3o_1;
|
||||
ff.w38_1.e3o_1 = false;
|
||||
ff.w38_1.f3o_1 = false;
|
||||
ff.w38_1.g3o_1 = false;
|
||||
var savedX3n = ff.y38_1.e3o_1;
|
||||
var savedY3n = ff.y38_1.f3o_1;
|
||||
var savedZ3n = ff.y38_1.k3o_1;
|
||||
ff.y38_1.e3o_1 = false;
|
||||
ff.y38_1.f3o_1 = false;
|
||||
ff.y38_1.k3o_1 = false;
|
||||
|
||||
// ===== 禁用 UI 渲染层(防止技能条等 UI 混入后视 FBO)=====
|
||||
// 保存 UI 层队列,替换为空假对象,y3s 后恢复
|
||||
@@ -3085,9 +3085,9 @@
|
||||
// ===== 恢复阴影/后处理(异常时也要恢复)=====
|
||||
try {
|
||||
if (typeof savedX3n !== 'undefined') {
|
||||
ff.w38_1.e3o_1 = savedX3n;
|
||||
ff.w38_1.f3o_1 = savedY3n;
|
||||
ff.w38_1.g3o_1 = savedZ3n;
|
||||
ff.y38_1.e3o_1 = savedX3n;
|
||||
ff.y38_1.f3o_1 = savedY3n;
|
||||
ff.y38_1.k3o_1 = savedZ3n;
|
||||
}
|
||||
} catch(e) {
|
||||
console.error('[后视] 恢复阴影/后处理失败:', e.message);
|
||||
@@ -3107,14 +3107,14 @@
|
||||
|
||||
// ===== 恢复主相机参数 =====
|
||||
try {
|
||||
mainCamera.s35_1.f20_1 = savedPitch;
|
||||
mainCamera.s35_1.g20_1 = savedYaw;
|
||||
mainCamera.s35_1.h20_1 = savedRoll;
|
||||
mainCamera.u35_1.f20_1 = savedPitch;
|
||||
mainCamera.u35_1.g20_1 = savedYaw;
|
||||
mainCamera.u35_1.h20_1 = savedRoll;
|
||||
mainCamera.r35_1.f20_1 = savedX;
|
||||
mainCamera.r35_1.g20_1 = savedY;
|
||||
mainCamera.r35_1.h20_1 = savedZ;
|
||||
mainCamera.s36_1 = savedL36;
|
||||
mainCamera.t36_1 = savedM36;
|
||||
mainCamera.u36_1 = savedL36;
|
||||
mainCamera.v36_1 = savedM36;
|
||||
mainCamera.z36_1 = savedS36;
|
||||
mainCamera.x36_1 = savedQ36;
|
||||
mainCamera.y36_1 = savedR36;
|
||||
@@ -3466,12 +3466,12 @@
|
||||
if (UMtComponent) return UMtComponent;
|
||||
try {
|
||||
var gmEntity = gm.jyw();
|
||||
if (!gmEntity || !gmEntity.pyt_1 || !gmEntity.pyt_1.s2a_1) return null;
|
||||
gmEntity.pyt_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (!gmEntity || !gmEntity.qz1_1 || !gmEntity.qz1_1.s2a_1) return null;
|
||||
gmEntity.qz1_1.s2a_1.forEach(function(valueList, key) {
|
||||
if (UMtComponent) return;
|
||||
try {
|
||||
var comp = (valueList && typeof valueList.g1 === 'function') ? valueList.g1(0) : valueList;
|
||||
if (comp && typeof comp.m179 === 'function') UMtComponent = comp;
|
||||
if (comp && typeof comp.a17p === 'function') UMtComponent = comp;
|
||||
} catch(e) {}
|
||||
});
|
||||
if (UMtComponent) console.log('[瞄准] uMt 碰撞检测器已获取');
|
||||
@@ -3516,26 +3516,26 @@
|
||||
y178_1: MkVec(0,0,0),
|
||||
z178_1: MkVec(0,0,0),
|
||||
a179_1: maxDist,
|
||||
c179_1: null,
|
||||
q17o_1: null,
|
||||
b179_1: null,
|
||||
d179: function(t, n, i, r, e) {
|
||||
r17o: function(t, n, i, r, e) {
|
||||
this.y178_1.k26(t);
|
||||
this.z178_1.k26(n);
|
||||
this.a179_1 = i;
|
||||
this.c179_1 = r;
|
||||
this.q17o_1 = r;
|
||||
this.b179_1 = e;
|
||||
},
|
||||
d3: function() { this.b179_1 = null; }
|
||||
};
|
||||
|
||||
var filter = {
|
||||
o1co_1: { h1: function() { return false; }, d3: function() {} },
|
||||
l1da_1: { h1: function() { return false; }, d3: function() {} },
|
||||
w179: function() { return true; },
|
||||
d3: function() { this.o1co_1.d3(); },
|
||||
p1co: function() {}
|
||||
d3: function() { this.l1da_1.d3(); },
|
||||
m1da: function() {}
|
||||
};
|
||||
|
||||
var hit = uMt.m179(startVec, dirVec, maxDist, result, filter);
|
||||
var hit = uMt.a17p(startVec, dirVec, maxDist, result, filter);
|
||||
blocked = !!hit && result.a179_1 < (maxDist - 50);
|
||||
RaycastFailCount = 0;
|
||||
} catch(e) {
|
||||
@@ -3648,19 +3648,19 @@
|
||||
if (aimInfo.angle >= aimThreshold) continue;
|
||||
|
||||
// 墙体阻隔判断
|
||||
var blocked = IsLineOfSightBlocked(pos, playerPos, tank.hyt_1, frameCount);
|
||||
var blocked = IsLineOfSightBlocked(pos, playerPos, tank.iz1_1, frameCount);
|
||||
if (blocked) continue;
|
||||
|
||||
// 记录威胁
|
||||
var proj = Project3D(pos, camInfo.pos, camInfo.yaw, camInfo.pitch, camInfo.fov, screenW, screenH);
|
||||
var tankName = GetTankName(tank) || ('ID:' + tank.hyt_1);
|
||||
var tankName = GetTankName(tank) || ('ID:' + tank.iz1_1);
|
||||
threats.push({
|
||||
pos: pos,
|
||||
distance: aimInfo.distance,
|
||||
angle: aimInfo.angle,
|
||||
turretDir: aimInfo.turretDir,
|
||||
screenProj: proj,
|
||||
tankId: tank.hyt_1,
|
||||
tankId: tank.iz1_1,
|
||||
tankName: tankName
|
||||
});
|
||||
}
|
||||
@@ -4019,14 +4019,14 @@
|
||||
var initError = null;
|
||||
|
||||
try {
|
||||
scene = gm.jyw().iyt_1;
|
||||
mainCamera = scene.hyp_1;
|
||||
ff = scene.fyo_1.d75_1;
|
||||
if (!mainCamera || !mainCamera.s35_1 || !mainCamera.r35_1 || !mainCamera.o37) {
|
||||
scene = gm.jyw().jz1_1;
|
||||
mainCamera = scene.iyx_1;
|
||||
ff = scene.gyw_1.d75_1;
|
||||
if (!mainCamera || !mainCamera.u35_1 || !mainCamera.r35_1 || !mainCamera.o37) {
|
||||
throw new Error('相机字段缺失');
|
||||
}
|
||||
console.log('[自由视角] 主相机:', mainCamera.constructor.name,
|
||||
'l35=(' + mainCamera.s35_1.f20_1.toFixed(2) + ',' + mainCamera.s35_1.g20_1.toFixed(2) + ',' + mainCamera.s35_1.h20_1.toFixed(2) + ')',
|
||||
'l35=(' + mainCamera.u35_1.f20_1.toFixed(2) + ',' + mainCamera.u35_1.g20_1.toFixed(2) + ',' + mainCamera.u35_1.h20_1.toFixed(2) + ')',
|
||||
'k35=(' + mainCamera.r35_1.f20_1.toFixed(0) + ',' + mainCamera.r35_1.g20_1.toFixed(0) + ',' + mainCamera.r35_1.h20_1.toFixed(0) + ')');
|
||||
} catch(e) {
|
||||
initError = e;
|
||||
@@ -4053,9 +4053,9 @@
|
||||
var origH37 = mainCamera.o37;
|
||||
|
||||
function applyFreeLookParams() {
|
||||
mainCamera.s35_1.f20_1 = freePitch; // pitch (f)
|
||||
mainCamera.s35_1.g20_1 = freeRoll; // roll (g) 保持初始值
|
||||
mainCamera.s35_1.h20_1 = freeYaw; // yaw (h) 鼠标左右控制
|
||||
mainCamera.u35_1.f20_1 = freePitch; // pitch (f)
|
||||
mainCamera.u35_1.g20_1 = freeRoll; // roll (g) 保持初始值
|
||||
mainCamera.u35_1.h20_1 = freeYaw; // yaw (h) 鼠标左右控制
|
||||
mainCamera.r35_1.f20_1 = freePosX;
|
||||
mainCamera.r35_1.g20_1 = freePosY;
|
||||
mainCamera.r35_1.h20_1 = freePosZ;
|
||||
@@ -4092,9 +4092,9 @@
|
||||
function enableFreeLook() {
|
||||
// 从当前相机参数初始化(平滑过渡)
|
||||
// l35_1: f=pitch, g=roll, h=yaw
|
||||
freePitch = mainCamera.s35_1.f20_1;
|
||||
freeRoll = mainCamera.s35_1.g20_1; // roll 保持初始值
|
||||
freeYaw = mainCamera.s35_1.h20_1; // yaw 鼠标控制
|
||||
freePitch = mainCamera.u35_1.f20_1;
|
||||
freeRoll = mainCamera.u35_1.g20_1; // roll 保持初始值
|
||||
freeYaw = mainCamera.u35_1.h20_1; // yaw 鼠标控制
|
||||
freePosX = mainCamera.r35_1.f20_1;
|
||||
freePosY = mainCamera.r35_1.g20_1;
|
||||
freePosZ = mainCamera.r35_1.h20_1;
|
||||
@@ -4380,21 +4380,21 @@
|
||||
// 皮肤字段:新 build 是 w14w_1;旧 build 是 t14l_1(新版 t14l_1 已改成悬停车体状态 Qmt)
|
||||
var hullComp = FindComponentByField(tank, 'w14w_1') ||
|
||||
FindComponentByField(tank, 't14l_1') ||
|
||||
FindComponentByField(tank, 'u14l_1') ||
|
||||
FindComponentByField(tank, 'w14x_1') ||
|
||||
FindComponentByField(tank, 'p14l_1');
|
||||
if (!hullComp) return null;
|
||||
var skin = (hullComp.w14w_1 && hullComp.w14w_1.s17b_1) ? hullComp.w14w_1 :
|
||||
(hullComp.t14l_1 && hullComp.t14l_1.s17b_1) ? hullComp.t14l_1 :
|
||||
(hullComp.p14l_1 && hullComp.p14l_1.s17b_1) ? hullComp.p14l_1 : null;
|
||||
var skin = (hullComp.w14w_1 && hullComp.w14w_1.g17r_1) ? hullComp.w14w_1 :
|
||||
(hullComp.t14l_1 && hullComp.t14l_1.g17r_1) ? hullComp.t14l_1 :
|
||||
(hullComp.p14l_1 && hullComp.p14l_1.g17r_1) ? hullComp.p14l_1 : null;
|
||||
if (!skin) return null;
|
||||
try {
|
||||
var partCount = skin.s17b_1.e1();
|
||||
var partCount = skin.g17r_1.e1();
|
||||
for (var p = 0; p < partCount; p++) {
|
||||
var part = skin.s17b_1.g1(p);
|
||||
if (!part || !part.v17b_1) continue;
|
||||
var nodeCount = part.v17b_1.e1();
|
||||
var part = skin.g17r_1.g1(p);
|
||||
if (!part || !part.j17r_1) continue;
|
||||
var nodeCount = part.j17r_1.e1();
|
||||
for (var n = 0; n < nodeCount; n++) {
|
||||
var bpNode = part.v17b_1.g1(n);
|
||||
var bpNode = part.j17r_1.g1(n);
|
||||
if (!bpNode || !bpNode.n35_1) continue;
|
||||
// 不按 g35_1 过滤:它是引擎的细节/淡出权重(0~1),不是幽灵标志,
|
||||
// 过滤会漏掉低细节节点、导致取不到朝向
|
||||
@@ -4428,10 +4428,10 @@
|
||||
var scene = null, ff = null, rootNode = null, mainCamera = null, gl = null;
|
||||
var initError = null;
|
||||
try {
|
||||
scene = gm.jyw().iyt_1;
|
||||
ff = scene.fyo_1.d75_1;
|
||||
rootNode = scene.eyp_1;
|
||||
mainCamera = scene.hyp_1;
|
||||
scene = gm.jyw().jz1_1;
|
||||
ff = scene.gyw_1.d75_1;
|
||||
rootNode = scene.fyx_1;
|
||||
mainCamera = scene.iyx_1;
|
||||
gl = ff.w39_1.b74_1;
|
||||
if (!ff || !rootNode || !mainCamera || !gl) throw new Error('关键字段缺失');
|
||||
} catch(e) {
|
||||
@@ -5002,37 +5002,37 @@
|
||||
|
||||
try {
|
||||
// 保存主相机参数
|
||||
var sPitch = mainCamera.s35_1.f20_1;
|
||||
var sRoll = mainCamera.s35_1.g20_1;
|
||||
var sYaw = mainCamera.s35_1.h20_1;
|
||||
var sPitch = mainCamera.u35_1.f20_1;
|
||||
var sRoll = mainCamera.u35_1.g20_1;
|
||||
var sYaw = mainCamera.u35_1.h20_1;
|
||||
var sX = mainCamera.r35_1.f20_1;
|
||||
var sY = mainCamera.r35_1.g20_1;
|
||||
var sZ = mainCamera.r35_1.h20_1;
|
||||
var sL36 = mainCamera.s36_1, sM36 = mainCamera.t36_1;
|
||||
var sL36 = mainCamera.u36_1, sM36 = mainCamera.v36_1;
|
||||
var sS36 = mainCamera.z36_1, sQ36 = mainCamera.x36_1, sR36 = mainCamera.y36_1;
|
||||
|
||||
// 设置俯瞰相机参数
|
||||
// pitch=-π/2 朝下看,roll=0 不翻转,yaw=0 北朝上
|
||||
mainCamera.s35_1.f20_1 = -Math.PI / 2;
|
||||
mainCamera.s35_1.g20_1 = 0;
|
||||
mainCamera.s35_1.h20_1 = 0;
|
||||
mainCamera.u35_1.f20_1 = -Math.PI / 2;
|
||||
mainCamera.u35_1.g20_1 = 0;
|
||||
mainCamera.u35_1.h20_1 = 0;
|
||||
mainCamera.r35_1.f20_1 = viewCenterX;
|
||||
mainCamera.r35_1.g20_1 = viewCenterY;
|
||||
mainCamera.r35_1.h20_1 = camHeight;
|
||||
mainCamera.s36_1 = FBO_W;
|
||||
mainCamera.t36_1 = FBO_H;
|
||||
mainCamera.u36_1 = FBO_W;
|
||||
mainCamera.v36_1 = FBO_H;
|
||||
mainCamera.z36_1 = Config.fov;
|
||||
mainCamera.x36_1 = Config.near;
|
||||
mainCamera.y36_1 = Config.far;
|
||||
mainCamera.o37();
|
||||
|
||||
// 禁用阴影/后处理
|
||||
var savedX3n = ff.w38_1.e3o_1;
|
||||
var savedY3n = ff.w38_1.f3o_1;
|
||||
var savedZ3n = ff.w38_1.g3o_1;
|
||||
ff.w38_1.e3o_1 = false;
|
||||
ff.w38_1.f3o_1 = false;
|
||||
ff.w38_1.g3o_1 = false;
|
||||
var savedX3n = ff.y38_1.e3o_1;
|
||||
var savedY3n = ff.y38_1.f3o_1;
|
||||
var savedZ3n = ff.y38_1.k3o_1;
|
||||
ff.y38_1.e3o_1 = false;
|
||||
ff.y38_1.f3o_1 = false;
|
||||
ff.y38_1.k3o_1 = false;
|
||||
|
||||
// 禁用 UI 层
|
||||
var savedUiQueues = {};
|
||||
@@ -5085,21 +5085,21 @@
|
||||
origBindFramebuffer(gl.FRAMEBUFFER, mainFbo);
|
||||
|
||||
// 恢复渲染状态
|
||||
ff.w38_1.e3o_1 = savedX3n;
|
||||
ff.w38_1.f3o_1 = savedY3n;
|
||||
ff.w38_1.g3o_1 = savedZ3n;
|
||||
ff.y38_1.e3o_1 = savedX3n;
|
||||
ff.y38_1.f3o_1 = savedY3n;
|
||||
ff.y38_1.k3o_1 = savedZ3n;
|
||||
for (var ui2 = 0; ui2 < uiLayerIndices.length; ui2++) {
|
||||
ff.e39_1[uiLayerIndices[ui2]] = savedUiQueues[uiLayerIndices[ui2]];
|
||||
}
|
||||
|
||||
// 恢复主相机
|
||||
mainCamera.s35_1.f20_1 = sPitch;
|
||||
mainCamera.s35_1.g20_1 = sRoll;
|
||||
mainCamera.s35_1.h20_1 = sYaw;
|
||||
mainCamera.u35_1.f20_1 = sPitch;
|
||||
mainCamera.u35_1.g20_1 = sRoll;
|
||||
mainCamera.u35_1.h20_1 = sYaw;
|
||||
mainCamera.r35_1.f20_1 = sX;
|
||||
mainCamera.r35_1.g20_1 = sY;
|
||||
mainCamera.r35_1.h20_1 = sZ;
|
||||
mainCamera.s36_1 = sL36; mainCamera.t36_1 = sM36;
|
||||
mainCamera.u36_1 = sL36; mainCamera.v36_1 = sM36;
|
||||
mainCamera.z36_1 = sS36; mainCamera.x36_1 = sQ36; mainCamera.y36_1 = sR36;
|
||||
mainCamera.o37();
|
||||
|
||||
@@ -5981,7 +5981,7 @@
|
||||
});
|
||||
|
||||
// ===== 电磁炮(RAILGUN / z4t)设置 =====
|
||||
// 锁定/蓄力时长实时覆盖 window.__hornetLockSec__(游戏内 z4t.w187() 优先读它),
|
||||
// 锁定/蓄力时长实时覆盖 window.__hornetLockSec__(游戏内 z4t.c18o() 优先读它),
|
||||
// 拖动滑块**立即生效**,不需要重打包或刷新页面。
|
||||
// 实测门槛:1.5s / 2.0s / 原版3~5s = 满伤;1.0s / 0.1s = 无伤害 ⇒ 门槛在 1.0~1.5s。
|
||||
var rgSec = MakeSettingsSection('电磁炮设置');
|
||||
|
||||
Reference in new issue
Block a user