lcy
1 天以前 2dd1841d03a730d3d369092c2a3ad656cee4bf64
512 跨服演武场
10个文件已修改
4个文件已添加
826 ■■■■■ 已修改文件
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleFailWin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleVictoryWin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeCell.cs 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaCrossAwardCell.cs 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaCrossAwardCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaCrossAwardWin.cs 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaCrossAwardWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaManager.cs 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerRankCell.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerTop3Cell.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordCell.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaWin.cs 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/CrossServer/CrossServerBaseManager.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs
@@ -25,6 +25,7 @@
            TransBytes (out MatchList[i].Face, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].FacePic, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].TitleID, vBytes, NetDataType.DWORD);
            TransBytes (out MatchList[i].ServerID, vBytes, NetDataType.DWORD);
        }
    }
@@ -38,6 +39,7 @@
        public uint Face;        //基本脸型
        public uint FacePic;        //头像框
        public uint TitleID;        //称号
        public uint ServerID;
    }
}
Main/System/Arena/ArenaBattleFailWin.cs
@@ -73,7 +73,8 @@
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
        enemyAvatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
            int serverID = (ArenaManager.Instance.IsOpenCrossServer() && tagPlayerID != PlayerDatas.Instance.baseData.PlayerID) ? (int)info.ServerID : 0;
            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, serverID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
        });
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
Main/System/Arena/ArenaBattleVictoryWin.cs
@@ -67,7 +67,8 @@
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
        enemyAvatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
            int serverID = (ArenaManager.Instance.IsOpenCrossServer() && tagPlayerID != PlayerDatas.Instance.baseData.PlayerID) ? (int)info.ServerID : 0;
            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, serverID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
        });
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
Main/System/Arena/ArenaChallengeCell.cs
@@ -6,6 +6,8 @@
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] TextEx txtName;
    [SerializeField] TextEx txtAddScore;
    [SerializeField] TextEx txtServerName;
    [SerializeField] TextEx txtAddCrossScore;
    [SerializeField] TextEx txtFightPoint;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] List<ItemCell> itemCells;
@@ -35,13 +37,30 @@
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaMatchInfo.PlayerID, (int)arenaMatchInfo.Face, (int)arenaMatchInfo.FacePic));
        avatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)arenaMatchInfo.PlayerID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
            int serverID = (ArenaManager.Instance.IsOpenCrossServer() && arenaMatchInfo.PlayerID != PlayerDatas.Instance.baseData.PlayerID) ? (int)arenaMatchInfo.ServerID : 0;
            AvatarHelper.TryViewOtherPlayerInfo((int)arenaMatchInfo.PlayerID, serverID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
        });
        txtName.text = UIHelper.ServerStringTrim(arenaMatchInfo.PlayerName);
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaMatchInfo.FightPower);
        txtAddScore.text = Language.Get("Arena16", ArenaManager.Instance.GetChallengePoints(index));
        bool isCrossServer = ArenaManager.Instance.IsOpenCrossServer();
        if (isCrossServer)
        {
            txtAddScore.SetActive(false);
            txtServerName.SetActive(true);
            txtServerName.text = ServerListCenter.Instance.GetServerName((int)arenaMatchInfo.ServerID);
            txtAddCrossScore.SetActive(true);
            txtAddCrossScore.text = Language.Get("Arena16", ArenaManager.Instance.GetChallengePoints(index));
        }
        else
        {
            txtAddScore.SetActive(true);
            txtAddScore.text = Language.Get("Arena16", ArenaManager.Instance.GetChallengePoints(index));
            txtServerName.SetActive(false);
            txtAddCrossScore.SetActive(false);
        }
        officialTitleCell.InitUI(arenaMatchInfo.RealmLV, (int)arenaMatchInfo.TitleID, 0.55f);
        int[][] rewards = ArenaManager.Instance.fixedChallengeRewards;
