From c26e04a77cd91b22166d0d8fa702ad7eda314e46 Mon Sep 17 00:00:00 2001 From: Paradox460 Date: Sun, 22 Jun 2008 20:55:32 +0000 Subject: [PATCH] Added Teamstatus command `/teamstatus`. Shows you the status of your base (nodes/eggs, om/reac, etc). Cvar `g_teamStatus` to toggle (Issue 120) Added Welcome Messages feature. Sends welcome messages to connecting players. `g_welcomeMsg` is message sent to players (supports \n), `g_welcomeMsgTime` is the duration of display. (Issue 118) Increased `!listmaps` display to 256. (Issue 117) Fixed Medi-Radioactive Rets glitch (Issue 116) Fixed vote math issues with 50%. (Issue 115) Added instant build, `g_instantBuild`. (Issue 112) Changed `qvm_version` appearance, removed website, added time. Updated wiki/Changelog.wiki This will be v 1.6.1 --- src/game/g_active.c | 2 +- src/game/g_admin.c | 2 +- src/game/g_buildable.c | 2 +- src/game/g_cmds.c | 91 ++++++++++++++++++++++++++++++++++++++++-- src/game/g_local.h | 5 +++ src/game/g_main.c | 60 ++++++++++++++++++++++++---- src/game/g_weapon.c | 2 +- 7 files changed, 150 insertions(+), 14 deletions(-) diff --git a/src/game/g_active.c b/src/game/g_active.c index 8f77aae..e98ee21 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -905,7 +905,7 @@ void ClientTimerActions( gentity_t *ent, int msec ) client->radiationTimer--; // could be set to 0 but then would be too easy to exploit } else - client->radiationTimer = 0; + client->radiationTimer = -1; //replenish alien health diff --git a/src/game/g_admin.c b/src/game/g_admin.c index df1f335..b809fd9 100644 --- a/src/game/g_admin.c +++ b/src/game/g_admin.c @@ -6920,7 +6920,7 @@ qboolean G_admin_maplog( gentity_t *ent, int skiparg ) return qtrue; } -#define MAX_LISTMAPS_MAPS 128 +#define MAX_LISTMAPS_MAPS 256 static int SortMaps(const void *a, const void *b) { diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index cb7ae3e..1c9a92d 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -3397,7 +3397,7 @@ static gentity_t *G_Build( gentity_t *builder, buildable_t buildable, vec3_t ori built->spawnBlockTime = 0; // build instantly in cheat mode - if( builder->client && g_cheats.integer ) + if( builder->client && g_cheats.integer || g_instantBuild.integer ) { built->health = BG_FindHealthForBuildable( buildable ); built->buildTime = built->s.time = diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 76eb6e1..6669ed6 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -3059,10 +3059,11 @@ void Cmd_Destroy_f( gentity_t *ent ) G_Damage( traceEnt, ent, ent, forward, tr.endpos, 10000, 0, MOD_SUICIDE ); else G_FreeEntity( traceEnt ); - - if( !g_cheats.integer ) + if( !g_instantBuild.integer ){ + if( !g_cheats.integer ){ ent->client->ps.stats[ STAT_MISC ] += - BG_FindBuildDelayForWeapon( ent->s.weapon ) >> 2; + BG_FindBuildDelayForWeapon( ent->s.weapon ) >> 2;}} + } } } @@ -4069,6 +4070,88 @@ char *G_statsString( statsCounters_t *sc, pTeam_t *pt ) } +/* +================= +Cmd_TeamStatus_f +================= +*/ +void Cmd_TeamStatus_f( gentity_t *ent ) +{ + int i; + int builders = 0; + char *omrc; + gentity_t *tmp; + qboolean found = qfalse; + + if( !g_teamStatus.integer ) + return; + + if( ent->client->pers.teamSelection == PTE_ALIENS ){ + + for ( i = 1, tmp = g_entities + i; i < level.num_entities; i++, tmp++ ) + { + if( tmp->s.eType != ET_BUILDABLE ) + continue; + if( tmp->s.modelindex == BA_A_OVERMIND ){ + omrc = va("^3OM: %s(%d)^3", ( tmp->health <= 0 ) ? "^1Down" : "^2Up", (tmp->health * 100 / OVERMIND_HEALTH ) ); + found = qtrue; + break; + } + } + + for( i = 0; i < level.maxclients; i++ ) + { + tmp = &g_entities[ i ]; + if( !tmp->client ) + continue; + if( tmp->client->pers.connected != CON_CONNECTED ) + continue; + if( tmp->client->pers.teamSelection == PTE_NONE ) + continue; + if( ( tmp->client->ps.stats[ STAT_PCLASS ] == PCL_ALIEN_BUILDER0 || + tmp->client->ps.stats[ STAT_PCLASS ] == PCL_ALIEN_BUILDER0_UPG ) ){ + builders++; + } + } + if( found == qfalse ) + omrc = "^3OM: ^1Down(0)^3"; + G_Say( ent, NULL, SAY_TEAM, va("%s ^3Eggs: ^6%i^3 Builders: ^6%i^7", omrc, level.numAlienSpawns, builders )); + } + + if( ent->client->pers.teamSelection == PTE_HUMANS ){ + + for ( i = 1, tmp = g_entities + i; i < level.num_entities; i++, tmp++ ) + { + if( tmp->s.eType != ET_BUILDABLE ) + continue; + if( tmp->s.modelindex == BA_H_REACTOR ){ + omrc = va("^3RC: %s(%d)^3", ( tmp->health <= 0 ) ? "^1Down" : "^2Up", (tmp->health * 100 / REACTOR_HEALTH ) ); + found = qtrue; + break; + } + } + + for( i = 0; i < level.maxclients; i++ ) + { + tmp = &g_entities[ i ]; + if( !tmp->client ) + continue; + if( tmp->client->pers.connected != CON_CONNECTED ) + continue; + if( tmp->client->pers.teamSelection == PTE_NONE ) + continue; + if( ( BG_InventoryContainsWeapon( WP_HBUILD, tmp->client->ps.stats ) || + BG_InventoryContainsWeapon( WP_HBUILD2, tmp->client->ps.stats ) ) ){ + builders++; + } + } + if( found == qfalse ) + omrc = "^3RC: ^1Down(0)^3"; + G_Say( ent, NULL, SAY_TEAM, va("%s ^3Telenodes: ^6%i^3 Builders: ^6%i^7", omrc, level.numHumanSpawns, builders )); + } + + return; +} /* ================= @@ -4810,6 +4893,8 @@ commands_t cmds[ ] = { { "score", CMD_INTERMISSION, ScoreboardMessage }, { "mystats", CMD_TEAM|CMD_INTERMISSION, Cmd_MyStats_f }, + { "teamstatus", CMD_TEAM, Cmd_TeamStatus_f }, + // cheats { "give", CMD_CHEAT|CMD_TEAM|CMD_LIVING, Cmd_Give_f }, diff --git a/src/game/g_local.h b/src/game/g_local.h index 28ad798..2cebd99 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -1401,6 +1401,8 @@ extern vmCvar_t g_practiceCount; extern vmCvar_t g_msg; extern vmCvar_t g_msgTime; +extern vmCvar_t g_welcomeMsg; +extern vmCvar_t g_welcomeMsgTime; extern vmCvar_t g_banNotice; @@ -1427,6 +1429,9 @@ extern vmCvar_t g_modAlienRate; // Alien fire rate extern vmCvar_t g_modWeaponAmmo; // Weapon ammo per clip extern vmCvar_t g_modWeaponReload; // Weapon reload time extern vmCvar_t g_modTurretAngle; // Allow high turret build angles +extern vmCvar_t g_instantBuild; // Enable instant building outside of devmap mode + +extern vmCvar_t g_teamStatus; // Allow the use of /teamstatus void trap_Printf( const char *fmt ); void trap_Error( const char *fmt ); diff --git a/src/game/g_main.c b/src/game/g_main.c index 7b6ada8..1babf7e 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -24,8 +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 r64" -#define QVM_URL "http://p-g-qvm.googlecode.com" +#define QVM_VERSION "SVN r65" level_locals_t level; @@ -210,6 +209,8 @@ vmCvar_t g_practiceCount; vmCvar_t g_msg; vmCvar_t g_msgTime; +vmCvar_t g_welcomeMsg; +vmCvar_t g_welcomeMsgTime; vmCvar_t g_buyAll; vmCvar_t g_multipleWeapons; @@ -241,6 +242,11 @@ vmCvar_t g_modWeaponAmmo; vmCvar_t g_modWeaponReload; vmCvar_t g_modTurretAngle; +vmCvar_t g_teamStatus; + + +vmCvar_t g_instantBuild; + static cvarTable_t gameCvarTable[ ] = { // don't override the cheat state set by the system @@ -295,6 +301,8 @@ static cvarTable_t gameCvarTable[ ] = { &g_modWeaponAmmo, "g_modWeaponAmmo", "0", CVAR_ARCHIVE, 0, qfalse }, { &g_modWeaponReload, "g_modWeaponReload", "0", CVAR_ARCHIVE, 0, qfalse }, { &g_modTurretAngle, "g_modTurretAngle", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_teamStatus, "g_teamStatus", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_instantBuild, "g_instantBuild", "0", CVAR_ARCHIVE, 0, qfalse }, { &g_proximityMines, "g_proximityMines", "0", 0, 0, qtrue }, { &g_proximityMinesPrice, "g_proximityMinesPrice", "800", 0, 0, qtrue }, @@ -453,6 +461,8 @@ static cvarTable_t gameCvarTable[ ] = { &g_msg, "g_msg", "", CVAR_ARCHIVE, 0, qfalse }, { &g_msgTime, "g_msgTime", "0", CVAR_ARCHIVE, 0, qfalse }, + { &g_welcomeMsg, "g_welcomeMsg", "", CVAR_ARCHIVE, 0, qfalse }, + { &g_welcomeMsgTime, "g_welcomeMsgTime", "0", CVAR_ARCHIVE, 0, qfalse }, { &g_rankings, "g_rankings", "0", 0, 0, qfalse }, { &g_allowShare, "g_allowShare", "1", CVAR_ARCHIVE | CVAR_SERVERINFO, 0, qfalse}, @@ -765,11 +775,11 @@ void G_InitGame( int levelTime, int randomSeed, int restart ) level.snd_fry = G_SoundIndex( "sound/misc/fry.wav" ); // FIXME standing in lava / slime - trap_Cvar_Set( "qvm_version", va( "%s %s %s %s", + trap_Cvar_Set( "qvm_version", va( "%s %s (%s %s)", QVM_VARIANT, QVM_VERSION, - QVM_URL, - __DATE__ ) ); + __DATE__, + __TIME__ ) ); if( g_logFile.string[ 0 ] ) { @@ -2403,13 +2413,17 @@ void CheckVote( void ) if( !level.voteTime ) return; + // when over 50% needed, change to 'yes >= needed' + if( votePercentToPass > 50 ) + votePercentToPass--; + if( level.voteYes || level.voteNo ) { voteYesPercent = (int)(100* (level.voteYes)/(level.voteYes + level.voteNo)); } if( level.time - level.voteTime >= VOTE_TIME || ( level.voteYes + level.voteNo == level.numConnectedClients ) ) { - if( voteYesPercent >= votePercentToPass || level.voteNo == 0 ) + if( voteYesPercent> votePercentToPass || level.voteNo == 0 ) { // execute the command, then remove the vote result = "^2passed"; @@ -2422,7 +2436,7 @@ void CheckVote( void ) } else { - if( level.voteYes >= (int)((double)level.numConnectedClients * ((double)votePercentToPass/100.0)) ) + if( level.voteYes > (int)((double)level.numConnectedClients * ((double)votePercentToPass/100.0)) ) { // execute the command, then remove the vote result = "^2passed"; @@ -2535,6 +2549,38 @@ CheckMsgTimer */ void CheckMsgTimer( void ) { + static int LastTime = 0; + + if( level.time - LastTime < 1000 ) + return; + + LastTime = level.time; + + if( g_welcomeMsgTime.integer && g_welcomeMsg.string[ 0 ] ) + { + char buffer[ MAX_STRING_CHARS ]; + int wt; + int i; + + buffer[ 0 ] = '\0'; + wt = g_welcomeMsgTime.integer * 1000; + for( i = 0; i < level.maxclients; i++ ) + { + if( level.clients[ i ].pers.connected != CON_CONNECTED ) + continue; + + if( level.time - level.clients[ i ].pers.enterTime < wt ) + { + if( buffer[ 0 ] == '\0' ) + { + Q_strncpyz( buffer, g_welcomeMsg.string, sizeof( buffer ) ); + G_ParseEscapedString( buffer ); + } + trap_SendServerCommand( i, va( "cp \"%s\"", buffer ) ); + } + } + } + if( !g_msgTime.integer ) return; diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index b45ffa7..01f15e3 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -762,7 +762,7 @@ void buildFire( gentity_t *ent, dynMenu_t menu ) if( G_BuildIfValid( ent, ent->client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) ) { - if( g_cheats.integer ) + if( g_cheats.integer || g_instantBuild.integer ) { ent->client->ps.stats[ STAT_MISC ] = 0; }