//Sets the gamedir and path to a different directory. void SV_Gamedir_f (void) { char *dir; if (Cmd_Argc() == 1) { Com_Printf ("Current gamedir: %s\n", com_gamedirfile); return; } if (Cmd_Argc() != 2) { Com_Printf ("Usage: gamedir <newdir>\n"); return; } dir = Cmd_Argv(1); if (strstr(dir, "..") || strstr(dir, "/") || strstr(dir, "\\") || strstr(dir, ":")) { Com_Printf ("gamedir should be a single filename, not a path\n"); return; } #ifndef SERVERONLY if (CL_ClientState()) { Com_Printf ("you must disconnect before changing gamedir\n"); return; } #endif FS_SetGamedir (dir); Info_SetValueForStarKey (svs.info, "*gamedir", dir, MAX_SERVERINFO_STRING); }
/* ================== SV_Kick_f Kick a user off of the server ================== */ void SV_Kick_f (void) { int i, j; client_t *cl; int uid; int c; int saved_state; char reason[80] = ""; c = Cmd_Argc (); if (c < 2) { #ifndef SERVERONLY // some mods use a "kick" alias for their own needs, sigh if (CL_ClientState() && Cmd_FindAlias("kick")) { Cmd_ExecuteString (Cmd_AliasString("kick"), false); return; } #endif Com_Printf ("kick <userid> [reason]\n"); return; } uid = atoi(Cmd_Argv(1)); for (i = 0, cl = svs.clients; i < MAX_CLIENTS; i++, cl++) { if (!cl->state) continue; if (cl->userid == uid) { if (c > 2) { strcpy (reason, " ("); for (j=2 ; j<c; j++) { strncat (reason, Cmd_Argv(j), sizeof(reason)-4); if (j < c-1) strncat (reason, " ", sizeof(reason)-4); } if (strlen(reason) < 3) reason[0] = '\0'; else strncat (reason, ")", sizeof(reason)); } saved_state = cl->state; cl->state = cs_free; // HACK: don't broadcast to this client SV_BroadcastPrintf (PRINT_HIGH, "%s was kicked%s\n", cl->name, reason); cl->state = saved_state; SV_ClientPrintf (cl, PRINT_HIGH, "You were kicked from the game%s\n", reason); SV_DropClient (cl); return; } } Com_Printf ("Couldn't find user number %i\n", uid); }
void SV_Status_f (void) { int i, j, l; client_t *cl; float cpu, avg, pak; char *s; #ifndef SERVERONLY // some mods use a "status" alias for their own needs, sigh if (!sv_redirected && !strcasecmp(Cmd_Argv(0), "status") && CL_ClientState() && Cmd_FindAlias("status")) { Cmd_ExecuteString (Cmd_AliasString("status")); return; } #endif cpu = (svs.stats.latched_active + svs.stats.latched_idle); if (cpu) cpu = 100 * svs.stats.latched_active / cpu; avg = 1000 * svs.stats.latched_active / STATFRAMES; pak = (float) svs.stats.latched_packets / STATFRAMES; if (svs.socketip != INVALID_SOCKET && net_local_sv_ipadr.type != NA_LOOPBACK) Com_Printf ("ip address : %s\n",NET_AdrToString (net_local_sv_ipadr)); // TCPCONNECT --> if (svs.sockettcp != INVALID_SOCKET && net_local_sv_tcpipadr.type != NA_LOOPBACK) Com_Printf ("tcp address : %s\n",NET_AdrToString (net_local_sv_tcpipadr)); // <-- TCPCONNECT Com_Printf ("cpu utilization : %3i%%\n",(int)cpu); Com_Printf ("avg response time: %i ms\n",(int)avg); Com_Printf ("packets/frame : %5.2f (%d)\n", pak, num_prstr); // min fps lat drp if (sv_redirected != RD_NONE) { // most remote clients are 40 columns // 0123456789012345678901234567890123456789 Com_Printf ("name userid frags\n"); Com_Printf (" address rate ping drop\n"); Com_Printf (" ---------------- ---- ---- -----\n"); for (i = 0, cl = svs.clients; i < MAX_CLIENTS; i++, cl++) { if (!cl->state) continue; Com_Printf ("%-16.16s ", cl->name); Com_Printf ("%6i %5i", cl->userid, (int)cl->edict->v.frags); if (cl->spectator) Com_Printf (" (s)\n"); else Com_Printf ("\n"); s = NET_BaseAdrToString ( cl->netchan.remote_address); Com_Printf (" %-16.16s", s); if (cl->state == cs_connected) { Com_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { Com_Printf ("ZOMBIE\n"); continue; } Com_Printf ("%4i %4i %5.2f\n" , (int)(1000*cl->netchan.frame_rate) , (int)SV_CalcPing (cl) , 100.0*cl->netchan.drop_count / cl->netchan.incoming_sequence); } } else { Com_Printf ("frags userid address name rate ping drop qport\n"); Com_Printf ("----- ------ --------------- --------------- ---- ---- ----- -----\n"); for (i = 0, cl = svs.clients; i < MAX_CLIENTS; i++, cl++) { if (!cl->state) continue; Com_Printf ("%5i %6i ", (int)cl->edict->v.frags, cl->userid); s = NET_BaseAdrToString ( cl->netchan.remote_address); Com_Printf ("%s", s); l = 16 - strlen(s); for (j = 0; j < l; j++) Com_Printf (" "); Com_Printf ("%s", cl->name); l = 16 - strlen(cl->name); for (j = 0; j < l; j++) Com_Printf (" "); if (cl->state == cs_connected) { Com_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { Com_Printf ("ZOMBIE\n"); continue; } Com_Printf ("%4i %4i %3.1f %4i" , (int)(1000*cl->netchan.frame_rate) , (int)SV_CalcPing (cl) , 100.0*cl->netchan.drop_count / cl->netchan.incoming_sequence , cl->netchan.qport); if (cl->spectator) Com_Printf (" (s)\n"); else Com_Printf ("\n"); } } Com_Printf ("\n"); }