Add support for isteamgameserver 005-011

This commit is contained in:
Mr_Goldberg 2019-05-20 12:35:55 -04:00
parent 2b1368ccac
commit 68b8e0241a
No known key found for this signature in database
GPG key ID: 8597D87419DEF278
10 changed files with 865 additions and 6 deletions

View file

@ -482,9 +482,33 @@ S_API HSteamUser S_CALLTYPE SteamGameServer_GetHSteamUser()
return SERVER_HSTEAMUSER;
}
S_API bool S_CALLTYPE SteamGameServer_InitSafe(uint32 unIP, uint16 usSteamPort, uint16 usGamePort, uint16 usQueryPort, EServerMode eServerMode, const char *pchVersionString )
//See: SteamGameServer_Init
//S_API bool S_CALLTYPE SteamGameServer_InitSafe(uint32 unIP, uint16 usSteamPort, uint16 usGamePort, uint16 usQueryPort, EServerMode eServerMode, const char *pchVersionString )
S_API bool S_CALLTYPE SteamGameServer_InitSafe( uint32 unIP, uint16 usSteamPort, uint16 usGamePort, uint16 unknown, EServerMode eServerMode, void *unknown1, void *unknown2, void *unknown3 )
{
return SteamInternal_GameServer_Init( unIP, usSteamPort, usGamePort, usQueryPort, eServerMode, pchVersionString );
const char *pchVersionString;
EServerMode serverMode;
uint16 usQueryPort;
SteamGameServerClient();
bool logon_anon = false;
if (strcmp(old_gameserver, "SteamGameServer010") == 0 || strstr(old_gameserver, "SteamGameServer00") == old_gameserver) {
PRINT_DEBUG("Old game server init safe\n");
pchVersionString = (char *)unknown3;
memcpy(&serverMode, &unknown1, sizeof(serverMode));
memcpy(&usQueryPort, (char *)&eServerMode, sizeof(usQueryPort));
logon_anon = true;
} else {
pchVersionString = (char *)unknown1;
serverMode = eServerMode;
usQueryPort = unknown;
}
bool ret = SteamInternal_GameServer_Init( unIP, usSteamPort, usGamePort, usQueryPort, serverMode, pchVersionString );
if (logon_anon) {
get_steam_client()->steam_gameserver->LogOnAnonymous();
}
return ret;
}
S_API bool S_CALLTYPE SteamInternal_GameServer_Init( uint32 unIP, uint16 usPort, uint16 usGamePort, uint16 usQueryPort, EServerMode eServerMode, const char *pchVersionString )
@ -495,9 +519,37 @@ S_API bool S_CALLTYPE SteamInternal_GameServer_Init( uint32 unIP, uint16 usPort,
return get_steam_client()->steam_gameserver->InitGameServer(unIP, usGamePort, usQueryPort, eServerMode, 0, pchVersionString);
}
S_API bool SteamGameServer_Init( uint32 unIP, uint16 usSteamPort, uint16 usGamePort, uint16 usQueryPort, EServerMode eServerMode, const char *pchVersionString )
//SteamGameServer004 and before:
//S_API bool SteamGameServer_Init( uint32 unIP, uint16 usPort, uint16 usGamePort, uint16 usSpectatorPort, uint16 usQueryPort, EServerMode eServerMode, int nGameAppId, const char *pchGameDir, const char *pchVersionString );
//SteamGameServer010 and before:
//S_API bool SteamGameServer_Init( uint32 unIP, uint16 usPort, uint16 usGamePort, uint16 usSpectatorPort, uint16 usQueryPort, EServerMode eServerMode, const char *pchGameDir, const char *pchVersionString );
//SteamGameServer011 and later:
//S_API bool SteamGameServer_Init( uint32 unIP, uint16 usSteamPort, uint16 usGamePort, uint16 usQueryPort, EServerMode eServerMode, const char *pchVersionString );
S_API bool SteamGameServer_Init( uint32 unIP, uint16 usSteamPort, uint16 usGamePort, uint16 unknown, EServerMode eServerMode, void *unknown1, void *unknown2, void *unknown3 )
{
return SteamInternal_GameServer_Init( unIP, usSteamPort, usGamePort, usQueryPort, eServerMode, pchVersionString );
const char *pchVersionString;
EServerMode serverMode;
uint16 usQueryPort;
SteamGameServerClient();
bool logon_anon = false;
if (strcmp(old_gameserver, "SteamGameServer010") == 0 || strstr(old_gameserver, "SteamGameServer00") == old_gameserver) {
PRINT_DEBUG("Old game server init\n");
pchVersionString = (char *)unknown3;
memcpy(&serverMode, &unknown1, sizeof(serverMode));
memcpy(&usQueryPort, (char *)&eServerMode, sizeof(usQueryPort));
logon_anon = true;
} else {
pchVersionString = (char *)unknown1;
serverMode = eServerMode;
usQueryPort = unknown;
}
bool ret = SteamInternal_GameServer_Init( unIP, usSteamPort, usGamePort, usQueryPort, serverMode, pchVersionString );
if (logon_anon) {
get_steam_client()->steam_gameserver->LogOnAnonymous();
}
return ret;
}
S_API void SteamGameServer_Shutdown()

