Main/Config/ConfigManager.cs
@@ -75,7 +75,8 @@ typeof(TreasureSetConfig), typeof(TreeLVConfig), typeof(WindowSearchConfig), typeof(XBGetItemConfig) typeof(XBGetItemConfig), typeof(ZhanlingConfig) }; #if UNITY_EDITOR @@ -301,6 +302,8 @@ ClearConfigDictionary<WindowSearchConfig>(); // 清空 XBGetItemConfig 字典 ClearConfigDictionary<XBGetItemConfig>(); // 清空 ZhanlingConfig 字典 ClearConfigDictionary<ZhanlingConfig>(); } #if UNITY_EDITOR Main/Config/Configs/ZhanlingConfig.cs
New file @@ -0,0 +1,56 @@ //-------------------------------------------------------- // [Author]: YYL // [ Date ]: Tuesday, November 4, 2025 //-------------------------------------------------------- using System.Collections.Generic; using System; using UnityEngine; using LitJson; public partial class ZhanlingConfig : ConfigBase<int, ZhanlingConfig> { static ZhanlingConfig() { // 访问过静态构造函数 visit = true; } public int ZhanlingId; public int ZhanlingType; public int NeedValue; public int RewardIndex; public int[][] FreeRewardItemList; public int[][] ZLRewardItemList; public int[][] ZLRewardItemListH; public override int LoadKey(string _key) { int key = GetKey(_key); return key; } public override void LoadConfig(string input) { try { string[] tables = input.Split('\t'); int.TryParse(tables[0],out ZhanlingId); int.TryParse(tables[1],out ZhanlingType); int.TryParse(tables[2],out NeedValue); int.TryParse(tables[3],out RewardIndex); FreeRewardItemList = JsonMapper.ToObject<int[][]>(tables[4].Replace("(", "[").Replace(")", "]")); ZLRewardItemList = JsonMapper.ToObject<int[][]>(tables[5].Replace("(", "[").Replace(")", "]")); ZLRewardItemListH = JsonMapper.ToObject<int[][]>(tables[6].Replace("(", "[").Replace(")", "]")); } catch (Exception exception) { Debug.LogError(exception); } } } Main/Config/Configs/ZhanlingConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 0a982bd9a3eaef84fa25269ec4301050 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Config/PartialConfigs/ZhanlingConfig.cs
New file @@ -0,0 +1,25 @@ using System.Collections.Generic; public partial class ZhanlingConfig : ConfigBase<int, ZhanlingConfig> { //战令类型: 所需值 :ZhanlingId static Dictionary<int, Dictionary<int, int>> typeToIDDict = new Dictionary<int, Dictionary<int, int>>(); protected override void OnConfigParseCompleted() { if (!typeToIDDict.ContainsKey(ZhanlingType)) { typeToIDDict[ZhanlingType] = new Dictionary<int, int>(); } typeToIDDict[ZhanlingType][NeedValue] = ZhanlingId; } public static Dictionary<int, int> GetTypeToIDDict(int zhanLingType) { return typeToIDDict[zhanLingType]; } public static Dictionary<int, Dictionary<int, int>> GetAllTypeToIDListDict() { return typeToIDDict; } } Main/Config/PartialConfigs/ZhanlingConfig.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 8aa62178ddc66b2479b841083ee2b290 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB120_tagMCZhanlingInfo.cs
@@ -1,11 +1,12 @@ using UnityEngine; using System.Collections; using UnityEngine; using System.Collections; // B1 20 战令信息 #tagMCZhanlingInfo public class DTCB120_tagMCZhanlingInfo : DtcBasic { public override void Done(GameNetPackBasic vNetPack) { base.Done(vNetPack); HB120_tagMCZhanlingInfo vNetData = vNetPack as HB120_tagMCZhanlingInfo; BattlePassManager.Instance.UpdateBattlePassInfo(vNetData); } } Main/Main.cs
@@ -82,6 +82,7 @@ managers.Add(BoneFieldManager.Instance); managers.Add(ArenaManager.Instance); managers.Add(DayMissionManager.Instance); managers.Add(BattlePassManager.Instance); foreach (var manager in managers) { Main/System/BattlePass.meta
New file @@ -0,0 +1,8 @@ fileFormatVersion: 2 guid: 7f66ce03cd8564847bcbc69378d900d9 folderAsset: yes DefaultImporter: externalObjects: {} userData: assetBundleName: assetBundleVariant: Main/System/BattlePass/BattlePassManager.Week.cs
New file @@ -0,0 +1,31 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Linq; //周战令 public partial class BattlePassManager : GameSystemManager<BattlePassManager> { public const int WeekBattlePassType = 6; Redpoint redpoint = new Redpoint(MainRedDot.RedPoint_DailyKey, MainRedDot.RedPoint_WeekBPFuncKey); void UpdateWeekRedPoint() { redpoint.state = RedPointState.None; //购买,活跃 battlePassDataDict.TryGetValue(WeekBattlePassType, out BattlePassData battlePassData); if (battlePassData == null) return; if (HasAnyAward(WeekBattlePassType, (int)battlePassData.value1)) { redpoint.state = RedPointState.Simple; } } } Main/System/BattlePass/BattlePassManager.Week.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: ed678a9060fddbf41adb9d9102d62514 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/BattlePass/BattlePassManager.cs
New file @@ -0,0 +1,277 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Linq; public partial class BattlePassManager : GameSystemManager<BattlePassManager> { //战令类型:战令数据 Dictionary<int, BattlePassData> battlePassDataDict = new Dictionary<int, BattlePassData>(); public event Action<int> BattlePassDataUpdateEvent; Dictionary<int, int[]> buyZhanlingTypeDict = new Dictionary<int, int[]>(); public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; ParseConfig(); } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; } void OnBeforePlayerDataInitialize() { battlePassDataDict.Clear(); } void ParseConfig() { var config = FuncConfigConfig.Get("Zhanling"); buyZhanlingTypeDict = ConfigParse.ParseIntArrayDict(config.Numerical1); } public void UpdateBattlePassInfo(HB120_tagMCZhanlingInfo netPack) { if (!battlePassDataDict.ContainsKey(netPack.ZhanlingType)) { battlePassDataDict[netPack.ZhanlingType] = new BattlePassData(); } BattlePassData battlePassData = battlePassDataDict[netPack.ZhanlingType]; battlePassData.isActivite = netPack.IsActivite; battlePassData.isActiviteH = netPack.IsActiviteH; battlePassData.allFinishTime = netPack.AllFinishTime; battlePassData.value1 = netPack.Value1; for (int i = 0; i < netPack.RewardCount; i++) { HB120_tagMCZhanlingInfo.tagMCZhanling reward = netPack.RewardList[i]; if (!battlePassData.battlePassCellDict.ContainsKey((int)reward.NeedValue)) { battlePassData.battlePassCellDict[(int)reward.NeedValue] = new BattlePassCell(); } BattlePassCell battlePassCell = battlePassData.battlePassCellDict[(int)reward.NeedValue]; battlePassCell.freeRewardState = reward.FreeRewardState; battlePassCell.zlRewardState = reward.ZLRewardState; battlePassCell.zlRewardStateH = reward.ZLRewardStateH; } UpdateRedpoint(netPack.ZhanlingType); BattlePassDataUpdateEvent?.Invoke(netPack.ZhanlingType); } void UpdateRedpoint(int type) { switch (type) { case WeekBattlePassType: { UpdateWeekRedPoint(); break; } } } //是否有任何奖励可以领取 public bool HasAnyAward(int type, int totalValue) { battlePassDataDict.TryGetValue(type, out BattlePassData battlePassData); if (battlePassData == null) return false; if (battlePassData.allFinishTime != 0) return false; var allZhanling = ZhanlingConfig.GetTypeToIDDict(type); var keys = allZhanling.Keys.ToList(); keys.Sort(); foreach (var needValue in keys) { if (totalValue < needValue) { return false; } if (battlePassData.battlePassCellDict.ContainsKey(needValue)) { if (battlePassData.battlePassCellDict[needValue].freeRewardState == 0) { return true; } else if (battlePassData.isActivite != 0 && battlePassData.battlePassCellDict[needValue].zlRewardState == 0) { return true; } else if (battlePassData.isActiviteH != 0 && battlePassData.battlePassCellDict[needValue].zlRewardStateH == 0) { return true; } } } return false; } /// <summary> /// 是否有某个奖励可以领取 /// </summary> /// <param name="battlePassData"></param> /// <param name="totalValue"></param> /// <param name="needValue"></param> /// <param name="awardType">0 免费 1 普通 2 高级</param> /// <returns>0 未达标 1 可领取 2 已领取</returns> public int GetBPCellAwardState(BattlePassData battlePassData, int totalValue, int needValue, int awardType) { if (totalValue < needValue) { return 0; } if (battlePassData.battlePassCellDict.ContainsKey(needValue)) { switch (awardType) { case 0: { return battlePassData.battlePassCellDict[needValue].freeRewardState == 0 ? 1 : 2; } case 1: { if (battlePassData.isActivite != 0) { return battlePassData.battlePassCellDict[needValue].zlRewardState == 0 ? 1 : 2; } break; } case 2: { if (battlePassData.isActiviteH != 0) { return battlePassData.battlePassCellDict[needValue].zlRewardStateH == 0 ? 1 : 2; } break; } } } return 0; } public int GetCTGIDByType(int type) { if (buyZhanlingTypeDict.ContainsKey(type)) { return buyZhanlingTypeDict[type][0]; } return 0; } public BattlePassData GetBattlePassData(int type) { if (battlePassDataDict.ContainsKey(type)) { return battlePassDataDict[type]; } return null; } //发包 type 0-免费;1-普通战令;2-高级战令 public void SendGetGift(int zhanLingType, int needValue, int type) { var pak = new CA504_tagCMPlayerGetReward(); string dataExStr = (needValue * 10 + type).ToString(); pak.RewardType = (byte)65; pak.DataEx = (uint)zhanLingType; pak.DataExStrLen = (byte)dataExStr.Length; pak.DataExStr = dataExStr; GameNetSystem.Instance.SendInfo(pak); } //一次性全领取 public void GetAllAward(BattlePassData battlePassData, int zhanLingType, int totalValue) { //简单判断背包 if (PackManager.Instance.GetEmptyGridCount(PackType.Item) <= 1) { SysNotifyMgr.Instance.ShowTip("GeRen_lhs_202580"); return; } var ids = ZhanlingConfig.GetTypeToIDDict(zhanLingType).Values.ToList(); ids.Sort(); foreach (var id in ids) { var config = ZhanlingConfig.Get(id); if (config.NeedValue > totalValue) { break; } for (int i = 0; i < 3; i++) { var state = GetBPCellAwardState(battlePassData, totalValue, config.NeedValue, i); if (state == 1) { SendGetGift(zhanLingType, config.NeedValue, i); } } } } public int JumpIndex(BattlePassData battlePassData, int zhanLingType, int totalValue) { var ids = ZhanlingConfig.GetTypeToIDDict(zhanLingType).Values.ToList(); ids.Sort(); int index = -1; foreach (var id in ids) { index++; var config = ZhanlingConfig.Get(id); if (config.NeedValue > totalValue) { return index - 1; } for (int i = 0; i < 3; i++) { var state = GetBPCellAwardState(battlePassData, totalValue, config.NeedValue, i); if (state == 1) { return index; } } } return index; } } public class BattlePassCell { public byte freeRewardState; // 免费战令奖励是否已领取 public byte zlRewardState; // 普通战令奖励是否已领取 public byte zlRewardStateH; // 高级战令奖励是否已领取 } public class BattlePassData { public byte isActivite; // 普通战令是否已激活 public byte isActiviteH; // 高级战令是否已激活 public uint allFinishTime; // 全部奖励领取完毕的时间戳,未完毕时该值为0,后端会在0点过天时检查可否重置,前端自行做倒计时表现即可 public uint value1; // 战令对应的自定义值,可选,如登录战令代表开始计算日期时间戳 public Dictionary<int, BattlePassCell> battlePassCellDict = new Dictionary<int, BattlePassCell>(); } Main/System/BattlePass/BattlePassManager.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 973e17d74c0fddf43b8085d369f35feb MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/DayMission/DayMissionBaseWin.cs
@@ -22,11 +22,12 @@ break; case 1: //周奖励 // currentSubUI = UIManager.Instance.OpenWindow<HeroCollectionWin>(); currentSubUI = UIManager.Instance.OpenWindow<WeekBattlePassWin>(); titleText.text = Language.Get("DayMission3"); break; case 2: //主线任务(英雄之路) currentSubUI = UIManager.Instance.OpenWindow<DayMissionWin>(); titleText.text = Language.Get("DayMission4"); break; default: Main/System/DayMission/DayMissionManager.cs
@@ -20,7 +20,7 @@ public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; GlobalTimeEvent.Instance.MS100Event += OnMSEvent; ParseConfig(); } @@ -28,7 +28,7 @@ public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; GlobalTimeEvent.Instance.MS100Event -= OnMSEvent; } void OnBeforePlayerDataInitialize() @@ -39,7 +39,7 @@ taskProcessDict.Clear(); } void OnSecondEvent() void OnMSEvent() { if (isRefreshDayMission) { Main/System/DayMission/WeekBattlePassCell.cs
New file @@ -0,0 +1,88 @@ using System; using System.Linq; using UnityEngine; using UnityEngine.UI; public class WeekBattlePassCell : CellView { [SerializeField] ItemCell baseAward; [SerializeField] Transform baseGotRect; [SerializeField] Transform baseCanGetAwardRect; [SerializeField] Transform upProcssBGRect; [SerializeField] Transform upProcessRect; [SerializeField] Transform downProcssBGRect; [SerializeField] Transform downProcessRect; [SerializeField] Text valueText; [SerializeField] Image valueBGImg; [SerializeField] ItemCell[] betterAwards; [SerializeField] Transform[] betterGotRects; [SerializeField] Transform[] betterCanGetAwardRects; [SerializeField] Transform[] betterLockRects; [SerializeField] Transform mask; public void Display(int id, BattlePassData battlePassData) { var config = ZhanlingConfig.Get(id); int freeItemID = config.FreeRewardItemList[0][0]; baseAward.Init(new ItemCellModel(freeItemID, false, config.FreeRewardItemList[0][1])); var baseAwardState = BattlePassManager.Instance.GetBPCellAwardState(battlePassData, (int)battlePassData.value1, config.NeedValue, 0); baseAward.button.AddListener(() => { GetAward(battlePassData, baseAwardState, freeItemID); }); baseGotRect.SetActive(baseAwardState == 2); baseCanGetAwardRect.SetActive(baseAwardState == 1); mask.SetActive(baseAwardState == 0); var ids = ZhanlingConfig.GetTypeToIDDict(BattlePassManager.WeekBattlePassType).Values.ToList(); ids.Sort(); upProcssBGRect.SetActive(ids[0] != id); upProcessRect.SetActive(baseAwardState != 0); downProcssBGRect.SetActive(ids[ids.Count - 1] != id); var nextConfig = ZhanlingConfig.Get(id + 1); if (nextConfig != null) { downProcessRect.SetActive((int)battlePassData.value1 >= nextConfig.NeedValue); } else { downProcessRect.SetActive(false); } valueText.text = config.NeedValue.ToString(); valueBGImg.SetOrgSprite(baseAwardState == 0 ? "DayMission_img_99" : "DayMission_img_100", "DayMission"); var betterAwardState = BattlePassManager.Instance.GetBPCellAwardState(battlePassData, (int)battlePassData.value1, config.NeedValue, 1); for (int i = 0; i < betterAwards.Length; i++) { int itemID = config.ZLRewardItemList[i][0]; betterAwards[i].Init(new ItemCellModel(itemID, false, config.ZLRewardItemList[i][1])); betterAwards[i].button.AddListener(() => { GetAward(battlePassData, betterAwardState, itemID); }); betterGotRects[i].SetActive(betterAwardState == 2); betterCanGetAwardRects[i].SetActive(betterAwardState == 1); betterLockRects[i].SetActive(battlePassData.isActivite == 0); } } void GetAward(BattlePassData battlePassData, int awardState, int itemID) { if (awardState != 1) { ItemTipUtility.Show(itemID); return; } BattlePassManager.Instance.GetAllAward(battlePassData, BattlePassManager.WeekBattlePassType, (int)battlePassData.value1); } } Main/System/DayMission/WeekBattlePassCell.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 22ee6f5381c87b443a607448c096a1af MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/DayMission/WeekBattlePassWin.cs
New file @@ -0,0 +1,116 @@ using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; //周战令 public class WeekBattlePassWin : UIBase { [SerializeField] Text totalActivityText; [SerializeField] Text timeText; [SerializeField] ScrollerController scroller; [SerializeField] Transform lockRect; [SerializeField] Button buyBtn; [SerializeField] Text buyText; BattlePassData battlePassData; protected override void InitComponent() { buyBtn.AddListener(() => { RechargeManager.Instance.CTG(BattlePassManager.Instance.GetCTGIDByType(BattlePassManager.WeekBattlePassType)); }); } protected override void OnPreOpen() { battlePassData = BattlePassManager.Instance.GetBattlePassData(BattlePassManager.WeekBattlePassType); if (battlePassData == null) return; scroller.OnRefreshCell += OnRefreshCell; GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; BattlePassManager.Instance.BattlePassDataUpdateEvent += BattlePassDataUpdateEvent; CreateScroller(); Display(); } protected override void OnPreClose() { scroller.OnRefreshCell -= OnRefreshCell; GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; BattlePassManager.Instance.BattlePassDataUpdateEvent -= BattlePassDataUpdateEvent; } void OnSecondEvent() { //按开服天 7天一个循环 var day = 7 - (TimeUtility.OpenDay % 7) - 1; if (day == 0) { timeText.text = Language.Get("GoldRush29") + TimeUtility.SecondsToShortDHMS((int)(TimeUtility.GetTodayEndTime() - TimeUtility.ServerNow).TotalSeconds); } else { timeText.text = Language.Get("GoldRush29") + day + Language.Get("L1074"); } } void BattlePassDataUpdateEvent(int type) { if (type == BattlePassManager.WeekBattlePassType) { Display(); } } void Display() { totalActivityText.text = battlePassData.value1.ToString(); lockRect.SetActive(battlePassData.isActivite == 0); scroller.m_Scorller.RefreshActiveCellViews(); if (battlePassData.isActivite == 0) { var ctgID = BattlePassManager.Instance.GetCTGIDByType(BattlePassManager.WeekBattlePassType); RechargeManager.Instance.TryGetOrderInfo(ctgID, out var orderInfoConfig); buyText.text = Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNumOnSale); buyBtn.SetInteractable(true); } else { buyText.text = Language.Get("L1133"); buyBtn.SetInteractable(false); } } void CreateScroller() { scroller.Refresh(); var values = ZhanlingConfig.GetTypeToIDDict(BattlePassManager.WeekBattlePassType).Values.ToList(); values.Sort(); for (int i = 0; i < values.Count; i++) { scroller.AddCell(ScrollerDataType.Header, values[i]); } scroller.Restart(); scroller.JumpIndex(BattlePassManager.Instance.JumpIndex(battlePassData, BattlePassManager.WeekBattlePassType, (int)battlePassData.value1)); } void OnRefreshCell(ScrollerDataType type, CellView cell) { var _cell = cell as WeekBattlePassCell; _cell.Display(cell.index, battlePassData); } } Main/System/DayMission/WeekBattlePassWin.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: e87e9af324b150d4fb0c3f0732593f2b MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: