diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 939f67a..b865810 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -184,6 +184,7 @@ void ABlasterCharacter::BeginPlay() Super::BeginPlay(); UpdateHUDHealth(); + UpdateHUDShield(); if (HasAuthority()) { OnTakeAnyDamage.AddDynamic(this, &ABlasterCharacter::ReceiveDamage); @@ -352,8 +353,26 @@ void ABlasterCharacter::PlayHitReactMontage() void ABlasterCharacter::ReceiveDamage(AActor* DamagedActor, float Damage, const UDamageType* DamageType, AController* InstigatorController, AActor* DamageCauser) { if (bEliminated) return; - Health = FMath::Clamp(Health - Damage, 0.f, MaxHealth); + + float DamageToHealth = Damage; + if (Shield > 0) + { + if (Shield >= Damage) + { + Shield = FMath::Clamp(Shield - Damage, 0.f, MaxShield); + DamageToHealth = 0.f; + } + else + { + DamageToHealth = FMath::Clamp(DamageToHealth - (Damage - Shield), 0.f, Damage); + Shield = 0.f; + } + } + + Health = FMath::Clamp(Health - DamageToHealth, 0.f, MaxHealth); + UpdateHUDHealth(); + UpdateHUDShield(); if (Health > 0.f) { PlayHitReactMontage(); diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.cpp b/Source/Blaster/PlayerController/BlasterPlayerController.cpp index de7160d..f7e3409 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.cpp +++ b/Source/Blaster/PlayerController/BlasterPlayerController.cpp @@ -158,7 +158,7 @@ void ABlasterPlayerController::SetHUDHealth(float Health, float MaxHealth) } else { - bInitializeCharacterOverlay = true; + bInitializeHealth = true; HUDHealth = Health; HUDMaxHealth = MaxHealth; } @@ -180,7 +180,7 @@ void ABlasterPlayerController::SetHUDShield(float Shield, float MaxShield) } else { - bInitializeCharacterOverlay = true; + bInitializeShield = true; HUDShield = Shield; HUDMaxShield = MaxShield; } @@ -200,7 +200,7 @@ void ABlasterPlayerController::SetHUDScore(float Score) } else { - bInitializeCharacterOverlay = true; + bInitializeScore = true; HUDScore = Score; } } @@ -218,7 +218,7 @@ void ABlasterPlayerController::SetHUDDefeats(int32 Defeats) } else { - bInitializeCharacterOverlay = true; + bInitializeDefeats = true; HUDDefeats = Defeats; } } @@ -261,6 +261,7 @@ void ABlasterPlayerController::SetHUDGrenades(int32 Grenades) BlasterHUD->CharacterOverlay->GrenadesAmount->SetText(FText::FromString(GrenadesText)); } else { + bInitializeGrenades = true; HUDGrenades = Grenades; } } @@ -362,16 +363,15 @@ void ABlasterPlayerController::PollInit() CharacterOverlay = BlasterHUD->CharacterOverlay; if (CharacterOverlay) { - SetHUDHealth(HUDHealth, HUDMaxHealth); - SetHUDShield(HUDShield, HUDMaxShield); - SetHUDScore(HUDScore); - SetHUDDefeats(HUDDefeats); + if (bInitializeHealth) SetHUDHealth(HUDHealth, HUDMaxHealth); + if (bInitializeShield) SetHUDShield(HUDShield, HUDMaxShield); + if (bInitializeScore) SetHUDScore(HUDScore); + if (bInitializeDefeats) SetHUDDefeats(HUDDefeats); ABlasterCharacter* BlasterCharacter = Cast(GetPawn()); if (BlasterCharacter && BlasterCharacter->GetCombat()) { - SetHUDGrenades(BlasterCharacter->GetCombat()->GetGrenades()); + if (bInitializeGrenades) SetHUDGrenades(BlasterCharacter->GetCombat()->GetGrenades()); } - } } } diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.h b/Source/Blaster/PlayerController/BlasterPlayerController.h index 1de0075..f491432 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.h +++ b/Source/Blaster/PlayerController/BlasterPlayerController.h @@ -101,14 +101,22 @@ private: UPROPERTY() class UCharacterOverlay* CharacterOverlay; - bool bInitializeCharacterOverlay = false; + bool bInitializeHealth = false; float HUDHealth; float HUDMaxHealth; + + bool bInitializeShield = false; float HUDShield; float HUDMaxShield; + + bool bInitializeScore = false; float HUDScore; + + bool bInitializeDefeats = false; int32 HUDDefeats; + + bool bInitializeGrenades = false; int32 HUDGrenades; };