// Copyright 2025 https://yuewu.dev/en All Rights Reserved. #include "Utilities/GGA_GameplayAbilityTargetDataFunctionLibrary.h" #include "AbilitySystemBlueprintLibrary.h" #include "GGA_GameplayAbilityTargetData_Payload.h" FGameplayAbilityTargetDataHandle UGGA_GameplayAbilityTargetDataFunctionLibrary::AbilityTargetDataFromPayload(const FInstancedStruct& Payload) { // Construct TargetData FGGA_GameplayAbilityTargetData_Payload* TargetData = new FGGA_GameplayAbilityTargetData_Payload(Payload); // Give it a handle and return FGameplayAbilityTargetDataHandle Handle; Handle.Data.Add(TSharedPtr(TargetData)); return Handle; } FInstancedStruct UGGA_GameplayAbilityTargetDataFunctionLibrary::GetPayloadFromTargetData(const FGameplayAbilityTargetDataHandle& TargetData, int32 Index) { if (TargetData.Data.IsValidIndex(Index)) { if (TargetData.Data[Index]->GetScriptStruct() == FGGA_GameplayAbilityTargetData_Payload::StaticStruct()) { if (FGGA_GameplayAbilityTargetData_Payload* Data = static_cast(TargetData.Data[Index].Get())) { return Data->Payload; } } } return FInstancedStruct(); } FGameplayAbilityTargetDataHandle UGGA_GameplayAbilityTargetDataFunctionLibrary::AbilityTargetDataFromHitResults(const TArray& HitResults, bool OneTargetPerHandle) { // Construct TargetData if (OneTargetPerHandle) { FGameplayAbilityTargetDataHandle Handle; for (int32 i = 0; i < HitResults.Num(); ++i) { if (::IsValid(HitResults[i].GetActor())) { FGameplayAbilityTargetDataHandle TempHandle = UAbilitySystemBlueprintLibrary::AbilityTargetDataFromHitResult(HitResults[i]); Handle.Append(TempHandle); } } return Handle; } else { FGameplayAbilityTargetDataHandle Handle; for (const FHitResult& HitResult : HitResults) { FGameplayAbilityTargetData_SingleTargetHit* NewData = new FGameplayAbilityTargetData_SingleTargetHit(HitResult); Handle.Add(NewData); } return Handle; } } void UGGA_GameplayAbilityTargetDataFunctionLibrary::AddTargetDataToContext(FGameplayAbilityTargetDataHandle TargetData, FGameplayEffectContextHandle EffectContext) { for (auto Data : TargetData.Data) { if (Data.IsValid()) { Data->AddTargetDataToContext(EffectContext, true); } } }