少年修仙传客户端代码仓库
hch
4 天以前 600733c8f592cb9e65f2b7a3e110ac1d686e6bfe
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
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
using vnxbqy.UI;
using System.Collections.Generic;
using System.Linq;
using System;
using UnityEngine;
 
 
// startShowTime 和 endShowTime 同时为0 代表未推送
// startShowTime 不为0 endShowTime为0 代表正在推送
// endShowTime 不为0 推送结束
public class LimitedTimeLuxuryGiftInfo
{
    public int startShowTime;      //开始展示时间
    public int endShowTime;     //结束展示时间, 当一档内所有ctgid都购买完后或者到期,展示时间结束
    public int index;       //CTGID组里的当前第几档,一档内有多个ctgid
    public int isReset;     //0 当前档展示完继续往下一档走 1 当前档展示完后从第一档开始
}
 
public class LimitedTimeLuxuryGiftModel : ILModel<LimitedTimeLuxuryGiftModel>
{
    public int maxGroupsCount;       //最大组数
    //当前显示的ctgID
    private int m_showCtgId;
    public int showCtgId
    {
        get
        {
            return m_showCtgId;
        }
        set
        {
            if (m_showCtgId == value)
                return;
            m_showCtgId = value;
            UpdateAllUIEvent?.Invoke();
        }
    }
    public int purchaseLimitPeriodS; //展示时长(秒)
    float randSeed;   //控制推送概率
    //豪礼id :[开始展示时间 开始冷却时间 第几档]
    public Dictionary<int, LimitedTimeLuxuryGiftInfo> luxuryGiftInfoDict = new Dictionary<int, LimitedTimeLuxuryGiftInfo>();
    //展示豪礼id队列
    private List<int> luxuryGiftIdQueueList = new List<int>();
    public List<int> LuxuryGiftIdQueueList
    {
        get
        {
            return luxuryGiftIdQueueList;
        }
    }
    VipModel vipModel { get { return ModelCenter.Instance.GetModelEx<VipModel>(); } }
    public Action UpdateAllUIEvent;
    int funcID = 221; //限时豪礼功能id
    string saveMark = "xshl1_";
 
    protected override void Init()
    {
        GameEvent.afterPlayerDataInitializeEvent += OnAfterPlayerDataInitializeEvent;
        GlobalTimeEvent.Instance.secondEvent += OnRefreshSecond;
        vipModel.rechargeCountEvent += OnRechargeCountEvent;
        TimeMgr.Instance.OnWeekAfterPlayerDataInitializeEvent += OnWeek;
        TimeMgr.Instance.OnMonthAfterPlayerDataInitializeEvent += OnMonth;
        var config = FuncConfigConfig.Get("LimitedTimeLuxuryGift");
        maxGroupsCount = int.Parse(config.Numerical1);
        purchaseLimitPeriodS = int.Parse(config.Numerical2);
        randSeed = float.Parse(config.Numerical3);
    }
 
    private void OnAfterPlayerDataInitializeEvent()
    {
        luxuryGiftInfoDict.Clear();
        luxuryGiftIdQueueList.Clear();
        //构建基础数据
        var keyList = ILLimitedTimeLuxuryGiftConfig.GetKeys().ToList();
        for (int i = 0; i < keyList.Count; i++)
        {
            luxuryGiftInfoDict[int.Parse(keyList[i])] = new LimitedTimeLuxuryGiftInfo
            {
                startShowTime = 0,
                endShowTime = 0,
                index = 0,
                isReset = 0,
            };
        }
        // 在收到充值封包前构建
        LoadLocalInfo();
    }
 
    protected override void UnInit()
    {
        GlobalTimeEvent.Instance.secondEvent -= OnRefreshSecond;
        GameEvent.afterPlayerDataInitializeEvent -= OnAfterPlayerDataInitializeEvent;
        vipModel.rechargeCountEvent -= OnRechargeCountEvent;
        TimeMgr.Instance.OnWeekAfterPlayerDataInitializeEvent -= OnWeek;
        TimeMgr.Instance.OnMonthAfterPlayerDataInitializeEvent -= OnMonth;
    }
    public void OnMonth()
    {
        DebugEx.Log("收到过月通知");
        ClearLocalInfo();
    }
 