View file

@ -477,6 +477,26 @@ ISteamGameServer *Steam_Client::GetISteamGameServer( HSteamUser hSteamUser, HSte
PRINT_DEBUG("GetISteamGameServer %s\n", pchVersion);
if (!hSteamPipe || !hSteamUser) return NULL;
if (!server_init) return NULL;
if (strcmp(pchVersion, "SteamGameServer005") == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer005 *)steam_gameserver;
} else if (strcmp(pchVersion, "SteamGameServer006") == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer008 *)steam_gameserver;
} else if (strcmp(pchVersion, "SteamGameServer007") == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer008 *)steam_gameserver;
} else if (strcmp(pchVersion, "SteamGameServer008") == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer008 *)steam_gameserver;
} else if (strcmp(pchVersion, "SteamGameServer009") == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer009 *)steam_gameserver;
} else if (strcmp(pchVersion, "SteamGameServer010") == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer010 *)steam_gameserver;
} else if (strcmp(pchVersion, "SteamGameServer011") == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer011 *)steam_gameserver;
} else if (strcmp(pchVersion, STEAMGAMESERVER_INTERFACE_VERSION) == 0) {
return (ISteamGameServer *)(void *)(ISteamGameServer *)steam_gameserver;
} else {
return (ISteamGameServer *)(void *)(ISteamGameServer *)steam_gameserver;
}
return steam_gameserver;
}

View file

