using System; using System.Collections; using System.Collections.Generic; using BayatGames.SaveGameFree; using UnityEngine; public class Inventory : Singleton { [Header("Config")] [SerializeField] private GameContent gameContent; [SerializeField] private int inventorySize; [SerializeField] private InventoryItem[] inventoryItems; [Header("Testing")] public InventoryItem testItem; public InventoryItem testItem2; public int InventorySize => inventorySize; public InventoryItem[] InventoryItems => inventoryItems; private readonly string INVENTORY_KEY_DATA = "MY_INVENTORY"; public void Start() { inventoryItems = new InventoryItem[inventorySize]; VerifyItemsForDraw(); LoadInventory(); } private void Update() { if (Input.GetKeyDown(KeyCode.H)) { AddItem(testItem, 1); AddItem(testItem2, 1); } } public bool TryAddItem(InventoryItem item, int quantity) { int prevStock = GetItemCurrentStock(item.ID); AddItem(item, quantity); int afterStock = GetItemCurrentStock(item.ID); return afterStock > prevStock; } public void AddItem(InventoryItem item, int quantity) { if (item == null || quantity <= 0) return; if (item.ItemType == ItemType.Video) { foreach (var existingItem in inventoryItems) { if (existingItem != null && existingItem.ItemType == ItemType.Video && existingItem.ID == item.ID) { Debug.LogWarning($"Item video dengan ID {item.ID} sudah ada di inventory. Tidak bisa menambahkan lagi."); return; } } AddItemFreeSlot(item, 1); SaveInventory(); return; } List itemIndexes = CheckItemStockIndexes(item.ID); if (item.IsStackable && itemIndexes.Count > 0) { foreach (int index in itemIndexes) { int maxStack = item.MaxStack; if (inventoryItems[index].Quantity < maxStack) { inventoryItems[index].Quantity += quantity; if (inventoryItems[index].Quantity > maxStack) { int dif = inventoryItems[index].Quantity - maxStack; inventoryItems[index].Quantity = maxStack; AddItem(item, dif); } InventoryUI.Instance.DrawItem(inventoryItems[index], index); SaveInventory(); return; } } } int quantityToAdd = quantity > item.MaxStack ? item.MaxStack : quantity; AddItemFreeSlot(item, quantityToAdd); int remainingAmount = quantity - quantityToAdd; if (remainingAmount > 0) { AddItem(item, remainingAmount); } SaveInventory(); } public void UseItem(int index) { if (inventoryItems[index] == null) return; if (inventoryItems[index].UseItem()) { DecreaseItemStack(index); } SaveInventory(); } public void RemoveItem(int index) { if (inventoryItems[index] == null) return; inventoryItems[index].RemoveItem(); inventoryItems[index] = null; InventoryUI.Instance.DrawItem(null, index); SaveInventory(); } public void EquipItem(int index) { if (inventoryItems[index] == null) return; if (inventoryItems[index].ItemType != ItemType.Weapon) return; inventoryItems[index].EquipItem(); } private void AddItemFreeSlot(InventoryItem item, int quantity) { for (int i = 0; i < inventorySize; i++) { if (inventoryItems[i] != null) continue; inventoryItems[i] = item.CopyItem(); inventoryItems[i].Quantity = quantity; InventoryUI.Instance.DrawItem(inventoryItems[i], i); return; } } private void DecreaseItemStack(int index) { inventoryItems[index].Quantity--; if (inventoryItems[index].Quantity <= 0) { inventoryItems[index] = null; InventoryUI.Instance.DrawItem(null, index); } else { InventoryUI.Instance.DrawItem(inventoryItems[index], index); } } public void ConsumeItem(string itemID) { List indexes = CheckItemStockIndexes(itemID); if (indexes.Count > 0) { DecreaseItemStack(indexes[^1]); } } private List CheckItemStockIndexes(string itemID) { List itemIndexes = new List(); for (int i = 0; i < inventoryItems.Length; i++) { if (inventoryItems[i] == null) continue; if (inventoryItems[i].ID == itemID) { itemIndexes.Add(i); } } return itemIndexes; } public int GetItemCurrentStock(string itemID) { List indexes = CheckItemStockIndexes(itemID); int currentStock = 0; foreach (int index in indexes) { if (inventoryItems[index].ID == itemID) { currentStock += inventoryItems[index].Quantity; } } return currentStock; } private void VerifyItemsForDraw() { for (int i = 0; i < inventorySize; i++) { if (inventoryItems[i] == null) { InventoryUI.Instance.DrawItem(null, i); } } } private InventoryItem ItemExistsInGameContent(string itemID) { for (int i = 0; i < gameContent.GameItems.Length; i++) { if (gameContent.GameItems[i].ID == itemID) { return gameContent.GameItems[i]; } } return null; } private void LoadInventory() { if (SaveGame.Exists(INVENTORY_KEY_DATA)) { InventoryData loadData = SaveGame.Load(INVENTORY_KEY_DATA); for (int i = 0; i < inventorySize; i++) { if (loadData.ItemContent[i] != null) { InventoryItem itemFromContent = ItemExistsInGameContent(loadData.ItemContent[i]); if (itemFromContent != null) { inventoryItems[i] = itemFromContent.CopyItem(); inventoryItems[i].Quantity = loadData.ItemQuantity[i]; InventoryUI.Instance.DrawItem(inventoryItems[i], i); } } else { inventoryItems[i] = null; } } } } public void SaveInventory() { InventoryData saveData = new InventoryData(); saveData.ItemContent = new string[inventorySize]; saveData.ItemQuantity = new int[inventorySize]; for (int i = 0; i < inventorySize; i++) { if (inventoryItems[i] == null) { saveData.ItemContent[i] = null; saveData.ItemQuantity[i] = 0; } else { saveData.ItemContent[i] = inventoryItems[i].ID; saveData.ItemQuantity[i] = inventoryItems[i].Quantity; } } SaveGame.Save(INVENTORY_KEY_DATA, saveData); } public void ClearInventory() { for (int i = 0; i < inventorySize; i++) { if (inventoryItems[i] != null) { inventoryItems[i] = null; InventoryUI.Instance.DrawItem(null, i); } } SaveInventory(); Debug.Log("Inventory cleared!"); } }