diff --git a/3dtank.com/play/static/js/unpacked/hornet_bundle.js b/3dtank.com/play/static/js/unpacked/hornet_bundle.js index b01aa3d..92ad214 100644 --- a/3dtank.com/play/static/js/unpacked/hornet_bundle.js +++ b/3dtank.com/play/static/js/unpacked/hornet_bundle.js @@ -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) ===== diff --git a/3dtank_bundle.js b/3dtank_bundle.js index b01aa3d..92ad214 100644 --- a/3dtank_bundle.js +++ b/3dtank_bundle.js @@ -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) ===== diff --git a/tools/hornet_lib.js b/tools/hornet_lib.js index 7b4f9d2..37940eb 100644 --- a/tools/hornet_lib.js +++ b/tools/hornet_lib.js @@ -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) =====