81 lines
2.5 KiB
C++
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);
|
|
}
|
|
}
|