using System;
|
using System.Collections.Generic;
|
|
public class HeroSkinFlashSaleManager : GameSystemManager<HeroSkinFlashSaleManager>, IOpenServerActivity
|
{
|
public override void Init()
|
{
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
|
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
|
OperationTimeHepler.Instance.operationTimeUpdateEvent += OperationTimeUpdateEvent;
|
OperationTimeHepler.Instance.operationStartEvent += OperationStartEvent;
|
OperationTimeHepler.Instance.operationEndEvent += OperationEndEvent;
|
OperationTimeHepler.Instance.operationAdvanceEvent += OperationAdvanceEvent;
|
}
|
|
public override void Release()
|
{
|
DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
|
DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
|
OperationTimeHepler.Instance.operationTimeUpdateEvent -= OperationTimeUpdateEvent;
|
OperationTimeHepler.Instance.operationStartEvent -= OperationStartEvent;
|
OperationTimeHepler.Instance.operationEndEvent -= OperationEndEvent;
|
OperationTimeHepler.Instance.operationAdvanceEvent -= OperationAdvanceEvent;
|
}
|
|
private void OnBeforePlayerDataInitializeEventOnRelogin()
|
{
|
|
}
|
|
private void OnPlayerLoginOk()
|
{
|
}
|
|
public const int activityID = (int)OperationType.HeroSkinFlashSale;
|
public static OperationType operaType = OperationType.HeroSkinFlashSale;
|
public Redpoint redPoint = new Redpoint(MainRedDot.HeroSkinFlashSaleRepoint);
|
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<int> onStateUpdate;
|
|
private void OperationTimeUpdateEvent(OperationType type)
|
{
|
if (type == operaType)
|
{
|
if (UIManager.Instance.IsOpened<HeroSkinFlashSaleWin>())
|
UIManager.Instance.CloseWindow<HeroSkinFlashSaleWin>();
|
}
|
}
|
|
private void OperationStartEvent(OperationType type, int state)
|
{
|
if (type == operaType && state == 0)
|
{
|
onStateUpdate?.Invoke(activityID);
|
}
|
}
|
|
private void OperationEndEvent(OperationType type, int state)
|
{
|
if (type == operaType)
|
{
|
if (UIManager.Instance.IsOpened<HeroSkinFlashSaleWin>())
|
UIManager.Instance.CloseWindow<HeroSkinFlashSaleWin>();
|
onStateUpdate?.Invoke(activityID);
|
}
|
}
|
|
private void OperationAdvanceEvent(OperationType type)
|
{
|
if (type == operaType)
|
{
|
onStateUpdate?.Invoke(activityID);
|
}
|
}
|
public bool IsHeroSkinFlashSaleOpen()
|
{
|
if (!IsOpen) return false;
|
if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HeroSkinFlashSale)) return false;
|
return true;
|
}
|
|
public OperationFlashSaleActivityInfo GetActInfo()
|
{
|
OperationTimeHepler.Instance.TryGetOperation(operaType, out OperationFlashSaleActivityInfo act);
|
return act;
|
}
|
|
public void GetActTimeStr(TextEx timeText, string key = "TimeRush05")
|
{
|
var act = GetActInfo();
|
if (act == null)
|
{
|
timeText.text = Language.Get("OSActivity6");
|
return;
|
}
|
timeText.text = Language.Get(key, TimeUtility.SecondsToShortDHMS(act.GetResetSurplusTime()));
|
}
|
|
|
public int GetDefaultSkinID(int heroID)
|
{
|
HeroConfig heroConfig = HeroConfig.Get(heroID);
|
if (heroConfig == null || heroConfig.SkinIDList.IsNullOrEmpty()) return 0;
|
return heroConfig.SkinIDList[0];
|
}
|
|
public bool IsCanBuy(int ctgID, out bool isNoLimitBuy, out int nowBuyCnt, out int maxBuyCnt)
|
{
|
isNoLimitBuy = false;
|
nowBuyCnt = 0;
|
maxBuyCnt = 0;
|
CTGConfig config = CTGConfig.Get(ctgID);
|
if (config == null)
|
return false;
|
if (!RechargeManager.Instance.TryGetRechargeCount(ctgID, out var rechargeCount))
|
return false;
|
|
// 所有限制都为0时,无限购买
|
if (config.TotalBuyCount == 0 && config.DailyBuyCount == 0 &&
|
config.WeekBuyCount == 0 && config.MonthBuyCount == 0)
|
{
|
isNoLimitBuy = true;
|
return true;
|
}
|
|
// 按优先级检查:每日 > 每周 > 每月 > 总计
|
if (config.DailyBuyCount > 0)
|
{
|
nowBuyCnt = rechargeCount.todayCount;
|
maxBuyCnt = config.DailyBuyCount;
|
return rechargeCount.todayCount < config.DailyBuyCount;
|
}
|
if (config.WeekBuyCount > 0)
|
{
|
nowBuyCnt = rechargeCount.weekPayCount;
|
maxBuyCnt = config.WeekBuyCount;
|
return rechargeCount.weekPayCount < config.WeekBuyCount;
|
}
|
if (config.MonthBuyCount > 0)
|
{
|
nowBuyCnt = rechargeCount.monthPayCount;
|
maxBuyCnt = config.MonthBuyCount;
|
return rechargeCount.monthPayCount < config.MonthBuyCount;
|
}
|
if (config.TotalBuyCount > 0)
|
{
|
nowBuyCnt = rechargeCount.totalCount;
|
maxBuyCnt = config.TotalBuyCount;
|
return rechargeCount.totalCount < config.TotalBuyCount;
|
}
|
return false;
|
}
|
|
public event Action OnCurrentChooseSkinIDChangeEevent;
|
private int m_currentChooseSkinID = 0;
|
|
public int currentChooseSkinID
|
{
|
get
|
{
|
return m_currentChooseSkinID;
|
}
|
set
|
{
|
if (m_currentChooseSkinID == value) return;
|
m_currentChooseSkinID = value;
|
OnCurrentChooseSkinIDChangeEevent?.Invoke();
|
}
|
}
|
|
/// <summary>
|
/// 通过skinID获取对应的heroID
|
/// </summary>
|
public int GetHeroIDBySkinID(int skinID)
|
{
|
foreach (var heroConfig in HeroConfig.GetValues())
|
{
|
if (heroConfig.SkinIDList != null && heroConfig.SkinIDList.Contains(skinID))
|
{
|
return heroConfig.HeroID;
|
}
|
}
|
return 0;
|
}
|
|
/// <summary>
|
/// 获取skinID在HeroConfig.SkinIDList中的索引
|
/// </summary>
|
public int GetSkinIndexInHeroConfig(int heroID, int skinID)
|
{
|
var heroConfig = HeroConfig.Get(heroID);
|
if (heroConfig?.SkinIDList == null) return int.MaxValue;
|
|
for (int i = 0; i < heroConfig.SkinIDList.Length; i++)
|
{
|
if (heroConfig.SkinIDList[i] == skinID)
|
return i;
|
}
|
return int.MaxValue;
|
}
|
|
//<skinID,ctgID>
|
Dictionary<int, int> ctgDict = new();
|
public int GetCtgIDBySkinID(int skinID)
|
{
|
if (ctgDict.IsNullOrEmpty())
|
{
|
GetSkinIDToCtgIDDict();
|
}
|
|
int ctgID;
|
ctgDict.TryGetValue(skinID, out ctgID);
|
return ctgID;
|
}
|
|
public bool TryGetCurrentActSkinIDByItemID(int itemID, out int skinID)
|
{
|
skinID = 0;
|
if (!HeroSkinAttrConfig.TryGetSkinIDByItemID(itemID, out skinID))
|
{
|
return false;
|
}
|
|
var act = GetActInfo();
|
if (act == null)
|
{
|
return false;
|
}
|
|
var skinIDList = GetSkinIDList(act.CfgID);
|
return skinIDList != null && skinIDList.Contains(skinID);
|
}
|
|
Dictionary<int, int> GetSkinIDToCtgIDDict()
|
{
|
if (!ctgDict.IsNullOrEmpty())
|
{
|
return ctgDict;
|
}
|
|
foreach (var config in ActSpecialSaleConfig.GetValues())
|
{
|
if (config == null || config.CTGIDList == null) return null;
|
|
for (int i = 0; i < config.CTGIDList.Length; i++)
|
{
|
var ctgID = config.CTGIDList[i];
|
var ctgConfig = CTGConfig.Get(ctgID);
|
if (ctgConfig == null || ctgConfig.GainItemList == null) continue;
|
|
for (int j = 0; j < ctgConfig.GainItemList.Length; j++)
|
{
|
var itemID = ctgConfig.GainItemList[j][0];
|
var itemConfig = ItemConfig.Get(itemID);
|
|
if (itemConfig == null) continue;
|
if (!HeroSkinAttrConfig.TryGetSkinIDByItemID(itemID, out var skinID)) continue;
|
if (ctgDict.ContainsKey(skinID)) continue;
|
ctgDict[skinID] = ctgID;
|
}
|
}
|
}
|
|
return ctgDict;
|
}
|
|
|
public List<int> GetSkinIDList(int cfgID)
|
{
|
var config = ActSpecialSaleConfig.Get(cfgID);
|
if (config == null || config.CTGIDList == null) return null;
|
|
var res = new List<int>();
|
for (int i = 0; i < config.CTGIDList.Length; i++)
|
{
|
var ctgID = config.CTGIDList[i];
|
var ctgConfig = CTGConfig.Get(ctgID);
|
if (ctgConfig == null || ctgConfig.GainItemList == null) continue;
|
|
for (int j = 0; j < ctgConfig.GainItemList.Length; j++)
|
{
|
var itemID = ctgConfig.GainItemList[j][0];
|
var itemConfig = ItemConfig.Get(itemID);
|
|
if (itemConfig == null) continue;
|
if (!HeroSkinAttrConfig.TryGetSkinIDByItemID(itemID, out var skinID)) continue;
|
if (res.Contains(skinID)) continue;
|
|
res.Add(skinID);
|
}
|
}
|
return res;
|
}
|
|
}
|