// Copyright Echo Devgroup #include "Actor/AuraEffectActor.h" #include "AbilitySystemBlueprintLibrary.h" #include "AbilitySystemComponent.h" AAuraEffectActor::AAuraEffectActor() { PrimaryActorTick.bCanEverTick = false; SetRootComponent(CreateDefaultSubobject("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 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 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); } }