Files
my-project/Assets/Inventory/Scripts/CraftingManager.cs
2026-04-17 02:14:56 +05:00

208 lines
6.0 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
public class CraftingManager : MonoBehaviour
{
public static CraftingManager Instance;
[Header("UI References")]
public GameObject craftingPanel;
public Slot[] inputSlots; // 9 слотов для входа (как в крафтинге)
public Slot outputSlot; // 1 слот для результата
public Text recipeNameText;
public Button craftButton;
[Header("Recipe Database")]
public List<CraftingRecipe> recipes;
private Dictionary<string, CraftingRecipe> _recipeDict;
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
return;
}
_recipeDict = new Dictionary<string, CraftingRecipe>();
foreach (var recipe in recipes)
{
string key = GetRecipeKey(recipe);
_recipeDict[key] = recipe;
}
}
void Start()
{
if (craftingPanel != null)
craftingPanel.SetActive(false);
if (craftButton != null)
craftButton.onClick.AddListener(Craft);
}
public void ToggleCrafting()
{
if (craftingPanel != null)
{
craftingPanel.SetActive(!craftingPanel.activeSelf);
if (craftingPanel.activeSelf)
CheckRecipe();
}
}
// Собираем ключ из текущих ингредиентов в слотах
string GetCurrentIngredientsKey()
{
var ingredients = new List<string>();
foreach (var slot in inputSlots)
{
if (!slot.IsEmpty)
{
ingredients.Add(slot.item.id);
}
}
ingredients.Sort();
return string.Join(",", ingredients);
}
// Проверяем рецепт
public void CheckRecipe()
{
string key = GetCurrentIngredientsKey();
if (_recipeDict.TryGetValue(key, out CraftingRecipe recipe))
{
// Проверяем хватает ли количества
bool canCraft = true;
int slotIndex = 0;
foreach (var ingredientId in recipe.ingredients)
{
int required = recipe.amounts[System.Array.IndexOf(recipe.ingredients, ingredientId)];
int have = 0;
for (int i = 0; i < inputSlots.Length; i++)
{
if (!inputSlots[i].IsEmpty && inputSlots[i].item.id == ingredientId)
{
have += inputSlots[i].amount;
}
}
if (have < required)
{
canCraft = false;
break;
}
}
if (canCraft)
{
// Показываем результат
if (InventoryManager.Instance.itemDatabase.Find(x => x.id == recipe.resultId) is ItemData resultItem)
{
outputSlot.SetItem(resultItem, recipe.resultAmount);
if (recipeNameText != null)
recipeNameText.text = resultItem.itemName;
if (craftButton != null)
craftButton.interactable = true;
}
}
else
{
outputSlot.Clear();
if (recipeNameText != null)
recipeNameText.text = "Unknown recipe";
if (craftButton != null)
craftButton.interactable = false;
}
}
else
{
outputSlot.Clear();
if (recipeNameText != null)
recipeNameText.text = "";
if (craftButton != null)
craftButton.interactable = false;
}
}
// Выполнить крафтинг
public void Craft()
{
string key = GetCurrentIngredientsKey();
if (_recipeDict.TryGetValue(key, out CraftingRecipe recipe))
{
// Удаляем ингредиенты
foreach (var ingredientId in recipe.ingredients)
{
int required = recipe.amounts[System.Array.IndexOf(recipe.ingredients, ingredientId)];
InventoryManager.Instance.RemoveItem(ingredientId, required);
}
// Добавляем результат
int remaining = InventoryManager.Instance.AddItem(recipe.resultId, recipe.resultAmount);
if (remaining > 0)
{
Debug.LogWarning($"Inventory full! Couldn't add {remaining} items.");
}
// Очищаем слоты ввода
foreach (var slot in inputSlots)
{
slot.Clear();
}
// Пересматриваем рецепт
CheckRecipe();
// Обновляем инвентарь
foreach (var slot in InventoryManager.Instance.slots)
{
slot.UpdateSlotUI();
}
}
}
// Добавить рецепт
public void AddRecipe(string resultId, int resultAmount, string[] ingredients, int[] amounts)
{
var recipe = new CraftingRecipe
{
resultId = resultId,
resultAmount = resultAmount,
ingredients = ingredients,
amounts = amounts
};
recipes.Add(recipe);
string key = GetRecipeKey(recipe);
_recipeDict[key] = recipe;
}
string GetRecipeKey(CraftingRecipe recipe)
{
var sorted = new List<string>(recipe.ingredients);
sorted.Sort();
return string.Join(",", sorted);
}
[System.Serializable]
public class CraftingRecipe
{
public string resultId;
public int resultAmount = 1;
public string[] ingredients;
public int[] amounts;
}
}