| using System.Collections.Generic; | 
| using System.Linq; | 
|   | 
| public class SinglePack | 
| { | 
|     public readonly PackType type; | 
|     public int unlockedGridCount { get; private set; }  //已开启背包格子数 | 
|     private Dictionary<int, ItemModel> items = new Dictionary<int, ItemModel>(); //key 物品位置索引 | 
|     private Dictionary<int, List<int>> itemIDs = new Dictionary<int, List<int>>(); //key 物品ID:物品位置索引 | 
|   | 
|     public List<string> itemGuidList = new List<string>();  //前端界面GUID排序,各个背包根据实际情况使用 | 
|   | 
|     public SinglePack(PackType type) | 
|     { | 
|         this.type = type; | 
|     } | 
|   | 
|     public bool HasItem(int itemID) | 
|     { | 
|         return itemIDs.ContainsKey(itemID); | 
|     } | 
|   | 
|     public ItemModel UpdateItem(ItemInfo itemInfo) | 
|     { | 
|         //字典索引为物品位置索引 | 
|         var index = itemInfo.index; | 
|         if (!items.ContainsKey(index)) | 
|         { | 
|             items.Add(index, new ItemModel(type, itemInfo)); | 
|         } | 
|         else | 
|         { | 
|             //位置上的物品变化,先移除原来的 | 
|             var itemID = items[index].itemId; | 
|             if (itemIDs.ContainsKey(itemID)) | 
|             { | 
|                 if (itemIDs[itemID].Contains(index)) | 
|                 { | 
|                     if (itemIDs[itemID].Count == 1) | 
|                     { | 
|                         itemIDs.Remove(itemID); | 
|                     } | 
|                     else | 
|                     { | 
|                         itemIDs[itemID].Remove(index); | 
|                     } | 
|                 } | 
|             } | 
|   | 
|             items[index].SetItemInfo(itemInfo); | 
|         } | 
|   | 
|         //字典索引为物品ID | 
|         if (!itemIDs.ContainsKey(itemInfo.itemId)) | 
|         { | 
|             itemIDs.Add(itemInfo.itemId, new List<int>()); | 
|         } | 
|   | 
|         if (!itemIDs[itemInfo.itemId].Contains(itemInfo.index)) | 
|         { | 
|             itemIDs[itemInfo.itemId].Add(itemInfo.index); | 
|         } | 
|   | 
|         return items[index]; | 
|     } | 
|   | 
|     public void RemoveItem(int index) | 
|     { | 
|         if (items.ContainsKey(index)) | 
|         { | 
|             //字典索引为物品ID | 
|             var itemID = items[index].itemId; | 
|             if (itemIDs.ContainsKey(itemID)) | 
|             { | 
|                 if (itemIDs[itemID].Contains(index)) | 
|                 { | 
|                     if (itemIDs[itemID].Count == 1) | 
|                     { | 
|                         itemIDs.Remove(itemID); | 
|                     } | 
|                     else | 
|                     { | 
|                         itemIDs[itemID].Remove(index); | 
|                     } | 
|                 } | 
|             } | 
|   | 
|             items.Remove(index); | 
|         } | 
|   | 
|     } | 
|   | 
|     public void SetOpenGridCount(int count) | 
|     { | 
|         unlockedGridCount = count; | 
|     } | 
|   | 
|     public ItemModel GetItemByIndex(int index) | 
|     { | 
|         ItemModel item = null; | 
|         items.TryGetValue(index, out item); | 
|         return item; | 
|     } | 
|   | 
|     public Dictionary<int, ItemModel> GetAllItems() | 
|     { | 
|         return items; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 获取指定ID的一个物品 | 
|     /// </summary> | 
|     /// <param name="itemId"></param> | 
|     /// <param name="includeAuction"></param> | 
|     /// <returns></returns> | 
|     public ItemModel GetItemByID(int itemId, bool includeAuction = true) | 
|     { | 
|         //foreach (var item in items.Values) | 
|         //{ | 
|         //    if (!includeAuction && item.isAuction) | 
|         //    { | 
|         //        continue; | 
|         //    } | 
|   | 
|         //    if (item.itemId == itemId) | 
|         //    { | 
|         //        return item; | 
|         //    } | 
|         //} | 
|   | 
|         //return null; | 
|   | 
|         if (itemIDs.ContainsKey(itemId)) | 
|         { | 
|             foreach (var index in itemIDs[itemId]) | 
|             { | 
|                 var item = items[index]; | 
|                 if (!includeAuction && item.isAuction) | 
|                 { | 
|                     continue; | 
|                 } | 
|                 return item; | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 获取包内的指定ID的所有物品 | 
|     /// </summary> | 
|     /// <param name="itemId"></param> | 
|     /// <param name="includeAuction"></param> | 
|     /// <returns></returns> | 
|     public List<ItemModel> GetItemsById(int itemId, bool includeAuction = true) | 
|     { | 
|         var list = new List<ItemModel>(); | 
|         //foreach (var item in items.Values) | 
|         //{ | 
|         //    if (!includeAuction && item.isAuction) | 
|         //    { | 
|         //        continue; | 
|         //    } | 
|   | 
|         //    if (item.itemId == itemId) | 
|         //    { | 
|         //        list.Add(item); | 
|         //    } | 
|         //} | 
|   | 
|         if (itemIDs.ContainsKey(itemId)) | 
|         { | 
|             foreach (var index in itemIDs[itemId]) | 
|             { | 
|                 var item = items[index]; | 
|                 if (!includeAuction && item.isAuction) | 
|                 { | 
|                     continue; | 
|                 } | 
|                 list.Add(item); | 
|             } | 
|         } | 
|         return list; | 
|     } | 
|   | 
|     public List<string> GetItemGUIDListById(int itemId) | 
|     { | 
|         var list = new List<string>(); | 
|         if (itemIDs.ContainsKey(itemId)) | 
|         { | 
|             foreach (var index in itemIDs[itemId]) | 
|             { | 
|                 var item = items[index]; | 
|                 list.Add(item.guid); | 
|             } | 
|         } | 
|         return list; | 
|     } | 
|   | 
|   | 
|   | 
|     public long GetCountById(int itemId, bool includeAuction = true) | 
|     { | 
|         long count = 0; | 
|   | 
|         //部分货币和物品绑定 | 
|         if (GeneralDefine.itemMoneyCountDict.ContainsKey(itemId)) | 
|         { | 
|             //展示货币数量的物品 | 
|             count = UIHelper.GetMoneyCnt(GeneralDefine.itemMoneyCountDict[itemId]); | 
|         } | 
|   | 
|         if (itemIDs.ContainsKey(itemId)) | 
|         { | 
|             foreach (var index in itemIDs[itemId]) | 
|             { | 
|                 var item = items[index]; | 
|                 if (!includeAuction && item.isAuction) | 
|                 { | 
|                     continue; | 
|                 } | 
|                 count += item.count; | 
|             } | 
|         } | 
|         return count; | 
|     } | 
|   | 
|     public List<ItemModel> GetItems() | 
|     { | 
|         return items.Values.ToList(); | 
|     } | 
|      | 
|     public List<ItemModel> GetItems(FilterParams filterParams) | 
|     { | 
|         var list = new List<ItemModel>(); | 
|         foreach (var item in items.Values) | 
|         { | 
|             var levelValid = filterParams.levels == null || filterParams.levels.Contains(item.config.LV); | 
|             if (!levelValid) | 
|             { | 
|                 continue; | 
|             } | 
|   | 
|             var qualityValid = filterParams.qualitys == null || filterParams.qualitys.Contains(item.config.ItemColor); | 
|             if (!qualityValid) | 
|             { | 
|                 continue; | 
|             } | 
|   | 
|             var typeValid = filterParams.itemTypes == null || filterParams.itemTypes.Contains(item.config.Type); | 
|             if (!typeValid) | 
|             { | 
|                 continue; | 
|             } | 
|   | 
|             var equipTypeValid = filterParams.equipTypes == null || filterParams.equipTypes.Contains(item.config.EquipPlace); | 
|             if (!equipTypeValid) | 
|             { | 
|                 continue; | 
|             } | 
|   | 
|             var jobValid = filterParams.jobs == null || filterParams.jobs.Contains(item.config.JobLimit); | 
|             if (!jobValid) | 
|             { | 
|                 continue; | 
|             } | 
|   | 
|             list.Add(item); | 
|         } | 
|   | 
|         return list; | 
|     } | 
|   | 
|     public int GetCountByType(int type) | 
|     { | 
|         var count = 0; | 
|         foreach (var item in items.Values) | 
|         { | 
|             if (item.config.Type == type) | 
|             { | 
|                 count += item.count; | 
|             } | 
|         } | 
|   | 
|         return count; | 
|     } | 
|   | 
|     /// <summary> | 
|     ///  得到同一个id指定数量的物品格子序号 | 
|     /// </summary> | 
|     /// <param name="itemId"></param> | 
|     /// <param name="needCount"></param> | 
|     /// <param name="type"></param> | 
|     /// <returns></returns> | 
|     public List<int> GetItemIndexsAppointedCount(int itemId, int needCount, bool includeAuction = true) | 
|     { | 
|         //var goalItems = new List<ItemModel>(); | 
|         //foreach (var item in this.items.Values) | 
|         //{ | 
|         //    if (!includeAuction && item.isAuction) | 
|         //    { | 
|         //        continue; | 
|         //    } | 
|   | 
|         //    if (item.itemId == itemId) | 
|         //    { | 
|         //        goalItems.Add(item); | 
|         //    } | 
|         //} | 
|   | 
|         var itemIndexs = new List<int>(); | 
|         var count = 0; | 
|         //for (var i = 0; i < goalItems.Count; i++) | 
|         //{ | 
|         //    if (count < needCount) | 
|         //    { | 
|         //        itemIndexs.Add(goalItems[i].gridIndex); | 
|         //        count += goalItems[i].count; | 
|         //    } | 
|         //    else | 
|         //    { | 
|         //        break; | 
|         //    } | 
|   | 
|         //} | 
|   | 
|         if (itemIDs.ContainsKey(itemId)) | 
|         { | 
|             foreach (var index in itemIDs[itemId]) | 
|             { | 
|                 var item = items[index]; | 
|                 if (!includeAuction && item.isAuction) | 
|                 { | 
|                     continue; | 
|                 } | 
|                 if (count < needCount) | 
|                 { | 
|                     itemIndexs.Add(index); | 
|                     count += item.count; | 
|                 } | 
|                 else | 
|                 { | 
|                     break; | 
|                 } | 
|             } | 
|         } | 
|         return itemIndexs; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 得到第一个空格位置索引 | 
|     /// </summary> | 
|     /// <param name="type"></param> | 
|     /// <returns></returns> | 
|     public int GetFirstEmptyGridIndex() | 
|     { | 
|         for (var index = 0; index < unlockedGridCount; index++) | 
|         { | 
|             if (!items.ContainsKey(index)) | 
|             { | 
|                 return index; | 
|             } | 
|         } | 
|   | 
|         return -1; | 
|     } | 
|   | 
|     public int GetEmptyGridCount() | 
|     { | 
|         return unlockedGridCount - items.Count; | 
|     } | 
|   | 
|     public void Clear() | 
|     { | 
|         items.Clear(); | 
|         itemIDs.Clear(); | 
|     } | 
|   | 
|     public class FilterParams | 
|     { | 
|         public List<int> levels; | 
|         public List<int> qualitys; | 
|         public List<int> itemTypes; | 
|         public List<int> equipTypes; | 
|         public bool isAuction; | 
|         public List<int> jobs; | 
|     } | 
|   | 
| } |