fix(team): 队伍同步延迟时沿用上次判定,消除敌我颜色跳变

This commit is contained in:
TermiNexus committed 2026-10-20 13:01:01 +08:00
1 parent aa086d915b
commit cf3ae6f428
3 files changed
+72 -39

No files matched your search

@@ -476,27 +476,38 @@
}
// ===== 判断是否友方 =====
// 优先用缓存的本地队伍;没有缓存时才退回 playerTank 的队伍
// 队伍同步有延迟:坦克刚出现时队伍是「中立」,直接比较会先判成敌人、同步后再变队友(颜色跳变)。
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
function ResolveTankTeam(tank) {
if (!ZCt) return null;
var Team = null;
try { Team = ZCt(tank); } catch (e) { Team = null; }
if (Team && (!m2Fn || m2Fn(Team, Team))) { // 同队且非中立 = 有效队伍
TankTeamCache.set(tank, Team);
return Team;
}
return TankTeamCache.get(tank) || null;
}
function IsFriendly(tank, playerTank, gm) {
if (!tank) return false;
if (gm) RememberLocalTeam(gm);
if (ZCt && m2Fn) {
try {
var tankTeam = ZCt(tank);
var tankTeam = ResolveTankTeam(tank);
var BaseTeam = LocalTeam;
if (!BaseTeam && playerTank) BaseTeam = ZCt(playerTank);
if (tankTeam && BaseTeam) return m2Fn(tankTeam, BaseTeam);
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
if (tankTeam && BaseTeam) {
var Friendly = m2Fn(tankTeam, BaseTeam);
TankFriendCache.set(tank, Friendly);
return Friendly;
}
} catch(e) {}
}
try {
if (gm && gm.v10b_1 && ZCt) {
var team = ZCt(tank);
if (team && gm.v10b_1) {
return team.equals(gm.v10b_1) && m2Fn ? m2Fn(team, gm.v10b_1) : team.equals(gm.v10b_1);
}
}
} catch(e) {}
return false;
var Prev = TankFriendCache.get(tank);
return Prev === undefined ? false : Prev;
}
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
+24 -13
View File
@@ -476,27 +476,38 @@
}
// ===== 判断是否友方 =====
// 优先用缓存的本地队伍;没有缓存时才退回 playerTank 的队伍
// 队伍同步有延迟:坦克刚出现时队伍是「中立」,直接比较会先判成敌人、同步后再变队友(颜色跳变)。
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
function ResolveTankTeam(tank) {
if (!ZCt) return null;
var Team = null;
try { Team = ZCt(tank); } catch (e) { Team = null; }
if (Team && (!m2Fn || m2Fn(Team, Team))) { // 同队且非中立 = 有效队伍
TankTeamCache.set(tank, Team);
return Team;
}
return TankTeamCache.get(tank) || null;
}
function IsFriendly(tank, playerTank, gm) {
if (!tank) return false;
if (gm) RememberLocalTeam(gm);
if (ZCt && m2Fn) {
try {
var tankTeam = ZCt(tank);
var tankTeam = ResolveTankTeam(tank);
var BaseTeam = LocalTeam;
if (!BaseTeam && playerTank) BaseTeam = ZCt(playerTank);
if (tankTeam && BaseTeam) return m2Fn(tankTeam, BaseTeam);
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
if (tankTeam && BaseTeam) {
var Friendly = m2Fn(tankTeam, BaseTeam);
TankFriendCache.set(tank, Friendly);
return Friendly;
}
} catch(e) {}
}
try {
if (gm && gm.v10b_1 && ZCt) {
var team = ZCt(tank);
if (team && gm.v10b_1) {
return team.equals(gm.v10b_1) && m2Fn ? m2Fn(team, gm.v10b_1) : team.equals(gm.v10b_1);
}
}
} catch(e) {}
return false;
var Prev = TankFriendCache.get(tank);
return Prev === undefined ? false : Prev;
}
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
+24 -13
View File
@@ -261,27 +261,38 @@
}
// ===== 判断是否友方 =====
// 优先用缓存的本地队伍;没有缓存时才退回 playerTank 的队伍
// 队伍同步有延迟:坦克刚出现时队伍是「中立」,直接比较会先判成敌人、同步后再变队友(颜色跳变)。
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
function ResolveTankTeam(tank) {
if (!ZCt) return null;
var Team = null;
try { Team = ZCt(tank); } catch (e) { Team = null; }
if (Team && (!m2Fn || m2Fn(Team, Team))) { // 同队且非中立 = 有效队伍
TankTeamCache.set(tank, Team);
return Team;
}
return TankTeamCache.get(tank) || null;
}
function IsFriendly(tank, playerTank, gm) {
if (!tank) return false;
if (gm) RememberLocalTeam(gm);
if (ZCt && m2Fn) {
try {
var tankTeam = ZCt(tank);
var tankTeam = ResolveTankTeam(tank);
var BaseTeam = LocalTeam;
if (!BaseTeam && playerTank) BaseTeam = ZCt(playerTank);
if (tankTeam && BaseTeam) return m2Fn(tankTeam, BaseTeam);
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
if (tankTeam && BaseTeam) {
var Friendly = m2Fn(tankTeam, BaseTeam);
TankFriendCache.set(tank, Friendly);
return Friendly;
}
} catch(e) {}
}
try {
if (gm && gm.v10b_1 && ZCt) {
var team = ZCt(tank);
if (team && gm.v10b_1) {
return team.equals(gm.v10b_1) && m2Fn ? m2Fn(team, gm.v10b_1) : team.equals(gm.v10b_1);
}
}
} catch(e) {}
return false;
var Prev = TankFriendCache.get(tank);
return Prev === undefined ? false : Prev;
}
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====