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