Main/System/Arena/ArenaCrossAwardCell.cs
New file
@@ -0,0 +1,69 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
/// <summary>
/// 竞技场奖励单元格
/// </summary>
public class ArenaCrossAwardCell : CellView
{
    [SerializeField] ImageEx imgRank;
    [SerializeField] TextEx txtRank;
    [SerializeField] ItemCell[] itemCells;
    public void Display(int index, CellView cellView)
    {
        int functionOrder = cellView.info.Value.infoInt1;
        var rewardDict = ArenaManager.Instance.GetCrossArenaAwardDict(functionOrder);
        if (rewardDict.IsNullOrEmpty()) return;
        var sortedKeys = rewardDict.Keys.ToList();
        sortedKeys.Sort();
        DisplayRank(sortedKeys, index);
        DisplayItems(sortedKeys, index, rewardDict);
    }
    private void DisplayRank(List<int> sortedKeys, int index)
    {
        int rank = sortedKeys[index];
        if (rank <= 3)
        {
            imgRank.SetActive(true);
            txtRank.SetActive(false);
            imgRank.SetSprite($"Rank{rank}");
        }
        else
        {
            imgRank.SetActive(false);
            txtRank.SetActive(true);
            int lastIndex = index - 1;
            txtRank.text = lastIndex > 0 && lastIndex < sortedKeys.Count
                ? Language.Get("Arena15", sortedKeys[lastIndex] + 1, rank)
                : string.Empty;
        }
    }
    private void DisplayItems(List<int> sortedKeys, int index, Dictionary<int, int[][]> rewardDict)
    {
        int[][] rewardArr = rewardDict[sortedKeys[index]];
        if (rewardArr.IsNullOrEmpty())
        {
            for (int i = 0; i < itemCells.Length; i++)
                itemCells[i].SetActive(false);
            return;
        }
        for (int i = 0; i < itemCells.Length; i++)
        {
            bool hasReward = i < rewardArr.Length;
            itemCells[i].SetActive(hasReward);
            if (hasReward)
            {
                int itemId = rewardArr[i][0];
                itemCells[i].Init(new ItemCellModel(itemId, true, rewardArr[i][1]));
                itemCells[i].button.SetListener(() => ItemTipUtility.Show(itemId));
            }
        }
    }
}
Main/System/Arena/ArenaCrossAwardCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: db50e766c48693241827170a23113478
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaCrossAwardWin.cs
New file
@@ -0,0 +1,192 @@
using System;
using System.Linq;
using UnityEngine;
/// <summary>
/// 竞技场奖励窗口:functionOrder=0/1/2 → 本服日/本服周/跨服周奖励
/// </summary>
public class ArenaCrossAwardWin : FunctionsBaseWin
{
    [HideInInspector] public string valueFormat = "{0}";
    [SerializeField] ArenaPlayerRankCell myRankCell;
    [SerializeField] ButtonEx btnClose;
    [SerializeField] TextEx txtCountdown;
    [SerializeField] Transform localDayRect;
    [SerializeField] ScrollerController scrLocalDayAward;
    [SerializeField] Transform localWeekRect;
    [SerializeField] ScrollerController scrLocalWeekAward;
    [SerializeField] Transform crossWeekRect;
    [SerializeField] ScrollerController scrCrossWeekAward;
    protected override void InitComponent()
    {
        base.InitComponent();
        btnClose.SetListener(CloseWindow);
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
        RankModel.Instance.onRankRefresh += OnRankRefresh;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        scrLocalDayAward.OnRefreshCell += OnRefreshLocalDayCell;
        scrLocalWeekAward.OnRefreshCell += OnRefreshLocalWeekCell;
        scrCrossWeekAward.OnRefreshCell += OnRefreshCrossWeekCell;
        Display();
    }
    protected override void OnPreClose()
    {
        base.OnPreClose();
        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
        RankModel.Instance.onRankRefresh -= OnRankRefresh;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
        scrLocalDayAward.OnRefreshCell -= OnRefreshLocalDayCell;
        scrLocalWeekAward.OnRefreshCell -= OnRefreshLocalWeekCell;
        scrCrossWeekAward.OnRefreshCell -= OnRefreshCrossWeekCell;
    }
    private void OnSecondEvent()
    {
        TimeSpan remainingTime;
        if (functionOrder == 0)
        {
            // 本服日奖励:使用到明天0点的时间
            remainingTime = TimeUtility.ServerNow.AddDays(1).Date - TimeUtility.ServerNow;
        }
        else if (functionOrder == 1)
        {
            // 本服周奖励:使用本服赛季结束时间
            ArenaManager.Instance.GetCurrentSeasonDates(out _, out DateTime seasonEndDate);
            remainingTime = seasonEndDate - TimeUtility.ServerNow;
        }
        else
        {
            // 跨服周奖励:使用跨服赛季结束时间
            var crossZoneInfo = CrossServerBaseManager.Instance.GetCrossZoneInfo(ArenaManager.Instance.DataMapID);
            int zoneID = crossZoneInfo != null ? (int)crossZoneInfo.ZoneID : 0;
            ArenaManager.Instance.GetCrossCurrentSeasonDates(zoneID, out _, out DateTime crossSeasonEndDate);
            remainingTime = crossSeasonEndDate - TimeUtility.ServerNow;
        }
        int remainingSeconds = (int)remainingTime.TotalSeconds;
        bool hasTime = remainingSeconds > 0;
        txtCountdown.SetActive(hasTime);
        if (hasTime)
            txtCountdown.text = Language.Get("Arena14", TimeUtility.SecondsToDHMSCHS(remainingSeconds));
    }
    protected override void OpenSubUIByTabIndex()
    {
        Display();
    }
    private void OnRefreshLocalDayCell(ScrollerDataType type, CellView cell)
    {
        cell.GetComponent<ArenaCrossAwardCell>()?.Display(cell.index, cell);
    }
    private void OnRefreshLocalWeekCell(ScrollerDataType type, CellView cell)
    {
        cell.GetComponent<ArenaCrossAwardCell>()?.Display(cell.index, cell);
    }
    private void OnRefreshCrossWeekCell(ScrollerDataType type, CellView cell)
    {
        cell.GetComponent<ArenaCrossAwardCell>()?.Display(cell.index, cell);
    }
    private void OnArenaMatchListEvent() => Display();
    private void OnUpdateArenaPlayerInfo() => Display();
    private void OnUpdateGameRecInfo() => Display();
    private void OnRankRefresh(int _) => DisplayMyRank();
    private void Display()
    {
        localDayRect.SetActive(functionOrder == 0);
        localWeekRect.SetActive(functionOrder == 1);
        crossWeekRect.SetActive(functionOrder == 2);
        CreateScroller();
        DisplayMyRank();
        OnSecondEvent();
    }
    private void CreateScroller()
    {
        switch (functionOrder)
        {
            case 0:
                CreateLocalDayScroller();
                break;
            case 1:
                CreateLocalWeekScroller();
                break;
            case 2:
                CreateCrossWeekScroller();
                break;
        }
        DisplayMyRank();
        OnSecondEvent();
    }
    private void CreateLocalDayScroller()
    {
        scrLocalDayAward.Refresh();
        var rewardDict = ArenaManager.Instance.GetCrossArenaAwardDict(0);
        if (rewardDict.IsNullOrEmpty()) return;
        var sortedKeys = rewardDict.Keys.ToList();
        sortedKeys.Sort();
        CellInfo cellInfo = new CellInfo { infoInt1 = 0 };
        for (int i = 0; i < sortedKeys.Count; i++)
            scrLocalDayAward.AddCell(ScrollerDataType.Header, i, cellInfo);
        scrLocalDayAward.Restart();
    }
    private void CreateLocalWeekScroller()
    {
        scrLocalWeekAward.Refresh();
        var rewardDict = ArenaManager.Instance.GetCrossArenaAwardDict(1);
        if (rewardDict.IsNullOrEmpty()) return;
        var sortedKeys = rewardDict.Keys.ToList();
        sortedKeys.Sort();
        CellInfo cellInfo = new CellInfo { infoInt1 = 1 };
        for (int i = 0; i < sortedKeys.Count; i++)
            scrLocalWeekAward.AddCell(ScrollerDataType.Header, i, cellInfo);
        scrLocalWeekAward.Restart();
    }
    private void CreateCrossWeekScroller()
    {
        scrCrossWeekAward.Refresh();
        var rewardDict = ArenaManager.Instance.GetCrossArenaAwardDict(2);
        if (rewardDict.IsNullOrEmpty()) return;
        var sortedKeys = rewardDict.Keys.ToList();
        sortedKeys.Sort();
        CellInfo cellInfo = new CellInfo { infoInt1 = 2 };
        for (int i = 0; i < sortedKeys.Count; i++)
            scrCrossWeekAward.AddCell(ScrollerDataType.Header, i, cellInfo);
        scrCrossWeekAward.Restart();
    }
    private void DisplayMyRank()
    {
        myRankCell.Display(ArenaManager.Instance.rankType, 0, valueFormat);
    }
}
Main/System/Arena/ArenaCrossAwardWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f638d0723d6fc9347ac43f23a5a2f944
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Arena/ArenaManager.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using LitJson;
using System;
@@ -6,6 +7,7 @@
public class ArenaManager : GameSystemManager<ArenaManager>
{
    public readonly int rankType = 1;    // 榜单类型
    public readonly int corssRankType = 151;    // 榜单类型
    public readonly int funcId = 27;    // 功能Id
    public readonly int DeployTroopsFuncId = 31;    // 布阵功能ID
    public readonly int BattleChangeTabFuncId = 32; // 战斗能切换页签功能ID
@@ -26,6 +28,8 @@
    public Dictionary<int, int[][]> dailyRankRewards; // 每日排行奖励 {"名次":[[物品ID, 个数,是否拍品], ...], ...} 配置的名次key,自动按小于等于对应名次给奖励
    public Dictionary<int, int[][]> seasonRankRewards;  // 赛季排行奖励 {"名次":[[物品ID, 个数,是否拍品], ...], ...}
    public Dictionary<int, int> crossRewardTemps;//数值2:跨服赛季排行奖励模版 {"互通服务器数";对应活动排行奖励表模版编号, ...}  按小于等于判断,大于最大配置的服务器数时默认取配置中最大服务器数对应奖励
    public Dictionary<int, int[][]> crossWeekRewards;
    public uint score;    // 当前积分
    public int totalWinCnt;  //累计胜利次数
@@ -40,18 +44,97 @@
    public event Action OnArenaMatchListEvent;
    public event Action OnUpdateArenaPlayerInfo;
    public event Action OnUpdateGameRecInfo;
    private int lastLocalWeekday;        // 上次本服weekday (1-7, 周一=1, 周日=7)
    private int lastCrossWeekday;        // 上次跨服weekday
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += BeforePlayerDataInitializeEventOnRelogin;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
        CrossServerBaseManager.Instance.OnCrossZoneInfoUpdateEvent += OnCrossZoneInfoUpdate;
        InitTable();
        InitRedpoint();
        InitCrossServerState();
    }
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= BeforePlayerDataInitializeEventOnRelogin;
        PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
        GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
        CrossServerBaseManager.Instance.OnCrossZoneInfoUpdateEvent -= OnCrossZoneInfoUpdate;
    }
    void InitCrossServerState()
    {
        lastLocalWeekday = TimeUtility.GetCommonWeekday(); // zoneID=0本服
        int crossZoneID = GetCrossZoneID();
        lastCrossWeekday = crossZoneID > 0 ? TimeUtility.GetCommonWeekday(crossZoneID) : lastLocalWeekday;
    }
    void OnSecondEvent()
    {
        CheckCrossWeekChange();
    }
    // 跨服状态更新事件处理
    void OnCrossZoneInfoUpdate(int mapID)
    {
        if (mapID != DataMapID)
            return;
        bool currentIsOpenCrossServer = IsOpenCrossServer();
        // 只会从未跨服变为跨服,变为跨服时关闭ArenaWin
        if (currentIsOpenCrossServer)
        {
            CloseArenaWinAndClearData();
        }
        int crossZoneID = GetCrossZoneID();
        lastCrossWeekday = crossZoneID > 0 ? TimeUtility.GetCommonWeekday(crossZoneID) : TimeUtility.GetCommonWeekday();
    }
    int GetCrossZoneID()
    {
        var crossZoneInfo = CrossServerBaseManager.Instance.GetCrossZoneInfo(DataMapID);
        return crossZoneInfo != null ? (int)crossZoneInfo.ZoneID : 0;
    }
    void CheckCrossWeekChange()
    {
        int currentLocalWeekday = TimeUtility.GetCommonWeekday(); // zoneID=0本服
        int crossZoneID = GetCrossZoneID();
        int currentCrossWeekday = crossZoneID > 0 ? TimeUtility.GetCommonWeekday(crossZoneID) : currentLocalWeekday;
        // 条件1: 本服时间过周 (weekday从7变为1, 周日->周一)
        if (lastLocalWeekday == 7 && currentLocalWeekday == 1)
        {
            CloseArenaWinAndClearData();
        }
        lastLocalWeekday = currentLocalWeekday;
        bool currentIsOpenCrossServer = IsOpenCrossServer();
        if (!currentIsOpenCrossServer)
            return;
        // 条件2: 跨服时间过周 (weekday从7变为1, 周日->周一)
        if (crossZoneID > 0 && lastCrossWeekday == 7 && currentCrossWeekday == 1)
        {
            CloseArenaWinAndClearData();
        }
        lastCrossWeekday = currentCrossWeekday;
    }
    void CloseArenaWinAndClearData()
    {
        if (UIManager.Instance.IsOpened<ArenaWin>())
        {
            UIManager.Instance.CloseWindow<ArenaWin>();
        }
        matchInfoList.Clear();
        gameRecDict.Clear();
    }
    public void BeforePlayerDataInitializeEventOnRelogin()
