using Invector.vItemManager; using System.Collections.Generic; using UnityEngine; namespace Beyond { public static class bItemListOperations { public static List GetSameItems(this List itemList, int id) { return itemList.FindAll(i => i.id.Equals(id)); } public static List GetSameItems(this List itemList, string name) { return itemList.FindAll(i => i.name.Equals(name)); } public static List GetSameItems(this List itemList, params int[] ids) { return itemList.FindAll(i => System.Array.Exists(ids, id => i.id.Equals(id))); } public static List GetSameItems(this List itemList, params string[] names) { return itemList.FindAll(i => System.Array.Exists(names, name => i.name.Equals(name))); } public static bool HasItem(this List itemList, int id) { return itemList.Exists(i => i.id.Equals(id)); } public static bool HasItem(this List itemList, string name) { return itemList.Exists(i => i.name.Equals(name)); } public static bool HasItems(this List itemList, params int[] ids) { bool has = true; for (int i = 0; i < ids.Length; i++) { if (!itemList.HasItem(ids[i])) { has = false; break; } } return has; } public static bool HasItems(this List itemList, params string[] names) { bool has = true; for (int i = 0; i < names.Length; i++) { if (!itemList.HasItem(names[i])) { has = false; break; } } return has; } public static int GetItemCount(this List itemList, int id) { int count = 0; List sameItems = GetSameItems(itemList, id); sameItems.ForEach(delegate (vItem item) { count += item.amount; }); return count; } public static int GetItemCount(this List itemList, string name) { int count = 0; List sameItems = GetSameItems(itemList, name); sameItems.ForEach(delegate (vItem item) { count += item.amount; }); return count; } public static void DestroySameItems(this List itemList, int id, int amount, System.Action onChangeItemAmount = null) { List sameItems = GetSameItems(itemList, id); for (int i = 0; i < sameItems.Count; i++) { var item = sameItems[i]; if (item.amount > amount) { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(item, amount); item.amount -= amount; break; } else { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(item, item.amount); amount -= item.amount; item.amount = 0; itemList.Remove(item); GameObject.Destroy(item); } } } public static void DestroySameItems(this List itemList, string name, int amount, System.Action onChangeItemAmount = null) { List sameItems = GetSameItems(itemList, name); for (int i = 0; i < sameItems.Count; i++) { var item = sameItems[i]; if (item.amount > amount) { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(item, amount); item.amount -= amount; break; } else { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(item, item.amount); amount -= item.amount; item.amount = 0; itemList.Remove(item); GameObject.Destroy(item); } } } public static void DestroySameItems(this List itemList, int id, System.Action onChangeItemAmount = null) { List sameItems = GetSameItems(itemList, id); itemList.RemoveAll(i => i.id.Equals(id)); for (int i = 0; i < sameItems.Count; i++) { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(sameItems[i], sameItems[i].amount); GameObject.Destroy(sameItems[i]); } } public static void DestroySameItems(this List itemList, string name, System.Action onChangeItemAmount = null) { List sameItems = GetSameItems(itemList, name); itemList.RemoveAll(i => i.name.Equals(name)); for (int i = 0; i < sameItems.Count; i++) { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(sameItems[i], sameItems[i].amount); GameObject.Destroy(sameItems[i]); } } public static void DestroySameItems(this List itemList, System.Action onChangeItemAmount = null, params int[] ids) { List sameItems = GetSameItems(itemList, ids); itemList.RemoveAll(i => System.Array.Exists(ids, id => i.id.Equals(id))); for (int i = 0; i < sameItems.Count; i++) { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(sameItems[i], sameItems[i].amount); GameObject.Destroy(sameItems[i]); } } public static void DestroySameItems(this List itemList, System.Action onChangeItemAmount = null, params string[] names) { List sameItems = GetSameItems(itemList, names); itemList.RemoveAll(i => System.Array.Exists(names, name => i.name.Equals(name))); for (int i = 0; i < sameItems.Count; i++) { if (onChangeItemAmount != null) onChangeItemAmount.Invoke(sameItems[i], sameItems[i].amount); GameObject.Destroy(sameItems[i]); } } public static bool ItemIsEquipped(this bItemManager itemManager, int id) { if (itemManager.inventory) return System.Array.Find(itemManager.inventory.equipAreas, equipArea => equipArea.currentEquippedItem && equipArea.currentEquippedItem.id.Equals(id)); return false; } public static bool ItemTypeIsEquipped(this bItemManager itemManager, bItemType type) { if (itemManager.inventory) return System.Array.Find(itemManager.inventory.equipAreas, equipArea => equipArea.currentEquippedItem && equipArea.currentEquippedItem.type.Equals(type)); return false; } public static bool ItemIsEquipped(this bItemManager itemManager, int id, out EquipedItemInfo equipedItemInfo) { equipedItemInfo = null; if (itemManager.inventory) { var area = System.Array.Find(itemManager.inventory.equipAreas, equipArea => equipArea.currentEquippedItem && equipArea.currentEquippedItem.id.Equals(id)); if (area) { equipedItemInfo = new EquipedItemInfo(area.currentEquippedItem, area); equipedItemInfo.indexOfArea = System.Array.IndexOf(itemManager.inventory.equipAreas, area); equipedItemInfo.indexOfItem = itemManager.items.IndexOf(area.currentEquippedItem); } return area != null; } return false; } public static bool ItemTypeIsEquipped(this bItemManager itemManager, bItemType type, out EquipedItemInfo equipedItemInfo) { equipedItemInfo = null; if (itemManager.inventory) { var area = System.Array.Find(itemManager.inventory.equipAreas, equipArea => equipArea.currentEquippedItem && equipArea.currentEquippedItem.type.Equals(type)); if (area) { equipedItemInfo = new EquipedItemInfo(area.currentEquippedItem, area); equipedItemInfo.indexOfArea = System.Array.IndexOf(itemManager.inventory.equipAreas, area); equipedItemInfo.indexOfItem = itemManager.items.IndexOf(area.currentEquippedItem); } return area != null; } return false; } public static bItem GetEquippedItem(this bItemManager itemManager, int id) { if (itemManager.inventory) { var area = System.Array.Find(itemManager.inventory.equipAreas, equipArea => equipArea.currentEquippedItem && equipArea.currentEquippedItem.id.Equals(id)); return area ? area.currentEquippedItem : null; } return null; } public class EquipedItemInfo { public bItem item; public int indexOfItem; public bEquipArea area; public int indexOfArea; public EquipedItemInfo() { } public EquipedItemInfo(bItem item, bEquipArea area) { this.item = item; this.area = area; } } } }