fix(team): 队伍函数按需补加载,开局即用可靠基准锁定敌我

This commit is contained in:
TermiNexus committed 2026-10-20 14:28:00 +08:00
1 parent f07f182fd8
commit ce1ffbeb60
3 files changed
+60 -21

No files matched your search

@@ -472,16 +472,25 @@
var LocalTeam = null;
var LocalTeamTankId = null;
function RememberLocalTeam(gm) {
if (!ZCt || !m2Fn) LoadTeamFunctions();
if (!ZCt) return;
var t = null;
try { t = gm.u10b_1; } catch (e) { t = null; }
if (!t) return; // 死亡/观战:保持已有缓存
if (t) {
var Id = t.iz1_1;
if (LocalTeam && LocalTeamTankId === Id) return;
try {
var Team = ZCt(t);
if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; }
} catch (e) {}
return;
}
// u10b_1 为空(死亡/观战):保持已有缓存;若还没缓存过,再试 GameMode 上的本地队伍字段
if (LocalTeam) return;
try {
var G = gm.v10b_1;
if (G && (!m2Fn || m2Fn(G, G))) LocalTeam = G;
} catch (e) {}
}
// ===== 判断是否友方 =====
@@ -503,20 +512,24 @@
function IsFriendly(tank, playerTank, gm) {
if (!tank) return false;
// 队伍函数可能因为工具早于游戏模块加载而没取到,这里按需补加载
if (!ZCt || !m2Fn) LoadTeamFunctions();
if (gm) RememberLocalTeam(gm);
// 一旦在「本地队伍可靠」时判过,就锁定本局结果,避免任何同步抖动导致颜色翻转
// 一旦在「基准队伍可靠」时判过,就锁定本局结果,战中不再改变
var Locked = TankFriendCache.get(tank);
if (Locked !== undefined) return Locked;
if (ZCt && m2Fn) {
try {
var tankTeam = ResolveTankTeam(tank);
var BaseTeam = LocalTeam;
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
// 可靠基准(用于锁定):本地拥有坦克的队伍 / GameMode 上的本地队伍字段
var LockBase = LocalTeam;
if (!LockBase && gm) { try { LockBase = gm.v10b_1; } catch (e) {} }
// 观战目标只作临时参考,绝不用它锁定(它可能是敌人)
var BaseTeam = LockBase || (playerTank ? ResolveTankTeam(playerTank) : null);
if (tankTeam && BaseTeam) {
var Friendly = m2Fn(tankTeam, BaseTeam);
if (LocalTeam) {
if (LockBase) {
TankFriendCache.set(tank, Friendly);
// 诊断:首次锁定为友方时记一条,便于核对有没有把敌人锁成队友
if (Friendly && !TeamLockLogged.has(tank)) {
TeamLockLogged.add(tank);
try {
@@ -528,7 +541,7 @@
}
} catch(e) {}
}
// 还没有可靠基准:先按敌人显示,但**不锁定**
// 基准还没就绪:先按敌人显示,但**不锁定**,等基准可用后再定
return false;
}
+20 -7
View File
@@ -472,16 +472,25 @@
var LocalTeam = null;
var LocalTeamTankId = null;
function RememberLocalTeam(gm) {
if (!ZCt || !m2Fn) LoadTeamFunctions();
if (!ZCt) return;
var t = null;
try { t = gm.u10b_1; } catch (e) { t = null; }
if (!t) return; // 死亡/观战:保持已有缓存
if (t) {
var Id = t.iz1_1;
if (LocalTeam && LocalTeamTankId === Id) return;
try {
var Team = ZCt(t);
if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; }
} catch (e) {}
return;
}
// u10b_1 为空(死亡/观战):保持已有缓存;若还没缓存过,再试 GameMode 上的本地队伍字段
if (LocalTeam) return;
try {
var G = gm.v10b_1;
if (G && (!m2Fn || m2Fn(G, G))) LocalTeam = G;
} catch (e) {}
}
// ===== 判断是否友方 =====
@@ -503,20 +512,24 @@
function IsFriendly(tank, playerTank, gm) {
if (!tank) return false;
// 队伍函数可能因为工具早于游戏模块加载而没取到,这里按需补加载
if (!ZCt || !m2Fn) LoadTeamFunctions();
if (gm) RememberLocalTeam(gm);
// 一旦在「本地队伍可靠」时判过,就锁定本局结果,避免任何同步抖动导致颜色翻转
// 一旦在「基准队伍可靠」时判过,就锁定本局结果,战中不再改变
var Locked = TankFriendCache.get(tank);
if (Locked !== undefined) return Locked;
if (ZCt && m2Fn) {
try {
var tankTeam = ResolveTankTeam(tank);
var BaseTeam = LocalTeam;
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
// 可靠基准(用于锁定):本地拥有坦克的队伍 / GameMode 上的本地队伍字段
var LockBase = LocalTeam;
if (!LockBase && gm) { try { LockBase = gm.v10b_1; } catch (e) {} }
// 观战目标只作临时参考,绝不用它锁定(它可能是敌人)
var BaseTeam = LockBase || (playerTank ? ResolveTankTeam(playerTank) : null);
if (tankTeam && BaseTeam) {
var Friendly = m2Fn(tankTeam, BaseTeam);
if (LocalTeam) {
if (LockBase) {
TankFriendCache.set(tank, Friendly);
// 诊断:首次锁定为友方时记一条,便于核对有没有把敌人锁成队友
if (Friendly && !TeamLockLogged.has(tank)) {
TeamLockLogged.add(tank);
try {
@@ -528,7 +541,7 @@
}
} catch(e) {}
}
// 还没有可靠基准:先按敌人显示,但**不锁定**
// 基准还没就绪:先按敌人显示,但**不锁定**,等基准可用后再定
return false;
}
+20 -7
View File
@@ -257,16 +257,25 @@
var LocalTeam = null;
var LocalTeamTankId = null;
function RememberLocalTeam(gm) {
if (!ZCt || !m2Fn) LoadTeamFunctions();
if (!ZCt) return;
var t = null;
try { t = gm.u10b_1; } catch (e) { t = null; }
if (!t) return; // 死亡/观战:保持已有缓存
if (t) {
var Id = t.iz1_1;
if (LocalTeam && LocalTeamTankId === Id) return;
try {
var Team = ZCt(t);
if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; }
} catch (e) {}
return;
}
// u10b_1 为空(死亡/观战):保持已有缓存;若还没缓存过,再试 GameMode 上的本地队伍字段
if (LocalTeam) return;
try {
var G = gm.v10b_1;
if (G && (!m2Fn || m2Fn(G, G))) LocalTeam = G;
} catch (e) {}
}
// ===== 判断是否友方 =====
@@ -288,20 +297,24 @@
function IsFriendly(tank, playerTank, gm) {
if (!tank) return false;
// 队伍函数可能因为工具早于游戏模块加载而没取到,这里按需补加载
if (!ZCt || !m2Fn) LoadTeamFunctions();
if (gm) RememberLocalTeam(gm);
// 一旦在「本地队伍可靠」时判过,就锁定本局结果,避免任何同步抖动导致颜色翻转
// 一旦在「基准队伍可靠」时判过,就锁定本局结果,战中不再改变
var Locked = TankFriendCache.get(tank);
if (Locked !== undefined) return Locked;
if (ZCt && m2Fn) {
try {
var tankTeam = ResolveTankTeam(tank);
var BaseTeam = LocalTeam;
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
// 可靠基准(用于锁定):本地拥有坦克的队伍 / GameMode 上的本地队伍字段
var LockBase = LocalTeam;
if (!LockBase && gm) { try { LockBase = gm.v10b_1; } catch (e) {} }
// 观战目标只作临时参考,绝不用它锁定(它可能是敌人)
var BaseTeam = LockBase || (playerTank ? ResolveTankTeam(playerTank) : null);
if (tankTeam && BaseTeam) {
var Friendly = m2Fn(tankTeam, BaseTeam);
if (LocalTeam) {
if (LockBase) {
TankFriendCache.set(tank, Friendly);
// 诊断:首次锁定为友方时记一条,便于核对有没有把敌人锁成队友
if (Friendly && !TeamLockLogged.has(tank)) {
TeamLockLogged.add(tank);
try {
@@ -313,7 +326,7 @@
}
} catch(e) {}
}
// 还没有可靠基准:先按敌人显示,但**不锁定**
// 基准还没就绪:先按敌人显示,但**不锁定**,等基准可用后再定
return false;
}