From 0e8af39bfed6bcc472a3882ce02a65567a7ee42e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 21 Oct 2026 00:42:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(ignore):=20=E5=90=8C=E6=97=B6=E6=8E=A5?= =?UTF-8?q?=E7=AE=A1=E5=BD=A2=E7=8A=B6=E7=9B=B8=E4=BA=A4=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=20x9o=EF=BC=88=E7=9C=9F=E5=BD=A2=E7=8A=B6=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 栅栏判定同时作用于接触配对 q9q 与形状相交查询 x9o:命中时返回 false(不相交),覆盖扫掠/查询路径;新增 skippedOverlap/overlapPatched 统计;schema 补 CollisionWorld.Overlap。 --- .../play/static/js/unpacked/hornet_bundle.js | 40 ++++++++++++++++++- 3dtank_bundle.js | 40 ++++++++++++++++++- tools/hornet_noclip.js | 39 +++++++++++++++++- tools/hornet_schema.js | 1 + 4 files changed, 114 insertions(+), 6 deletions(-) diff --git a/3dtank.com/play/static/js/unpacked/hornet_bundle.js b/3dtank.com/play/static/js/unpacked/hornet_bundle.js index 91fe5dd..ce8f284 100644 --- a/3dtank.com/play/static/js/unpacked/hornet_bundle.js +++ b/3dtank.com/play/static/js/unpacked/hornet_bundle.js @@ -309,6 +309,7 @@ // ---- 碰撞世界(module_55088 的 ki)---- 'CollisionWorld.ShouldCollide': 'q9q()', // 唯一配对过滤:mask + 形状类型 → 生成接触 + 'CollisionWorld.Overlap': 'x9o()', // 形状相交查询(真形状检测,不是包围盒) // ---- 实体事件总线 / 外力事件(ODt)---- 'Entity.Dispatch': 'kz7()', // 向实体内所有订阅者派发事件 @@ -6574,6 +6575,7 @@ var FV2 = Fld('Shape.Vertex2', 'w9x_1'); // 三角形顶点 2 var MRemoveMask = Mth('Physics.RemoveMask', 'm155'); // 坦克物理组件识别方法 var MCollide = Mth('CollisionWorld.ShouldCollide', 'q9q'); + var MOverlap = Mth('CollisionWorld.Overlap', 'x9o'); // 形状相交查询(真形状,不是包围盒) var WorldKeys = ExportKeys('Export.PhysicsWorld', ['h']); var PHYSICS_MODULE = 55088; @@ -6587,8 +6589,10 @@ ignoreFence: false, skippedTank: 0, skippedFence: 0, + skippedOverlap: 0, // x9o 形状相交查询被拦下的次数 byType: {}, // cat/type → 被忽略次数(诊断) - patched: false + patched: false, + overlapPatched: false }; var WorldProto = null; @@ -6710,6 +6714,17 @@ return Nz !== null && Math.abs(Nz) < 0.6; } + // 本车形状 / 本车与栅栏形状的配对(q9q 与 x9o 共用同一套判定) + function IsLocalTankShape(Shape) { + var Local = GetLocalPhysics(); + return !!(Local && IsTankShape(Shape) && OwnerOf(Shape) === Local); + } + + function IsFencePair(ShapeA, ShapeB) { + return (IsLocalTankShape(ShapeA) && IsFenceLike(ShapeB)) || + (IsLocalTankShape(ShapeB) && IsFenceLike(ShapeA)); + } + // ===== 诊断:识别「正在和什么物体重叠」===== // 碰撞形状本身没有名字(地图三角形是合并的三角汤),所以用两级信息: // ① 形状自身:category / mask / type / 法线 @@ -6882,6 +6897,26 @@ }; Stat.patched = true; console.log('[忽略] 已接管碰撞配对过滤(坦克按阵营 / 陡峭静态三角形)'); + + // 同时接管「形状相交查询」x9o:真形状检测(不是包围盒),用于扫掠/穿墙判定 + if (typeof Proto[MOverlap] === 'function') { + var OrigOverlap = Proto[MOverlap]; + Proto[MOverlap] = function (ShapeA, ShapeB) { + if (Stat.running && Stat.ignoreFence) { + try { + if (IsFencePair(ShapeA, ShapeB)) { + Stat.skippedOverlap++; + return false; // 查询结果:不相交 + } + } catch (e) {} + } + return OrigOverlap.apply(this, arguments); + }; + Stat.overlapPatched = true; + console.log('[忽略] 已接管形状相交查询 ' + MOverlap + '(真形状检测)'); + } else { + console.warn('[忽略] 未找到形状相交查询 ' + MOverlap + ',扫掠路径未接管'); + } return true; } @@ -6965,7 +7000,8 @@ return { running: Stat.running, mode: Stat.mode, ignoreFence: Stat.ignoreFence, skippedTank: Stat.skippedTank, skippedFence: Stat.skippedFence, - byType: Stat.byType, patched: Stat.patched + skippedOverlap: Stat.skippedOverlap, + byType: Stat.byType, patched: Stat.patched, overlapPatched: Stat.overlapPatched }; } }; diff --git a/3dtank_bundle.js b/3dtank_bundle.js index 91fe5dd..ce8f284 100644 --- a/3dtank_bundle.js +++ b/3dtank_bundle.js @@ -309,6 +309,7 @@ // ---- 碰撞世界(module_55088 的 ki)---- 'CollisionWorld.ShouldCollide': 'q9q()', // 唯一配对过滤:mask + 形状类型 → 生成接触 + 'CollisionWorld.Overlap': 'x9o()', // 形状相交查询(真形状检测,不是包围盒) // ---- 实体事件总线 / 外力事件(ODt)---- 'Entity.Dispatch': 'kz7()', // 向实体内所有订阅者派发事件 @@ -6574,6 +6575,7 @@ var FV2 = Fld('Shape.Vertex2', 'w9x_1'); // 三角形顶点 2 var MRemoveMask = Mth('Physics.RemoveMask', 'm155'); // 坦克物理组件识别方法 var MCollide = Mth('CollisionWorld.ShouldCollide', 'q9q'); + var MOverlap = Mth('CollisionWorld.Overlap', 'x9o'); // 形状相交查询(真形状,不是包围盒) var WorldKeys = ExportKeys('Export.PhysicsWorld', ['h']); var PHYSICS_MODULE = 55088; @@ -6587,8 +6589,10 @@ ignoreFence: false, skippedTank: 0, skippedFence: 0, + skippedOverlap: 0, // x9o 形状相交查询被拦下的次数 byType: {}, // cat/type → 被忽略次数(诊断) - patched: false + patched: false, + overlapPatched: false }; var WorldProto = null; @@ -6710,6 +6714,17 @@ return Nz !== null && Math.abs(Nz) < 0.6; } + // 本车形状 / 本车与栅栏形状的配对(q9q 与 x9o 共用同一套判定) + function IsLocalTankShape(Shape) { + var Local = GetLocalPhysics(); + return !!(Local && IsTankShape(Shape) && OwnerOf(Shape) === Local); + } + + function IsFencePair(ShapeA, ShapeB) { + return (IsLocalTankShape(ShapeA) && IsFenceLike(ShapeB)) || + (IsLocalTankShape(ShapeB) && IsFenceLike(ShapeA)); + } + // ===== 诊断:识别「正在和什么物体重叠」===== // 碰撞形状本身没有名字(地图三角形是合并的三角汤),所以用两级信息: // ① 形状自身:category / mask / type / 法线 @@ -6882,6 +6897,26 @@ }; Stat.patched = true; console.log('[忽略] 已接管碰撞配对过滤(坦克按阵营 / 陡峭静态三角形)'); + + // 同时接管「形状相交查询」x9o:真形状检测(不是包围盒),用于扫掠/穿墙判定 + if (typeof Proto[MOverlap] === 'function') { + var OrigOverlap = Proto[MOverlap]; + Proto[MOverlap] = function (ShapeA, ShapeB) { + if (Stat.running && Stat.ignoreFence) { + try { + if (IsFencePair(ShapeA, ShapeB)) { + Stat.skippedOverlap++; + return false; // 查询结果:不相交 + } + } catch (e) {} + } + return OrigOverlap.apply(this, arguments); + }; + Stat.overlapPatched = true; + console.log('[忽略] 已接管形状相交查询 ' + MOverlap + '(真形状检测)'); + } else { + console.warn('[忽略] 未找到形状相交查询 ' + MOverlap + ',扫掠路径未接管'); + } return true; } @@ -6965,7 +7000,8 @@ return { running: Stat.running, mode: Stat.mode, ignoreFence: Stat.ignoreFence, skippedTank: Stat.skippedTank, skippedFence: Stat.skippedFence, - byType: Stat.byType, patched: Stat.patched + skippedOverlap: Stat.skippedOverlap, + byType: Stat.byType, patched: Stat.patched, overlapPatched: Stat.overlapPatched }; } }; diff --git a/tools/hornet_noclip.js b/tools/hornet_noclip.js index c068bf1..6a0a428 100644 --- a/tools/hornet_noclip.js +++ b/tools/hornet_noclip.js @@ -50,6 +50,7 @@ var FV2 = Fld('Shape.Vertex2', 'w9x_1'); // 三角形顶点 2 var MRemoveMask = Mth('Physics.RemoveMask', 'm155'); // 坦克物理组件识别方法 var MCollide = Mth('CollisionWorld.ShouldCollide', 'q9q'); + var MOverlap = Mth('CollisionWorld.Overlap', 'x9o'); // 形状相交查询(真形状,不是包围盒) var WorldKeys = ExportKeys('Export.PhysicsWorld', ['h']); var PHYSICS_MODULE = 55088; @@ -63,8 +64,10 @@ ignoreFence: false, skippedTank: 0, skippedFence: 0, + skippedOverlap: 0, // x9o 形状相交查询被拦下的次数 byType: {}, // cat/type → 被忽略次数(诊断) - patched: false + patched: false, + overlapPatched: false }; var WorldProto = null; @@ -186,6 +189,17 @@ return Nz !== null && Math.abs(Nz) < 0.6; } + // 本车形状 / 本车与栅栏形状的配对(q9q 与 x9o 共用同一套判定) + function IsLocalTankShape(Shape) { + var Local = GetLocalPhysics(); + return !!(Local && IsTankShape(Shape) && OwnerOf(Shape) === Local); + } + + function IsFencePair(ShapeA, ShapeB) { + return (IsLocalTankShape(ShapeA) && IsFenceLike(ShapeB)) || + (IsLocalTankShape(ShapeB) && IsFenceLike(ShapeA)); + } + // ===== 诊断:识别「正在和什么物体重叠」===== // 碰撞形状本身没有名字(地图三角形是合并的三角汤),所以用两级信息: // ① 形状自身:category / mask / type / 法线 @@ -358,6 +372,26 @@ }; Stat.patched = true; console.log('[忽略] 已接管碰撞配对过滤(坦克按阵营 / 陡峭静态三角形)'); + + // 同时接管「形状相交查询」x9o:真形状检测(不是包围盒),用于扫掠/穿墙判定 + if (typeof Proto[MOverlap] === 'function') { + var OrigOverlap = Proto[MOverlap]; + Proto[MOverlap] = function (ShapeA, ShapeB) { + if (Stat.running && Stat.ignoreFence) { + try { + if (IsFencePair(ShapeA, ShapeB)) { + Stat.skippedOverlap++; + return false; // 查询结果:不相交 + } + } catch (e) {} + } + return OrigOverlap.apply(this, arguments); + }; + Stat.overlapPatched = true; + console.log('[忽略] 已接管形状相交查询 ' + MOverlap + '(真形状检测)'); + } else { + console.warn('[忽略] 未找到形状相交查询 ' + MOverlap + ',扫掠路径未接管'); + } return true; } @@ -441,7 +475,8 @@ return { running: Stat.running, mode: Stat.mode, ignoreFence: Stat.ignoreFence, skippedTank: Stat.skippedTank, skippedFence: Stat.skippedFence, - byType: Stat.byType, patched: Stat.patched + skippedOverlap: Stat.skippedOverlap, + byType: Stat.byType, patched: Stat.patched, overlapPatched: Stat.overlapPatched }; } }; diff --git a/tools/hornet_schema.js b/tools/hornet_schema.js index 2c44f3d..0dbd4d2 100644 --- a/tools/hornet_schema.js +++ b/tools/hornet_schema.js @@ -85,6 +85,7 @@ // ---- 碰撞世界(module_55088 的 ki)---- 'CollisionWorld.ShouldCollide': 'q9q()', // 唯一配对过滤:mask + 形状类型 → 生成接触 + 'CollisionWorld.Overlap': 'x9o()', // 形状相交查询(真形状检测,不是包围盒) // ---- 实体事件总线 / 外力事件(ODt)---- 'Entity.Dispatch': 'kz7()', // 向实体内所有订阅者派发事件