engine: client: refactor steam broker internal logic

This commit is contained in:
SNMetamorph
2026-03-09 22:52:16 +04:00
committed by a1batross
parent 1f133ea702
commit bd73775a2f
3 changed files with 55 additions and 25 deletions

View File

@@ -3594,6 +3594,8 @@ void Host_ClientBegin( void )
// if running the server locally, make intentions now
if( SV_Active( )) CL_SendCommand ();
SteamBroker_Frame();
}
/*

View File

@@ -36,9 +36,10 @@ static CVAR_DEFINE_AUTO( cl_steam_broker_addr, "127.0.0.1:27420", FCVAR_ARCHIVE,
static struct
{
netadr_t adr;
int challenge;
netadr_t serveradr;
qboolean announced;
qboolean addr_initialized;
} broker;
static qboolean SteamBroker_UpdateBrokerAddress( void )
@@ -53,12 +54,6 @@ static qboolean SteamBroker_UpdateBrokerAddress( void )
qboolean SteamBroker_InitiateGameConnection( netadr_t serveradr, int challenge )
{
if( !SteamBroker_UpdateBrokerAddress( ))
{
Con_Printf( "%s: failed to resolve broker address \"%s\"\n", __func__, cl_steam_broker_addr.string );
return false;
}
// only ipv4 supported
if( NET_NetadrType( &serveradr ) != NA_IP )
return false;
@@ -78,13 +73,10 @@ qboolean SteamBroker_InitiateGameConnection( netadr_t serveradr, int challenge )
void SteamBroker_TerminateGameConnection( void )
{
if( NET_NetadrType( &broker.adr ) == NA_UNDEFINED )
return;
if( NET_NetadrType( &cls.serveradr ) != NA_IP )
return;
if( cls.legacymode != PROTO_GOLDSRC )
if( Q_stricmp( cl_ticket_generator.string, "steam" ) != 0 )
return;
// sb_disconnect <ip:port> <challenge>
@@ -92,7 +84,6 @@ void SteamBroker_TerminateGameConnection( void )
int len = Q_snprintf( buf, sizeof( buf ), "sb_disconnect %s %d", NET_AdrToString( cls.serveradr ), broker.challenge );
NET_SendPacket( NS_CLIENT, len, buf, broker.adr );
NET_NetadrSetType( &broker.adr, NA_UNDEFINED );
}
void SteamBroker_AnnounceGameStart( const char *gamedir )
@@ -100,12 +91,6 @@ void SteamBroker_AnnounceGameStart( const char *gamedir )
if( Q_stricmp( cl_ticket_generator.string, "steam" ) != 0 )
return;
if( !SteamBroker_UpdateBrokerAddress( ))
{
Con_Printf( "%s: failed to resolve broker address \"%s\"\n", __func__, cl_steam_broker_addr.string );
return;
}
NET_Config( true, true ); // initialize sockets to be able to send packets to broker
char buf[512];
@@ -114,18 +99,56 @@ void SteamBroker_AnnounceGameStart( const char *gamedir )
NET_SendPacket( NS_CLIENT, len, buf, broker.adr );
}
void SteamBroker_AnnounceGameShutdown( void )
void SteamBroker_AnnounceGameShutdown( netadr_t broker_addr )
{
NET_SendPacket( NS_CLIENT, sizeof( "sb_terminate" ) - 1, "sb_terminate", broker_addr );
}
void SteamBroker_Frame( void )
{
if( Q_stricmp( cl_ticket_generator.string, "steam" ) != 0 )
return;
if( !SteamBroker_UpdateBrokerAddress( ))
qboolean restart = FBitSet( cl_steam_broker_addr.flags|cl_ticket_generator.flags, FCVAR_CHANGED );
if( !broker.addr_initialized )
{
Con_Printf( "%s: failed to resolve broker address \"%s\"\n", __func__, cl_steam_broker_addr.string );
return;
if( !SteamBroker_UpdateBrokerAddress( ))
{
Con_Printf( "%s: failed to resolve broker address \"%s\"\n", __func__, cl_steam_broker_addr.string );
return;
}
else
{
broker.addr_initialized = true;
}
}
NET_SendPacket( NS_CLIENT, sizeof( "sb_terminate" ) - 1, "sb_terminate", broker.adr );
if( restart )
{
broker.announced = false;
ClearBits( cl_ticket_generator.flags, FCVAR_CHANGED );
ClearBits( cl_steam_broker_addr.flags, FCVAR_CHANGED );
}
if( !broker.announced )
{
netadr_t previous_addr = broker.adr;
if( !SteamBroker_UpdateBrokerAddress( ))
{
Con_Printf( "%s: failed to resolve broker address \"%s\"\n", __func__, cl_steam_broker_addr.string );
}
else
{
if( restart )
{
// terminate old steam broker if instance address has changed
SteamBroker_AnnounceGameShutdown( previous_addr );
}
SteamBroker_AnnounceGameStart( GI->gamefolder );
}
broker.announced = true;
}
}
void SteamBroker_HandlePacket( netadr_t from, sizebuf_t *msg )
@@ -161,11 +184,16 @@ void SteamBroker_HandlePacket( netadr_t from, sizebuf_t *msg )
void SteamBroker_Init( void )
{
broker.announced = false;
broker.addr_initialized = false;
Cvar_RegisterVariable( &cl_steam_broker_addr );
NET_NetadrSetType( &broker.adr, NA_UNDEFINED );
}
void SteamBroker_Shutdown( void )
{
SteamBroker_AnnounceGameShutdown();
if( Q_stricmp( cl_ticket_generator.string, "steam" ) != 0 )
return;
SteamBroker_AnnounceGameShutdown( broker.adr );
}

View File

@@ -1215,7 +1215,7 @@ void CL_GetSecuredClientAPI( CL_EXPORT_FUNCS F );
//
void SteamBroker_Init( void );
void SteamBroker_Shutdown( void );
void SteamBroker_AnnounceGameStart( const char *gamedir );
void SteamBroker_Frame( void );
void SteamBroker_HandlePacket( netadr_t from, sizebuf_t *msg );
int SteamBroker_InitiateGameConnection( netadr_t serveradr, int challenge );
void SteamBroker_TerminateGameConnection( void );