Files
Unreal_EmberWild/Source/Survival_projet/Private/CraftingRecipeDataAsset.cpp
T
2026-07-30 23:08:33 +02:00

84 lines
2.1 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "CraftingRecipeDataAsset.h"
#include "ItemDataAsset.h"
#if WITH_EDITOR
#include "Misc/DataValidation.h"
#endif
#define LOCTEXT_NAMESPACE "Crafting"
FText UCraftingRecipeDataAsset::GetDisplayName() const
{
if (!DisplayNameOverride.IsEmpty())
{
return DisplayNameOverride;
}
return ResultItem ? ResultItem->DisplayName : FText::GetEmpty();
}
UTexture2D* UCraftingRecipeDataAsset::GetIcon() const
{
if (IconOverride)
{
return IconOverride;
}
return ResultItem ? ResultItem->Icon : nullptr;
}
#if WITH_EDITOR
EDataValidationResult UCraftingRecipeDataAsset::IsDataValid(FDataValidationContext& Context) const
{
EDataValidationResult Result = Super::IsDataValid(Context);
if (!ResultItem)
{
Context.AddError(LOCTEXT("RecipeNoResult", "This recipe has no result item: it would consume the ingredients and give nothing back."));
Result = EDataValidationResult::Invalid;
}
if (RecipeId.IsNone())
{
Context.AddWarning(LOCTEXT("RecipeNoId", "RecipeId is empty. Saved recipe unlocks will not be able to identify this recipe."));
}
// Deux lignes portant le meme objet donneraient un cout affiche en double
// dans le panneau de detail, alors que la verification, elle, les cumule.
// L'ecart entre les deux est indetectable a la lecture de l'asset.
TSet<const UItemDataAsset*> SeenItems;
SeenItems.Reserve(Ingredients.Num());
for (int32 Index = 0; Index < Ingredients.Num(); ++Index)
{
const FCraftIngredient& Ingredient = Ingredients[Index];
if (!Ingredient.Item)
{
Context.AddError(FText::Format(
LOCTEXT("RecipeNullIngredient", "Ingredient {0} has no item assigned."), Index));
Result = EDataValidationResult::Invalid;
continue;
}
bool bAlreadySeen = false;
SeenItems.Add(Ingredient.Item, &bAlreadySeen);
if (bAlreadySeen)
{
Context.AddError(FText::Format(
LOCTEXT("RecipeDuplicateIngredient", "Item {0} appears twice in the ingredients. Merge them into a single line."),
FText::FromString(Ingredient.Item->GetName())));
Result = EDataValidationResult::Invalid;
}
}
return Result;
}
#endif
#undef LOCTEXT_NAMESPACE