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' 开启)
This commit is contained in:
1 parent
512c718d38
commit
d4c5a89703
3 files changed
+62
-16
No files matched your search
@@ -155,11 +155,11 @@ try {
|
||||
}
|
||||
}
|
||||
|
||||
// ===== 自动加载链路探针(默认开;localStorage.hornetProbe='0' 关闭)=====
|
||||
// ===== 自动加载链路探针(**默认关闭**;localStorage.hornetProbe='1' 开启)=====
|
||||
// 开关只能用 localStorage:hash 会被游戏当路由(进不去战场),查询串会被当 config 参数(握手 1005)。
|
||||
// 探针数据走 POST /__probe__ 落盘:武器链路 → probe_railgun.log,底盘控制 → probe_chassis.log。
|
||||
// 探针数据走 POST /__probe__ 落盘:武器链路 → probe_railgun.log,底盘/炮塔 → probe_chassis.log。
|
||||
console.log('[Hornet] 探针块已执行 (localStorage.hornetProbe=' + JSON.stringify(localStorage.getItem('hornetProbe')) + ')');
|
||||
if (localStorage.getItem('hornetProbe') !== '0') {
|
||||
if (localStorage.getItem('hornetProbe') === '1') {
|
||||
(async () => {
|
||||
for (let i = 0; i < 900; i++) { // 等进战场(最多 15 分钟)
|
||||
if (window.__gameMode__) break;
|
||||
|
||||
@@ -71671,20 +71671,30 @@
|
||||
if (0 === i) txt(t, 0);
|
||||
else {
|
||||
(t.izp_1 !== i && txt(t, 0), txt(t, rxt(t, t.lzp_1, i, yE(n))));
|
||||
var r = Qjt(t);
|
||||
r.k15b(r.azi_1 + t.lzp_1 * yE(n));
|
||||
var r = Qjt(t), u = t.lzp_1 * yE(n);
|
||||
// HORNET-TAG: 炮塔「摆头」不过冲实验(case 0 是速度积分;单帧步长不得越过目标)
|
||||
// 注意:rzp_1 的含义随输入模式变化(键盘=输入量 / 绝对瞄准=目标角),故**默认关闭**,
|
||||
// 确认语义后可用 window.__hornetTurretPrecise__ = 'force' 试。
|
||||
if (window.__hornetTurretPrecise__ === 'force') {
|
||||
if (!window.__hornetRzpLog__)
|
||||
(window.__hornetRzpLog__ = !0),
|
||||
console.log('[Hornet] case0 rzp_1=' + i + ' lzp_1=' + t.lzp_1 + ' step=' + u + ' azi_1=' + r.azi_1);
|
||||
if (Math.abs(u) > Math.abs(i)) (u = i), txt(t, 0);
|
||||
}
|
||||
r.k15b(r.azi_1 + u);
|
||||
}
|
||||
t.izp_1 = i;
|
||||
})(this, n);
|
||||
break;
|
||||
case 1:
|
||||
ext(this, n, this.rzp_1);
|
||||
// HORNET-TAG: 炮塔精准跟手(默认开启)—— 直接锁到目标角,不做速度追赶,杜绝"追过头再回摆"
|
||||
// 回退:window.__hornetTurretPrecise__ = 'off'(或 false)
|
||||
if (window.__hornetTurretPrecise__ !== false && window.__hornetTurretPrecise__ !== "off")
|
||||
(Qjt(this).k15b(this.rzp_1), txt(this, 0));
|
||||
else ext(this, n, this.rzp_1);
|
||||
break;
|
||||
case 2:
|
||||
ext(
|
||||
this,
|
||||
n,
|
||||
(function (t, n) {
|
||||
var TurretTarget2 = (function (t, n) {
|
||||
A.ozc(n - 1.5707964, sxt().n15b_1);
|
||||
var i = (function (t) {
|
||||
var n = t.ezp_1;
|
||||
@@ -71699,8 +71709,12 @@
|
||||
(r.g23(0, 0, 1, e, u, s), sxt().m15b_1.u22(i), sxt().m15b_1.y22(sxt().n15b_1));
|
||||
} else i.u24(sxt().n15b_1);
|
||||
return (sxt().n15b_1.l26(bj().k25_1, sxt().n15b_1), A.mzc(sxt().n15b_1));
|
||||
})(this, this.qzp_1),
|
||||
);
|
||||
})(this, this.qzp_1);
|
||||
// HORNET-TAG: 炮塔精准跟手(case 2 相机跟随,默认开启)—— 直接锁到目标角
|
||||
// 回退:window.__hornetTurretPrecise__ = 'off'(或 false)
|
||||
if (window.__hornetTurretPrecise__ !== false && window.__hornetTurretPrecise__ !== "off")
|
||||
(Qjt(this).k15b(TurretTarget2), txt(this, 0));
|
||||
else ext(this, n, TurretTarget2);
|
||||
break;
|
||||
default:
|
||||
G$();
|
||||
@@ -71928,11 +71942,22 @@
|
||||
this.wyx().oyu(this.vzh_1);
|
||||
}),
|
||||
(m$($xt).qyr = function (t) {
|
||||
// HORNET-TAG: 炮塔「摆头」精准不回弹(默认开启;window.__hornetTurretPrecise__ = false 回退原逻辑) (weaponMount.qyr)
|
||||
if (!window.__hornetTurretTagged__) {
|
||||
window.__hornetTurretTagged__ = !0;
|
||||
console.log('[Hornet] 炮塔精准化已生效 (weaponMount.qyr:t 钳制 ≤1、去掉 czi_1)');
|
||||
}
|
||||
// 原式 dzi_1 = bzi_1 + t*(azi_1-bzi_1) + czi_1 有两个过冲源:
|
||||
// ① t = 1 + dt/标准帧长(渲染循环 module_61378 传入)→ 常 >1,外推冲过头,输入停下后回摆
|
||||
// ② czi_1 = 弹簧阻尼器 Cj(module_55088 Tu) 的残留偏移 → 振铃回弹
|
||||
// 覆盖:钳制 t ≤ 1 且去掉 czi_1(俯仰 izi_1 同样钳制)。azi_1 本身受转速上限逐帧累加,所以依然平滑。
|
||||
var TurretPrecise = window.__hornetTurretPrecise__ !== false && window.__hornetTurretPrecise__ !== "off";
|
||||
var TurretT = TurretPrecise ? (t > 1 ? 1 : t < 0 ? 0 : t) : t;
|
||||
var n = gj(this.azi_1, this.bzi_1),
|
||||
i = this.bzi_1 + t * n + this.czi_1;
|
||||
i = TurretPrecise ? this.azi_1 : this.bzi_1 + TurretT * n + this.czi_1;
|
||||
this.dzi_1 = L$(i);
|
||||
var r = this.hzi_1;
|
||||
((this.izi_1 = r + (this.gzi_1 - r) * t),
|
||||
((this.izi_1 = TurretPrecise ? this.gzi_1 : r + (this.gzi_1 - r) * TurretT),
|
||||
this.ezi_1.h23(bj().k25_1, this.dzi_1),
|
||||
this.ezi_1.e24(gxt(this).vzl_1),
|
||||
this.ezi_1.o24(mxt(this).izh_1));
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
};
|
||||
|
||||
// ---- 状态 ----
|
||||
var Tank = null, Cyt = null, Zmt = null, Eyt = null, Iyt = null, InputS = null, SI = null;
|
||||
var Tank = null, Cyt = null, Zmt = null, Eyt = null, Iyt = null, InputS = null, SI = null, Mount = null, Turret = null;
|
||||
var LastSeen = {};
|
||||
var Once = function (key, val) {
|
||||
var s = JSON.stringify(val);
|
||||
@@ -117,7 +117,7 @@
|
||||
else Object.keys(m).forEach(function (k) { Entries.push([k, m[k]]); });
|
||||
})();
|
||||
|
||||
var c = null, z = null, e = null, iy = null, isv = null;
|
||||
var c = null, z = null, e = null, iy = null, isv = null, mt = null, tu = null;
|
||||
Entries.forEach(function (en) {
|
||||
var v = en[1];
|
||||
if (!v) return;
|
||||
@@ -126,11 +126,14 @@
|
||||
if (!e && 'k14l_1' in v && 'l14l_1' in v) e = v; // 上行桥
|
||||
if (!iy && 't14l_1' in v && 'r14l_1' in v && 'u14l_1' in v) iy = v; // 注入通道
|
||||
if (!isv && typeof v.ua2 === 'function') isv = v; // inputSettingsService
|
||||
if (!mt && 'azi_1' in v && 'dzi_1' in v && 'ezi_1' in v && 'mzi_1' in v) mt = v; // weaponMount(炮塔朝向矩阵)
|
||||
if (!tu && 'tzp_1' in v && 'pzp_1' in v && 'rzp_1' in v && 'lzp_1' in v) tu = v; // oxt(炮塔控制器)
|
||||
});
|
||||
|
||||
// 只在有实质变化时更新(避免坦克重建后仍指向旧对象)
|
||||
if (Found !== Tank) { Tank = Found; LOG('玩家坦克组件数=' + Best + ' ctor=' + Ctor(Tank)); }
|
||||
Cyt = c; Zmt = z; Eyt = e; Iyt = iy; InputS = isv;
|
||||
Mount = mt; Turret = tu;
|
||||
return !!(Cyt || Zmt);
|
||||
};
|
||||
|
||||
@@ -140,6 +143,8 @@
|
||||
LOG('Zmt ' + (Zmt ? Ctor(Zmt) + ' ▸ ' + Object.keys(Zmt).join(',') : 'null'));
|
||||
LOG('Eyt ' + (Eyt ? Ctor(Eyt) + ' ▸ ' + Object.keys(Eyt).join(',') : 'null'));
|
||||
LOG('Iyt ' + (Iyt ? Ctor(Iyt) + ' ▸ ' + Object.keys(Iyt).join(',') : 'null'));
|
||||
LOG('Mount ' + (Mount ? Ctor(Mount) + ' ▸ ' + Object.keys(Mount).join(',') : 'null'));
|
||||
LOG('Turret ' + (Turret ? Ctor(Turret) + ' ▸ ' + Object.keys(Turret).join(',') : 'null'));
|
||||
if (Cyt) LOG('Cyt.j14k_1 ctor=' + Ctor(Cyt.j14k_1) + ' 三轴=' + JSON.stringify(Axes(Cyt.j14k_1)));
|
||||
if (Zmt) LOG('Zmt.r14f_1 三轴=' + JSON.stringify(Axes(Zmt.r14f_1)) + ' q14f_1 三轴=' + JSON.stringify(Axes(Zmt.q14f_1)));
|
||||
if (InputS) {
|
||||
@@ -167,6 +172,20 @@
|
||||
var c = args[1];
|
||||
LOG('p14n 履带上行 t=' + Num(args[0]) + ' fwd=' + Num(c && c.m14b_1) +
|
||||
' turn=' + Num(c && c.n14b_1) + ' revTurn=' + Num(c && c.o14b_1));
|
||||
} else if (tag === 'OXTWAK') {
|
||||
// 炮塔控制器每帧:azi_1=目标角,mode=输入模式,rzp_1=输入,lzp_1=当前转速
|
||||
var z = Num(self.azi_1);
|
||||
if (Once('oxt', z + '|' + Num(self.pzp_1 && self.pzp_1.k3_1))) {
|
||||
LOG('oxt.wak azi_1=' + z + ' mode=' + Num(self.pzp_1 && self.pzp_1.k3_1) +
|
||||
' rzp_1=' + Num(self.rzp_1) + ' lzp_1=' + Num(self.lzp_1) + ' jzp_1=' + Num(self.jzp_1));
|
||||
}
|
||||
} else if (tag === 'QYR') {
|
||||
// 炮塔矩阵每帧插值:azi_1=目标角,dzi_1=显示角,czi_1=弹簧补偿,args[0]=渲染插值系数
|
||||
var R2 = function (x) { return typeof x === 'number' ? Math.round(x * 100) / 100 : Num(x); };
|
||||
var Key = R2(self.azi_1) + '|' + R2(self.dzi_1) + '|' + R2(self.czi_1) + '|' + R2(args[0]);
|
||||
if (Once('qyr', Key)) {
|
||||
LOG('qyr t=' + R2(args[0]) + ' azi_1=' + R2(self.azi_1) + ' dzi_1=' + R2(self.dzi_1) + ' czi_1=' + R2(self.czi_1));
|
||||
}
|
||||
}
|
||||
};
|
||||
var Wrap = function (obj, name, tag) {
|
||||
@@ -194,6 +213,8 @@
|
||||
var Hit = [];
|
||||
if (Wrap(Cyt, 'wak', 'CYTAWAK')) Hit.push('Cyt.wak');
|
||||
if (Wrap(Zmt, 'wak', 'ZMTAWAK')) Hit.push('Zmt.wak');
|
||||
if (Wrap(Turret, 'wak', 'OXTWAK')) Hit.push('oxt.wak(炮塔控制器)');
|
||||
if (Wrap(Mount, 'qyr', 'QYR')) Hit.push('weaponMount.qyr(炮塔矩阵)');
|
||||
Hooked = true;
|
||||
LOG('已挂 Hook: ' + (Hit.join(' | ') || '(无)'));
|
||||
} else if (Tries % 15 === 0) {
|
||||
|
||||
Reference in new issue
Block a user