Files
Unreal_EmberWild/Source/EmberWild/Private/HarvestableDataAsset.cpp
T
2026-08-16 19:35:27 +02:00

72 lines
2.2 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "HarvestableDataAsset.h"
#include "ItemDataAsset.h"
#if WITH_EDITOR
#include "Misc/DataValidation.h"
#endif
#define LOCTEXT_NAMESPACE "HarvestableData"
int32 FHarvestDrop::Roll() const
{
if (!Item)
{
return 0;
}
// Le jet de chance d'abord : une ligne a 30 % qui echoue ne doit pas consommer
// de tirage de quantite, sinon deux tables identiques a la chance pres ne
// donneraient pas la meme suite -- sans consequence en jeu, mais deroutant a
// deboguer avec une graine fixee.
if (Chance < 1.f && FMath::FRand() > Chance)
{
return 0;
}
// Max borne par Min plutot que l'inverse : un designer qui saisit 3 puis 1
// obtient 3, jamais un intervalle vide qui rendrait la ligne muette sans rien
// dire. RandRange est inclusif des deux cotes.
return FMath::RandRange(MinQuantity, FMath::Max(MinQuantity, MaxQuantity));
}
#if WITH_EDITOR
EDataValidationResult UHarvestableDataAsset::IsDataValid(FDataValidationContext& Context) const
{
EDataValidationResult Result = Super::IsDataValid(Context);
// Le symptome d'une ligne vide est fourbe : l'arbre se recolte, s'abat, et
// rend simplement moins que prevu. Rien dans le log, rien a l'ecran.
auto ValidateTable = [&Context, &Result](const TArray<FHarvestDrop>& Table, const FText& TableName)
{
for (int32 Index = 0; Index < Table.Num(); ++Index)
{
if (!Table[Index].Item)
{
Context.AddError(FText::Format(
LOCTEXT("DropNoItem", "{0}[{1}] has no 'Item' assigned: this line would silently yield nothing."),
TableName, FText::AsNumber(Index)));
Result = EDataValidationResult::Invalid;
}
}
};
ValidateTable(PerHitDrops, LOCTEXT("PerHitTable", "Per Hit Drops"));
ValidateTable(DepletionDrops, LOCTEXT("DepletionTable", "Depletion Drops"));
// Une ressource sans aucun butin est frappable, s'epuise, et ne donne rien.
// C'est legitime pour un decor destructible ; ca ne l'est presque jamais ici.
if (PerHitDrops.IsEmpty() && DepletionDrops.IsEmpty())
{
Context.AddWarning(LOCTEXT("NoDropsAtAll", "This harvestable has no drops at all: harvesting it will consume tool durability for nothing."));
}
return Result;
}
#endif
#undef LOCTEXT_NAMESPACE