93 lines
2.1 KiB
C#
93 lines
2.1 KiB
C#
namespace Sasalka;
|
||
|
||
public class Inventar
|
||
{
|
||
[Flags]
|
||
public enum InventorySlot
|
||
{
|
||
None = 0,
|
||
LeftHand = 1 << 0, // 1
|
||
RightHand = 1 << 1, // 2
|
||
Head = 1 << 2, // 4
|
||
Body = 1 << 3, // 8
|
||
Hands = 1 << 4, // 16
|
||
Bottom = 1 << 5, // 32
|
||
Feet = 1 << 6 // 64
|
||
}
|
||
|
||
public List<InventoryItem> Items { get; private set; } = new();
|
||
public static bool IsInventoryOpen = false;
|
||
public Dictionary<InventorySlot, InventoryItem> EquippedItems { get; private set; } = new();
|
||
|
||
public event Action OnChanged;
|
||
public event Action<InventoryItem> OnEquipped;
|
||
public event Action<InventoryItem> OnUnEquipped;
|
||
|
||
public void AddItem( InventoryItem item )
|
||
{
|
||
Items.Add( item );
|
||
OnChanged?.Invoke();
|
||
}
|
||
|
||
public void RemoveItem( InventoryItem item )
|
||
{
|
||
UnEquipItem( item );
|
||
Items.Remove( item );
|
||
OnChanged?.Invoke();
|
||
}
|
||
|
||
public void EquipItem( InventoryItem item )
|
||
{
|
||
if ( item.Definition is not IEquipable equipable )
|
||
return;
|
||
|
||
// Если уже экипирован этот же предмет — снять его
|
||
if ( EquippedItems.ContainsValue( item ) )
|
||
{
|
||
UnEquipItem( item );
|
||
return;
|
||
}
|
||
|
||
// Если на этом слоте уже что-то есть — снять старый предмет
|
||
if ( EquippedItems.TryGetValue( equipable.Slot, out var oldItem ) )
|
||
{
|
||
UnEquipItem( oldItem );
|
||
|
||
// Вернуть снятый предмет обратно в инвентарь, если его там нет
|
||
if ( !Items.Contains( oldItem ) )
|
||
Items.Add( oldItem );
|
||
}
|
||
|
||
// Экипировать новый предмет
|
||
EquippedItems[equipable.Slot] = item;
|
||
OnEquipped?.Invoke( item );
|
||
}
|
||
|
||
public void DropItem( InventoryItem item, Vector3 position )
|
||
{
|
||
var gO = item.Definition.Prefab.Clone( position );
|
||
|
||
if ( gO.Components.TryGet<InventoryItem>( out var inventoryItem ) )
|
||
{
|
||
inventoryItem.Count = item.Count;
|
||
}
|
||
|
||
gO.NetworkSpawn( null );
|
||
|
||
RemoveItem( item );
|
||
// Items.Remove( item );
|
||
// OnChanged?.Invoke();
|
||
}
|
||
|
||
|
||
public void UnEquipItem( InventoryItem item )
|
||
{
|
||
foreach ( var kvp in EquippedItems.Where( kvp => kvp.Value == item ).ToList() )
|
||
{
|
||
EquippedItems.Remove( kvp.Key );
|
||
}
|
||
|
||
OnUnEquipped?.Invoke( item );
|
||
}
|
||
}
|