    public void OnWeek()
    {
        DebugEx.Log("收到过周通知");
        ClearLocalInfo();
    }
 
    void ClearLocalInfo()
    {
        var keyList = luxuryGiftInfoDict.Keys.ToList();
        for (int i = 0; i < keyList.Count; i++)
        {
            int luxuryGiftId = keyList[i];
            if (TimeUtility.GetTime((uint)(luxuryGiftInfoDict[luxuryGiftId].startShowTime + purchaseLimitPeriodS)) >= GetServerNow())
            {
                luxuryGiftInfoDict[luxuryGiftId].isReset = 1;
            }
            else
            {
                luxuryGiftInfoDict[luxuryGiftId].startShowTime = 0;
                luxuryGiftInfoDict[luxuryGiftId].endShowTime = 0;
                luxuryGiftInfoDict[luxuryGiftId].index = 0;
                luxuryGiftInfoDict[luxuryGiftId].isReset = 0;
            }
            SaveLocalInfo();
        }
    }
 
    private void OnRechargeCountEvent(int obj)
    {
        int luxuryGiftId = ILLimitedTimeLuxuryGiftConfig.GetLuxuryGiftIDByCtgID(obj);
        if (luxuryGiftId == -1)
            return;
 
        //购买的不是当前展示的豪礼 不处理
        var index = ILLimitedTimeLuxuryGiftConfig.GetGiftGearIndexByCtgID(obj);
        if (luxuryGiftInfoDict[luxuryGiftId].index != index)
            return;
 
        //当前档位全买了就直接出队
        if (IsGearAllBuy(luxuryGiftId))
        {
            if (luxuryGiftIdQueueList.Contains(luxuryGiftId))
            {
                PopQueueByLuxuryGiftId(luxuryGiftId);
            }
            //防止重登后重置了时间
            if (luxuryGiftInfoDict[luxuryGiftId].endShowTime == 0 && luxuryGiftInfoDict[luxuryGiftId].startShowTime != 0)
                EditGiftState(3, luxuryGiftId, index);
        }
    }
 
    //每秒触发
    public void OnRefreshSecond()
    {
 
        if (PlayerDatas.Instance.PlayerId == 0)
            return;
        var keyList = luxuryGiftInfoDict.Keys.ToList();
        if (keyList.IsNullOrEmpty())
            return;
 
        for (int i = 0; i < keyList.Count; i++)
        {
            int startShowTime = luxuryGiftInfoDict[keyList[i]].startShowTime;
            int endShowTime = luxuryGiftInfoDict[keyList[i]].endShowTime;
            int showCloseSeconds = GetShowCloseTime(keyList[i]);
            int index = luxuryGiftInfoDict[keyList[i]].index;
 
            if (endShowTime == 0 && startShowTime != 0 && showCloseSeconds <= 0)
            {
                PopQueueByLuxuryGiftId(keyList[i]);
                EditGiftState(2, keyList[i], index);
            }
        }
    }
 
    DateTime GetServerNow()
    {
        //return DateTime.Now;
        return TimeUtility.ServerNow;
    }
 
    int GetAllSeconds()
    {
        //return (int)(DateTime.Now - TimeUtility.OriginalTime).TotalSeconds;
        return TimeUtility.AllSeconds;
    }
 
 
 
    //读取本地数据
    //读取数据时只校验安全性是否越界,数据重置可以通过热更指定豪华ID来实现
    //!!!比如配置此功能热更的版本号对比,如果版本号不一致,清空指定豪华id的数据,也可以约定为0时清空所有数据,此方式可以同步热更暂且不实现
    void LoadLocalInfo()
    {
        var keyList = luxuryGiftInfoDict.Keys.ToList();
 
        for (int i = 0; i < keyList.Count; i++)
        {
            var luxuryID = keyList[i];
            var data = LocalSave.GetIntArray(saveMark + ((ulong)PlayerDatas.Instance.PlayerId * 1000 + (ulong)luxuryID));
            if (data.IsNullOrEmpty())
                continue;
            //此处只校验是否越界,数据更新参考注释
            var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryID);
            bool needSave = false;
            if (data.Length != 4 || (data.Length == 4 && data[2] >= config.CTGID.Length))
            {
                //数据越界,清空本条
                needSave = true;
                data = new int[4] { 0, 0, 0, 0 };
            }
            luxuryGiftInfoDict[luxuryID] = new LimitedTimeLuxuryGiftInfo
            {
                startShowTime = data[0],
                endShowTime = data[1],
                index = data[2],
                isReset = data[3],
            };
            if (needSave)
            {
                SaveLocalInfo(luxuryID);
            }
            //构建队列
            if (data[0] != 0 && data[1] == 0)
                luxuryGiftIdQueueList.Add(luxuryID);
        }
 