@@ -86,6 +169,9 @@
        config = FuncConfigConfig.Get("ArenaBillboradAward");
        dailyRankRewards = ConfigParse.ParseIntArray2Dict(config.Numerical1);
        seasonRankRewards = ConfigParse.ParseIntArray2Dict(config.Numerical2);
        config = FuncConfigConfig.Get("ArenaCross");
        crossRewardTemps = ConfigParse.ParseIntDict(config.Numerical2);
    }
    public void UpdateRedPonit()
    {
@@ -141,7 +227,9 @@
                RealmLV = item.RealmLV,
                FightPower = (ulong)item.FightPowerEx * 100000000 + (ulong)item.FightPower,
                Face = item.Face,
                FacePic = item.FacePic
                FacePic = item.FacePic,
                TitleID = item.TitleID,
                ServerID = item.ServerID,
            };
            matchInfoList.Add(matchInfo);
            allFaceInfoDict[item.PlayerID] = matchInfo;
@@ -175,6 +263,16 @@
                string name = userData["Name"].ToString();
                int addScore = int.Parse(userData["AddScore"].ToString());
                ulong fightPower = ulong.Parse(userData["FightPower"].ToString());
                uint serverID = 0;
                if (userData.ContainsKey("ServerID"))
                {
                    serverID = uint.Parse(userData["ServerID"].ToString());
                }
                uint cross = 0;
                if (userData.ContainsKey("Cross"))
                {
                    cross = uint.Parse(userData["Cross"].ToString());
                }
                var arenaGameRec = new ArenaGameRec
                {
@@ -189,7 +287,9 @@
                    Value8 = rec.Value8,
                    Name = name,
                    AddScore = addScore,
                    FightPower = fightPower
                    FightPower = fightPower,
                    ServerID = serverID,
                    Cross = cross
                };
                gameRecDict[recID].Add(arenaGameRec);
