/* ================== G_GetPlayerByName ================== */ gclient_t *G_GetPlayerByName( char *name ) { int i; gclient_t *cl; char cleanName[64]; // make sure server is running if ( !G_Is_SV_Running() ) { return NULL; } if ( trap_Argc() < 2 ) { G_Printf( "No player specified.\n" ); return NULL; } for (i = 0; i < level.numConnectedClients; i++) { cl = &level.clients[i]; if (!Q_stricmp(cl->pers.netname, name)) { return cl; } Q_strncpyz( cleanName, cl->pers.netname, sizeof(cleanName) ); Q_CleanStr( cleanName ); if ( !Q_stricmp( cleanName, name ) ) { return cl; } } G_Printf( "Player %s is not on the server\n", name ); return NULL; }
/* ================== G_GetPlayerByNum ================== */ gclient_t *G_GetPlayerByNum( int clientNum ) { gclient_t *cl; // make sure server is running if ( !G_Is_SV_Running() ) { return NULL; } if ( trap_Argc() < 2 ) { G_Printf( "No player specified.\n" ); return NULL; } if ( clientNum < 0 || clientNum >= level.maxclients ) { Com_Printf( "Bad client slot: %i\n", clientNum ); return NULL; } cl = &level.clients[clientNum]; if ( cl->pers.connected == CON_DISCONNECTED ) { G_Printf( "Client %i is not connected\n", clientNum ); return NULL; } if (cl) return cl; G_Printf( "User %d is not on the server\n", clientNum ); return NULL; }
/* ================== Svcmd_KickNum_f Kick a user off of the server ================== */ static void Svcmd_KickNum_f( void ) { gclient_t *cl; int timeout = -1; const char *ip; char userinfo[MAX_INFO_STRING]; char sTimeout[MAX_TOKEN_CHARS]; char name[MAX_TOKEN_CHARS]; int clientNum; // make sure server is running if ( !G_Is_SV_Running() ) { G_Printf( "Server is not running.\n" ); return; } if ( trap_Argc() < 2 || trap_Argc() > 3 ) { G_Printf( "Usage: kick <client number> [timeout]\n" ); return; } if ( trap_Argc() == 3 ) { trap_Argv( 2, sTimeout, sizeof( sTimeout ) ); timeout = atoi( sTimeout ); } else { timeout = 300; } trap_Argv( 1, name, sizeof( name ) ); clientNum = atoi( name ); cl = G_GetPlayerByNum( clientNum ); if ( !cl ) { return; } if ( cl->pers.localClient ) { G_Printf( "Cannot kick host player\n" ); return; } trap_GetUserinfo( cl->ps.clientNum, userinfo, sizeof( userinfo ) ); ip = Info_ValueForKey( userinfo, "ip" ); // use engine banning system, mods may choose to use their own banlist if ( USE_ENGINE_BANLIST ) { // kick but dont ban bots, they arent that lame if ( ( g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT ) ) { timeout = 0; } trap_DropClient( cl->ps.clientNum, "player kicked", timeout ); } else { trap_DropClient( cl->ps.clientNum, "player kicked", 0 ); // kick but dont ban bots, they arent that lame if ( !( g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT ) ) { AddIPBan( ip ); } } }
static void Svcmd_Kick_f( void ) { gclient_t *cl; int i; int timeout = -1; char sTimeout[MAX_TOKEN_CHARS]; char name[MAX_TOKEN_CHARS]; // make sure server is running if ( !G_Is_SV_Running() ) { G_Printf( "Server is not running.\n" ); return; } if ( trap_Argc() < 2 || trap_Argc() > 3 ) { G_Printf ("Usage: kick <player name> [timeout]\n"); return; } if( trap_Argc() == 3 ) { trap_Argv( 2, sTimeout, sizeof( sTimeout ) ); timeout = atoi( sTimeout ); } else { timeout = 300; } trap_Argv(1, name, sizeof(name)); cl = G_GetPlayerByName( name );//ClientForString( name ); if ( !cl ) { if ( !Q_stricmp(name, "all") ) { for (i = 0, cl = level.clients; i < level.numConnectedClients; i++, cl++) { // dont kick localclients ... if ( cl->pers.localClient ) { continue; } if ( timeout != -1 ) { char *ip; char userinfo[MAX_INFO_STRING]; trap_GetUserinfo( cl->ps.clientNum, userinfo, sizeof( userinfo ) ); ip = Info_ValueForKey (userinfo, "ip"); // use engine banning system, mods may choose to use their own banlist if (USE_ENGINE_BANLIST) { // kick but dont ban bots, they arent that lame if ( (g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) { timeout = 0; } trap_DropClient(cl->ps.clientNum, "player kicked", timeout); } else { trap_DropClient(cl->ps.clientNum, "player kicked", 0); // kick but dont ban bots, they arent that lame if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) AddIPBan( ip ); } } else { trap_DropClient(cl->ps.clientNum, "player kicked", 0); } } } #ifndef NO_BOT_SUPPORT else if ( !Q_stricmp(name, "allbots") ) { for (i = 0, cl = level.clients; i < level.numConnectedClients; i++, cl++) { if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) { continue; } // kick but dont ban bots, they arent that lame trap_DropClient(cl->ps.clientNum, "player kicked", 0); } } #endif return; } else { // dont kick localclients ... if ( cl->pers.localClient ) { G_Printf("Cannot kick host player\n"); return; } if ( timeout != -1 ) { char *ip; char userinfo[MAX_INFO_STRING]; trap_GetUserinfo( cl->ps.clientNum, userinfo, sizeof( userinfo ) ); ip = Info_ValueForKey (userinfo, "ip"); // use engine banning system, mods may choose to use their own banlist if (USE_ENGINE_BANLIST) { // kick but dont ban bots, they arent that lame if ( (g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) { timeout = 0; } trap_DropClient(cl->ps.clientNum, "player kicked", timeout); } else { trap_DropClient(cl->ps.clientNum, "player kicked", 0); // kick but dont ban bots, they arent that lame if ( !(g_entities[cl->ps.clientNum].r.svFlags & SVF_BOT) ) AddIPBan( ip ); } } else { trap_DropClient(cl->ps.clientNum, "player kicked", 0); } } }