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);
|
}
|
}
|