From afa607c3b6ffed633797822871e4c4dcce124b58 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Tue, 19 Jun 2012 15:52:08 +0000 Subject: [PATCH] Added kicknum, kickall, and kickbots commands, patch by Ensiform. --- README | 6 ++ code/server/sv_ccmds.c | 148 ++++++++++++++++++++++++++++++----------- 2 files changed, 114 insertions(+), 40 deletions(-) diff --git a/README b/README index 010e5e0f..c19e28d7 100644 --- a/README +++ b/README @@ -300,6 +300,12 @@ New commands execq - quiet exec command, doesn't print "execing file.cfg" + kicknum - kick a client by number, same as clientkick command + kickall - kick all clients, similar to "kick all" (but kicks + everyone even if someone is named "all") + kickbots - kick all bots, similar to "kick allbots" (but kicks + all bots even if someone is named "allbots") + tell - send message to a single client (new to server) diff --git a/code/server/sv_ccmds.c b/code/server/sv_ccmds.c index b90be65f..29181bb6 100644 --- a/code/server/sv_ccmds.c +++ b/code/server/sv_ccmds.c @@ -361,7 +361,7 @@ static void SV_MapRestart_f( void ) { ================== SV_Kick_f -Kick a user off of the server FIXME: move to game +Kick a user off of the server ================== */ static void SV_Kick_f( void ) { @@ -408,7 +408,102 @@ static void SV_Kick_f( void ) { return; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { - SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); + Com_Printf("Cannot kick host player\n"); + return; + } + + SV_DropClient( cl, "was kicked" ); + cl->lastPacketTime = svs.time; // in case there is a funny zombie +} + +/* +================== +SV_KickBots_f + +Kick all bots off of the server +================== +*/ +static void SV_KickBots_f( void ) { + client_t *cl; + int i; + + // make sure server is running + if( !com_sv_running->integer ) { + Com_Printf("Server is not running.\n"); + return; + } + + for( i = 0, cl = svs.clients; i < sv_maxclients->integer; i++, cl++ ) { + if( !cl->state ) { + continue; + } + + if( cl->netchan.remoteAddress.type != NA_BOT ) { + continue; + } + + SV_DropClient( cl, "was kicked" ); + cl->lastPacketTime = svs.time; // in case there is a funny zombie + } +} +/* +================== +SV_KickAll_f + +Kick all users off of the server +================== +*/ +static void SV_KickAll_f( void ) { + client_t *cl; + int i; + + // make sure server is running + if( !com_sv_running->integer ) { + Com_Printf( "Server is not running.\n" ); + return; + } + + for( i = 0, cl = svs.clients; i < sv_maxclients->integer; i++, cl++ ) { + if( !cl->state ) { + continue; + } + + if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { + continue; + } + + SV_DropClient( cl, "was kicked" ); + cl->lastPacketTime = svs.time; // in case there is a funny zombie + } +} + +/* +================== +SV_KickNum_f + +Kick a user off of the server +================== +*/ +static void SV_KickNum_f( void ) { + client_t *cl; + + // make sure server is running + if ( !com_sv_running->integer ) { + Com_Printf( "Server is not running.\n" ); + return; + } + + if ( Cmd_Argc() != 2 ) { + Com_Printf ("Usage: %s \n", Cmd_Argv(0)); + return; + } + + cl = SV_GetPlayerByNum(); + if ( !cl ) { + return; + } + if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { + Com_Printf("Cannot kick host player\n"); return; } @@ -448,7 +543,7 @@ static void SV_Ban_f( void ) { } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { - SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); + Com_Printf("Cannot kick host player\n"); return; } @@ -502,7 +597,7 @@ static void SV_BanNum_f( void ) { return; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { - SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); + Com_Printf("Cannot kick host player\n"); return; } @@ -1022,40 +1117,6 @@ static void SV_ExceptDel_f(void) SV_DelBanFromList(qtrue); } -/* -================== -SV_ClientKick_f - -Kick a user off of the server FIXME: move to game -================== -*/ -static void SV_ClientKick_f( void ) { - client_t *cl; - - // make sure server is running - if ( !com_sv_running->integer ) { - Com_Printf( "Server is not running.\n" ); - return; - } - - if ( Cmd_Argc() != 2 ) { - Com_Printf ("Usage: clientkick \n"); - return; - } - - cl = SV_GetPlayerByNum(); - if ( !cl ) { - return; - } - if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { - SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); - return; - } - - SV_DropClient( cl, "was kicked" ); - cl->lastPacketTime = svs.time; // in case there is a funny zombie -} - /* ================ SV_Status_f @@ -1246,7 +1307,7 @@ static void SV_Systeminfo_f( void ) { =========== SV_DumpUser_f -Examine all a users info strings FIXME: move to game +Examine all a users info strings =========== */ static void SV_DumpUser_f( void ) { @@ -1318,7 +1379,10 @@ void SV_AddOperatorCommands( void ) { Cmd_AddCommand ("banClient", SV_BanNum_f); } #endif - Cmd_AddCommand ("clientkick", SV_ClientKick_f); + Cmd_AddCommand ("kickbots", SV_KickBots_f); + Cmd_AddCommand ("kickall", SV_KickAll_f); + Cmd_AddCommand ("kicknum", SV_KickNum_f); + Cmd_AddCommand ("clientkick", SV_KickNum_f); // Legacy command Cmd_AddCommand ("status", SV_Status_f); Cmd_AddCommand ("serverinfo", SV_Serverinfo_f); Cmd_AddCommand ("systeminfo", SV_Systeminfo_f); @@ -1360,6 +1424,10 @@ void SV_RemoveOperatorCommands( void ) { // removing these won't let the server start again Cmd_RemoveCommand ("heartbeat"); Cmd_RemoveCommand ("kick"); + Cmd_RemoveCommand ("kicknum"); + Cmd_RemoveCommand ("clientkick"); + Cmd_RemoveCommand ("kickall"); + Cmd_RemoveCommand ("kickbots"); Cmd_RemoveCommand ("banUser"); Cmd_RemoveCommand ("banClient"); Cmd_RemoveCommand ("status");