diff --git a/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset b/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset index e960b4f..6f1c3f0 100644 Binary files a/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset and b/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset differ 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;