using System; using System.Collections.Generic; using System.Linq; public class TotalRechargeManager : GameSystemManager, IOpenServerActivity { public readonly int ActNum = 10; 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.OSGala) return; UpdateRedPoint(); } private void OnBeforePlayerDataInitializeEventOnRelogin() { coinTotal = 0; awardRecord = 0; } public const int activityType = (int)OpenServerActivityCenter.ActivityType.AT_DateActivity; public const int activityID = (int)NewDayActivityID.TotalRechargeAct; public static OperationType operaType = OperationType.TotalRecharge; // 总奖励 public Redpoint redPoint = new Redpoint(MainRedDot.RedPoint_OSGala, MainRedDot.RedPoint_OSGala * 10 + 5); public bool IsOpen => OperationTimeHepler.Instance.SatisfyOpenCondition(operaType); public bool IsAdvance => OperationTimeHepler.Instance.SatisfyAdvanceCondition(operaType); public bool priorityOpen => redPoint.state == RedPointState.Simple; public readonly int actNum = 10; public event Action onStateUpdate; private void OperationTimeUpdateEvent(OperationType type) { if (type == operaType) { } if (UIManager.Instance.IsOpened()) UIManager.Instance.CloseWindow(); 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()) UIManager.Instance.CloseWindow(); 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.OSGala)) 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 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(); 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); } }