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

83 lines
2.5 KiB
C++

// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#include "AbilityTasks/GGA_AbilityTask_WaitGameplayEvents.h"
#include "AbilitySystemGlobals.h"
#include "AbilitySystemComponent.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(GGA_AbilityTask_WaitGameplayEvents)
// ----------------------------------------------------------------
UGGA_AbilityTask_WaitGameplayEvents::UGGA_AbilityTask_WaitGameplayEvents(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
UGGA_AbilityTask_WaitGameplayEvents* UGGA_AbilityTask_WaitGameplayEvents::WaitGameplayEvents(UGameplayAbility* OwningAbility, FGameplayTagContainer EventTags, AActor* OptionalExternalTarget,
bool OnlyTriggerOnce)
{
UGGA_AbilityTask_WaitGameplayEvents* MyObj = NewAbilityTask<UGGA_AbilityTask_WaitGameplayEvents>(OwningAbility);
MyObj->EventTags = EventTags;
MyObj->SetExternalTarget(OptionalExternalTarget);
MyObj->OnlyTriggerOnce = OnlyTriggerOnce;
return MyObj;
}
void UGGA_AbilityTask_WaitGameplayEvents::Activate()
{
UAbilitySystemComponent* ASC = GetTargetASC();
if (ASC)
{
MyHandle = ASC->AddGameplayEventTagContainerDelegate(
EventTags, FGameplayEventTagMulticastDelegate::FDelegate::CreateUObject(this, &UGGA_AbilityTask_WaitGameplayEvents::GameplayEventContainerCallback));
}
Super::Activate();
}
void UGGA_AbilityTask_WaitGameplayEvents::GameplayEventContainerCallback(FGameplayTag MatchingTag, const FGameplayEventData* Payload)
{
if (ShouldBroadcastAbilityTaskDelegates())
{
ensureMsgf(Payload, TEXT("GameplayEventCallback expected non-null Payload"));
FGameplayEventData TempPayload = Payload ? *Payload : FGameplayEventData{};
TempPayload.EventTag = MatchingTag;
EventReceived.Broadcast(MatchingTag, TempPayload);
}
if (OnlyTriggerOnce)
{
EndTask();
}
}
void UGGA_AbilityTask_WaitGameplayEvents::SetExternalTarget(AActor* Actor)
{
if (Actor)
{
UseExternalTarget = true;
OptionalExternalTarget = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(Actor);
}
}
UAbilitySystemComponent* UGGA_AbilityTask_WaitGameplayEvents::GetTargetASC()
{
if (UseExternalTarget)
{
return OptionalExternalTarget;
}
return AbilitySystemComponent.Get();
}
void UGGA_AbilityTask_WaitGameplayEvents::OnDestroy(bool AbilityEnding)
{
UAbilitySystemComponent* ASC = GetTargetASC();
if (ASC && MyHandle.IsValid())
{
ASC->RemoveGameplayEventTagContainerDelegate(EventTags, MyHandle);
}
Super::OnDestroy(AbilityEnding);
}