From 9f931693b2a53f703eaafa939aa091c96f5fc699 Mon Sep 17 00:00:00 2001 From: PHILIP WHITE Date: Thu, 9 Nov 2023 12:25:49 +0000 Subject: [PATCH] Add Regen Health After 5 Seconds for Placeholder Regen --- .../Source/EndlessVendetta/AI/AICharacter.h | 6 +- .../EndlessVendettaCharacter.cpp | 60 +++++++++++++------ .../EndlessVendettaCharacter.h | 22 ++++--- 3 files changed, 60 insertions(+), 28 deletions(-) diff --git a/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.h b/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.h index 09d63741..b82a5481 100644 --- a/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.h +++ b/EndlessVendetta/Source/EndlessVendetta/AI/AICharacter.h @@ -17,11 +17,11 @@ public: // Sets default values for this character's properties AAICharacter(); - UPROPERTY(EditDefaultsOnly, Category = "Stats") + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Stats") float CurrentHealth = 100.0f; - UPROPERTY(EditDefaultsOnly, Category = "Stats") + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") float MaxHealth = 100.0f; - UPROPERTY(EditDefaultsOnly, Category = "Stats") + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") float DefaultHealth = 100.0f; UPROPERTY(EditDefaultsOnly, Category = "Profile") diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp index 3fb9141f..773f26bb 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.cpp @@ -8,6 +8,7 @@ #include "EnhancedInputSubsystems.h" #include "InteractionInterface.h" #include "AI/EnemyCharacter.h" +#include "Engine/DamageEvents.h" #include "GameFramework/CharacterMovementComponent.h" #include "Kismet/GameplayStatics.h" #include "GameFramework/MovementComponent.h" @@ -84,6 +85,21 @@ void AEndlessVendettaCharacter::Tick(float DeltaTime) } } +void AEndlessVendettaCharacter::RegenHealth() +{ + Heal(10); + if (GetWorld()->GetTimerManager().GetTimerRate(RegenHealthTimerHandle) > 1.0f) + { + GetWorld()->GetTimerManager().SetTimer(RegenHealthTimerHandle, this, &AEndlessVendettaCharacter::RegenHealth, 1.0f, true); + } + if (CurrentHealth >= MaxHealth) GetWorld()->GetTimerManager().ClearTimer(RegenHealthTimerHandle); +} + +void AEndlessVendettaCharacter::Heal(const float Amount) +{ + CurrentHealth += FMath::Clamp(Amount, 0, MaxHealth); +} + void AEndlessVendettaCharacter::WeaponPickUpSystem() { FHitResult OutHit; @@ -150,11 +166,11 @@ void AEndlessVendettaCharacter::Interact() QueryParams.AddIgnoredActor(this); FVector LT_Start = FirstPersonCameraComponent->GetComponentLocation(); FVector LT_End = LT_Start + (FirstPersonCameraComponent->GetForwardVector() * InteractionRange); - if(IsValid(PrimaryWeapon)) + if (IsValid(PrimaryWeapon)) { QueryParams.AddIgnoredActor(PrimaryWeapon); } - if(IsValid(SecondaryWeapon)) + if (IsValid(SecondaryWeapon)) { QueryParams.AddIgnoredActor(SecondaryWeapon); } @@ -183,6 +199,12 @@ float AEndlessVendettaCharacter::TakeDamage(const float DamageAmount, FDamageEve { CurrentHealth = 0; UE_LOG(LogTemp, Warning, TEXT("Player is dead")); + UGameplayStatics::OpenLevel(this, FName(*GetWorld()->GetName()), false); + } + if (!GetWorld()->GetTimerManager().IsTimerActive(RegenHealthTimerHandle)) + { + GetWorld()->GetTimerManager().ClearTimer(RegenHealthTimerHandle); + GetWorld()->GetTimerManager().SetTimer(RegenHealthTimerHandle, this, &AEndlessVendettaCharacter::RegenHealth, 5.0f, true); } return Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser); @@ -192,7 +214,7 @@ float AEndlessVendettaCharacter::TakeDamage(const float DamageAmount, FDamageEve void AEndlessVendettaCharacter::ToggleRecon() { if (!GadgetManager->IsValidReconGadget()) return; - + if (IsValid(PrimaryWeapon)) EquipPrimary(); if (IsValid(SecondaryWeapon)) EquipSecondary(); @@ -213,8 +235,8 @@ void AEndlessVendettaCharacter::ToggleRecon() void AEndlessVendettaCharacter::ToggleCombat() { - if(!GadgetManager->IsValidCombatGadget()) return; - + if (!GadgetManager->IsValidCombatGadget()) return; + if (IsValid(PrimaryWeapon)) EquipPrimary(); if (IsValid(SecondaryWeapon)) EquipSecondary(); @@ -310,14 +332,14 @@ void AEndlessVendettaCharacter::WeaponSwitcher(AActor* Outhit) //Calls the fire function in the baseWeaponClass void AEndlessVendettaCharacter::FireCaller() { - if (IsValid(PrimaryWeapon) && !bIsReloading) - { - PrimaryWeapon->Fire(); - } - if (IsValid(SecondaryWeapon) && !bIsReloading) - { - SecondaryWeapon->Fire(); - } + if (IsValid(PrimaryWeapon) && !bIsReloading) + { + PrimaryWeapon->Fire(); + } + if (IsValid(SecondaryWeapon) && !bIsReloading) + { + SecondaryWeapon->Fire(); + } } void AEndlessVendettaCharacter::StopFire() @@ -368,14 +390,14 @@ void AEndlessVendettaCharacter::StopGunRightClick() { bIsScoped = false; PrimaryWeapon->WeaponScopedFire(); - PrimaryWeapon->SetActorRelativeLocation(FVector(0,0,0)); + PrimaryWeapon->SetActorRelativeLocation(FVector(0, 0, 0)); this->GetFirstPersonCameraComponent()->SetFieldOfView(90); } if (IsValid(SecondaryWeapon)) { bIsScoped = false; SecondaryWeapon->WeaponScopedFire(); - SecondaryWeapon->SetActorRelativeLocation(FVector(0,0,0)); + SecondaryWeapon->SetActorRelativeLocation(FVector(0, 0, 0)); this->GetFirstPersonCameraComponent()->SetFieldOfView(90); } } @@ -395,6 +417,11 @@ void AEndlessVendettaCharacter::GunReload() } +void AEndlessVendettaCharacter::DamagePlayer(const float Damage) +{ + TakeDamage(Damage, FDamageEvent(), nullptr, nullptr); +} + void AEndlessVendettaCharacter::Move(const FInputActionValue& Value) { // input is a Vector2D @@ -436,7 +463,7 @@ bool AEndlessVendettaCharacter::UpdateGadgetType(TSubclassOf NewGad { if (NewGadgetClass.GetDefaultObject()->IsA(AReconGadget::StaticClass()) && GadgetManager->ReconCantBeSwitchedOut()) return false; if (NewGadgetClass.GetDefaultObject()->IsA(ACombatGadget::StaticClass()) && GadgetManager->CombatCantBeSwitchedOut()) return false; - + for (UActorComponent* PlayersCamera : GetComponentsByTag(UCameraComponent::StaticClass(), FName("PlayersCamera"))) { GadgetManager->SpawnGadget(NewGadgetClass, Cast(PlayersCamera)); @@ -444,4 +471,3 @@ bool AEndlessVendettaCharacter::UpdateGadgetType(TSubclassOf NewGad } return true; } - diff --git a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h index 71be65d9..258c5c21 100644 --- a/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h +++ b/EndlessVendetta/Source/EndlessVendetta/EndlessVendettaCharacter.h @@ -58,13 +58,13 @@ class AEndlessVendettaCharacter : public ACharacter UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Input, meta=(AllowPrivateAccess = "true")) class UInputAction* TapShootAction; - + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Input, meta=(AllowPrivateAccess = "true")) class UInputAction* GunAimInAction; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Input, meta=(AllowPrivateAccess = "true")) class UInputAction* GunReloadAction; - + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) UInputAction* CrouchAction; @@ -74,11 +74,11 @@ class AEndlessVendettaCharacter : public ACharacter public: AEndlessVendettaCharacter(); - UPROPERTY(EditDefaultsOnly, Category = "Stats") + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Stats") float CurrentHealth = 100.0f; - UPROPERTY(EditDefaultsOnly, Category = "Stats") + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") float MaxHealth = 100.0f; - UPROPERTY(EditDefaultsOnly, Category = "Stats") + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Stats") float DefaultHealth = 100.0f; protected: @@ -87,13 +87,16 @@ protected: UPROPERTY(EditDefaultsOnly, Category = "Gadget") TSubclassOf GadgetManagerClass; - + + void RegenHealth(); + FTimerHandle RegenHealthTimerHandle; + void Heal(const float Amount); public: int Money = 2000; AGadgetManager* GadgetManager; bool bIsReloading = false; - + bool bIsPlayerMoving = false; double MoveGroundSpeed; @@ -143,6 +146,9 @@ public: UPROPERTY(EditAnywhere, Category = "Dont Touch") bool bIsScoped; + UFUNCTION(Exec) + void DamagePlayer(const float Damage); + protected: /** Called for movement input */ void Move(const FInputActionValue& Value); @@ -156,7 +162,7 @@ protected: UPROPERTY(EditDefaultsOnly, Category = "Interaction") float InteractionRange = 250; void Interact(); - + protected: // APawn interface virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override;