hch
2026-01-26 aa84cb62bebb9c8a4e586bcc1ec28eb7a16a8860
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
377
378
379
380
381
382
383
 
using System;
using System.Collections.Generic;
using LitJson;
 
public class GuildBossManager : GameSystemManager<GuildBossManager>
{
 
    public Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction> bossActions = new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction>();
    // 玩家伤害排行
    public List<HA513_tagMCFamilyActionInfo.tagMCFamilyAction> playerBossHurtRank = new List<HA513_tagMCFamilyActionInfo.tagMCFamilyAction>();
    //时间戳:讨伐数据; 用于播放每次攻击
    public Dictionary<int, TaofaAtkData> taofaAtkData = new Dictionary<int, TaofaAtkData>();
    //按时间顺序播放,当前播放的tick,如果找不到则从第一个开始
    public int lastPlayTick
    {
        get
        {
            return LocalSave.GetInt("lastPlayTick" + PlayerDatas.Instance.baseData.PlayerID);
        }
        set
        {
            LocalSave.SetInt("lastPlayTick" + PlayerDatas.Instance.baseData.PlayerID, value);
        }
    }
    //玩家ID:玩家数据 (退出公会的玩家)
    public Dictionary<int, MemberData> taofaPlayerData = new Dictionary<int, MemberData>();
    public event Action BossHurtEvent;
 
    //自己的数据
    public byte m_BuZhenState;    // 是否已布阵
    public ushort m_AtkCount;    // 已斩杀次数,用于计算剩余次数=免费次数+道具增加次数-已斩杀次数
    public ushort m_ItemAddCount;    // 道具增加斩杀次数
    public ushort m_Anger;    // 当前怒气值
    public ushort m_BoxUnGetCount;    // 当前未领取的宝箱数,即可领取的
    public long m_BoxHurt;    // 今日伤害
    public long m_BoxHurtHis;    // 历史伤害
 
    //攻击数据
    public HA504_tagSCFamilyTaofaAtkRet atkResult;
    public event Action AtkResultEvent;
 
    //配置
    public int initSuperHitRate;
    public int[] bzAddAttrs;
    public int bzMaxLevel;
 
    public int freeAtkCount;
    public int[][] atkItemList;
    public int maxAngerValue;
 
