using System; using System.Collections.Generic; using System.Linq; using System.Text; public class SinglePack { public readonly PackType type; public int unlockedGridCount { get; private set; } private Dictionary items = new Dictionary(); //key 物品位置索引 private Dictionary> itemIDs = new Dictionary>(); //key 物品ID:物品位置索引 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()); } 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 GetAllItems() { return items; } /// /// 获取指定ID的一个物品 /// /// /// /// 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; } /// /// 获取包内的指定ID的所有物品 /// /// /// /// public List GetItemsById(int itemId, bool includeAuction = true) { var list = new List(); //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 int GetCountById(int itemId, bool includeAuction = true) { var count = 0; //foreach (var item in items.Values) //{ // if (!includeAuction && item.isAuction) // { // continue; // } // if (item.itemId == itemId) // { // count += item.count; // } //} 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 GetItems(FilterParams filterParams) { var list = new List(); 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; } //var auctionValid = filterParams.isAuction == item.isAuction; //if (!auctionValid) //{ // continue; //} var realmValid = filterParams.realmLimit == 0 || filterParams.realmLimit == item.config.RealmLimit; if (!realmValid) { 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; } /// /// 得到同一个id指定数量的物品格子序号 /// /// /// /// /// public List GetItemIndexsAppointedCount(int itemId, int needCount, bool includeAuction = true) { //var goalItems = new List(); //foreach (var item in this.items.Values) //{ // if (!includeAuction && item.isAuction) // { // continue; // } // if (item.itemId == itemId) // { // goalItems.Add(item); // } //} var itemIndexs = new List(); 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; } /// /// 得到第一个空格位置索引 /// /// /// 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 struct FilterParams { public List levels; public List qualitys; public List itemTypes; public List equipTypes; public int realmLimit; public bool isAuction; public List jobs; } }