@ -55,6 +55,7 @@ bool Steam_GameServer::InitGameServer( uint32 unIP, uint16 usGamePort, uint16 us
server_data.set_query_port(usQueryPort);
server_data.set_offline(false);
if (!settings->get_local_game_id().AppID()) settings->set_game_id(CGameID(nGameAppId));
//TODO: flags should be k_unServerFlag
flags = unFlags;
policy_response_called = false;
call_servers_connected = false;
@ -123,6 +124,14 @@ void Steam_GameServer::LogOn( const char *pszToken )
logged_in = true;
}
void Steam_GameServer::LogOn(
const char *pszAccountName,
const char *pszPassword
)
{
PRINT_DEBUG("LogOn %s %s\n", pszAccountName, pszPassword);
LogOn(pszAccountName);
}
/// Login to a generic, anonymous account.
///
@ -136,6 +145,11 @@ void Steam_GameServer::LogOnAnonymous()
logged_in = true;
}
void Steam_GameServer::LogOn()
{
PRINT_DEBUG("LogOn\n");
LogOnAnonymous();
}
/// Begin process of logging game server out of steam
void Steam_GameServer::LogOff()
@ -370,6 +384,78 @@ bool Steam_GameServer::BUpdateUserData( CSteamID steamIDUser, const char *pchPla
return true;
}
// You shouldn't need to call this as it is called internally by SteamGameServer_Init() and can only be called once.
//
// To update the data in this call which may change during the servers lifetime see UpdateServerStatus() below.
//
// Input: nGameAppID - The Steam assigned AppID for the game
// unServerFlags - Any applicable combination of flags (see k_unServerFlag____ constants below)
// unGameIP - The IP Address the server is listening for client connections on (might be INADDR_ANY)
// unGamePort - The port which the server is listening for client connections on
// unSpectatorPort - the port on which spectators can join to observe the server, 0 if spectating is not supported
// usQueryPort - The port which the ISteamMasterServerUpdater API should use in order to listen for matchmaking requests
// pchGameDir - A unique string identifier for your game
// pchVersion - The current version of the server as a string like 1.0.0.0
// bLanMode - Is this a LAN only server?
//
// bugbug jmccaskey - figure out how to remove this from the API and only expose via SteamGameServer_Init... or make this actually used,
// and stop calling it in SteamGameServer_Init()?
bool Steam_GameServer::BSetServerType( uint32 unServerFlags, uint32 unGameIP, uint16 unGamePort,
uint16 unSpectatorPort, uint16 usQueryPort, const char *pchGameDir, const char *pchVersion, bool bLANMode )
{
PRINT_DEBUG("BSetServerType\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex);
server_data.set_ip(unGameIP);
server_data.set_port(unGamePort);
server_data.set_query_port(usQueryPort);
server_data.set_spectator_port(unSpectatorPort);
std::string version(pchVersion);
version.erase(std::remove(version.begin(), version.end(), ' '), version.end());
version.erase(std::remove(version.begin(), version.end(), '.'), version.end());
server_data.set_version(stoi(version));
//TODO?
return true;
}
// Updates server status values which shows up in the server browser and matchmaking APIs
void Steam_GameServer::UpdateServerStatus( int cPlayers, int cPlayersMax, int cBotPlayers,
const char *pchServerName, const char *pSpectatorServerName,
const char *pchMapName )
{
PRINT_DEBUG("UpdateServerStatus\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex);
server_data.set_num_players(cPlayers);
server_data.set_max_player_count(cPlayersMax);
server_data.set_bot_player_count(cBotPlayers);
server_data.set_server_name(pchServerName);
server_data.set_spectator_server_name(pSpectatorServerName);
server_data.set_map_name(pchMapName);
}
// This can be called if spectator goes away or comes back (passing 0 means there is no spectator server now).
void Steam_GameServer::UpdateSpectatorPort( uint16 unSpectatorPort )
{
PRINT_DEBUG("UpdateSpectatorPort\n");
SetSpectatorPort(unSpectatorPort);
}
// Sets a string defining the "gametype" for this server, this is optional, but if it is set
// it allows users to filter in the matchmaking/server-browser interfaces based on the value
void Steam_GameServer::SetGameType( const char *pchGameType )
{
PRINT_DEBUG("SetGameType\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex);
}
// Ask if a user has a specific achievement for this game, will get a callback on reply
bool Steam_GameServer::BGetUserAchievementStatus( CSteamID steamID, const char *pchAchievementName )
{
PRINT_DEBUG("BGetUserAchievementStatus\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex);
return false;
}
// New auth system APIs - do not mix with the old auth system APIs.
// ----------------------------------------------------------------

View file

@ -28,7 +28,13 @@ struct Gameserver_Outgoing_Packet {
uint16 port;
};
class Steam_GameServer : public ISteamGameServer
class Steam_GameServer :
public ISteamGameServer005,
public ISteamGameServer008,
public ISteamGameServer009,
public ISteamGameServer010,
public ISteamGameServer011,
public ISteamGameServer
{
class Settings *settings;
class Networking *network;
@ -88,6 +94,11 @@ public:
/// @see SteamServerConnectFailure_t
/// @see SteamServersDisconnected_t
void LogOn( const char *pszToken );
void LogOn(
const char *pszAccountName,
const char *pszPassword
);
void LogOn();
/// Login to a generic, anonymous account.
///
@ -195,6 +206,40 @@ public:
// Return Value: true if successful, false if failure (ie, steamIDUser wasn't for an active player)
bool BUpdateUserData( CSteamID steamIDUser, const char *pchPlayerName, uint32 uScore );
// You shouldn't need to call this as it is called internally by SteamGameServer_Init() and can only be called once.
//
// To update the data in this call which may change during the servers lifetime see UpdateServerStatus() below.
//
// Input: nGameAppID - The Steam assigned AppID for the game
// unServerFlags - Any applicable combination of flags (see k_unServerFlag____ constants below)
// unGameIP - The IP Address the server is listening for client connections on (might be INADDR_ANY)
// unGamePort - The port which the server is listening for client connections on
// unSpectatorPort - the port on which spectators can join to observe the server, 0 if spectating is not supported
// usQueryPort - The port which the ISteamMasterServerUpdater API should use in order to listen for matchmaking requests
// pchGameDir - A unique string identifier for your game
// pchVersion - The current version of the server as a string like 1.0.0.0
// bLanMode - Is this a LAN only server?
//
// bugbug jmccaskey - figure out how to remove this from the API and only expose via SteamGameServer_Init... or make this actually used,
// and stop calling it in SteamGameServer_Init()?
bool BSetServerType( uint32 unServerFlags, uint32 unGameIP, uint16 unGamePort,
uint16 unSpectatorPort, uint16 usQueryPort, const char *pchGameDir, const char *pchVersion, bool bLANMode );
// Updates server status values which shows up in the server browser and matchmaking APIs
void UpdateServerStatus( int cPlayers, int cPlayersMax, int cBotPlayers,
const char *pchServerName, const char *pSpectatorServerName,
const char *pchMapName );
// This can be called if spectator goes away or comes back (passing 0 means there is no spectator server now).
void UpdateSpectatorPort( uint16 unSpectatorPort );
// Sets a string defining the "gametype" for this server, this is optional, but if it is set
// it allows users to filter in the matchmaking/server-browser interfaces based on the value
void SetGameType( const char *pchGameType );
// Ask if a user has a specific achievement for this game, will get a callback on reply
bool BGetUserAchievementStatus( CSteamID steamID, const char *pchAchievementName );
// New auth system APIs - do not mix with the old auth system APIs.
// ----------------------------------------------------------------