using System; using UnityEngine; namespace HQFPSWeapons { [Serializable] public class ItemSlot { /// Sent when this slot has changed (e.g. when the item has changed). [NonSerialized] public Message Changed = new Message(); public bool HasItem { get { return Item != null; } } public SaveableItem Item { get { return m_Item; } } private SaveableItem m_Item; public static implicit operator bool(ItemSlot slot) { return slot != null; } public void SetItem(SaveableItem item) { if(Item) { Item.PropertyChanged.RemoveListener(On_PropertyChanged); Item.StackChanged.RemoveListener(On_StackChanged); } m_Item = item; if(Item) { Item.PropertyChanged.AddListener(On_PropertyChanged); Item.StackChanged.AddListener(On_StackChanged); } Changed.Send(this); } public int RemoveFromStack(int amount) { if(!HasItem) return 0; if(amount >= Item.CurrentStackSize) { int stackSize = Item.CurrentStackSize; SetItem(null); return stackSize; } int oldStack = Item.CurrentStackSize; Item.CurrentStackSize = Mathf.Max(Item.CurrentStackSize - amount, 0); Changed.Send(this); return oldStack - Item.CurrentStackSize; } public int AddToStack(int amount) { if(!HasItem || Item.Data.StackSize <= 1) return 0; int oldStackCount = Item.CurrentStackSize; int surplus = amount + oldStackCount - Item.Data.StackSize; int currentStackCount = oldStackCount; if(surplus <= 0) currentStackCount += amount; else currentStackCount = Item.Data.StackSize; Item.CurrentStackSize = currentStackCount; return currentStackCount - oldStackCount; } private void On_PropertyChanged(ItemProperty.Value propertyValue) { Changed.Send(this); } private void On_StackChanged() { Changed.Send(this); } } }