From 1f133ea702a094c9ad107be65856fa9835bc8810 Mon Sep 17 00:00:00 2001 From: SNMetamorph <25657591+SNMetamorph@users.noreply.github.com> Date: Mon, 9 Mar 2026 22:41:55 +0400 Subject: [PATCH] engine: client: add steam broker messages for game init & shutdown events --- engine/client/cl_main.c | 2 +- engine/client/cl_steam.c | 49 ++++++++++++++++++++++++++++++++++++---- engine/client/client.h | 2 ++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 2220cfc4..b72447f5 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -94,7 +94,7 @@ static CVAR_DEFINE_AUTO( topcolor, "0", FCVAR_USERINFO|FCVAR_ARCHIVE|FCVAR_FILTE static CVAR_DEFINE_AUTO( bottomcolor, "0", FCVAR_USERINFO|FCVAR_ARCHIVE|FCVAR_FILTERABLE, "player bottom color" ); CVAR_DEFINE_AUTO( rate, "25000", FCVAR_USERINFO|FCVAR_ARCHIVE|FCVAR_FILTERABLE, "player network rate" ); -static CVAR_DEFINE_AUTO( cl_ticket_generator, "revemu2013", FCVAR_ARCHIVE, "you wouldn't steal a car" ); +CVAR_DEFINE_AUTO( cl_ticket_generator, "revemu2013", FCVAR_ARCHIVE, "you wouldn't steal a car" ); static CVAR_DEFINE_AUTO( cl_advertise_engine_in_name, "1", FCVAR_ARCHIVE|FCVAR_PRIVILEGED, "add [Xash3D] to the nickname when connecting to GoldSrc servers" ); static CVAR_DEFINE_AUTO( cl_log_outofband, "0", FCVAR_ARCHIVE, "log out of band messages, can be useful for server admins and for engine debugging" ); static CVAR_DEFINE_AUTO( cl_autorecord, "0", 0, "automatically start recording a demo after joining the server" ); diff --git a/engine/client/cl_steam.c b/engine/client/cl_steam.c index 5cf8d624..398e5391 100644 --- a/engine/client/cl_steam.c +++ b/engine/client/cl_steam.c @@ -41,15 +41,22 @@ static struct netadr_t serveradr; } broker; -qboolean SteamBroker_InitiateGameConnection( netadr_t serveradr, int challenge ) +static qboolean SteamBroker_UpdateBrokerAddress( void ) { if( NET_NetadrType( &broker.adr ) == NA_UNDEFINED ) { if( !NET_StringToAdr( cl_steam_broker_addr.string, &broker.adr )) - { - Con_Printf( "%s: NET_StringToAdr( %s ) failed\n", __func__, cl_steam_broker_addr.string ); return false; - } + } + return true; +} + +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 @@ -88,6 +95,39 @@ void SteamBroker_TerminateGameConnection( void ) NET_NetadrSetType( &broker.adr, NA_UNDEFINED ); } +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]; + int len = Q_snprintf( buf, sizeof( buf ), "sb_gamedir %s", gamedir ); + + NET_SendPacket( NS_CLIENT, len, buf, broker.adr ); +} + +void SteamBroker_AnnounceGameShutdown( void ) +{ + 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_SendPacket( NS_CLIENT, sizeof( "sb_terminate" ) - 1, "sb_terminate", broker.adr ); +} + void SteamBroker_HandlePacket( netadr_t from, sizebuf_t *msg ) { // message format @@ -127,4 +167,5 @@ void SteamBroker_Init( void ) void SteamBroker_Shutdown( void ) { + SteamBroker_AnnounceGameShutdown(); } diff --git a/engine/client/client.h b/engine/client/client.h index 0e3e8578..45a56f02 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -723,6 +723,7 @@ extern convar_t scr_loading; extern convar_t v_dark; // start from dark extern convar_t net_graph; extern convar_t rate; +extern convar_t cl_ticket_generator; extern convar_t m_ignore; extern convar_t r_showtree; extern convar_t ui_renderworld; @@ -1214,6 +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_HandlePacket( netadr_t from, sizebuf_t *msg ); int SteamBroker_InitiateGameConnection( netadr_t serveradr, int challenge ); void SteamBroker_TerminateGameConnection( void );