| using System;  | 
| using LitJson;  | 
|   | 
| using System.Collections.Generic;  | 
| using UnityEngine;  | 
|   | 
| /// <summary>  | 
| /// 宝箱功能 + 获取奖励界面  | 
| /// </summary>  | 
| public class BoxGetItemModel : GameSystemManager<BoxGetItemModel>  | 
| {  | 
|   | 
|     List<string> commonShowAwardEvents = new List<string>();    //获取奖励的展示事件  | 
|   | 
|     public override void Init()  | 
|     {  | 
|         var config = FuncConfigConfig.Get("CommonShowAwards");  | 
|         commonShowAwardEvents = JsonMapper.ToObject<List<string>>(config.Numerical1);  | 
|     }  | 
|   | 
|     // void OnBeforePlayerDataInitialize()  | 
|     // {  | 
|     //     getItems = null;  | 
|     //     getCoinsType = 0;  | 
|     //     getCoinsCnt = 0;  | 
|     // }  | 
|   | 
|     #region 处理服务器数据  | 
|   | 
|     // public BoxGetItemInfo[] getItems { get; private set; }  | 
|     // public int getCoinsType { get; private set; }  | 
|     // public long getCoinsCnt { get; private set; }  | 
|     // public event Action<int, int, BoxGetItemInfo[]> RefreshGetItemAct;  | 
|     // public void SetGetBoxItemInfo(HA810_tagMCNotifyUseItemGetItem boxItemInfo)  | 
|     // {  | 
|     //     getItems = JsonMapper.ToObject<BoxGetItemInfo[]>(boxItemInfo.GetItemData);  | 
|     //     getCoinsType = boxItemInfo.MoneyType;  | 
|     //     getCoinsCnt = boxItemInfo.MoneyCount;  | 
|     //     if (!NewBieCenter.Instance.inGuiding)  | 
|     //     {  | 
|     //         List<Item> items = new List<Item>();  | 
|     //         for (int i = 0; i < getItems.Length; i++)  | 
|     //         {  | 
|     //             BoxGetItemInfo info = getItems[i];  | 
|     //             Dictionary<int, List<int>> useDataDic = ConfigParse.Analysis(info.UserData);  | 
|     //             if (useDataDic != null && useDataDic.TryGetValue((int)ItemUseDataKey.itemCount, out List<int> list) && list != null && list.Count > 0)  | 
|     //             {  | 
|     //                 int count = list[0];  | 
|     //                 items.Add(new Item(info.ItemID, count));  | 
|     //             }  | 
|     //             else  | 
|     //             {  | 
|     //                 items.Add(new Item(info.ItemID, info.Count));  | 
|     //             }  | 
|   | 
|     //         }  | 
|     //         ItemLogicUtility.Instance.ShowGetItem(items, seconds: 0);  | 
|     //     }  | 
|   | 
|     //     if (RefreshGetItemAct != null)  | 
|     //     {  | 
|     //         RefreshGetItemAct((int)boxItemInfo.UseItemID, (int)boxItemInfo.UseCount, getItems);  | 
|     //     }  | 
|   | 
|   | 
|     // }  | 
|   | 
|     //获得奖励展示  | 
|     public void ReceiveAwardNotify(HA801_tagMCGiveAwardInfo netPack)  | 
|     {  | 
|         var eventName = UIHelper.ServerStringTrim(netPack.EventName);  | 
|   | 
|         // 仙盟攻城战  | 
|         // if (eventName == "FamilyGCZSQGrid" || eventName == "FamilyGCZSQPass" || eventName == "FamilyGCZSQPassAll" ||  | 
|         //     eventName == "FamilyGCZContiribution" || eventName == "FamilyGCZAtk")  | 
|         // {  | 
|         //     ModelCenter.Instance.GetModel<FairySiegeActModel>()?.OnUpdateAwardInfoAction(netPack);  | 
|         //     return;  | 
|         // }  | 
|         // if (!commonShowAwardEvents.Contains(eventName))  | 
|         //     return;  | 
|         if (string.IsNullOrEmpty(eventName))  | 
|         {  | 
|             Debug.Log("获得物品展示 无事件名");  | 
|             return;  | 
|         }  | 
|   | 
|         List<Item> showItems = new List<Item>();  | 
|   | 
|         if (netPack.Exp != 0 || netPack.ExpPoint != 0)  | 
|         {  | 
|             long expValue = netPack.Exp + netPack.ExpPoint * Constants.ExpPointValue;  | 
|             showItems.Add(new Item(GeneralDefine.expDisplayId, expValue));  | 
|         }  | 
|         if (netPack.MoneyList.Length != 0)  | 
|         {  | 
|             for (int i = 0; i < netPack.MoneyLen; i++)  | 
|             {  | 
|                 var moneyType = netPack.MoneyList[i].MoneyType;  | 
|                 if (GeneralDefine.MoneyDisplayModel.ContainsKey(moneyType) && netPack.MoneyList[i].MoneyValue != 0)  | 
|                 {  | 
|                     showItems.Add(new Item(GeneralDefine.MoneyDisplayModel[moneyType], netPack.MoneyList[i].MoneyValue));  | 
|                 }  | 
|   | 
|             }  | 
|         }  | 
|   | 
|         if (netPack.ItemList.Length != 0)  | 
|         {  | 
|             for (int i = 0; i < netPack.ItemLen; i++)  | 
|             {  | 
|                 showItems.Add(new Item((int)netPack.ItemList[i].ItemID,  | 
|                 netPack.ItemList[i].Count + netPack.ItemList[i].CountEx * Constants.ExpPointValue,  | 
|                 netPack.ItemList[i].IsBind));  | 
|             }  | 
|         }  | 
|   | 
|   | 
|         string info = string.Empty;  | 
|         if (LanguageConfig.HasKey("commonShowAwardEvents_" + eventName))  | 
|             info = Language.Get("commonShowAwardEvents_" + eventName);  | 
|   | 
|         if (showItems.Count == 0)  | 
|             return;  | 
|   | 
|         ItemLogicUtility.Instance.ShowGetItem(showItems, eventName);  | 
|     }  | 
|   | 
|     // public int GetUseCntByID(int itemId)  | 
|     // {  | 
|     //     return PackManager.Instance.GetItemUsedTimesToday(itemId);  | 
|     // }  | 
|   | 
|     #endregion  | 
|   | 
|     // #region 消耗材料货币开启的宝箱  | 
|     // public void SetModel(string guid, int itemId)  | 
|     // {  | 
|     //     ChestsConfig chestsConfig = ChestsConfig.Get(itemId);  | 
|     //     this.guid = guid;  | 
|     //     this.itemId = itemId;  | 
|     //     if (guid == "" || chestsConfig == null) return;  | 
|   | 
|     //     ItemConfig boxConfig = ItemConfig.Get(itemId);  | 
|     //     if (PlayerDatas.Instance.baseData.LV < boxConfig.UseLV)  | 
|     //     {  | 
|     //         ServerTipDetails.DisplayNormalTip(Language.Get("MakeUseItem101", boxConfig.UseLV));  | 
|     //         return;  | 
|     //     }  | 
|   | 
|     //     CheckOpenBoxCondi(guid, itemId);  | 
|     // }  | 
|   | 
|     // public void CheckOpenBoxCondi(string guid, int itemId, int useCnt = 1)  | 
|     // {  | 
|     //     ChestsConfig chestsConfig = ChestsConfig.Get(itemId);  | 
|     //     if (chestsConfig == null) return;  | 
|   | 
|     //     ItemConfig boxConfig = ItemConfig.Get(itemId);  | 
|   | 
|     //     if (chestsConfig.ExpendItemID != 0)  | 
|     //     {  | 
|     //         ItemConfig itemConfig = ItemConfig.Get(chestsConfig.ExpendItemID);  | 
|     //         ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("OpenBoxTool", itemConfig.ItemName), (bool isOk) =>  | 
|     //         {  | 
|     //             if (isOk)  | 
|     //             {  | 
|     //                 if (!IsEnoughTools(chestsConfig.ExpendItemID, chestsConfig.ExpendCount * useCnt))  | 
|     //                 {  | 
|     //                     SysNotifyMgr.Instance.ShowTip("OpenBoxToolNoEnough", itemConfig.ItemName);  | 
|     //                     return;  | 
|     //                 }  | 
|     //                 else  | 
|     //                 {  | 
|     //                     CheckOpenMoney(chestsConfig, boxConfig, useCnt);  | 
|     //                 }  | 
|     //             }  | 
|     //         });  | 
|     //     }  | 
|     //     else  | 
|     //     {  | 
|     //         CheckOpenMoney(chestsConfig, boxConfig, useCnt);  | 
|     //     }  | 
|     // }  | 
|   | 
|     // public void CheckOpenMoney(ChestsConfig chestsConfig, ItemConfig boxConfig, int useCnt)  | 
|     // {  | 
|     //     if (!IsEnoughMoney(chestsConfig.OpenMoney * useCnt))  | 
|     //     {  | 
|     //         SysNotifyMgr.Instance.ShowTip("BoxOpenCostMoney", 1);  | 
|     //         return;  | 
|     //     }  | 
|     //     else  | 
|     //     {  | 
|     //         if (chestsConfig.OpenMoney > 0)  | 
|     //         {  | 
|     //             ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("OpenBoxGold", chestsConfig.OpenMoney * useCnt), (bool isOk) =>  | 
|     //                 {  | 
|     //                     if (isOk)  | 
|     //                     {  | 
|     //                         CheckOtherCondi(chestsConfig, boxConfig, useCnt);  | 
|     //                     }  | 
|     //                 });  | 
|     //         }  | 
|     //         else  | 
|     //         {  | 
|     //             CheckOtherCondi(chestsConfig, boxConfig, useCnt);  | 
|     //         }  | 
|     //     }  | 
|     // }  | 
|   | 
|     // public void CheckOtherCondi(ChestsConfig chestsConfig, ItemConfig boxConfig, int useCnt)  | 
|     // {  | 
|   | 
|     //     if (boxConfig.MaxSkillCnt > 0 && GetUseCntByID(itemId) >= boxConfig.MaxSkillCnt)  | 
|     //     {  | 
|     //         SysNotifyMgr.Instance.ShowTip("UseCntLimit");  | 
|     //         return;  | 
|     //     }  | 
|   | 
|     //     if (IsSelectItemByID(itemId))  | 
|     //     {  | 
|     //         UIManager.Instance.OpenWindow<ChooseItemsWin>();  | 
|     //         return;  | 
|     //     }  | 
|   | 
|     //     ItemLogicUtility.Instance.UseItem(guid, useCnt);  | 
|     // }  | 
|   | 
|     // public bool CheckOpenBoxCondition(int itemId, out bool isBox)  | 
|     // {  | 
|     //     isBox = false;  | 
|     //     ChestsConfig chestsConfig = ChestsConfig.Get(itemId);  | 
|     //     if (chestsConfig == null) return false;  | 
|   | 
|     //     isBox = true;  | 
|     //     bool isCanOpen = true;  | 
|     //     ItemConfig boxConfig = ItemConfig.Get(itemId);  | 
|     //     if (PlayerDatas.Instance.baseData.LV < boxConfig.UseLV)  | 
|     //     {  | 
|     //         isCanOpen = false;  | 
|     //         return isCanOpen;  | 
|     //     }  | 
|   | 
|     //     if (chestsConfig.ExpendItemID != 0)  | 
|     //     {  | 
|     //         ItemConfig itemConfig = ItemConfig.Get(chestsConfig.ExpendItemID);  | 
|     //         if (!IsEnoughTools(chestsConfig.ExpendItemID, chestsConfig.ExpendCount))  | 
|     //         {  | 
|     //             isCanOpen = false;  | 
|     //             return isCanOpen;  | 
|     //         }  | 
|     //     }  | 
|   | 
|     //     if (!IsEnoughMoney(chestsConfig.OpenMoney))  | 
|     //     {  | 
|     //         isCanOpen = false;  | 
|     //         return isCanOpen;  | 
|     //     }  | 
|   | 
|     //     if (boxConfig.MaxSkillCnt > 0 && GetUseCntByID(itemId) >= boxConfig.MaxSkillCnt)  | 
|     //     {  | 
|     //         isCanOpen = false;  | 
|     //         return isCanOpen;  | 
|     //     }  | 
|   | 
|     //     return isCanOpen;  | 
|     // }  | 
|   | 
|     // private bool IsEnoughMoney(int moneyCnt)  | 
|     // {  | 
|     //     ulong haveMoney = UIHelper.GetMoneyCnt(1);  | 
|     //     if (haveMoney >= (ulong)moneyCnt)  | 
|     //     {  | 
|     //         return true;  | 
|     //     }  | 
|     //     else  | 
|     //     {  | 
|     //         return false;  | 
|     //     }  | 
|     // }  | 
|   | 
|     // private bool IsEnoughTools(int itemId, int toolCnt)  | 
|     // {  | 
|     //     int count = PackManager.Instance.GetItemCountByID(PackType.Item, itemId);  | 
|     //     if (count >= toolCnt)  | 
|     //     {  | 
|     //         return true;  | 
|     //     }  | 
|     //     else  | 
|     //     {  | 
|     //         return false;  | 
|     //     }  | 
|     // }  | 
|     // #endregion  | 
|   | 
|     //宝箱预览物品 (随机获得)  | 
|     public List<Item> GetBoxItems(int boxID)  | 
|     {  | 
|         List<Item> itemIDs = new List<Item>();  | 
|   | 
|         if (ChestsAwardConfig.GetBoxType(boxID) == 0)  | 
|         {  | 
|             return itemIDs;  | 
|         }  | 
|   | 
|         var config = ChestsAwardConfig.GetChestsAwardByID(boxID);  | 
|   | 
|         if (!string.IsNullOrEmpty(config.SelectList))  | 
|         {  | 
|             var selectlistDict = ConfigParse.GetDic<int, int>(config.SelectList);  | 
|             foreach (var item in selectlistDict)  | 
|             {  | 
|                 itemIDs.Add(new Item(item.Key, item.Value));  | 
|             }  | 
|         }  | 
|   | 
|         if (!string.IsNullOrEmpty(config.FixedItem))  | 
|         {  | 
|             var itemListDict = ConfigParse.GetDic<int, int>(config.FixedItem);  | 
|             foreach (var item in itemListDict)  | 
|             {  | 
|                 itemIDs.Add(new Item(item.Key, item.Value));  | 
|             }  | 
|         }  | 
|   | 
|         if (!string.IsNullOrEmpty(config.Probability1))  | 
|         {  | 
|             var arr = JsonMapper.ToObject(config.Probability1);  | 
|   | 
|             for (int i = 0; i < arr.Count; i++)  | 
|             {  | 
|                 itemIDs.Add(new Item(int.Parse(arr[i][1][0].ToString()), long.Parse(arr[i][1][1].ToString())));  | 
|             }  | 
|         }  | 
|   | 
|         if (!string.IsNullOrEmpty(config.Probability2))  | 
|         {  | 
|             var arr = JsonMapper.ToObject(config.Probability2);  | 
|   | 
|             for (int i = 0; i < arr.Count; i++)  | 
|             {  | 
|                 itemIDs.Add(new Item(int.Parse(arr[i][1][0].ToString()), long.Parse(arr[i][1][1].ToString())));  | 
|             }  | 
|         }  | 
|   | 
|         return itemIDs;  | 
|     }  | 
|   | 
|   | 
|   | 
|     #region 自选物品宝箱  | 
|   | 
|     //<物品ID,数量>  用户选中物品字典  | 
|     public Dictionary<int, ChooseItems> userChooseItemDict = new Dictionary<int, ChooseItems>();  | 
|     public Action countChangeAction;    //数量发生变化  | 
|   | 
|     public bool IsSelectItemByID(int boxId)  | 
|     {  | 
|         ChestsAwardConfig awardConfig = ChestsAwardConfig.GetChestsAwardByID(boxId);  | 
|         if (string.IsNullOrEmpty(awardConfig.SelectList))  | 
|         {  | 
|             return false;  | 
|         }  | 
|         return true;  | 
|     }  | 
|   | 
|     public int[][] GetSelectItemsByID(int boxId)  | 
|     {  | 
|         ChestsAwardConfig awardConfig = ChestsAwardConfig.GetChestsAwardByID(boxId);  | 
|         if (string.IsNullOrEmpty(awardConfig.SelectList))  | 
|         {  | 
|             return null;  | 
|         }  | 
|         var arr = ConfigParse.GetArray2<int>(awardConfig.SelectList);  | 
|         Array.Sort(arr, SortShowItem);  | 
|         return arr;  | 
|     }  | 
|   | 
|     int SortShowItem(int[] a, int[] b)  | 
|     {  | 
|         var itemConfig1 = ItemConfig.Get(a[0]);  | 
|         var itemConfig2 = ItemConfig.Get(b[0]);  | 
|         int quality1 = itemConfig1.ItemColor;  | 
|         int quality2 = itemConfig2.ItemColor;  | 
|         //品质高的排在前面  | 
|         if (quality1 != quality2)  | 
|             return quality2.CompareTo(quality1);  | 
|         return itemConfig1.ID - itemConfig2.ID;  | 
|     }  | 
|   | 
|     /// <summary>  | 
|     /// 选择自选物品数量  | 
|     /// </summary>  | 
|     /// <param name="itemId">被选择物品的ID</param>  | 
|     /// <param name="guid">宝箱的GUID</param>  | 
|     /// <param name="extra"></param>  | 
|     /// <param name="changeCnt">加减数量</param>  | 
|     public void IncreaseUserChooseItemCount(int itemId, string guid, int extra, int changeCnt)  | 
|     {  | 
|         if (userChooseItemDict.ContainsKey(itemId))  | 
|         {  | 
|             userChooseItemDict[itemId].guid = guid;  | 
|             userChooseItemDict[itemId].useCnt = userChooseItemDict[itemId].useCnt + changeCnt;  | 
|             userChooseItemDict[itemId].extra = extra;  | 
|         }  | 
|         else  | 
|         {  | 
|             userChooseItemDict[itemId] = new ChooseItems() { guid = guid, useCnt = 1, extra = extra };  | 
|         }  | 
|         countChangeAction?.Invoke();  | 
|     }  | 
|   | 
|   | 
|     //当前选择材料总数量  | 
|     public int GetNowChooseItemCount()  | 
|     {  | 
|         int total = 0;  | 
|         if (userChooseItemDict == null && userChooseItemDict.Count == 0)  | 
|             return 0;  | 
|         List<int> list = new List<int>(userChooseItemDict.Keys);  | 
|         for (int i = 0; i < list.Count; i++)  | 
|             total += userChooseItemDict[list[i]].useCnt;  | 
|         return total;  | 
|     }  | 
|   | 
|   | 
|   | 
|     public bool TrySendUse()  | 
|     {  | 
|         CA323_tagCMUseItems.tagCMUseItemsSelect[] chooseItemList = GetSendList(userChooseItemDict, out List<ChooseItems> resultChooseItemDict, out string guid, out int count);  | 
|         //一个材料也没选  | 
|         if (chooseItemList.Length < 1)  | 
|         {  | 
|             SysNotifyMgr.Instance.ShowTip("ChooseItems01");  | 
|             return false;  | 
|         }  | 
|   | 
|         var itemModel = PackManager.Instance.GetItemByGuid(guid);  | 
|         if (itemModel == null)  | 
|             return false;  | 
|   | 
|         for (int i = 0; i < resultChooseItemDict.Count; i++)  | 
|         {  | 
|             var item = PackManager.Instance.GetItemByGuid(resultChooseItemDict[i].guid);  | 
|             if (item == null)  | 
|                 return false;  | 
|   | 
|             var error = 0;  | 
|             if (!ItemLogicUtility.Instance.CanUseItem(resultChooseItemDict[i].guid, resultChooseItemDict[i].useCnt, out error))  | 
|             {  | 
|                 switch (error)  | 
|                 {  | 
|                     case 1:  | 
|                         SysNotifyMgr.Instance.ShowTip("EverydayUseLimit");  | 
|                         break;  | 
|                     case 2:  | 
|                         SysNotifyMgr.Instance.ShowTip("UseCntLimit");  | 
|                         break;  | 
|                     case 3:  | 
|                         SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_749572");  | 
|                         break;  | 
|                     default:  | 
|                         break;  | 
|                 }  | 
|                 return false;  | 
|             }  | 
|         }  | 
|   | 
|         var useItem = new CA323_tagCMUseItems();  | 
|         useItem.ItemIndex = (byte)itemModel.gridIndex;  | 
|         useItem.UseCnt = (ushort)count;  | 
|         useItem.ExData = (uint)0;  | 
|         useItem.SelectCount = (byte)chooseItemList.Length;  | 
|         useItem.SelectList = chooseItemList;  | 
|         GameNetSystem.Instance.SendInfo(useItem);   | 
|         return true;  | 
|     }  | 
|   | 
|     | 
|   | 
|     CA323_tagCMUseItems.tagCMUseItemsSelect[] GetSendList(Dictionary<int, ChooseItems> userChooseItemDict, out List<ChooseItems> resultChooseItemDict, out string guid, out int count)  | 
|     {  | 
|         guid = string.Empty;  | 
|         count = 0;  | 
|         resultChooseItemDict = new List<ChooseItems> { };  | 
|         List<int> list = new List<int>(userChooseItemDict.Keys);  | 
|         List<ChooseItems> result = new List<ChooseItems>();  | 
|         for (int i = 0; i < list.Count; i++)  | 
|         {  | 
|             int itemId = list[i];  | 
|             ChooseItems chooseItems = userChooseItemDict[itemId];  | 
|             if (!ItemConfig.HasKey(itemId))  | 
|                 continue;  | 
|             if (chooseItems == null || chooseItems.useCnt <= 0)  | 
|                 continue;  | 
|             count += chooseItems.useCnt;  | 
|             result.Add(chooseItems);  | 
|         }  | 
|         resultChooseItemDict = result;  | 
|         if (!result.IsNullOrEmpty())  | 
|             guid = result[0].guid;  | 
|   | 
|         List<CA323_tagCMUseItems.tagCMUseItemsSelect> tagCMUseItemsSelects = new List<CA323_tagCMUseItems.tagCMUseItemsSelect>();  | 
|         for (int i = 0; i < result.Count; i++)  | 
|         {  | 
|             CA323_tagCMUseItems.tagCMUseItemsSelect temp = new CA323_tagCMUseItems.tagCMUseItemsSelect();  | 
|             temp.SelectID = (uint)result[i].extra;  | 
|             temp.SelectCnt = (ushort)result[i].useCnt;  | 
|             tagCMUseItemsSelects.Add(temp);  | 
|         }  | 
|   | 
|         return tagCMUseItemsSelects.ToArray();  | 
|     }  | 
|   | 
|     public void ClearAll()  | 
|     {  | 
|         userChooseItemDict.Clear();  | 
|     }  | 
|   | 
|   | 
|   | 
|   | 
|   | 
|     #endregion  | 
|   | 
|   | 
|       | 
| }  | 
|   | 
|   | 
| public class BoxGetItemInfo  | 
| {  | 
|     public int ItemID;  | 
|     public int Count;  | 
|     public int IsBind;  | 
|     public int IsSuite;  | 
|     public string UserData;  | 
| }  | 
|   | 
| public class ChooseItems  | 
| {  | 
|     public string guid;  | 
|     public int useCnt;  | 
|     public int extra;  | 
| } |