FTransform UAbilitySystemBlueprintLibrary::GetTargetDataOrigin(const FGameplayAbilityTargetDataHandle& TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index) == false) { return FTransform::Identity; } FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { if (Data->HasOrigin()) { return Data->GetOrigin(); } if (Data->HasHitResult()) { const FHitResult* HitResultPtr = Data->GetHitResult(); FTransform ReturnTransform; ReturnTransform.SetLocation(HitResultPtr->TraceStart); ReturnTransform.SetRotation((HitResultPtr->Location - HitResultPtr->TraceStart).GetSafeNormal().Rotation().Quaternion()); return ReturnTransform; } } return FTransform::Identity; }
FGameplayAbilityTargetDataHandle UAbilitySystemBlueprintLibrary::FilterTargetData(const FGameplayAbilityTargetDataHandle& TargetDataHandle, FGameplayTargetDataFilterHandle FilterHandle) { FGameplayAbilityTargetDataHandle ReturnDataHandle; for (int32 i = 0; TargetDataHandle.IsValid(i); ++i) { const 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 const 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::TargetDataHasOrigin(FGameplayAbilityTargetDataHandle TargetData, int32 Index) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { return (Data->HasHitResult() || Data->HasOrigin()); } return false; }
bool UAbilitySystemBlueprintLibrary::TargetDataHasEndPoint(FGameplayAbilityTargetDataHandle TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index)) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { return (Data->HasHitResult() || Data->HasEndPoint()); } } return false; }
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; }
FTransform UAbilitySystemBlueprintLibrary::GetTargetDataEndPointTransform(FGameplayAbilityTargetDataHandle TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index)) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { return Data->GetEndPointTransform(); } } return FTransform::Identity; }
bool UAbilitySystemBlueprintLibrary::TargetDataHasOrigin(const FGameplayAbilityTargetDataHandle& TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index) == false) { return false; } FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { return (Data->HasHitResult() || Data->HasOrigin()); } return false; }
FHitResult UAbilitySystemBlueprintLibrary::GetHitResultFromTargetData(FGameplayAbilityTargetDataHandle TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index)) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { const FHitResult* HitResultPtr = Data->GetHitResult(); if (HitResultPtr) { return *HitResultPtr; } } } return FHitResult(); }
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*>(); }
FVector UAbilitySystemBlueprintLibrary::GetTargetDataEndPoint(FGameplayAbilityTargetDataHandle TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index)) { FGameplayAbilityTargetData* Data = TargetData.Data[Index].Get(); if (Data) { const FHitResult* HitResultPtr = Data->GetHitResult(); if (HitResultPtr) { return HitResultPtr->Location; } else if (Data->HasEndPoint()) { return Data->GetEndPoint(); } } } return FVector::ZeroVector; }