using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using LitJson;
|
using UnityEngine;
|
public class TianziBillboradManager : GameSystemManager<TianziBillboradManager>
|
{
|
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 Dictionary<int, int[][]> rankAwards;// 每日排行奖励 {"名次":[[物品ID, 个数,是否拍品], ...], ...} 配置的名次key,自动按小于等于对应名次给奖励
|
public Redpoint parentRedpoint = new Redpoint(MainRedDot.MainChallengeRedpoint, MainRedDot.TianziBillboradRepoint);
|
public override void Init()
|
{
|
EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
|
EventBroadcast.Instance.AddListener<string, JsonData>(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<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
|
EventBroadcast.Instance.RemoveListener<string, JsonData>(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<ulong, ulong, int> 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<int> GetBossIDList(int dataMapID)
|
{
|
if (!DungeonConfig.TryGetDictByMapID(dataMapID, out Dictionary<int, int> dict))
|
return new List<int>();
|
List<int> list = dict.Keys.ToList();
|
list.Sort();
|
List<int> res = new List<int>();
|
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<int, TianziConfig> dict))
|
return new int[0][];
|
|
List<int> itemIds = new List<int>();
|
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;
|
}
|
|
|
/// <summary>
|
/// 计算扫荡能获得箱子数量
|
/// </summary>
|
/// <param name="damage">伤害值</param>
|
/// <returns>能获得的箱子数量</returns>
|
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<int, TianziConfig> 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<Item> itemInfos = new List<Item>();
|
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 isSweep = int.Parse(jsonData["isSweep"].ToString());
|
int dataMapID = int.Parse(jsonData["dataMapID"].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());
|
|
if (dataMapID != DataMapID)
|
return;
|
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["ItemID"]);
|
itemInfos.Add(itemInfo);
|
}
|
}
|
isSweepVictory = true;
|
UIManager.Instance.OpenWindow<TianziBillboradVictoryWin>();
|
}
|
|
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();
|
}
|
}
|