70 lines
2.8 KiB
C++
70 lines
2.8 KiB
C++
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||
|
|
||
|
#include "AbilitySystem/Abilities/LyraGameplayAbility_Reset.h"
|
||
|
#include "TimerManager.h"
|
||
|
#include "LyraLogChannels.h"
|
||
|
#include "GameplayTagsManager.h"
|
||
|
#include "LyraGameplayTags.h"
|
||
|
#include "AbilitySystem/LyraAbilitySystemComponent.h"
|
||
|
#include "GameFramework/GameplayMessageSubsystem.h"
|
||
|
#include "Character/LyraCharacter.h"
|
||
|
|
||
|
ULyraGameplayAbility_Reset::ULyraGameplayAbility_Reset(const FObjectInitializer& ObjectInitializer)
|
||
|
: Super(ObjectInitializer)
|
||
|
{
|
||
|
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
|
||
|
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::ServerInitiated;
|
||
|
|
||
|
UGameplayTagsManager::Get().CallOrRegister_OnDoneAddingNativeTagsDelegate(FSimpleDelegate::CreateUObject(this, &ThisClass::DoneAddingNativeTags));
|
||
|
}
|
||
|
|
||
|
void ULyraGameplayAbility_Reset::DoneAddingNativeTags()
|
||
|
{
|
||
|
if (HasAnyFlags(RF_ClassDefaultObject))
|
||
|
{
|
||
|
// Add the ability trigger tag as default to the CDO.
|
||
|
FAbilityTriggerData TriggerData;
|
||
|
TriggerData.TriggerTag = FLyraGameplayTags::Get().GameplayEvent_RequestReset;
|
||
|
TriggerData.TriggerSource = EGameplayAbilityTriggerSource::GameplayEvent;
|
||
|
AbilityTriggers.Add(TriggerData);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ULyraGameplayAbility_Reset::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
|
||
|
{
|
||
|
check(ActorInfo);
|
||
|
|
||
|
ULyraAbilitySystemComponent* LyraASC = CastChecked<ULyraAbilitySystemComponent>(ActorInfo->AbilitySystemComponent.Get());
|
||
|
|
||
|
FGameplayTagContainer AbilityTypesToIgnore;
|
||
|
AbilityTypesToIgnore.AddTag(FLyraGameplayTags::Get().Ability_Behavior_SurvivesDeath);
|
||
|
|
||
|
// Cancel all abilities and block others from starting.
|
||
|
LyraASC->CancelAbilities(nullptr, &AbilityTypesToIgnore, this);
|
||
|
|
||
|
SetCanBeCanceled(false);
|
||
|
|
||
|
if (!ChangeActivationGroup(ELyraAbilityActivationGroup::Exclusive_Blocking))
|
||
|
{
|
||
|
UE_LOG(LogLyraAbilitySystem, Error, TEXT("ULyraGameplayAbility_Reset::ActivateAbility: Ability [%s] failed to change activation group to blocking."), *GetName());
|
||
|
}
|
||
|
|
||
|
// Execute the reset from the character
|
||
|
if (ALyraCharacter* LyraChar = Cast<ALyraCharacter>(CurrentActorInfo->AvatarActor.Get()))
|
||
|
{
|
||
|
LyraChar->Reset();
|
||
|
}
|
||
|
|
||
|
// Let others know a reset has occurred
|
||
|
FLyraPlayerResetMessage Message;
|
||
|
Message.OwnerPlayerState = CurrentActorInfo->OwnerActor.Get();
|
||
|
UGameplayMessageSubsystem& MessageSystem = UGameplayMessageSubsystem::Get(this);
|
||
|
MessageSystem.BroadcastMessage(FLyraGameplayTags::Get().GameplayEvent_Reset, Message);
|
||
|
|
||
|
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
|
||
|
|
||
|
const bool bReplicateEndAbility = true;
|
||
|
const bool bWasCanceled = false;
|
||
|
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicateEndAbility, bWasCanceled);
|
||
|
}
|