Files
PHY/Plugins/GCS/Source/GenericGameplayAbilities/Private/Utilities/GGA_GameplayAbilityTargetDataFunctionLibrary.cpp
2026-03-03 01:23:02 +08:00

76 lines
2.3 KiB
C++

// 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<FGameplayAbilityTargetData>(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<FGGA_GameplayAbilityTargetData_Payload*>(TargetData.Data[Index].Get()))
{
return Data->Payload;
}
}
}
return FInstancedStruct();
}
FGameplayAbilityTargetDataHandle UGGA_GameplayAbilityTargetDataFunctionLibrary::AbilityTargetDataFromHitResults(const TArray<FHitResult>& 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);
}
}
}