feat(ignore): 同时接管形状相交查询 x9o(真形状检测)
栅栏判定同时作用于接触配对 q9q 与形状相交查询 x9o:命中时返回 false(不相交),覆盖扫掠/查询路径;新增 skippedOverlap/overlapPatched 统计;schema 补 CollisionWorld.Overlap。
This commit is contained in:
1 parent
0ca28ff9b2
commit
0e8af39bfe
4 files changed
+114
-6
No files matched your search
+37
-2
@@ -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
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
|
||||
// ---- 碰撞世界(module_55088 的 ki)----
|
||||
'CollisionWorld.ShouldCollide': 'q9q()', // 唯一配对过滤:mask + 形状类型 → 生成接触
|
||||
'CollisionWorld.Overlap': 'x9o()', // 形状相交查询(真形状检测,不是包围盒)
|
||||
|
||||
// ---- 实体事件总线 / 外力事件(ODt)----
|
||||
'Entity.Dispatch': 'kz7()', // 向实体内所有订阅者派发事件
|
||||
|
||||
Reference in new issue
Block a user