// 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& 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