// Fill out your copyright notice in the Description page of Project Settings. #include "BlasterPlayerController.h" #include "Blaster/Character/BlasterCharacter.h" #include "Blaster/HUD/BlasterHUD.h" #include "Blaster/HUD/CharacterOverlay.h" #include "Components/ProgressBar.h" #include "Components/TextBlock.h" void ABlasterPlayerController::BeginPlay() { Super::BeginPlay(); BlasterHUD = Cast(GetHUD()); } void ABlasterPlayerController::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); SetHUDTime(); } void ABlasterPlayerController::OnPossess(APawn* InPawn) { Super::OnPossess(InPawn); if (const ABlasterCharacter* BlasterCharacter = Cast(InPawn)) { SetHUDHealth(BlasterCharacter->GetHealth(), BlasterCharacter->GetMaxHealth()); } } void ABlasterPlayerController::SetHUDTime() { const uint32 SecondsLeft = FMath::CeilToInt(MatchTime - GetWorld()->GetTimeSeconds()); if (CountdownInt != SecondsLeft) { SetHUDMatchCountdown(MatchTime - GetWorld()->GetTimeSeconds()); } CountdownInt = SecondsLeft; } void ABlasterPlayerController::SetHUDHealth(float Health, float MaxHealth) { BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; bool bHUDValid = BlasterHUD && BlasterHUD->CharacterOverlay && BlasterHUD->CharacterOverlay->HealthBar && BlasterHUD->CharacterOverlay->HealthText; if (bHUDValid) { const float HealthPercent = Health / MaxHealth; BlasterHUD->CharacterOverlay->HealthBar->SetPercent(HealthPercent); const FString HealthText = FString::Printf(TEXT("%d/%d"), FMath::CeilToInt(Health), FMath::CeilToInt(MaxHealth)); BlasterHUD->CharacterOverlay->HealthText->SetText(FText::FromString(HealthText)); } } void ABlasterPlayerController::SetHUDScore(float Score) { BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; bool bHUDValid = BlasterHUD && BlasterHUD->CharacterOverlay && BlasterHUD->CharacterOverlay->ScoreValue; if (bHUDValid) { const FString ScoreAmount = FString::Printf(TEXT("%d"), FMath::FloorToInt(Score)); BlasterHUD->CharacterOverlay->ScoreValue->SetText(FText::FromString(ScoreAmount)); } } void ABlasterPlayerController::SetHUDDefeats(int32 Defeats) { BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; bool bHUDValid = BlasterHUD && BlasterHUD->CharacterOverlay && BlasterHUD->CharacterOverlay->DefeatsValue; if (bHUDValid) { const FString DefeatsAmount = FString::Printf(TEXT("%d"), Defeats); BlasterHUD->CharacterOverlay->DefeatsValue->SetText(FText::FromString(DefeatsAmount)); } } void ABlasterPlayerController::SetHUDWeaponAmmo(int32 Ammo) { BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; bool bHUDValid = BlasterHUD && BlasterHUD->CharacterOverlay && BlasterHUD->CharacterOverlay->WeaponAmmoValue; if (bHUDValid) { const FString WeaponAmmoAmount = FString::Printf(TEXT("%d"), Ammo); BlasterHUD->CharacterOverlay->WeaponAmmoValue->SetText(FText::FromString(WeaponAmmoAmount)); } } void ABlasterPlayerController::SetHUDCarriedAmmo(int32 Ammo) { BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; bool bHUDValid = BlasterHUD && BlasterHUD->CharacterOverlay && BlasterHUD->CharacterOverlay->CarriedAmmoValue; if (bHUDValid) { const FString CarriedAmmoAmount = FString::Printf(TEXT("%d"), Ammo); BlasterHUD->CharacterOverlay->CarriedAmmoValue->SetText(FText::FromString(CarriedAmmoAmount)); } } void ABlasterPlayerController::SetHUDMatchCountdown(float CountdownTime) { BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; bool bHUDValid = BlasterHUD && BlasterHUD->CharacterOverlay && BlasterHUD->CharacterOverlay->MatchCountdownText; if (bHUDValid) { int32 Minutes = FMath::FloorToInt(CountdownTime / 60); int32 Seconds = CountdownTime - Minutes * 60; const FString CountdownText = FString::Printf(TEXT("%02d:%02d"), Minutes, Seconds); BlasterHUD->CharacterOverlay->MatchCountdownText->SetText(FText::FromString(CountdownText)); } }