using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; public abstract class UIWarehouseManager : UIBaseManager> { public virtual int SLOTS_NUMBER => 0; public static new UIWarehouseManager Instance { get; protected set; } /* * not sure why but childrens of this class dont interfere on parents Awake */ /// /// Function to find item in warehouser by its id, returns list of all slots where item occured /// /// /// public List> FindItemInWarehouse(int itemId) { return Elements.Where(item => item.Value.Id == itemId).ToList(); } /// /// Function to find item in warehouser by its name, returns list of all slots where item occured /// /// /// public List> FindItemInWarehouseByName(string itemName) { return Elements.Where(item => item.Value.name == itemName).ToList(); } /// /// Function (SetItemOnPosition) to add slot with its number and item to list (which will be mapped with panel content) /// /// public virtual void Add(KeyValuePair itemOnSlot) { if (!CheckIfSlotIsInRange(itemOnSlot.Key)) throw new System.Exception($"Slot number: {itemOnSlot.Key} is out of range, avaiable: {SLOTS_NUMBER} slots"); if (CheckIfSlotExists(itemOnSlot.Key) && !CheckIfPositionIsEmpty(itemOnSlot.Key)) RemoveByPosition(itemOnSlot.Key); if(itemOnSlot.Value != null) { base.Add(itemOnSlot); } } /// /// Function to add item on first empty slot to list (which will be mapped with panel content) /// /// public virtual void Add(Item item) { if(IsFull()) throw new System.Exception($"Warehouse is full!!!"); // find first empty position / slot var max = Elements.Max(itemSlot => itemSlot.Key); base.Add(new KeyValuePair(max, item)); } public virtual void RemoveByPosition(int keyPosition) { if (!CheckIfSlotExists(keyPosition)) return; // throw new System.Exception($"Slot with number: {keyPosition} don't exist"); Debug.Log($"Remove from position: {keyPosition}"); Elements.RemoveAll(itemSlot => itemSlot.Key == keyPosition); } public virtual int RemoveByItemId(int itemId) { return Elements.RemoveAll(itemSlot => itemSlot.Value.Id == itemId); } public virtual int RemoveByItemName(string itemName) { return Elements.RemoveAll(itemSlot => itemSlot.Value.Name == itemName); } public virtual void RemoveAll() { Elements.Clear(); } public bool IsFull() { return Elements.Count() == SLOTS_NUMBER; } private bool CheckIfSlotIsInRange(int slotNumber) { return slotNumber < SLOTS_NUMBER; } private bool CheckIfSlotExists(int slotNumber) { return Elements.Any(itemSlot => itemSlot.Key == slotNumber); } /// /// Check if slot is empty in local list /// /// private bool CheckIfPositionIsEmpty(int slotNumber) { if(CheckIfSlotExists(slotNumber)) { return Elements.Where(itemSlot => itemSlot.Key == slotNumber).First().Value == null; } return true; } }