yyl
2026-05-11 51b0f6ed9f4e1d3bb6f8144470b46908c7699a96
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
using System;
using System.Collections.Generic;
using System.Linq;
 
public class FestivalActivityRechargeTotalManager : GameSystemManager<FestivalActivityRechargeTotalManager>, IOpenServerActivity
{
    public readonly int ActNum = 30;
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
        OperationTimeHepler.Instance.operationTimeUpdateEvent += OperationTimeUpdateEvent;
        OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
        OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
        OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent;
        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
        StoreModel.Instance.RefreshBuyShopLimitEvent += OnRefreshBuyShopLimitEvent;
    }
 
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
        OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeUpdateEvent;
        OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
        OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
        OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent;
        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
        StoreModel.Instance.RefreshBuyShopLimitEvent -= OnRefreshBuyShopLimitEvent;
 
    }
 
    private void OnRefreshBuyShopLimitEvent()
    {
        UpdateRedPoint();
    }
 
 
    private void OnFuncStateChangeEvent(int obj)
    {
        if (obj != (int)FuncOpenEnum.FestivalActivity)
            return;
        UpdateRedPoint();
    }
 
 
    private void OnBeforePlayerDataInitializeEventOnRelogin()
    {
        coinTotal = 0;
        awardRecord = 0;
    }
 
    public const int activityID = (int)OperationType.FestivalActivity_RechargeTotal;
    public static OperationType operaType = OperationType.FestivalActivity_RechargeTotal;
    // 总奖励
    public Redpoint redPoint = new Redpoint(
        FestivalActivityManager.Instance.GetRedPointId(FestivalActivityRepointType.Recharge),
        FestivalActivityManager.Instance.GetRedPointId(FestivalActivityRepointType.TotalRecharge));
    public bool IsOpen => OperationTimeHepler.Instance.SatisfyOpenCondition(operaType);
    public bool IsAdvance => OperationTimeHepler.Instance.SatisfyAdvanceCondition(operaType);
    public bool priorityOpen => redPoint.state == RedPointState.Simple;
    public event Action<int> onStateUpdate;
 
    private void OperationTimeUpdateEvent(OperationType type)
    {
        if (UIManager.Instance.IsOpened<FestivalActivityRechargeBaseWin>())
            UIManager.Instance.CloseWindow<FestivalActivityRechargeBaseWin>();
        UpdateRedPoint();
    }
 
    private void OperationStartEvent(OperationType type, int state)
    {
        if (type == operaType && state == 0)
        {
            UpdateRedPoint();
            onStateUpdate?.Invoke(activityID);
        }
    }
 
    private void OperationEndEvent(OperationType type, int state)
    {
        if (type == operaType)
        {
            if (UIManager.Instance.IsOpened<FestivalActivityRechargeBaseWin>())
                UIManager.Instance.CloseWindow<FestivalActivityRechargeBaseWin>();
            UpdateRedPoint();
            onStateUpdate?.Invoke(activityID);
        }
    }
 
    private void OperationAdvanceEvent(OperationType type)
    {
        if (type == operaType)
        {
            UpdateRedPoint();
            onStateUpdate?.Invoke(activityID);
        }
    }
 
    public void UpdateRedPoint()
    {
        redPoint.state = RedPointState.None;
        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.FestivalActivity))
            return;
        if (!IsOpen)
            return;
 
        var awardList = GetShowList();
        if (awardList == null)
            return;
        for (int i = 0; i < awardList.Count; i++)
        {
            if (GetState(awardList[i]) == 1)
            {
                redPoint.state = RedPointState.Simple;
                return;
            }
        }
 
        var storeData = GetStoreData();
        if (storeData != null && !IsReceived(storeData.shopId))
        {
            redPoint.state = RedPointState.Simple;
        }
    }
    public bool GetActInfo(out OperationTotalRechargeInfo act, out ActTotalRechargeConfig config)
    {
        config = null;
        if (!OperationTimeHepler.Instance.TryGetOperation(operaType, out act) || act == null)
            return false;
        config = ActTotalRechargeConfig.Get(act.CfgID);
        return config != null;
    }
 
    public List<int> GetShowList(bool isSort = false)
    {
        if (!GetActInfo(out var act, out var config))
            return null;
 
        int ctgTempID = config.CTGTempID;
        int ctgShopType = config.CTGShopType;
        var res = new List<int>();
 
        var awardIndexSortList = ActTotalRechargeTempConfig.GetAwardIndexSortList(ctgTempID);
        for (int i = 0; i < awardIndexSortList.Count; i++)
        {
            var tempConfig = ActTotalRechargeTempConfig.GetConfig(ctgTempID, awardIndexSortList[i]);
            if (tempConfig == null)
                continue;
            res.Add(tempConfig.AwardID);
        }
 
        if (isSort)
        {
            res = res.OrderBy(awardId =>
            {
                var tempConfig = ActTotalRechargeTempConfig.Get(awardId);
                return IsAwardHave(tempConfig.AwardIndex);
            })
            .ThenBy(awardId => awardId)
            .ToList();
 
        }
        return res;
    }
 
    public bool IsCanBuyShop(int shopID)
    {
        StoreConfig config = StoreConfig.Get(shopID);
        if (config == null)
            return false;
        StoreModel.Instance.TryGetIsSellOut(config, out int remainNum);
        return remainNum > 0;
    }
 
    public StoreModel.StoreData GetStoreData()
    {
        if (!GetActInfo(out var act, out var config))
            return null;
        int ctgShopType = config.CTGShopType;
        if (StoreModel.Instance.storeTypeDict == null)
            return null;
        if (!StoreModel.Instance.storeTypeDict.TryGetValue(ctgShopType, out var list))
            return null;
        if (list.IsNullOrEmpty())
            return null;
        return list[0];
    }
 
    public float coinTotal;    //活动累计充值额coin值
    public uint awardRecord;    //累充奖励领奖记录,按奖励索引二进制位存储是否已领取
    public event Action OnTotalRechargePlayerInfoEvent;
    public void UpdateTotalRechargePlayerInfo(HAA1C_tagSCActTotalRechargePlayerInfo vNetData)
    {
        if (ActNum != vNetData.ActNum)
            return;
        coinTotal = (float)vNetData.CoinTotal / (float)100;
        awardRecord = vNetData.AwardRecord;
        UpdateRedPoint();
        OnTotalRechargePlayerInfoEvent?.Invoke();
    }
 
    bool IsAwardHave(int awardIndex)
    {
        if (awardIndex < 0 || awardIndex >= 32)
            return false;
        return (awardRecord & (1u << awardIndex)) != 0;
    }
 
    // 获取奖励状态 0 不可领取 1 未领取 2 已领取
    public int GetState(int awardID)
    {
        var config = ActTotalRechargeTempConfig.Get(awardID);
        if (config == null)
            return 0;
        if (coinTotal < config.NeedAmount)
            return 0;
        bool isAwardHave = IsAwardHave(config.AwardIndex);
        return isAwardHave ? 2 : 1;
    }
 
    public bool IsReceived(int shopId)
    {
        var config = StoreConfig.Get(shopId);
        if (config == null)
            return false;
        int boughtCount = StoreModel.Instance.GetShopLimitBuyCount(shopId);
        return boughtCount >= config.LimitCnt;
    }
 
    public string GetActTimeStr()
    {
        if (!GetActInfo(out var act, out var config))
        {
            return Language.Get("OSActivity6");
        }
        return Language.Get("TotalRecharge08", TimeUtility.SecondsToShortDHMS(act.GetResetSurplusTime()));
    }
 
    public void SendGetReward(int awardIndex)
    {
        string actStr = ActNum.ToString();
        var pack = new CA504_tagCMPlayerGetReward();
        pack.RewardType = 18;
        pack.DataEx = (uint)awardIndex;
        pack.DataExStr = actStr;
        pack.DataExStrLen = (byte)actStr.Length;
        GameNetSystem.Instance.SendInfo(pack);
    }
}