Untitled

 avatar
unknown
csharp
4 months ago
3.1 kB
9
Indexable
using UnityEngine;
using PurrNet;
using EditorAttributes;

public struct InventoryItem
{
    public ItemSO ItemSO;
    public int Amount;
}

public abstract class Inventory : NetworkBehaviour
{
    [SerializeField] protected SyncArray<InventoryItem> _inventoryItems = new();

    [SerializeField] PickupItem _pickupPrefab;
    [SerializeField] protected ItemSO _testItem;

    public bool TryAddItem(ItemSO itemSO, int quantity = 1)
    {
        if (TryStack(itemSO, quantity))
            return true;

        return TryAddNewItem(itemSO, quantity);
    }

    bool TryStack(ItemSO itemSO, int quantity)
    {
        for (int i = 0; i < _inventoryItems.Length; i++)
        {
            var invItem = _inventoryItems[i];

            if (invItem.ItemSO != itemSO)
                continue;

            invItem.Amount += quantity;
            _inventoryItems[i] = invItem;
            return true;
        }

        return false;
    }

    bool TryAddNewItem(ItemSO itemSO, int quantity)
    {
        for (int i = 0; i < _inventoryItems.Length; i++)
        {
            var invItem = _inventoryItems[i];

            if (invItem.ItemSO)
                continue;

            invItem.ItemSO = itemSO;
            invItem.Amount = quantity;
            _inventoryItems[i] = invItem;
            return true;
        }

        return false;
    }

    protected virtual void RemoveItem(int index, int amount)
    {
        var invItem = _inventoryItems[index];
        invItem.Amount -= amount;

        if (invItem.Amount <= 0)
            invItem.ItemSO = null;

        _inventoryItems[index] = invItem;
    }

    public virtual void Interact(int index)
    {

    }

    public virtual void DropItem(int index, int amount)
    {
        if (index < 0 || index >= _inventoryItems.Count)
        {
            Debug.LogError($"Invalid index {index} for inventory items", this);
            return;
        }

        var invItem = _inventoryItems[index];

        if (invItem.ItemSO == null)
        {
            return;
        }

        amount = Mathf.Min(amount, invItem.Amount);

        for (int i = 0; i < amount; i++)
        {
            SpawnItem(invItem.ItemSO);
        }

        RemoveItem(index, amount);
    }

    protected void SpawnItem(ItemSO itemSO)
    {
        var gameObject = Instantiate(_pickupPrefab);

        gameObject.GetComponent<PickupItem>().InitializeObject(itemSO);

        float frontDistance = 1f;
        float sideDistance = 1f;
        frontDistance *= Random.Range(0.7f, 1.3f);
        sideDistance *= Random.Range(-0.6f, 0.6f);

        Vector3 spawnPosition = transform.position + transform.forward * frontDistance;
        spawnPosition += transform.right * sideDistance;
        spawnPosition.y += frontDistance / 2f;

        gameObject.transform.position = spawnPosition;

        // Instantiate ItemPickup with Mesh and Assign SO to it
        //Instantiate(itemPickup, Random.insideUnitSphere * 3, Quaternion.identity);
    }
}
Editor is loading...
Leave a Comment