72 lines
2.2 KiB
C++
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
|