Untitled
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