/* ================ SVC_Status Responds with all the info that qplug or qspy can see This message can be up to around 5k with worst case string lengths. ================ */ void SVC_Status (void) { int i; client_t *cl; int ping; int top, bottom; SV_BeginRedirect (RD_PACKET); Com_Printf ("%s\n", svs.info); for (i=0 ; i<MAX_CLIENTS ; i++) { cl = &svs.clients[i]; if ((cl->state == cs_connected || cl->state == cs_spawned ) && !cl->spectator) { top = atoi(Info_ValueForKey (cl->userinfo, "topcolor")); bottom = atoi(Info_ValueForKey (cl->userinfo, "bottomcolor")); top = (top < 0) ? 0 : ((top > 13) ? 13 : top); bottom = (bottom < 0) ? 0 : ((bottom > 13) ? 13 : bottom); ping = SV_CalcPing (cl); Com_Printf ("%i %i %i %i \"%s\" \"%s\" %i %i\n", cl->userid, cl->old_frags, (int)(svs.realtime - cl->connection_started)/60, ping, cl->name, Info_ValueForKey (cl->userinfo, "skin"), top, bottom); } } SV_EndRedirect (); }
void SV_FullClientUpdate (client_t *client, sizebuf_t *buf) { int i; char info[MAX_INFO_STRING]; // Con_Printf("%s\n", __thisfunc__); i = client - svs.clients; // Sys_Printf("%s: Updated frags for client %d\n", __thisfunc__, i); MSG_WriteByte (buf, svc_updatedminfo); MSG_WriteByte (buf, i); MSG_WriteShort (buf, client->old_frags); MSG_WriteByte (buf, (client->playerclass<<5)|((int)client->edict->v.level&31)); if (dmMode.integer == DM_SIEGE) { MSG_WriteByte (buf, svc_updatesiegeinfo); MSG_WriteByte (buf, (int)ceil(timelimit.value)); MSG_WriteByte (buf, (int)ceil(fraglimit.value)); MSG_WriteByte (buf, svc_updatesiegeteam); MSG_WriteByte (buf, i); MSG_WriteByte (buf, client->siege_team); MSG_WriteByte (buf, svc_updatesiegelosses); MSG_WriteByte (buf, PR_GLOBAL_STRUCT(defLosses)); MSG_WriteByte (buf, PR_GLOBAL_STRUCT(attLosses)); MSG_WriteByte (buf, svc_time);//send server time upon connection MSG_WriteFloat (buf, sv.time); } MSG_WriteByte (buf, svc_updateping); MSG_WriteByte (buf, i); MSG_WriteShort (buf, SV_CalcPing (client)); MSG_WriteByte (buf, svc_updateentertime); MSG_WriteByte (buf, i); MSG_WriteFloat (buf, realtime - client->connection_started); strcpy (info, client->userinfo); Info_RemovePrefixedKeys (info, '_'); // server passwords, etc MSG_WriteByte (buf, svc_updateuserinfo); MSG_WriteByte (buf, i); MSG_WriteLong (buf, client->userid); MSG_WriteString (buf, info); }
/* ================= SV_Pings_f The client is showing the scoreboard, so send new ping times for all clients ================= */ static void SV_Pings_f (void) { client_t *client; int j; for (j = 0, client = svs.clients; j < MAX_CLIENTS; j++, client++) { if (client->state != cs_spawned) continue; MSG_WriteByte (&host_client->netchan.message, svc_updateping); MSG_WriteByte (&host_client->netchan.message, j); MSG_WriteShort (&host_client->netchan.message, SV_CalcPing(client)); } }
void SV_Pings_f (void) { client_t *client; int j; for (j = 0, client = svs.clients; j < MAX_CLIENTS; j++, client++) { if (client->state != cs_spawned) continue; ClientReliableWrite_Begin (host_client, svc_updateping, 4); ClientReliableWrite_Byte (host_client, j); ClientReliableWrite_Short (host_client, SV_CalcPing(client)); ClientReliableWrite_Begin (host_client, svc_updatepl, 4); ClientReliableWrite_Byte (host_client, j); ClientReliableWrite_Byte (host_client, client->lossage); } }
void SV_MVDPings (void) { client_t *client; int j; for (j = 0, client = svs.clients; j < MAX_CLIENTS; j++, client++) { if (client->state != cs_spawned) continue; MVDWrite_Begin (dem_all, 0, 7); MSG_WriteByte((sizebuf_t*)demo.dbuf, svc_updateping); MSG_WriteByte((sizebuf_t*)demo.dbuf, j); MSG_WriteShort((sizebuf_t*)demo.dbuf, SV_CalcPing(client)); MSG_WriteByte((sizebuf_t*)demo.dbuf, svc_updatepl); MSG_WriteByte ((sizebuf_t*)demo.dbuf, j); MSG_WriteByte ((sizebuf_t*)demo.dbuf, client->lossage); } }
/* =================== SV_FullClientUpdate Writes all update values to a sizebuf =================== */ void SV_FullClientUpdate (client_t *client, sizebuf_t *buf) { int i; char info[MAX_INFO_STRING]; i = client - svs.clients; if (client->state == cs_free && sv_fastconnect.value) return; MSG_WriteByte (buf, svc_updatefrags); MSG_WriteByte (buf, i); MSG_WriteShort (buf, client->old_frags); MSG_WriteByte (buf, svc_updateping); MSG_WriteByte (buf, i); MSG_WriteShort (buf, SV_CalcPing (client)); MSG_WriteByte (buf, svc_updatepl); MSG_WriteByte (buf, i); MSG_WriteByte (buf, client->lossage); MSG_WriteByte (buf, svc_updateentertime); MSG_WriteByte (buf, i); MSG_WriteFloat (buf, svs.realtime - client->connection_started); strcpy (info, client->userinfo); Info_RemovePrefixedKeys (info, '_'); // server passwords, etc Info_RemoveKey (info, "pmodel"); Info_RemoveKey (info, "emodel"); MSG_WriteByte (buf, svc_updateuserinfo); MSG_WriteByte (buf, i); MSG_WriteLong (buf, client->userid); MSG_WriteString (buf, info); }
static qbool SV_MVD_Record (mvddest_t *dest) { sizebuf_t buf; byte buf_data[MAX_MSGLEN]; int n, i; char *s, info[MAX_INFO_STRING]; client_t *player; char *gamedir; if (!dest) return false; DestFlush(true); if (!sv.mvdrecording) { memset(&demo, 0, sizeof(demo)); for (i = 0; i < UPDATE_BACKUP; i++) { demo.recorder.frames[i] = demo_frames[i]; demo.recorder.frames[i].entities.entities = demo_entities[i]; } MVDBuffer_Init(&demo.dbuffer, demo.buffer, sizeof(demo.buffer)); MVDSetMsgBuf(NULL, &demo.frames[0].buf); demo.datagram.maxsize = sizeof(demo.datagram_data); demo.datagram.data = demo.datagram_data; sv.mvdrecording = true; } // else // SV_WriteRecordMVDMessage(&buf); demo.pingtime = demo.time = sv.time; dest->nextdest = demo.dest; demo.dest = dest; singledest = dest; /*-------------------------------------------------*/ // serverdata // send the info about the new client to all connected clients SZ_Init (&buf, buf_data, sizeof(buf_data)); // send the serverdata gamedir = Info_ValueForKey (svs.info, "*gamedir"); if (!gamedir[0]) gamedir = "qw"; MSG_WriteByte (&buf, svc_serverdata); MSG_WriteLong (&buf, PROTOCOL_VERSION); MSG_WriteLong (&buf, svs.spawncount); MSG_WriteString (&buf, gamedir); MSG_WriteFloat (&buf, sv.time); // send full levelname MSG_WriteString (&buf, sv.mapname); // send the movevars MSG_WriteFloat(&buf, sv.movevars.gravity); MSG_WriteFloat(&buf, sv.movevars.stopspeed); MSG_WriteFloat(&buf, sv.movevars.maxspeed); MSG_WriteFloat(&buf, sv.movevars.spectatormaxspeed); MSG_WriteFloat(&buf, sv.movevars.accelerate); MSG_WriteFloat(&buf, sv.movevars.airaccelerate); MSG_WriteFloat(&buf, sv.movevars.wateraccelerate); MSG_WriteFloat(&buf, sv.movevars.friction); MSG_WriteFloat(&buf, sv.movevars.waterfriction); MSG_WriteFloat(&buf, sv.movevars.entgravity); // send music MSG_WriteByte (&buf, svc_cdtrack); MSG_WriteByte (&buf, 0); // none in demos // send server info string MSG_WriteByte (&buf, svc_stufftext); MSG_WriteString (&buf, va("fullserverinfo \"%s\"\n", svs.info) ); // flush packet SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); // soundlist MSG_WriteByte (&buf, svc_soundlist); MSG_WriteByte (&buf, 0); n = 0; s = sv.sound_name[n+1]; while (s) { MSG_WriteString (&buf, s); if (buf.cursize > MAX_MSGLEN/2) { MSG_WriteByte (&buf, 0); MSG_WriteByte (&buf, n); SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); MSG_WriteByte (&buf, svc_soundlist); MSG_WriteByte (&buf, n + 1); } n++; s = sv.sound_name[n+1]; } if (buf.cursize) { MSG_WriteByte (&buf, 0); MSG_WriteByte (&buf, 0); SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); } // modellist MSG_WriteByte (&buf, svc_modellist); MSG_WriteByte (&buf, 0); n = 0; s = sv.model_name[n+1]; while (s) { MSG_WriteString (&buf, s); if (buf.cursize > MAX_MSGLEN/2) { MSG_WriteByte (&buf, 0); MSG_WriteByte (&buf, n); SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); MSG_WriteByte (&buf, svc_modellist); MSG_WriteByte (&buf, n + 1); } n++; s = sv.model_name[n+1]; } if (buf.cursize) { MSG_WriteByte (&buf, 0); MSG_WriteByte (&buf, 0); SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); } // baselines { entity_state_t from; edict_t *ent; entity_state_t *state; memset(&from, 0, sizeof(from)); for (n = 0; n < sv.num_edicts; n++) { ent = EDICT_NUM(n); state = &ent->baseline; if (!state->number || !state->modelindex) { //ent doesn't have a baseline continue; } if (!ent) { MSG_WriteByte(&buf, svc_spawnbaseline); MSG_WriteShort (&buf, n); MSG_WriteByte (&buf, 0); MSG_WriteByte (&buf, 0); MSG_WriteByte (&buf, 0); MSG_WriteByte (&buf, 0); for (i=0 ; i<3 ; i++) { MSG_WriteCoord(&buf, 0); MSG_WriteAngle(&buf, 0); } } else { MSG_WriteByte(&buf, svc_spawnbaseline); MSG_WriteShort (&buf, n); MSG_WriteByte (&buf, state->modelindex&255); MSG_WriteByte (&buf, state->frame); MSG_WriteByte (&buf, (int)state->colormap); MSG_WriteByte (&buf, (int)state->skinnum); for (i=0 ; i<3 ; i++) { MSG_WriteCoord(&buf, state->s_origin[i]); MSG_WriteAngle(&buf, state->s_angles[i]); } } if (buf.cursize > MAX_MSGLEN/2) { SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); } } } //prespawn for (n = 0; n < sv.num_signon_buffers; n++) { if (buf.cursize+sv.signon_buffer_size[n] > MAX_MSGLEN/2) { SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); } SZ_Write (&buf, sv.signon_buffers[n], sv.signon_buffer_size[n]); } if (buf.cursize > MAX_MSGLEN/2) { SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); } MSG_WriteByte (&buf, svc_stufftext); MSG_WriteString (&buf, va("cmd spawn %i\n",svs.spawncount) ); if (buf.cursize) { SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); } // send current status of all other players for (i = 0; i < MAX_CLIENTS; i++) { player = svs.clients + i; MSG_WriteByte (&buf, svc_updatefrags); MSG_WriteByte (&buf, i); MSG_WriteShort (&buf, player->old_frags); MSG_WriteByte (&buf, svc_updateping); MSG_WriteByte (&buf, i); MSG_WriteShort (&buf, SV_CalcPing(player)); MSG_WriteByte (&buf, svc_updatepl); MSG_WriteByte (&buf, i); MSG_WriteByte (&buf, player->lossage); MSG_WriteByte (&buf, svc_updateentertime); MSG_WriteByte (&buf, i); MSG_WriteFloat (&buf, svs.realtime - player->connection_started); Q_strncpyz (info, player->userinfo, MAX_INFO_STRING); Info_RemovePrefixedKeys (info, '_'); // server passwords, etc MSG_WriteByte (&buf, svc_updateuserinfo); MSG_WriteByte (&buf, i); MSG_WriteLong (&buf, player->userid); MSG_WriteString (&buf, info); if (buf.cursize > MAX_MSGLEN/2) { SV_WriteRecordMVDMessage (&buf); SZ_Clear (&buf); } } // send all current light styles for (i=0 ; i<MAX_LIGHTSTYLES ; i++) { MSG_WriteByte (&buf, svc_lightstyle); MSG_WriteByte (&buf, (char)i); MSG_WriteString (&buf, sv.lightstyles[i]); } // get the client to check and download skins // when that is completed, a begin command will be issued MSG_WriteByte (&buf, svc_stufftext); MSG_WriteString (&buf, "skins\n"); SV_WriteRecordMVDMessage (&buf); SV_WriteSetMVDMessage(); singledest = NULL; // done return true; }
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"); }
void SV_Status_f (void) { int i, j, l; client_t *cl; float cpu, avg, pak; char *s; 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; Con_Printf ("net address : %s\n",NET_AdrToString (net_local_adr)); Con_Printf ("cpu utilization : %3i%%\n",(int)cpu); Con_Printf ("avg response time: %i ms\n",(int)avg); Con_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 Con_Printf ("name userid frags\n"); Con_Printf (" address rate ping drop\n"); Con_Printf (" ---------------- ---- ---- -----\n"); for (i=0,cl=svs.clients ; i<MAX_CLIENTS ; i++,cl++) { if (!cl->state) continue; Con_Printf ("%-16.16s ", cl->name); Con_Printf ("%6i %5i", cl->userid, (int)cl->edict->v.frags); if (cl->spectator) Con_Printf(" (s)\n"); else Con_Printf("\n"); s = NET_BaseAdrToString ( cl->netchan.remote_address); Con_Printf (" %-16.16s", s); if (cl->state == cs_connected) { Con_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { Con_Printf ("ZOMBIE\n"); continue; } Con_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 { Con_Printf ("frags userid address name rate ping drop qport\n"); Con_Printf ("----- ------ --------------- --------------- ---- ---- ----- -----\n"); for (i=0,cl=svs.clients ; i<MAX_CLIENTS ; i++,cl++) { if (!cl->state) continue; Con_Printf ("%5i %6i ", (int)cl->edict->v.frags, cl->userid); s = NET_BaseAdrToString ( cl->netchan.remote_address); Con_Printf ("%s", s); l = 16 - strlen(s); for (j=0 ; j<l ; j++) Con_Printf (" "); Con_Printf ("%s", cl->name); l = 16 - strlen(cl->name); for (j=0 ; j<l ; j++) Con_Printf (" "); if (cl->state == cs_connected) { Con_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { Con_Printf ("ZOMBIE\n"); continue; } Con_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) Con_Printf(" (s)\n"); else Con_Printf("\n"); } } Con_Printf ("\n"); }
/* ================ SV_Status_f ================ */ void SV_Status_f (void) { int i, j, l, num_min, num_sec; client_t *cl; float cpu, avg, pak, t_limit,f_limit; char *s; extern redirect_t sv_redirected; 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; Con_Printf ("net address : %s\n",NET_AdrToString (net_local_adr)); Con_Printf ("cpu utilization : %3i%%\n",(int)cpu); Con_Printf ("avg response time: %i ms\n",(int)avg); Con_Printf ("packets/frame : %5.2f\n", pak); t_limit = Cvar_VariableValue("timelimit"); f_limit = Cvar_VariableValue("fraglimit"); if(dmMode.value==DM_SIEGE) { num_min = floor((t_limit*60)-sv.time); num_sec = (int)(t_limit - num_min)%60; num_sec = floor(num_sec); num_min = floor((num_min - num_sec)/60); Con_Printf ("timeleft : %i:", num_min); Con_Printf ("%2i\n", num_sec); Con_Printf ("deflosses : %3i/%3i\n", floor(pr_global_struct->defLosses),floor(f_limit)); Con_Printf ("attlosses : %3i/%3i\n", floor(pr_global_struct->attLosses),floor(f_limit*2)); } else { Con_Printf ("time : %5.2f\n", sv.time); Con_Printf ("timelimit : %i\n", t_limit); Con_Printf ("fraglimit : %i\n", f_limit); } // min fps lat drp if (sv_redirected != RD_NONE) { // most remote clients are 40 columns // 0123456789012345678901234567890123456789 Con_Printf ("name userid frags\n"); Con_Printf (" address rate ping drop\n"); Con_Printf (" ---------------- ---- ---- -----\n"); for (i=0,cl=svs.clients ; i<MAX_CLIENTS ; i++,cl++) { if (!cl->state) continue; Con_Printf ("%-16.16s ", cl->name); Con_Printf ("%6i %5i", cl->userid, (int)cl->edict->v.frags); if (cl->spectator) Con_Printf(" (s)\n"); else Con_Printf("\n"); s = NET_BaseAdrToString ( cl->netchan.remote_address); Con_Printf (" %-16.16s", s); if (cl->state == cs_connected) { Con_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { Con_Printf ("ZOMBIE\n"); continue; } Con_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 { Con_Printf ("frags userid address name rate ping drop siege\n"); Con_Printf ("----- ------ --------------- --------------- ---- ---- ----- -----\n"); for (i=0,cl=svs.clients ; i<MAX_CLIENTS ; i++,cl++) { if (!cl->state) continue; Con_Printf ("%5i %6i ", (int)cl->edict->v.frags, cl->userid); s = NET_BaseAdrToString ( cl->netchan.remote_address); Con_Printf ("%s", s); l = 16 - strlen(s); for (j=0 ; j<l ; j++) Con_Printf (" "); Con_Printf ("%s", cl->name); l = 16 - strlen(cl->name); for (j=0 ; j<l ; j++) Con_Printf (" "); if (cl->state == cs_connected) { Con_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { Con_Printf ("ZOMBIE\n"); continue; } Con_Printf ("%4i %4i %5.2f" , (int)(1000*cl->netchan.frame_rate) , (int)SV_CalcPing (cl) , 100.0*cl->netchan.drop_count / cl->netchan.incoming_sequence); if (cl->spectator) Con_Printf(" (s)\n"); else { Con_Printf(" "); switch(cl->playerclass) { case CLASS_PALADIN: Con_Printf("P"); break; case CLASS_CLERIC: Con_Printf("C"); break; case CLASS_NECROMANCER: Con_Printf("N"); break; case CLASS_THEIF: Con_Printf("A"); break; case CLASS_DEMON: Con_Printf("S"); break; case CLASS_DWARF: Con_Printf("D"); break; default: Con_Printf("?"); break; } switch(cl->siege_team) { case ST_DEFENDER: Con_Printf("D"); break; case ST_ATTACKER: Con_Printf("A"); break; default: Con_Printf("?"); break; } if((int)cl->old_v.flags2&65536)//defender of crown Con_Printf("D"); else Con_Printf("-"); if((int)cl->old_v.flags2&524288)//has siege key Con_Printf("K"); else Con_Printf("-"); Con_Printf("\n"); } } } Con_Printf ("\n"); }
void SV_Status_f (void) { int i; client_t *cl; float cpu, avg, pak, demo = 0; const char *s; cpu = (svs.stats.latched_active + svs.stats.latched_idle); if (cpu) { demo = 100 * svs.stats.latched_demo / cpu; cpu = 100 * svs.stats.latched_active / cpu; } avg = 1000 * svs.stats.latched_active / STATFRAMES; pak = (float) svs.stats.latched_packets / STATFRAMES; SV_Printf ("net address : %s\n", NET_AdrToString (net_local_adr)); SV_Printf ("uptime : %s\n", nice_time (Sys_DoubleTime ())); SV_Printf ("cpu utilization : %3i%% (%3i%%)\n", (int) cpu, (int)demo); SV_Printf ("avg response time: %i ms\n", (int) avg); SV_Printf ("packets/frame : %5.2f\n", pak); // min fps lat drp if (sv_redirected != RD_NONE && sv_redirected != RD_MOD) { // most remote clients are 40 columns // 0123456789012345678901234567890123456789 SV_Printf ("name userid frags\n"); SV_Printf (" address rate ping drop\n"); SV_Printf (" ---------------- ---- ---- -----\n"); for (i = 0, cl = svs.clients; i < MAX_CLIENTS; i++, cl++) { if (!cl->state) continue; SV_Printf ("%-16.16s ", cl->name); SV_Printf ("%6i %5i", cl->userid, (int) SVfloat (cl->edict, frags)); if (cl->spectator) SV_Printf (" (s)\n"); else SV_Printf ("\n"); s = NET_BaseAdrToString (cl->netchan.remote_address); SV_Printf (" %-16.16s", s); if (cl->state == cs_connected) { SV_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { SV_Printf ("ZOMBIE\n"); continue; } if (cl->state == cs_server) { SV_Printf ("SERVER %d\n", cl->ping); continue; } SV_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 { SV_Printf ("frags userid address name rate ping " "drop qport\n"); SV_Printf ("----- ------ --------------- --------------- ---- ---- " "----- -----\n"); for (i = 0, cl = svs.clients; i < MAX_CLIENTS; i++, cl++) { if (!cl->state) continue; SV_Printf ("%5i %6i ", (int) SVfloat (cl->edict, frags), cl->userid); s = NET_BaseAdrToString (cl->netchan.remote_address); SV_Printf ("%-15.15s ", s); SV_Printf ("%-15.15s ", cl->name); if (cl->state == cs_connected) { SV_Printf ("CONNECTING\n"); continue; } if (cl->state == cs_zombie) { SV_Printf ("ZOMBIE\n"); continue; } if (cl->state == cs_server) { SV_Printf ("SERVER %d\n", cl->ping); continue; } SV_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) SV_Printf (" (s)\n"); else SV_Printf ("\n"); } } SV_Printf ("\n"); }