diff --git a/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset b/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset index a488d7f..918a5fe 100644 Binary files a/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset and b/Content/Blueprints/HUD/WBP_CharacterOverlay.uasset differ diff --git a/Source/Blaster/GameMode/BlasterGameMode.cpp b/Source/Blaster/GameMode/BlasterGameMode.cpp index 95b5228..097d3ae 100644 --- a/Source/Blaster/GameMode/BlasterGameMode.cpp +++ b/Source/Blaster/GameMode/BlasterGameMode.cpp @@ -67,7 +67,7 @@ void ABlasterGameMode::OnMatchStateSet() ABlasterPlayerController* BlasterPlayer = Cast(*It); if (BlasterPlayer) { - BlasterPlayer->OnMatchStateSet(MatchState); + BlasterPlayer->OnMatchStateSet(MatchState, bTeamsMatch); } } } diff --git a/Source/Blaster/GameMode/BlasterGameMode.h b/Source/Blaster/GameMode/BlasterGameMode.h index 8693939..3058953 100644 --- a/Source/Blaster/GameMode/BlasterGameMode.h +++ b/Source/Blaster/GameMode/BlasterGameMode.h @@ -41,6 +41,8 @@ public: float LevelStartingTime = 0.f; + bool bTeamsMatch = false; + protected: virtual void BeginPlay() override; virtual void OnMatchStateSet() override; diff --git a/Source/Blaster/GameMode/TeamsGameMode.cpp b/Source/Blaster/GameMode/TeamsGameMode.cpp index 9772105..4c67a01 100644 --- a/Source/Blaster/GameMode/TeamsGameMode.cpp +++ b/Source/Blaster/GameMode/TeamsGameMode.cpp @@ -6,6 +6,11 @@ #include "Blaster/GameState/BlasterGameState.h" #include "Kismet/GameplayStatics.h" +ATeamsGameMode::ATeamsGameMode() +{ + bTeamsMatch = true; +} + void ATeamsGameMode::PostLogin(APlayerController* NewPlayer) { Super::PostLogin(NewPlayer); diff --git a/Source/Blaster/GameMode/TeamsGameMode.h b/Source/Blaster/GameMode/TeamsGameMode.h index 09906ad..d83ca6d 100644 --- a/Source/Blaster/GameMode/TeamsGameMode.h +++ b/Source/Blaster/GameMode/TeamsGameMode.h @@ -15,6 +15,7 @@ class BLASTER_API ATeamsGameMode : public ABlasterGameMode GENERATED_BODY() public: + ATeamsGameMode(); virtual void PostLogin(APlayerController* NewPlayer) override; virtual void Logout(AController* Exiting) override; virtual float CalculateDamage(AController* Attacker, AController* Victim, float BaseDamage) override; diff --git a/Source/Blaster/GameState/BlasterGameState.cpp b/Source/Blaster/GameState/BlasterGameState.cpp index d571088..8a4a638 100644 --- a/Source/Blaster/GameState/BlasterGameState.cpp +++ b/Source/Blaster/GameState/BlasterGameState.cpp @@ -34,6 +34,16 @@ void ABlasterGameState::UpdateTopScore(ABlasterPlayerState* ScoringPlayer) } } +void ABlasterGameState::RedTeamScores() +{ + ++RedTeamScore; +} + +void ABlasterGameState::BlueTeamScores() +{ + ++BlueTeamScore; +} + void ABlasterGameState::OnRep_RedTeamScore() { diff --git a/Source/Blaster/GameState/BlasterGameState.h b/Source/Blaster/GameState/BlasterGameState.h index fd5e861..16e2efe 100644 --- a/Source/Blaster/GameState/BlasterGameState.h +++ b/Source/Blaster/GameState/BlasterGameState.h @@ -22,6 +22,10 @@ public: TArray TopScoringPlayers; // Teams + + void RedTeamScores(); + void BlueTeamScores(); + TArray RedTeam; TArray BlueTeam; diff --git a/Source/Blaster/HUD/CharacterOverlay.h b/Source/Blaster/HUD/CharacterOverlay.h index d189dff..14d46c5 100644 --- a/Source/Blaster/HUD/CharacterOverlay.h +++ b/Source/Blaster/HUD/CharacterOverlay.h @@ -4,6 +4,7 @@ #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" +#include "Components/Border.h" #include "Components/Image.h" #include "CharacterOverlay.generated.h" @@ -31,7 +32,19 @@ public: UPROPERTY(meta = (BindWidget)) UTextBlock* ScoreValue; + + UPROPERTY(meta = (BindWidget)) + UBorder* RedTeamScoreBorder; + UPROPERTY(meta = (BindWidget)) + UTextBlock* RedTeamScore; + + UPROPERTY(meta = (BindWidget)) + UBorder* BlueTeamScoreBorder; + + UPROPERTY(meta = (BindWidget)) + UTextBlock* BlueTeamScore; + UPROPERTY(meta = (BindWidget)) UTextBlock* DefeatsValue; diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.cpp b/Source/Blaster/PlayerController/BlasterPlayerController.cpp index fb667cd..a0f00f6 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.cpp +++ b/Source/Blaster/PlayerController/BlasterPlayerController.cpp @@ -71,6 +71,72 @@ void ABlasterPlayerController::GetLifetimeReplicatedProps(TArray(GetHUD()) : BlasterHUD; + bool bHUDValid = BlasterHUD && + BlasterHUD->CharacterOverlay && + BlasterHUD->CharacterOverlay->RedTeamScore && + BlasterHUD->CharacterOverlay->RedTeamScoreBorder && + BlasterHUD->CharacterOverlay->BlueTeamScore && + BlasterHUD->CharacterOverlay->BlueTeamScoreBorder; + if (bHUDValid) + { + BlasterHUD->CharacterOverlay->RedTeamScore->SetText(FText()); + BlasterHUD->CharacterOverlay->RedTeamScoreBorder->SetVisibility(ESlateVisibility::Hidden); + BlasterHUD->CharacterOverlay->BlueTeamScore->SetText(FText()); + BlasterHUD->CharacterOverlay->BlueTeamScoreBorder->SetVisibility(ESlateVisibility::Hidden); + } +} + +void ABlasterPlayerController::InitTeamScores() +{ + BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; + bool bHUDValid = BlasterHUD && + BlasterHUD->CharacterOverlay && + BlasterHUD->CharacterOverlay->RedTeamScore && + BlasterHUD->CharacterOverlay->RedTeamScoreBorder && + BlasterHUD->CharacterOverlay->BlueTeamScore && + BlasterHUD->CharacterOverlay->BlueTeamScoreBorder; + if (bHUDValid) + { + FString Zero("0"); + BlasterHUD->CharacterOverlay->RedTeamScore->SetText(FText::FromString(Zero)); + BlasterHUD->CharacterOverlay->RedTeamScoreBorder->SetVisibility(ESlateVisibility::Visible); + BlasterHUD->CharacterOverlay->BlueTeamScore->SetText(FText::FromString(Zero)); + BlasterHUD->CharacterOverlay->BlueTeamScoreBorder->SetVisibility(ESlateVisibility::Visible); + } +} + +void ABlasterPlayerController::SetHUDRedTeamScore(int32 RedScore) +{ + BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; + bool bHUDValid = BlasterHUD && + BlasterHUD->CharacterOverlay && + BlasterHUD->CharacterOverlay->RedTeamScore && + BlasterHUD->CharacterOverlay->RedTeamScoreBorder; + if (bHUDValid) + { + const FString ScoreText = FString::Printf(TEXT("%d"), RedScore); + BlasterHUD->CharacterOverlay->RedTeamScore->SetText(FText::FromString(ScoreText)); + } +} + +void ABlasterPlayerController::SetHUDBlueTeamScore(int32 BlueScore) +{ + BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; + bool bHUDValid = BlasterHUD && + BlasterHUD->CharacterOverlay && + BlasterHUD->CharacterOverlay->BlueTeamScore && + BlasterHUD->CharacterOverlay->BlueTeamScoreBorder; + if (bHUDValid) + { + const FString ScoreText = FString::Printf(TEXT("%d"), BlueScore); + BlasterHUD->CharacterOverlay->BlueTeamScore->SetText(FText::FromString(ScoreText)); + } } void ABlasterPlayerController::SetDebugMsg1(FString Key, FString Value) @@ -156,6 +222,18 @@ void ABlasterPlayerController::ShowReturnToMainMenu() } } +void ABlasterPlayerController::OnRep_ShowTeamScores() +{ + if (bShowTeamScores) + { + InitTeamScores(); + } + else + { + HideTeamScores(); + } +} + // Is the ping to high? void ABlasterPlayerController::ServerReportPingStatus_Implementation(bool bHighPing) { @@ -553,13 +631,13 @@ void ABlasterPlayerController::ReceivedPlayer() } } -void ABlasterPlayerController::OnMatchStateSet(FName State) +void ABlasterPlayerController::OnMatchStateSet(FName State, bool bTeamsMatch) { MatchState = State; if (MatchState == MatchState::InProgress) { - HandleMatchHasStarted(); + HandleMatchHasStarted(bTeamsMatch); } else if (MatchState == MatchState::Cooldown) { @@ -579,8 +657,10 @@ void ABlasterPlayerController::OnRep_MatchState() } } -void ABlasterPlayerController::HandleMatchHasStarted() +void ABlasterPlayerController::HandleMatchHasStarted(bool bTeamsMatch) { + if (HasAuthority()) bShowTeamScores = bTeamsMatch; + BlasterHUD = BlasterHUD == nullptr ? Cast(GetHUD()) : BlasterHUD; if (BlasterHUD) { @@ -588,6 +668,16 @@ void ABlasterPlayerController::HandleMatchHasStarted() if (BlasterHUD->Announcement) { BlasterHUD->Announcement->SetVisibility(ESlateVisibility::Hidden); + + if (!HasAuthority()) return; + if (bTeamsMatch) + { + InitTeamScores(); + } + else + { + HideTeamScores(); + } } } } diff --git a/Source/Blaster/PlayerController/BlasterPlayerController.h b/Source/Blaster/PlayerController/BlasterPlayerController.h index 22d8c42..7bf1b12 100644 --- a/Source/Blaster/PlayerController/BlasterPlayerController.h +++ b/Source/Blaster/PlayerController/BlasterPlayerController.h @@ -23,7 +23,11 @@ public: virtual void OnPossess(APawn* InPawn) override; virtual void ReceivedPlayer() override; // Sync with server clock as soon as possible virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; - + void HideTeamScores(); + void InitTeamScores(); + void SetHUDRedTeamScore(int32 RedScore); + void SetHUDBlueTeamScore(int32 BlueScore); + void SetDebugMsg1(FString Key, FString Value); void SetDebugMsg2(FString Key, FString Value); void SetDebugMsg3(FString Key, FString Value); @@ -45,7 +49,7 @@ public: // Synced with server world clock virtual float GetServerTime(); - void OnMatchStateSet(FName State); + void OnMatchStateSet(FName State, bool bTeamsMatch = false); void HandleCooldown(); float SingleTripTime = 0.f; @@ -58,7 +62,7 @@ protected: virtual void SetupInputComponent() override; virtual void BeginPlay() override; void CheckTimeSync(float DeltaTime); - void HandleMatchHasStarted(); + void HandleMatchHasStarted(bool bTeamsMatch = false); void SetHUDTime(); void PollInit(); @@ -93,6 +97,12 @@ protected: UFUNCTION(Client, Reliable) void ClientElimAnnouncement(APlayerState* Attacker, APlayerState* Victim); + + UPROPERTY(ReplicatedUsing = OnRep_ShowTeamScores) + bool bShowTeamScores = false; + + UFUNCTION() + void OnRep_ShowTeamScores(); private: UPROPERTY()