From 2dd1841d03a730d3d369092c2a3ad656cee4bf64 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期四, 07 五月 2026 15:11:38 +0800
Subject: [PATCH] 512 跨服演武场

---
 Main/System/Arena/ArenaPlayerTop3Cell.cs                                      |   20 +
 Main/System/Arena/ArenaCrossAwardCell.cs.meta                                 |   11 
 Main/System/CrossServer/CrossServerBaseManager.cs                             |    7 
 Main/System/Arena/ArenaCrossAwardWin.cs.meta                                  |   11 
 Main/System/Arena/ArenaCrossAwardCell.cs                                      |   69 ++++
 Main/System/Arena/ArenaRecordCell.cs                                          |   37 ++
 Main/System/Arena/ArenaBattleVictoryWin.cs                                    |    3 
 Main/System/Arena/ArenaChallengeCell.cs                                       |   25 +
 Main/System/Arena/ArenaPlayerRankCell.cs                                      |   26 +
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs |    2 
 Main/System/Arena/ArenaBattleFailWin.cs                                       |    3 
 Main/System/Arena/ArenaManager.cs                                             |  197 +++++++++++++
 Main/System/Arena/ArenaWin.cs                                                 |  223 ++++++++++++++-
 Main/System/Arena/ArenaCrossAwardWin.cs                                       |  192 +++++++++++++
 14 files changed, 797 insertions(+), 29 deletions(-)

diff --git a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs
index 2b09559..4a64ebd 100644
--- a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA922_tagSCArenaMatchList.cs
+++ b/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;
     }
 
 }
diff --git a/Main/System/Arena/ArenaBattleFailWin.cs b/Main/System/Arena/ArenaBattleFailWin.cs
index 1ddaa6a..c521db5 100644
--- a/Main/System/Arena/ArenaBattleFailWin.cs
+++ b/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;
diff --git a/Main/System/Arena/ArenaBattleVictoryWin.cs b/Main/System/Arena/ArenaBattleVictoryWin.cs
index 50311df..1b1a4e0 100644
--- a/Main/System/Arena/ArenaBattleVictoryWin.cs
+++ b/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;
diff --git a/Main/System/Arena/ArenaChallengeCell.cs b/Main/System/Arena/ArenaChallengeCell.cs
index 97fc548..da67da5 100644
--- a/Main/System/Arena/ArenaChallengeCell.cs
+++ b/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;
diff --git a/Main/System/Arena/ArenaCrossAwardCell.cs b/Main/System/Arena/ArenaCrossAwardCell.cs
new file mode 100644
index 0000000..e79fa7e
--- /dev/null
+++ b/Main/System/Arena/ArenaCrossAwardCell.cs
@@ -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));
+            }
+        }
+    }
+}
diff --git a/Main/System/Arena/ArenaCrossAwardCell.cs.meta b/Main/System/Arena/ArenaCrossAwardCell.cs.meta
new file mode 100644
index 0000000..45cac21
--- /dev/null
+++ b/Main/System/Arena/ArenaCrossAwardCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: db50e766c48693241827170a23113478
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Arena/ArenaCrossAwardWin.cs b/Main/System/Arena/ArenaCrossAwardWin.cs
new file mode 100644
index 0000000..68cc462
--- /dev/null
+++ b/Main/System/Arena/ArenaCrossAwardWin.cs
@@ -0,0 +1,192 @@
+using System;
+using System.Linq;
+using UnityEngine;
+
+/// <summary>
+/// 绔炴妧鍦哄鍔辩獥鍙o細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);
+    }
+}
diff --git a/Main/System/Arena/ArenaCrossAwardWin.cs.meta b/Main/System/Arena/ArenaCrossAwardWin.cs.meta
new file mode 100644
index 0000000..51535a4
--- /dev/null
+++ b/Main/System/Arena/ArenaCrossAwardWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f638d0723d6fc9347ac43f23a5a2f944
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Arena/ArenaManager.cs b/Main/System/Arena/ArenaManager.cs
index cd9cdaa..d82cdd9 100644
--- a/Main/System/Arena/ArenaManager.cs
+++ b/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; // 鎴樻枟鑳藉垏鎹㈤〉绛惧姛鑳絀D
@@ -26,6 +28,8 @@
     public Dictionary<int, int[][]> dailyRankRewards; // 姣忔棩鎺掕濂栧姳 {"鍚嶆":[[鐗╁搧ID, 涓暟,鏄惁鎷嶅搧], ...], ...} 閰嶇疆鐨勫悕娆ey锛岃嚜鍔ㄦ寜灏忎簬绛変簬瀵瑰簲鍚嶆缁欏鍔�
     public Dictionary<int, int[][]> seasonRankRewards;  // 璧涘鎺掕濂栧姳 {"鍚嶆":[[鐗╁搧ID, 涓暟,鏄惁鎷嶅搧], ...], ...}
 
