//----------------------------------------------------------------------------- // Purpose: Constructor -- note the syntax for setting up Steam API callback handlers //----------------------------------------------------------------------------- CSpaceWarServer::CSpaceWarServer( IGameEngine *pGameEngine ) { m_bConnectedToSteam = false; const char *pchGameDir = "spacewar"; uint32 unIP = INADDR_ANY; uint16 usMasterServerUpdaterPort = SPACEWAR_MASTER_SERVER_UPDATER_PORT; #ifdef USE_GS_AUTH_API EServerMode eMode = eServerModeAuthenticationAndSecure; #else // Don't let Steam do authentication EServerMode eMode = eServerModeNoAuthentication; #endif // Initialize the SteamGameServer interface, we tell it some info about us, and we request support // for both Authentication (making sure users own games) and secure mode, VAC running in our game // and kicking users who are VAC banned // !FIXME! We need a way to pass the dedicated server flag here! #ifdef _PS3 if ( !SteamGameServer_Init( &g_SteamPS3Params, unIP, SPACEWAR_AUTHENTICATION_PORT, SPACEWAR_SERVER_PORT, usMasterServerUpdaterPort, eMode, SPACEWAR_SERVER_VERSION ) ) #else if ( !SteamGameServer_Init( unIP, SPACEWAR_AUTHENTICATION_PORT, SPACEWAR_SERVER_PORT, usMasterServerUpdaterPort, eMode, SPACEWAR_SERVER_VERSION ) ) #endif { OutputDebugString( "SteamGameServer_Init call failed\n" ); } if ( SteamGameServer() ) { // Set the "game dir". // This is currently required for all games. However, soon we will be // using the AppID for most purposes, and this string will only be needed // for mods. it may not be changed after the server has logged on SteamGameServer()->SetModDir( pchGameDir ); // These fields are currently required, but will go away soon. // See their documentation for more info SteamGameServer()->SetProduct( "SteamworksExample" ); SteamGameServer()->SetGameDescription( "Steamworks Example" ); // We don't support specators in our game. // .... but if we did: //SteamGameServer()->SetSpectatorPort( ... ); //SteamGameServer()->SetSpectatorServerName( ... ); // Initiate Anonymous logon. // Coming soon: Logging into authenticated, persistent game server account SteamGameServer()->LogOnAnonymous(); // We want to actively update the master server with our presence so players can // find us via the steam matchmaking/server browser interfaces #ifdef USE_GS_AUTH_API SteamGameServer()->EnableHeartbeats( true ); #endif } else { OutputDebugString( "SteamGameServer() interface is invalid\n" ); } m_uPlayerCount = 0; m_pGameEngine = pGameEngine; m_eGameState = k_EServerWaitingForPlayers; for( uint32 i = 0; i < MAX_PLAYERS_PER_SERVER; ++i ) { m_rguPlayerScores[i] = 0; m_rgpShips[i] = NULL; } // No one has won m_uPlayerWhoWonGame = 0; m_ulStateTransitionTime = m_pGameEngine->GetGameTickCount(); m_ulLastServerUpdateTick = 0; // zero the client connection data memset( &m_rgClientData, 0, sizeof( m_rgClientData ) ); memset( &m_rgPendingClientData, 0, sizeof( m_rgPendingClientData ) ); // Seed random num generator srand( (uint32)time( NULL ) ); // Initialize sun m_pSun = new CSun( pGameEngine ); // Initialize ships ResetPlayerShips(); }
SB_API bool S_CALLTYPE GameServer_Init(const SteamPS3Params_t *ps3Params, uint32 unIP, uint16 usSteamPort, uint16 usGamePort, uint16 usQueryPort, EServerMode eServerMode, const char *pchVersionString) { return SteamGameServer_Init(ps3Params, unIP, usSteamPort, usGamePort, usQueryPort, eServerMode, pchVersionString); }
bool FOnlineSubsystemSteam::InitSteamworksServer() { bSteamworksGameServerInitialized = false; // Initialize the Steam game server interfaces (done regardless of whether or not a server will be setup) // NOTE: The port values specified here, are not changeable once the interface is setup uint32 LocalServerIP = 0; FString MultiHome; if (FParse::Value(FCommandLine::Get(), TEXT("MULTIHOME="), MultiHome) && !MultiHome.IsEmpty()) { TSharedRef<FInternetAddr> MultiHomeIP = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(); bool bIsValidIP = false; MultiHomeIP->SetIp(*MultiHome, bIsValidIP); if (bIsValidIP) { MultiHomeIP->GetIp(LocalServerIP); } } GConfig->GetInt(TEXT("URL"), TEXT("Port"), GameServerGamePort, GEngineIni); GameServerSteamPort = GameServerGamePort + 1; // Allow the command line to override the default query port if (FParse::Value(FCommandLine::Get(), TEXT("QueryPort="), GameServerQueryPort) == false) { if (!GConfig->GetInt(TEXT("OnlineSubsystemSteam"), TEXT("GameServerQueryPort"), GameServerQueryPort, GEngineIni)) { GameServerQueryPort = 27015; } } bool bVACEnabled = false; GConfig->GetBool(TEXT("OnlineSubsystemSteam"), TEXT("bVACEnabled"), bVACEnabled, GEngineIni); FString GameVersion; GConfig->GetString(TEXT("OnlineSubsystemSteam"), TEXT("GameVersion"), GameVersion, GEngineIni); if (GameVersion.Len() == 0) { UE_LOG_ONLINE(Warning, TEXT("[OnlineSubsystemSteam].GameVersion is not set. Server advertising will fail")); } // NOTE: IP of 0 causes SteamGameServer_Init to automatically use the public (external) IP UE_LOG_ONLINE(Verbose, TEXT("Initializing Steam Game Server IP: 0x%08X Port: %d SteamPort: %d QueryPort: %d"), LocalServerIP, GameServerGamePort, GameServerSteamPort, GameServerQueryPort); bSteamworksGameServerInitialized = SteamGameServer_Init(LocalServerIP, GameServerSteamPort, GameServerGamePort, GameServerQueryPort, (bVACEnabled ? eServerModeAuthenticationAndSecure : eServerModeAuthentication), TCHAR_TO_UTF8(*GameVersion)); if (bSteamworksGameServerInitialized) { // Test all the Steam interfaces #define GET_STEAMWORKS_INTERFACE(Interface) \ if (Interface() == nullptr) \ { \ UE_LOG_ONLINE(Warning, TEXT("Steamworks: %s() failed!"), TEXT(#Interface)); \ bSteamworksGameServerInitialized = false; \ } \ // NOTE: It's not possible for >some< of the interfaces to initialize, and others fail; it's all or none GET_STEAMWORKS_INTERFACE(SteamGameServer); GET_STEAMWORKS_INTERFACE(SteamGameServerStats); GET_STEAMWORKS_INTERFACE(SteamGameServerNetworking); GET_STEAMWORKS_INTERFACE(SteamGameServerUtils); #undef GET_STEAMWORKS_INTERFACE } if (SteamGameServerUtils() != nullptr) { SteamAppID = SteamGameServerUtils()->GetAppID(); SteamGameServerUtils()->SetWarningMessageHook(SteamworksWarningMessageHook); } UE_LOG_ONLINE(Log, TEXT("[AppId: %d] Game Server API initialized %i"), GetSteamAppId(), bSteamworksGameServerInitialized); return bSteamworksGameServerInitialized; }