From 5e63345e81a5961c3e31d1d255eabc00bda95969 Mon Sep 17 00:00:00 2001 From: Jonathan Rampersad Date: Sun, 8 Jun 2025 11:25:02 -0400 Subject: [PATCH] Health and Mana Attributes --- .../AbilitySystem/AuraAttributeSet.cpp | 43 +++++++++++++++++ .../Public/AbilitySystem/AuraAttributeSet.h | 46 +++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/Source/Aura/Private/AbilitySystem/AuraAttributeSet.cpp b/Source/Aura/Private/AbilitySystem/AuraAttributeSet.cpp index ea29bd0..e612208 100644 --- a/Source/Aura/Private/AbilitySystem/AuraAttributeSet.cpp +++ b/Source/Aura/Private/AbilitySystem/AuraAttributeSet.cpp @@ -2,3 +2,46 @@ #include "AbilitySystem/AuraAttributeSet.h" +#include "Net/UnrealNetwork.h" + +UAuraAttributeSet::UAuraAttributeSet() +{ + InitHealth(100.f); + InitMaxHealth(100.f); + InitMana(50.f); + InitMaxMana(50.f); +} + +void UAuraAttributeSet::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const +{ + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + +#define CON_NOTIFY(Attribute) \ +DOREPLIFETIME_CONDITION_NOTIFY(UAuraAttributeSet, Attribute, COND_None, REPNOTIFY_Always) + + CON_NOTIFY(MaxHealth); + CON_NOTIFY(MaxMana); + + CON_NOTIFY(Health) + CON_NOTIFY(Mana); +} + +void UAuraAttributeSet::OnRep_Health(const FGameplayAttributeData& OldHealth) const +{ + GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Health, OldHealth); +} + +void UAuraAttributeSet::OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const +{ + GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, MaxHealth, OldMaxHealth); +} + +void UAuraAttributeSet::OnRep_Mana(const FGameplayAttributeData& OldMana) const +{ + GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, Mana, OldMana); +} + +void UAuraAttributeSet::OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const +{ + GAMEPLAYATTRIBUTE_REPNOTIFY(UAuraAttributeSet, MaxMana, OldMaxMana); +} \ No newline at end of file diff --git a/Source/Aura/Public/AbilitySystem/AuraAttributeSet.h b/Source/Aura/Public/AbilitySystem/AuraAttributeSet.h index 02e1550..75a60f9 100644 --- a/Source/Aura/Public/AbilitySystem/AuraAttributeSet.h +++ b/Source/Aura/Public/AbilitySystem/AuraAttributeSet.h @@ -3,8 +3,16 @@ #pragma once #include "CoreMinimal.h" +#include "AbilitySystemComponent.h" #include "AttributeSet.h" #include "AuraAttributeSet.generated.h" + +#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \ +GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \ +GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \ +GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \ +GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName) + /** * */ @@ -12,5 +20,43 @@ UCLASS() class AURA_API UAuraAttributeSet : public UAttributeSet { GENERATED_BODY() + +public: + UAuraAttributeSet(); + virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; + + /** + * Vital attributes + */ + UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category="Vital Attributes") + FGameplayAttributeData Health; + ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Health); + + UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Mana, Category="Vital Attributes") + FGameplayAttributeData Mana; + ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Mana); + + /** + * Secondary Attributes + */ + UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxHealth, Category="Secondary Attributes") + FGameplayAttributeData MaxHealth; + ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxHealth); + + UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxMana, Category="Secondary Attributes") + FGameplayAttributeData MaxMana; + ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxMana); + + UFUNCTION() + void OnRep_Health(const FGameplayAttributeData& OldHealth) const; + + UFUNCTION() + void OnRep_Mana(const FGameplayAttributeData& OldMana) const; + + UFUNCTION() + void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const; + + UFUNCTION() + void OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const; }; \ No newline at end of file