Files
ElistriaCalling/Elistria_Calling/Source/Elistria_Calling/Private/ElistriaAbilitySystemComponent.cpp
2025-10-05 10:12:44 -06:00

57 lines
1.6 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "ElistriaAbilitySystemComponent.h"
#include "NativeGameplayTags.h"
#include "PlayerGameplayAbilitiesDataAsset.h"
UE_DEFINE_GAMEPLAY_TAG_STATIC(TAG_Input_Confirm, "Input.Confirm");
UE_DEFINE_GAMEPLAY_TAG_STATIC(TAG_Input_Cancel, "Input.Cancel");
void UElistriaAbilitySystemComponent::GrantAbilitiesFromDataAsset(const UPlayerGameplayAbilitiesDataAsset* AbilitiesDataAsset)
{
if (!AbilitiesDataAsset) return;
for (const FGameplayInputAbilityInfo& AbilityInfo : AbilitiesDataAsset->GetMappings())
{
if (!AbilityInfo.IsValid()||!AbilityInfo.bAutoGive) continue;
FGameplayAbilitySpec Spec(AbilityInfo.AbilityClass,1,INDEX_NONE);
FGameplayAbilitySpecHandle Handle = GiveAbility(Spec);
if (FGameplayAbilitySpec* Found = FindAbilitySpecFromHandle(Handle))
{
if (AbilityInfo.InputTag.IsValid()&&!Found->DynamicAbilityTags.HasTagExact(AbilityInfo.InputTag))
{
Found->DynamicAbilityTags.AddTagFast(AbilityInfo.InputTag);
MarkAbilitySpecDirty(*Found);
}
TagToSpecHandleMap.Add(AbilityInfo.InputTag, Handle);
}
}
OnAbilitiesChanged.Broadcast(this);
}
void UElistriaAbilitySystemComponent::HandleInputTag(ETriggerEvent EventType, FGameplayTag InputTag)
{
if (!InputTag.IsValid()) return;
if (InputTag == TAG_Input_Confirm)
{
TargetConfirm();
return;
}
if (InputTag == TAG_Input_Cancel)
{
TargetCancel();
return;
}
if (EventType == ETriggerEvent::Started||EventType == ETriggerEvent::Triggered)
{
FGameplayTagContainer Tags(InputTag);
TryActivateAbilitiesByTag(Tags, true);
}
}