using System.Linq; using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "Major Project/Inventory", order = 150)] public class Inventory : ScriptableObject { public string test; public List BagItems { get { if (_bagItems == null) _bagItems = new List(); return _bagItems; } } [SerializeField] protected List _bagItems = new List(); public System.Action OnItemsUpdated; public void Add(LogicBlock element, int count = 1, bool isInfinit = false) { Data data = new Data { element = element, Count = count, isInfinit = isInfinit }; Add(data); } public void Add(Data data) { if (_bagItems.Exists(p => p.element.isSameType(data.element))) { Data bagData = BagItems.Find(p => p.element.isSameType(data.element)); bagData.Count += data.Count; bagData.isInfinit = (data.isInfinit || bagData.isInfinit); } else _bagItems.Add(data); OnItemsUpdated?.Invoke(); } public void Remove(LogicBlock element) { if (!_bagItems.Exists(p => p.element.isSameType(element))) { return; } Data data = _bagItems.First(p => p.element.isSameType(element)); if (!data.isInfinit) { if (data.Count > data.minCount) data.Count--; if (data.Count <= 0) _bagItems.Remove(data); } OnItemsUpdated?.Invoke(); } public void Reset() { _bagItems = new List(); OnItemsUpdated = null; } public void SetItems(Data[] bagItems) { _bagItems = new List(bagItems); OnItemsUpdated?.Invoke(); } public static Inventory Clone(Inventory copy) { Inventory retVal = ScriptableObject.CreateInstance(); retVal._bagItems = new List(); foreach (Data data in copy.BagItems) { Data dataCopy = new Data(data.element, data.Count, data.isInfinit,data.minCount); retVal._bagItems.Add(dataCopy); } return retVal; } [System.Serializable] public class Data { public LogicBlock element; public int Count; public int minCount; public bool isInfinit = false; public Data() { } public Data(LogicBlock element, int Count, bool isInfinit, int minCount = 0) { this.element = element; this.Count = Count; this.isInfinit = isInfinit; this.minCount = minCount; } } }