| | |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using vnxbqy.UI; |
| | | |
| | | public class SinglePack |
| | | 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 SinglePack(PackType type) |
| | | { |
| | | 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 SinglePack(PackType type) |
| | | { |
| | | this.type = type; |
| | | } |
| | | this.type = type; |
| | | } |
| | | |
| | | public bool HasItem(int itemID) |
| | | { |
| | | return itemIDs.ContainsKey(itemID); |
| | | } |
| | | public bool HasItem(int itemID) |
| | | { |
| | | return itemIDs.ContainsKey(itemID); |
| | | } |
| | | |
| | | public ItemModel UpdateItem(ItemInfo itemInfo) |
| | | public ItemModel UpdateItem(ItemInfo itemInfo) |
| | | { |
| | | //字典索引为物品位置索引 |
| | | var index = itemInfo.index; |
| | | if (!items.ContainsKey(index)) |
| | | { |
| | | //字典索引为物品位置索引 |
| | | 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)) |
| | | { |
| | | 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].Contains(index)) |
| | | if (itemIDs[itemID].Count == 1) |
| | | { |
| | | 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 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<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; |
| | | } |
| | | |
| | | //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; |
| | | } |
| | | |
| | | /// <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; |
| | | itemIDs.Remove(itemID); |
| | | } |
| | | else |
| | | { |
| | | break; |
| | | itemIDs[itemID].Remove(index); |
| | | } |
| | | } |
| | | } |
| | | return itemIndexs; |
| | | |
| | | items[index].SetItemInfo(itemInfo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 得到第一个空格位置索引 |
| | | /// </summary> |
| | | /// <param name="type"></param> |
| | | /// <returns></returns> |
| | | public int GetFirstEmptyGridIndex() |
| | | //字典索引为物品ID |
| | | if (!itemIDs.ContainsKey(itemInfo.itemId)) |
| | | { |
| | | for (var index = 0; index < unlockedGridCount; index++) |
| | | 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 (!items.ContainsKey(index)) |
| | | if (itemIDs[itemID].Contains(index)) |
| | | { |
| | | return index; |
| | | if (itemIDs[itemID].Count == 1) |
| | | { |
| | | itemIDs.Remove(itemID); |
| | | } |
| | | else |
| | | { |
| | | itemIDs[itemID].Remove(index); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return -1; |
| | | items.Remove(index); |
| | | } |
| | | |
| | | public int GetEmptyGridCount() |
| | | } |
| | | |
| | | 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)) |
| | | { |
| | | return unlockedGridCount - items.Count; |
| | | foreach (var index in itemIDs[itemId]) |
| | | { |
| | | var item = items[index]; |
| | | if (!includeAuction && item.isAuction) |
| | | { |
| | | continue; |
| | | } |
| | | return item; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public void Clear() |
| | | /// <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)) |
| | | { |
| | | items.Clear(); |
| | | itemIDs.Clear(); |
| | | foreach (var index in itemIDs[itemId]) |
| | | { |
| | | var item = items[index]; |
| | | if (!includeAuction && item.isAuction) |
| | | { |
| | | continue; |
| | | } |
| | | list.Add(item); |
| | | } |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | public struct FilterParams |
| | | 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)) |
| | | { |
| | | public List<int> levels; |
| | | public List<int> qualitys; |
| | | public List<int> itemTypes; |
| | | public List<int> equipTypes; |
| | | public int realmLimit; |
| | | public bool isAuction; |
| | | public List<int> jobs; |
| | | foreach (var index in itemIDs[itemId]) |
| | | { |
| | | var item = items[index]; |
| | | if (!includeAuction && item.isAuction) |
| | | { |
| | | continue; |
| | | } |
| | | count += item.count; |
| | | } |
| | | } |
| | | return count; |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | |
| | | //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; |
| | | } |
| | | |
| | | /// <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 struct FilterParams |
| | | { |
| | | public List<int> levels; |
| | | public List<int> qualitys; |
| | | public List<int> itemTypes; |
| | | public List<int> equipTypes; |
| | | public int realmLimit; |
| | | public bool isAuction; |
| | | public List<int> jobs; |
| | | } |
| | | |
| | | } |