2022-05-23 18:41:30 +00:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Components/GameFrameworkComponent.h"
|
2022-09-13 07:18:28 +00:00
|
|
|
#include "Delegates/Delegate.h"
|
|
|
|
#include "GameFramework/Actor.h"
|
|
|
|
#include "HAL/Platform.h"
|
|
|
|
#include "UObject/UObjectGlobals.h"
|
2022-05-23 18:41:30 +00:00
|
|
|
|
2022-09-13 07:18:28 +00:00
|
|
|
#include "LyraHealthComponent.generated.h"
|
2022-05-23 18:41:30 +00:00
|
|
|
|
|
|
|
class ULyraAbilitySystemComponent;
|
|
|
|
class ULyraHealthSet;
|
2022-09-13 07:18:28 +00:00
|
|
|
class UObject;
|
|
|
|
struct FFrame;
|
2022-05-23 18:41:30 +00:00
|
|
|
struct FGameplayEffectSpec;
|
|
|
|
struct FOnAttributeChangeData;
|
|
|
|
|
|
|
|
|
|
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FLyraHealth_DeathEvent, AActor*, OwningActor);
|
|
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FLyraHealth_AttributeChanged, ULyraHealthComponent*, HealthComponent, float, OldValue, float, NewValue, AActor*, Instigator);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ELyraDeathState
|
|
|
|
*
|
|
|
|
* Defines current state of death.
|
|
|
|
*/
|
|
|
|
UENUM(BlueprintType)
|
|
|
|
enum class ELyraDeathState : uint8
|
|
|
|
{
|
|
|
|
NotDead = 0,
|
|
|
|
DeathStarted,
|
|
|
|
DeathFinished
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ULyraHealthComponent
|
|
|
|
*
|
|
|
|
* An actor component used to handle anything related to health.
|
|
|
|
*/
|
|
|
|
UCLASS(Blueprintable, Meta=(BlueprintSpawnableComponent))
|
|
|
|
class LYRAGAME_API ULyraHealthComponent : public UGameFrameworkComponent
|
|
|
|
{
|
|
|
|
GENERATED_BODY()
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
ULyraHealthComponent(const FObjectInitializer& ObjectInitializer);
|
|
|
|
|
|
|
|
// Returns the health component if one exists on the specified actor.
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Lyra|Health")
|
|
|
|
static ULyraHealthComponent* FindHealthComponent(const AActor* Actor) { return (Actor ? Actor->FindComponentByClass<ULyraHealthComponent>() : nullptr); }
|
|
|
|
|
|
|
|
// Initialize the component using an ability system component.
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Lyra|Health")
|
|
|
|
void InitializeWithAbilitySystem(ULyraAbilitySystemComponent* InASC);
|
|
|
|
|
|
|
|
// Uninitialize the component, clearing any references to the ability system.
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Lyra|Health")
|
|
|
|
void UninitializeFromAbilitySystem();
|
|
|
|
|
|
|
|
// Returns the current health value.
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Lyra|Health")
|
|
|
|
float GetHealth() const;
|
|
|
|
|
|
|
|
// Returns the current maximum health value.
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Lyra|Health")
|
|
|
|
float GetMaxHealth() const;
|
|
|
|
|
|
|
|
// Returns the current health in the range [0.0, 1.0].
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Lyra|Health")
|
|
|
|
float GetHealthNormalized() const;
|
|
|
|
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Lyra|Health")
|
|
|
|
ELyraDeathState GetDeathState() const { return DeathState; }
|
|
|
|
|
|
|
|
UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Lyra|Health", Meta = (ExpandBoolAsExecs = "ReturnValue"))
|
|
|
|
bool IsDeadOrDying() const { return (DeathState > ELyraDeathState::NotDead); }
|
|
|
|
|
|
|
|
// Begins the death sequence for the owner.
|
|
|
|
virtual void StartDeath();
|
|
|
|
|
|
|
|
// Ends the death sequence for the owner.
|
|
|
|
virtual void FinishDeath();
|
|
|
|
|
|
|
|
// Applies enough damage to kill the owner.
|
|
|
|
virtual void DamageSelfDestruct(bool bFellOutOfWorld = false);
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
// Delegate fired when the health value has changed.
|
|
|
|
UPROPERTY(BlueprintAssignable)
|
|
|
|
FLyraHealth_AttributeChanged OnHealthChanged;
|
|
|
|
|
|
|
|
// Delegate fired when the max health value has changed.
|
|
|
|
UPROPERTY(BlueprintAssignable)
|
|
|
|
FLyraHealth_AttributeChanged OnMaxHealthChanged;
|
|
|
|
|
|
|
|
// Delegate fired when the death sequence has started.
|
|
|
|
UPROPERTY(BlueprintAssignable)
|
|
|
|
FLyraHealth_DeathEvent OnDeathStarted;
|
|
|
|
|
|
|
|
// Delegate fired when the death sequence has finished.
|
|
|
|
UPROPERTY(BlueprintAssignable)
|
|
|
|
FLyraHealth_DeathEvent OnDeathFinished;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
virtual void OnUnregister() override;
|
|
|
|
|
|
|
|
void ClearGameplayTags();
|
|
|
|
|
|
|
|
virtual void HandleHealthChanged(const FOnAttributeChangeData& ChangeData);
|
|
|
|
virtual void HandleMaxHealthChanged(const FOnAttributeChangeData& ChangeData);
|
|
|
|
virtual void HandleOutOfHealth(AActor* DamageInstigator, AActor* DamageCauser, const FGameplayEffectSpec& DamageEffectSpec, float DamageMagnitude);
|
|
|
|
|
|
|
|
UFUNCTION()
|
|
|
|
virtual void OnRep_DeathState(ELyraDeathState OldDeathState);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
// Ability system used by this component.
|
|
|
|
UPROPERTY()
|
2022-09-13 07:18:28 +00:00
|
|
|
TObjectPtr<ULyraAbilitySystemComponent> AbilitySystemComponent;
|
2022-05-23 18:41:30 +00:00
|
|
|
|
|
|
|
// Health set used by this component.
|
|
|
|
UPROPERTY()
|
2022-09-13 07:18:28 +00:00
|
|
|
TObjectPtr<const ULyraHealthSet> HealthSet;
|
2022-05-23 18:41:30 +00:00
|
|
|
|
|
|
|
// Replicated state used to handle dying.
|
|
|
|
UPROPERTY(ReplicatedUsing = OnRep_DeathState)
|
|
|
|
ELyraDeathState DeathState;
|
|
|
|
};
|