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
This commit is contained in:
1 parent
22e70be40f
commit
c26e04a77c
7 files changed
+150
-14
No files matched your search
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 =
|
||||
|
||||
+88
-3
@@ -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 },
|
||||
|
||||
@@ -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 );
|
||||
|
||||
+53
-7
@@ -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;
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user