lyra_game_ue/Source/LyraGame/AbilitySystem/Abilities/LyraGameplayAbility_Reset.cpp

61 lines
2.3 KiB
C++
Raw Normal View History

2025-03-20 11:06:26 +01:00
// Copyright Epic Games, Inc. All Rights Reserved.
#include "AbilitySystem/Abilities/LyraGameplayAbility_Reset.h"
#include "AbilitySystem/LyraAbilitySystemComponent.h"
#include "Character/LyraCharacter.h"
#include "GameFramework/GameplayMessageSubsystem.h"
#include "LyraGameplayTags.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraGameplayAbility_Reset)
ULyraGameplayAbility_Reset::ULyraGameplayAbility_Reset(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::ServerInitiated;
if (HasAnyFlags(RF_ClassDefaultObject))
{
// Add the ability trigger tag as default to the CDO.
FAbilityTriggerData TriggerData;
TriggerData.TriggerTag = LyraGameplayTags::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(LyraGameplayTags::Ability_Behavior_SurvivesDeath);
// Cancel all abilities and block others from starting.
LyraASC->CancelAbilities(nullptr, &AbilityTypesToIgnore, this);
SetCanBeCanceled(false);
// 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(LyraGameplayTags::GameplayEvent_Reset, Message);
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
const bool bReplicateEndAbility = true;
const bool bWasCanceled = false;
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, bReplicateEndAbility, bWasCanceled);
}