88 lines
2.9 KiB
C++
88 lines
2.9 KiB
C++
// Copyright Echo Devgroup
|
|
|
|
|
|
#include "Actor/AuraEffectActor.h"
|
|
|
|
#include "AbilitySystemBlueprintLibrary.h"
|
|
#include "AbilitySystemComponent.h"
|
|
|
|
AAuraEffectActor::AAuraEffectActor()
|
|
{
|
|
PrimaryActorTick.bCanEverTick = false;
|
|
|
|
SetRootComponent(CreateDefaultSubobject<USceneComponent>("SceneRoot"));
|
|
}
|
|
|
|
void AAuraEffectActor::BeginPlay()
|
|
{
|
|
Super::BeginPlay();
|
|
}
|
|
|
|
void AAuraEffectActor::OnOverlap(AActor* TargetActor)
|
|
{
|
|
if (InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
|
|
{
|
|
ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);
|
|
}
|
|
if (DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
|
|
{
|
|
ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);
|
|
}
|
|
if (InfiniteEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnOverlap)
|
|
{
|
|
ApplyEffectToTarget(TargetActor, InfiniteGameplayEffectClass);
|
|
}
|
|
}
|
|
|
|
void AAuraEffectActor::OnEndOverlap(AActor* TargetActor)
|
|
{
|
|
if (InstantEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap)
|
|
{
|
|
ApplyEffectToTarget(TargetActor, InstantGameplayEffectClass);
|
|
}
|
|
if (DurationEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap)
|
|
{
|
|
ApplyEffectToTarget(TargetActor, DurationGameplayEffectClass);
|
|
}
|
|
if (InfiniteEffectApplicationPolicy == EEffectApplicationPolicy::ApplyOnEndOverlap)
|
|
{
|
|
ApplyEffectToTarget(TargetActor, InfiniteGameplayEffectClass);
|
|
}
|
|
if (InfiniteEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap)
|
|
{
|
|
UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);
|
|
if (!IsValid(TargetASC)) return;
|
|
|
|
TArray<FActiveGameplayEffectHandle> HandlesToRemove;
|
|
for (auto HandlePair : ActiveEffectHandles)
|
|
{
|
|
if (TargetASC == HandlePair.Value)
|
|
{
|
|
TargetASC->RemoveActiveGameplayEffect(HandlePair.Key, 1);
|
|
HandlesToRemove.Add(HandlePair.Key);
|
|
}
|
|
}
|
|
for (FActiveGameplayEffectHandle& Handle : HandlesToRemove)
|
|
{
|
|
ActiveEffectHandles.FindAndRemoveChecked(Handle);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AAuraEffectActor::ApplyEffectToTarget(AActor* TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass)
|
|
{
|
|
UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);
|
|
if (TargetASC == nullptr) return;
|
|
|
|
check(GameplayEffectClass);
|
|
FGameplayEffectContextHandle EffectGameplayContextHandle = TargetASC->MakeEffectContext();
|
|
EffectGameplayContextHandle.AddSourceObject(this);
|
|
FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, ActorLevel, EffectGameplayContextHandle);
|
|
FActiveGameplayEffectHandle ActiveEffectHandle = TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());
|
|
|
|
const bool bIsInfinite = EffectSpecHandle.Data.Get()->Def.Get()->DurationPolicy == EGameplayEffectDurationType::Infinite;
|
|
if (bIsInfinite && InfiniteEffectRemovalPolicy == EEffectRemovalPolicy::RemoveOnEndOverlap)
|
|
{
|
|
ActiveEffectHandles.Add(ActiveEffectHandle, TargetASC);
|
|
}
|
|
} |