CapersProject/Assets/02.Scripts/Character/Inventory.cs

121 lines
4.1 KiB
C#
Raw Normal View History

2024-06-03 18:26:03 +00:00
using System;
using System.Collections.Generic;
using BlueWater.Items;
using UnityEngine;
namespace BlueWater
2024-06-03 18:26:03 +00:00
{
public enum CombatInventorySortingType
2024-06-03 18:26:03 +00:00
{
None = 0,
Recent,
Name,
Category,
Count,
}
[Serializable]
public class Inventory
2024-06-03 18:26:03 +00:00
{
[field: SerializeField]
public List<ItemSlot> ItemSlotList { get; private set; } = new();
[field: SerializeField]
public float WeightLimit { get; private set; } = float.PositiveInfinity;
[field: SerializeField]
public float CurrentTotalWeight { get; private set; }
[field: SerializeField]
public bool IsOverWeight { get; private set; }
public event Action<ItemSlot, bool> OnChangeItemSlot;
2024-08-22 10:39:15 +00:00
public ItemSlot GetItemByIdx(string idx)
2024-06-03 18:26:03 +00:00
{
return ItemSlotList.Find(i => i.Idx == idx);
}
public void AddItem(ItemSlot newItemSlot)
{
// 현재 인벤토리 내에 같은 idx인 아이템 찾기
var existingItemIdx = ItemSlotList.Find(i => i.Idx == newItemSlot.Idx);
// 같은 idx가 있으면, 갯수만 추가
// 같은 idx가 없으면, 리스트에 아이템 새로 추가
if (existingItemIdx != null)
{
existingItemIdx.AddItemQuantity(newItemSlot.Quantity);
OnChangeItemSlot?.Invoke(existingItemIdx, true);
2024-06-03 18:26:03 +00:00
}
else
{
ItemSlotList.Add(newItemSlot);
OnChangeItemSlot?.Invoke(newItemSlot, true);
2024-06-03 18:26:03 +00:00
}
// 추가된 아이템에 맞게 인벤토리 내의 무게 계산
CalculateInventoryWeight();
}
public void RemoveItem(ItemSlot removeItemSlot, int removeCount)
{
var existingItem = ItemSlotList.Find(i => i.Idx == removeItemSlot.Idx);
if (existingItem != null)
{
existingItem.RemoveItemQuantity(removeCount);
if (existingItem.Quantity <= 0)
2024-06-03 18:26:03 +00:00
{
ItemSlotList.Remove(existingItem);
}
}
else
{
Debug.Log("Item not found in inventory to remove.");
}
CalculateInventoryWeight();
OnChangeItemSlot?.Invoke(removeItemSlot, false);
}
public void CalculateInventoryWeight()
{
CurrentTotalWeight = 0f;
foreach (var element in ItemSlotList)
{
2024-09-12 07:36:24 +00:00
var elementWeight = ItemManager.Instance.ItemDataSo.GetDataByIdx(element.Idx).Weight;
CurrentTotalWeight += elementWeight * element.Quantity;
2024-06-03 18:26:03 +00:00
}
IsOverWeight = CurrentTotalWeight >= WeightLimit;
}
public void SortItem(CombatInventorySortingType sortingType)
2024-06-03 18:26:03 +00:00
{
switch (sortingType)
{
case CombatInventorySortingType.None:
2024-06-03 18:26:03 +00:00
return;
case CombatInventorySortingType.Recent:
2024-06-03 18:26:03 +00:00
ItemSlotList.Sort((x, y) => y.AcquisitionTime.CompareTo(x.AcquisitionTime));
break;
case CombatInventorySortingType.Name:
2024-06-03 18:26:03 +00:00
ItemSlotList.Sort((x, y) =>
2024-09-12 07:36:24 +00:00
string.Compare(ItemManager.Instance.ItemDataSo.GetDataByIdx(x.Idx).Name,
ItemManager.Instance.ItemDataSo.GetDataByIdx(y.Idx).Name, StringComparison.Ordinal));
2024-06-03 18:26:03 +00:00
break;
case CombatInventorySortingType.Category:
2024-06-03 18:26:03 +00:00
ItemSlotList.Sort((x, y) =>
2024-09-12 07:36:24 +00:00
ItemManager.Instance.ItemDataSo.GetDataByIdx(x.Idx).Type.CompareTo(ItemManager.Instance.ItemDataSo.GetDataByIdx(y.Idx).Type));
2024-06-03 18:26:03 +00:00
break;
case CombatInventorySortingType.Count:
ItemSlotList.Sort((x, y) => y.Quantity.CompareTo(x.Quantity));
2024-06-03 18:26:03 +00:00
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}