    long[] bxCumulativeDamageList;
    public List<long> allBXCumulativeDamageList = new List<long>();
    public int bxDailyMax;  //个人每日产出上限
    public long lastDmgAddValue; // 最后一档伤害增值循环用
    public int addAtkCntItemID = 17; //增加讨伐次数道具ID
    public int bossSkinID = 7100300;
 
 
    void ParseConfig()
    {
        // 数值1:初始暴击率万分率,功能独立的暴击率,与角色暴击无关
        // 数值3:布阵最大层级
        var config = FuncConfigConfig.Get("FamilyTaofaBuzhen");
        initSuperHitRate = int.Parse(config.Numerical1);
        bzAddAttrs = ConfigParse.GetMultipleStr<int>(config.Numerical2);
        bzMaxLevel = int.Parse(config.Numerical3);
 
        // 数值1:每日免费斩杀次数
        // 数值2:每次普通斩杀获得个人奖励列表 [[物品ID,个数], ...]
        // 数值4:常规斩杀增加怒气|暴击斩杀增加怒气|满怒气值
        config = FuncConfigConfig.Get("FamilyTaofaAtk");
        freeAtkCount = int.Parse(config.Numerical1);
        atkItemList = JsonMapper.ToObject<int[][]>(config.Numerical2);
        maxAngerValue = int.Parse(config.Numerical4.Split('|')[2]);
 
        // 数值1:产出宝箱的累计伤害列表 [宝箱1所需累计伤害,  ...],最后一档伤害可以循环产出,直到当日的贡献宝箱上限
        // 数值2:每日个人贡献宝箱数上限,最后一档可循环,上限控制
        // 数值3:每日个人领取宝箱奖励个数上限
        config = FuncConfigConfig.Get("FamilyTaofaBox");
        bxCumulativeDamageList = JsonMapper.ToObject<long[]>(config.Numerical1);
        bxDailyMax = int.Parse(config.Numerical2);
        lastDmgAddValue = bxCumulativeDamageList[bxCumulativeDamageList.Length - 1] - bxCumulativeDamageList[bxCumulativeDamageList.Length - 2];
        //最后一档循环
        for (int i = 0; i < bxDailyMax; i++)
        {
            if (i < bxCumulativeDamageList.Length)
            {
                allBXCumulativeDamageList.Add(bxCumulativeDamageList[i]);
            }
            else
            {
                allBXCumulativeDamageList.Add(allBXCumulativeDamageList[i - 1] + lastDmgAddValue);
            }
        }
    
    }
 
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
        GuildManager.Instance.EnterOrQuitGuildEvent += EnterOrQuitGuildEvent;
        ParseConfig();
    }
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
        GuildManager.Instance.EnterOrQuitGuildEvent -= EnterOrQuitGuildEvent;
    }
 
    void OnBeforePlayerDataInitializeEventOnRelogin()
    {
        bossActions.Clear();
        playerBossHurtRank.Clear();
        m_BuZhenState = 0;
        m_AtkCount = 0;
        m_ItemAddCount = 0;
        m_Anger = 0;
        m_BoxUnGetCount = 0;
        m_BoxHurt = 0;
        m_BoxHurtHis = 0;
        taofaAtkData.Clear();
        taofaPlayerData.Clear();
    }
 
 
    void EnterOrQuitGuildEvent(bool isEnter)
    {
        if (!isEnter)
        {
            bossActions.Clear();
            playerBossHurtRank.Clear();
            taofaAtkData.Clear();
            taofaPlayerData.Clear();
        }
        UpdateRedpoint();
    }
 
 
    //// 操作:0-斩杀攻击;1-布阵
    public void TaofaBoss(int opType)
    {
        var pack = new CA613_tagCSFamilyTaofaOP();
        pack.OpType = (byte)opType;
        GameNetSystem.Instance.SendInfo(pack);
    }
 
    public void UpdataMyBossData(HA503_tagSCFamilyTaofaInfo netPack)
    {
        m_BuZhenState = netPack.BuZhenState;
        m_AtkCount = netPack.AtkCount;
        m_ItemAddCount = netPack.ItemAddCount;
        m_Anger = netPack.Anger;
        m_BoxUnGetCount = netPack.BoxUnGetCount;
        m_BoxHurt = netPack.BoxHurt + netPack.BoxHurtEx * Constants.ExpPointValue;
        m_BoxHurtHis = netPack.BoxHurtHis + netPack.BoxHurtHisEx * Constants.ExpPointValue;
 
        UpdateRedpoint();
        BossHurtEvent?.Invoke();
    }
 
    public void UpdateAtkResult(HA504_tagSCFamilyTaofaAtkRet netPack)
    {
        atkResult = netPack;
        AtkResultEvent?.Invoke();
    }
 
 
    public int GetHasAtkCnt()
    {
        return freeAtkCount + m_ItemAddCount - m_AtkCount;
    }
 
    // 【公会行为】
    // 增加行为类型18 - 公会讨伐相关数据
    // Value1    玩家ID 或  全局ID,当该值等于1时代表该条数据记录的是讨伐全局数据,以下其他值根据Value1代表不同意思
    //                   玩家                                     全局                            
    // Time      最后讨伐时间戳                     重置时间戳,前端可用于判断是否变更了不同的讨伐(变更后,前端可重置讨伐相关缓存数据,GM重置会变更)
    // Value2     玩家布阵时间戳                          布阵层级到期时间戳                          
    // Value3     到本公会后攻击次数                    当前有效布阵层级 
    // Value4     到本公会后累计伤害,求余亿部分                  无     
    // Value5     到本公会后累计伤害,整除亿部分                  无     
    // Value6     到本公会后贡献宝箱数                                    无     
    // UseData  到本公会后记录                                              无   
    // 成员记录格式: Json格式  {"atkList":[[atkTime, 本次贡献箱子数, 本次总伤害, atkType], ...],   "info":{k:v, ...}}
    // atkList   -     讨伐记录列表,可用于表现成员头像攻击: atkTime  -  攻击时间戳,  atkType  -  攻击类型(0-普通攻击, 1-怒气攻击)
    // info     -     不一定有该key,仅退出的成员才有,用于更新退出成员相关基础信息,如名字、头像等,还在公会里的成员通过 // A5 20 玩家家族信息 #tagMCRoleFamilyInfo 取成员信息
    // "info":{"LV":106,"Job":1,"Name":"主公3016219","FacePic":0,"FightPower":1831995,"RealmLV":12,"ServerID":86,"TitleID":0,"Face":0},
    
    // boss讨伐的全局数据
    public HA513_tagMCFamilyActionInfo.tagMCFamilyAction GetGuildBossAction()
    {
        if (bossActions.ContainsKey(1))
        {
            return bossActions[1];
        }
        return null;
    }
 
    // 获取公会中的伤害记录做排名
    public bool UpdateGuildBossInfo(HA513_tagMCFamilyActionInfo vNetData)
    {
        if (vNetData.ActionType != GuildManager.GuildBossActionType)
        {
            return false;
        }
 
        //判断是否新的公会数据
        for (int i = 0; i < vNetData.Count; i++)
        {
            var playerID = (int)vNetData.FamilyActionList[i].Value1;
            if (playerID != 1)
            {
                continue;
            }
            if (bossActions.ContainsKey(1) && bossActions[1].Time != vNetData.FamilyActionList[0].Time)
            {
                bossActions.Clear();
                playerBossHurtRank.Clear();
            }
        }
 
 
        for (int i = 0; i < vNetData.Count; i++)
        {
            bossActions[(int)vNetData.FamilyActionList[i].Value1] = vNetData.FamilyActionList[i];
        }
 
        SortPlayerHurt();
        RefreshAtkList();
        BossHurtEvent?.Invoke();
        return true;
    }
 
    void SortPlayerHurt()
    {
        playerBossHurtRank.Clear();
        foreach (var item in bossActions)
        {
            if (item.Value.Value1 != 1)
            {
                if (item.Value.Value4 == 0 && item.Value.Value5 == 0)
                {
                    continue;
                }
                playerBossHurtRank.Add(item.Value);
            }
 
        }
 
        playerBossHurtRank.Sort((a, b) => (b.Value4 + b.Value5 * Constants.ExpPointValue).CompareTo(a.Value4 + a.Value5 * Constants.ExpPointValue));
    }
 
    //解析攻击记录 和 玩家信息(退出公会的)
    void RefreshAtkList()
    {
        //{"atkList":[[atkTime, 本次贡献箱子数, 本次总伤害, atkType], ...],   "info":{k:v, ...}}
        //"info":{"LV":106,"Job":1,"Name":"主公3016219","FacePic":0,"FightPower":1831995,"RealmLV":12,"ServerID":86,"TitleID":0,"Face":0},
        taofaAtkData.Clear();
        taofaPlayerData.Clear();
        foreach (var item in playerBossHurtRank)
        {
            JsonData jsonData = JsonMapper.ToObject(item.UseData);
            if (!jsonData.ContainsKey("atkList"))
            {
                continue;
            }
            var arr = JsonMapper.ToObject<long[][]>(jsonData["atkList"].ToJson());
            for (int i = 0; i < arr.Length; i++)
            {
                taofaAtkData[(int)arr[i][0]] = new TaofaAtkData()
                {
                    playerID = (int)item.Value1,
                    atkType = (int)arr[i][3],
                    hurt = arr[i][2],
                };
            }
 
            if (jsonData.ContainsKey("info"))
            {
                taofaPlayerData[(int)item.Value1] = JsonMapper.ToObject<MemberData>(jsonData["info"].ToJson());
            }
        }
 
    }
 
    // 获取我的排名
    public int GetMyRank()
    {
        int rank = 0;
        for (int i = 0; i < playerBossHurtRank.Count; i++)
        {
            if (playerBossHurtRank[i].Value1 == PlayerDatas.Instance.baseData.PlayerID)
            {
                rank = i + 1;
                break;
            }
        }
        return rank;
    }
 
    //获取成员外观数据 头像名字等
    public MemberData GetMemberData(int playerId)
    {
        var playerInfo = PlayerDatas.Instance.fairyData.GetMember(playerId);
        if (playerInfo == null)
        {
            return taofaPlayerData.ContainsKey(playerId) ? taofaPlayerData[playerId] : new MemberData();
        }
 
        return new MemberData()
        {
            LV = playerInfo.LV,
            Job = playerInfo.Job,
            Name = playerInfo.Name,
            FacePic = playerInfo.FacePic,
            FightPower = (ulong)playerInfo.FightPower,
            RealmLV = playerInfo.RealmLV,
            ServerID = playerInfo.ServerID,
            TitleID = playerInfo.TitleID,
            Face = playerInfo.Face
 
        };
 
    }
 
    #region 红点
    Redpoint redPoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.bossTaofaRedpointID);
 
    void UpdateRedpoint()
    {
        redPoint.state = RedPointState.None;
 
        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Guild))
        {
            return;
        }
        if (PlayerDatas.Instance.fairyData.fairy == null)
        {
            return;
        }
        if (m_BuZhenState == 0)
        {
            redPoint.state = RedPointState.Simple;
            return;
        }
 
        if (GetHasAtkCnt() > 0)
        {
            redPoint.state = RedPointState.Simple;
            return;
        }
 
        if (m_BoxUnGetCount > 0)
        {
            redPoint.state = RedPointState.Simple;
            return;
        }
    }
    #endregion
 
}
 
public class TaofaAtkData
{
    public int playerID;
    public int atkType;
    public long hurt;
}
 
public class MemberData
{
    public int LV;
    public int Job;
    public string Name;
    public int FacePic;
    public ulong FightPower;
    public int RealmLV;
    public int ServerID;
    public int TitleID;
    public int Face;
 
}