| using LitJson;  | 
| using System;  | 
| using System.Collections;  | 
| using System.Collections.Generic;  | 
| using System.Linq;  | 
| using UnityEngine;  | 
|   | 
|   | 
| public class HappyXBModel : GameSystemManager<HappyXBModel>  | 
| {  | 
|     private Dictionary<string, XBGetItemConfig> xbGetItemDict = new Dictionary<string, XBGetItemConfig>();  | 
|     private Dictionary<int, List<XBGetItemConfig>> xbTypeItemDict = new Dictionary<int, List<XBGetItemConfig>>();  | 
|     private Dictionary<string, Dictionary<int, XBGetItem>> jobXBItemDict = new Dictionary<string, Dictionary<int, XBGetItem>>();  | 
|     private Dictionary<int, XBFuncSet> xbFuncSetDict = new Dictionary<int, XBFuncSet>();  | 
|     public Dictionary<int, int> XBCostTypeDict = new Dictionary<int, int>();  | 
|     public HappXBTitle title = HappXBTitle.Best;  | 
|   | 
|   | 
|     public string USETOOLXBKey = string.Empty;  | 
|     public static string HAPPYXBITEMKEY;  | 
|     public List<ArrayList> XBNotifyParms = new List<ArrayList>();  | 
|     public bool isXBCoolTime { get; set; }  | 
|   | 
|     public bool isJumpBestXB { get; set; }  | 
|     public bool isJumpRuneXB { get; set; }  | 
|     public bool isJumpGubaoXB { get; set; }  | 
|     public bool isJumpGatherSoulXB { get; set; } //聚魂寻宝:是否跳过动画  | 
|   | 
|     public override void Init()  | 
|     {  | 
|         isJumpBestXB = false;  | 
|         isJumpRuneXB = false;  | 
|         isJumpGubaoXB = false;  | 
|         isJumpGatherSoulXB = false;  | 
|         xbGetItemDict.Clear();  | 
|         xbTypeItemDict.Clear();  | 
|         xbFuncSetDict.Clear();  | 
|         List<XBGetItemConfig> list = XBGetItemConfig.GetValues();  | 
|         for (int i = 0; i < list.Count; i++)  | 
|         {  | 
|             string key = StringUtility.Contact(list[i].TreasureType, list[i].MinLV);  | 
|             if (!xbGetItemDict.ContainsKey(key))  | 
|             {  | 
|                 xbGetItemDict.Add(key, list[i]);  | 
|             }  | 
|   | 
|             if (!xbTypeItemDict.ContainsKey(list[i].TreasureType))  | 
|             {  | 
|                 List<XBGetItemConfig> typeItemlist = new List<XBGetItemConfig>();  | 
|                 typeItemlist.Add(list[i]);  | 
|                 xbTypeItemDict.Add(list[i].TreasureType, typeItemlist);  | 
|             }  | 
|             else  | 
|             {  | 
|                 xbTypeItemDict[list[i].TreasureType].Add(list[i]);  | 
|             }  | 
|         }  | 
|   | 
|         SetXBFuncDict(1);  | 
|         SetXBFuncDict(2);  | 
|         // var treasureIDArr = JsonMapper.ToObject<int[]>(FuncConfigConfig.Get("TreasureLuckyDraw").Numerical1);  | 
|         // for (int i = 0; i < treasureIDArr.Length; i++)  | 
|         // {  | 
|         //     int type = XBGetItemConfig.Get(treasureIDArr[i]).TreasureType;  | 
|         //     SetXBFuncDict(type);  | 
|         // }  | 
|   | 
|         SetXBFuncDict(105);  | 
|         SetXBFuncDict(106);  | 
|         SetXBFuncDict(107);  | 
|         SetXBFuncDict(108);  | 
|         SysNotifyMgr.Instance.RegisterCondition("HappyXB", SatisfyNotifyCondition);  | 
|   | 
|         XBCostTypeDict.Clear();  | 
|   | 
|         XBCostTypeDict[(int)HappXBTitle.Best] = TreasureSetConfig.Get(1).CostMoneyType;  | 
|         XBCostTypeDict[(int)HappXBTitle.Rune] = TreasureSetConfig.Get(2).CostMoneyType;  | 
|         // for (int i = 0; i < treasureIDArr.Length; i++)  | 
|         // {  | 
|         //     int type = XBGetItemConfig.Get(treasureIDArr[i]).TreasureType;  | 
|         //     XBCostTypeDict[(int)HappXBTitle.Gubao1 + i] = TreasureSetConfig.Get(type).CostMoneyType;  | 
|         // }  | 
|         XBCostTypeDict[(int)HappXBTitle.YunShi1] = TreasureSetConfig.Get(105).CostMoneyType;  | 
|         XBCostTypeDict[(int)HappXBTitle.YunShi2] = TreasureSetConfig.Get(106).CostMoneyType;  | 
|         XBCostTypeDict[(int)HappXBTitle.YunShi3] = TreasureSetConfig.Get(107).CostMoneyType;  | 
|         XBCostTypeDict[(int)HappXBTitle.YunShi4] = TreasureSetConfig.Get(108).CostMoneyType;  | 
|     }  | 
|   | 
|   | 
|   | 
|     public void OnBeforePlayerDataInitialize()  | 
|     {  | 
|         PlayerDatas.Instance.playerDataRefreshEvent -= RefreshStoreScore;  | 
|         FuncOpen.Instance.OnFuncStateChangeEvent -= UpdateFuncState;  | 
|         PackManager.Instance.RefreshItemEvent -= RefreshXBTool;  | 
|         isXBCoolTime = false;  | 
|         XBNotifyParms.Clear();  | 
|         xbTypeInfoDict.Clear();  | 
|     }  | 
|     public void OnAfterPlayerDataInitialize()  | 
|     {  | 
|         SetXBGetItemModel();  | 
|     }  | 
|     public void OnPlayerLoginOk()  | 
|     {  | 
|         int playerId = (int)PlayerDatas.Instance.baseData.PlayerID;  | 
|         HAPPYXBITEMKEY = StringUtility.Contact(playerId, "HappyXBItemTime");  | 
|         USETOOLXBKey = StringUtility.Contact(playerId, "UseToolXB");  | 
|         XBWarehouseRedPoint();  | 
|         PlayerDatas.Instance.playerDataRefreshEvent += RefreshStoreScore;  | 
|         PackManager.Instance.RefreshItemEvent += RefreshXBTool;  | 
|         FuncOpen.Instance.OnFuncStateChangeEvent += UpdateFuncState;  | 
|     }  | 
|   | 
|   | 
|     /// <summary>  | 
|     /// 检测自身玩家是否需要信息提示  | 
|     /// </summary>  | 
|     /// <param name="key"></param>  | 
|     /// <param name="paramArray"></param>  | 
|     /// <returns></returns>  | 
|     private bool SatisfyNotifyCondition(string key, ArrayList paramArray)  | 
|     {  | 
|         switch (title)  | 
|         {  | 
|             case HappXBTitle.Best:  | 
|                 if (isJumpBestXB)  | 
|                 {  | 
|                     return true;  | 
|                 }  | 
|                 break;  | 
|             case HappXBTitle.Rune:  | 
|                 if (isJumpRuneXB)  | 
|                 {  | 
|                     return true;  | 
|                 }  | 
|                 break;  | 
|             case HappXBTitle.Gubao1:  | 
|             case HappXBTitle.Gubao2:  | 
|             case HappXBTitle.Gubao3:  | 
|             case HappXBTitle.Gubao4:  | 
|                 if (isJumpGubaoXB)  | 
|                 {  | 
|                     return true;  | 
|                 }  | 
|                 break;  | 
|             case HappXBTitle.GatherSoul:  | 
|                 if (isJumpGatherSoulXB)  | 
|                 {  | 
|                     return true;  | 
|                 }  | 
|                 break;  | 
|             case HappXBTitle.YunShi1:  | 
|             case HappXBTitle.YunShi2:  | 
|             case HappXBTitle.YunShi3:  | 
|             case HappXBTitle.YunShi4:  | 
|                 // if (ModelCenter.Instance.GetModelEx<YunShiXBActModel>().isSkipXB)  | 
|                 // {  | 
|                 //     return true;  | 
|                 // }  | 
|                 break;  | 
|         }  | 
|   | 
|         XBNotifyParms.Add(new ArrayList(paramArray));  | 
|         if (paramArray != null && paramArray.Count > 0 &&  | 
|             paramArray[0].Equals(UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName)))  | 
|         {  | 
|             return false;  | 
|         }  | 
|         return true;  | 
|     }  | 
|   | 
|     public void GetNotifyResult(int itemId, int itemCount)  | 
|     {  | 
|         int notifyIndex = 0;  | 
|         if (CheckNotifyItemByIdAndCnt(itemId, itemCount, out notifyIndex))  | 
|         {  | 
|             SysNotifyMgr.Instance.ShowTip("HappyXB", XBNotifyParms[notifyIndex].ToArray());  | 
|         }  | 
|     }  | 
|   | 
|     private bool CheckNotifyItemByIdAndCnt(int itemId, int itemCnt, out int notifyIndex)  | 
|     {  | 
|         notifyIndex = 0;  | 
|         for (int i = 0; i < XBNotifyParms.Count; i++)  | 
|         {  | 
|             if (XBNotifyParms[i] != null && XBNotifyParms[i].Count > 3)  | 
|             {  | 
|                 int notifyItemId = 0;  | 
|                 int.TryParse(XBNotifyParms[i][1].ToString(), out notifyItemId);  | 
|                 int notifyItemCnt = 0;  | 
|                 int.TryParse(XBNotifyParms[i][3].ToString(), out notifyItemCnt);  | 
|                 if (notifyItemId == itemId && notifyItemCnt == itemCnt)  | 
|                 {  | 
|                     notifyIndex = i;  | 
|                     return true;  | 
|                 }  | 
|             }  | 
|         }  | 
|         return false;  | 
|     }  | 
|   | 
|     private void SetXBFuncDict(int type)  | 
|     {  | 
|         var treasureSetCfg = TreasureSetConfig.Get(type);  | 
|         if (!xbFuncSetDict.ContainsKey(type))  | 
|         {  | 
|             XBFuncSet funcSet = new XBFuncSet();  | 
|             funcSet.xbType = type;  | 
|             funcSet.xbNums = treasureSetCfg.TreasureCountList;  | 
|   | 
|             funcSet.xbPrices = treasureSetCfg.CostMoneyList;  | 
|   | 
|             funcSet.costToolIds = new int[] { treasureSetCfg.CostItemID, treasureSetCfg.CostItemID };  | 
|             funcSet.costToolNums = treasureSetCfg.CostItemCountList;  | 
|             funcSet.dailyFreeCount = treasureSetCfg.DailyFreeCount;  | 
|             funcSet.xbScores = new int[] { treasureSetCfg.AwardMoneyValue, treasureSetCfg.AwardMoneyValue * treasureSetCfg.TreasureCountList[1] };  | 
|   | 
|             xbFuncSetDict.Add(funcSet.xbType, funcSet);  | 
|         }  | 
|     }  | 
|   | 
|     public XBFuncSet GetXBFuncSet(int type)  | 
|     {  | 
|         XBFuncSet funcSet = null;  | 
|         xbFuncSetDict.TryGetValue(type, out funcSet);  | 
|         return funcSet;  | 
|     }  | 
|   | 
|     //默认优先使用道具寻宝  | 
|     public bool IsUseToolXB()  | 
|     {  | 
|         return true;  | 
|         //if (!PlayerPrefs.HasKey(USETOOLXBKey))  | 
|         //{  | 
|         //    LocalSave.SetBool(USETOOLXBKey, true);  | 
|         //    return true;  | 
|         //}  | 
|         //else  | 
|         //{  | 
|         //    return LocalSave.GetBool(USETOOLXBKey);  | 
|         //}  | 
|     }  | 
|   | 
|     public void SetUseToolXB(bool isToolXB)  | 
|     {  | 
|         //LocalSave.SetBool(USETOOLXBKey, isToolXB);  | 
|     }  | 
|   | 
|     private void SetXBGetItemModel()  | 
|     {  | 
|         jobXBItemDict.Clear();  | 
|         Dictionary<int, XBGetItem> getItemDict = new Dictionary<int, XBGetItem>();  | 
|         Dictionary<int, List<int>> jobItemDict = new Dictionary<int, List<int>>();  | 
|         int playerJob = PlayerDatas.Instance.baseData.Job;  | 
|         foreach (var key in xbGetItemDict.Keys)  | 
|         {  | 
|   | 
|             getItemDict.Clear();  | 
|             jobItemDict.Clear();  | 
|             Dictionary<int, XBGetItem> jobGetItemDict = new Dictionary<int, XBGetItem>();  | 
|             XBGetItemConfig getItemConfig = xbGetItemDict[key];  | 
|             jobXBItemDict.Add(key, jobGetItemDict);  | 
|             JsonData getItemJson = JsonMapper.ToObject(getItemConfig.GridItemInfo);  | 
|             foreach (var grid in getItemJson.Keys)  | 
|             {  | 
|                 int id = int.Parse(getItemJson[grid][0].ToString());  | 
|                 int count = int.Parse(getItemJson[grid][1].ToString());  | 
|                 XBGetItem getItem = new XBGetItem();  | 
|                 getItem.SetModel(int.Parse(grid), id, count);  | 
|                 getItemDict.Add(getItem.gridIndex, getItem);  | 
|             }  | 
|             JsonData jobReplaceJson = JsonMapper.ToObject(getItemConfig.JobItemList);  | 
|             if (jobReplaceJson.IsArray)  | 
|             {  | 
|                 for (int i = 0; i < jobReplaceJson.Count; i++)  | 
|                 {  | 
|                     List<int> itemIdlist = new List<int>();  | 
|                     jobItemDict.Add(i, itemIdlist);  | 
|                     if (jobReplaceJson[i].IsArray)  | 
|                     {  | 
|                         for (int j = 0; j < jobReplaceJson[i].Count; j++)  | 
|                         {  | 
|                             int id = int.Parse(jobReplaceJson[i][j].ToString());  | 
|                             itemIdlist.Add(id);  | 
|                         }  | 
|                     }  | 
|                 }  | 
|             }  | 
|   | 
|             foreach (var model in getItemDict.Values)  | 
|             {  | 
|                 ItemConfig itemConfig = ItemConfig.Get(model.itemId);  | 
|                 if (itemConfig.JobLimit == 0)  | 
|                 {  | 
|                     jobGetItemDict.Add(model.gridIndex, model);  | 
|                 }  | 
|                 else  | 
|                 {  | 
|                     bool isReplace = false;  | 
|                     foreach (var list in jobItemDict.Values)  | 
|                     {  | 
|                         if (list.Contains(model.itemId))  | 
|                         {  | 
|                             for (int i = 0; i < list.Count; i++)  | 
|                             {  | 
|                                 int equipJob = int.Parse(list[i].ToString().Substring(0, 1));  | 
|                                 if (playerJob == equipJob)  | 
|                                 {  | 
|                                     isReplace = true;  | 
|                                     XBGetItem getItem = new XBGetItem();  | 
|                                     getItem.SetModel(model.gridIndex, list[i], model.count);  | 
|                                     jobGetItemDict.Add(getItem.gridIndex, getItem);  | 
|                                     break;  | 
|                                 }  | 
|                             }  | 
|                             break;  | 
|                         }  | 
|                     }  | 
|                     if (!isReplace)  | 
|                     {  | 
|                         jobGetItemDict.Add(model.gridIndex, model);  | 
|                     }  | 
|                 }  | 
|   | 
|             }  | 
|   | 
|         }  | 
|   | 
|     }  | 
|   | 
|     public Dictionary<int, XBGetItem> GetXBGetItemByID(int type)  | 
|     {  | 
|         int lv = 0;  | 
|         List<XBGetItemConfig> configlist = null;  | 
|         xbTypeItemDict.TryGetValue(type, out configlist);  | 
|         if (configlist != null)  | 
|         {  | 
|             for (int i = configlist.Count - 1; i > -1; i--)  | 
|             {  | 
|                 if (PlayerDatas.Instance.baseData.LV >= configlist[i].MinLV)  | 
|                 {  | 
|                     lv = configlist[i].MinLV;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|         }  | 
|         string key = StringUtility.Contact(type, lv);  | 
|         Dictionary<int, XBGetItem> dict = null;  | 
|         jobXBItemDict.TryGetValue(key, out dict);  | 
|         return dict;  | 
|     }  | 
|   | 
|     public XBGetItemConfig GetXBItemConfigByType(int type)  | 
|     {  | 
|         int lv = 0;  | 
|         List<XBGetItemConfig> configlist = null;  | 
|         xbTypeItemDict.TryGetValue(type, out configlist);  | 
|         if (configlist != null)  | 
|         {  | 
|             for (int i = configlist.Count - 1; i > -1; i--)  | 
|             {  | 
|                 if (PlayerDatas.Instance.baseData.LV >= configlist[i].MinLV)  | 
|                 {  | 
|                     lv = configlist[i].MinLV;  | 
|                     break;  | 
|                 }  | 
|             }  | 
|         }  | 
|         XBGetItemConfig xbItemConfig = null;  | 
|         string key = StringUtility.Contact(type, lv);  | 
|         xbGetItemDict.TryGetValue(key, out xbItemConfig);  | 
|         return xbItemConfig;  | 
|     }  | 
|   | 
|     #region 处理服务端数据  | 
|     public event Action RefreshXBTypeInfoAct;  | 
|     public event Action RefreshXBResultAct;  | 
|     public int addXBScore { get; private set; }  | 
|     public int addXBScoreType { get; private set; } //寻宝积分货币类型  | 
|     public int addXBLuckValue { get; private set; }  | 
|     private Dictionary<int, XBGetItem> xbResultDict = new Dictionary<int, XBGetItem>();  | 
|     public void GetServerXBResult(HA350_tagMCTreasureResult result)  | 
|     {  | 
|         XBNotifyParms.Clear();  | 
|         xbResultDict.Clear();  | 
|         addXBScore = result.AddMoneyValue;  | 
|         addXBScoreType = result.AddMoneyType;  | 
|         addXBLuckValue = result.AddTreasureLuck;  | 
|         JsonData resultData = JsonMapper.ToObject(result.TreasureResult);  | 
|         if (resultData.IsArray)  | 
|         {  | 
|             for (int i = 0; i < resultData.Count; i++)  | 
|             {  | 
|                 if (resultData[i].IsArray)  | 
|                 {  | 
|                     int index = int.Parse(resultData[i][0].ToString());  | 
|                     int itemId = int.Parse(resultData[i][1].ToString());  | 
|                     int count = int.Parse(resultData[i][2].ToString());  | 
|                     XBGetItem getItem = new XBGetItem();  | 
|                     getItem.SetModel(index, itemId, count);  | 
|                     if (!xbResultDict.ContainsKey(i))  | 
|                     {  | 
|                         xbResultDict.Add(i, getItem);  | 
|                     }  | 
|                     else  | 
|                     {  | 
|                         xbResultDict[i] = getItem;  | 
|                     }  | 
|                 }  | 
|             }  | 
|         }  | 
|         SetXBResultRecord();  | 
|         isXBCoolTime = false;  | 
|         if (RefreshXBResultAct != null)  | 
|         {  | 
|             RefreshXBResultAct();  | 
|         }  | 
|     }  | 
|   | 
|     List<string> itemGetTimeArray = new List<string>();  | 
|     List<string> getNewItemLoglist = new List<string>();  | 
|     List<XBGetItem> xbItemRecordlist = new List<XBGetItem>();  | 
|     public void SetXBResultRecord()  | 
|     {  | 
|         if (PlayerPrefs.HasKey(HAPPYXBITEMKEY))  | 
|         {  | 
|             itemGetTimeArray = LocalSave.GeStringArray(HappyXBModel.HAPPYXBITEMKEY).ToList();  | 
|         }  | 
|         else  | 
|         {  | 
|             itemGetTimeArray.Clear();  | 
|         }  | 
|         xbItemRecordlist.Clear();  | 
|         getNewItemLoglist.Clear();  | 
|         xbItemRecordlist.AddRange(GetXBResultlist());  | 
|         if (xbItemRecordlist != null)  | 
|         {  | 
|             int remianLogNum = (itemGetTimeArray.Count + xbItemRecordlist.Count) - 30;  | 
|             if (remianLogNum > 0)  | 
|             {  | 
|                 int startIndex = itemGetTimeArray.Count - remianLogNum;  | 
|                 itemGetTimeArray.RemoveRange(startIndex, remianLogNum);  | 
|             }  | 
|             xbItemRecordlist.Sort(CompareByTime);  | 
|             for (int i = 0; i < xbItemRecordlist.Count; i++)  | 
|             {  | 
|                 string log = Language.Get("HappyXBGetItemTime", xbItemRecordlist[i].createTimeStr, UIHelper.ServerStringTrim(PlayerDatas.Instance.baseData.PlayerName),  | 
|                     xbItemRecordlist[i].itemId, xbItemRecordlist[i].count);  | 
|                 getNewItemLoglist.Add(log);  | 
|             }  | 
|             if (getNewItemLoglist.Count > 0)  | 
|             {  | 
|                 itemGetTimeArray.InsertRange(0, getNewItemLoglist);  | 
|                 LocalSave.SetStringArray(HappyXBModel.HAPPYXBITEMKEY, itemGetTimeArray.ToArray());  | 
|             }  | 
|   | 
|         }  | 
|     }  | 
|   | 
|     public int CompareByTime(XBGetItem start, XBGetItem end)  | 
|     {  | 
|         DateTime startTime = start.createTime;  | 
|         DateTime endTime = end.createTime;  | 
|         if (startTime.CompareTo(endTime) != 0) return -startTime.CompareTo(endTime);  | 
|   | 
|         return 0;  | 
|     }  | 
|   | 
|     public List<XBGetItem> rangelist = new List<XBGetItem>();  | 
|     List<int> index = new List<int>();  | 
|     public List<XBGetItem> GetXBResultlist()  | 
|     {  | 
|         rangelist.Clear();  | 
|         index.Clear();  | 
|         List<XBGetItem> xbItemlist = xbResultDict.Values.ToList();  | 
|         for (int i = 0; i < xbItemlist.Count; i++)  | 
|         {  | 
|             index.Add(i);  | 
|         }  | 
|         SetRandomList(xbItemlist);  | 
|         return rangelist;  | 
|     }  | 
|   | 
|     public void SetRandomList(List<XBGetItem> xbItemlist)  | 
|     {  | 
|         int currentRandom = UnityEngine.Random.Range(0, index.Count);  | 
|         XBGetItem current = xbItemlist[index[currentRandom]];  | 
|         if (!rangelist.Contains(current))  | 
|         {  | 
|             rangelist.Add(current);  | 
|             index.Remove(index[currentRandom]);  | 
|   | 
|         }  | 
|         if (index.Count > 0)  | 
|         {  | 
|             SetRandomList(xbItemlist);  | 
|         }  | 
|     }  | 
|   | 
|     public Dictionary<int, XBGetItem> GetXbResultDict()  | 
|     {  | 
|         return xbResultDict;  | 
|     }  | 
|   | 
|     public void ClearXBRusltData()  | 
|     {  | 
|         xbResultDict.Clear();  | 
|     }  | 
|   | 
|     private Dictionary<int, XBTypeInfo> xbTypeInfoDict = new Dictionary<int, XBTypeInfo>();  | 
|     public void GetServerXBInfo(HA351_tagMCTreasureInfo info)  | 
|     {  | 
|         for (int i = 0; i < info.InfoCount; i++)  | 
|         {  | 
|             if (!xbTypeInfoDict.ContainsKey(info.TreasuerInfoList[i].TreasureType))  | 
|             {  | 
|                 XBTypeInfo typeInfo = new XBTypeInfo();  | 
|                 typeInfo.xbType = info.TreasuerInfoList[i].TreasureType;  | 
|                 typeInfo.luckValue = info.TreasuerInfoList[i].LuckValue;  | 
|                 typeInfo.freeCountToday = info.TreasuerInfoList[i].FreeCountToday;  | 
|                 typeInfo.treasureCount = (int)info.TreasuerInfoList[i].TreasureCount;  | 
|                 typeInfo.treasureCountToday = (int)info.TreasuerInfoList[i].TreasureCountToday;  | 
|                 typeInfo.treasureCntAward = (int)info.TreasuerInfoList[i].TreasureCntAward;  | 
|                 if (typeInfo.gridLimitCntDict == null)  | 
|                     typeInfo.gridLimitCntDict = new Dictionary<int, int>();  | 
|                 for (int j = 0; j < info.TreasuerInfoList[i].GridLimitCntList.Length; j++)  | 
|                 {  | 
|                     int num = info.TreasuerInfoList[i].GridLimitCntList[j].GridNum;  | 
|                     int cnt = info.TreasuerInfoList[i].GridLimitCntList[j].GridCnt;  | 
|                     typeInfo.gridLimitCntDict[num] = cnt;  | 
|                 }  | 
|                 xbTypeInfoDict.Add(info.TreasuerInfoList[i].TreasureType, typeInfo);  | 
|             }  | 
|             else  | 
|             {  | 
|                 xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].luckValue = info.TreasuerInfoList[i].LuckValue;  | 
|                 xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].freeCountToday = info.TreasuerInfoList[i].FreeCountToday;  | 
|                 xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].treasureCount = (int)info.TreasuerInfoList[i].TreasureCount;  | 
|                 xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].treasureCountToday = (int)info.TreasuerInfoList[i].TreasureCountToday;  | 
|                 xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].treasureCntAward = (int)info.TreasuerInfoList[i].TreasureCntAward;  | 
|                 if (xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].gridLimitCntDict == null)  | 
|                     xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].gridLimitCntDict = new Dictionary<int, int>();  | 
|                 for (int j = 0; j < info.TreasuerInfoList[i].GridLimitCntList.Length; j++)  | 
|                 {  | 
|                     int num = info.TreasuerInfoList[i].GridLimitCntList[j].GridNum;  | 
|                     int cnt = info.TreasuerInfoList[i].GridLimitCntList[j].GridCnt;  | 
|                     xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].gridLimitCntDict[num] = cnt;  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|   | 
|         if (RefreshXBTypeInfoAct != null)  | 
|         {  | 
|             RefreshXBTypeInfoAct();  | 
|         }  | 
|   | 
|         BestAndRuneXBRedPoint();  | 
|     }  | 
|   | 
|     public XBTypeInfo GetXBInfoByType(int type)  | 
|     {  | 
|         XBTypeInfo typeInfo = null;  | 
|         xbTypeInfoDict.TryGetValue(type, out typeInfo);  | 
|         return typeInfo;  | 
|     }  | 
|   | 
|     /// <summary>  | 
|     /// type 1 极品寻宝 2 符印寻宝  index 0 单次寻宝 1 多次寻宝  | 
|     ///costType 0-默认仙玉;1-免费次数;2-寻宝道具  | 
|     /// </summary>  | 
|     /// <param name="type"></param>  | 
|     /// <param name="index"></param>  | 
|     public event Action<int> StartXBEvent;  | 
|     public void SendXBQuest(int type, int index, int costType)  | 
|     {  | 
|         isXBCoolTime = true;  | 
|         CA568_tagCMRequestTreasure treasure = new CA568_tagCMRequestTreasure();  | 
|         treasure.TreasureType = (byte)type;  | 
|         treasure.TreasureIndex = (byte)index;  | 
|         treasure.CostType = (byte)costType;  | 
|         GameNetSystem.Instance.SendInfo(treasure);  | 
|         if (StartXBEvent != null)  | 
|         {  | 
|             StartXBEvent(index);  | 
|         }  | 
|     }  | 
|   | 
|   | 
|   | 
|     public bool CheckIsEmptyGrid(PackType type, int needGrid = 1)  | 
|     {  | 
|         switch (type)  | 
|         {  | 
|             case PackType.Treasure:  | 
|                 SinglePack singlePack = PackManager.Instance.GetSinglePack(type);  | 
|                 if (GeneralDefine.maxXBGridCount - singlePack.GetAllItems().Count < needGrid)  | 
|                 {  | 
|                     SysNotifyMgr.Instance.ShowTip("XBWarehouseFull");  | 
|                     return false;  | 
|                 }  | 
|                 break;  | 
|             case PackType.Item:  | 
|                 if (PackManager.Instance.GetEmptyGridCount(type) < needGrid)  | 
|                 {  | 
|                     SysNotifyMgr.Instance.ShowTip("BagFull");  | 
|                     return false;  | 
|                 }  | 
|                 break;  | 
|         }  | 
|         return true;  | 
|     }  | 
|   | 
|     public void SendOneXBQuest(PackType type, int xbType)  | 
|     {  | 
|         var config = TreasureSetConfig.Get(xbType);  | 
|         if (GetXBInfoByType(xbType).treasureCountToday + config.TreasureCountList[0] > config.DailyMaxCount)  | 
|         {  | 
|             SysNotifyMgr.Instance.ShowTip("XBTodayMax");  | 
|             return;  | 
|         }  | 
|   | 
|         var funcSet = GetXBFuncSet(xbType);  | 
|         if (CheckIsEmptyGrid(type))  | 
|         {  | 
|             if (IsHaveOneXBTool(xbType))  | 
|             {  | 
|                 SendXBQuest(xbType, 0, 2);  | 
|                 return;  | 
|             }  | 
|   | 
|   | 
|   | 
|             int moneyType = XBCostTypeDict[xbType];  | 
|             int xbOneMoney = funcSet.xbPrices[0];  | 
|   | 
|             if (UIHelper.GetMoneyCnt(moneyType) >= (ulong)xbOneMoney)  | 
|             {  | 
|                 StoreModel.Instance.UseMoneyCheck(xbOneMoney, () =>  | 
|                 {  | 
|                     SendXBQuest(xbType, 0, 0);  | 
|                 }, xbType == 1 ? 5 : 6, fullTip: Language.Get("TreasurePavilion08", xbOneMoney, moneyType, funcSet.costToolIds[0], 1));  | 
|             }  | 
|             else  | 
|             {  | 
|                 SysNotifyMgr.Instance.ShowTip("LackMoney", moneyType);  | 
|   | 
|             }  | 
|         }  | 
|     }  | 
|   | 
|   | 
|     public void SendXBManyQuest(PackType type, int xbType)  | 
|     {  | 
|         var config = TreasureSetConfig.Get(xbType);  | 
|         if (GetXBInfoByType(xbType).treasureCountToday + config.TreasureCountList[1] > config.DailyMaxCount)  | 
|         {  | 
|             SysNotifyMgr.Instance.ShowTip("XBTodayMax");  | 
|             return;  | 
|         }  | 
|   | 
|         var funcSet = GetXBFuncSet(xbType);  | 
|         if (CheckIsEmptyGrid(type))  | 
|         {  | 
|             int toolCnt = 0;  | 
|             int needToolCnt = 0;  | 
|             int needMoney = 0;  | 
|             if (IsHaveManyXBToolEx(xbType, out toolCnt, out needToolCnt, out needMoney))  | 
|             {  | 
|                 if (toolCnt >= needToolCnt)  | 
|                 {  | 
|                     CheckXBManyLimit(0, xbType, 2);  | 
|   | 
|                     return;  | 
|                 }  | 
|   | 
|             }  | 
|   | 
|             int moneyType = XBCostTypeDict[xbType];  | 
|             int xbManyMoney = needMoney == 0 ? funcSet.xbPrices[1] : needMoney;  | 
|   | 
|             if (UIHelper.GetMoneyCnt(moneyType) >= (ulong)xbManyMoney)  | 
|             {  | 
|                 StoreModel.Instance.UseMoneyCheck(xbManyMoney, () =>  | 
|                 {  | 
|                     SendXBQuest(xbType, 1, toolCnt > 0 ? 2 : 0);  | 
|                 }, xbType == 1 ? 5 : 6, fullTip: Language.Get("TreasurePavilion08", xbManyMoney, moneyType, funcSet.costToolIds[1], needToolCnt - toolCnt));  | 
|             }  | 
|             else  | 
|             {  | 
|                 SysNotifyMgr.Instance.ShowTip("LackMoney", moneyType);  | 
|   | 
|             }  | 
|   | 
|         }  | 
|     }  | 
|   | 
|     public void CheckXBManyLimit(int needMoney, int xbtype, int costType)  | 
|     {  | 
|         int moneyType = XBCostTypeDict[xbtype];  | 
|         if (UIHelper.GetMoneyCnt(moneyType) >= (ulong)needMoney)  | 
|         {  | 
|             SendXBQuest(xbtype, 1, costType);  | 
|         }  | 
|         else  | 
|         {  | 
|             //WindowCenter.Instance.Open<RechargeTipWin>();  | 
|             SysNotifyMgr.Instance.ShowTip("LackMoney", moneyType);  | 
|         }  | 
|     }  | 
|     #endregion  | 
|   | 
|     public bool IsHaveFreeXB(int type)  | 
|     {  | 
|         XBTypeInfo typeInfo = GetXBInfoByType(type);  | 
|         if (typeInfo == null)  | 
|         {  | 
|             typeInfo = new XBTypeInfo()  | 
|             {  | 
|                 xbType = type,  | 
|                 luckValue = 0,  | 
|                 freeCountToday = 0,  | 
|                 treasureCount = 0,  | 
|             };  | 
|         }  | 
|   | 
|         //判断是否有免费次数,且免费次数是否用完  | 
|         var funcSet = GetXBFuncSet(type);  | 
|         return typeInfo.freeCountToday < funcSet.dailyFreeCount;  | 
|     }  | 
|   | 
|   | 
|     public bool CheckIsXBTool(int itemId, int type)  | 
|     {  | 
|         XBFuncSet funcSet = GetXBFuncSet(type);  | 
|         if (funcSet == null) return false;  | 
|   | 
|         if (funcSet.costToolIds.Contains(itemId))  | 
|         {  | 
|             return true;  | 
|         }  | 
|         return false;  | 
|     }  | 
|     public bool IsHaveOneXBTool(int type)  | 
|     {  | 
|         XBFuncSet funcSet = GetXBFuncSet(type);  | 
|         if (funcSet == null) return false;  | 
|   | 
|         int toolCnt = (int)PackManager.Instance.GetItemCountByID(PackType.Item, funcSet.costToolIds[0]);  | 
|         if (toolCnt >= funcSet.costToolNums[0])  | 
|         {  | 
|             return true;  | 
|         }  | 
|   | 
|         return false;  | 
|     }  | 
|   | 
|     //needToolCnt 为配表中需要的道具数量  | 
|     public bool IsHaveManyXBTool(int type, out int toolCnt, out int needToolCnt)  | 
|     {  | 
|         toolCnt = 0;  | 
|         needToolCnt = 0;  | 
|         XBFuncSet funcSet = GetXBFuncSet(type);  | 
|         if (funcSet == null) return false;  | 
|   | 
|         toolCnt = (int)PackManager.Instance.GetItemCountByID(PackType.Item, funcSet.costToolIds[1]);  | 
|         needToolCnt = funcSet.costToolNums[1];  | 
|         if (toolCnt > 0)  | 
|         {  | 
|             return true;  | 
|         }  | 
|         return false;  | 
|     }  | 
|   | 
|     //needToolCnt 为配表中需要的道具数量  | 
|     // 可获得真正需要补足购买道具的金额  | 
|     public bool IsHaveManyXBToolEx(int type, out int toolCnt, out int needToolCnt, out int needMoney)  | 
|     {  | 
|         toolCnt = 0;  | 
|         needToolCnt = 0;    //配置中需要的道具数量  | 
|         needMoney = 0;  //真正需要补足购买道具的金额  | 
|         XBFuncSet funcSet = GetXBFuncSet(type);  | 
|         if (funcSet == null) return false;  | 
|   | 
|         toolCnt = (int)PackManager.Instance.GetItemCountByID(PackType.Item, funcSet.costToolIds[1]);  | 
|         needToolCnt = funcSet.costToolNums[1];  | 
|   | 
|         if (toolCnt > 0)  | 
|         {  | 
|             if (toolCnt < needToolCnt)  | 
|             {  | 
|                 needMoney = funcSet.xbPrices[1] / needToolCnt * (needToolCnt - toolCnt);  | 
|             }  | 
|   | 
|             return true;  | 
|         }  | 
|         return false;  | 
|     }  | 
|   | 
|   | 
|   | 
|     public event Action<float> RefreshBestXBTimeAct;  | 
|     public event Action<float> RefreshRuneXBTimeAct;  | 
|     public void RefreshBestXBTime(float time)  | 
|     {  | 
|         if (RefreshBestXBTimeAct != null)  | 
|         {  | 
|             RefreshBestXBTimeAct(time);  | 
|         }  | 
|   | 
|         if (time <= 0)  | 
|         {  | 
|             BestAndRuneXBRedPoint();  | 
|         }  | 
|     }  | 
|     public void RefreshRuneXBTime(float time)  | 
|     {  | 
|         if (RefreshRuneXBTimeAct != null)  | 
|         {  | 
|             RefreshRuneXBTimeAct(time);  | 
|         }  | 
|   | 
|         if (time <= 0)  | 
|         {  | 
|             BestAndRuneXBRedPoint();  | 
|         }  | 
|     }  | 
|   | 
|     public event Action<HappXBTitle, int> RefreshAgainXBAct;  | 
|     /// <summary>  | 
|     /// xbtype 0-单次 1 多次  | 
|     /// </summary>  | 
|     /// <param name="xBTitle"></param>  | 
|     /// <param name="xbType"></param>  | 
|     public void SetAgainXBEvent(HappXBTitle xBTitle, int xbType)  | 
|     {  | 
|         if (RefreshAgainXBAct != null)  | 
|         {  | 
|             RefreshAgainXBAct(xBTitle, xbType);  | 
|         }  | 
|     }  | 
|   | 
|     #region 红点逻辑  | 
|     public const int HappyXB_RedKey = 203;  | 
|     public const int BestXB_RedKey = 20301;  | 
|     public const int RuneXB_RedKey = 20302;  | 
|     public const int XBStore_RedKey = 20303;  | 
|     public const int XBWarehouse_RedKey = 20304;  | 
|     public const int BestXB_OneRedKey = 20301001;  | 
|     public const int BestXB_ManyRedKey = 20301002;  | 
|     public const int BestXB_FreeRedKey = 20301003;  | 
|     public const int RuneXB_OneRedKey = 20302001;  | 
|     public const int RuneXB_ManyRedKey = 20302002;  | 
|     public const int RuneXB_FreeRedKey = 20302003;  | 
|   | 
|     public Redpoint happyXBRed = new Redpoint(HappyXB_RedKey);  | 
|     public Redpoint bestXBRed = new Redpoint(HappyXB_RedKey, BestXB_RedKey);  | 
|     public Redpoint runeXBRed = new Redpoint(HappyXB_RedKey, RuneXB_RedKey);  | 
|     public Redpoint xbStoreRed = new Redpoint(HappyXB_RedKey, XBStore_RedKey);  | 
|     public Redpoint xbWarehouseRed = new Redpoint(HappyXB_RedKey, XBWarehouse_RedKey);  | 
|     public Redpoint bestXBOneRed = new Redpoint(BestXB_RedKey, BestXB_OneRedKey);  | 
|     public Redpoint bestXBManyRed = new Redpoint(BestXB_RedKey, BestXB_ManyRedKey);  | 
|     public Redpoint bestXBFreeRed = new Redpoint(BestXB_RedKey, BestXB_FreeRedKey);  | 
|     public Redpoint runeXBOneRed = new Redpoint(RuneXB_RedKey, RuneXB_OneRedKey);  | 
|     public Redpoint runeXBManyRed = new Redpoint(RuneXB_RedKey, RuneXB_ManyRedKey);  | 
|     public Redpoint runeXBFreeRed = new Redpoint(RuneXB_RedKey, RuneXB_FreeRedKey);  | 
|   | 
|     private void UpdateFuncState(int funcId)  | 
|     {  | 
|         if (funcId == (int)FuncOpenEnum.HappyFindTreasure  | 
|             || funcId == 184)  | 
|         {  | 
|             XBWarehouseRedPoint();  | 
|             BestAndRuneXBRedPoint();  | 
|             XBStoreRedPoint();  | 
|         }  | 
|     }  | 
|   | 
|     public void RefreshXBWarehouse()  | 
|     {  | 
|         if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;  | 
|   | 
|         xbWarehouseRed.state = RedPointState.Simple;  | 
|     }  | 
|   | 
|     public void XBWarehouseRedPoint()  | 
|     {  | 
|         if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;  | 
|   | 
|         SinglePack singlePack = PackManager.Instance.GetSinglePack(PackType.Treasure);  | 
|         if (singlePack == null) return;  | 
|   | 
|         if (singlePack.GetAllItems().Count > 0)  | 
|         {  | 
|             xbWarehouseRed.state = RedPointState.Simple;  | 
|         }  | 
|         else  | 
|         {  | 
|             xbWarehouseRed.state = RedPointState.None;  | 
|         }  | 
|     }  | 
|   | 
|     private void RefreshXBTool(PackType type, int index, int id)  | 
|     {  | 
|         if (type != PackType.Item) return;  | 
|         if (!CheckIsXBTool(id, 1) && !CheckIsXBTool(id, 2)) return;  | 
|         BestAndRuneXBRedPoint();  | 
|     }  | 
|   | 
|     public void BestAndRuneXBRedPoint()  | 
|     {  | 
|         if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;  | 
|   | 
|         int xbtoolCnt = 0;  | 
|         int needtoolCnt = 0;  | 
|         if (IsHaveFreeXB(1))  | 
|         {  | 
|             bestXBFreeRed.state = RedPointState.Simple;  | 
|         }  | 
|         else  | 
|         {  | 
|             bestXBFreeRed.state = RedPointState.None;  | 
|         }  | 
|   | 
|         if (IsHaveManyXBTool(1, out xbtoolCnt, out needtoolCnt))  | 
|         {  | 
|             if (xbtoolCnt >= needtoolCnt)  | 
|             {  | 
|                 bestXBManyRed.state = RedPointState.Simple;  | 
|             }  | 
|             else  | 
|             {  | 
|                 bestXBManyRed.state = RedPointState.None;  | 
|             }  | 
|             bestXBOneRed.state = RedPointState.Simple;  | 
|         }  | 
|         else  | 
|         {  | 
|             bestXBOneRed.state = RedPointState.None;  | 
|             bestXBManyRed.state = RedPointState.None;  | 
|         }  | 
|   | 
|         if (FuncOpen.Instance.IsFuncOpen(184) && IsHaveFreeXB(2))  | 
|         {  | 
|             runeXBFreeRed.state = RedPointState.Simple;  | 
|         }  | 
|         else  | 
|         {  | 
|             runeXBFreeRed.state = RedPointState.None;  | 
|         }  | 
|   | 
|         if (FuncOpen.Instance.IsFuncOpen(184) &&  | 
|             IsHaveManyXBTool(2, out xbtoolCnt, out needtoolCnt))  | 
|         {  | 
|             if (xbtoolCnt >= needtoolCnt)  | 
|             {  | 
|                 runeXBManyRed.state = RedPointState.Simple;  | 
|             }  | 
|             else  | 
|             {  | 
|                 runeXBManyRed.state = RedPointState.None;  | 
|             }  | 
|             runeXBOneRed.state = RedPointState.Simple;  | 
|         }  | 
|         else  | 
|         {  | 
|             runeXBOneRed.state = RedPointState.None;  | 
|             runeXBManyRed.state = RedPointState.None;  | 
|         }  | 
|     }  | 
|   | 
|   | 
|     private void RefreshStoreScore(PlayerDataType type)  | 
|     {  | 
|         if (type != PlayerDataType.CDBPlayerRefresh_TreasureScore) return;  | 
|   | 
|         XBStoreRedPoint();  | 
|     }  | 
|   | 
|     private List<StoreModel.StoreData> storelist = null;  | 
|     public void XBStoreRedPoint()  | 
|     {  | 
|         if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.HappyFindTreasure)) return;  | 
|   | 
|         ulong moneyNum = UIHelper.GetMoneyCnt(25);  | 
|         for (int i = 11; i < 14; i++)  | 
|         {  | 
|             storelist = StoreModel.Instance.TryGetStoreDatas((StoreFunc)i);  | 
|             if (storelist.Count > 0)  | 
|             {  | 
|                 List<StoreModel.StoreData> orderlist = new List<StoreModel.StoreData>();  | 
|                 orderlist.AddRange(storelist);  | 
|                 orderlist.Sort(CompareByMoney);  | 
|                 if (moneyNum >= (ulong)orderlist[0].storeConfig.MoneyNumber)  | 
|                 {  | 
|                     xbStoreRed.state = RedPointState.Simple;  | 
|                     return;  | 
|                 }  | 
|             }  | 
|         }  | 
|         xbStoreRed.state = RedPointState.None;  | 
|     }  | 
|   | 
|     public int CompareByMoney(StoreModel.StoreData start, StoreModel.StoreData end)  | 
|     {  | 
|         int money1 = start.storeConfig.MoneyNumber;  | 
|         int money2 = end.storeConfig.MoneyNumber;  | 
|         if (money1.CompareTo(money2) != 0) return money1.CompareTo(money2);  | 
|         int index1 = storelist.IndexOf(start);  | 
|         int index2 = storelist.IndexOf(end);  | 
|         if (index1.CompareTo(index2) != 0) return index1.CompareTo(index2);  | 
|         return 0;  | 
|     }  | 
|     #endregion  | 
| }  | 
|   | 
| public class XBTypeInfo  | 
| {  | 
|     public int xbType;   // 1 极品寻宝 2 符印寻宝   | 
|     public int luckValue;  | 
|     public int freeCountToday;      //今日已免费寻宝次数  | 
|     public int treasureCount;        //已寻宝总次数  | 
|     public int treasureCountToday;        //今日已寻宝总次数  | 
|     public int treasureCntAward;        //累计寻宝次数对应奖励领奖状态,按奖励记录索引二进制记录是否已领取  | 
|     public Dictionary<int, int> gridLimitCntDict;        //<有限制抽取次数的格子编号,已抽到次数> 有限制抽取次数的格子次数信息  | 
| }  | 
|   | 
| public class XBFuncSet  | 
| {  | 
|     public int xbType;// 1 极品寻宝 2 符印寻宝   | 
|     public int[] xbNums;  | 
|     public int[] xbPrices;  | 
|     public int[] costToolIds;  | 
|     public int[] costToolNums;  | 
|     public int[] xbFreeCDs;  | 
|     public int[] xbScores;  | 
|     public int dailyFreeCount;  | 
| }  | 
|   | 
| public class XBGetItem  | 
| {  | 
|     public int gridIndex;  | 
|     public int itemId;  | 
|     public int count;  | 
|     public DateTime createTime;  | 
|     public string createTimeStr;  | 
|   | 
|     public void SetModel(int index, int id, int count)  | 
|     {  | 
|         this.gridIndex = index;  | 
|         this.itemId = id;  | 
|         this.count = count;  | 
|         createTime = TimeUtility.ServerNow;  | 
|         createTimeStr = TimeUtility.ServerNow.ToString("yyyy-MM-dd HH:mm:ss");  | 
|     }  | 
| }  | 
|   | 
| public enum HappXBTitle  | 
| {  | 
|     Best = 1,  | 
|     Rune = 2,  | 
|     //Store = 3,  | 
|     //Warehouse = 4,  | 
|     GatherSoul = 4, //聚魂寻宝  | 
|     Gubao1 = 5,  | 
|     Gubao2 = 6,  | 
|     Gubao3 = 7,  | 
|     Gubao4 = 8,  | 
|     YunShi1 = 105,  | 
|     YunShi2 = 106,  | 
|     YunShi3 = 107,  | 
|     YunShi4 = 108,  | 
| }  |