using vnxbqy.UI;
|
using System;
|
using System.Collections.Generic;
|
using UnityEngine.UI;
|
using System.Linq;
|
using LitJson;
|
|
public class FuncSysPrivilegeModel : ILModel<FuncSysPrivilegeModel>
|
{
|
//激活封包信息
|
Dictionary<int, List<int>> activePackInfo = new Dictionary<int, List<int>>();
|
//功能ID对应激活的特权ID
|
public Dictionary<int, List<int>> funcIDToPrivilegeID = new Dictionary<int, List<int>>();
|
//特权ID对应奖励,多少组物品即代表有多少天奖励
|
public Dictionary<int, List<string>> PrivilegeIDItems = new Dictionary<int, List<string>>();
|
//已开启的特权ID
|
public List<int> OpenPrivilegeIDs = new List<int>();
|
public int DiscountCTGID;
|
public int[] BuyCountCTGID; // 不同数量购买的CTGID
|
|
Redpoint redpoint = new Redpoint(MainRedPoint.RechargeGenerousGiftWinRedpoint,MainRedPoint.gntqRedPoint);
|
|
Dictionary<int, Redpoint> redPointList = new Dictionary<int, Redpoint>();
|
|
VipModel vipModel { get { return ModelCenter.Instance.GetModelEx<VipModel>(); } }
|
|
public event Action OnPrivilegeEvent;
|
public event Action SelectEvent;
|
|
private int m_SelectType;
|
public int selectType
|
{
|
get { return m_SelectType; }
|
set
|
{
|
m_SelectType = value;
|
SelectEvent?.Invoke();
|
}
|
|
}
|
protected override void Init()
|
{
|
GameEvent.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
|
vipModel.rechargeCountEvent += rechargeCountEvent;
|
FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
|
GameEvent.playerDataRefreshEvent += OnPlayerDataRefreshEvent;
|
GameEvent.OnDayEvent += UpdateRedpoint;
|
ParseConfig();
|
//注册红点
|
var keyList = PrivilegeIDItems.Keys.ToList();
|
for (int i = 0; i < keyList.Count; i++)
|
{
|
redPointList.Add(keyList[i], new Redpoint(MainRedPoint.gntqRedPoint, MainRedPoint.gntqRedPoint * 100 + keyList[i]));
|
}
|
|
}
|
|
protected override void UnInit()
|
{
|
|
}
|
|
|
void ParseConfig()
|
{
|
DiscountCTGID = int.Parse(FuncConfigConfig.Get("FuncPrivilege").Numerical1);
|
BuyCountCTGID = JsonMapper.ToObject<int[]>(FuncConfigConfig.Get("FuncPrivilege").Numerical2);
|
|
funcIDToPrivilegeID.Clear();
|
|
var keyList = ILFuncSysPrivilegeConfig.GetKeys();
|
for (int i = 0; i < keyList.Count; i++)
|
{
|
var config = ILFuncSysPrivilegeConfig.Get(keyList[i]);
|
int privilegeID = config.FuncSysID;
|
int funcID = config.FuncID;
|
if (funcIDToPrivilegeID.ContainsKey(funcID))
|
{
|
if (!funcIDToPrivilegeID[funcID].Contains(privilegeID))
|
{
|
funcIDToPrivilegeID[funcID].Add(privilegeID);
|
}
|
}
|
else
|
{
|
funcIDToPrivilegeID[funcID] = new List<int>() { privilegeID };
|
}
|
|
if (PrivilegeIDItems.ContainsKey(privilegeID))
|
{
|
PrivilegeIDItems[privilegeID].Add(config.DayAwardItemInfo);
|
//不能直接使用类似 Dict<int List<int[][]>>
|
//Add(JsonMapper.ToObject<int[][]>(config.DayAwardItemInfo));
|
}
|
else
|
{
|
PrivilegeIDItems[privilegeID] = new List<string>() { config.DayAwardItemInfo };//{ JsonMapper.ToObject<int[][]>(config.DayAwardItemInfo) };
|
}
|
|
}
|
}
|
|
public int GetDefaultSelectType()
|
{
|
|
for (int i = 0; i < OpenPrivilegeIDs.Count; i++)
|
{
|
if (redPointList[OpenPrivilegeIDs[i]].state == RedPointState.Simple)
|
{
|
return OpenPrivilegeIDs[i];
|
}
|
}
|
|
return OpenPrivilegeIDs[0];
|
}
|
|
public void UpdateRedpoint()
|
{
|
redpoint.state = RedPointState.None;
|
var itemCnt = PlayerDatas.Instance.GetPlayerDataByType(PlayerDataType.default3);
|
//可领取和可激活的
|
for (int i = 0; i < OpenPrivilegeIDs.Count; i++)
|
{
|
var id = OpenPrivilegeIDs[i];
|
var state = GetStateByPrivilegeID(id);
|
|
redPointList[id].state = RedPointState.None;
|
if (state == 0 && itemCnt > 0)
|
{
|
//有可激活的
|
redpoint.state = RedPointState.Simple;
|
continue;
|
|
}
|
for (int j = 1; j <= PrivilegeIDItems[id].Count; j++)
|
{
|
if (GetStateByPrivilegeID(id, j) == 1)
|
{
|
//有可领取
|
redPointList[id].state = RedPointState.Simple;
|
break;
|
}
|
|
}
|
}
|
|
}
|
|
void OnBeforePlayerDataInitialize()
|
{
|
activePackInfo.Clear();
|
OpenPrivilegeIDs.Clear();
|
}
|
|
|
public void UpdatePack(IL_HB111_tagMCFuncSysPrivilegeInfoList pack)
|
{
|
for (int i = 0; i < pack.PrivilegeInfoList.Length; i++)
|
{
|
var info = pack.PrivilegeInfoList[i];
|
activePackInfo[info.FuncSysID] = new List<int>() { (int)info.ActivateTime, (int)info.AwardState};
|
}
|
OnPrivilegeEvent?.Invoke();
|
UpdateRedpoint();
|
}
|
|
|
// 未领取超过天数保留可领取,领完后才可激活
|
// 0 激活 1领取 2已领取 3 不可领取(时间未到) 4 已领取(超过总天数不显示)
|
public int GetStateByPrivilegeID(int pid, int day = 0)
|
{
|
if (!activePackInfo.ContainsKey(pid))
|
return 0;
|
int days = PrivilegeIDItems[pid].Count; //可领取几天
|
|
var buyTime = activePackInfo[pid][0]; //购买时间
|
|
if (buyTime == 0)
|
return 0;
|
var getState = activePackInfo[pid][1]; //领取记录
|
|
var buyDay = TimeUtility.GetTime((uint)buyTime);
|
var curDay = (TimeUtility.GetTodayStartTime() - TimeUtility.GetDayStartTime(buyDay.Year, buyDay.Month, buyDay.Day)).Days + 1;
|
|
if (day == 0)
|
{
|
//判断是否需要激活,未领取完不可激活,从第二位开始计算
|
if (getState == (Math.Pow(2, (days + 1)) - 2) && curDay > days)
|
{
|
return 0;
|
}
|
}
|
|
if ((activePackInfo[pid][1] & (1 << day)) == 0)
|
{
|
if (day > curDay)
|
{
|
//时间未到
|
return 3;
|
}
|
return 1;
|
}
|
if (curDay > days)
|
{
|
return 4;
|
}
|
return 2;
|
|
}
|
|
|
private void rechargeCountEvent(int id)
|
{
|
if (id != DiscountCTGID && !BuyCountCTGID.Contains(id))
|
{
|
return;
|
}
|
UpdateRedpoint();
|
}
|
|
// 切换账号客户端自己会自己广播功能,需判断是否开启
|
void OnFuncStateChangeEvent(int id)
|
{
|
if (!funcIDToPrivilegeID.ContainsKey(id))
|
{
|
return;
|
}
|
if (!FuncOpen.Instance.IsFuncOpen(id)) return;
|
|
for (int i = 0; i < funcIDToPrivilegeID[id].Count; i++)
|
{
|
var pid = funcIDToPrivilegeID[id][i];
|
if (!OpenPrivilegeIDs.Contains(pid))
|
{
|
OpenPrivilegeIDs.Add(pid);
|
}
|
}
|
|
OpenPrivilegeIDs.Sort();
|
}
|
|
void OnPlayerDataRefreshEvent(PlayerDataType dataType)
|
{
|
if (dataType != PlayerDataType.default3)
|
{
|
return;
|
}
|
UpdateRedpoint();
|
}
|
}
|