/* ================== SV_ConTell_f ================== */ static void SV_ConTell_f(void) { char text[1024]; char *p; client_t *cl; // make sure server is running if (!com_sv_running->integer) { Com_Printf("Server is not running\n"); return; } if (Cmd_Argc() < 3) { Com_Printf("Usage: tell <client> <text>\n"); return; } cl = SV_GetPlayerByHandle(); if (!cl) { return; } strcpy (text, sv_tellprefix->string); p = Cmd_ArgsFrom(2); if (*p == '"') { p++; p[strlen(p) - 1] = 0; } strcat(text, p); SV_SendServerCommand(cl, "chat \"%s\n\"", text); }
/* ================== SV_Kick_f Kick a user off of the server FIXME: move to game ================== */ static void SV_Kick_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: kick <player name>\n"); return; } cl = SV_GetPlayerByHandle(); 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_SendClientCommand_f Send a reliable command to a specific client. ================== */ static void SV_SendClientCommand_f(void) { client_t *cl; char *cmd; // Make sure server is running. if (!com_sv_running->integer) { Com_Printf("Server is not running.\n"); return; } if (Cmd_Argc() < 3 || strlen(Cmd_Argv(2)) == 0) { Com_Printf("Usage: sendclientcommand <player name> <command>\nPlayer may be 'all' or 'allbots'\n"); return; } cl = SV_GetPlayerByHandle(); cmd = Cmd_ArgsFromRaw(2); if (!cl) { if (!Q_stricmp(Cmd_Argv(1), "all")) { SV_SendServerCommand(NULL, "%s", cmd); } return; } SV_SendServerCommand(cl, "%s", cmd); }
/* ================== SV_StopServerDemo_f Stop a server-side demo for given player/slot. Note that "stopserverdemo all" will stop demos for all players in the server. ================== */ static void SV_StopServerDemo_f(void) { client_t *client; Com_DPrintf("SV_StopServerDemo_f\n"); if (!com_sv_running->integer) { Com_Printf("stopserverdemo: Server not running\n"); return; } if (Cmd_Argc() != 2) { Com_Printf("Usage: stopserverdemo <client-or-all>\n"); return; } if (!Q_stricmp(Cmd_Argv(1), "all")) { SV_StopRecordAll(); } else { client = SV_GetPlayerByHandle(); if (!client) { return; } SV_StopRecordOne(client); } }
/* ================== SV_ForceCvar_f Set a cvar for a user. ================== */ static void SV_ForceCvar_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; } if (Cmd_Argc() != 4 || strlen(Cmd_Argv(2)) == 0) { Com_Printf("Usage: forcecvar <player name> <cvar name> <cvar value>\nPlayer may be 'allbots'\n"); return; } cl = SV_GetPlayerByHandle(); if (!cl) { if (!Q_stricmp(Cmd_Argv(1), "allbots")) { 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_ForceCvar_f_helper(cl); } } return; } SV_ForceCvar_f_helper(cl); }
/* ================== SV_StartServerDemo_f Record a server-side demo for given player/slot. The demo will be called "YYYY-MM-DD_hh-mm-ss_playername_id.urtdemo", in the "demos" directory under your game directory. Note that "startserverdemo all" will start demos for all players currently in the server. Players who join later require a new "startserverdemo" command. If you are already recording demos for some players, another "startserverdemo all" will start new demos only for players not already recording. Note that bots will never be recorded, not even if "all" is given. The server-side demos will stop when "stopserverdemo" is issued or when the server restarts for any reason (such as a new map loading). ================== */ static void SV_StartServerDemo_f(void) { client_t *client; Com_DPrintf("SV_StartServerDemo_f\n"); if (!com_sv_running->integer) { Com_Printf("startserverdemo: Server not running\n"); return; } if (Cmd_Argc() < 2) { Com_Printf("Usage: startserverdemo <client-or-all> [<optional-demo-name>]\n"); return; } if (!Q_stricmp(Cmd_Argv(1), "all")) { SV_StartRecordAll(); } else { client = SV_GetPlayerByHandle(); if (!client) { return; } if (Cmd_Argc() > 2) { SV_StartRecordOne(client, Cmd_ArgsFrom(2)); } else { SV_StartRecordOne(client, NULL); } } }
/* ================== SV_Kick_f Kick a user off of the server ================== */ static void SV_Kick_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: kick <player name>\nkickall = kick everyone\nkickbots = kick all bots\n"); return; } if (!Q_stricmp(Cmd_Argv(1), "Padawan")) { //if you try to kick the default name, also try to kick "" SV_KickBlankPlayers(); } cl = SV_GetPlayerByHandle(); if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { // Ensiform: RAVEN BUT THIS IS SERVER CONSOLE SO... WHY DO WE WANT @@@ TO APPEAR // SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); // SV_SendServerCommand(NULL, "print \"%s\"", SV_GetStringEdString("MP_SVGAME","CANNOT_KICK_HOST")); Com_Printf("Cannot kick host player\n"); return; } SV_DropClient( cl, SV_GetStringEdString("MP_SVGAME","WAS_KICKED")); // "was kicked" ); cl->lastPacketTime = svs.time; // in case there is a funny zombie }
/* =========== SV_DumpUser_f Examine all a users info strings FIXME: move to game =========== */ static void SV_DumpUser_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 ) { #ifndef SMOKINGUNS Com_Printf ("Usage: info <userid>\n"); #else Com_Printf ("Usage: dumpuser <userid>\n"); #endif return; } cl = SV_GetPlayerByHandle(); if ( !cl ) { return; } Com_Printf( "userinfo\n" ); Com_Printf( "--------\n" ); Info_Print( cl->userinfo ); }
/* ================== SV_Kick_f Kick a user off of the server ================== */ static void SV_Kick_f( void ) { player_t *player; client_t *client; // 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: kick <player name>\n"); return; } player = SV_GetPlayerByHandle(); if ( !player ) { return; } client = player->client; if( client->netchan.remoteAddress.type == NA_LOOPBACK ) { Com_Printf("Cannot kick host player\n"); return; } SV_DropPlayer( player, "was kicked" ); client->lastPacketTime = svs.time; // in case there is a funny zombie }
/* =========== SV_DumpUser_f Examine all a users info strings FIXME: move to game =========== */ static void SV_DumpUser_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: info <userid>\n"); return; } cl = SV_GetPlayerByHandle(); if ( !cl ) { return; } Sys_BeginPrint(); Com_Printf( "userinfo\n" ); Com_Printf( "--------\n" ); Info_Print( cl->userinfo ); Sys_EndPrint(); }
/* ================== SV_Kick_f Kick a user off of the server FIXME: move to game ================== */ static void SV_Kick_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; } if (Cmd_Argc() <= 1 || Cmd_Argc() > 3) { Com_Printf("Usage: kick <player> [reason]\nkick all [reason] = kick everyone\nkick allbots = kick all bots\n"); return; } cl = SV_GetPlayerByHandle(); if (!cl) { if (!Q_stricmp(Cmd_Argv(1), "all")) { for (i = 0, cl = svs.clients; i < sv_maxclients->integer; i++, cl++) { if (!cl->state) { continue; } if (cl->netchan.remoteAddress.type == NA_LOOPBACK) { continue; } if (Cmd_Argv(2) && Q_stricmp(Cmd_Argv(2), "") && Q_stricmp(Cmd_Argv(2), " ")) { SV_DropClient(cl, va("was kicked (%s)", Cmd_Argv(2))); } else { SV_DropClient(cl, "was kicked"); } cl->lastPacketTime = svs.time; // in case there is a funny zombie } } else if (!Q_stricmp(Cmd_Argv(1), "allbots")) { 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 } } return; } if (cl->netchan.remoteAddress.type == NA_LOOPBACK) { SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); return; } if (Cmd_Argv(2) && Q_stricmp(Cmd_Argv(2), "") && Q_stricmp(Cmd_Argv(2), " ")) { SV_DropClient(cl, va("was kicked (%s)", Cmd_Argv(2))); } else { SV_DropClient(cl, "was kicked"); } cl->lastPacketTime = svs.time; // in case there is a funny zombie }
/* ================== SV_Kick_f Kick a user off of the server ================== */ static void SV_Kick_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; } if ( Cmd_Argc() != 2 ) { Com_Printf ("Usage: kick <player name>\nkick all = kick everyone\nkick allbots = kick all bots\n"); return; } if (!Q_stricmp(Cmd_Argv(1), "Padawan")) { //if you try to kick the default name, also try to kick "" SV_KickBlankPlayers(); } cl = SV_GetPlayerByHandle(); if ( !cl ) { if ( !Q_stricmp(Cmd_Argv(1), "all") ) { 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, SV_GetStringEdString("MP_SVGAME","WAS_KICKED")); // "was kicked" ); cl->lastPacketTime = svs.time; // in case there is a funny zombie } } else if ( !Q_stricmp(Cmd_Argv(1), "allbots") ) { 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, SV_GetStringEdString("MP_SVGAME","WAS_KICKED")); // "was kicked" ); cl->lastPacketTime = svs.time; // in case there is a funny zombie } } return; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { Com_Printf("Cannot kick host player\n"); return; } SV_DropClient( cl, SV_GetStringEdString("MP_SVGAME","WAS_KICKED")); // "was kicked" ); cl->lastPacketTime = svs.time; // in case there is a funny zombie }
/* ================== SV_Ban_f Ban a user from being able to play on this server through the auth server ================== */ static void SV_Ban_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: banUser <player name>\n"); return; } cl = SV_GetPlayerByHandle(); if (!cl) { return; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); return; } // look up the authorize server's IP if ( !svs.authorizeAddress.ip[0] && svs.authorizeAddress.type != NA_BAD ) { Com_Printf( "Resolving %s\n", AUTHORIZE_SERVER_NAME ); if ( !NET_StringToAdr( AUTHORIZE_SERVER_NAME, &svs.authorizeAddress, NA_IP ) ) { Com_Printf( "Couldn't resolve address\n" ); return; } svs.authorizeAddress.port = BigShort( PORT_AUTHORIZE ); Com_Printf( "%s resolved to %i.%i.%i.%i:%i\n", AUTHORIZE_SERVER_NAME, svs.authorizeAddress.ip[0], svs.authorizeAddress.ip[1], svs.authorizeAddress.ip[2], svs.authorizeAddress.ip[3], BigShort( svs.authorizeAddress.port ) ); } // otherwise send their ip to the authorize server if ( svs.authorizeAddress.type != NA_BAD ) { #ifndef SMOKINGUNS NET_OutOfBandPrint( NS_SERVER, svs.authorizeAddress, "banUser %i.%i.%i.%i", cl->netchan.remoteAddress.ip[0], cl->netchan.remoteAddress.ip[1], cl->netchan.remoteAddress.ip[2], cl->netchan.remoteAddress.ip[3] ); #else // Tequila comment: Provide also the guid to ban in case of ip change char *guid = Info_ValueForKey ( cl->userinfo, "cl_guid" ); NET_OutOfBandPrint( NS_SERVER, svs.authorizeAddress, "banUser %i.%i.%i.%i %s", cl->netchan.remoteAddress.ip[0], cl->netchan.remoteAddress.ip[1], cl->netchan.remoteAddress.ip[2], cl->netchan.remoteAddress.ip[3], guid ); #endif Com_Printf("%s was banned from coming back\n", cl->name); } }
/* ================== SV_Ban_f Ban a user from being able to play on this server through the auth server ================== */ static void SV_Ban_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: banUser <player name>\n"); return; } cl = SV_GetPlayerByHandle(); if (!cl) { return; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); return; } if(strlen(AUTHORIZE_SERVER_NAME) < 1) { Com_Printf("Ban function disabled due to lack of authorizing server.\n"); return; } // look up the authorize server's IP if ( !svs.authorizeAddress.ip[0] && svs.authorizeAddress.type != NA_BAD ) { Com_Printf( "Resolving %s\n", AUTHORIZE_SERVER_NAME ); if ( !NET_StringToAdr( AUTHORIZE_SERVER_NAME, &svs.authorizeAddress ) ) { Com_Printf( "Couldn't resolve address\n" ); return; } svs.authorizeAddress.port = BigShort( PORT_AUTHORIZE ); Com_Printf( "%s resolved to %i.%i.%i.%i:%i\n", AUTHORIZE_SERVER_NAME, svs.authorizeAddress.ip[0], svs.authorizeAddress.ip[1], svs.authorizeAddress.ip[2], svs.authorizeAddress.ip[3], BigShort( svs.authorizeAddress.port ) ); } // otherwise send their ip to the authorize server if ( svs.authorizeAddress.type != NA_BAD ) { NET_OutOfBandPrint( NS_SERVER, svs.authorizeAddress, "banUser %i.%i.%i.%i", cl->netchan.remoteAddress.ip[0], cl->netchan.remoteAddress.ip[1], cl->netchan.remoteAddress.ip[2], cl->netchan.remoteAddress.ip[3] ); Com_Printf("%s was banned from coming back\n", cl->name); } }
/* ================== SV_Kick_f Kick a user off of the server ================== */ static void SV_Kick_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; } if( Cmd_Argc() != 2 ) { Com_Printf( "Usage: kick <player name>\nkick all = kick everyone\nkick allbots = kick all bots\n" ); return; } cl = SV_GetPlayerByHandle(); if( !cl ) { if ( !Q_stricmp(Cmd_Argv(1), "all") ) { 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, SV_StringEdString("WAS_KICKED") ); cl->lastPacketTime = svs.time; // in case there is a funny zombie } } else if ( !Q_stricmp(Cmd_Argv(1), "allbots") ) { 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, SV_StringEdString("WAS_KICKED") ); cl->lastPacketTime = svs.time; // in case there is a funny zombie } } return; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { SV_SendServerCommand(NULL, "print \"%s\"", SV_StringEdString("CANNOT_KICK_HOST")); return; } SV_DropClient( cl, SV_StringEdString("WAS_KICKED") ); cl->lastPacketTime = svs.time; // in case there is a funny zombie }
/* ================== SV_Auth_Whois_f Get user infos ================== */ static void SV_Auth_Whois_f(void) { int i; 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: auth-whois <client-or-all>\n"); return; } if (Cvar_VariableValue("auth") == 0) { Com_Printf("Auth services are disabled\n"); return; } if (!Q_stricmp(Cmd_Argv(1), "all")) { for (i = 0; i < sv_maxclients->integer; i++) { cl = &svs.clients[i]; if (cl->state != CS_ACTIVE) { continue; } VM_Call(gvm, GAME_AUTH_WHOIS, (int)(cl - svs.clients)); } } else { cl = SV_GetPlayerByHandle(); if (!cl) { return; } VM_Call(gvm, GAME_AUTH_WHOIS, (int)(cl - svs.clients)); } }
/* ================== SV_Kick_f Kick a user off of the server FIXME: move to game ================== */ static void SV_KickUnpure_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; } if ( Cmd_Argc() != 2 ) { Com_Printf ("Usage: kick <player name>\nkick all = kick everyone\n"); return; } cl = SV_GetPlayerByHandle(); if ( !cl ) { if ( !Q_stricmp(Cmd_Argv(1), "all") ) { for ( i=0, cl=svs.clients ; i < sv_maxclients->integer ; i++,cl++ ) { if ( !cl->state ) { continue; } if ( cl->pureAuthentic != 2 || cl->netchan.remoteAddress.type == NA_BOT) { continue; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { continue; } SV_DropClient( cl, "missed the correct .PK3 files. ^rPlease ^ropen ^rconsole ^r(^gShift^r+^gEsc^r) ^rand ^rtype ^g\\seta ^gcg_allowDownload ^g1 ^rand ^g\\reconnect^r." ); cl->lastPacketTime = svs.time; // in case there is a funny zombie } } return; } if( cl->netchan.remoteAddress.type == NA_LOOPBACK ) { SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host player\n"); return; } if ( cl->pureAuthentic == 2 ) { SV_DropClient( cl, "missed the correct .PK3 files. ^rPlease ^ropen ^rconsole ^r(^gShift^r+^gEsc^r) ^rand ^rtype ^g\\seta ^gcg_allowDownload ^g1 ^rand ^g\\reconnect^r." ); cl->lastPacketTime = svs.time; // in case there is a funny zombie } }
/* ================== SV_Auth_Ban_f Ban a user from the server and the group ================== */ static void SV_Auth_Ban_f(void) { client_t *cl; char *d, *h, *m; if (!com_sv_running->integer) { Com_Printf("Server is not running.\n"); return; } if (Cvar_VariableValue("auth") == 0) { Com_Printf("Auth services are disabled\n"); return; } if (Cmd_Argc() < 5) { Com_Printf ("Usage: auth-ban <client> <days> <hours> <mins>\n"); return; } cl = SV_GetPlayerByHandle(); if (!cl) { return; } if (cl->netchan.remoteAddress.type == NA_LOOPBACK) { SV_SendServerCommand(NULL, "print \"%s\"", "Cannot ban host client\n"); return; } d = Cmd_Argv(2); h = Cmd_Argv(3); m = Cmd_Argv(4); VM_Call(gvm, GAME_AUTH_BAN, (int)(cl - svs.clients), atoi(d), atoi(h), atoi(m)); }
/* =========== SV_DumpUser_f Examine all a users info strings =========== */ static void SV_DumpUser_f( void ) { player_t *player; // 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: dumpuser <userid>\n"); return; } player = SV_GetPlayerByHandle(); if ( !player ) { return; } Com_Printf( "userinfo\n" ); Com_Printf( "--------\n" ); Info_Print( player->userinfo ); }
/* ================== SV_Kick_f Kick a user off of the server. FIXME: move to game ================== */ static void SV_Kick_f(void) { int i; client_t *cl; char *reason = "was kicked"; // make sure server is running if (!com_sv_running->integer ) { Com_Printf("Server is not running\n"); return; } if ((Cmd_Argc() < 2) || (Cmd_Argc() > 3)) { Com_Printf ("Usage: kick <client> <reason>\nkick all = kick everyone\nkick allbots = kick all bots\n"); return; } if (Cmd_Argc() == 3) { // If the reason was specified attach it to the disconnect message reason = va("was kicked: %s", Cmd_Argv(2)); } if (!Q_stricmp(Cmd_Argv(1), "all")) { 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, reason); cl->lastPacketTime = svs.time; // in case there is a funny zombie } } else if (!Q_stricmp(Cmd_Argv(1), "allbots")) { 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, reason); cl->lastPacketTime = svs.time; // in case there is a funny zombie } } else { cl = SV_GetPlayerByHandle(); if (!cl) { return; } if (cl->netchan.remoteAddress.type == NA_LOOPBACK) { SV_SendServerCommand(NULL, "print \"%s\"", "Cannot kick host client\n"); return; } SV_DropClient(cl, reason); cl->lastPacketTime = svs.time; // in case there is a funny zombie } }