From bd73775a2ff3c7e8b83f5c8ab342688f7bea62d0 Mon Sep 17 00:00:00 2001 From: SNMetamorph <25657591+SNMetamorph@users.noreply.github.com> Date: Mon, 9 Mar 2026 22:52:16 +0400 Subject: [PATCH] engine: client: refactor steam broker internal logic --- engine/client/cl_main.c | 2 ++ engine/client/cl_steam.c | 76 +++++++++++++++++++++++++++------------- engine/client/client.h | 2 +- 3 files changed, 55 insertions(+), 25 deletions(-) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index b72447f5..5c881008 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -3594,6 +3594,8 @@ void Host_ClientBegin( void ) // if running the server locally, make intentions now if( SV_Active( )) CL_SendCommand (); + + SteamBroker_Frame(); } /* diff --git a/engine/client/cl_steam.c b/engine/client/cl_steam.c index 398e5391..34ecedd2 100644 --- a/engine/client/cl_steam.c +++ b/engine/client/cl_steam.c @@ -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 @@ -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 ); } diff --git a/engine/client/client.h b/engine/client/client.h index 45a56f02..323d0772 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -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 );