first commit
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public class CraftingSystem : MonoBehaviour
|
||||
{
|
||||
public Inventory playerInventory;
|
||||
public List<RecipeData> availableRecipes = new List<RecipeData>();
|
||||
[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<RecipeData> recipes)
|
||||
{
|
||||
availableRecipes = recipes ?? new List<RecipeData>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user