fix(protocol): TankState 按 23 字节定长 blob(T5)解码,修复 TankCC 后续字节错位
- codec_fields:module_87072::T5 记为单字段 bytes23;pq.tankState 的 TypeCodec 由 85183::jq 改指 87072::T5 - 生成器支持 bytes<N>(ByteArray / R.ReadRaw(N) / W.WriteRaw),重生成 Module87072、Module85183 - 审计链:lib_space_codec 新增 bytes<N>;audit_pt_boundaries / audit_bit_budget 支持 --body/--plain;semantic 暴露 Out.Bits - 新增工具:audit_bit_budget(nullmap 位预算)、probe_pt_record(pt 项级)、analyze_item_trace(客户端项级打点对照)、dump_codec_src - wss_server 新增 --dump-plain:把解密+解压后的裸帧体落到 plain/,供离线审计 - 镜像打点:opt 全量位位置、pt 项级字节/位区间、TankCC 逐字段区间;重新打包 unpacked.pack.json
This commit is contained in:
1 parent
2ce2fd0363
commit
b083d27165
16 files changed
+773
-60
No files matched your search
@@ -1 +1 @@
|
||||
{"version":"18a538259d2f8c3a","base":"/play/static/js/unpacked/","count":127,"files":{"module_00806.js":"// ============================================================\n// Module ID: 806\n// ============================================================\n;(window.__modules__ = window.__modules__ || {})[806] = (t, n, i) => {\n \"use strict\";\n var r = i(19487),\n e = {\n childContextTypes: !0,\n contextType: !0,\n contextTypes: !0,\n defaultProps: !0,\n displayName: !0,\n getDefaultProps: !0,\n getDerivedStateFromError: !0,\n getDerivedStateFromProps: !0,\n mixins: !0,\n propTypes: !0,\n type: !0,\n },\n u = { name: !0, length: !0, prototype: !0, caller: !0, callee: !0, arguments: !0, arity: !0 },\n s = { $$typeof: !0, compare: !0, defaultProps: !0, displayName: !0, propTypes: !0, type: !0 },\n o = {};\n function _(t) {\n return r.isMemo(t) ? s : o[t.$$typeof] || e;\n }\n ((o[r.ForwardRef] = { $$typeof: !0, render: !0, defaultProps: !0, displayName: !0, propTypes: !0 }),\n (o[r.Memo] = s));\n var h = Object.defineProperty,\n a = Object.getOwnPropertyNames,\n c = Object.getOwnPropertySymbols,\n l = Object.getOwnPropertyDescriptor,\n f = Object.getPrototypeOf,\n v = Object.prototype;\n t.exports = function t(n, i, r) {\n if (\"string\" != typeof i) {\n if (v) {\n var e = f(i);\n e && e !== v && t(n, e, r);\n }\n var s = a(i);\n c && (s = s.concat(c(i)));\n for (var o = _(n), p = _(i), w = 0; w < s.length; ++w) {\n var d = s[w];\n if (!(u[d] || (r && r[d]) || (p && p[d]) || (o && o[d]))) {\n var g = l(i, d);\n try {\n h(n, d, g);\n } catch (t) {}\n }\n }\n }\n return n;\n };\n};\n","module_00905.js":"// ============================================================\n// Module ID: 905\n// ============================================================\n;(window.__modules__ = window.__modules__ || {})[905] = (t) => {\n \"use strict\";\n t.exports = \"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";\n};\n","module_01510.js":"// ============================================================\n// Module ID: 1510\n// ============================================================\n;(window.__modules__ = window.__modules__ || {})[1510] = (t, n, i) => {\n !(function (t, n, i, r, e) {\n \"use strict\";\n var u,\n s,\n o,\n _,\n h,\n a,\n c,\n l,\n f,\n v,\n p,\n w,\n d,\n g,\n m,\n k,\n z = n.$_$.ob,\n b = n.$_$.w4,\n q = i.$_$.e,\n y = n.$_$.he,\n $ = n.$_$.xj,\n x = n.$_$.h5,\n j = n.$_$.o1,\n S = n.$_$.gd,\n C = i.$_$.d,\n E = n.$_$.r5,\n T = n.$_$.ud,\n I = i.$_$.f,\n A = n.$_$.nf,\n R = r.$_$.s1,\n P = e.$_$.n,\n N = n.$_$.rf,\n M = n.$_$.dd,\n O = n.$_$.sj,\n D = i.$_$.r,\n L = i.$_$.b,\n B = e.$_$.f,\n U = n.$_$.yb,\n F = n.$_$.c,\n G = e.$_$.f1,\n H = n.$_$.ge,\n W = e.$_$.l,\n V = n.$_$.nj,\n K = n.$_$.ke;\n function Y(t) {\n var n = t.zuy_1;\n if (null != n) return n;\n z(\"codec_appId\");\n }\n function X() {}\n function J() {}\n function Z(t) {\n var n = t.cuz_1;\n if (null != n) return n;\n z(\"codec_questToAchievementMap\");\n }\n function Q() {}\n function tt(t) {\n var n = t.fuz_1;\n if (null != n) return n;\n z(\"codec_itemIdMap\");\n }\n function nt() {}\n function it() {\n ((this.iuz_1 = new R(A(I), null)), (this.juz_1 = new R(A(P), null)));\n }\n function rt() {\n (B.call(this),\n (this.nuz_1 = new R(A(I), null)),\n (this.ouz_1 = new R(A(P), null)),\n (this.quz_1 = new O(-621796162, 1132145095)),\n (this.ruz_1 = new O(1635469714, 1785333818)),\n (this.suz_1 = new O(-773564903, 1989636776)),\n (this.tuz_1 = new O(497901439, 366177258)),\n this.tay(),\n (this.uuz_1 = this.quz_1));\n }\n function et(t) {\n var n = N;\n return t.xuz_1.e2b(\n t,\n M(\n \"protocol\",\n 1,\n n,\n function (t) {\n return et(t);\n },\n null,\n ),\n );\n }\n function ut() {\n ((this.xuz_1 = new R(A(I), null)), (this.zuz_1 = new O(-1272608814, 1097348888)));\n }\n function st() {\n return ((t = H(y(ot))), ot.call(t), t);\n var t;\n }\n function ot() {}\n function _t(t) {\n var n = N;\n return t.fv0_1.e2b(\n t,\n M(\n \"protocol\",\n 1,\n n,\n function (t) {\n return _t(t);\n },\n null,\n ),\n );\n }\n function ht(t) {\n var n = N;\n return t.gv0_1.e2b(\n t,\n M(\n \"modelRegistry\",\n Line truncated
|
||||
{"version":"c0f14bae364a627c","base":"/play/static/js/unpacked/","count":127,"files":{"module_00806.js":"// ============================================================\n// Module ID: 806\n// ============================================================\n;(window.__modules__ = window.__modules__ || {})[806] = (t, n, i) => {\n \"use strict\";\n var r = i(19487),\n e = {\n childContextTypes: !0,\n contextType: !0,\n contextTypes: !0,\n defaultProps: !0,\n displayName: !0,\n getDefaultProps: !0,\n getDerivedStateFromError: !0,\n getDerivedStateFromProps: !0,\n mixins: !0,\n propTypes: !0,\n type: !0,\n },\n u = { name: !0, length: !0, prototype: !0, caller: !0, callee: !0, arguments: !0, arity: !0 },\n s = { $$typeof: !0, compare: !0, defaultProps: !0, displayName: !0, propTypes: !0, type: !0 },\n o = {};\n function _(t) {\n return r.isMemo(t) ? s : o[t.$$typeof] || e;\n }\n ((o[r.ForwardRef] = { $$typeof: !0, render: !0, defaultProps: !0, displayName: !0, propTypes: !0 }),\n (o[r.Memo] = s));\n var h = Object.defineProperty,\n a = Object.getOwnPropertyNames,\n c = Object.getOwnPropertySymbols,\n l = Object.getOwnPropertyDescriptor,\n f = Object.getPrototypeOf,\n v = Object.prototype;\n t.exports = function t(n, i, r) {\n if (\"string\" != typeof i) {\n if (v) {\n var e = f(i);\n e && e !== v && t(n, e, r);\n }\n var s = a(i);\n c && (s = s.concat(c(i)));\n for (var o = _(n), p = _(i), w = 0; w < s.length; ++w) {\n var d = s[w];\n if (!(u[d] || (r && r[d]) || (p && p[d]) || (o && o[d]))) {\n var g = l(i, d);\n try {\n h(n, d, g);\n } catch (t) {}\n }\n }\n }\n return n;\n };\n};\n","module_00905.js":"// ============================================================\n// Module ID: 905\n// ============================================================\n;(window.__modules__ = window.__modules__ || {})[905] = (t) => {\n \"use strict\";\n t.exports = \"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";\n};\n","module_01510.js":"// ============================================================\n// Module ID: 1510\n// ============================================================\n;(window.__modules__ = window.__modules__ || {})[1510] = (t, n, i) => {\n !(function (t, n, i, r, e) {\n \"use strict\";\n var u,\n s,\n o,\n _,\n h,\n a,\n c,\n l,\n f,\n v,\n p,\n w,\n d,\n g,\n m,\n k,\n z = n.$_$.ob,\n b = n.$_$.w4,\n q = i.$_$.e,\n y = n.$_$.he,\n $ = n.$_$.xj,\n x = n.$_$.h5,\n j = n.$_$.o1,\n S = n.$_$.gd,\n C = i.$_$.d,\n E = n.$_$.r5,\n T = n.$_$.ud,\n I = i.$_$.f,\n A = n.$_$.nf,\n R = r.$_$.s1,\n P = e.$_$.n,\n N = n.$_$.rf,\n M = n.$_$.dd,\n O = n.$_$.sj,\n D = i.$_$.r,\n L = i.$_$.b,\n B = e.$_$.f,\n U = n.$_$.yb,\n F = n.$_$.c,\n G = e.$_$.f1,\n H = n.$_$.ge,\n W = e.$_$.l,\n V = n.$_$.nj,\n K = n.$_$.ke;\n function Y(t) {\n var n = t.zuy_1;\n if (null != n) return n;\n z(\"codec_appId\");\n }\n function X() {}\n function J() {}\n function Z(t) {\n var n = t.cuz_1;\n if (null != n) return n;\n z(\"codec_questToAchievementMap\");\n }\n function Q() {}\n function tt(t) {\n var n = t.fuz_1;\n if (null != n) return n;\n z(\"codec_itemIdMap\");\n }\n function nt() {}\n function it() {\n ((this.iuz_1 = new R(A(I), null)), (this.juz_1 = new R(A(P), null)));\n }\n function rt() {\n (B.call(this),\n (this.nuz_1 = new R(A(I), null)),\n (this.ouz_1 = new R(A(P), null)),\n (this.quz_1 = new O(-621796162, 1132145095)),\n (this.ruz_1 = new O(1635469714, 1785333818)),\n (this.suz_1 = new O(-773564903, 1989636776)),\n (this.tuz_1 = new O(497901439, 366177258)),\n this.tay(),\n (this.uuz_1 = this.quz_1));\n }\n function et(t) {\n var n = N;\n return t.xuz_1.e2b(\n t,\n M(\n \"protocol\",\n 1,\n n,\n function (t) {\n return et(t);\n },\n null,\n ),\n );\n }\n function ut() {\n ((this.xuz_1 = new R(A(I), null)), (this.zuz_1 = new O(-1272608814, 1097348888)));\n }\n function st() {\n return ((t = H(y(ot))), ot.call(t), t);\n var t;\n }\n function ot() {}\n function _t(t) {\n var n = N;\n return t.fv0_1.e2b(\n t,\n M(\n \"protocol\",\n 1,\n n,\n function (t) {\n return _t(t);\n },\n null,\n ),\n );\n }\n function ht(t) {\n var n = N;\n return t.gv0_1.e2b(\n t,\n M(\n \"modelRegistry\",\n Line truncated
|
||||
@@ -413,22 +413,23 @@
|
||||
null == n ? t.f7h_1.b7h(!0) : (t.f7h_1.b7h(!1), this.r7h_1.s7h(t, n));
|
||||
}),
|
||||
(z(Ht).t7h = function (t) {
|
||||
// [Hornet 调试] 可选读器打点(全量 opt,按帧分组):记录
|
||||
// rid = 位读取器实例 id(一帧内所有记录共享同一个位读取器 → 同一 rid 即同一帧)
|
||||
// pos = 读位前的绝对位索引;bit = 读到的位
|
||||
// slots = 内层读器的槽位名(模型字段 → 槽位名全局唯一,可离线反查是哪个模型)
|
||||
// 目的:直接看客户端对「某个模型」到底消费了几个 opt 位,从而定位我们少算的那一位。
|
||||
// 位只读一次;打点异常不影响解码。
|
||||
// [Hornet 调试] 可选读器全量打点:**每一次** opt 读位都记一条(不再按槽位过滤)。
|
||||
// pos = 读位前的绝对位索引;bit = 读到的位;off = 读位时的字节游标(g2t)
|
||||
// keys = 内层读器自有槽位(模型/集合可据此反查);src = 内层 t7h 源码前 72 字符
|
||||
// elemKeys / elemSrc = 内层的列表元素读器(opt<list<…> 用)
|
||||
// 为什么要 src:opt<基础类型>(除 string 外)和 opt<无槽位模型> 的内层读器没有任何自有属性,
|
||||
// 旧版按「槽位非空」过滤会把它们全部丢掉,导致打点里只剩 opt<string>。
|
||||
var Inner = this.r7h_1;
|
||||
var BR = t && t.f7h_1;
|
||||
if (BR && typeof BR.xy === "function" && BR.y7g_1 !== undefined) {
|
||||
var B0 = BR.xy();
|
||||
try {
|
||||
var B0 = false;
|
||||
try {
|
||||
if (BR && typeof BR.xy === "function" && BR.y7g_1 !== undefined) {
|
||||
B0 = BR.xy();
|
||||
if (typeof window !== "undefined") {
|
||||
var T0 = (window.__HornetOptTrace__ = window.__HornetOptTrace__ || {
|
||||
rows: [], timer: 0, nextRid: 1,
|
||||
rows: [], timer: 0,
|
||||
push: function (Row) {
|
||||
if (this.rows.length >= 8000) return;
|
||||
if (this.rows.length >= 60000) return;
|
||||
this.rows.push(Row);
|
||||
if (!this.timer) {
|
||||
var Me = this;
|
||||
@@ -444,31 +445,30 @@
|
||||
}
|
||||
},
|
||||
});
|
||||
var Slots = [];
|
||||
var Keys = [];
|
||||
var Src = "";
|
||||
var ElemKeys = [];
|
||||
var ElemSrc = "";
|
||||
var Off = -1;
|
||||
try { Keys = Inner ? Object.keys(Inner) : []; } catch (E5) {}
|
||||
try { Src = Inner && Inner.t7h ? String(Inner.t7h).slice(0, 72) : ""; } catch (E6) {}
|
||||
try {
|
||||
Slots = Inner ? Object.keys(Inner) : [];
|
||||
ElemKeys = Inner && Inner.z7h_1 ? Object.keys(Inner.z7h_1) : [];
|
||||
} catch (E5) {}
|
||||
// 只记「能唯一定位」的:模型槽位 或 列表元素槽位;基础类型 opt 太碎且无指纹,跳过
|
||||
if (Slots.length > 0 || ElemKeys.length > 0) {
|
||||
if (!BR.__hornetRid) {
|
||||
BR.__hornetRid = T0.nextRid || 1;
|
||||
T0.nextRid = BR.__hornetRid + 1;
|
||||
var Elem = Inner && Inner.z7h_1;
|
||||
if (Elem) {
|
||||
ElemKeys = Object.keys(Elem);
|
||||
ElemSrc = Elem.t7h ? String(Elem.t7h).slice(0, 72) : "";
|
||||
}
|
||||
T0.push({
|
||||
rid: BR.__hornetRid,
|
||||
pos: BR.y7g_1 - 1,
|
||||
bit: B0,
|
||||
slots: Slots,
|
||||
elemKeys: ElemKeys,
|
||||
});
|
||||
}
|
||||
} catch (E7) {}
|
||||
try {
|
||||
var S = t.e7h_1;
|
||||
Off = S && typeof S.g2t === "function" ? S.g2t() : -1;
|
||||
} catch (E8) {}
|
||||
T0.push({ pos: BR.y7g_1 - 1, bit: !!B0, off: Off, keys: Keys, src: Src, elemKeys: ElemKeys, elemSrc: ElemSrc });
|
||||
}
|
||||
} catch (E4) {}
|
||||
return B0 ? null : Inner.t7h(t);
|
||||
}
|
||||
return t.f7h_1.xy() ? null : this.r7h_1.t7h(t);
|
||||
}
|
||||
} catch (E4) {}
|
||||
if (!BR || typeof BR.xy !== "function" || BR.y7g_1 === undefined) return t.f7h_1.xy() ? null : this.r7h_1.t7h(t);
|
||||
return B0 ? null : Inner.t7h(t);
|
||||
}),
|
||||
(z(Ht).u7h = function (t) {
|
||||
this.r7h_1.u7h(t);
|
||||
|
||||
@@ -485,12 +485,79 @@
|
||||
}),
|
||||
(x(lt).s7h = function (t, n) {}),
|
||||
(x(lt).t7h = function (t) {
|
||||
// [Hornet 调试] pt 项打点:记录每一项的 modelId 与「字节/位」区间。
|
||||
// b0/b1 = 本项负载起止字节游标(g2t);p0/p1 = 本项消费的绝对位区间(y7g_1)
|
||||
// own = id 对象(Kotlin Long)的自有属性,离线可还原 modelId
|
||||
// 目的:直接看客户端对「每一项」读了多少 opt 位,定位我们字段表少算的那几位。
|
||||
var H0 = -1;
|
||||
var HBit0 = -1;
|
||||
var HNm = -1;
|
||||
var HBuf = -1;
|
||||
try {
|
||||
H0 = t && t.e7h_1 && typeof t.e7h_1.g2t === "function" ? t.e7h_1.g2t() : -1;
|
||||
HBit0 = t && t.f7h_1 ? t.f7h_1.y7g_1 : -1;
|
||||
// nm = 当前位流总位数;buf = 位缓冲数组的身份 id(换流就换 id)——
|
||||
// 用来区分「同一条位流里的下一个记录」与「嵌套消息新开的一条位流」
|
||||
var HBr = t && t.f7h_1;
|
||||
if (HBr) {
|
||||
HNm = typeof HBr.w7g_1 === "number" ? HBr.w7g_1 : -1;
|
||||
if (HBr.x7g_1 && typeof window !== "undefined") {
|
||||
var Hw = (window.__HornetBitBufs__ = window.__HornetBitBufs__ || { map: new WeakMap(), next: 1 });
|
||||
HBuf = Hw.map.get(HBr.x7g_1);
|
||||
if (HBuf === undefined) {
|
||||
HBuf = Hw.next++;
|
||||
Hw.map.set(HBr.x7g_1, HBuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Eh) {}
|
||||
var n = ct(this).t7h(t),
|
||||
i = n instanceof w ? n : p();
|
||||
if (d(i, new w(0, 0))) return I(T(ct(this).t7h(t)), i);
|
||||
var r = at().a1x2().o7o(i),
|
||||
e = T(r.t7h(t));
|
||||
return I(e, i);
|
||||
var HRet;
|
||||
if (d(i, new w(0, 0))) HRet = I(T(ct(this).t7h(t)), i);
|
||||
else {
|
||||
var r = at().a1x2().o7o(i),
|
||||
e = T(r.t7h(t));
|
||||
HRet = I(e, i);
|
||||
}
|
||||
try {
|
||||
if (typeof window !== "undefined") {
|
||||
var T0 = (window.__HornetItemTrace__ = window.__HornetItemTrace__ || {
|
||||
rows: [], timer: 0,
|
||||
push: function (Row) {
|
||||
if (this.rows.length >= 40000) return;
|
||||
this.rows.push(Row);
|
||||
if (!this.timer) {
|
||||
var Me = this;
|
||||
this.timer = setTimeout(function () {
|
||||
Me.timer = 0;
|
||||
try {
|
||||
fetch("/__dump__/item_trace.json", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ at: new Date().toISOString(), count: Me.rows.length, trace: Me.rows }),
|
||||
});
|
||||
} catch (E2) {}
|
||||
}, 1500);
|
||||
}
|
||||
},
|
||||
});
|
||||
var Own = "";
|
||||
try {
|
||||
var Nk = Object.keys(i);
|
||||
for (var Ik = 0; Ik < Nk.length; Ik++) Own += Nk[Ik] + "=" + i[Nk[Ik]] + ";";
|
||||
} catch (Eh2) {}
|
||||
T0.push({
|
||||
own: Own,
|
||||
b0: H0,
|
||||
b1: t && t.e7h_1 && typeof t.e7h_1.g2t === "function" ? t.e7h_1.g2t() : -1,
|
||||
p0: HBit0,
|
||||
p1: t && t.f7h_1 ? t.f7h_1.y7g_1 : -1,
|
||||
nm: HNm,
|
||||
buf: HBuf,
|
||||
});
|
||||
}
|
||||
} catch (Eh3) {}
|
||||
return HRet;
|
||||
}),
|
||||
(x(vt).e1x2 = function () {
|
||||
var t = a;
|
||||
|
||||
@@ -23566,20 +23566,71 @@
|
||||
(this.gl5_1 = t.r7g(new ti(Dn(ei), !1))));
|
||||
}),
|
||||
(Bn(pq).t7h = function (t) {
|
||||
// [Hornet 调试] TankCC 逐字段打点:tag / 字节区间 / 位区间。
|
||||
// 目的:实测每个字段宽度,定位 tankState(opt<TankState>)在线上到底占几字节。
|
||||
var HB = function () { try { return t.e7h_1 && t.e7h_1.g2t ? t.e7h_1.g2t() : -1; } catch (EB) { return -1; } };
|
||||
var HP = function () { try { return t.f7h_1 ? t.f7h_1.y7g_1 : -1; } catch (EP) { return -1; } };
|
||||
var HF = function (Tag, B0, P0) {
|
||||
try {
|
||||
if (typeof window === "undefined") return;
|
||||
var T0 = (window.__HornetFieldTrace__ = window.__HornetFieldTrace__ || {
|
||||
rows: [], timer: 0,
|
||||
push: function (Row) {
|
||||
if (this.rows.length >= 60000) return;
|
||||
this.rows.push(Row);
|
||||
if (!this.timer) {
|
||||
var Me = this;
|
||||
this.timer = setTimeout(function () {
|
||||
Me.timer = 0;
|
||||
try {
|
||||
fetch("/__dump__/field_trace.json", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ at: new Date().toISOString(), count: Me.rows.length, trace: Me.rows }),
|
||||
});
|
||||
} catch (E2) {}
|
||||
}, 1500);
|
||||
}
|
||||
},
|
||||
});
|
||||
T0.push({ model: "TankCC", tag: Tag, b0: B0, b1: HB(), p0: P0, p1: HP() });
|
||||
} catch (E3) {}
|
||||
};
|
||||
var B0 = HB(), P0 = HP();
|
||||
var n = xW();
|
||||
n.hl5_1 = t.e7h_1.q2u();
|
||||
HF("i16", B0, P0);
|
||||
B0 = HB(); P0 = HP();
|
||||
var i = n,
|
||||
r = cq(this).t7h(t);
|
||||
i.il5_1 = null != r && "boolean" == typeof r ? r : Un();
|
||||
HF("local", B0, P0);
|
||||
B0 = HB(); P0 = HP();
|
||||
var e = n,
|
||||
u = lq(this).t7h(t);
|
||||
((e.jl5_1 = u instanceof CW ? u : Un()), (n.kl5_1 = t.e7h_1.r2u()), (n.ll5_1 = t.e7h_1.r2u()));
|
||||
HF("logicState+i32a+i32b", B0, P0);
|
||||
B0 = HB(); P0 = HP();
|
||||
var s = n,
|
||||
o = fq(this).t7h(t);
|
||||
s.ml5_1 = null == o || o instanceof GV ? o : Un();
|
||||
// 顺带把 tankState 的**内层读器身份**打出来:构造名 / 自有槽位 / t7h 源码头部。
|
||||
// 目的:确认 KClass(GV) 在运行期到底解析成哪个 codec(jq 的钩子一条都没触发)。
|
||||
var HInnerInfo = "?";
|
||||
try {
|
||||
var HW = fq(this);
|
||||
var HI = HW && HW.r7h_1;
|
||||
if (HI) {
|
||||
var HK = "";
|
||||
try { HK = Object.keys(HI).join(","); } catch (EK) {}
|
||||
HInnerInfo = (HI.constructor && HI.constructor.name ? HI.constructor.name : "?") +
|
||||
"|keys=" + HK + "|src=" + (HI.t7h ? String(HI.t7h).replace(/\s+/g, " ").slice(0, 110) : "");
|
||||
}
|
||||
} catch (EI) {}
|
||||
HF("tankState|" + HInnerInfo, B0, P0);
|
||||
B0 = HB(); P0 = HP();
|
||||
var _ = n,
|
||||
h = vq(this).t7h(t);
|
||||
return ((_.nl5_1 = h instanceof ei ? h : Un()), n);
|
||||
return (HF("team", B0, P0), (_.nl5_1 = h instanceof ei ? h : Un()), n);
|
||||
}),
|
||||
(Bn(pq).s7h = function (t, n) {
|
||||
if (null == n) throw Gn("Object is null. Use @ProtocolOptional annotation.");
|
||||
@@ -23770,19 +23821,55 @@
|
||||
(this.zl5_1 = t.r7g(new Ln(Dn(ui), !1))));
|
||||
}),
|
||||
(Bn(jq).t7h = function (t) {
|
||||
// [Hornet 调试] TankState 逐字段打点:字段名 / 字节区间 / 位区间。
|
||||
// 目的:`ui` 的静态身份是 85196 枚举成员访问器,宽度不明;这里直接量出 4 个字段各占几字节。
|
||||
var HB = function () { try { return t.e7h_1 && t.e7h_1.g2t ? t.e7h_1.g2t() : -1; } catch (EB) { return -1; } };
|
||||
var HP = function () { try { return t.f7h_1 ? t.f7h_1.y7g_1 : -1; } catch (EP) { return -1; } };
|
||||
var HF = function (Tag, B0, P0) {
|
||||
try {
|
||||
if (typeof window === "undefined") return;
|
||||
var T0 = (window.__HornetFieldTrace__ = window.__HornetFieldTrace__ || {
|
||||
rows: [], timer: 0,
|
||||
push: function (Row) {
|
||||
if (this.rows.length >= 60000) return;
|
||||
this.rows.push(Row);
|
||||
if (!this.timer) {
|
||||
var Me = this;
|
||||
this.timer = setTimeout(function () {
|
||||
Me.timer = 0;
|
||||
try {
|
||||
fetch("/__dump__/field_trace.json", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ at: new Date().toISOString(), count: Me.rows.length, trace: Me.rows }),
|
||||
});
|
||||
} catch (E2) {}
|
||||
}, 1500);
|
||||
}
|
||||
},
|
||||
});
|
||||
T0.push({ model: "TankState", tag: Tag, b0: B0, b1: HB(), p0: P0, p1: HP() });
|
||||
} catch (E3) {}
|
||||
};
|
||||
var B0 = HB(), P0 = HP();
|
||||
var n = FV(),
|
||||
i = n,
|
||||
r = qq(this).t7h(t);
|
||||
i.al6_1 = r instanceof ui ? r : Un();
|
||||
HF("angularVelocity", B0, P0);
|
||||
B0 = HB(); P0 = HP();
|
||||
var e = n,
|
||||
u = yq(this).t7h(t);
|
||||
e.bl6_1 = u instanceof ui ? u : Un();
|
||||
HF("linearVelocity", B0, P0);
|
||||
B0 = HB(); P0 = HP();
|
||||
var s = n,
|
||||
o = $q(this).t7h(t);
|
||||
s.cl6_1 = o instanceof ui ? o : Un();
|
||||
HF("orientation", B0, P0);
|
||||
B0 = HB(); P0 = HP();
|
||||
var _ = n,
|
||||
h = xq(this).t7h(t);
|
||||
return ((_.dl6_1 = h instanceof ui ? h : Un()), n);
|
||||
return (HF("position", B0, P0), (_.dl6_1 = h instanceof ui ? h : Un()), n);
|
||||
}),
|
||||
(Bn(jq).s7h = function (t, n) {
|
||||
if (null == n) throw Gn("Object is null. Use @ProtocolOptional annotation.");
|
||||
|
||||
Reference in new issue
Block a user