| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using UnityEngine; | 
| using LitJson; | 
| using System.Text.RegularExpressions; | 
| using System.Collections; | 
|   | 
|     public class PackManager : GameSystemManager<PackManager> | 
|     //public class PackModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk | 
|     { | 
|         public static string StrengthAttrShift_RecordKey = ""; | 
|         public const string RecordKnapsackTitle = "RecordKnapsackTitle"; | 
|   | 
|         Dictionary<int, int> DrugToDungeonDict { get; set; }   //key 丹药ID,value副本ID | 
|         Dictionary<int, int[]> DungeonToDrugDict { get; set; }  //key 副本ID,value丹药ID列表 | 
|         //public List<AttrFruitConfig> makeDruglist { get; private set; } | 
|         Dictionary<int, Dictionary<int, int>> decomposeAttrDict = new Dictionary<int, Dictionary<int, int>>(); | 
|         string RoleEquipLocalSave = ""; | 
|         List<int> LocalSavePlaceArray { get; set; } | 
|         Dictionary<int, List<int>> sharedUseCountItemDict { get; set; } | 
|         bool isUpdatePlayerLv = false; | 
|   | 
|         //AlchemyModel alchemyModel { get { return ModelCenter.Instance.GetModel<AlchemyModel>(); } } | 
|         //ItemTipsModel itemTipsModel { get { return ModelCenter.Instance.GetModel<ItemTipsModel>(); } } | 
|   | 
|         List<string> commonShowAwardEvents = new List<string>(); | 
|   | 
|         public int[] autoUseItemIDs; | 
|         public override void Init() | 
|         { | 
|             DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; | 
|             DTC0102_tagCDBPlayer.afterPlayerDataInitializeEvent += OnAfterPlayerDataInitialize; | 
|             DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk; | 
|             ParseConfig(); | 
|             //SysNotifyMgr.Instance.sysNotifyEvent += RefreshSysInfo; | 
|            | 
|   | 
|   | 
|             // FuncConfigConfig ShareUseCntItem = FuncConfigConfig.Get("ShareUseCntItem"); | 
|             // sharedUseCountItemDict = new Dictionary<int, List<int>>(); | 
|             // JsonData shareUseJson = JsonMapper.ToObject(ShareUseCntItem.Numerical1); | 
|             // if (shareUseJson.IsArray) | 
|             // { | 
|             //     for (int i = 0; i < shareUseJson.Count; i++) | 
|             //     { | 
|             //         var idListJson = shareUseJson[i]; | 
|             //         var idlist = new List<int>(); | 
|             //         sharedUseCountItemDict.Add(i, idlist); | 
|             //         foreach (var id in idListJson) | 
|             //         { | 
|             //             idlist.Add(int.Parse(id.ToString())); | 
|             //         } | 
|             //     } | 
|             // } | 
|   | 
|             ParseItemCount(); | 
|   | 
|             autoUseItemIDs = JsonMapper.ToObject<int[]>(FuncConfigConfig.Get("ItemTipsNum").Numerical2); | 
|         } | 
|   | 
|   | 
|         public override void Release() | 
|         { | 
|             DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; | 
|             DTC0102_tagCDBPlayer.afterPlayerDataInitializeEvent -= OnAfterPlayerDataInitialize; | 
|             DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk; | 
| FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; | 
|            // SysNotifyMgr.Instance.sysNotifyEvent -= RefreshSysInfo; | 
|         } | 
|   | 
|         public Dictionary<int, string> textCountShow = new Dictionary<int, string>(); | 
|         public int[] textCountShow2; | 
|         public List<int> gameCashShow = new List<int>(); | 
|   | 
|         public void ParseItemCount() | 
|         { | 
|             var textConfig = FuncConfigConfig.Get("ItemCountShow"); | 
|             var json = JsonMapper.ToObject(textConfig.Numerical1); | 
|             foreach (var key in json.Keys) | 
|             { | 
|                 var itemID = int.Parse(key); | 
|                 textCountShow[itemID] = json[key].ToString(); | 
|             } | 
|   | 
|             textCountShow2 = JsonMapper.ToObject<int[]>(textConfig.Numerical2); | 
|             gameCashShow = JsonMapper.ToObject<List<int>>(textConfig.Numerical3); | 
|         } | 
|   | 
|   | 
|         private void OnFuncStateChangeEvent(int id) | 
|         { | 
|   | 
|         } | 
|         public void OnBeforePlayerDataInitialize() | 
|         { | 
|             GlobalTimeEvent.Instance.secondEvent -= UpdateSecond; | 
|             PlayerDatas.Instance.playerDataRefreshEvent -= UpdatePlayerLv; | 
|             LocalSave.DeleteKey(RecordKnapsackTitle); | 
|             playerPackDict.Clear(); | 
|             itemDayUseCntDict.Clear(); | 
|             itemSumUseCntDict.Clear(); | 
|             itemGUIDDict.Clear(); | 
|             isPlayBetterEquipEffect = false; | 
|         } | 
|   | 
|         public void OnAfterPlayerDataInitialize() | 
|         { | 
|   | 
|         } | 
|   | 
|         public void OnPlayerLoginOk() | 
|         { | 
|             //ItemOperateUtility.Instance.RequestWarehouseData(); | 
|             RoleEquipLocalSave = StringUtility.Contact("RoleEquipLocalSave", PlayerDatas.Instance.baseData.PlayerID); | 
|             StrengthAttrShift_RecordKey = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "StrengthAttrShift"); | 
|             if (LocalSave.GetIntArray(RoleEquipLocalSave) != null) | 
|             { | 
|                 LocalSavePlaceArray = LocalSave.GetIntArray(RoleEquipLocalSave).ToList(); | 
|             } | 
|             else | 
|             { | 
|                 LocalSavePlaceArray = null; | 
|             } | 
|             GlobalTimeEvent.Instance.secondEvent += UpdateSecond; | 
|             PlayerDatas.Instance.playerDataRefreshEvent += UpdatePlayerLv; | 
|             isUpdatePlayerLv = true; | 
|             FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; | 
|         } | 
|   | 
|         private void RefreshSysInfo(string key, ArrayList infolist) | 
|         { | 
|             // if (key != "GetMoney") return; | 
|             // if (ItemLogicUtility.Instance.hidePickItem) | 
|             //     return; | 
|   | 
|             // if (PlayerDatas.Instance.baseData.LV < 3) | 
|             //     return; | 
|   | 
|             // var type = 0; | 
|             // int.TryParse(infolist[0].ToString(), out type); | 
|             // if (type == 1) | 
|             // { | 
|             //     Vector3 pos = new Vector3(-100, 0, 0); | 
|             //     Vector3 rot = new Vector3(0, 0, 0); | 
|             //     if (!WindowCenter.Instance.IsOpen<MainInterfaceWin>()) | 
|             //     { | 
|             //         pos = new Vector3(0, 50, 0); | 
|             //         rot = new Vector3(180, 180, 0); | 
|             //     } | 
|             //     EffectMgr.Instance.PlayUIEffect(1204, 3000, WindowCenter.Instance.uiRoot.tipsCanvas, pos, rot, false); | 
|             // } | 
|             // else if (type == 2) | 
|             // { | 
|             //     Vector3 pos = new Vector3(-100, 0, 0); | 
|             //     Vector3 rot = new Vector3(0, 0, 0); | 
|             //     if (!WindowCenter.Instance.IsOpen<MainInterfaceWin>()) | 
|             //     { | 
|             //         pos = new Vector3(150, 50, 0); | 
|             //         rot = new Vector3(180, 180, 0); | 
|             //     } | 
|             //     lingshiEffect = EffectMgr.Instance.PlayUIEffect(1158, 3000, WindowCenter.Instance.uiRoot.tipsCanvas, pos, rot, false); | 
|             // } | 
|         } | 
|      | 
|         public event Action<PackType> refrechPackEvent; //刷新整个背包数据 | 
|         public event Action<PackType, int, int> refreshItemCountEvent; // 慎用会卡(单个)最新物品数量刷新(旧的弃用)在得到新物品、物品数量的改变,清理该物品时均会触发 int 位置索引 int物品id | 
|         public event Action<PackType> gridRefreshEvent; //背包空格刷新 | 
|         public event Action<PackType, int, int> itemCntAddEvent; //物品数量增加 int 位置索引 int物品id | 
|         public event Action<PackType, int, int> itemCntReduceEvent; //物品数量减少的改变 int 位置索引 int物品id | 
|         public event Action<int, int> useItemSuccessEvent; //物品使用成功 int 位置索引 int物品id | 
|   | 
|         public event Action<int> refreshItemDayUseCountEvent;  //刷新物品每日使用数量 | 
|         public event Action<int> refreshItemSumUseCountEvent;  //刷新物品总使用数量 | 
|   | 
|         public bool isPlayBetterEquipEffect { get; set; }  //整理背包时是否播放特效 | 
|   | 
|         #region 接收服务端数据 | 
|         private Dictionary<PackType, SinglePack> playerPackDict = new Dictionary<PackType, SinglePack>(); | 
|         private Dictionary<string, ItemModel> itemGUIDDict = new Dictionary<string, ItemModel>(); | 
|   | 
|         public void UpdatePack(H0725_tagRolePackRefreshEx packInfo) | 
|         { | 
|             SetLookIndex(null); | 
|             var packType = (PackType)packInfo.PackType; | 
|             if (!playerPackDict.ContainsKey(packType)) | 
|             { | 
|                 playerPackDict.Add(packType, new SinglePack(packType)); | 
|             } | 
|   | 
|             if (isPlayBetterEquipEffect) | 
|             { | 
|                 ItemLogicUtility.Instance.ClearSortedBetterEquip(); | 
|             } | 
|   | 
|             for (int i = 0; i < packInfo.ItemCount; i++) | 
|             { | 
|                 var itemInfo = new ItemInfo(packInfo.ItemInfo[i]); | 
|                 var item = playerPackDict[packType].UpdateItem(itemInfo); | 
|                 AddItemGUIDDict(item, false); | 
|   | 
|                 if (isPlayBetterEquipEffect) | 
|                 { | 
|                     ItemLogicUtility.Instance.SetBagSortBetterEquipList(GetItemByGuid(itemInfo.guid)); | 
|                 } | 
|             } | 
|   | 
|             if (refrechPackEvent != null) | 
|             { | 
|                 refrechPackEvent(packType); | 
|             } | 
|   | 
|             UpdatePackRedpoint(packType); | 
|         } | 
|   | 
|         public void UpdateItem(H0704_tagRolePackRefresh serverItem) | 
|         { | 
|             isPlayBetterEquipEffect = false; | 
|             SetLookIndex(null); | 
|             PackType type = (PackType)serverItem.PackType; | 
|             if (!playerPackDict.ContainsKey(type)) | 
|             { | 
|                 playerPackDict.Add(type, new SinglePack(type)); | 
|             } | 
|   | 
|             var showNewItem = false; | 
|             if (itemGUIDDict.ContainsKey(serverItem.ItemGUID)) | 
|             { | 
|                 var prePack = itemGUIDDict[serverItem.ItemGUID].packType; | 
|                 var preAuction = itemGUIDDict[serverItem.ItemGUID].isAuction; | 
|                 var nowPackType = type; | 
|                 var nowAcution = serverItem.IsBind == 1; | 
|                 showNewItem = preAuction != nowAcution || prePack != nowPackType; | 
|             } | 
|             else | 
|             { | 
|                 showNewItem = true; | 
|             } | 
|   | 
|             var itemInfo = new ItemInfo(serverItem); | 
|             var item = playerPackDict[type].UpdateItem(itemInfo); | 
|             AddItemGUIDDict(item, showNewItem); | 
|   | 
|             if (refreshItemCountEvent != null) | 
|             { | 
|                 refreshItemCountEvent(type, itemInfo.index, itemInfo.itemId); | 
|             } | 
|   | 
|             if (itemCntAddEvent != null) | 
|             { | 
|                 itemCntAddEvent(type, itemInfo.index, itemInfo.itemId); | 
|             } | 
|   | 
|             // if (type == PackType.Equip) | 
|             // { | 
|             //     if (ItemLogicUtility.Instance.IsRealmEquip(itemInfo.itemId)) | 
|             //     { | 
|             //         ItemOperateUtility.Instance.ShowPutOnNewEquipRemind(itemInfo.itemId); | 
|             //     } | 
|             // } | 
|   | 
|             UpdatePackRedpoint(type); | 
|             //EquipDecomRedCtrl(); | 
|             AutoUseItem(itemInfo.itemId, serverItem.ItemGUID); | 
|         } | 
|   | 
|   | 
|   | 
|   | 
|         public void UpdateUnlockedGridCount(H0724_tagRolePackCanUseCount useCount) | 
|         { | 
|             PackType type = (PackType)useCount.PackType; | 
|             if (!playerPackDict.ContainsKey(type)) | 
|             { | 
|                 playerPackDict.Add(type, new SinglePack(type)); | 
|             } | 
|   | 
|             playerPackDict[type].SetOpenGridCount(useCount.CanUseCount); | 
|   | 
|             if (gridRefreshEvent != null) | 
|             { | 
|                 gridRefreshEvent(type); | 
|             } | 
|   | 
|             UpdatePackRedpoint(type); | 
|         } | 
|   | 
|         public void RefreshItemCount(H0707_tagItemCountRefresh refresh) | 
|         { | 
|             SetLookIndex(null); | 
|             isPlayBetterEquipEffect = false; | 
|             PackType type = (PackType)refresh.PackType; | 
|             SinglePack singlePack = null; | 
|             playerPackDict.TryGetValue(type, out singlePack); | 
|   | 
|             if (singlePack != null) | 
|             { | 
|                 ItemModel itemModel = singlePack.GetItemByIndex(refresh.ItemIndex); | 
|                 if (itemModel != null) | 
|                 { | 
|                     bool isAddItemCount = false; | 
|                     if (refresh.ItemCount > itemModel.count) | 
|                     { | 
|                         isAddItemCount = true; | 
|                     } | 
|                     itemModel.RefreshCount(refresh.ItemCount); | 
|   | 
|                     if (isAddItemCount) | 
|                     { | 
|                         if (itemCntAddEvent != null) | 
|                         { | 
|                             itemCntAddEvent(type, itemModel.gridIndex, itemModel.itemId); | 
|                         } | 
|                         ItemLogicUtility.Instance.RefreshPickItem(type, itemModel.itemId.ToString()); | 
|                     } | 
|                     else | 
|                     { | 
|                         if (itemCntReduceEvent != null) | 
|                         { | 
|                             itemCntReduceEvent(type, itemModel.gridIndex, itemModel.itemId); | 
|                         } | 
|                     } | 
|   | 
|                     if (refreshItemCountEvent != null) | 
|                     { | 
|                         refreshItemCountEvent(type, itemModel.gridIndex, itemModel.itemId); | 
|                     } | 
|   | 
|                 } | 
|             } | 
|   | 
|         } | 
|   | 
|         public void ClearPack(H0711_tagClearItemPack clearPack) | 
|         { | 
|             PackType type = (PackType)clearPack.PackIndex; | 
|             SinglePack singlePack = null; | 
|             playerPackDict.TryGetValue(type, out singlePack); | 
|             if (singlePack != null) | 
|             { | 
|                 singlePack.Clear(); | 
|             } | 
|         } | 
|   | 
|         public void RemoveItem(H0709_tagClearItem clearItem) | 
|         { | 
|             isPlayBetterEquipEffect = false; | 
|             SetLookIndex(null); | 
|             PackType type = (PackType)clearItem.PackType; | 
|   | 
|             SinglePack singlePack = null; | 
|             playerPackDict.TryGetValue(type, out singlePack); | 
|             string guid = ""; | 
|             if (singlePack != null) | 
|             { | 
|                 ItemModel itemModel = singlePack.GetItemByIndex(clearItem.ItemIndex); | 
|                 guid = itemModel.guid; | 
|                 int itemId = itemModel.itemId; | 
|   | 
|                 DeleteItemDictByGUID(type, itemModel.guid); | 
|   | 
|                 singlePack.RemoveItem(clearItem.ItemIndex); | 
|                 if (refreshItemCountEvent != null) | 
|                 { | 
|                     refreshItemCountEvent(type, clearItem.ItemIndex, itemId); | 
|                 } | 
|   | 
|                 if (itemCntReduceEvent != null) | 
|                 { | 
|                     itemCntReduceEvent(type, clearItem.ItemIndex, itemId); | 
|                 } | 
|             } | 
|   | 
|             UpdatePackRedpoint(type); | 
|   | 
|             if (GetItemByGuid(guid) == null) | 
|             { | 
|                 KnapsackTimeCDMgr.Instance.UnRegister(guid); | 
|             } | 
|   | 
|         } | 
|   | 
|         public void PackResetOk(H0316_tagPackResetOK packreset) | 
|         { | 
|             ItemLogicUtility.Instance.isPackResetOk = true; | 
|         } | 
|   | 
|         public void UseItemSuccess(H0706_tagUseItemSuccess success) | 
|         { | 
|             isPlayBetterEquipEffect = false; | 
|             SetLookIndex(null); | 
|             if (success.PlayerID != PlayerDatas.Instance.baseData.PlayerID) | 
|             { | 
|                 return; | 
|             } | 
|   | 
|   | 
|             if (useItemSuccessEvent != null) | 
|             { | 
|                 useItemSuccessEvent(success.ItemIndex, (int)success.ItemID); | 
|             } | 
|         } | 
|   | 
|         void AutoUseItem(int itemID, string guid) | 
|         { | 
|             // if (autoUseItemIDs.Contains(itemID)) | 
|             // { | 
|             //     ItemOperateUtility.Instance.GotoUseItem(guid); | 
|             // } | 
|         } | 
|   | 
|   | 
|         void AddItemGUIDDict(ItemModel itemModel, bool showNewItem) | 
|         { | 
|             itemGUIDDict[itemModel.guid] = itemModel; | 
|             GetItemEventCtrl(itemModel, showNewItem); | 
|         } | 
|   | 
|         void DeleteItemDictByGUID(PackType type, string guid) | 
|         { | 
|             if (itemGUIDDict.ContainsKey(guid)) | 
|             { | 
|                 if (itemGUIDDict[guid].packType == type) | 
|                 { | 
|                     itemGUIDDict.Remove(guid); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 物品每日使用的次数 | 
|         /// </summary> | 
|         private Dictionary<int, int> itemDayUseCntDict = new Dictionary<int, int>(); | 
|         public void UpdateItemUseCnt(HA809_tagMCItemDayUseCntInfo useCntInfo) | 
|         { | 
|             for (int i = 0; i < useCntInfo.Count; i++) | 
|             { | 
|                 int itemId = (int)useCntInfo.ItemUseCntList[i].ItemID; | 
|                 int cnt = useCntInfo.ItemUseCntList[i].UseCnt; | 
|                 if (!itemDayUseCntDict.ContainsKey(itemId)) | 
|                 { | 
|                     itemDayUseCntDict.Add(itemId, cnt); | 
|                 } | 
|                 else | 
|                 { | 
|                     itemDayUseCntDict[itemId] = cnt; | 
|                 } | 
|   | 
|                 if (refreshItemDayUseCountEvent != null) | 
|                 { | 
|                     refreshItemDayUseCountEvent(itemId); | 
|                 } | 
|   | 
|             } | 
|         } | 
|   | 
|         private Dictionary<int, int> itemSumUseCntDict = new Dictionary<int, int>(); | 
|         // public void UpdateItemSumUseCnt(HA339_tagMCAttrFruitEatCntList useCntInfo) | 
|         // { | 
|         //     for (int i = 0; i < useCntInfo.count; i++) | 
|         //     { | 
|         //         int itemId = (int)useCntInfo.EatCntList[i].ItemID; | 
|         //         int cnt = (int)useCntInfo.EatCntList[i].EatCnt; | 
|         //         if (!itemSumUseCntDict.ContainsKey(itemId)) | 
|         //         { | 
|         //             itemSumUseCntDict.Add(itemId, cnt); | 
|         //         } | 
|         //         else | 
|         //         { | 
|         //             itemSumUseCntDict[itemId] = cnt; | 
|         //         } | 
|   | 
|         //         if (refreshItemSumUseCountEvent != null) | 
|         //         { | 
|         //             refreshItemSumUseCountEvent(itemId); | 
|         //         } | 
|         //     } | 
|         // } | 
|   | 
|         #endregion | 
|   | 
|         #region 玩家装备特殊逻辑 | 
|         void ParseConfig() | 
|         { | 
|             | 
|   | 
|             var config = FuncConfigConfig.Get("CommonShowAwards"); | 
|             commonShowAwardEvents = JsonMapper.ToObject<List<string>>(config.Numerical1); | 
|   | 
|         } | 
|   | 
|   | 
|   | 
|         private void UpdateSecond() | 
|         { | 
|             if (isUpdatePlayerLv) | 
|             { | 
|                 isUpdatePlayerLv = false; | 
|             } | 
|         } | 
|   | 
|         private void UpdatePlayerLv(PlayerDataType type) | 
|         { | 
|             if (type != PlayerDataType.LV) return; | 
|   | 
|             isUpdatePlayerLv = true; | 
|         } | 
|   | 
|         #endregion | 
|   | 
|   | 
|         private void GetItemEventCtrl(ItemModel itemModel, bool showNewItem) | 
|         { | 
|             // if (showNewItem) | 
|             // { | 
|             //     bool isOverdue = false; | 
|             //     if (itemModel.config.ExpireTime > 0) | 
|             //     { | 
|             //         ItemCDCool cool = KnapsackTimeCDMgr.Instance.GetItemCoolById(itemModel.guid); | 
|             //         switch ((ItemTimeType)itemModel.config.EndureReduceType) | 
|             //         { | 
|             //             case ItemTimeType.EquipedTime: | 
|             //                 List<int> itemEffectTime = itemModel.GetUseData((int)ItemUseDataKey.createTime); | 
|             //                 if (itemEffectTime != null && itemEffectTime[0] != 0) | 
|             //                 { | 
|             //                     if (cool == null || cool.GetRemainTime() <= 0) | 
|             //                     { | 
|             //                         isOverdue = true; | 
|             //                     } | 
|             //                 } | 
|             //                 break; | 
|   | 
|             //             case ItemTimeType.RealityTime: | 
|             //                 if (cool == null || cool.GetRemainTime() <= 0) | 
|             //                 { | 
|             //                     isOverdue = true; | 
|             //                 } | 
|             //                 break; | 
|   | 
|             //         } | 
|             //     } | 
|   | 
|             //     if (!isOverdue) | 
|             //     { | 
|             //         ItemLogicUtility.Instance.RecommendItem(itemModel); | 
|             //         ItemLogicUtility.Instance.OnGetEquip(itemModel); | 
|             //         ItemLogicUtility.Instance.RefreshPickItem(itemModel.packType, itemModel.itemId.ToString()); | 
|             //     } | 
|             // } | 
|   | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 得到某个包裹的所有数据 | 
|         /// </summary> | 
|         /// <param name="type"></param> | 
|         /// <returns></returns> | 
|         public SinglePack GetSinglePack(PackType type) | 
|         { | 
|             SinglePack singlePack = null; | 
|             playerPackDict.TryGetValue(type, out singlePack); | 
|             return singlePack; | 
|         } | 
|   | 
|         public void UnLockPackGrid(int chooseGridCount, PackType type) | 
|         { | 
|             // var singlePack = GetSinglePack(type); | 
|             // int openCount = chooseGridCount - singlePack.unlockedGridCount; | 
|             // int index = 0; | 
|             // switch (type) | 
|             // { | 
|             //     case PackType.Item: | 
|             //         index = chooseGridCount - GeneralDefine.initBagGridCount; | 
|             //         break; | 
|             //     case PackType.Warehouse: | 
|             //         index = chooseGridCount - GeneralDefine.initDepotGridCount; | 
|             //         break; | 
|             // } | 
|   | 
|             // itemTipsModel.SetExtendGirdModel(openCount, index, type); | 
|             // WindowCenter.Instance.Open<ExtendWin>(); | 
|         } | 
|   | 
|         public ItemModel GetItemByGuid(string guid) | 
|         { | 
|             if (string.IsNullOrEmpty(guid)) | 
|             { | 
|                 return null; | 
|             } | 
|   | 
|             ItemModel itemModel = null; | 
|             itemGUIDDict.TryGetValue(guid, out itemModel); | 
|             return itemModel; | 
|         } | 
|   | 
|         public ItemModel GetItemByIndex(PackType type, int index) | 
|         { | 
|             ItemModel itemModel = null; | 
|             if (playerPackDict.ContainsKey(type)) | 
|             { | 
|                 itemModel = playerPackDict[type].GetItemByIndex(index); | 
|             } | 
|             return itemModel; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 获取指定背包内 指定ID的所有物品 | 
|         /// </summary> | 
|         /// <param name="type"></param> | 
|         /// <param name="id"></param> | 
|         /// <param name="includeAuction"></param> | 
|         /// <returns></returns> | 
|         public List<ItemModel> GetItemsById(PackType type, int id, bool includeAuction = true) | 
|         { | 
|             if (playerPackDict.ContainsKey(type)) | 
|             { | 
|                 var singlePack = playerPackDict[type]; | 
|                 return singlePack.GetItemsById(id, includeAuction); | 
|             } | 
|             else | 
|             { | 
|                 return null; | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 获取指定背包内指定ID的一个物品 | 
|         /// </summary> | 
|         /// <param name="type"></param> | 
|         /// <param name="id"></param> | 
|         /// <param name="includeAuction"></param> | 
|         /// <returns></returns> | 
|         public ItemModel GetItemByID(PackType type, int id, bool includeAuction = true) | 
|         { | 
|             if (playerPackDict.ContainsKey(type)) | 
|             { | 
|                 var singlePack = playerPackDict[type]; | 
|                 return singlePack.GetItemByID(id, includeAuction); | 
|             } | 
|             else | 
|             { | 
|                 return null; | 
|             } | 
|         } | 
|   | 
|         public List<ItemModel> GetItems(PackType packType, SinglePack.FilterParams param) | 
|         { | 
|             if (playerPackDict.ContainsKey(packType)) | 
|             { | 
|                 return playerPackDict[packType].GetItems(param); | 
|             } | 
|             else | 
|             { | 
|                 return null; | 
|             } | 
|         } | 
|   | 
|         //通过id找物品,注意检查是否指定背包 | 
|         public string GetItemGUIDByID(int itemId, bool includeAuction = true, PackType packType = PackType.Item) | 
|         { | 
|             string guid = string.Empty; | 
|             foreach (var key in itemGUIDDict.Keys) | 
|             { | 
|                 if (!includeAuction && itemGUIDDict[key].isAuction) | 
|                 { | 
|                     continue; | 
|                 } | 
|   | 
|                 if (itemGUIDDict[key].itemId == itemId && packType == itemGUIDDict[key].packType) | 
|                 { | 
|                     guid = key; | 
|                     return guid; | 
|                 } | 
|             } | 
|   | 
|             return guid; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 得到ID相同的物品数量 | 
|         /// </summary> | 
|         /// <param name="type"></param> | 
|         /// <param name="id"></param> | 
|         /// <returns></returns> | 
|         public int GetItemCountByID(PackType type, int id, bool includeAuction = true) | 
|         { | 
|             int count = 0; | 
|             var singlePack = GetSinglePack(type); | 
|             if (singlePack != null) | 
|             { | 
|                 count = singlePack.GetCountById(id, includeAuction); | 
|             } | 
|   | 
|             return count; | 
|         } | 
|   | 
|         public int GetEmptyGridCount(PackType type) | 
|         { | 
|             int count = 0; | 
|             SinglePack singlePack = GetSinglePack(type); | 
|             if (singlePack != null) | 
|             { | 
|                 count = singlePack.GetEmptyGridCount(); | 
|             } | 
|   | 
|             return count; | 
|         } | 
|   | 
|         public bool TryGetShareNumItem(int itemId, out List<int> idlist) | 
|         { | 
|             idlist = new List<int>(); | 
|             foreach (var list in sharedUseCountItemDict.Values) | 
|             { | 
|                 if (list.Contains(itemId)) | 
|                 { | 
|                     idlist = list; | 
|                     return true; | 
|                 } | 
|             } | 
|             return false; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 得到物品今日使用次数 | 
|         /// </summary> | 
|         /// <param name="itemId"></param> | 
|         /// <returns></returns> | 
|         public int GetItemUsedTimesToday(int itemId) | 
|         { | 
|             int useCnt = 0; | 
|             List<int> shareIdlist = null; | 
|             bool isShare = TryGetShareNumItem(itemId, out shareIdlist); | 
|             if (isShare) | 
|             { | 
|                 foreach (var id in shareIdlist) | 
|                 { | 
|                     int singleUseCnt = 0; | 
|                     itemDayUseCntDict.TryGetValue(id, out singleUseCnt); | 
|                     useCnt += singleUseCnt; | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 itemDayUseCntDict.TryGetValue(itemId, out useCnt); | 
|             } | 
|             return useCnt; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 得到物品总使用次数 | 
|         /// </summary> | 
|         /// <param name="itemId"></param> | 
|         /// <returns></returns> | 
|         public int GetItemTotalUsedTimes(int itemId) | 
|         { | 
|             int useCnt = 0; | 
|             List<int> shareIdlist = null; | 
|             bool isShare = TryGetShareNumItem(itemId, out shareIdlist); | 
|             if (isShare) | 
|             { | 
|                 foreach (var id in shareIdlist) | 
|                 { | 
|                     int singleUseCnt = 0; | 
|                     itemDayUseCntDict.TryGetValue(id, out singleUseCnt); | 
|                     useCnt += singleUseCnt; | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 itemSumUseCntDict.TryGetValue(itemId, out useCnt); | 
|             } | 
|             return useCnt; | 
|         } | 
|   | 
|         public void GotoWashAttributePoint(string guid) | 
|         { | 
|             // ItemModel itemModel = GetItemByGuid(guid); | 
|             // if (itemModel == null) return; | 
|   | 
|             // WashAttrPointWin.itemModel = itemModel; | 
|             // WindowCenter.Instance.Open<WashAttrPointWin>(); | 
|         } | 
|   | 
|         #region 红点逻辑判断 | 
|   | 
|         const int ITEMPACK_REDKEY = 102011003; | 
|         Redpoint redpointItemPack = new Redpoint(MainRedDot.RedPoint_BagFuncKey, ITEMPACK_REDKEY); | 
|   | 
|         const int LS_REDKEY = 102011015; | 
|         Redpoint redpointLS = new Redpoint(MainRedDot.RedPoint_BagFuncKey, LS_REDKEY); | 
|   | 
|   | 
|         private void UpdatePackRedpoint(PackType type) | 
|         { | 
|             var singlePack = GetSinglePack(type); | 
|             if (singlePack == null) | 
|             { | 
|                 return; | 
|             } | 
|   | 
|             switch (type) | 
|             { | 
|                 case PackType.Item: | 
|                     if (singlePack.GetEmptyGridCount() <= 0) | 
|                     { | 
|                         redpointItemPack.state = RedPointState.Full; | 
|                         //SysNotifyMgr.Instance.ShowTip("BagFull"); | 
|                     } | 
|                     else | 
|                     { | 
|                         redpointItemPack.state = RedPointState.None; | 
|                     } | 
|   | 
|                     break; | 
|                 case PackType.Warehouse: | 
|                     if (singlePack.GetEmptyGridCount() <= 0) | 
|                     { | 
|                         MainRedDot.Instance.redPointDepotFunc.state = RedPointState.Full; | 
|                     } | 
|                     else | 
|                     { | 
|                         MainRedDot.Instance.redPointDepotFunc.state = RedPointState.None; | 
|                     } | 
|                     break; | 
|             } | 
|         } | 
|   | 
|          | 
|         #endregion | 
|   | 
|         #region 查看某个位置的物品 | 
|         public event Action lookEquipEvent; | 
|         private int _lookLineIndex = -1; | 
|         public int lookLineIndex { get { return _lookLineIndex; } private set { _lookLineIndex = value; } } | 
|   | 
|         public string lookItemGUID { get; private set; } | 
|   | 
|         public void SetLookIndex(string guid, int singleRowCount = 5) | 
|         { | 
|             if (string.IsNullOrEmpty(guid) || guid == "") | 
|             { | 
|                 lookLineIndex = -1; | 
|                 lookItemGUID = ""; | 
|             } | 
|             else | 
|             { | 
|                 int index = GetItemByGuid(guid).gridIndex; | 
|                 lookLineIndex = index / singleRowCount; | 
|                 lookItemGUID = guid; | 
|             } | 
|   | 
|             if (lookEquipEvent != null) | 
|             { | 
|                 lookEquipEvent(); | 
|             } | 
|         } | 
|   | 
|         public event Action RefreshBagEvent; | 
|         public void RefreshBagInfo() | 
|         { | 
|             if (RefreshBagEvent != null) | 
|             { | 
|                 RefreshBagEvent(); | 
|             } | 
|         } | 
|         #endregion | 
|   | 
|         public void SetJumpToOneKeySell(Transform parent) | 
|         { | 
|             // var goEffect = AchievementGuideEffectPool.Require(1); | 
|             // goEffect.transform.SetParentEx(parent, Vector3.zero, Quaternion.identity, Vector3.one); | 
|             // AchievementGoto.guideAchievementId = 0; | 
|         } | 
|   | 
|         #region 物品使用快捷提示 | 
|   | 
|         private int cacheMapId = 0; | 
|         public event Action<PackType, string> itemUseAct; | 
|         private Dictionary<int, int> itemUseTypeDict = new Dictionary<int, int>(); //key SkillTypeID,value 使用物品的ID | 
|          | 
|   | 
|         private void AddItemUseTypeDict(int id) | 
|         { | 
|             SkillConfig skillConfig = GetSkillConfig(id); | 
|             int itemCount = GetItemCountByID(PackType.Item, id); | 
|             if (skillConfig != null && itemCount > 0) | 
|             { | 
|                 if (!itemUseTypeDict.ContainsKey(skillConfig.SkillTypeID)) | 
|                 { | 
|                     itemUseTypeDict.Add(skillConfig.SkillTypeID, id); | 
|                 } | 
|                 else | 
|                 { | 
|                     SkillConfig preSkillConfig = GetSkillConfig(itemUseTypeDict[skillConfig.SkillTypeID]); | 
|                     if (skillConfig.SkillLV > preSkillConfig.SkillLV) | 
|                     { | 
|                         itemUseTypeDict[skillConfig.SkillTypeID] = id; | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|   | 
|   | 
|   | 
|   | 
|         public SkillConfig GetSkillConfig(int itemId) | 
|         { | 
|             ItemConfig itemConfig = ItemConfig.Get(itemId); | 
|             SkillConfig skillConfig = SkillConfig.Get(itemConfig.AddSkill1); | 
|             return skillConfig; | 
|         } | 
|   | 
|   | 
|   | 
|         #endregion | 
|   | 
|         #region 判断物品是否达到使用上限 | 
|         // public bool IsReachUseLimit(string guid, out ulong count) | 
|         // { | 
|         //     count = 0; | 
|         //     ItemModel itemModel = GetItemByGuid(guid); | 
|         //     if (itemModel == null) return false; | 
|   | 
|         //     AttrFruitConfig fruitConfig = AttrFruitConfig.Get(itemModel.itemId); | 
|         //     int haveUseCnt = GetItemUsedTimesToday(itemModel.itemId); | 
|         //     int sumHaveUseCnt = GetItemTotalUsedTimes(itemModel.itemId); | 
|         //     count = (ulong)itemModel.count; | 
|         //     bool isReach = false; | 
|         //     int remainDayCnt = 0; | 
|         //     if (itemModel.config.MaxSkillCnt > 0) | 
|         //     { | 
|         //         remainDayCnt = itemModel.config.MaxSkillCnt - haveUseCnt; | 
|         //         if (itemModel.count > remainDayCnt) | 
|         //         { | 
|         //             count = (ulong)remainDayCnt; | 
|         //         } | 
|         //     } | 
|   | 
|         //     int remainSumCnt = 0; | 
|         //     if (fruitConfig != null) | 
|         //     { | 
|         //         remainSumCnt = fruitConfig.basicUseLimit - sumHaveUseCnt; | 
|         //         if (remainSumCnt <= remainDayCnt && itemModel.count > remainSumCnt) | 
|         //         { | 
|         //             count = (ulong)remainSumCnt; | 
|         //         } | 
|         //     } | 
|   | 
|         //     if (count < (ulong)itemModel.count) | 
|         //     { | 
|         //         isReach = true; | 
|         //     } | 
|   | 
|         //     return isReach; | 
|         // } | 
|         #endregion | 
|   | 
|          | 
|   | 
|          | 
|   | 
|         public enum EquipColorType | 
|         { | 
|             None = 0, | 
|             White = 1, | 
|             Blue = 2, | 
|             Purple = 3, | 
|             Orange = 4, | 
|             Red = 5, | 
|   | 
|         } | 
|   | 
|   | 
|          | 
|   | 
|         public void ReceiveAwardNotify(HA801_tagMCGiveAwardInfo netPack) | 
|         { | 
|             var eventName = UIHelper.ServerStringTrim(netPack.EventName); | 
|             if (eventName == "BuyItem") | 
|                 return; | 
|   | 
|             // 仙盟攻城战 | 
|             // if (eventName == "FamilyGCZSQGrid" || eventName == "FamilyGCZSQPass" || eventName == "FamilyGCZSQPassAll" || | 
|             //     eventName == "FamilyGCZContiribution" || eventName == "FamilyGCZAtk") | 
|             // { | 
|             //     ModelCenter.Instance.GetModel<FairySiegeActModel>()?.OnUpdateAwardInfoAction(netPack); | 
|             //     return; | 
|             // } | 
|             if (!commonShowAwardEvents.Contains(eventName)) | 
|                 return; | 
|   | 
|             List<Item> showItems = new List<Item>(); | 
|   | 
|             if (netPack.Exp != 0 || netPack.ExpPoint != 0) | 
|             { | 
|                 ulong expValue = netPack.Exp + netPack.ExpPoint * (ulong)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.moneyDisplayIds.ContainsKey(moneyType) && netPack.MoneyList[i].MoneyValue != 0) | 
|                     { | 
|                         showItems.Add(new Item(GeneralDefine.moneyDisplayIds[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].IsBind)); | 
|                 } | 
|             } | 
|   | 
|   | 
|             string info = string.Empty; | 
|             if (LanguageConfig.HasKey("commonShowAwardEvents_" + eventName)) | 
|                 info = Language.Get("commonShowAwardEvents_" + eventName); | 
|   | 
|             if (showItems.Count == 0) | 
|                 return; | 
|   | 
|             ItemLogicUtility.Instance.ShowGetItem(showItems, info, 0, eventName: eventName); | 
|         } | 
|     } |