NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/BattlePass/MonthlyPassManager.cs

225 lines
6.9 KiB
C#

using cfg.ActorCfg;
using cfg.ChargeCfg;
using Framework;
using Gameplay;
using Gameplay.Net;
using NLDPB;
using PhxhSDK;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Gameplay.CommonUtils;
public class MonthlyPassManager : Singlenton<MonthlyPassManager>,IInitable
{
class MonthlyPassService
{
public bool IsPassUnlock { get; private set; }
public int RemainingDays { get; private set; }
public bool TodayHasClaimed { get; private set; }
public MonthlyPassService()
{
IsPassUnlock = false;
RemainingDays = 0;
TodayHasClaimed = false;
DebugUtil.Log("当前月卡状态: IsPassUnlock = " + IsPassUnlock + "\n RemainingDays = " + RemainingDays + "\n TodayHasClaimed = " + TodayHasClaimed);
}
/// <summary>
/// 数据同步
/// </summary>
public void Refresh()
{
IsPassUnlock = Actor.Instance.Logic.GetCount((uint)LogicID.MonthlyPassId) > 0;
if (IsPassUnlock)
{
Instance.UpdatePassService((int)Actor.Instance.Logic.GetCount((uint)LogicID.MonthlyPassId));
}
var EndTime = Actor.Instance.Logic.GetCount((uint)LogicID.MonthlyPassValidity);
if (EndTime > 0)
{
var EndDate = CommonUtils.GetTimeByTimestamp(EndTime);
RemainingDays = (int)(EndDate - CommonUtils.GetCurTime(E_TimeType.Server)).TotalDays;
}
else
{
RemainingDays = 0;
}
TodayHasClaimed = Actor.Instance.Logic.GetCount((uint)LogicID.MonthlyPassRewardStatus) == 1;
DebugUtil.Log("当前月卡状态: IsPassUnlock = " + IsPassUnlock + "\n RemainingDays = " + RemainingDays + "\n TodayHasClaimed = " + TodayHasClaimed);
}
}
private MonthlyPassService PassService;
private DataMonthlyPass CurrentPass = null;
public void Init()
{
var time = CommonUtils.GetCurTime(E_TimeType.Server);
var year = time.Year;
var month = time.Month;
string date = year + "-" + month;
Debug.Log("MonthlyPass init, Today: " + date);
PassService = new MonthlyPassService();
EventManager.Instance.Register<uint>(EventManager.EventName.PartLogicUpdate, LogicListener);
EventManager.Instance.Register(EventManager.EventName.MonthlyPassBuySuccess, PassService.Refresh);
EventManager.Instance.Register(EventManager.EventName.MonthlyPassGetReward, PassService.Refresh);
}
/// <summary>
/// 根据服务器信息更新当月月卡内容
/// </summary>
/// <param name="PassID"></param>
public void UpdatePassService(int PassID)
{
var table = TableManager.Instance.Tables.MonthlyPass;
if (table.DataMap.TryGetValue(PassID, out DataMonthlyPass data))
{
CurrentPass = data;
}
else
{
CurrentPass = null;
DebugUtil.LogError("MonthlyPassManager UpdatePassService Error: {0} not found", PassID);
}
}
public void Release()
{
EventManager.Instance.Unregister<uint>(EventManager.EventName.PartLogicUpdate, LogicListener);
EventManager.Instance.Unregister(EventManager.EventName.MonthlyPassBuySuccess, PassService.Refresh);
EventManager.Instance.Unregister(EventManager.EventName.MonthlyPassGetReward, PassService.Refresh);
}
void LogicListener(uint Logic)
{
if (Logic == (uint)LogicID.MonthlyPassId || Logic == (uint)LogicID.MonthlyPassRewardStatus || Logic == (uint)LogicID.MonthlyPassValidity)
{
PassService.Refresh();
}
}
/// <summary>
/// 可领取状态
/// </summary>
/// <returns></returns>
public bool TodayCanClaim()
{
return !PassService.TodayHasClaimed && PassService.IsPassUnlock && PassService.RemainingDays > 0;
}
#region 交互
/// <summary>
/// 购买月卡请求
/// </summary>
public void Purchase()
{
if(PassService.IsPassUnlock)
{
DebugUtil.Log("MonthlyPassManager Purchase Error: Pass is already unlocked");
return;
}
var currencyData = TableManager.Instance.Tables.CurrencyShopCfg.DataMap;
if (CurrentPass == null)
{
DebugUtil.LogError("MonthlyPassManager Purchase Error: CurrentPass is null");
return;
}
var currencyID = CurrentPass.PassProductID;
if (!currencyData.TryGetValue(currencyID, out var dataCurrencyShopCfg))
{
DebugUtil.LogError("CurrencyShopCfg 没有 {0} 配置的内购商品", currencyID);
return;
}
OnPurchase(dataCurrencyShopCfg);
}
/// <summary>
/// 领取月卡奖励服务器请求
/// </summary>
public void Claim()
{
if (TodayCanClaim())
{
var id = Actor.Instance.Logic.GetCount((uint)LogicID.MonthlyPassId);
NetHelper.MonthlyPassGetReward(id);
}
else
{
DebugUtil.Log("Cannot claim today");
}
}
#endregion
#region 界面
/// <summary>
/// 获取当前月卡图片路径
/// </summary>
/// <returns></returns>
public string GetPassPicPath()
{
var defaultPath = "";//TODO:后续补充默认图片路径
if (CurrentPass != null)
{
return CurrentPass.ProductPath;
}
else
{
DebugUtil.LogError("MonthlyPassManager GetPassPicPath Error: CurrentPass is null");
}
return defaultPath;
}
/// <summary>
/// 获取月卡描述
/// </summary>
/// <returns></returns>
public string GetPassDesc()
{
var defaultDesc = "";//TODO:后续补充默认描述
if (CurrentPass != null)
{
var key = CurrentPass.ProductDescription;
return CommonUtils.GetLocalizeText(key);
}
else
{
DebugUtil.LogError("MonthlyPassManager GetPassDesc Error: CurrentPass is null");
}
return GetLocalizeText(defaultDesc);
}
#endregion
private async void OnPurchase(DataCurrencyShopCfg cfg)
{
try
{
#if UNITY_IOS
// ios 只走苹果内购
IAPManager.Instance.SetCurrentPayChannel(IAPManager.PayChannel.Apple);
IAPManager.Instance.CheckAndBuyGoods(cfg.Id);
#elif SDK_BILIBILI
IAPManager.Instance.SetCurrentPayChannel(IAPManager.PayChannel.Bilibili);
IAPManager.Instance.IAPBuyGoods(cfg.Id);
#else
await UI_PayWindowController.Open(cfg);
#endif
}
catch (Exception e)
{
DebugUtil.LogError("MonthlyPass OnPurchase Error: {0}", e);
CommonUtils.ShowMessageTips("Purchase failed, please try again later.");//TODO:后续补充本地化
}
}
}