From 551ea71906e3cf9e069c727daf395caf5bb6a8b1 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Wed, 17 May 2023 17:25:45 +0300 Subject: [PATCH] engine: server: make generic function to kick players with a reason --- engine/server/server.h | 1 + engine/server/sv_client.c | 45 +++++++++++++++++++++++++++++++++++++++ engine/server/sv_cmds.c | 35 ++---------------------------- 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/engine/server/server.h b/engine/server/server.h index 4515d8e6..2e7a2d37 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -457,6 +457,7 @@ extern convar_t *sv_validate_changelevel; // sv_main.c // void SV_FinalMessage( const char *message, qboolean reconnect ); +void SV_KickPlayer( sv_client_t *cl, const char *fmt, ... ) _format( 2 ); void SV_DropClient( sv_client_t *cl, qboolean crash ); void SV_UpdateMovevars( qboolean initialize ); int SV_ModelIndex( const char *name ); diff --git a/engine/server/sv_client.c b/engine/server/sv_client.c index 95fc2aaa..6eb275f4 100644 --- a/engine/server/sv_client.c +++ b/engine/server/sv_client.c @@ -547,6 +547,51 @@ edict_t *SV_FakeConnect( const char *netname ) return cl->edict; } +/* +================== +SV_Kick_f + +Kick a user off of the server +================== +*/ +void SV_KickPlayer( sv_client_t *cl, const char *fmt, ... ) +{ + const char *clientId; + va_list va; + char buf[MAX_VA_STRING]; + + if( NET_IsLocalAddress( cl->netchan.remote_address )) + { + Con_Printf( "The local player cannot be kicked!\n" ); + return; + } + + clientId = SV_GetClientIDString( cl ); + + va_start( va, fmt ); + Q_vsnprintf( buf, sizeof( buf ), fmt, va ); + va_end( va ); + + if( buf[0] ) + { + Log_Printf( "Kick: \"%s<%i><%s><>\" was kicked by \"Console\" (message \"%s\")\n", cl->name, cl->userid, clientId, buf ); + SV_BroadcastPrintf( cl, "%s was kicked with message: \"%s\"\n", cl->name, buf ); + SV_ClientPrintf( cl, "You were kicked from the game with message: \"%s\"\n", buf ); + if( cl->useragent[0] ) + Netchan_OutOfBandPrint( NS_SERVER, cl->netchan.remote_address, "errormsg\nKicked with message:\n%s\n", buf ); + } + else + { + Log_Printf( "Kick: \"%s<%i><%s><>\" was kicked by \"Console\"\n", cl->name, cl->userid, clientId ); + SV_BroadcastPrintf( cl, "%s was kicked\n", cl->name ); + SV_ClientPrintf( cl, "You were kicked from the game\n" ); + if( cl->useragent[0] ) + Netchan_OutOfBandPrint( NS_SERVER, cl->netchan.remote_address, "errormsg\nYou were kicked from the game\n" ); + } + + SV_DropClient( cl, false ); +} + /* ===================== SV_DropClient diff --git a/engine/server/sv_cmds.c b/engine/server/sv_cmds.c index 99c1c661..481f6744 100644 --- a/engine/server/sv_cmds.c +++ b/engine/server/sv_cmds.c @@ -584,7 +584,7 @@ Kick a user off of the server void SV_Kick_f( void ) { sv_client_t *cl; - const char *param, *clientId; + const char *param; if( Cmd_Argc() != 2 ) { @@ -604,38 +604,7 @@ void SV_Kick_f( void ) return; } - if( NET_IsLocalAddress( cl->netchan.remote_address )) - { - Con_Printf( "The local player cannot be kicked!\n" ); - return; - } - - param = Cmd_Argv( 2 ); - - clientId = SV_GetClientIDString( cl ); - - if( *param ) - { - Log_Printf( "Kick: \"%s<%i><%s><>\" was kicked by \"Console\" (message \"%s\")\n", cl->name, cl->userid, clientId, param ); - SV_BroadcastPrintf( cl, "%s was kicked with message: \"%s\"\n", cl->name, param ); - SV_ClientPrintf( cl, "You were kicked from the game with message: \"%s\"\n", param ); - } - else - { - Log_Printf( "Kick: \"%s<%i><%s><>\" was kicked by \"Console\"\n", cl->name, cl->userid, clientId ); - SV_BroadcastPrintf( cl, "%s was kicked\n", cl->name ); - SV_ClientPrintf( cl, "You were kicked from the game\n" ); - } - - if( cl->useragent[0] ) - { - if( *param ) - Netchan_OutOfBandPrint( NS_SERVER, cl->netchan.remote_address, "errormsg\nKicked with message:\n%s\n", param ); - else - Netchan_OutOfBandPrint( NS_SERVER, cl->netchan.remote_address, "errormsg\nYou were kicked from the game\n" ); - } - - SV_DropClient( cl, false ); + SV_KickPlayer( cl, "%s", Cmd_Argv( 2 )); } /*