using vnxbqy.UI; using System; using System.Collections.Generic; using UnityEngine.UI; using System.Linq; using LitJson; public class FuncSysPrivilegeModel : ILModel { //激活封包信息 Dictionary> activePackInfo = new Dictionary>(); //功能ID对应激活的特权ID public Dictionary> funcIDToPrivilegeID = new Dictionary>(); //特权ID对应奖励,多少组物品即代表有多少天奖励 public Dictionary> PrivilegeIDItems = new Dictionary>(); //已开启的特权ID public List OpenPrivilegeIDs = new List(); public int DiscountCTGID; public int[] BuyCountCTGID; // 不同数量购买的CTGID Redpoint redpoint = new Redpoint(MainRedPoint.RechargeGenerousGiftWinRedpoint,MainRedPoint.gntqRedPoint); Dictionary redPointList = new Dictionary(); VipModel vipModel { get { return ModelCenter.Instance.GetModelEx(); } } 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(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() { privilegeID }; } if (PrivilegeIDItems.ContainsKey(privilegeID)) { PrivilegeIDItems[privilegeID].Add(config.DayAwardItemInfo); //不能直接使用类似 Dict> //Add(JsonMapper.ToObject(config.DayAwardItemInfo)); } else { PrivilegeIDItems[privilegeID] = new List() { config.DayAwardItemInfo };//{ JsonMapper.ToObject(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)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(); } }