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<int> GetItemIndexs() 
 | 
    { 
 | 
        return items.Keys.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; 
 | 
    } 
 | 
  
 | 
} 
 |