@@ -289,6 +389,8 @@
        seasonEndDate = new DateTime(sunday.Year, sunday.Month, sunday.Day, 23, 59, 59);
    }
    /// <summary>
    /// 根据recID获取按时间从大到小排序的List<ArenaGameRec>
    /// </summary>
@@ -313,6 +415,94 @@
            PlayerDatas.Instance.baseData.FightPower :
            FightPowerManager.Instance.GetTeamFightPower(TeamManager.Instance.GetTeamID(BattlePreSetType.Arena), false);
    }
    public readonly int DataMapID = 3;
    public bool IsOpenCrossServer()
    {
        bool isOpenCrossServer = CrossServerBaseManager.Instance.IsOpenCrossServer(DataMapID);
        return isOpenCrossServer;
    }
    public Dictionary<int, int[][]> GetCrossArenaAwardDict(int functionOrder)
    {
        return functionOrder switch
        {
            0 => dailyRankRewards,
            1 => seasonRankRewards,
            2 => GetCrossWeekRewards(),
            _ => new Dictionary<int, int[][]>()
        };
    }
    public Dictionary<int, int[][]> GetCrossWeekRewards()
    {
        var crossZoneInfo = CrossServerBaseManager.Instance.GetCrossZoneInfo(DataMapID);
        if (crossZoneInfo == null || crossZoneInfo.ServerIDList == null || crossRewardTemps.IsNullOrEmpty())
        {
            return new Dictionary<int, int[][]>();
        }
        int serverCount = crossZoneInfo.ServerIDList.Length;
        // 先对key进行排序,避免遍历顺序依赖
        var sortedKeys = crossRewardTemps.Keys.OrderBy(k => k).ToList();
        int templateID = 0;
        int matchedKey = 0;
        foreach (var key in sortedKeys)
        {
            if (key <= serverCount && key >= matchedKey)
            {
                matchedKey = key;
                templateID = crossRewardTemps[key];
            }
        }
        // 如果没有匹配的key(serverCount小于所有配置的key),取最小key对应的奖励
        if (templateID == 0 && sortedKeys.Count > 0)
        {
            var minKey = sortedKeys[0];
            templateID = crossRewardTemps[minKey];
        }
        if (templateID == 0) return new Dictionary<int, int[][]>();
        var rankList = ActBillboardAwardConfig.GetRankASortList(templateID);
        if (rankList.IsNullOrEmpty()) return new Dictionary<int, int[][]>();
        var result = new Dictionary<int, int[][]>();
        foreach (var rankA in rankList)
        {
            var config = ActBillboardAwardConfig.GetConfig(templateID, rankA);
            if (config?.AwardItemList != null)
            {
                result[rankA] = config.AwardItemList;
            }
        }
        return result;
    }
    /// <summary>
    /// 获得当前赛季的起止日期(跨服版本)。赛季从周一 00:00:00 开始,到周日 23:59:59 结束。
    /// 服务端定义周一为每周的第一天。
    /// </summary>
    /// <param name="zoneID">跨服zoneID,0表示本服时间,非0表示跨服时间</param>
    /// <param name="seasonStartDate">输出参数:赛季的起始日期(本周一 00:00:00)</param>
    /// <param name="seasonEndDate">输出参数:赛季的结束日期(本周日 23:59:59)</param>
    public void GetCrossCurrentSeasonDates(int zoneID, out DateTime seasonStartDate, out DateTime seasonEndDate)
    {
        DateTime now = TimeUtility.GetCommServerNow(zoneID);
        // 为了符合周一是一周第一天的计算标准,将周日视为一周的第7天。
        int currentDayOfWeek = (int)now.DayOfWeek;
        if (currentDayOfWeek == 0) // 如果是周日 (Sunday = 0)
        {
            currentDayOfWeek = 7;
        }
        DateTime monday = now.AddDays(-(currentDayOfWeek - 1));
        seasonStartDate = new DateTime(monday.Year, monday.Month, monday.Day, 0, 0, 0);
        DateTime sunday = seasonStartDate.AddDays(6);
        seasonEndDate = new DateTime(sunday.Year, sunday.Month, sunday.Day, 23, 59, 59);
    }
}
@@ -327,6 +517,7 @@
    public ulong FightPower;        //战力
    public uint Face;        //基本脸型
    public uint FacePic;        //头像框
    public uint ServerID;
}
@@ -345,5 +536,7 @@
    public int AddScore;        //本次自己变更的积分,有正负
    public ulong FightPower;    //目标战力
    public int TitileId; //未来接入
    public uint ServerID;       //对手区服ID
    public uint Cross;          //是否跨服记录
}
Main/System/Arena/ArenaPlayerRankCell.cs
@@ -7,12 +7,23 @@
    [SerializeField] Text rankText;
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] Text serverText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    // rank 为0 代表玩家自己
    public void Display(int rankType, int rank, string valueFormat)
    {
        DisplayCross(rankType, rank, valueFormat, false);
    }
    public void DisplayCross(int rankType, int rank, string valueFormat)
    {
        DisplayCross(rankType, rank, valueFormat, true);
    }
    void DisplayCross(int rankType, int rank, string valueFormat, bool isCross)
    {
        RankData rankData = null;
        int viewPlayerId = (int)PlayerDatas.Instance.baseData.PlayerID;
@@ -43,6 +54,8 @@
            avatarCell.SetActive(false);
            nameText.text = Language.Get("L1124");
            rankValueText.text = "0";//Language.Get("L1125");
            if (serverText != null)
                serverText.text = "";
        }
        else
        {
@@ -51,9 +64,17 @@
            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
            avatarCell.SetActive(true);
            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
            // 跨服显示服务器名称
            if (isCross && serverText != null)
            {
                serverText.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(rankData.name2));
            }
            avatarCell.SetListener(() =>
            {
                AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)BattlePreSetType.Arena);
                int serverID = (ArenaManager.Instance.IsOpenCrossServer() && rankData.id != PlayerDatas.Instance.baseData.PlayerID) ? UIHelper.GetServerIDByAccount(rankData.name2) : 0;
                AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, serverID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
            });
            nameText.text = rankData.name1;
            rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
