feat(ignore): 同时接管形状相交查询 x9o(真形状检测)

栅栏判定同时作用于接触配对 q9q 与形状相交查询 x9o:命中时返回 false(不相交),覆盖扫掠/查询路径;新增 skippedOverlap/overlapPatched 统计;schema 补 CollisionWorld.Overlap。
This commit is contained in:
TermiNexus committed 2026-10-21 00:42:28 +08:00
1 parent 0ca28ff9b2
commit 0e8af39bfe
4 files changed
+114 -6

No files matched your search

+37 -2
View File
@@ -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
};
}
};
+1
View File
@@ -85,6 +85,7 @@
// ---- 碰撞世界(module_55088 的 ki)----
'CollisionWorld.ShouldCollide': 'q9q()', // 唯一配对过滤:mask + 形状类型 → 生成接触
'CollisionWorld.Overlap': 'x9o()', // 形状相交查询(真形状检测,不是包围盒)
// ---- 实体事件总线 / 外力事件(ODt)----
'Entity.Dispatch': 'kz7()', // 向实体内所有订阅者派发事件