lcy
15 小时以前 2a006da16755e6f401481c1f35a2f051fde35fb7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
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();
    }
}