From 554c94a7789b6ae252c8911fbe7d607a3f59d01c Mon Sep 17 00:00:00 2001 From: Norman Lansing Date: Fri, 13 Mar 2026 07:19:41 -0400 Subject: [PATCH] Added in EC2 support and adjusted Anywhere if statement to allow EC2 and to clean uip variable placement. --- .../Private/Game/ShooterGameMode.cpp | 177 +++++++++--------- 1 file changed, 93 insertions(+), 84 deletions(-) diff --git a/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp b/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp index aae6b7aa..8ab32994 100644 --- a/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp +++ b/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp @@ -77,15 +77,17 @@ void AShooterGameMode::InitGameLift() // Get the module first FGameLiftServerSDKModule* GameLiftSdkModule = &FModuleManager::LoadModuleChecked("GameLiftServerSDK"); - - // Define the server parameters for an Anywhere fleet. These are not needed for a GameLift managed EC2 fleet. - FServerParameters ServerParametersForAnywhere; - - uint32 PID = FPlatformProcess::GetCurrentProcessId(); - FString PIDString = FString::FromInt(static_cast(PID)); - + FGameLiftGenericOutcome InitSdkOutcome; + + UE_LOGFMT(LogShooterGameMode, Log, "Initializing the GameLift Server..."); if (GameLiftConfig.bIsAnywhereFleet) { + // Define the server parameters for an Anywhere fleet. These are not needed for a GameLift managed EC2 fleet. + FServerParameters ServerParametersForAnywhere; + + uint32 PID = FPlatformProcess::GetCurrentProcessId(); + FString PIDString = FString::FromInt(static_cast(PID)); + UE_LOGFMT(LogShooterGameMode, Log, "Configuring server parameters for Anywhere..."); // If AnywhereFleets are being used load the command line arguments parsed earlier. ServerParametersForAnywhere.m_webSocketUrl = TCHAR_TO_UTF8(*GameLiftConfig.WebSocketUrlResult.Value); @@ -95,64 +97,70 @@ void AShooterGameMode::InitGameLift() ServerParametersForAnywhere.m_authToken = TCHAR_TO_UTF8(*GameLiftConfig.AuthTokenResult.Value); LogServerParameters(ServerParametersForAnywhere); - UE_LOGFMT(LogShooterGameMode, Log, "Initializing the GameLift Server..."); - // InitSDK will establish a local connection with GameLfit's agent to enable further communication. - FGameLiftGenericOutcome InitSdkOutcome = GameLiftSdkModule->InitSDK(ServerParametersForAnywhere); - if (InitSdkOutcome.IsSuccess()) - { - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_GREEN); - UE_LOG(LogShooterGameMode, Log, TEXT("GameLift InitSDK succeeded!")); - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); - } - else - { - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_RED); - UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: InitSDK failed : (")); - FGameLiftError GameLiftError = InitSdkOutcome.GetError(); - UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: %s"), *GameLiftError.m_errorMessage); - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); - return; - } + InitSdkOutcome = GameLiftSdkModule->InitSDK(ServerParametersForAnywhere); + } + else + { + InitSdkOutcome = GameLiftSdkModule->InitSDK(); + } + + if (InitSdkOutcome.IsSuccess()) + { + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_GREEN); + UE_LOG(LogShooterGameMode, Log, TEXT("GameLift InitSDK succeeded!")); + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); + } + else + { + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_RED); + UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: InitSDK failed : (")); + FGameLiftError GameLiftError = InitSdkOutcome.GetError(); + UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: %s"), *GameLiftError.m_errorMessage); + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); + return; + } - ProcessParameters = MakeShared(); - //When a game session is created, Amazon GameLift Servers sends an activation request to the game server and passes along the game session object containing game properties and other settings. - //Here is where a game server should take action based on the game session object. - //Once the game server is ready to receive incoming player connections, it should invoke GameLiftServerAPI.ActivateGameSession() - ProcessParameters->OnStartGameSession.BindLambda([=](Aws::GameLift::Server::Model::GameSession InGameSession) - { - FString GameSessionId = FString(InGameSession.GetGameSessionId()); - UE_LOG(LogShooterGameMode, Log, TEXT("GameSession Initializing: %s"), *GameSessionId); - GameLiftSdkModule->ActivateGameSession(); - }); + ProcessParameters = MakeShared(); + //When a game session is created, Amazon GameLift Servers sends an activation request to the game server and passes along the game session object containing game properties and other settings. + //Here is where a game server should take action based on the game session object. + //Once the game server is ready to receive incoming player connections, it should invoke GameLiftServerAPI.ActivateGameSession() + ProcessParameters->OnStartGameSession.BindLambda([=](Aws::GameLift::Server::Model::GameSession InGameSession) + { + FString GameSessionId = FString(InGameSession.GetGameSessionId()); + UE_LOG(LogShooterGameMode, Log, TEXT("GameSession Initializing: %s"), *GameSessionId); + GameLiftSdkModule->ActivateGameSession(); + }); //OnProcessTerminate callback. Amazon GameLift Servers will invoke this callback before shutting down an instance hosting this game server. //It gives this game server a chance to save its state, communicate with services, etc., before being shut down. //In this case, we simply tell Amazon GameLift Servers we are indeed going to shutdown. - ProcessParameters->OnTerminate.BindLambda([=]() - { - UE_LOG(LogShooterGameMode, Log, TEXT("Game Server Process is terminating")); - // First call ProcessEnding() - FGameLiftGenericOutcome processEndingOutcome = GameLiftSdkModule->ProcessEnding(); - // Then call Destroy() to free the SDK from memory - FGameLiftGenericOutcome destroyOutcome = GameLiftSdkModule->Destroy(); - // Exit the process with success or failure - if (processEndingOutcome.IsSuccess() && destroyOutcome.IsSuccess()) { - UE_LOG(LogShooterGameMode, Log, TEXT("Server process ending successfully")); + ProcessParameters->OnTerminate.BindLambda([=]() + { + UE_LOG(LogShooterGameMode, Log, TEXT("Game Server Process is terminating")); + // First call ProcessEnding() + FGameLiftGenericOutcome processEndingOutcome = GameLiftSdkModule->ProcessEnding(); + // Then call Destroy() to free the SDK from memory + FGameLiftGenericOutcome destroyOutcome = GameLiftSdkModule->Destroy(); + // Exit the process with success or failure + if (processEndingOutcome.IsSuccess() && destroyOutcome.IsSuccess()) { + UE_LOG(LogShooterGameMode, Log, TEXT("Server process ending successfully")); + } + else { + if (!processEndingOutcome.IsSuccess()) { + const FGameLiftError& error = processEndingOutcome.GetError(); + UE_LOG(LogShooterGameMode, Error, TEXT("ProcessEnding() failed. Error: %s"), + error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); } - else { - if (!processEndingOutcome.IsSuccess()) { - const FGameLiftError& error = processEndingOutcome.GetError(); - UE_LOG(LogShooterGameMode, Error, TEXT("ProcessEnding() failed. Error: %s"), - error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); - } - if (!destroyOutcome.IsSuccess()) { - const FGameLiftError& error = destroyOutcome.GetError(); - UE_LOG(LogShooterGameMode, Error, TEXT("Destroy() failed. Error: %s"), - error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); - } + if (!destroyOutcome.IsSuccess()) { + const FGameLiftError& error = destroyOutcome.GetError(); + UE_LOG(LogShooterGameMode, Error, TEXT("Destroy() failed. Error: %s"), + error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); } - }); + } + GLog->Flush(); + FGenericPlatformMisc::RequestExit(false); + }); //This is the HealthCheck callback. //Amazon GameLift Servers will invoke this callback every 60 seconds or so. @@ -160,38 +168,39 @@ void AShooterGameMode::InitGameLift() //Simply return true if healthy, false otherwise. //The game server has 60 seconds to respond with its health status. Amazon GameLift Servers will default to 'false' if the game server doesn't respond in time. //In this case, we're always healthy! - ProcessParameters->OnHealthCheck.BindLambda([]() - { - UE_LOG(LogShooterGameMode, Log, TEXT("Performing Health Check")); - return true; - }); + ProcessParameters->OnHealthCheck.BindLambda([]() + { + UE_LOG(LogShooterGameMode, Log, TEXT("Performing Health Check")); + return true; + }); - ProcessParameters->port = GameLiftConfig.ServerPort; + ProcessParameters->port = GameLiftConfig.ServerPort; - TArray Logfiles; - Logfiles.Add(TEXT("FPSTemplate/Saved/Log/server.log")); - ProcessParameters->logParameters = Logfiles; + TArray Logfiles; + Logfiles.Add(TEXT("FPSTemplate/Saved/Log/server.log")); + ProcessParameters->logParameters = Logfiles; - UE_LOGFMT(LogShooterGameMode, Log, "Calling Process Ready..."); - FGameLiftGenericOutcome ProcessReadyOutcome = GameLiftSdkModule->ProcessReady(*ProcessParameters); + UE_LOGFMT(LogShooterGameMode, Log, "Calling Process Ready..."); + FGameLiftGenericOutcome ProcessReadyOutcome = GameLiftSdkModule->ProcessReady(*ProcessParameters); - if (ProcessReadyOutcome.IsSuccess()) - { - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_GREEN); - UE_LOG(LogShooterGameMode, Log, TEXT("Process Ready!")); - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); - } - else - { - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_RED); - UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: Process Ready Failed!")); - FGameLiftError ProcessReadyError = ProcessReadyOutcome.GetError(); - UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: %s"), *ProcessReadyError.m_errorMessage); - UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); - } - - UE_LOGFMT(LogShooterGameMode, Log, "InitGameLift completed!"); + if (ProcessReadyOutcome.IsSuccess()) + { + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_GREEN); + UE_LOG(LogShooterGameMode, Log, TEXT("Process Ready!")); + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); } + else + { + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_RED); + UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: Process Ready Failed!")); + FGameLiftError ProcessReadyError = ProcessReadyOutcome.GetError(); + UE_LOG(LogShooterGameMode, Log, TEXT("ERROR: %s"), *ProcessReadyError.m_errorMessage); + UE_LOG(LogShooterGameMode, SetColor, TEXT("%s"), COLOR_NONE); + return; + } + + UE_LOGFMT(LogShooterGameMode, Log, "InitGameLift completed!"); + #endif }