fix(team): 队伍同步延迟时沿用上次判定,消除敌我颜色跳变
This commit is contained in:
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
@@ -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
@@ -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) =====
|
||||
|
||||
Reference in new issue
Block a user