@@ -64,7 +85,8 @@
        {
            queryPlayerBtn.AddListener(() =>
            {
                AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId, viewPlayerLineupType: (int)BattlePreSetType.Arena);
                int serverID = (ArenaManager.Instance.IsOpenCrossServer() && viewPlayerId != PlayerDatas.Instance.baseData.PlayerID) ? UIHelper.GetServerIDByAccount(rankData.name2) : 0;
                AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId, serverID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
            });
        }
    }
Main/System/Arena/ArenaPlayerTop3Cell.cs
@@ -1,16 +1,28 @@
using UnityEngine;
using UnityEngine.UI;
public class ArenaPlayerTop3Cell : MonoBehaviour
{
    //[SerializeField] Model 显示NPC 武将模型
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] Text serverText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    [SerializeField] HorseController model;
    public void Display(int rankType, int rank, string valueFormat = "{0}")
    {
        DisplayCross(rankType, rank, valueFormat, false);
    }
    public void DisplayCross(int rankType, int rank, string valueFormat = "{0}")
    {
        DisplayCross(rankType, rank, valueFormat, true);
    }
    void DisplayCross(int rankType, int rank, string valueFormat, bool isCross)
    {
        var rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
        if (rankData == null)
@@ -18,6 +30,8 @@
            rankValueText.text = "0";//Language.Get("L1125");
            nameText.text = Language.Get("L1124");
            officialTitleCell.SetActive(false);
            if (serverText != null)
                serverText.text = "";
            return;
        }
        officialTitleCell.SetActive(true);
