// Copyright Pacificao. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Components/ActorComponent.h" #include "AgrarianTypes.h" #include "AgrarianSurvivalComponent.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAgrarianSurvivalChangedSignature, const FAgrarianSurvivalSnapshot&, Snapshot); UCLASS(ClassGroup = (Agrarian), BlueprintType, Blueprintable, meta = (BlueprintSpawnableComponent)) class UAgrarianSurvivalComponent : public UActorComponent { GENERATED_BODY() public: UAgrarianSurvivalComponent(); virtual void BeginPlay() override; virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; UPROPERTY(BlueprintAssignable, Category = "Agrarian|Survival") FAgrarianSurvivalChangedSignature OnSurvivalChanged; UPROPERTY(EditAnywhere, BlueprintReadOnly, ReplicatedUsing = OnRep_Survival, Category = "Agrarian|Survival") FAgrarianSurvivalSnapshot Survival; UPROPERTY(EditAnywhere, BlueprintReadOnly, ReplicatedUsing = OnRep_CareHistory, Category = "Agrarian|Survival") FAgrarianCareHistorySnapshot CareHistory; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Replicated, Category = "Agrarian|Survival|Shelter") float CurrentWeatherProtection = 0.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float HungerDecayPerMinute = 0.55f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float ThirstDecayPerMinute = 0.85f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float StaminaRecoveryPerSecond = 14.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float ExhaustionGainPerLowStaminaSecond = 0.35f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float ExhaustionRecoveryPerSecond = 0.08f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0", ClampMax = "100")) float LowStaminaExhaustionThreshold = 20.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float StarvationDamagePerMinute = 3.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float DehydrationDamagePerMinute = 5.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float ColdDamagePerMinute = 4.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float SicknessDamagePerMinute = 1.5f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Agrarian|Survival|Rates", meta = (ClampMin = "0")) float SicknessRecoveryPerSecond = 0.02f; UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") bool IsAlive() const; UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void ApplyDamage(float Amount); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void RestoreHealth(float Amount); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void AddFood(float Amount); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void AddWater(float Amount); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void AddWarmth(float DegreesCelsius); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void AddInjury(float Severity); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void AddSickness(float Severity); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void ReduceSickness(float Amount); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void ApplySavedState(const FAgrarianSurvivalSnapshot& SavedSurvival, const FAgrarianCareHistorySnapshot& SavedCareHistory); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void SpendStamina(float Amount); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void AddExhaustion(float Amount); UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival") void ReduceExhaustion(float Amount); UFUNCTION(BlueprintPure, Category = "Agrarian|Survival|Shelter") float CalculateCurrentWeatherProtection() const; protected: UFUNCTION() void OnRep_Survival(); UFUNCTION() void OnRep_CareHistory(); void ClampSurvival(); void ClampCareHistory(); void BroadcastSurvivalChanged(); };