#pragma once #include "CoreMinimal.h" #include "AudioWithCooldown.h" #include "FullHealthSignatureDelegate.h" #include "HealthComponent.h" #include "HealthRegeneratingChangedDelegate.h" #include "HealthRegenerationParams.h" #include "HitSigDelegate.h" #include "RejoinListener.h" #include "Templates/SubclassOf.h" #include "PlayerHealthComponent.generated.h" class AActor; class AController; class APlayerCharacter; class UCurveFloat; class UParticleSystem; class UParticleSystemComponent; class UPlayerDamageTakenMutator; class UStatusEffect; UCLASS(Blueprintable, ClassGroup=Custom, meta=(BlueprintSpawnableComponent)) class UPlayerHealthComponent : public UHealthComponent, public IRejoinListener { GENERATED_BODY() public: UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FFullHealthSignature OnFullHealthCannotHeal; UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FFullHealthSignature OnHealedFromCrystalEvent; UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FHealthRegeneratingChanged OnHealthRegeneratingChanged; UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FHitSig OnPlayerHit; protected: UPROPERTY(BlueprintReadWrite, EditAnywhere, ReplicatedUsing=OnRep_MaxHealth, meta=(AllowPrivateAccess=true)) float MaxHealth; UPROPERTY(BlueprintReadWrite, EditAnywhere, ReplicatedUsing=OnRep_MaxArmor, meta=(AllowPrivateAccess=true)) float MaxArmor; UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient, ReplicatedUsing=OnRep_ArmorDamage, meta=(AllowPrivateAccess=true)) float ArmorDamage; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float ReviveHealthReturnRatio; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float ReviveArmorReturnRatio; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float HealthPerCrystalVolume; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FHealthRegenerationParams HealthRegeneration; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) UCurveFloat* ArmorRegenCurve; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float ShieldRegenDelay; UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient, meta=(AllowPrivateAccess=true)) APlayerCharacter* Character; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) UParticleSystem* GenericImpactParticles; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) UParticleSystem* ShieldLinkEffect; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FAudioWithCooldown AudioFriendlyFire; UPROPERTY(BlueprintReadWrite, EditAnywhere, Instanced, Transient, meta=(AllowPrivateAccess=true)) UParticleSystemComponent* ShieldLinkInstance; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float InvulnerabilityDuration; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float ReviveInvulnerabilityTime; UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient, meta=(AllowPrivateAccess=true)) UPlayerDamageTakenMutator* DamageTakenMutator; UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient, meta=(AllowPrivateAccess=true)) TSubclassOf IronWillStatusEffectClass; UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient, meta=(AllowPrivateAccess=true)) UStatusEffect* IronWillStatusEffect; UPROPERTY(BlueprintReadWrite, EditAnywhere, Replicated, Transient, meta=(AllowPrivateAccess=true)) bool IronWillActive; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float IronWillTimeToActivate; public: UPlayerHealthComponent(); virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; UFUNCTION(BlueprintAuthorityOnly, BlueprintCallable) UStatusEffect* SetIronWillStatusEffect(TSubclassOf steClass); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_TryActivateIronWill(); protected: UFUNCTION(BlueprintCallable) void OnRep_MaxHealth(); UFUNCTION(BlueprintCallable) void OnRep_MaxArmor(); UFUNCTION(BlueprintCallable) void OnRep_ArmorDamage(float oldDamage); public: UFUNCTION(BlueprintCallable, BlueprintPure) bool IsLowHealth() const; UFUNCTION(BlueprintCallable, BlueprintPure) float GetRemainingIronWillActivationTime() const; UFUNCTION(BlueprintCallable, BlueprintPure) bool GetIsHealthRegenerating() const; UFUNCTION(BlueprintCallable, BlueprintPure) bool GetIronWillActive() const; UFUNCTION(BlueprintCallable, BlueprintPure) float GetHealthRegeneratingTargetRatio() const; protected: UFUNCTION(BlueprintCallable, Client, Reliable) void Client_SetHealthRegenerating(bool isRegenerating); UFUNCTION(BlueprintCallable, Client, Unreliable) void Client_OnFriendlyFire(AController* EventInstigator, AActor* DamageCauser); UFUNCTION(BlueprintCallable, Client, Reliable) void Client_HealthFullCannotHeal(); public: UFUNCTION(BlueprintCallable, BlueprintPure) bool CanActivateIronWill() const; // Fix for true pure virtual functions not being implemented };