fix(team): 本地队伍缓存不再随 gm 重建清空,并锁定单局敌我结果
This commit is contained in:
1 parent
781ba862b7
commit
f07f182fd8
3 files changed
+78
-33
No files matched your search
@@ -466,19 +466,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 本地队伍缓存:死亡后 u10b_1 会被清空(onTankUnpossessed),不能再用"当前观察目标"推断。
|
// 本地队伍缓存:死亡后 u10b_1 会被清空(onTankUnpossessed),不能再用"当前观察目标"推断。
|
||||||
// 这里记住最后一次有效的本地队伍,整局沿用。
|
// ⚠ 这里**不跟随 gm 变化重置**:hook 重新捕获 GameMode 时 gm 会换实例,
|
||||||
|
// 若此时重置,死亡/观战状态下就会拿观战目标当基准 → 敌我整体翻转。
|
||||||
|
// 只在「本地坦克实体变了」(换局/换车)时才重新缓存。
|
||||||
var LocalTeam = null;
|
var LocalTeam = null;
|
||||||
var LocalTeamGm = null;
|
var LocalTeamTankId = null;
|
||||||
function RememberLocalTeam(gm) {
|
function RememberLocalTeam(gm) {
|
||||||
if (!ZCt) return;
|
if (!ZCt) return;
|
||||||
if (gm !== LocalTeamGm) { LocalTeamGm = gm; LocalTeam = null; }
|
var t = null;
|
||||||
if (LocalTeam) return;
|
try { t = gm.u10b_1; } catch (e) { t = null; }
|
||||||
|
if (!t) return; // 死亡/观战:保持已有缓存
|
||||||
|
var Id = t.iz1_1;
|
||||||
|
if (LocalTeam && LocalTeamTankId === Id) return;
|
||||||
try {
|
try {
|
||||||
var t = gm.u10b_1;
|
|
||||||
if (!t) return;
|
|
||||||
var Team = ZCt(t);
|
var Team = ZCt(t);
|
||||||
// 只缓存"非中立"队伍(m2Fn(Team,Team) 为 true 表示同队且非中立)
|
if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; }
|
||||||
if (Team && (!m2Fn || m2Fn(Team, Team))) LocalTeam = Team;
|
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,6 +489,7 @@
|
|||||||
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
|
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
|
||||||
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
|
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
|
||||||
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
|
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
|
||||||
|
var TeamLockLogged = new WeakSet();
|
||||||
function ResolveTankTeam(tank) {
|
function ResolveTankTeam(tank) {
|
||||||
if (!ZCt) return null;
|
if (!ZCt) return null;
|
||||||
var Team = null;
|
var Team = null;
|
||||||
@@ -501,6 +504,9 @@
|
|||||||
function IsFriendly(tank, playerTank, gm) {
|
function IsFriendly(tank, playerTank, gm) {
|
||||||
if (!tank) return false;
|
if (!tank) return false;
|
||||||
if (gm) RememberLocalTeam(gm);
|
if (gm) RememberLocalTeam(gm);
|
||||||
|
// 一旦在「本地队伍可靠」时判过,就锁定本局结果,避免任何同步抖动导致颜色翻转
|
||||||
|
var Locked = TankFriendCache.get(tank);
|
||||||
|
if (Locked !== undefined) return Locked;
|
||||||
if (ZCt && m2Fn) {
|
if (ZCt && m2Fn) {
|
||||||
try {
|
try {
|
||||||
var tankTeam = ResolveTankTeam(tank);
|
var tankTeam = ResolveTankTeam(tank);
|
||||||
@@ -508,13 +514,22 @@
|
|||||||
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
|
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
|
||||||
if (tankTeam && BaseTeam) {
|
if (tankTeam && BaseTeam) {
|
||||||
var Friendly = m2Fn(tankTeam, BaseTeam);
|
var Friendly = m2Fn(tankTeam, BaseTeam);
|
||||||
TankFriendCache.set(tank, Friendly);
|
if (LocalTeam) {
|
||||||
|
TankFriendCache.set(tank, Friendly);
|
||||||
|
// 诊断:首次锁定为友方时记一条,便于核对有没有把敌人锁成队友
|
||||||
|
if (Friendly && !TeamLockLogged.has(tank)) {
|
||||||
|
TeamLockLogged.add(tank);
|
||||||
|
try {
|
||||||
|
console.log('[敌我] 锁定为友方 id=' + tank.iz1_1 + ' name=' + (GetTankName(tank) || '?'));
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
return Friendly;
|
return Friendly;
|
||||||
}
|
}
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
var Prev = TankFriendCache.get(tank);
|
// 还没有可靠基准:先按敌人显示,但**不锁定**
|
||||||
return Prev === undefined ? false : Prev;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
|
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
|
||||||
|
|||||||
+26
-11
@@ -466,19 +466,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 本地队伍缓存:死亡后 u10b_1 会被清空(onTankUnpossessed),不能再用"当前观察目标"推断。
|
// 本地队伍缓存:死亡后 u10b_1 会被清空(onTankUnpossessed),不能再用"当前观察目标"推断。
|
||||||
// 这里记住最后一次有效的本地队伍,整局沿用。
|
// ⚠ 这里**不跟随 gm 变化重置**:hook 重新捕获 GameMode 时 gm 会换实例,
|
||||||
|
// 若此时重置,死亡/观战状态下就会拿观战目标当基准 → 敌我整体翻转。
|
||||||
|
// 只在「本地坦克实体变了」(换局/换车)时才重新缓存。
|
||||||
var LocalTeam = null;
|
var LocalTeam = null;
|
||||||
var LocalTeamGm = null;
|
var LocalTeamTankId = null;
|
||||||
function RememberLocalTeam(gm) {
|
function RememberLocalTeam(gm) {
|
||||||
if (!ZCt) return;
|
if (!ZCt) return;
|
||||||
if (gm !== LocalTeamGm) { LocalTeamGm = gm; LocalTeam = null; }
|
var t = null;
|
||||||
if (LocalTeam) return;
|
try { t = gm.u10b_1; } catch (e) { t = null; }
|
||||||
|
if (!t) return; // 死亡/观战:保持已有缓存
|
||||||
|
var Id = t.iz1_1;
|
||||||
|
if (LocalTeam && LocalTeamTankId === Id) return;
|
||||||
try {
|
try {
|
||||||
var t = gm.u10b_1;
|
|
||||||
if (!t) return;
|
|
||||||
var Team = ZCt(t);
|
var Team = ZCt(t);
|
||||||
// 只缓存"非中立"队伍(m2Fn(Team,Team) 为 true 表示同队且非中立)
|
if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; }
|
||||||
if (Team && (!m2Fn || m2Fn(Team, Team))) LocalTeam = Team;
|
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,6 +489,7 @@
|
|||||||
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
|
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
|
||||||
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
|
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
|
||||||
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
|
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
|
||||||
|
var TeamLockLogged = new WeakSet();
|
||||||
function ResolveTankTeam(tank) {
|
function ResolveTankTeam(tank) {
|
||||||
if (!ZCt) return null;
|
if (!ZCt) return null;
|
||||||
var Team = null;
|
var Team = null;
|
||||||
@@ -501,6 +504,9 @@
|
|||||||
function IsFriendly(tank, playerTank, gm) {
|
function IsFriendly(tank, playerTank, gm) {
|
||||||
if (!tank) return false;
|
if (!tank) return false;
|
||||||
if (gm) RememberLocalTeam(gm);
|
if (gm) RememberLocalTeam(gm);
|
||||||
|
// 一旦在「本地队伍可靠」时判过,就锁定本局结果,避免任何同步抖动导致颜色翻转
|
||||||
|
var Locked = TankFriendCache.get(tank);
|
||||||
|
if (Locked !== undefined) return Locked;
|
||||||
if (ZCt && m2Fn) {
|
if (ZCt && m2Fn) {
|
||||||
try {
|
try {
|
||||||
var tankTeam = ResolveTankTeam(tank);
|
var tankTeam = ResolveTankTeam(tank);
|
||||||
@@ -508,13 +514,22 @@
|
|||||||
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
|
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
|
||||||
if (tankTeam && BaseTeam) {
|
if (tankTeam && BaseTeam) {
|
||||||
var Friendly = m2Fn(tankTeam, BaseTeam);
|
var Friendly = m2Fn(tankTeam, BaseTeam);
|
||||||
TankFriendCache.set(tank, Friendly);
|
if (LocalTeam) {
|
||||||
|
TankFriendCache.set(tank, Friendly);
|
||||||
|
// 诊断:首次锁定为友方时记一条,便于核对有没有把敌人锁成队友
|
||||||
|
if (Friendly && !TeamLockLogged.has(tank)) {
|
||||||
|
TeamLockLogged.add(tank);
|
||||||
|
try {
|
||||||
|
console.log('[敌我] 锁定为友方 id=' + tank.iz1_1 + ' name=' + (GetTankName(tank) || '?'));
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
return Friendly;
|
return Friendly;
|
||||||
}
|
}
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
var Prev = TankFriendCache.get(tank);
|
// 还没有可靠基准:先按敌人显示,但**不锁定**
|
||||||
return Prev === undefined ? false : Prev;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
|
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
|
||||||
|
|||||||
+26
-11
@@ -251,19 +251,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 本地队伍缓存:死亡后 u10b_1 会被清空(onTankUnpossessed),不能再用"当前观察目标"推断。
|
// 本地队伍缓存:死亡后 u10b_1 会被清空(onTankUnpossessed),不能再用"当前观察目标"推断。
|
||||||
// 这里记住最后一次有效的本地队伍,整局沿用。
|
// ⚠ 这里**不跟随 gm 变化重置**:hook 重新捕获 GameMode 时 gm 会换实例,
|
||||||
|
// 若此时重置,死亡/观战状态下就会拿观战目标当基准 → 敌我整体翻转。
|
||||||
|
// 只在「本地坦克实体变了」(换局/换车)时才重新缓存。
|
||||||
var LocalTeam = null;
|
var LocalTeam = null;
|
||||||
var LocalTeamGm = null;
|
var LocalTeamTankId = null;
|
||||||
function RememberLocalTeam(gm) {
|
function RememberLocalTeam(gm) {
|
||||||
if (!ZCt) return;
|
if (!ZCt) return;
|
||||||
if (gm !== LocalTeamGm) { LocalTeamGm = gm; LocalTeam = null; }
|
var t = null;
|
||||||
if (LocalTeam) return;
|
try { t = gm.u10b_1; } catch (e) { t = null; }
|
||||||
|
if (!t) return; // 死亡/观战:保持已有缓存
|
||||||
|
var Id = t.iz1_1;
|
||||||
|
if (LocalTeam && LocalTeamTankId === Id) return;
|
||||||
try {
|
try {
|
||||||
var t = gm.u10b_1;
|
|
||||||
if (!t) return;
|
|
||||||
var Team = ZCt(t);
|
var Team = ZCt(t);
|
||||||
// 只缓存"非中立"队伍(m2Fn(Team,Team) 为 true 表示同队且非中立)
|
if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; }
|
||||||
if (Team && (!m2Fn || m2Fn(Team, Team))) LocalTeam = Team;
|
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,6 +274,7 @@
|
|||||||
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
|
// 处理:① 每辆坦克缓存最近一次**非中立**队伍;② 无法判定时沿用上一次判定结果。
|
||||||
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
|
var TankTeamCache = new WeakMap(); // tank -> 非中立队伍对象
|
||||||
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
|
var TankFriendCache = new WeakMap(); // tank -> 上一次的友方判定
|
||||||
|
var TeamLockLogged = new WeakSet();
|
||||||
function ResolveTankTeam(tank) {
|
function ResolveTankTeam(tank) {
|
||||||
if (!ZCt) return null;
|
if (!ZCt) return null;
|
||||||
var Team = null;
|
var Team = null;
|
||||||
@@ -286,6 +289,9 @@
|
|||||||
function IsFriendly(tank, playerTank, gm) {
|
function IsFriendly(tank, playerTank, gm) {
|
||||||
if (!tank) return false;
|
if (!tank) return false;
|
||||||
if (gm) RememberLocalTeam(gm);
|
if (gm) RememberLocalTeam(gm);
|
||||||
|
// 一旦在「本地队伍可靠」时判过,就锁定本局结果,避免任何同步抖动导致颜色翻转
|
||||||
|
var Locked = TankFriendCache.get(tank);
|
||||||
|
if (Locked !== undefined) return Locked;
|
||||||
if (ZCt && m2Fn) {
|
if (ZCt && m2Fn) {
|
||||||
try {
|
try {
|
||||||
var tankTeam = ResolveTankTeam(tank);
|
var tankTeam = ResolveTankTeam(tank);
|
||||||
@@ -293,13 +299,22 @@
|
|||||||
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
|
if (!BaseTeam && playerTank) BaseTeam = ResolveTankTeam(playerTank);
|
||||||
if (tankTeam && BaseTeam) {
|
if (tankTeam && BaseTeam) {
|
||||||
var Friendly = m2Fn(tankTeam, BaseTeam);
|
var Friendly = m2Fn(tankTeam, BaseTeam);
|
||||||
TankFriendCache.set(tank, Friendly);
|
if (LocalTeam) {
|
||||||
|
TankFriendCache.set(tank, Friendly);
|
||||||
|
// 诊断:首次锁定为友方时记一条,便于核对有没有把敌人锁成队友
|
||||||
|
if (Friendly && !TeamLockLogged.has(tank)) {
|
||||||
|
TeamLockLogged.add(tank);
|
||||||
|
try {
|
||||||
|
console.log('[敌我] 锁定为友方 id=' + tank.iz1_1 + ' name=' + (GetTankName(tank) || '?'));
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
return Friendly;
|
return Friendly;
|
||||||
}
|
}
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
var Prev = TankFriendCache.get(tank);
|
// 还没有可靠基准:先按敌人显示,但**不锁定**
|
||||||
return Prev === undefined ? false : Prev;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
|
// ===== 获取相机信息(场景主相机 scene.iyx_1) =====
|
||||||
|
|||||||
Reference in new issue
Block a user