using System; using System.Collections.Generic; using System.Text; using UnityEngine; public class CraftingSystem : MonoBehaviour { public Inventory playerInventory; public List availableRecipes = new List(); [TextArea(1, 3)] public string lastMessage; public event Action OnCraftingChanged; public bool CanCraft(RecipeData recipe) { if (recipe == null || playerInventory == null || recipe.result == null) { return false; } if (!recipe.unlockedByDefault || recipe.ingredients == null) { return false; } for (int i = 0; i < recipe.ingredients.Length; i++) { Ingredient ingredient = recipe.ingredients[i]; if (ingredient == null || ingredient.item == null || ingredient.amount <= 0) { return false; } if (!playerInventory.HasItem(ingredient.item, ingredient.amount)) { return false; } } return playerInventory.CanAddItem(recipe.result, recipe.resultAmount); } public void Craft(RecipeData recipe) { if (recipe == null) { lastMessage = "Рецепт не выбран."; Refresh(); return; } if (playerInventory == null) { lastMessage = "Инвентарь не подключен."; Refresh(); return; } if (!HasIngredients(recipe)) { lastMessage = "Не хватает ресурсов: " + GetMissingIngredientsText(recipe); Refresh(); return; } if (recipe.result == null || !playerInventory.CanAddItem(recipe.result, recipe.resultAmount)) { lastMessage = "Недостаточно места в инвентаре для результата."; Refresh(); return; } // Ingredients are removed only after confirming that the result can be added. for (int i = 0; i < recipe.ingredients.Length; i++) { Ingredient ingredient = recipe.ingredients[i]; playerInventory.RemoveItem(ingredient.item, ingredient.amount); } playerInventory.AddItem(recipe.result, recipe.resultAmount); lastMessage = "Создан предмет: " + recipe.GetResultText(); Refresh(); } public string GetMissingIngredientsText(RecipeData recipe) { if (recipe == null || recipe.ingredients == null || playerInventory == null) { return "нет данных"; } StringBuilder builder = new StringBuilder(); for (int i = 0; i < recipe.ingredients.Length; i++) { Ingredient ingredient = recipe.ingredients[i]; if (ingredient == null || ingredient.item == null) { continue; } int current = playerInventory.GetItemAmount(ingredient.item); if (current >= ingredient.amount) { continue; } if (builder.Length > 0) { builder.Append(", "); } builder.Append(ingredient.item.itemName); builder.Append(" "); builder.Append(current); builder.Append("/"); builder.Append(ingredient.amount); } return builder.Length == 0 ? "место в инвентаре" : builder.ToString(); } public void SetRecipes(List recipes) { availableRecipes = recipes ?? new List(); Refresh(); } public void Refresh() { OnCraftingChanged?.Invoke(); } private bool HasIngredients(RecipeData recipe) { if (recipe == null || recipe.ingredients == null || playerInventory == null) { return false; } for (int i = 0; i < recipe.ingredients.Length; i++) { Ingredient ingredient = recipe.ingredients[i]; if (ingredient == null || ingredient.item == null || ingredient.amount <= 0) { return false; } if (!playerInventory.HasItem(ingredient.item, ingredient.amount)) { return false; } } return true; } }