@@ -1,33 +1,21 @@
// Fill out your copyright notice in the Description page of Project Settings.
# include "Game/ShooterGameMode.h"
# include "GenericPlatform/GenericPlatformMisc .h"
# include "Containers/UnrealString.h"
# include "GameLiftClpTypes.h"
# include "GameLift/GameLiftClp.h"
# include "DedicatedServers/Public/Game/DS_GameMode .h"
# include "openssl/sha.h"
# include "GameLift/GameLiftClp.h"
# if WITH_GAMELIFT
# include "GameLiftServerSDK.h"
# include "GameLiftServerSDKModels.h"
# endif
DEFINE_LOG_CATEGORY ( LogDS_GameMode ) ;
DEFINE_LOG_CATEGORY ( LogShooterGameMode ) ;
// Function implementations.
AShooterGameMode : : AShooterGameMode ( )
{
}
void AShooterGameMode : : BeginPlay ( )
void ADS_GameMode : : BeginPlay ( )
{
Super : : BeginPlay ( ) ;
# if WITH_GAMELIFT
InitGameLift ( ) ;
# endif
}
void AShooter GameMode : : InitGame ( const FString & MapName , const FString & Options , FString & ErrorMessage )
void ADS_ GameMode : : InitGame ( const FString & MapName , const FString & Options , FString & ErrorMessage )
{
Super : : InitGame ( MapName , Options , ErrorMessage ) ;
CachedCommandLine = FCommandLine : : Get ( ) ;
@@ -35,27 +23,27 @@ void AShooterGameMode::InitGame(const FString& MapName, const FString& Options,
const FPortResult PortResult = cmdlineparser : : details : : GetConfiguredOrDefaultPort ( CachedCommandLine , TEXT ( " port " ) ) ; ;
if ( PortResult . bUsedDefaultPort )
{
UE_LOGFMT ( LogShooter GameMode , Warning , " {0} " , PortResult . WarningMessage ) ;
UE_LOGFMT ( LogDS_ GameMode , Warning , " {0} " , PortResult . WarningMessage ) ;
}
GameLiftConfig . ServerPort = PortResult . Port ;
if ( FParse : : Param ( * CachedCommandLine , TEXT ( " glAnywhereFleet " ) ) )
{
UE_LOGFMT ( LogShooter GameMode , Log , " Fleet type: Anywhere " ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " Fleet type: Anywhere " ) ;
GameLiftConfig . bIsAnywhereFleet = true ;
GameLiftConfig . bAllOptionsFound = GetAnywhereFleetParameters ( CachedCommandLine ) ;
LogAnywhereFleetParameters ( ) ;
}
else
{
UE_LOGFMT ( LogShooter GameMode , Log , " Fleet type: EC2 " ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " Fleet type: EC2 " ) ;
// TODO: EC2 configuration
}
}
FString AShooter GameMode : : GetSHA256Hash ( const FString & InString )
FString ADS_ GameMode : : GetSHA256Hash ( const FString & InString )
{
if ( InString . IsEmpty ( ) )
return TEXT ( " e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 " ) ;
@@ -76,16 +64,16 @@ FString AShooterGameMode::GetSHA256Hash(const FString& InString)
return Hash . ToString ( ) ;
}
void AShooter GameMode : : InitGameLift ( )
void ADS_ GameMode : : InitGameLift ( )
{
# if WITH_GAMELIFT
UE_LOGFMT ( LogShooter GameMode , Log , " Calling InitGameLift... " ) ;
# if WITH_GAMELIFT
UE_LOGFMT ( LogDS_ GameMode , Log , " Calling InitGameLift... " ) ;
// Get the module first
FGameLiftServerSDKModule * GameLiftSdkModule = & FModuleManager : : LoadModuleChecked < FGameLiftServerSDKModule > ( " GameLiftServerSDK " ) ;
FGameLiftGenericOutcome InitSdkOutcome ;
UE_LOGFMT ( LogShooter GameMode , Log , " Initializing the GameLift Server... " ) ;
UE_LOGFMT ( LogDS_ GameMode , 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.
@@ -94,7 +82,7 @@ void AShooterGameMode::InitGameLift()
uint32 PID = FPlatformProcess : : GetCurrentProcessId ( ) ;
FString PIDString = FString : : FromInt ( static_cast < int32 > ( PID ) ) ;
UE_LOGFMT ( LogShooter GameMode , Log , " Configuring server parameters for Anywhere... " ) ;
UE_LOGFMT ( LogDS_ GameMode , 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 ) ;
ServerParametersForAnywhere . m_fleetId = TCHAR_TO_UTF8 ( ( * GameLiftConfig . FleetIdResult . Value ) ) ;
@@ -113,17 +101,17 @@ void AShooterGameMode::InitGameLift()
if ( InitSdkOutcome . IsSuccess ( ) )
{
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_GREEN ) ;
UE_LOG ( LogShooter GameMode , Log , TEXT ( " GameLift InitSDK succeeded! " ) ) ;
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_GREEN ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " GameLift InitSDK succeeded! " ) ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
}
else
{
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_RED ) ;
UE_LOG ( LogShooter GameMode , Log , TEXT ( " ERROR: InitSDK failed : ( " ) ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_RED ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " ERROR: InitSDK failed : ( " ) ) ;
FGameLiftError GameLiftError = InitSdkOutcome . GetError ( ) ;
UE_LOG ( LogShooter GameMode , Log , TEXT ( " ERROR: %s " ) , * GameLiftError . m_errorMessage ) ;
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " ERROR: %s " ) , * GameLiftError . m_errorMessage ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
return ;
}
@@ -135,7 +123,7 @@ void AShooterGameMode::InitGameLift()
ProcessParameters - > OnStartGameSession . BindLambda ( [ = ] ( Aws : : GameLift : : Server : : Model : : GameSession InGameSession )
{
const FString GameSessionId = FString ( InGameSession . GetGameSessionId ( ) ) ;
UE_LOG ( LogShooter GameMode , Log , TEXT ( " GameSession Initializing: %s " ) , * GameSessionId ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " GameSession Initializing: %s " ) , * GameSessionId ) ;
GameLiftSdkModule - > ActivateGameSession ( ) ;
} ) ;
@@ -144,24 +132,24 @@ void AShooterGameMode::InitGameLift()
//In this case, we simply tell Amazon GameLift Servers we are indeed going to shut down.
ProcessParameters - > OnTerminate . BindLambda ( [ = ] ( )
{
UE_LOG ( LogShooter GameMode , Log , TEXT ( " Game Server Process is terminating " ) ) ;
UE_LOG ( LogDS_ GameMode , 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 ( LogShooter GameMode , Log , TEXT ( " Server process ending successfully " ) ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " Server process ending successfully " ) ) ;
}
else {
if ( ! processEndingOutcome . IsSuccess ( ) ) {
const FGameLiftError & error = processEndingOutcome . GetError ( ) ;
UE_LOG ( LogShooter GameMode , Error , TEXT ( " ProcessEnding() failed. Error: %s " ) ,
UE_LOG ( LogDS_ GameMode , 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 ( LogShooter GameMode , Error , TEXT ( " Destroy() failed. Error: %s " ) ,
UE_LOG ( LogDS_ GameMode , Error , TEXT ( " Destroy() failed. Error: %s " ) ,
error . m_errorMessage . IsEmpty ( ) ? TEXT ( " Unknown error " ) : * error . m_errorMessage ) ;
}
}
@@ -177,7 +165,7 @@ void AShooterGameMode::InitGameLift()
//In this case, we're always healthy!
ProcessParameters - > OnHealthCheck . BindLambda ( [ ] ( )
{
UE_LOG ( LogShooter GameMode , Log , TEXT ( " Performing Health Check " ) ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " Performing Health Check " ) ) ;
return true ;
} ) ;
@@ -187,31 +175,31 @@ void AShooterGameMode::InitGameLift()
Logfiles . Add ( TEXT ( " FPSTemplate/Saved/Log/server.log " ) ) ;
ProcessParameters - > logParameters = Logfiles ;
UE_LOGFMT ( LogShooter GameMode , Log , " Calling Process Ready... " ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " Calling Process Ready... " ) ;
FGameLiftGenericOutcome ProcessReadyOutcome = GameLiftSdkModule - > ProcessReady ( * ProcessParameters ) ;
if ( ProcessReadyOutcome . IsSuccess ( ) )
{
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_GREEN ) ;
UE_LOG ( LogShooter GameMode , Log , TEXT ( " Process Ready! " ) ) ;
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_GREEN ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " Process Ready! " ) ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
}
else
{
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_RED ) ;
UE_LOG ( LogShooter GameMode , Log , TEXT ( " ERROR: Process Ready Failed! " ) ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_RED ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " ERROR: Process Ready Failed! " ) ) ;
FGameLiftError ProcessReadyError = ProcessReadyOutcome . GetError ( ) ;
UE_LOG ( LogShooter GameMode , Log , TEXT ( " ERROR: %s " ) , * ProcessReadyError . m_errorMessage ) ;
UE_LOG ( LogShooter GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
UE_LOG ( LogDS_ GameMode , Log , TEXT ( " ERROR: %s " ) , * ProcessReadyError . m_errorMessage ) ;
UE_LOG ( LogDS_ GameMode , SetColor , TEXT ( " %s " ) , COLOR_NONE ) ;
return ;
}
UE_LOGFMT ( LogShooter GameMode , Log , " InitGameLift completed! " ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " InitGameLift completed! " ) ;
# endif
}
bool AShooter GameMode : : GetAnywhereFleetParameters ( const FString & CommandLineString )
bool ADS_ GameMode : : GetAnywhereFleetParameters ( const FString & CommandLineString )
{
bool bAllAnywhereFleetParametersValid = true ;
GameLiftConfig . AuthTokenResult = cmdlineparser : : GetValueOfToken ( CommandLineString , cmdlineparser : : details : : EAvailableTokens : : AuthToken ) ;
@@ -229,23 +217,23 @@ bool AShooterGameMode::GetAnywhereFleetParameters(const FString& CommandLineStri
return bAllAnywhereFleetParametersValid ;
}
void AShooter GameMode : : LogAnywhereFleetParameters ( )
void ADS_ GameMode : : LogAnywhereFleetParameters ( )
{
// Lambda for getting the token name from token
// Lambda for getting the token name from token
auto GetTokenName = [ ] ( const cmdlineparser : : details : : FParseResult & Result ) - > FString
{
return cmdlineparser : : details : : CLI_TOKENS [ static_cast < int32 > ( Result . Token ) ] ;
} ;
UE_LOGFMT ( LogShooter GameMode , Log , " Anywhere Fleet Parameters: " ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " Anywhere Fleet Parameters: " ) ;
if ( GameLiftConfig . AuthTokenResult . bIsValid )
{
UE_LOGFMT ( LogShooter GameMode , Log , " AuthToken: {0} " , GetValueOrHash ( GameLiftConfig . AuthTokenResult . Value ) ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " AuthToken: {0} " , GetValueOrHash ( GameLiftConfig . AuthTokenResult . Value ) ) ;
}
else
{
UE_LOGFMT (
LogShooter GameMode ,
LogDS_ GameMode ,
Error ,
" AuthToken: {0} " ,
FString : : Format (
@@ -260,12 +248,12 @@ void AShooterGameMode::LogAnywhereFleetParameters()
if ( GameLiftConfig . FleetIdResult . bIsValid )
{
UE_LOGFMT ( LogShooter GameMode , Log , " FleetId: {0} " , GameLiftConfig . FleetIdResult . Value ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " FleetId: {0} " , GameLiftConfig . FleetIdResult . Value ) ;
}
else
{
UE_LOGFMT (
LogShooter GameMode ,
LogDS_ GameMode ,
Error ,
" FleetId: {0} " ,
FString : : Format (
@@ -280,12 +268,12 @@ void AShooterGameMode::LogAnywhereFleetParameters()
if ( GameLiftConfig . HostIdResult . bIsValid )
{
UE_LOGFMT ( LogShooter GameMode , Log , " HostId: {0} " , GameLiftConfig . HostIdResult . Value ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " HostId: {0} " , GameLiftConfig . HostIdResult . Value ) ;
}
else
{
UE_LOGFMT (
LogShooter GameMode ,
LogDS_ GameMode ,
Error ,
" HostId: {0} " ,
FString : : Format (
@@ -300,12 +288,12 @@ void AShooterGameMode::LogAnywhereFleetParameters()
if ( GameLiftConfig . WebSocketUrlResult . bIsValid )
{
UE_LOGFMT ( LogShooter GameMode , Log , " WebSocketUrl: {0} " , GameLiftConfig . WebSocketUrlResult . Value ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " WebSocketUrl: {0} " , GameLiftConfig . WebSocketUrlResult . Value ) ;
}
else
{
UE_LOGFMT (
LogShooter GameMode ,
LogDS_ GameMode ,
Error ,
" WebSocketUrl: {0} " ,
FString : : Format (
@@ -318,49 +306,48 @@ void AShooterGameMode::LogAnywhereFleetParameters()
) ;
}
UE_LOGFMT ( LogShooter GameMode , Log , " Server Port: {0} " , GameLiftConfig . ServerPort ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " Server Port: {0} " , GameLiftConfig . ServerPort ) ;
if ( GameLiftConfig . bAllOptionsFound )
{
UE_LOGFMT ( LogShooter GameMode , Log , " Anywhere Fleet Parameters Loaded Successfully.... " ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " Anywhere Fleet Parameters Loaded Successfully.... " ) ;
}
else
{
UE_LOGFMT ( LogShooter GameMode , Error , " Anywhere Fleet Parameters Load FAILED.... " ) ;
UE_LOGFMT ( LogDS_ GameMode , Error , " Anywhere Fleet Parameters Load FAILED.... " ) ;
}
}
void AShooter GameMode : : LogServerParameters ( const FServerParameters & InServerParameters )
void ADS_ GameMode : : LogServerParameters ( const FServerParameters & InServerParameters )
{
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> WebSocket URL: {WebSocketUrl } " , InServerParameters . m_webSocketUrl ) ;
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> Fleet ID: {Fleet Id} " , InServerParameters . m_fleet Id ) ;
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> Process ID: {Process Id} " , InServerParameters . m_process Id ) ;
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> Host ID (Compute Name): {HostId} " , InServerParameters . m_hostId ) ;
UE_LOGFMT ( LogShooterGameMode , Log , " >>>> Auth Token: {AuthToken} " , GetValueOrHash ( InServerParameters . m_authToken ) ) ;
UE_LOGFMT ( LogDS_GameMode , Log , " >>>> WebSocket URL: {WebSocketUrl} " , InServerParameters . m_webSocketUrl ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Fleet ID: {FleetId } " , InServerParameters . m_fleetId ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Process ID: {Process Id} " , InServerParameters . m_process Id ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Host ID (Compute Name): {Host Id} " , InServerParameters . m_host Id ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Auth Token: {AuthToken} " , GetValueOrHash ( InServerParameters . m_authToken ) ) ;
if ( ! InServerParameters . m_awsRegion . IsEmpty ( ) )
{
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> Aws Region: {AwsRegion} " , InServerParameters . m_awsRegion ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Aws Region: {AwsRegion} " , InServerParameters . m_awsRegion ) ;
}
if ( ! InServerParameters . m_accessKey . IsEmpty ( ) )
{
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> Access Key: {AccessKey} " , GetValueOrHash ( InServerParameters . m_accessKey ) ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Access Key: {AccessKey} " , GetValueOrHash ( InServerParameters . m_accessKey ) ) ;
}
if ( ! InServerParameters . m_secretKey . IsEmpty ( ) )
{
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> Secret Key: {SecretKey} " , GetValueOrHash ( InServerParameters . m_secretKey ) ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Secret Key: {SecretKey} " , GetValueOrHash ( InServerParameters . m_secretKey ) ) ;
}
if ( ! InServerParameters . m_sessionToken . IsEmpty ( ) )
{
UE_LOGFMT ( LogShooter GameMode , Log , " >>>> Session Token: {SessionToken} " , GetValueOrHash ( InServerParameters . m_sessionToken ) ) ;
UE_LOGFMT ( LogDS_ GameMode , Log , " >>>> Session Token: {SessionToken} " , GetValueOrHash ( InServerParameters . m_sessionToken ) ) ;
}
}
FString AShooter GameMode : : GetValueOrHash ( const FString & Value )
FString ADS_ GameMode : : GetValueOrHash ( const FString & Value )
{
# if UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT
return Value ;