using System; using System.Collections; using System.Collections.Generic; using System.Linq; using BITKit; using UnityEngine; namespace BITFALL.Items { public class WorldItemContainer : MonoBehaviour,IBasicItemContainer,IDescription { [SerializeField] private string containerName; public string Name => containerName; private readonly Dictionary _items = new(); public int Id => GetInstanceID(); public bool TryGetItem(Func func, out IBasicItem item) { if (_items.Values.TryGetAny(func.Invoke,out item)) { return true; } item=null; return false; } public IBasicItem[] GetItems()=>_items.Values.ToArray(); public bool Add(IBasicItem item) { if (AddFactory.CastAsFunc().Any(x=>x.Invoke(item) is false)) return false; if (_items.ContainsKey(item.Id)) return false; _items.Add(item.Id,item); OnAdd?.Invoke(item); OnSet?.Invoke(item); return true; } public bool Remove(IBasicItem item) { return Remove(item.Id); } public bool Remove(int id) { if (RemoveFactory.CastAsFunc().Any(x=>x.Invoke(_items[id]) is false)) return false; if (!_items.Remove(id)) return false; OnRemove?.Invoke(_items[id]); return true; } public bool Remove(Func removeFactory) { return _items.Values.TryGetAny(removeFactory.Invoke,out var item) && Remove(item); } public bool Drop(int Id) { throw new NotImplementedException(); } public bool DropOrSpawn(IBasicItem item) { throw new NotImplementedException(); } public event Func AddFactory; public event Func RemoveFactory; public event Func DropFactory; public event Action OnAdd; public event Action OnRemove; public event Action OnSet; public event Action OnDrop; public event Action OnRebuild; } }