diff --git a/src/game/g_client.c b/src/game/g_client.c index 6ea2b07..921578f 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -928,6 +928,10 @@ static void ClientCleanName( const char *in, char *out, int outSize ) if( !*p && ch == ' ' ) continue; + // don't allow chars not in the font set + if( ch < ' ' || ch > '~' ) + continue; + // check colors if( ch == Q_COLOR_ESCAPE ) { diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 34e5d0d..ea3f51a 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -4069,6 +4069,89 @@ char *G_statsString( statsCounters_t *sc, pTeam_t *pt ) return s; } + /* + ================= + Cmd_AllStats_f + ================= + */ + void Cmd_AllStats_f( gentity_t *ent ) + { + int i; + int NextViewTime; + qboolean HasResults; + gentity_t *tmpent; + + //check if ent exists + if(!ent) return; + + NextViewTime = ent->client->pers.statscounters.AllstatstimeLastViewed + g_AllStatsTime.integer * 1000; + //check if you can use the cmd at this time + if( !level.intermissiontime && level.time < NextViewTime) + { + ADMP( va("You may only check your stats every %i Seconds and during intermission. Next valid time is %d:%02d\n",( g_AllStatsTime.integer ) ? ( g_AllStatsTime.integer ) : 60, ( NextViewTime / 60000 ), ( NextViewTime / 1000 ) % 60 ) ); + return; + } + //see if allstats is enabled + if( !g_AllStats.integer ) + { + ADMP( "AllStats has been disabled\n"); + return; + } + + //display a header describing the data + ADMP( "^3 K A SK| D F S TK| DD| SB| Name\n" ); + HasResults = qfalse; + //loop through the clients that are connected + for( i = 0; i < level.numConnectedClients; i++ ) + { + //assign a tempent 4 the hell of it + tmpent = &g_entities[ level.sortedClients[ i ] ]; + + //check for what mode we are working in and display relevent data + if( g_AllStats.integer == 1 ) + { + //check if client is connected and on same team + if( tmpent->client && tmpent->client->pers.connected == CON_CONNECTED && tmpent->client->pers.teamSelection == ent->client->pers.teamSelection && tmpent->client->pers.teamSelection != PTE_NONE ) + { + ADMP( va( "^7%3i %3i %3i^3|^7%3i %3i %3i %3i^3|^7%5i^3|^7%3i^3|^7 %s\n", + ( tmpent->client->pers.statscounters.kills ) ? tmpent->client->pers.statscounters.kills : 0, + ( tmpent->client->pers.statscounters.assists ) ? tmpent->client->pers.statscounters.assists : 0, + ( tmpent->client->pers.statscounters.structskilled ) ? tmpent->client->pers.statscounters.structskilled : 0, + ( tmpent->client->pers.statscounters.deaths ) ? tmpent->client->pers.statscounters.deaths : 0, + ( tmpent->client->pers.statscounters.feeds ) ? tmpent->client->pers.statscounters.feeds : 0, + ( tmpent->client->pers.statscounters.suicides ) ? tmpent->client->pers.statscounters.suicides : 0, + ( tmpent->client->pers.statscounters.teamkills ) ? tmpent->client->pers.statscounters.teamkills : 0, + ( tmpent->client->pers.statscounters.dmgdone ) ? tmpent->client->pers.statscounters.dmgdone : 0, + ( tmpent->client->pers.statscounters.structsbuilt ) ? tmpent->client->pers.statscounters.structsbuilt : 0, + ( tmpent->client->pers.netname ) ? tmpent->client->pers.netname : "Unknown" ) ); + HasResults = qtrue; + } + } + else if( g_AllStats.integer == 2 ) + { + //check if client is connected and has some stats or atleast is on a team + if( tmpent->client && tmpent->client->pers.connected == CON_CONNECTED && ( tmpent->client->pers.teamSelection != PTE_NONE ) ) + { + ADMP( va( "^7%3i %3i %3i^3|^7%3i %3i %3i %3i^3|^7%5i^3|^7%3i^3|^7 %s\n", + ( tmpent->client->pers.statscounters.kills ) ? tmpent->client->pers.statscounters.kills : 0, + ( tmpent->client->pers.statscounters.assists ) ? tmpent->client->pers.statscounters.assists : 0, + ( tmpent->client->pers.statscounters.structskilled ) ? tmpent->client->pers.statscounters.structskilled : 0, + ( tmpent->client->pers.statscounters.deaths ) ? tmpent->client->pers.statscounters.deaths : 0, + ( tmpent->client->pers.statscounters.feeds ) ? tmpent->client->pers.statscounters.feeds : 0, + ( tmpent->client->pers.statscounters.suicides ) ? tmpent->client->pers.statscounters.suicides : 0, + ( tmpent->client->pers.statscounters.teamkills ) ? tmpent->client->pers.statscounters.teamkills : 0, + ( tmpent->client->pers.statscounters.dmgdone ) ? tmpent->client->pers.statscounters.dmgdone : 0, + ( tmpent->client->pers.statscounters.structsbuilt ) ? tmpent->client->pers.statscounters.structsbuilt : 0, + ( tmpent->client->pers.netname ) ? tmpent->client->pers.netname : "Unknown" ) ); + HasResults = qtrue; + } + } + } + if( HasResults == qfalse ) ADMP( " ^3EMPTY!\n" ); + //update time last viewed + ent->client->pers.statscounters.AllstatstimeLastViewed = level.time; + return; +} /* ================= @@ -4942,6 +5025,7 @@ commands_t cmds[ ] = { { "score", CMD_INTERMISSION, ScoreboardMessage }, { "mystats", CMD_TEAM|CMD_INTERMISSION, Cmd_MyStats_f }, + { "allstats", 0|CMD_INTERMISSION, Cmd_AllStats_f }, { "teamstatus", CMD_TEAM, Cmd_TeamStatus_f }, diff --git a/src/game/g_local.h b/src/game/g_local.h index 80300ff..fb06095 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -348,6 +348,7 @@ typedef struct int dretchbasytime; int jetpackusewallwalkusetime; int timeLastViewed; + int AllstatstimeLastViewed; } statsCounters_t; // client data that stays across multiple respawns, but is cleared @@ -1441,6 +1442,9 @@ extern vmCvar_t g_instantBuild; // Enable instant building outside of d extern vmCvar_t g_teamStatus; // Allow the use of /teamstatus extern vmCvar_t g_teamStatusTime; // Allow the use of /teamstatus +extern vmCvar_t g_AllStats; +extern vmCvar_t g_AllStatsTime; + void trap_Printf( const char *fmt ); void trap_Error( const char *fmt ); int trap_Milliseconds( void ); diff --git a/src/game/g_main.c b/src/game/g_main.c index 66274d1..4b9ff2c 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -24,7 +24,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "g_local.h" #define QVM_VARIANT "P-G-QVM" -#define QVM_VERSION "SVN r73" +//#define QVM_VERSION "SVN r73" //Use this if your releasing a version or dont have svn installed. If you dont have svn, please use a syntax similar to SVN r# +#define QVM_VERSION "SVN r" SVN_VERSION //Use this if you have SVN installed + level_locals_t level; @@ -248,6 +250,9 @@ vmCvar_t g_teamStatusTime; vmCvar_t g_instantBuild; +vmCvar_t g_AllStats; +vmCvar_t g_AllStatsTime; + static cvarTable_t gameCvarTable[ ] = { // don't override the cheat state set by the system @@ -475,6 +480,9 @@ static cvarTable_t gameCvarTable[ ] = { &g_randomLayoutPercent, "g_randomLayoutPercent", "100", CVAR_ARCHIVE, 0, qfalse }, { &g_randomMaps, "g_randomMaps", "1", CVAR_ARCHIVE, 0, qfalse }, { &g_randomMapList, "g_randomMapList", "", CVAR_ARCHIVE, 0, qfalse }, + + { &g_AllStats, "g_AllStats", "", CVAR_ARCHIVE, 0, qfalse }, + { &g_AllStatsTime, "g_AllStatsTime", "", CVAR_ARCHIVE, 0, qfalse }, }; static int gameCvarTableSize = sizeof( gameCvarTable ) / sizeof( gameCvarTable[ 0 ] );