mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2025-12-05 03:34:52 +01:00
Add support for isteamgameserver 005-011
This commit is contained in:
parent
2b1368ccac
commit
68b8e0241a
10 changed files with 865 additions and 6 deletions
60
dll/dll.cpp
60
dll/dll.cpp
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
// ----------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue