BITFALL/Assets/Artists/Scripts/Item/WorldItemContainer.cs

74 lines
1.9 KiB
C#

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<int,IBasicItem> _items = new();
public int Id => GetInstanceID();
public bool TryGetItem(Func<IBasicItem, bool> 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<IBasicItem, bool> 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<IBasicItem, bool> AddFactory;
public event Func<IBasicItem, bool> RemoveFactory;
public event Func<IBasicItem, bool> DropFactory;
public event Action<IBasicItem> OnAdd;
public event Action<IBasicItem> OnRemove;
public event Action<IBasicItem> OnSet;
public event Action<IBasicItem> OnDrop;
public event Action<IBasicItemContainer> OnRebuild;
}
}