From ce1ffbeb60afa82c97a905bb6ecabcf52ae51078 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 20 Oct 2026 14:28:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(team):=20=E9=98=9F=E4=BC=8D=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=8C=89=E9=9C=80=E8=A1=A5=E5=8A=A0=E8=BD=BD=EF=BC=8C?= =?UTF-8?q?=E5=BC=80=E5=B1=80=E5=8D=B3=E7=94=A8=E5=8F=AF=E9=9D=A0=E5=9F=BA?= =?UTF-8?q?=E5=87=86=E9=94=81=E5=AE=9A=E6=95=8C=E6=88=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../play/static/js/unpacked/hornet_bundle.js | 35 +++++++++++++------ 3dtank_bundle.js | 35 +++++++++++++------ tools/hornet_lib.js | 35 +++++++++++++------ 3 files changed, 72 insertions(+), 33 deletions(-) diff --git a/3dtank.com/play/static/js/unpacked/hornet_bundle.js b/3dtank.com/play/static/js/unpacked/hornet_bundle.js index bd29e68..96551d4 100644 --- a/3dtank.com/play/static/js/unpacked/hornet_bundle.js +++ b/3dtank.com/play/static/js/unpacked/hornet_bundle.js @@ -472,15 +472,24 @@ 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; // 死亡/观战:保持已有缓存 - var Id = t.iz1_1; - if (LocalTeam && LocalTeamTankId === Id) 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 Team = ZCt(t); - if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; } + 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; } diff --git a/3dtank_bundle.js b/3dtank_bundle.js index bd29e68..96551d4 100644 --- a/3dtank_bundle.js +++ b/3dtank_bundle.js @@ -472,15 +472,24 @@ 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; // 死亡/观战:保持已有缓存 - var Id = t.iz1_1; - if (LocalTeam && LocalTeamTankId === Id) 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 Team = ZCt(t); - if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; } + 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; } diff --git a/tools/hornet_lib.js b/tools/hornet_lib.js index b22b4dc..ade4e08 100644 --- a/tools/hornet_lib.js +++ b/tools/hornet_lib.js @@ -257,15 +257,24 @@ 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; // 死亡/观战:保持已有缓存 - var Id = t.iz1_1; - if (LocalTeam && LocalTeamTankId === Id) 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 Team = ZCt(t); - if (Team && (!m2Fn || m2Fn(Team, Team))) { LocalTeam = Team; LocalTeamTankId = Id; } + 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; }