Files
Crunch/Source/Crunch/Private/GAS/CAbilitySystemComponent.cpp
2025-09-12 22:13:07 +08:00

65 lines
1.6 KiB
C++

// Multiplayer By Caleb
#include "GAS/CAbilitySystemComponent.h"
#include "GAS/CAttributeSet.h"
UCAbilitySystemComponent::UCAbilitySystemComponent()
{
GetGameplayAttributeValueChangeDelegate(UCAttributeSet::GetHealthAttribute())
.AddUObject(this, &UCAbilitySystemComponent::HealthUpdated);
}
void UCAbilitySystemComponent::ApplyInitialEffects()
{
if (!GetOwner() || !GetOwner()->HasAuthority()) return;
for (const auto& EffectClass : InitialEffects)
{
/**
* this will work as well
* const auto Effect{EffectClass->GetDefaultObject<UGameplayEffect>()};
* ApplyGameplayEffectToSelf(Effect, 0.f, MakeEffectContext());
**/
auto GameplayEffectSpecHandle{MakeOutgoingSpec(EffectClass, 1, MakeEffectContext())};
ApplyGameplayEffectSpecToSelf(*GameplayEffectSpecHandle.Data.Get());
}
}
void UCAbilitySystemComponent::GiveInitialAbilities()
{
if (!GetOwner() || !GetOwner()->HasAuthority()) return;
for (const auto& AbilityPairClass : Abilities)
{
GiveAbility(FGameplayAbilitySpec(
AbilityPairClass.Value,
0,
static_cast<int32>(AbilityPairClass.Key),
nullptr
));
}
for (const auto& AbilityPairClass : BasicAbilities)
{
GiveAbility(FGameplayAbilitySpec(
AbilityPairClass.Value,
1,
static_cast<int32>(AbilityPairClass.Key),
nullptr
));
}
}
void UCAbilitySystemComponent::HealthUpdated(const FOnAttributeChangeData& ChangeData)
{
if (!GetOwner() && !GetOwner()->HasAuthority()) return;
if (ChangeData.NewValue <= 0 && DeathEffectClass)
{
const auto GameplayEffectSpecHandle{ MakeOutgoingSpec(DeathEffectClass, 1, MakeEffectContext() )};
ApplyGameplayEffectSpecToSelf(*GameplayEffectSpecHandle.Data.Get());
}
}