using System; using System.Collections.Generic; using System.Linq; using LitJson; using UnityEngine; public class TianziBillboradManager : GameSystemManager { public readonly int rankType = 2; // 榜单类型 public readonly int funcId = 39; // 功能Id public readonly int DataMapID = 30020; public int nowTabIndex; // 0 排行榜 1 奖励 public byte todayLineID; //今日是哪个lineID,对应副本表的功能线路ID public ulong historyHurt; //本考验历史最大伤害 public ulong todayHurt; //本考验今日最大伤害 public bool isSkipSweepTip = false; public event Action UpdateTianziKYInfoExent; public Action PlayUiEffectAction; public Dictionary rankAwards;// 每日排行奖励 {"名次":[[物品ID, 个数,是否拍品], ...], ...} 配置的名次key,自动按小于等于对应名次给奖励 public Redpoint parentRedpoint = new Redpoint(MainRedDot.MainChallengeRedpoint, MainRedDot.TianziBillboradRepoint); public override void Init() { EventBroadcast.Instance.AddListener(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); EventBroadcast.Instance.AddListener(EventName.BATTLE_END, OnSettlement); DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent; DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent; AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent; FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; TimeMgr.Instance.OnDayEvent += OnDayEvent; UpdateTianziKYInfoExent += OnUpdateTianziKYInfoExent; FuncConfigConfig config = FuncConfigConfig.Get("TianziBillboradAward"); rankAwards = ConfigParse.ParseIntArray2Dict(config.Numerical1); } public override void Release() { EventBroadcast.Instance.RemoveListener(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); EventBroadcast.Instance.RemoveListener(EventName.BATTLE_END, OnSettlement); DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent; DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent; AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent; FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; TimeMgr.Instance.OnDayEvent -= OnDayEvent; UpdateTianziKYInfoExent -= OnUpdateTianziKYInfoExent; } private void OnBeforePlayerDataInitializeEvent() { nowTabIndex = 0; todayLineID = 0; historyHurt = 0; todayHurt = 0; ClearBar(); isSkipSweepTip = false; } public int battleLineID; //正在战斗中的LineID public ulong loaclNowHunt = 0; public ulong loaclAllHunt = 0; public ulong loaclMaxHp = 0; public int loaclHpNum = 0; public event Action OnUpdateBarInfoEvent; private void OnDamageTaken(BattleDmgInfo info) { BattleField battleField = BattleManager.Instance.GetBattleFieldByMapID(DataMapID); if (info == null || battleField == null || battleField.guid != info.battleFieldGuid) return; BattleObject boss = battleField.FindBoss(); if (boss == null || boss.ObjID != info.hurtObj.ObjID) return; ShowBar(info); } public void ShowBar(BattleDmgInfo info) { if (info == null) return; //闪避和回血类不算伤害 if (info.IsType(DamageType.Dodge) || info.IsType(DamageType.Recovery)) return; var damages = info.damageList; for (int i = 0; i < damages.Count; i++) { ulong hunt = (ulong)damages[i]; loaclAllHunt += hunt; if (!TryGetBossConfig(DataMapID, battleLineID, out DungeonConfig dungeonConfig, out NPCLineupConfig npcLineupConfig, out NPCConfig npcConfig)) return; int bossId = npcConfig.NPCID; if (!TianziConfig.TryGetTianziConfigByBossIDAndDamage(bossId, loaclAllHunt, out TianziConfig tianziConfig)) return; loaclMaxHp = (ulong)tianziConfig.MaxHP; loaclHpNum = tianziConfig.HPNum; loaclNowHunt = TianziConfig.GetCurrentHPDamage(bossId, loaclAllHunt); OnUpdateBarInfoEvent?.Invoke(loaclNowHunt, loaclMaxHp, loaclHpNum); //Debug.Log($"TianziDamageBar hunt {hunt} loaclAllHunt {loaclNowHunt} loaclMaxHp {loaclMaxHp} loaclHpNum {loaclHpNum} 时间: {DateTime.Now:HH:mm:ss}"); } } public void ClearBar() { battleLineID = 0; loaclNowHunt = 0; loaclAllHunt = 0; loaclMaxHp = 0; loaclHpNum = 0; } private void OnSettlement(string _guid, JsonData data) { if (string.Empty == _guid) return; var battle = BattleManager.Instance.GetBattleField(_guid); if (battle == null) return; var battleName = battle.ToString(); if (battleName != "TianziBillboradBattleField") return; if (data == null || !data.ContainsKey("totalHurt")) return; ulong totalHurt = ulong.Parse(data["totalHurt"].ToString()); if (!TryGetBossConfig(DataMapID, battleLineID, out DungeonConfig dungeonConfig, out NPCLineupConfig npcLineupConfig, out NPCConfig npcConfig)) return; int bossId = npcConfig.NPCID; if (!TianziConfig.TryGetTianziConfigByBossIDAndDamage(bossId, totalHurt, out TianziConfig tianziConfig)) return; ulong endNowHunt = TianziConfig.GetCurrentHPDamage(bossId, totalHurt); ulong endMaxHp = (ulong)tianziConfig.MaxHP; int endHpNum = tianziConfig.HPNum; OnUpdateBarInfoEvent?.Invoke(endNowHunt, endMaxHp, endHpNum); //Debug.Log($"TianziDamageBar end nowHpNum {endHpNum} nowHunt {endNowHunt} nowHpMax{endMaxHp} 时间: {DateTime.Now:HH:mm:ss}"); } private void OnUpdateTianziKYInfoExent() { UpdateRedPoint(); } private void OnFuncStateChangeEvent(int obj) { if (obj != funcId) return; UpdateRedPoint(); } private void OnDayEvent() { UpdateRedPoint(); } private void OnUpdateFBInfoChangeEvent(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange) { int dataMapID = DataMapID; if (mapID != dataMapID) return; if (isADAddCntChange) return; UpdateRedPoint(); } private void OnAdsInfoListUpdateEvent(int id, int mapId) { if (mapId != DataMapID) return; UpdateRedPoint(); } public void UpdateRedPoint() { parentRedpoint.state = RedPointState.None; if (!FuncOpen.Instance.IsFuncOpen(funcId)) return; int remainChallageCount = GetRemainChallageCount(); if (remainChallageCount > 0) { parentRedpoint.state = RedPointState.Simple; } } public int GetRemainChallageCount() { if (!DungeonManager.Instance.TryGetFBInfoByMapID(DataMapID, out FBInfo fbInfo)) return 0; if (!DungeonOpenTimeConfig.HasKey(DataMapID)) return 0; DungeonOpenTimeConfig dungeonOpenTimeConfig = DungeonOpenTimeConfig.Get(DataMapID); int baseCount = dungeonOpenTimeConfig.DayTimes + dungeonOpenTimeConfig.PayCntMax; int realMaxCount = baseCount + fbInfo.ADAddCnt + fbInfo.BuyAddCnt + fbInfo.ItemAddCnt; return realMaxCount - fbInfo.EnterCnt; } public List GetBossIDList(int dataMapID) { if (!DungeonConfig.TryGetDictByMapID(dataMapID, out Dictionary dict)) return new List(); List list = dict.Keys.ToList(); list.Sort(); List res = new List(); for (int i = 0; i < list.Count; i++) { int dungeonId = dict[list[i]]; int lineupID = DungeonConfig.Get(dungeonId).LineupIDList[0]; if (!NPCLineupConfig.HasKey(lineupID)) continue; NPCLineupConfig npcLineupConfig = NPCLineupConfig.Get(lineupID); int bossId = npcLineupConfig.BossID; if (!res.Contains(bossId)) res.Add(bossId); } return res; } public bool TryGetADAwardConfigByMapId(int dataMapID, out ADAwardConfig adAwardConfig) { adAwardConfig = null; if (!ADAwardConfig.TryGetADIDByADMapID(dataMapID, out int adID) || !ADAwardConfig.HasKey(adID)) return false; adAwardConfig = ADAwardConfig.Get(adID); return true; } public bool TryGetBossConfig(int dataMapID, int lineID, out DungeonConfig dungeonConfig, out NPCLineupConfig npcLineupConfig, out NPCConfig npcConfig) { dungeonConfig = null; npcLineupConfig = null; npcConfig = null; if (!DungeonConfig.TryGetDungeonID(dataMapID, lineID, out int dungeonID) || !DungeonConfig.HasKey(dungeonID)) return false; dungeonConfig = DungeonConfig.Get(dungeonID); int lineupID = dungeonConfig.LineupIDList[0]; if (!NPCLineupConfig.HasKey(lineupID)) return false; npcLineupConfig = NPCLineupConfig.Get(lineupID); int bossId = npcLineupConfig.BossID; if (!NPCConfig.HasKey(bossId)) return false; npcConfig = NPCConfig.Get(bossId); return true; } public int[][] GetPossibleRewards(int bossID) { if (!TianziConfig.TryGetAllInfoDictByBossID(bossID, out Dictionary dict)) return new int[0][]; List itemIds = new List(); foreach (var item in dict.Values) { int[][] award = item.RandWeightItemList; for (int i = 0; i < award.Length; i++) { int itemId = award[i][1]; if (!itemIds.Contains(itemId)) { itemIds.Add(itemId); } } } // 根据物品品质排序,品质高的排在前面 itemIds.Sort((itemId1, itemId2) => { var itemConfig1 = ItemConfig.Get(itemId1); var itemConfig2 = ItemConfig.Get(itemId2); if (itemConfig1 == null && itemConfig2 == null) return 0; if (itemConfig1 == null) return -1; if (itemConfig2 == null) return 1; return itemConfig2.ItemColor.CompareTo(itemConfig1.ItemColor); }); // 转换为 int[itemID][数量(0)] 格式 int[][] result = new int[itemIds.Count][]; for (int i = 0; i < itemIds.Count; i++) { result[i] = new int[] { itemIds[i], 0 }; } return result; } /// /// 计算扫荡能获得箱子数量 /// /// 伤害值 /// 能获得的箱子数量 public int CalculateSweepBoxCount(ulong damage) { if (!TryGetBossConfig(DataMapID, todayLineID, out DungeonConfig dungeonConfig, out NPCLineupConfig npcLineupConfig, out NPCConfig npcConfig)) return 0; int bossID = npcLineupConfig.BossID; if (!TianziConfig.TryGetAllInfoDictByBossID(bossID, out Dictionary hpDict)) return 0; int boxCount = 0; ulong accumulatedHP = 0; // 按血条编号排序,从小到大计算累计生命值 var sortedHPNums = hpDict.Keys.ToList(); sortedHPNums.Sort(); foreach (int hpNum in sortedHPNums) { if (hpDict.TryGetValue(hpNum, out TianziConfig tianziConfig)) { // 累计生命值 accumulatedHP += (ulong)tianziConfig.MaxHP; // 如果伤害 >= 累计生命值,则获得一个箱子 if (damage >= accumulatedHP) { boxCount++; } else { // 如果伤害不足以获得当前血条的箱子,则停止计算 break; } } } return boxCount; } public List itemInfos = new List(); public bool isSweepVictory = false; public ulong totalHurtSweep; public ulong todayHurtTotalSweep; public void UpdateFBEnd(H0320_tagFBEnd vNetData) { if (vNetData.Msg == null) return; JsonData jsonData = JsonMapper.ToObject(vNetData.Msg); int dataMapID = int.Parse(jsonData["dataMapID"].ToString()); if (dataMapID != DataMapID) return; int isSweep = int.Parse(jsonData["isSweep"].ToString()); totalHurtSweep = ulong.Parse(jsonData["totalHurt"].ToString()); int lineID = int.Parse(jsonData["lineID"].ToString()); todayHurtTotalSweep = ulong.Parse(jsonData["todayHurtTotal"].ToString()); int isPass = int.Parse(jsonData["isPass"].ToString()); isSweepVictory = true; itemInfos.Clear(); if (jsonData["itemInfo"] != null && jsonData["itemInfo"].IsArray) { for (int i = 0; i < jsonData["itemInfo"].Count; i++) { JsonData itemData = jsonData["itemInfo"][i]; Item itemInfo = new Item((int)itemData["ItemID"], (long)itemData["Count"]); itemInfos.Add(itemInfo); } } isSweepVictory = true; UIManager.Instance.OpenWindow(); } public void SendBBeginFBWipeOut() { CA505_tagCMBeginFBWipeOut pack = new CA505_tagCMBeginFBWipeOut(); pack.MapID = (uint)DataMapID; pack.LineID = (ushort)todayLineID; pack.Cnt = 1; GameNetSystem.Instance.SendInfo(pack); } public void UpdateTianziKYInfo(HB201_tagSCTianziKYInfo vNetData) { if (vNetData == null) return; todayLineID = vNetData.LineID; historyHurt = (ulong)vNetData.HistoryHurtEx * 100000000 + (ulong)vNetData.HistoryHurt; todayHurt = (ulong)vNetData.TodayHurtEx * 100000000 + (ulong)vNetData.TodayHurt; UpdateTianziKYInfoExent?.Invoke(); } }