@@ -25,6 +39,12 @@
        nameText.text = rankData.name1;
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, 1);
        if (isCross && serverText != null)
        {
            serverText.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(rankData.name2));
        }
        queryPlayerBtn.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)BattlePreSetType.Arena);
Main/System/Arena/ArenaRecordCell.cs
@@ -7,6 +7,8 @@
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] TextEx txtName;
    [SerializeField] TextEx txtDate;
    [SerializeField] TextEx txtCrossDate;
    [SerializeField] TextEx txtServerName;
    [SerializeField] TextEx txtFightPoint;
    [SerializeField] TextEx txtState;
    [SerializeField] TextEx txtAdd;
@@ -37,7 +39,37 @@
            return;
        arenaGameRec = sortedList[index];
        imgType.SetSprite(arenaGameRec.Value2 == 1 ? "ArenaRecordTypeAtk" : "ArenaRecordTypeDef");
        txtDate.text = FormatTime(arenaGameRec.Time);
        // 跨服记录样式显示逻辑
        if (ArenaManager.Instance.IsOpenCrossServer())
        {
            // 跨服样式:txtDate隐藏,txtCrossDate和txtServerName显示
            txtDate.SetActive(false);
            txtCrossDate.SetActive(true);
            txtServerName.SetActive(true);
            if (arenaGameRec.Cross == 1)
            {
                // 跨服记录:显示跨服时间和跨服服务器
                txtCrossDate.text = FormatTime(arenaGameRec.Time);
                txtServerName.text = ServerListCenter.Instance.GetServerName((int)arenaGameRec.ServerID);
            }
            else
            {
                // 本服记录:显示本服时间和本服服务器
                txtCrossDate.text = FormatTime(arenaGameRec.Time);
                txtServerName.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID));
            }
        }
        else
        {
            // 正常样式:txtDate显示,txtCrossDate和txtServerName隐藏
            txtDate.SetActive(true);
            txtDate.text = FormatTime(arenaGameRec.Time);
            txtCrossDate.SetActive(false);
            txtServerName.SetActive(false);
        }
        // true 已失效 false 未失效
        bool isTimeInvalid = ArenaManager.Instance.IsTimeInvalid(arenaGameRec.Time);
        // 发起攻击,打赢有积分,打输没有
@@ -67,7 +99,8 @@
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6));
        avatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)arenaGameRec.Value3, viewPlayerLineupType: (int)BattlePreSetType.Arena);
            int serverID = (ArenaManager.Instance.IsOpenCrossServer() && arenaGameRec.Value3 != PlayerDatas.Instance.baseData.PlayerID) ? (int)arenaGameRec.ServerID : 0;
            AvatarHelper.TryViewOtherPlayerInfo((int)arenaGameRec.Value3, serverID, viewPlayerLineupType: (int)BattlePreSetType.Arena);
        });
        txtName.text = arenaGameRec.Name;
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaGameRec.FightPower);
Main/System/Arena/ArenaWin.cs
@@ -3,8 +3,17 @@
using UnityEngine;
using UnityEngine.UI;
public class ArenaWin : UIBase
public class ArenaWin : FunctionsBaseWin
{
    [SerializeField] TextEx txtTip;
    [SerializeField] TextEx txtCrossTip;
    [SerializeField] Transform transLocalRank;
    [SerializeField] Transform transLocalButton;
    [SerializeField] Transform transLocalCrossButton;
    [SerializeField] ButtonEx btnCrossAward;
    [SerializeField] Button btnFunPresetCross;
    [SerializeField] ButtonEx btnRecord;
    [SerializeField] ButtonEx btnAward;
    [SerializeField] ButtonEx btnChallage;
@@ -15,7 +24,21 @@
    [SerializeField] ArenaPlayerRankCell myRankCell;
    [SerializeField] ArenaChallengeVoucher voucher;
    [SerializeField] Button funPresetBtn;
    //跨服排行
    [SerializeField] Transform transCrossRank;
    [SerializeField] ButtonEx btnRecordCross;
    [SerializeField] ButtonEx btnAwardCross;
    [SerializeField] ButtonEx btnChallageCross;
    [SerializeField] RedpointBehaviour rpChallageCross;
    [SerializeField] List<ArenaPlayerTop3Cell> playerTop3CellsCross;
    [SerializeField] ScrollerController scrollerControllerCross;
    [SerializeField] ArenaPlayerRankCell myRankCellCross;
    [SerializeField] ArenaChallengeVoucher voucherCross;
    [SerializeField] Button funPresetBtnCross;
    [SerializeField] Button serversBtn;
    [HideInInspector] public int groupValue1 = 0;   //一般用于跨服
    [HideInInspector] public int groupValue2 = 0;   //一般用于跨服
    [HideInInspector] public string valueFormat = "{0}";
@@ -23,7 +46,13 @@
    protected override void InitComponent()
    {
        base.InitComponent();
        btnAward.SetListener(() => UIManager.Instance.OpenWindow<ArenaAwardWin>());
        btnAward.SetListener(() =>
        {
            if (ArenaManager.Instance.IsOpenCrossServer())
                UIManager.Instance.OpenWindow<ArenaCrossAwardWin>();
            else
                UIManager.Instance.OpenWindow<ArenaAwardWin>();
        });
        btnRecord.SetListener(() =>
        {
            ArenaManager.Instance.SendViewGameRecPack();
@@ -34,31 +63,140 @@
            ArenaManager.Instance.SendArenaMatch();
            UIManager.Instance.OpenWindow<ArenaChallengeWin>();
        });
        funPresetBtn.AddListener(()=>
        funPresetBtn.AddListener(() =>
        {
            FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.Arena);
        });
        btnCrossAward.SetListener(() =>
        {
            if (ArenaManager.Instance.IsOpenCrossServer())
                UIManager.Instance.OpenWindow<ArenaCrossAwardWin>();
            else
                UIManager.Instance.OpenWindow<ArenaAwardWin>();
        });
        btnFunPresetCross.AddListener(() =>
        {
            FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.Arena);
        });
        // 跨服按钮监听器
        btnAwardCross.SetListener(() =>
        {
            UIManager.Instance.OpenWindow<ArenaCrossAwardWin>();
        });
        btnRecordCross.SetListener(() =>
        {
            ArenaManager.Instance.SendViewGameRecPack();
            UIManager.Instance.OpenWindow<ArenaRecordWin>();
        });
        btnChallageCross.SetListener(() =>
        {
            ArenaManager.Instance.SendArenaMatch();
            UIManager.Instance.OpenWindow<ArenaChallengeWin>();
        });
        funPresetBtnCross.AddListener(() =>
        {
            FuncPresetManager.Instance.ClickBattlePreset((int)BattlePreSetType.Arena);
        });
        serversBtn.SetListener(() =>
        {
            UIHelper.ShowServersPanel(GuildManager.Instance.crossServerIDList);
        });
    }
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
        RankModel.Instance.ResetQueryParam();
        RankModel.Instance.QueryRankByPage(ArenaManager.Instance.rankType, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
        rpChallage.redpointId = ArenaManager.Instance.GetRedPonitId(1);
    }
        // 在base.OnPreOpen()之前设置functionOrder,避免被父类传入参数覆盖
        bool isOpenCrossServer = ArenaManager.Instance.IsOpenCrossServer();
        if (isOpenCrossServer)
        {
            functionOrder = 1;  // 跨服排行
        }
        else
        {
            functionOrder = 0;  // 本服排行
        }
    protected override void NextFrameAfterOpen()
    {
        base.OnPreOpen();
        rpChallage.redpointId = ArenaManager.Instance.GetRedPonitId(1);
        rpChallageCross.redpointId = ArenaManager.Instance.GetRedPonitId(1);
        RankModel.Instance.onRankRefresh += OnRankRefresh;
        scrollerController.OnRefreshCell += OnRefreshCell;
        scrollerControllerCross.OnRefreshCell += OnRefreshCellCross;
        ArenaManager.Instance.OnArenaMatchListEvent += OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo += OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo += OnUpdateGameRecInfo;
        PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChange;
        ShowRankByFunctionOrder();
        txtTip.SetActive(!isOpenCrossServer);
        txtCrossTip.SetActive(isOpenCrossServer);
        for (int i = 0; i < tabButtons.Length; i++)
        {
            tabButtons[i].SetActive(isOpenCrossServer);
        }
        RankModel.Instance.ResetQueryParam();
        if (isOpenCrossServer)
        {
            var crossZoneInfo = CrossServerBaseManager.Instance.GetCrossZoneInfo(ArenaManager.Instance.DataMapID);
            if (crossZoneInfo != null)
            {
                RankModel.Instance.QueryRankByPage(ArenaManager.Instance.corssRankType, groupValue1: (int)crossZoneInfo.ZoneID, crossServerID: (int)crossZoneInfo.CrossServerID, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
            }
        }
        else
        {
            RankModel.Instance.QueryRankByPage(ArenaManager.Instance.rankType, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
        }
        Display();
    }
    protected override void OpenSubUIByTabIndex()
    {
        ShowRankByFunctionOrder();
        RankModel.Instance.ResetQueryParam();
        // 重新查询对应排行
        bool isOpenCrossServer = ArenaManager.Instance.IsOpenCrossServer();
        if (functionOrder == 0 && isOpenCrossServer)
        {
            // 本服排行
            RankModel.Instance.QueryRankByPage(ArenaManager.Instance.rankType, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
        }
        else if (functionOrder == 1 && isOpenCrossServer)
        {
            // 跨服排行
            var crossZoneInfo = CrossServerBaseManager.Instance.GetCrossZoneInfo(ArenaManager.Instance.DataMapID);
            if (crossZoneInfo != null)
            {
                RankModel.Instance.QueryRankByPage(ArenaManager.Instance.corssRankType, groupValue1: (int)crossZoneInfo.ZoneID, crossServerID: (int)crossZoneInfo.CrossServerID, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
            }
        }
    }
    void ShowRankByFunctionOrder()
    {
        if (functionOrder == 0)
        {
            // 本服排行
            transLocalRank.SetActive(true);
            bool isOpenCrossServer = ArenaManager.Instance.IsOpenCrossServer();
            transLocalButton.SetActive(!isOpenCrossServer);
            transLocalCrossButton.SetActive(isOpenCrossServer);
            transCrossRank.SetActive(false);
        }
        else
        {
            // 跨服排行
            transLocalRank.SetActive(false);
            transCrossRank.SetActive(true);
        }
    }
    protected override void OnPreClose()
@@ -66,6 +204,7 @@
        base.OnPreClose();
        RankModel.Instance.onRankRefresh -= OnRankRefresh;
        scrollerController.OnRefreshCell -= OnRefreshCell;
        scrollerControllerCross.OnRefreshCell -= OnRefreshCellCross;
        ArenaManager.Instance.OnArenaMatchListEvent -= OnArenaMatchListEvent;
        ArenaManager.Instance.OnUpdateArenaPlayerInfo -= OnUpdateArenaPlayerInfo;
        ArenaManager.Instance.OnUpdateGameRecInfo -= OnUpdateGameRecInfo;
@@ -102,6 +241,18 @@
        RankModel.Instance.ListenRankPage(ArenaManager.Instance.rankType, cell.index, groupValue1, groupValue2);
    }
    void OnRefreshCellCross(ScrollerDataType type, CellView cell)
    {
        var crossZoneInfo = CrossServerBaseManager.Instance.GetCrossZoneInfo(ArenaManager.Instance.DataMapID);
        int zoneID = crossZoneInfo != null ? (int)crossZoneInfo.ZoneID : 0;
        int crossServerID = crossZoneInfo != null ? (int)crossZoneInfo.CrossServerID : 0;
        var _cell = cell.GetComponent<ArenaPlayerRankCell>();
        _cell.DisplayCross(ArenaManager.Instance.corssRankType, cell.index + 1, valueFormat);
        RankModel.Instance.ListenRankPage(ArenaManager.Instance.corssRankType, cell.index, zoneID, 0, crossServerID);
    }
    private void OnUpdateArenaPlayerInfo()
    {
        Display();
@@ -126,6 +277,13 @@
        DisplayDeployTroop();
        funPresetBtn.SetActive(FuncPresetManager.Instance.IsPreShow());
        // 跨服显示
        voucherCross.Display();
        CreateScrollerCross();
        DisplayMyRankCross();
        DisplayTop3Cross();
        funPresetBtnCross.SetActive(FuncPresetManager.Instance.IsPreShow());
    }
    void CreateScroller()
@@ -139,9 +297,25 @@
        scrollerController.Restart();
    }
    void CreateScrollerCross()
    {
        scrollerControllerCross.Refresh();
        var cnt = RankModel.Instance.GetRankShowMaxCnt(ArenaManager.Instance.corssRankType);
        for (int i = 3; i < cnt; i++)
        {
            scrollerControllerCross.AddCell(ScrollerDataType.Header, i);
        }
        scrollerControllerCross.Restart();
    }
    void DisplayMyRank()
    {
        myRankCell.Display(ArenaManager.Instance.rankType, 0, ArenaManager.Instance.score.ToString());
    }
    void DisplayMyRankCross()
    {
        myRankCellCross.DisplayCross(ArenaManager.Instance.corssRankType, 0, ArenaManager.Instance.score.ToString());
    }
    void DisplayTop3()
@@ -152,12 +326,27 @@
        }
    }
    void DisplayTop3Cross()
    {
        for (int i = 0; i < playerTop3CellsCross.Count; i++)
        {
            playerTop3CellsCross[i].DisplayCross(ArenaManager.Instance.corssRankType, i + 1);
        }
    }
    void OnRankRefresh(int type)
    {
        if (type != ArenaManager.Instance.rankType)
            return;
        DisplayTop3();
        scrollerController.m_Scorller.RefreshActiveCellViews();
        DisplayMyRank();
        if (type == ArenaManager.Instance.rankType)
        {
            DisplayTop3();
            scrollerController.m_Scorller.RefreshActiveCellViews();
            DisplayMyRank();
        }
        else if (type == ArenaManager.Instance.corssRankType)
        {
            DisplayTop3Cross();
            scrollerControllerCross.m_Scorller.RefreshActiveCellViews();
            DisplayMyRankCross();
        }
    }
}
Main/System/CrossServer/CrossServerBaseManager.cs
@@ -8,6 +8,10 @@
public class CrossServerBaseManager : GameSystemManager<CrossServerBaseManager>
{
    public Dictionary<int, CrossZoneInfo> crossZoneInfoDict = new Dictionary<int, CrossZoneInfo>();
    // 跨服状态更新事件,参数为mapID
    public event Action<int> OnCrossZoneInfoUpdateEvent;
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitialize;
@@ -32,7 +36,8 @@
            ServerIDList = netPack.ServerIDList,
            CrossServerID = netPack.CrossServerID
        };
        OnCrossZoneInfoUpdateEvent?.Invoke((int)netPack.MapID);
    }
    // 没有数据代表不在跨服中,群英有个特殊约定zoneid等于0代表结算中