Try the following (untested, but it compiles)
Index: src/game/g_local.h
===================================================================
--- src/game/g_local.h (Revision 174)
+++ src/game/g_local.h (Arbeitskopie)
@@ -730,6 +730,9 @@
qboolean suddenDeath;
int suddenDeathBeginTime;
timeWarning_t suddenDeathWarning;
+ qboolean extremeSuddenDeath;
+ int extremeSuddenDeathBeginTime;
+ timeWarning_t extremeSuddenDeathWarning;
timeWarning_t timelimitWarning;
spawnQueue_t alienSpawnQueue;
@@ -1081,6 +1084,7 @@
void CheckTeamVote( int teamnum );
void LogExit( const char *string );
int G_TimeTilSuddenDeath( void );
+int G_TimeTilExtremeSuddenDeath( void );
void CheckMsgTimer( void );
qboolean G_Flood_Limited( gentity_t *ent );
@@ -1244,6 +1248,8 @@
extern vmCvar_t g_suddenDeathTime;
extern vmCvar_t g_suddenDeath;
extern vmCvar_t g_suddenDeathMode;
+extern vmCvar_t g_extremeSuddenDeathTime;
+extern vmCvar_t g_extremeSuddenDeath;
extern vmCvar_t g_friendlyFire;
extern vmCvar_t g_friendlyFireHumans;
extern vmCvar_t g_friendlyFireAliens;
Index: src/game/g_active.c
===================================================================
--- src/game/g_active.c (Revision 174)
+++ src/game/g_active.c (Arbeitskopie)
@@ -1770,7 +1770,7 @@
// Give clients some credit periodically
if( ent->client->lastKillTime + FREEKILL_PERIOD < level.time )
{
- if( !g_suddenDeath.integer ) {
+ if( !(g_suddenDeath.integer || g_extremeSuddenDeath.integer) ) {
if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
G_AddCreditToClient( ent->client, FREEKILL_ALIEN, qtrue );
if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
Index: src/game/g_main.c
===================================================================
--- src/game/g_main.c (Revision 174)
+++ src/game/g_main.c (Arbeitskopie)
@@ -47,6 +47,8 @@
vmCvar_t g_suddenDeathTime;
vmCvar_t g_suddenDeath;
vmCvar_t g_suddenDeathMode;
+vmCvar_t g_extremeSuddenDeathTime;
+vmCvar_t g_extremeSuddenDeath;
vmCvar_t g_capturelimit;
vmCvar_t g_friendlyFire;
vmCvar_t g_friendlyFireAliens;
@@ -208,6 +210,8 @@
{ &g_suddenDeathTime, "g_suddenDeathTime", "30", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
{ &g_suddenDeathMode, "g_suddenDeathMode", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
{ &g_suddenDeath, "g_suddenDeath", "0", CVAR_SERVERINFO | CVAR_NORESTART, 0, qtrue },
+ { &g_extremeSuddenDeathTime, "g_extremeSuddenDeathTime", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
+ { &g_extremeSuddenDeath, "g_extremeSuddenDeath", "0", 0, 0, qfalse },
{ &g_synchronousClients, "g_synchronousClients", "0", CVAR_SYSTEMINFO, 0, qfalse },
@@ -741,7 +745,9 @@
trap_Cvar_Set( "g_alienKills", 0 );
trap_Cvar_Set( "g_humanKills", 0 );
trap_Cvar_Set( "g_suddenDeath", 0 );
+ trap_Cvar_Set( "g_extremeSuddenDeath", 0 );
level.suddenDeathBeginTime = g_suddenDeathTime.integer * 60000;
+ level.extremeSuddenDeathBeginTime = g_extremeSuddenDeathTime.integer * 60000;
G_Printf( "-----------------------------------\n" );
@@ -1179,6 +1185,19 @@
}
+/*
+============
+G_TimeTilExtremeSuddenDeath
+============
+*/
+int G_TimeTilExtremeSuddenDeath( void )
+{
+ if( (!g_extremeSuddenDeathTime.integer && level.extremeSuddenDeathBeginTime == 0 ) || level.extremeSuddenDeathBeginTime < 0 )
+ return 999999999; // Always some time away
+
+ return ( ( level.extremeSuddenDeathBeginTime ) - ( level.time - level.startTime ) );
+}
+
#define PLAYER_COUNT_MOD 5.0f
/*
@@ -1262,8 +1281,44 @@
}
}
}
+ if(!level.extremeSuddenDeath)
+ {
+ if(g_extremeSuddenDeath.integer || G_TimeTilExtremeSuddenDeath( ) <= 0 ) //Conditions to enter ESD
+ {
+ //begin extreme sudden death
+ if( level.extremeSuddenDeathWarning < TW_PASSED )
+ {
+ trap_SendServerCommand( -1, "cp \"Extreme Sudden Death!\"" );
+ G_LogPrintf("Beginning Extreme Sudden Death\n");
+ localHTP = 0;
+ localATP = 0;
+
+ level.extremeSuddenDeathBeginTime = level.time;
+ level.extremeSuddenDeath=qtrue;
+ trap_Cvar_Set( "g_extremeSuddenDeath", "1" );
+
+ level.extremeSuddenDeathWarning = TW_PASSED;
+ }
+ }
+ else
+ {
+ //warn about sudden death
+ if( ( G_TimeTilExtremeSuddenDeath( ) <= 60000 ) &&
+ ( level.extremeSuddenDeathWarning < TW_IMMINENT ) )
+ {
+ trap_SendServerCommand( -1, va("cp \"Extreme Sudden Death in %d seconds!\"",
+ (int)(G_TimeTilExtremeSuddenDeath() / 1000 ) ) );
+ level.extremeSuddenDeathWarning = TW_IMMINENT;
+ }
+ }
+ }
//set BP at each cycle
+ if( g_extremeSuddenDeath.integer )
+ {
+ localHTP = 0;
+ localATP = 0;
+ }
if( g_suddenDeath.integer )
{
localHTP = level.suddenDeathHBuildPoints;
@@ -1942,7 +1997,7 @@
}
Com_sprintf( data, BIG_INFO_STRING,
- "%s %s T:%c A:%f H:%f M:%s D:%d SD:%d AS:%d AS2T:%d AS3T:%d HS:%d HS2T:%d HS3T:%d CL:%d",
+ "%s %s T:%c A:%f H:%f M:%s D:%d SD:%d ESD:%d AS:%d AS2T:%d AS3T:%d HS:%d HS2T:%d HS3T:%d CL:%d",
Q3_VERSION,
g_tag.string,
teamChar,
@@ -1951,6 +2006,7 @@
map,
level.time - level.startTime,
G_TimeTilSuddenDeath( ),
+ G_TimeTilExtremeSuddenDeath( ),
g_alienStage.integer,
level.alienStage2Time - level.startTime,
level.alienStage3Time - level.startTime,
Index: src/game/g_cmds.c
===================================================================
--- src/game/g_cmds.c (Revision 174)
+++ src/game/g_cmds.c (Arbeitskopie)
@@ -1726,7 +1726,7 @@
else
{
level.votePassThreshold = g_suddenDeathVotePercent.integer;
- Com_sprintf( level.voteString, sizeof( level.voteString ), "suddendeath" );
+ Com_sprintf( level.voteString, sizeof( level.voteString ), "set g_suddenDeath 1" );
Com_sprintf( level.voteDisplayString,
sizeof( level.voteDisplayString ), "Begin sudden death" );
@@ -1735,6 +1735,36 @@
}
}
+ else if( !Q_stricmp( arg1, "extreme_sudden_death" ) ||
+ !Q_stricmp( arg1, "extremesuddendeath" ) )
+ {
+ if(!g_suddenDeathVotePercent.integer)
+ {
+ trap_SendServerCommand( ent-g_entities, "print \"Sudden Death votes have been disabled\n\"" );
+ return;
+ }
+ else if( g_extremeSuddenDeath.integer )
+ {
+ trap_SendServerCommand( ent - g_entities, va( "print \"callvote: Extreme Sudden Death has already begun\n\"") );
+ return;
+ }
+ else if( G_TimeTilExtremeSuddenDeath() <= g_suddenDeathVoteDelay.integer * 1000 )
+ {
+ trap_SendServerCommand( ent - g_entities, va( "print \"callvote: Extreme Sudden Death is already immenent\n\"") );
+ return;
+ }
+ else
+ {
+ level.votePassThreshold = g_suddenDeathVotePercent.integer;
+ Com_sprintf( level.voteString, sizeof( level.voteString ), "set g_extremeSuddenDeath 1" );
+ Com_sprintf( level.voteDisplayString,
+ sizeof( level.voteDisplayString ), "Begin extreme sudden death" );
+
+ if( g_suddenDeathVoteDelay.integer )
+ Q_strcat( level.voteDisplayString, sizeof( level.voteDisplayString ), va( " in %d seconds", g_suddenDeathVoteDelay.integer ) );
+
+ }
+ }
else
{
trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string\n\"" );
@@ -2723,7 +2753,7 @@
return;
// Don't allow destruction of buildables that cannot be rebuilt
- if(g_suddenDeath.integer && traceEnt->health > 0 &&
+ if((g_suddenDeath.integer || g_extremeSuddenDeath.integer) && traceEnt->health > 0 &&
( ( g_suddenDeathMode.integer == SDMODE_SELECTIVE &&
!BG_FindReplaceableTestForBuildable( traceEnt->s.modelindex ) ) ||
( g_suddenDeathMode.integer == SDMODE_BP &&