+    public Dictionary<int, int> crossRewardTemps;//鏁板��2锛氳法鏈嶈禌瀛f帓琛屽鍔辨ā鐗� {"浜掗�氭湇鍔″櫒鏁�";瀵瑰簲娲诲姩鎺掕濂栧姳琛ㄦā鐗堢紪鍙�, ...}  鎸夊皬浜庣瓑浜庡垽鏂紝澶т簬鏈�澶ч厤缃殑鏈嶅姟鍣ㄦ暟鏃堕粯璁ゅ彇閰嶇疆涓渶澶ф湇鍔″櫒鏁板搴斿鍔�
+    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];
+            }
+        }
+
+        // 濡傛灉娌℃湁鍖归厤鐨刱ey锛坰erverCount灏忎簬鎵�鏈夐厤缃殑key锛夛紝鍙栨渶灏弅ey瀵瑰簲鐨勫鍔�
+        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>
+    /// 鑾峰緱褰撳墠璧涘鐨勮捣姝㈡棩鏈燂紙璺ㄦ湇鐗堟湰锛夈�傝禌瀛d粠鍛ㄤ竴 00:00:00 寮�濮嬶紝鍒板懆鏃� 23:59:59 缁撴潫銆�
+    /// 鏈嶅姟绔畾涔夊懆涓�涓烘瘡鍛ㄧ殑绗竴澶┿��
+    /// </summary>
+    /// <param name="zoneID">璺ㄦ湇zoneID锛�0琛ㄧず鏈湇鏃堕棿锛岄潪0琛ㄧず璺ㄦ湇鏃堕棿</param>
+    /// <param name="seasonStartDate">杈撳嚭鍙傛暟锛氳禌瀛g殑璧峰鏃ユ湡锛堟湰鍛ㄤ竴 00:00:00锛�</param>
+    /// <param name="seasonEndDate">杈撳嚭鍙傛暟锛氳禌瀛g殑缁撴潫鏃ユ湡锛堟湰鍛ㄦ棩 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;          //鏄惁璺ㄦ湇璁板綍
 
 }
\ No newline at end of file
diff --git a/Main/System/Arena/ArenaPlayerRankCell.cs b/Main/System/Arena/ArenaPlayerRankCell.cs
index d4f1d64..760ec17 100644
--- a/Main/System/Arena/ArenaPlayerRankCell.cs
+++ b/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 浠h〃鐜╁鑷繁
     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);
             });
         }
     }
diff --git a/Main/System/Arena/ArenaPlayerTop3Cell.cs b/Main/System/Arena/ArenaPlayerTop3Cell.cs
index 3df9027..5296485 100644
--- a/Main/System/Arena/ArenaPlayerTop3Cell.cs
+++ b/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);
diff --git a/Main/System/Arena/ArenaRecordCell.cs b/Main/System/Arena/ArenaRecordCell.cs
index 44eecf6..419044a 100644
--- a/Main/System/Arena/ArenaRecordCell.cs
+++ b/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())
+        {
+            // 璺ㄦ湇鏍峰紡锛歵xtDate闅愯棌锛宼xtCrossDate鍜宼xtServerName鏄剧ず
+            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
+        {
+            // 姝e父鏍峰紡锛歵xtDate鏄剧ず锛宼xtCrossDate鍜宼xtServerName闅愯棌
+            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);
diff --git a/Main/System/Arena/ArenaWin.cs b/Main/System/Arena/ArenaWin.cs
index c5da720..9a437fa 100644
--- a/Main/System/Arena/ArenaWin.cs
+++ b/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);
-        
-    }
+        // 鍦╞ase.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();
+        }
     }
 }
diff --git a/Main/System/CrossServer/CrossServerBaseManager.cs b/Main/System/CrossServer/CrossServerBaseManager.cs
index d08c743..147016c 100644
--- a/Main/System/CrossServer/CrossServerBaseManager.cs
+++ b/Main/System/CrossServer/CrossServerBaseManager.cs
@@ -8,6 +8,10 @@
 public class CrossServerBaseManager : GameSystemManager<CrossServerBaseManager>
 {
     public Dictionary<int, CrossZoneInfo> crossZoneInfoDict = new Dictionary<int, CrossZoneInfo>();
+    
+    // 璺ㄦ湇鐘舵�佹洿鏂颁簨浠讹紝鍙傛暟涓簃apID
+    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);
     }
 
     // 娌℃湁鏁版嵁浠h〃涓嶅湪璺ㄦ湇涓紝缇よ嫳鏈変釜鐗规畩绾﹀畾zoneid绛変簬0浠h〃缁撶畻涓�

--
Gitblit v1.8.0