        //按开始展示时间排序
        luxuryGiftIdQueueList.Sort((a, b) =>
        {
            return luxuryGiftInfoDict[a].startShowTime.CompareTo(luxuryGiftInfoDict[b].startShowTime);
        });
    }
 
    //存储本地数据 0表示全部存储,其他表示存储指定限时豪华id
    public void SaveLocalInfo(int id = 0)
    {
        int[] data = new int[4];
        if (id == 0)
        {
            //全部存储
            var keyList = luxuryGiftInfoDict.Keys.ToList();
 
            for (int i = 0; i < keyList.Count; i++)
            {
                var luxuryID = keyList[i];
                data[0] = luxuryGiftInfoDict[luxuryID].startShowTime;
                data[1] = luxuryGiftInfoDict[luxuryID].endShowTime;
                data[2] = luxuryGiftInfoDict[luxuryID].index;
                data[3] = luxuryGiftInfoDict[luxuryID].isReset;
                LocalSave.SetIntArray(saveMark + ((ulong)PlayerDatas.Instance.PlayerId * 1000 + (ulong)luxuryID), data);
            }
        }
        else
        {
            if (!luxuryGiftInfoDict.ContainsKey(id))
                return;
            //存储指定限时豪华id
            data[0] = luxuryGiftInfoDict[id].startShowTime;
            data[1] = luxuryGiftInfoDict[id].endShowTime;
            data[2] = luxuryGiftInfoDict[id].index;
            data[3] = luxuryGiftInfoDict[id].isReset;
            LocalSave.SetIntArray(saveMark + ((ulong)PlayerDatas.Instance.PlayerId * 1000 + (ulong)id), data);
        }
    }
 
    //切换豪礼状态
    //1 开始展示 2 倒计时展示结束 3 当前档购买结束 4 记录已经是最后一档或者检索时对已购买的进行补充记录 5 重置本地数据
    public void EditGiftState(int num, int luxuryGiftId, int index)
    {
        Debug.LogFormat("EditGiftState num {0} luxuryGiftId {1} index {2}", num, luxuryGiftId, index);
        if (!luxuryGiftInfoDict.ContainsKey(luxuryGiftId))
            return;
        if (num == 1)
        {
            luxuryGiftInfoDict[luxuryGiftId].startShowTime = GetAllSeconds();
            luxuryGiftInfoDict[luxuryGiftId].endShowTime = 0;
            luxuryGiftInfoDict[luxuryGiftId].index = index;
        }
        if (num == 2)
        {
            luxuryGiftInfoDict[luxuryGiftId].endShowTime = luxuryGiftInfoDict[luxuryGiftId].startShowTime + purchaseLimitPeriodS;
        }
        else if (num == 3)
        {
            luxuryGiftInfoDict[luxuryGiftId].endShowTime = GetAllSeconds();
        }
        else if (num == 4)
        {
            luxuryGiftInfoDict[luxuryGiftId].startShowTime = 1;
            luxuryGiftInfoDict[luxuryGiftId].endShowTime = 1;
            luxuryGiftInfoDict[luxuryGiftId].index = index;
        }
        else if (num == 5)
        {
            luxuryGiftInfoDict[luxuryGiftId].isReset = 0;
        }
        SaveLocalInfo(luxuryGiftId);
    }
 
    // 获得当前按钮显示的状态 0 未购买 1 已购买 2 已结束
    public int GetGiftState(int ctgId)
    {
        VipModel.RechargeCount rechargeCount;
        vipModel.TryGetRechargeCount(ctgId, out rechargeCount);
        var configCtg = CTGConfig.Get(ctgId);
        if (GetCheckNowTotalCnt(rechargeCount, configCtg) < GetCheckTableTotalCnt(configCtg))
        {
            int luxuryGiftID = ILLimitedTimeLuxuryGiftConfig.GetLuxuryGiftIDByCtgID(ctgId);
            int seconds = GetShowCloseTime(luxuryGiftID);
            return seconds > 0 ? 0 : 2;
        }
        else
        {
            return 1;
        }
    }
 
 
    //得到指定豪礼的展示剩余时间 
    public int GetShowCloseTime(int luxuryGiftId)
    {
        if (!luxuryGiftInfoDict.ContainsKey(luxuryGiftId) || luxuryGiftInfoDict[luxuryGiftId].startShowTime == 0)
            return 0;
        var overTime = TimeUtility.GetTime((uint)(luxuryGiftInfoDict[luxuryGiftId].startShowTime + purchaseLimitPeriodS));
        if (GetServerNow() > overTime)
            return 0;
        return (int)(overTime - GetServerNow()).TotalSeconds;
    }
 
    //得到指定豪礼的冷却结束时间
    public int GetCoolDownTime(int luxuryGiftId)
    {
        if (!luxuryGiftInfoDict.ContainsKey(luxuryGiftId) || luxuryGiftInfoDict[luxuryGiftId].endShowTime == 0)
            return 0;
        int ShowIntervalS = GetShowIntervalS(luxuryGiftId);
        var overTime = TimeUtility.GetTime((uint)(luxuryGiftInfoDict[luxuryGiftId].endShowTime + ShowIntervalS));
        if (GetServerNow() > overTime)
            return 0;
        return (int)(overTime - GetServerNow()).TotalSeconds;
    }
 
 
    //获取当前豪礼的冷却时间秒数
    public int GetShowIntervalS(int luxuryGiftId)
    {
        int nowCtgidIndex = luxuryGiftInfoDict[luxuryGiftId].index;
        var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
 
        if (nowCtgidIndex >= config.CTGID.Length - 1)
            return 0;
 
 
        //如果当前档位大于配置的展示时间长度,取最后一个
        return config.ShowInterval[Math.Min(nowCtgidIndex, config.ShowInterval.Length - 1)];
    }
 
 
    //获取当前档最近的下一个未购买的档位
    // -1 没有下一档了 
    public int GetNextGiftIndex(int luxuryGiftId)
    {
 
        int gearIndex = luxuryGiftInfoDict[luxuryGiftId].index;
        if (luxuryGiftInfoDict[luxuryGiftId].isReset == 1)
            return AllCanBuyGear(luxuryGiftId);
        var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
 
        if (gearIndex >= config.CTGID.Length - 1)
            return -1;
 
        //没有记录的情况下,先判断第一档是否购买过
        if (!(gearIndex == 0 && luxuryGiftInfoDict[luxuryGiftId].startShowTime == 0))
            gearIndex++;
        if (IsGearAllBuy(luxuryGiftId, gearIndex))
        {
            //补充已购买的记录
            EditGiftState(4, luxuryGiftId, gearIndex);
            return GetNextGiftIndex(luxuryGiftId);
 
        }
        return gearIndex;
 
    }
 
 
    //当前档或者指定档是否全买
    public bool IsGearAllBuy(int luxuryGiftId, int index = -1)
    {
        if (luxuryGiftId == -1)
            return true;
        int gearIndex;
        if (index == -1)
            gearIndex = luxuryGiftInfoDict[luxuryGiftId].index;
        else
            gearIndex = index;
 
        var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
        for (int i = 0; i < config.CTGID[gearIndex].Length; i++)
        {
            VipModel.RechargeCount rechargeCount;
            int ctgID = config.CTGID[gearIndex][i];
            vipModel.TryGetRechargeCount(ctgID, out rechargeCount);
            var configCtg = CTGConfig.Get(ctgID);
            if (GetCheckNowTotalCnt(rechargeCount, configCtg) < GetCheckTableTotalCnt(configCtg))
            {
                return false;
            }
        }
        return true;
    }
 
    int GetCheckTableTotalCnt(CTGConfig ctg)
    {
        if (ctg.WeekBuyCount != 0)
            return ctg.WeekBuyCount;
        if (ctg.MonthBuyCount != 0)
            return ctg.MonthBuyCount;
        return ctg.TotalBuyCount;
    }
 
 
    int GetCheckNowTotalCnt(VipModel.RechargeCount rechargeCnt, CTGConfig ctg)
    {
        if (ctg.WeekBuyCount != 0)
            return rechargeCnt.weekPayCount;
        if (ctg.MonthBuyCount != 0)
            return rechargeCnt.monthPayCount;
        return rechargeCnt.totalCount;
    }
 
 
 
    //获取展示时间最快结束的豪礼id
    public int GetMaxFastCloseGiftID()
    {
        if (luxuryGiftIdQueueList.IsNullOrEmpty())
            return -1;
        return luxuryGiftIdQueueList[0];
 
    }
 
    //队列中有几个可以展示的豪礼
    public int ShowLuxuryGiftIdCount()
    {
        return luxuryGiftIdQueueList.Count;
    }
 
    public void PushQueueByLuxuryGiftId(int luxuryGiftId)
    {
        luxuryGiftIdQueueList.Add(luxuryGiftId);
    }
 
    public void PopQueueByLuxuryGiftId(int luxuryGiftId)
    {
        luxuryGiftIdQueueList.Remove(luxuryGiftId);
    }
 
    //获取所有展示豪礼的未购买ctgid
    public List<int> GetShowCtgIDList()
    {
        List<int> ctgIDList = new List<int>();
        for (int i = 0; i < luxuryGiftIdQueueList.Count; i++)
        {
            int luxuryGiftId = luxuryGiftIdQueueList[i];
            int gearIndex = luxuryGiftInfoDict[luxuryGiftId].index;
            var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
            for (int j = 0; j < config.CTGID[gearIndex].Length; j++)
            {
                VipModel.RechargeCount rechargeCount;
                int ctgID = config.CTGID[gearIndex][j];
                vipModel.TryGetRechargeCount(ctgID, out rechargeCount);
                var configCtg = CTGConfig.Get(ctgID);
                if (GetCheckNowTotalCnt(rechargeCount, configCtg) < GetCheckTableTotalCnt(configCtg))
                {
                    ctgIDList.Add(ctgID);
                }
            }
        }
        return ctgIDList;
    }
 
    //限时豪礼入口开启条件
    public bool IsShow()
    {
        if (!FuncOpen.Instance.IsFuncOpen(funcID))
            return false;
        if (ShowLuxuryGiftIdCount() == 0)
            return false;
        return true;
    }
 
    //传入的豪礼id是否符合推送要求
    // type 1代表物品id, 2 代表货币类型,由id传输
    public bool IsItemIdShow(int luxuryGiftId, int id, int singleCnt, int type, int isJumpOrOpen = 0)
    {
        if (!IsRequirementOpen(luxuryGiftId))
            return false;
 
        float curCnt = 0;
        if (type == 1)
        {
            PackModel packModel = ModelCenter.Instance.GetModel<PackModel>();
            curCnt = (ulong)packModel.GetItemCountByID(PackType.Item, id);     //身上物品数量
        }
        else if (type == 2)
        {
            curCnt = HeroControler.Instance.GetMoneyCntIL(id);
        }
        else
        {
            curCnt = 1;
            singleCnt = 1;
        }
 
        double result = Math.Max((1 - (curCnt - singleCnt) / singleCnt / randSeed), 0) * 10000;
        var rand = UnityEngine.Random.Range(1, 10000);
        DebugEx.LogFormat("公式算出的结果: luxuryGiftId {4} result {0} - rand {1} curCnt {2} singleCnt {3} ", result, rand, curCnt, singleCnt, luxuryGiftId);
        if (rand > result)
            return false;
        int pushIndex = GetNextGiftIndex(luxuryGiftId);
        if (pushIndex == -1)
        {
            var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
            EditGiftState(4, luxuryGiftId, config.CTGID.Length - 1);
            return false;
        }
        PushQueueByLuxuryGiftId(luxuryGiftId);
        EditGiftState(1, luxuryGiftId, pushIndex);
        showCtgId = GetNextCtgId(luxuryGiftId);
        if (luxuryGiftInfoDict[luxuryGiftId].isReset == 1)
            EditGiftState(5, luxuryGiftId, 0);
        if (isJumpOrOpen == 0)
        {
            WindowCenter.Instance.Open("LimitedTimeLuxuryGiftWin");
            
        }
        else
        {
            WindowJumpMgr.Instance.WindowJumpToEx("LimitedTimeLuxuryGiftWin");
        }
        return true;
    }
 
    //找出推送档中未购买的ctgid
    public int GetNextCtgId(int luxuryGiftId)
    {
        int gearIndex = luxuryGiftInfoDict[luxuryGiftId].index;
        var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
        for (int i = 0; i < config.CTGID[gearIndex].Length; i++)
        {
            VipModel.RechargeCount rechargeCount;
            int ctgID = config.CTGID[gearIndex][i];
            vipModel.TryGetRechargeCount(ctgID, out rechargeCount);
            var configCtg = CTGConfig.Get(ctgID);
            if (GetCheckNowTotalCnt(rechargeCount, configCtg) < GetCheckTableTotalCnt(configCtg))
            {
                return ctgID;
            }
        }
        return 0;
    }
 
    //这档豪礼所有ctgid都无法购买
    public bool IsNoAllBuy(int luxuryGiftId)
    {
        var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
        for (int i = 0; i < config.CTGID.Length; i++)
        {
            for (int j = 0; j < config.CTGID[i].Length; j++)
            {
 
                int ctgID = config.CTGID[i][j];
                VipModel.RechargeCount rechargeCount;
                vipModel.TryGetRechargeCount(ctgID, out rechargeCount);
                var configCtg = CTGConfig.Get(ctgID);
                if (GetCheckNowTotalCnt(rechargeCount, configCtg) < GetCheckTableTotalCnt(configCtg))
                {
                    return false;
                }
            }
        }
        return true;
    }
    //这档豪礼所有 CTGID中第一个可购买的CTGID 所在的档位
    public int AllCanBuyGear(int luxuryGiftId)
    {
        var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
        for (int i = 0; i < config.CTGID.Length; i++)
        {
            for (int j = 0; j < config.CTGID[i].Length; j++)
            {
 
                int ctgID = config.CTGID[i][j];
                VipModel.RechargeCount rechargeCount;
                vipModel.TryGetRechargeCount(ctgID, out rechargeCount);
                var configCtg = CTGConfig.Get(ctgID);
                if (GetCheckNowTotalCnt(rechargeCount, configCtg) < GetCheckTableTotalCnt(configCtg))
                {
                    return ILLimitedTimeLuxuryGiftConfig.GetGiftGearIndexByCtgID(ctgID);
                }
            }
        }
        return 0;
    }
    //是否满足推送条件
    bool IsRequirementOpen(int luxuryGiftId)
    {
        if (!FuncOpen.Instance.IsFuncOpen(funcID))
            return false;
 
        //传入的豪礼id表中没有,不推送
        if (!luxuryGiftInfoDict.ContainsKey(luxuryGiftId))
            return false;
 
        //超出推送上限
        if (luxuryGiftIdQueueList.Count >= maxGroupsCount)
            return false;
 
        //展示指定条件如等级或者指定功能开启
        var config = ILLimitedTimeLuxuryGiftConfig.Get(luxuryGiftId);
        if (config.ShowRequirement[0] == 0)
        {
            if (PlayerDatas.Instance.baseData.LV < config.ShowRequirement[1])
                return false;
        }
        else
        {
            if (!FuncOpen.Instance.IsFuncOpen(config.ShowRequirement[1]))
                return false;
        }
        DebugEx.Log("isReset " + luxuryGiftInfoDict[luxuryGiftId].isReset);
        if (luxuryGiftInfoDict[luxuryGiftId].isReset == 1)
        {
            DebugEx.Log("isReset 走 没有可购买CTG的不推送");
            //没有可购买CTG的不推送
            if (IsNoAllBuy(luxuryGiftId))
                return false;
        }
        else
        {
            DebugEx.Log("isReset 走 已全部推送完毕的不推送");
            //已全部推送完毕的不推送
            int gearIndex = luxuryGiftInfoDict[luxuryGiftId].index;
            if (gearIndex >= config.CTGID.Length - 1)
                return false;
        }
 
        //正在展示中的不推送
        if (luxuryGiftIdQueueList.Contains(luxuryGiftId))
            return false;
 
        //冷却中的不推送
        if (GetCoolDownTime(luxuryGiftId) > 0)
            return false;
 
        return true;
    }
}