// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/PlayerController.h" #include "GameFramework/PlayerState.h" #include "BlasterPlayerController.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FHighPingDelegate, bool, bPingTooHigh); /** * */ UCLASS() class BLASTER_API ABlasterPlayerController : public APlayerController { GENERATED_BODY() public: virtual void Tick(float DeltaTime) override; 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); void SetDebugMsg4(FString Key, FString Value); void SetDebugMsg5(FString Key, FString Value); void SetDebugMsg6(FString Key, FString Value); 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); void SetHUDCarriedAmmo(int32 Ammo); void SetHUDGrenades(int32 Grenades); void SetHUDMatchCountdown(float CountdownTime); void SetHUDAnnouncementCountdown(float CountdownTime); // Synced with server world clock virtual float GetServerTime(); void OnMatchStateSet(FName State, bool bTeamsMatch = false); void HandleCooldown(); float SingleTripTime = 0.f; FHighPingDelegate HighPingDelegate; void BroadcastElim(APlayerState* Attacker, APlayerState* Victim); protected: virtual void SetupInputComponent() override; virtual void BeginPlay() override; void CheckTimeSync(float DeltaTime); void HandleMatchHasStarted(bool bTeamsMatch = false); void SetHUDTime(); void PollInit(); // Sync time between client and server // Requests the current server time, passing in the client's time when the request was sent UFUNCTION(Server, Reliable) void ServerRequestServerTime(float TimeOfClientRequest); // Reports the current server time to the client in response to ServerRequestServerTime UFUNCTION(Client, Reliable) void ClientReportServerTime(float TimeOfClientRequest, float TimeServerReceivedClientRequest); // Difference between client and server time float ClientServerDelta = 0; UPROPERTY(EditAnywhere, Category = Time) float TimeSyncFrequency = 5.f; float TimeSyncRunningTime = 0.f; UFUNCTION(Server, Reliable) void ServerCheckMatchState(); UFUNCTION(Client, Reliable) void ClientJoinMidgame(FName StateOfMatch, float Warmup, float Match, float Cooldown, float StartingTime); void HighPingWarning(); void StopHighPingWarning(); void ShowReturnToMainMenu(); UFUNCTION(Client, Reliable) void ClientElimAnnouncement(APlayerState* Attacker, APlayerState* Victim); UPROPERTY(ReplicatedUsing = OnRep_ShowTeamScores) bool bShowTeamScores = false; UFUNCTION() void OnRep_ShowTeamScores(); FString GetInfoText(const TArray& Players); FString GetTeamsInfoText(class ABlasterGameState* BlasterGameState); private: UPROPERTY() class UDebugWidget* DebugWidget; UPROPERTY() class ABlasterHUD* BlasterHUD; // Return to main menu UPROPERTY(EditAnywhere, Category = HUD) TSubclassOf ReturnToMainMenuWidget; UPROPERTY() class UReturnToMainMenu* ReturnToMainMenu; bool bReturnToMainMenuOpen = false; UPROPERTY() class ABlasterGameMode* BlasterGameMode; float LevelStartingTime = 0.f; float MatchTime = 0.f; float WarmupTime = 0.f; float CooldownTime = 0.f; uint32 CountdownInt = 0; UPROPERTY(ReplicatedUsing=OnRep_MatchState) FName MatchState; UFUNCTION() void OnRep_MatchState(); UPROPERTY() class UCharacterOverlay* CharacterOverlay; 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; float bInitializeCarriedAmmo = false; float HUDCarriedAmmo; float bInitializeWeaponAmmo = false; float HUDWeaponAmmo; // High Ping Indicator void CheckPing(float DeltaTime); float HighPingRunningTime = 0.f; UPROPERTY(EditAnywhere) float HighPingDuration = 5.f; float PingAnimationRunningTime = 0.f; UPROPERTY(EditAnywhere) float CheckPingFrequency = 20.f; UFUNCTION(Server, Reliable) void ServerReportPingStatus(bool bHighPing); UPROPERTY(EditAnywhere) float HighPingThreshold = 50.f; };