FGameplayAbilityTargetDataHandle UAbilitySystemBlueprintLibrary::FilterTargetData(FGameplayAbilityTargetDataHandle TargetDataHandle, FGameplayTargetDataFilterHandle FilterHandle) { FGameplayAbilityTargetDataHandle ReturnDataHandle; for (int32 i = 0; TargetDataHandle.IsValid(i); ++i) { FGameplayAbilityTargetData* UnfilteredData = TargetDataHandle.Get(i); check(UnfilteredData); if (UnfilteredData->GetActors().Num() > 0) { TArray<TWeakObjectPtr<AActor>> FilteredActors = UnfilteredData->GetActors().FilterByPredicate(FilterHandle); if (FilteredActors.Num() > 0) { //Copy the data first, since we don't understand the internals of it UScriptStruct* ScriptStruct = UnfilteredData->GetScriptStruct(); FGameplayAbilityTargetData* NewData = (FGameplayAbilityTargetData*)FMemory::Malloc(ScriptStruct->GetCppStructOps()->GetSize()); ScriptStruct->InitializeStruct(NewData); ScriptStruct->CopyScriptStruct(NewData, UnfilteredData); ReturnDataHandle.Data.Add(TSharedPtr<FGameplayAbilityTargetData>(NewData)); if (FilteredActors.Num() < UnfilteredData->GetActors().Num()) { //We have lost some, but not all, of our actors, so replace the array. This should only be possible with targeting types that permit actor-array setting. if (!NewData->SetActors(FilteredActors)) { //This is an error, though we could ignore it. We somehow filtered out part of a list, but the class doesn't support changing the list, so now it's all or nothing. check(false); } } } } } return ReturnDataHandle; }
bool UDataTableFunctionLibrary::Generic_GetDataTableRowFromName(UDataTable* Table, FName RowName, void* OutRowPtr) { bool bFoundRow = false; if (OutRowPtr && Table) { void* RowPtr = Table->FindRowUnchecked(RowName); if (RowPtr != NULL) { UScriptStruct* StructType = Table->RowStruct; if (StructType != NULL) { StructType->CopyScriptStruct(OutRowPtr, RowPtr); bFoundRow = true; } } } return bFoundRow; }