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 Items { get; private set; } = new(); public static bool IsInventoryOpen = false; public Dictionary EquippedItems { get; private set; } = new(); public event Action OnChanged; public event Action OnEquipped; public event Action 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; item.Equipped = true; OnEquipped?.Invoke( item ); } public void DropItem( InventoryItem item, Vector3 position ) { GameObject gO = item.Definition.Prefab.Clone( position ); if ( gO.Components.TryGet( out var inventoryItem ) ) { inventoryItem.Count = item.Count; if ( inventoryItem.Definition == null ) { inventoryItem.Definition = item.Definition; } } 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 ); } item.Equipped = false; OnUnEquipped?.Invoke( item ); } }