Files
Aura/Source/Aura/Private/UI/WidgetController/Components/AbilitiesInputWCComponent.cpp
2024-03-20 16:21:19 +01:00

81 lines
2.5 KiB
C++

// Amasson
#include "UI/WidgetController/Components/AbilitiesInputWCComponent.h"
#include "AbilitySystem/AuraAbilitySystemComponent.h"
#include "AbilitySystem/Data/AbilityBook.h"
void UAbilitiesInputWCComponent::Initialize(UAuraAbilitySystemComponent* ASC, UAbilityBook* AB)
{
AbilitySystemComponent = ASC;
AbilityBook = AB;
}
void UAbilitiesInputWCComponent::BroadcastValues()
{
if (IsValid(AbilitySystemComponent))
{
OnAbilitySpecChange(AbilitySystemComponent, FGameplayAbilitySpec());
}
}
void UAbilitiesInputWCComponent::BindCallbacksToDependencies()
{
if (IsValid(AbilitySystemComponent))
{
AbilitySystemComponent->OnAbilitySpecChange.AddUObject(this, &ThisClass::OnAbilitySpecChange);
AbilitySystemComponent->OnAbilitySpecRemoving.AddUObject(this, &ThisClass::OnAbilitySpecRemoving);
}
}
void UAbilitiesInputWCComponent::OnAbilitySpecChange(UAuraAbilitySystemComponent* AuraASC, const FGameplayAbilitySpec& AbilitySpec)
{
TSet<FGameplayTag> NewAbilitiesInputTags;
// FForEachAbilityDelegate BroadcastDelegate;
// BroadcastDelegate.BindLambda([this, AuraASC, &NewAbilitiesInputTags](FGameplayAbilitySpec& AbilitySpec)
// {
// // ...
// });
// AuraASC->ForEachAbilityDelegate(BroadcastDelegate);
AuraASC->ForEachAbilityLambda([this, AuraASC, &NewAbilitiesInputTags](FGameplayAbilitySpec& AbilitySpec)
{
FGameplayTag AbilityTag = AuraASC->GetAbilityIDTagFromAbility(AbilitySpec.Ability);
FAuraAbilityInfo Info;
if (AbilityBook && AbilityTag.IsValid())
{
const FAuraAbilityInfo* FoundInfo = AbilityBook->GetAbilities().Find(AbilityTag);
if (FoundInfo)
{
Info = *FoundInfo;
}
}
FGameplayTag InputTag = AuraASC->GetInputTagFromAbilitySpec(AbilitySpec);
NewAbilitiesInputTags.Add(InputTag);
if (InputTag.IsValid())
{
OnAbilityInputInfoChange.Broadcast(InputTag, Info);
}
});
for (const FGameplayTag& InputTag : AbilitiesInputTags)
{
if (!NewAbilitiesInputTags.Contains(InputTag))
{
OnAbilityInputRemoved.Broadcast(InputTag);
}
}
AbilitiesInputTags = NewAbilitiesInputTags;
}
void UAbilitiesInputWCComponent::OnAbilitySpecRemoving(UAuraAbilitySystemComponent* AuraASC, const FGameplayAbilitySpec& AbilitySpec)
{
FGameplayTag InputTag = AuraASC->GetInputTagFromAbilitySpec(AbilitySpec);
if (InputTag.IsValid())
{
OnAbilityInputRemoved.Broadcast(InputTag);
}
}