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 UAbilitySystemBlueprintLibrary::TargetDataHasActor(FGameplayAbilityTargetDataHandle TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index)) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { return (Data->GetActors().Num() > 0); } } return false; }
bool UAbilitySystemBlueprintLibrary::DoesTargetDataContainActor(FGameplayAbilityTargetDataHandle TargetData, int32 Index, AActor* Actor) { if (TargetData.Data.IsValidIndex(Index)) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { for (auto DataActorIter : Data->GetActors()) { if (DataActorIter == Actor) { return true; } } } } return false; }
TArray<AActor*> UAbilitySystemBlueprintLibrary::GetActorsFromTargetData(FGameplayAbilityTargetDataHandle TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index)) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); TArray<AActor*> ResolvedArray; if (Data) { TArray<TWeakObjectPtr<AActor> > WeakArray = Data->GetActors(); for (TWeakObjectPtr<AActor> WeakPtr : WeakArray) { ResolvedArray.Add(WeakPtr.Get()); } } return ResolvedArray; } return TArray<AActor*>(); }