From 8062f15b5a7ea4d4d6a3010c58a84659bdc97ecb Mon Sep 17 00:00:00 2001 From: Paradox460 Date: Fri, 27 Jun 2008 01:12:51 +0000 Subject: [PATCH] Added Allstats (Issue 123) Cleaned a bit of !nobuild (Issue 128) --- src/game/g_admin.c | 18 ++++----- src/game/g_buildable.c | 49 ++---------------------- src/game/g_cmds.c | 84 ++++++++++++++++++++++++++++++++++++++++++ src/game/g_local.h | 4 ++ src/game/g_main.c | 8 +++- 5 files changed, 108 insertions(+), 55 deletions(-) diff --git a/src/game/g_admin.c b/src/game/g_admin.c index 6cd703b..7c51da2 100644 --- a/src/game/g_admin.c +++ b/src/game/g_admin.c @@ -2848,14 +2848,6 @@ qboolean G_admin_layoutsave( gentity_t *ent, int skiparg ) return qtrue; } -qboolean G_admin_nobuildsave( gentity_t *ent, int skiparg ) -{ - - trap_SendConsoleCommand( EXEC_APPEND, "nobuildsave" ); - AP( va( "print \"^3!nobuildsave: ^7nobuild saved by %s\n\"", ( ent ) ? ent->client->pers.netname : "console" ) ); - return qtrue; -} - qboolean G_admin_mute( gentity_t *ent, int skiparg ) { int pids[ MAX_CLIENTS ]; @@ -7740,7 +7732,7 @@ qboolean G_admin_nobuild( gentity_t *ent, int skiparg ) if( G_SayArgc() < minargc ) { - ADMP( "^3!buildno: ^7usage: !nobuild [game units]\n" ); + ADMP( "^3!nobuild: ^7usage: !nobuild [game units]\n" ); return qfalse; } @@ -7771,3 +7763,11 @@ qboolean G_admin_nobuild( gentity_t *ent, int skiparg ) return qtrue; } +qboolean G_admin_nobuildsave( gentity_t *ent, int skiparg ) +{ + + trap_SendConsoleCommand( EXEC_APPEND, "nobuildsave" ); + AP( va( "print \"^3!nobuildsave: ^7nobuild markers saved by %s\n\"", ( ent ) ? ent->client->pers.netname : "console" ) ); + + return qtrue; +} diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index c95cba6..5c21f09 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -3086,11 +3086,10 @@ itemBuildError_t G_CanBuild( gentity_t *ent, buildable_t buildable, int distance range[0] = nbent->nobuildarea; range[1] = nbent->nobuildarea; - range[2] = 0; + range[2] = 5; VectorAdd( nbent->r.currentOrigin, range, maxs3 ); VectorSubtract( nbent->r.currentOrigin, range, mins3 ); - maxs[2] += 5; num2 = trap_EntitiesInBox( mins3, maxs3, entitylist, MAX_GENTITIES ); for(i = 0; i < num2; i++) @@ -4522,47 +4521,6 @@ void G_NobuildSave( void ) trap_FS_FCloseFile( f ); } -int G_NobuildList( char *list, int len ) -{ - // up to 128 single character nobuild names could fit in nobuilds - char fileList[ ( MAX_CVAR_VALUE_STRING / 2 ) * 5 ] = {""}; - char nobuild[ MAX_CVAR_VALUE_STRING ] = {""}; - int numFiles, i, fileLen = 0, listLen; - int count = 0; - char *filePtr; - - numFiles = trap_FS_GetFileList( va( "nobuild" ), ".dat", - fileList, sizeof( fileList ) ); - filePtr = fileList; - for( i = 0; i < numFiles; i++, filePtr += fileLen + 1 ) - { - fileLen = strlen( filePtr ); - listLen = strlen( nobuild ); - if( fileLen < 5 ) - continue; - - // list is full, stop trying to add to it - if( ( listLen + fileLen ) >= sizeof( nobuild ) ) - break; - - Q_strcat( nobuild, sizeof( nobuild ), filePtr ); - listLen = strlen( nobuild ); - - // strip extension and add space delimiter - nobuild[ listLen - 4 ] = ' '; - nobuild[ listLen - 3 ] = '\0'; - count++; - } - if( count != numFiles ) - { - G_Printf( S_COLOR_YELLOW "WARNING: nobuild list was truncated to %d " - "nobuilds, but %d nobuild files exist in /nobuilds/.\n", - count, numFiles ); - } - Q_strncpyz( list, nobuild, len ); - return count + 1; -} - /* ============ G_NobuildLoad @@ -4598,8 +4556,9 @@ void G_NobuildLoad( void ) { if( i >= sizeof( line ) - 1 ) { - G_Printf( S_COLOR_RED "ERROR: line overflow in %s before \"%s\"\n", - va( "nobuild/%s.dat", map ), line ); + // Since nobuild will be loaded on every map load, or atleast attmepted to be loaded, im just going to disable this warning since its just spam. + /*G_Printf( S_COLOR_RED "ERROR: line overflow in %s before \"%s\"\n", + va( "nobuild/%s.dat", map ), line );*/ return; } line[ i++ ] = *nobuild; 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 8d54295..f13fc1b 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -24,7 +24,7 @@ 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 r71" +#define QVM_VERSION "SVN r72" level_locals_t level; @@ -248,6 +248,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 +478,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 ] );