From 6a5eecca49cae06082f8b3701e19df43a4021a99 Mon Sep 17 00:00:00 2001 From: Kingsmedia Date: Mon, 23 May 2022 11:27:12 +0200 Subject: [PATCH] 160 - Shield Bar --- .../HUD/WBP_CharacterOverlay.uasset | Bin 52378 -> 57876 bytes Source/Blaster/Character/BlasterCharacter.cpp | 19 +++++++++++++++ Source/Blaster/Character/BlasterCharacter.h | 12 +++++++++ Source/Blaster/HUD/CharacterOverlay.h | 6 +++++ .../BlasterPlayerController.cpp | 23 ++++++++++++++++++ .../BlasterPlayerController.h | 3 +++ 6 files changed, 63 insertions(+) diff --git a/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset b/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset index e960b4f4220ffd5c825e4eda3a0d7b5676764fca..6f1c3f071b9fed6d6f1b776fc8dd596f8b1d415d 100644 GIT binary patch delta 11540 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 delta 9876 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 UMBM3U-WC2{|6{*!fq2*cf2Ot($^ZZW diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index d717b9a..939f67a 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -71,6 +71,7 @@ void ABlasterCharacter::GetLifetimeReplicatedProps(TArray& Ou DOREPLIFETIME_CONDITION(ABlasterCharacter, OverlappingWeapon, COND_OwnerOnly); DOREPLIFETIME(ABlasterCharacter, Health); + DOREPLIFETIME(ABlasterCharacter, Shield); DOREPLIFETIME(ABlasterCharacter, bDisableGameplay); } @@ -639,6 +640,15 @@ void ABlasterCharacter::OnRep_Health(float LastHealth) } } +void ABlasterCharacter::OnRep_Shield(float LastShield) +{ + UpdateHUDShield(); + if (Shield < LastShield) + { + PlayHitReactMontage(); + } +} + void ABlasterCharacter::UpdateHUDHealth() { BlasterPlayerController = BlasterPlayerController == nullptr ? Cast(Controller) : BlasterPlayerController; @@ -648,6 +658,15 @@ void ABlasterCharacter::UpdateHUDHealth() } } +void ABlasterCharacter::UpdateHUDShield() +{ + BlasterPlayerController = BlasterPlayerController == nullptr ? Cast(Controller) : BlasterPlayerController; + if (BlasterPlayerController) + { + BlasterPlayerController->SetHUDShield(Shield, MaxShield); + } +} + void ABlasterCharacter::PollInit() { if (BlasterPlayerState == nullptr) diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index 4f8a8b3..f4b6df5 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -42,6 +42,7 @@ public: void ShowSniperScopeWidget(bool bShowScope); void UpdateHUDHealth(); + void UpdateHUDShield(); protected: virtual void BeginPlay() override; @@ -148,6 +149,17 @@ private: UFUNCTION() void OnRep_Health(float LastHealth); + // Shield + + UPROPERTY(EditAnywhere, Category= "Player Stats") + float MaxShield = 100.f; + + UPROPERTY(ReplicatedUsing = OnRep_Shield, VisibleAnywhere, Category= "Player Stats") + float Shield = 50.f; + + UFUNCTION() + void OnRep_Shield(float LastShield); + UPROPERTY() class ABlasterPlayerController* BlasterPlayerController; diff --git a/Source/Blaster/HUD/CharacterOverlay.h b/Source/Blaster/HUD/CharacterOverlay.h index 09e1e85..58cf937 100644 --- a/Source/Blaster/HUD/CharacterOverlay.h +++ b/Source/Blaster/HUD/CharacterOverlay.h @@ -22,6 +22,12 @@ public: UPROPERTY(meta = (BindWidget)) class UTextBlock* HealthText; + UPROPERTY(meta = (BindWidget)) + UProgressBar* ShieldBar; + + UPROPERTY(meta = (BindWidget)) + UTextBlock* ShieldText; + UPROPERTY(meta = (BindWidget)) UTextBlock* ScoreValue; diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.cpp b/Source/Blaster/PlayerController/BlasterPlayerController.cpp index 0c2d1de..de7160d 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.cpp +++ b/Source/Blaster/PlayerController/BlasterPlayerController.cpp @@ -164,6 +164,28 @@ void ABlasterPlayerController::SetHUDHealth(float Health, float MaxHealth) } } +void ABlasterPlayerController::SetHUDShield(float Shield, float MaxShield) +{ + BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; + bool bHUDValid = BlasterHUD && + BlasterHUD->CharacterOverlay && + BlasterHUD->CharacterOverlay->ShieldBar && + BlasterHUD->CharacterOverlay->ShieldText; + if (bHUDValid) + { + const float ShieldPercent = Shield / MaxShield; + BlasterHUD->CharacterOverlay->ShieldBar->SetPercent(ShieldPercent); + FString ShieldText = FString::Printf(TEXT("%d/%d"), FMath::CeilToInt(Shield), FMath::CeilToInt(MaxShield)); + BlasterHUD->CharacterOverlay->ShieldText->SetText(FText::FromString(ShieldText)); + } + else + { + bInitializeCharacterOverlay = true; + HUDShield = Shield; + HUDMaxShield = MaxShield; + } +} + void ABlasterPlayerController::SetHUDScore(float Score) { BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; @@ -341,6 +363,7 @@ void ABlasterPlayerController::PollInit() if (CharacterOverlay) { SetHUDHealth(HUDHealth, HUDMaxHealth); + SetHUDShield(HUDShield, HUDMaxShield); SetHUDScore(HUDScore); SetHUDDefeats(HUDDefeats); ABlasterCharacter* BlasterCharacter = Cast(GetPawn()); diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.h b/Source/Blaster/PlayerController/BlasterPlayerController.h index 2928dc8..1de0075 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.h +++ b/Source/Blaster/PlayerController/BlasterPlayerController.h @@ -30,6 +30,7 @@ public: void SetDebugMsg7(FString Key, FString Value); void SetHUDHealth(float Health, float MaxHealth); + void SetHUDShield(float Shield, float MaxShield); void SetHUDScore(float Score); void SetHUDDefeats(int32 Defeats); void SetHUDWeaponAmmo(int32 Ammo); @@ -104,6 +105,8 @@ private: float HUDHealth; float HUDMaxHealth; + float HUDShield; + float HUDMaxShield; float HUDScore; int32 HUDDefeats; int32 HUDGrenades;