mirror of
https://github.com/DerTyp7/harvestdale-unity.git
synced 2025-10-29 04:42:08 +01:00
149 lines
3.6 KiB
C#
149 lines
3.6 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using System;
|
|
public class Inventory : MonoBehaviour
|
|
{
|
|
public static Action OnPlayerInventoryChanged;
|
|
|
|
public bool isPlayerInventory = false;
|
|
public int maxSlots = 20; // maximum number of slots in the inventory
|
|
public InventoryItem[] items; // list of items in the inventory
|
|
|
|
|
|
private void Awake()
|
|
{
|
|
items = new InventoryItem[maxSlots];
|
|
for (int i = 0; i < maxSlots; i++)
|
|
{
|
|
items[i] = null;
|
|
}
|
|
}
|
|
|
|
// adds an item to the inventory, returns the quantity of items which could not be added
|
|
public int Add(Item item, int count)
|
|
{
|
|
int remainingCount = count;
|
|
|
|
// check if the item is stackable
|
|
if (item.stackable)
|
|
{
|
|
|
|
// look for an existing stack of the same item in the inventory
|
|
for (int i = 0; i < items.Length; i++)
|
|
{
|
|
InventoryItem invItem = items[i];
|
|
if (invItem != null && invItem.item == item && invItem.count < item.maxStackSize)
|
|
{
|
|
// add as many items as possible to the stack
|
|
int space = item.maxStackSize - invItem.count;
|
|
int toAdd = Mathf.Min(space, remainingCount);
|
|
invItem.count += toAdd;
|
|
remainingCount -= toAdd;
|
|
|
|
// exit the loop if all items have been added
|
|
if (remainingCount == 0)
|
|
{
|
|
if (isPlayerInventory)
|
|
{
|
|
OnPlayerInventoryChanged?.Invoke();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// if there is still remaining count, add new stacks of the item
|
|
for (int i = 0; i < items.Length; i++)
|
|
|
|
{
|
|
InventoryItem invItem = items[i];
|
|
Debug.Log(invItem);
|
|
if (invItem?.item == null)
|
|
{
|
|
|
|
int toAdd = Mathf.Min(item.maxStackSize, remainingCount);
|
|
items[i] = new InventoryItem(item, toAdd);
|
|
remainingCount -= toAdd;
|
|
|
|
// exit the loop if all items have been added
|
|
if (remainingCount == 0)
|
|
{
|
|
|
|
if (isPlayerInventory)
|
|
{
|
|
OnPlayerInventoryChanged?.Invoke();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// return the quantity of items which could not be added
|
|
if (isPlayerInventory)
|
|
{
|
|
OnPlayerInventoryChanged?.Invoke();
|
|
}
|
|
|
|
return remainingCount;
|
|
}
|
|
|
|
|
|
// removes an item from the inventory, returns the quantity of items which could not be removed
|
|
public int Remove(Item item, int count)
|
|
{
|
|
int remainingCount = count;
|
|
|
|
// look for an existing stack of the item in the inventory
|
|
for (int i = 0; i < items.Length; i++)
|
|
{
|
|
InventoryItem invItem = items[i];
|
|
if (invItem != null && invItem.item == item)
|
|
{
|
|
// remove as many items as possible from the stack
|
|
int toRemove = Mathf.Min(invItem.count, remainingCount);
|
|
invItem.count -= toRemove;
|
|
remainingCount -= toRemove;
|
|
|
|
// remove the stack if it's now empty
|
|
if (invItem.count == 0)
|
|
{
|
|
items[i] = null;
|
|
}
|
|
|
|
// exit the loop if all items have been removed
|
|
if (remainingCount == 0)
|
|
{
|
|
if (isPlayerInventory)
|
|
{
|
|
OnPlayerInventoryChanged?.Invoke();
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// return the quantity of items which could not be removed
|
|
if (isPlayerInventory)
|
|
{
|
|
OnPlayerInventoryChanged?.Invoke();
|
|
}
|
|
return remainingCount;
|
|
}
|
|
|
|
public void SwapItems(int index1, int index2)
|
|
{
|
|
InventoryItem temp = items[index1];
|
|
items[index1] = items[index2];
|
|
items[index2] = temp;
|
|
if (isPlayerInventory)
|
|
{
|
|
OnPlayerInventoryChanged?.Invoke();
|
|
}
|
|
}
|
|
}
|
|
|
|
|