// Copyright Echo Devgroup #pragma once #include "CoreMinimal.h" #include "AttributeSet.h" #include "AbilitySystemComponent.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) DECLARE_DELEGATE_RetVal(FGameplayAttribute, FAttributeSignature); USTRUCT() struct FEffectProperties { GENERATED_BODY() FEffectProperties(){} FGameplayEffectContextHandle EffectContextHandle; //Source Variables UPROPERTY() UAbilitySystemComponent* SourceASC = nullptr; UPROPERTY() AActor* SourceAvatarActor = nullptr; UPROPERTY() AController* SourceController = nullptr; UPROPERTY() ACharacter* SourceCharacter = nullptr; //Target Variables UPROPERTY() UAbilitySystemComponent* TargetASC = nullptr; UPROPERTY() AActor* TargetAvatarActor = nullptr; UPROPERTY() AController* TargetController = nullptr; UPROPERTY() ACharacter* TargetCharacter = nullptr; }; template using TStaticFuncPtr = typename TBaseStaticDelegateInstance::FFuncPtr; /** * */ UCLASS() class AURA_API UAuraAttributeSet : public UAttributeSet { GENERATED_BODY() public: UAuraAttributeSet(); virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override; virtual void PostGameplayEffectExecute(const struct FGameplayEffectModCallbackData& Data) override; TMap> TagsToAttributes; /*Create Attributes * Vital Attributes */ //Health UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Health, Category = "Vital Attributes") FGameplayAttributeData Health; ATTRIBUTE_ACCESSORS(UAuraAttributeSet,Health); UFUNCTION() void OnRep_Health(const FGameplayAttributeData& OldHealth) const; //Max Health UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxHealth, Category = "Vital Attributes") FGameplayAttributeData MaxHealth; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxHealth); UFUNCTION() void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth) const; //Mana UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Mana, Category = "Vital Attributes") FGameplayAttributeData Mana; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Mana); UFUNCTION() void OnRep_Mana(const FGameplayAttributeData& OldMana) const; //Max Mana UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxMana, Category = "Vital Attributes") FGameplayAttributeData MaxMana; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, MaxMana); UFUNCTION() void OnRep_MaxMana(const FGameplayAttributeData& OldMaxMana) const; /* Primary Attributes * Strength, Intelligence, Resilience, */ //Strength UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Strength, Category = "Primary Attributes") FGameplayAttributeData Strength; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Strength); UFUNCTION() void OnRep_Strength(const FGameplayAttributeData& OldStrength) const; //Intelligence UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Intelligence, Category = "Primary Attributes") FGameplayAttributeData Intelligence; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Intelligence); UFUNCTION() void OnRep_Intelligence(const FGameplayAttributeData& OldIntelligence) const; //Resilience UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Resilience, Category = "Primary Attributes") FGameplayAttributeData Resilience; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Resilience); UFUNCTION() void OnRep_Resilience(const FGameplayAttributeData& OldResilience) const; //Vigor UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Vigor, Category = "Primary Attributes") FGameplayAttributeData Vigor; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Vigor); UFUNCTION() void OnRep_Vigor(const FGameplayAttributeData& OldVigor) const; /*Secondary Stats *Armor, Armor Penetration, Block Chance, Critical Hit Chance, Critical Hit Damage, Critical Hit Resistance, Health Regeneration, Mana Regeneration */ //Armor UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Armor, Category = "Secondary Attributes") FGameplayAttributeData Armor; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, Armor); UFUNCTION() void OnRep_Armor(const FGameplayAttributeData& OldArmor) const; //ArmorPenetration UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_ArmorPenetration, Category = "Secondary Attributes") FGameplayAttributeData ArmorPenetration; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, ArmorPenetration); UFUNCTION() void OnRep_ArmorPenetration(const FGameplayAttributeData& OldArmorPenetration) const; //BlockChance UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_BlockChance, Category = "Secondary Attributes") FGameplayAttributeData BlockChance; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, BlockChance); UFUNCTION() void OnRep_BlockChance(const FGameplayAttributeData& OldBlockChance) const; //CriticalHitChance UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_CriticalHitChance, Category = "Secondary Attributes") FGameplayAttributeData CriticalHitChance; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, CriticalHitChance); UFUNCTION() void OnRep_CriticalHitChance(const FGameplayAttributeData& OldCriticalHitChance) const; //CriticalHitDamage UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_CriticalHitDamage, Category = "Secondary Attributes") FGameplayAttributeData CriticalHitDamage; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, CriticalHitDamage); UFUNCTION() void OnRep_CriticalHitDamage(const FGameplayAttributeData& OldCriticalHitDamage) const; //CriticalHitResistance UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_CriticalHitResistance, Category = "Secondary Attributes") FGameplayAttributeData CriticalHitResistance; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, CriticalHitResistance); UFUNCTION() void OnRep_CriticalHitResistance(const FGameplayAttributeData& OldCriticalHitResistance) const; //HealthRegeneration UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_HealthRegeneration, Category = "Secondary Attributes") FGameplayAttributeData HealthRegeneration; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, HealthRegeneration); UFUNCTION() void OnRep_HealthRegeneration(const FGameplayAttributeData& OldHealthRegeneration) const; //ManaRegeneration UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_ManaRegeneration, Category = "Secondary Attributes") FGameplayAttributeData ManaRegeneration; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, ManaRegeneration); UFUNCTION() void OnRep_ManaRegeneration(const FGameplayAttributeData& OldManaRegeneration) const; /*Meta Attributes * */ //incoming damage UPROPERTY(BlueprintReadOnly, Category = "Meta Attributes") FGameplayAttributeData IncomingDamage; ATTRIBUTE_ACCESSORS(UAuraAttributeSet, IncomingDamage); private: void SetEffectProperties(const FGameplayEffectModCallbackData& Data, FEffectProperties& Props) const; };