using vnxbqy.UI; using System; using System.Collections.Generic; using UnityEngine.UI; using System.Linq; using LitJson; public class InvestModel : ILModel { public ILOpenServerActivityProxy activity; public const int activityType = (int)OpenServerActivityCenter.ActivityType.AT_JCHD; //精彩活动表中的ID public const int activityID = 31; public const int FuncID = 192; //投资类型 public const int InvestType_Login = 9; public const int InvestType_Level = 10; public const int InvestType_Boss = 11; //投资对应奖励 Dictionary>> m_InvestItems = new Dictionary>>(); //投资对应充值ID Dictionary> m_InvestRechargeIds = new Dictionary>(); //投资对应购买情况 Dictionary m_InvestInfos = new Dictionary(); //{投资类型:[领取天,当前天]} 天从1开始 Dictionary>> m_InvestSingleInfos = new Dictionary>>(); //投资对应的红点 Dictionary m_Redpoints = new Dictionary(); //投资类型 public List investTypes = new List(); //永久卡 权限 public const int foreverCardType = 12; //投资类型 public Dictionary bossMaxCntDict = new Dictionary(); //增加boss最大挑战次数 public Dictionary fbMaxCntDict = new Dictionary(); //增加副本最大挑战次数 public List missionQuickFinishType = new List(); //快速完成任务的投资类型 //登录投资,等级投资,BOSS投资 int m_SelectType = 0; public int selectType { get { return m_SelectType; } set { if (m_SelectType != value) { m_SelectType = value; if (onSelectUpdate != null) { onSelectUpdate(); } } } } public int jumpType { get; set; } public event Action onSelectUpdate; public event Action onInvestUpdate; public const int redpointID = 20931; public Redpoint redpoint = new Redpoint(MainRedDot.REDPOINT_OPENSERVER, redpointID); VipModel vipModel { get { return ModelCenter.Instance.GetModelEx(); } } protected override void Init() { FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; GameEvent.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; GameEvent.playerLoginOkEvent += OnPlayerLoginOk; WindowCenter.Instance.windowAfterOpenEvent += Instance_windowAfterOpenEvent; //通过配置决定是否有此投资项,如港台没有登录投资 ParseConfig(); activity = new ILOpenServerActivityProxy(IsOpen, IsAdvance, priorityOpen); OpenServerActivityCenter.Instance.Register(activityID, activity, activityType); } private void Instance_windowAfterOpenEvent(Window obj) { if (obj.name == "MainInterfaceWin") { AutoOpenForeverCardWin(1); } } protected override void UnInit() { FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; GameEvent.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; GameEvent.playerLoginOkEvent -= OnPlayerLoginOk; WindowCenter.Instance.windowAfterOpenEvent -= Instance_windowAfterOpenEvent; } public bool IsOpen() { return FuncOpen.Instance.IsFuncOpen(FuncID); } public bool IsAdvance() { return false; } public bool priorityOpen() { //红点 return redpoint.state == RedPointState.Simple; } public void OnBeforePlayerDataInitialize() { m_InvestInfos.Clear(); m_InvestSingleInfos.Clear(); } public void OnPlayerLoginOk() { UpdateRedpoint(); } void ParseConfig() { investTypes.Clear(); var funcConfig = FuncConfigConfig.Get("InvestCost"); var json = JsonMapper.ToObject(funcConfig.Numerical3); var jsonList = json.Keys.ToList(); for (int i = 0; i < jsonList.Count; i++) { var typeKey = jsonList[i]; var type = int.Parse(typeKey); if (type == InvestType_Login || type == InvestType_Level || type == InvestType_Boss || type == foreverCardType) { m_InvestRechargeIds[type] = new List(JsonMapper.ToObject(json[typeKey].ToJson())); if (type == foreverCardType) { m_Redpoints.Add(type, new Redpoint(MainRedDot.ForeverCardRedPoint)); } else { //IL 处理新增的投资 type=9之后 m_Redpoints.Add(type, new Redpoint(redpointID, redpointID * 100 + type)); } } } investTypes = m_InvestRechargeIds.Keys.ToList(); investTypes.Sort(); var configs = InvestConfig.GetValues(); for (int i = 0; i < configs.Count; i++) { var config = configs[i]; if (!investTypes.Contains(config.type)) { continue; } Dictionary> dict; if (!m_InvestItems.TryGetValue(config.type, out dict)) { dict = new Dictionary>(); m_InvestItems.Add(config.type, dict); } List items; if (!dict.TryGetValue(config.id, out items)) { items = new List(); dict.Add(config.id, items); } var itemJson = JsonMapper.ToObject(config.award); var itemArray = JsonMapper.ToObject(itemJson["1"].ToJson()); for (int j = 0; j < itemArray.Length; j++) { items.Add(new ItemEx() { id = itemArray[j][0], count = itemArray[j][1], bind = itemArray[j][2], }); } } funcConfig = FuncConfigConfig.Get("InvestPower"); json = JsonMapper.ToObject(funcConfig.Numerical1); jsonList = json.Keys.ToList(); for (int i = 0; i < jsonList.Count; i++) { var typeKey = jsonList[i]; var type = int.Parse(typeKey); var value = int.Parse(json[typeKey].ToJson()); bossMaxCntDict.Add(type, value); } json = JsonMapper.ToObject(funcConfig.Numerical2); jsonList = json.Keys.ToList(); for (int i = 0; i < jsonList.Count; i++) { var typeKey = jsonList[i]; var type = int.Parse(typeKey); var value = int.Parse(json[typeKey].ToJson()); fbMaxCntDict.Add(type, value); } missionQuickFinishType = JsonMapper.ToObject>(funcConfig.Numerical3); } public int GetOrderInfoId(int type) { var ids = m_InvestRechargeIds[type]; for (int i = 0; i < ids.Count; i++) { OrderInfoConfig config; if (vipModel.TryGetOrderInfo(ids[i], out config)) { return config.id; } } return 0; } //底层 windowjump调用 public void SetDefaultJumpType(int id) { jumpType = id; } //优先指定跳转 后红点 public int GetSelectType() { if (jumpType != 0 && investTypes.Contains(jumpType)) { var type = jumpType; jumpType = 0; return type; } else { var keyList = m_Redpoints.Keys.ToList(); for (int i = 0; i < keyList.Count; i++) { if (m_Redpoints[keyList[i]].state == RedPointState.Simple) { if (keyList[i] == foreverCardType) continue; return keyList[i]; } } } return investTypes[0]; } public bool hasInvestType(int type) { return investTypes.Contains(type); } public int GetInvestPassDays(int type) { return m_InvestInfos.ContainsKey(type) ? m_InvestInfos[type].days : 0; } //获得单投资的总收益 public int GetTotalIncome(int type) { var income = 0; if (m_InvestItems.ContainsKey(type)) { var keyList = m_InvestItems[type].Keys.ToList(); for (int i = 0; i < keyList.Count; i++) { var items = m_InvestItems[type][keyList[i]]; for (var j = 0; j < items.Count; j++) { var item = items[j]; if (item.id == 20 || item.id == 30) income += item.count; } } } return income; } //id 为表里的ID //0-未投资 1-未达成 2-可领取 3-已领取 public int GetSingleInvestState(int type, int id) { if (IsInvested(type)) { var day = GetInvestPassDays(type); if (m_InvestItems.ContainsKey(type) && m_InvestItems[type].ContainsKey(id)) { if (IsRewardGot(type, id)) { return 3; } var config = InvestConfig.Get(id); if (!m_InvestSingleInfos.ContainsKey(type)) { return 0; } var index = id % 100; //每个数按位存31个激活索引 var listIndex = index / 31; var bitIndex = index % 31; if (type == InvestType_Login) { return m_InvestSingleInfos[type][2][0] < config.needDay ? 1 : 2; } else if (type == InvestType_Level) { return PlayerDatas.Instance.baseData.LV < config.needLV ? 1 : 2; } else if (type == InvestType_Boss) { return ((int)Math.Pow(2, bitIndex) & m_InvestSingleInfos[type][2][listIndex]) == 0 ? 1 : 2; } return day < config.needDay ? 1 : 2; } } return 0; } public bool TryGetItems(int type, int id, out List items) { items = null; if (m_InvestItems.ContainsKey(type)) { return m_InvestItems[type].TryGetValue(id, out items); } return false; } public List GetIdsByType(int type) { if (m_InvestItems.ContainsKey(type)) { return m_InvestItems[type].Keys.ToList(); } return null; } //判断是否购买了投资 public bool IsInvested(int type) { return m_InvestInfos.ContainsKey(type) && m_InvestInfos[type].money > 0; } //奖励是否已领取 public bool IsRewardGot(int type, int id) { if (m_InvestSingleInfos.ContainsKey(type)) { var index = id % 100; //每个数按位存31个激活索引 var listIndex = index / 31; var bitIndex = index % 31; return ((int)Math.Pow(2, bitIndex) & m_InvestSingleInfos[type][1][listIndex]) != 0; } return false; } private void OnFuncStateChangeEvent(int id) { if (id == FuncID) { activity.StateUpdate(id); UpdateRedpoint(); } else if (id == 223) { AutoOpenForeverCardWin(0); } } //0 功能开启 1 非首日 自动打开 private void AutoOpenForeverCardWin(int type) { if (!FuncOpen.Instance.IsFuncOpen(223)) return; var ids = GetIdsByType(foreverCardType); var state = GetSingleInvestState(foreverCardType, ids[0]); if (state != 0) return; int openState = LocalSave.GetInt("ForeverCard" + PlayerDatas.Instance.baseData.PlayerID); if (type == 0) { if ((openState & 1) != 0) return; } else if (type == 1) { if ((openState & 2) != 0 || TimeUtility.CreateDays <= 1) return; } if (WindowCenter.Instance.IsOpen() && !NewBieCenter.Instance.inGuiding && !WindowCenter.Instance.ExistAnyFullScreenOrMaskWin() && !StageLoad.Instance.isLoading && !ModelCenter.Instance.GetModel().newGotShowing) { WindowCenter.Instance.Open(); openState = openState | (int)Math.Pow(2, type); LocalSave.SetInt("ForeverCard" + PlayerDatas.Instance.baseData.PlayerID, openState); } } public void SendGetReward(int type, int id) { var pak = new CA541_tagCMGetInvestReward(); pak.InvestType = (byte)type; pak.RewardIndex = (byte)(id % 100); GameNetSystem.Instance.SendInfo(pak); } public void SendInvest(int type) { var orderInfoId = GetOrderInfoId(type); var config = OrderInfoConfig.Get(orderInfoId); vipModel.CTG(config); } public void UpdateInvestInfo(HA338_tagMCInvestInfo package) { if (!investTypes.Contains(package.InvestType)) { return; } m_InvestInfos[package.InvestType] = new InvestInfo() { days = (int)package.CurDay, money = package.CurDay >= 1 ? 1 : 0, }; List> singleInfos; if (!m_InvestSingleInfos.TryGetValue(package.InvestType, out singleInfos)) { singleInfos = new List>(); m_InvestSingleInfos.Add(package.InvestType, singleInfos); } singleInfos.Clear(); singleInfos.Add(new List()); singleInfos.Add(new List()); singleInfos.Add(new List()); singleInfos[0].Add((int)package.CurDay); for (int i = 0; i < package.ValueCount; i++) { singleInfos[1].Add((int)package.RewardValue[i]); singleInfos[2].Add((int)package.ProgressValue[i]); } UpdateRedpoint(); if (onInvestUpdate != null) { onInvestUpdate(); } } void UpdateRedpoint() { List redpointTypes = new List(); if (IsOpen()) { for (var i = 0; i < investTypes.Count; i++) { var type = investTypes[i]; if (!IsInvested(type)) { continue; } var keyList = m_InvestItems[type].Keys.ToList(); for (int j = 0; j < keyList.Count; j++) { var id = keyList[j]; if (GetSingleInvestState(type, id) == 2) { redpointTypes.Add(type); break; } } } } var redList = m_Redpoints.Keys.ToList(); for (int j = 0; j < redList.Count; j++) { var type = redList[j]; m_Redpoints[type].state = redpointTypes.Contains(type) ? RedPointState.Simple : RedPointState.None; } } public int GetBossAddMaxCnt(int type) { var ids = GetIdsByType(foreverCardType); var state = GetSingleInvestState(foreverCardType, ids[0]); if (state == 0) return 0; int value = 0; bossMaxCntDict.TryGetValue(type, out value); return value; } public int GetFBAddMaxCnt(int mapID) { var ids = GetIdsByType(foreverCardType); var state = GetSingleInvestState(foreverCardType, ids[0]); if (state == 0) return 0; int value = 0; fbMaxCntDict.TryGetValue(mapID, out value); return value; } public bool IsMissionQuickFinish() { var ids = GetIdsByType(foreverCardType); var state = GetSingleInvestState(foreverCardType, ids[0]); if (state == 0) return false; return missionQuickFinishType.Contains(foreverCardType); } public bool IsOnHookQuickBuyFree() { var ids = GetIdsByType(foreverCardType); var state = GetSingleInvestState(foreverCardType, ids[0]); if (state == 0) return false; return true; } //已经购买并领取所有物品 public bool IsFinish() { for (int i = 0; i < investTypes.Count; i++) { int type = investTypes[i]; //忽略登陆投资 if (type== InvestType_Login) continue; //忽略永久卡 if (type == foreverCardType) continue; var idsList = GetIdsByType(type); if (idsList.IsNullOrEmpty()) continue; for (int j = 0; j < idsList.Count; j++) { int id = idsList[j]; if (GetSingleInvestState(type, id) != 3) { return false; } } } return true; } public struct InvestInfo { public int money; public int days; } }