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/ArenaManager.cs |  197 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 195 insertions(+), 2 deletions(-)

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

--
Gitblit v1.8.0