From 1c6bd56fb23f216865e9422cc006874f52926f35 Mon Sep 17 00:00:00 2001 From: Paradox460 Date: Sun, 6 Jan 2008 22:28:48 +0000 Subject: [PATCH] Applied global pause fix patch, now functions as its supposed to. Added listadmins search listing for immunity. --- src/game/g_active.c | 13 ++++- src/game/g_admin.c | 120 +++++++++++++++++++++++++++++++++-------- src/game/g_buildable.c | 9 +++- src/game/g_cmds.c | 8 +++ src/game/g_combat.c | 4 ++ src/game/g_local.h | 10 +++- src/game/g_main.c | 27 +++++----- src/game/g_weapon.c | 3 ++ 8 files changed, 151 insertions(+), 43 deletions(-) diff --git a/src/game/g_active.c b/src/game/g_active.c index 9464603..5bdf19b 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -870,7 +870,8 @@ void ClientTimerActions( gentity_t *ent, int msec ) } if( ent->health > 0 && ent->health < client->ps.stats[ STAT_MAX_HEALTH ] && - ( ent->lastDamageTime + ALIEN_REGEN_DAMAGE_TIME ) < level.time ) + ( ent->lastDamageTime + ALIEN_REGEN_DAMAGE_TIME ) < level.time && + !level.paused ) ent->health += BG_FindRegenRateForClass( client->ps.stats[ STAT_PCLASS ] ) * modifier; if( ent->health > client->ps.stats[ STAT_MAX_HEALTH ] ) @@ -1396,6 +1397,7 @@ void ClientThink_real( gentity_t *ent ) int oldEventSequence; int msec; usercmd_t *ucmd; + int real_pm_type; client = ent->client; @@ -1488,6 +1490,10 @@ void ClientThink_real( gentity_t *ent ) else client->ps.pm_type = PM_NORMAL; + // paused + real_pm_type = client->ps.pm_type; + if ( level.paused ) client->ps.pm_type = PM_SPECTATOR; + if( client->ps.stats[ STAT_STATE ] & SS_GRABBED && client->grabExpiryTime < level.time ) client->ps.stats[ STAT_STATE ] &= ~SS_GRABBED; @@ -1533,7 +1539,7 @@ void ClientThink_real( gentity_t *ent ) { BG_DeactivateUpgrade( UP_MEDKIT, client->ps.stats ); } - else if( client->ps.stats[ STAT_HEALTH ] > 0 ) + else if( client->ps.stats[ STAT_HEALTH ] > 0 && !level.paused ) { //remove anti toxin BG_DeactivateUpgrade( UP_MEDKIT, client->ps.stats ); @@ -1664,6 +1670,9 @@ void ClientThink_real( gentity_t *ent ) if( ent->client->ps.eventSequence != oldEventSequence ) ent->eventTime = level.time; + // paused pm_type restoration + if ( level.paused ) client->ps.pm_type = real_pm_type; + if( g_smoothClients.integer ) BG_PlayerStateToEntityStateExtraPolate( &ent->client->ps, &ent->s, ent->client->ps.commandTime, qtrue ); else diff --git a/src/game/g_admin.c b/src/game/g_admin.c index ef3b9a1..47b99f5 100644 --- a/src/game/g_admin.c +++ b/src/game/g_admin.c @@ -245,12 +245,14 @@ g_admin_cmd_t g_admin_cmds[ ] = }, {"pause", G_admin_pause, "S", - "prevent a player from interacting with the game.", - "(^5name|slot^7)" + "prevent a player from interacting with the game." + " * will pause all players, using no argument will pause game clock", + "(^5name|slot|*^7)" }, {"unpause", G_admin_pause, "S", - "allow a player to interact with the game", - "(^5name|slot^7)" + "allow a player to interact with the game." + " * will unpause all players, using no argument will unpause game clock", + "(^5name|slot|*^7)" }, {"buildlog", G_admin_buildlog, "U", @@ -1009,11 +1011,12 @@ static int admin_listadmins( gentity_t *ent, int start, char *search, int minlev break; } } - ADMBP( va( "%4i %4i %s^7 (*%s) %s^7\n", + ADMBP( va( "%4i %4i %s^7 (*%s) ^1%1s ^7%s^7\n", i, l, lname, guid_stub, + ( G_admin_permission( &g_entities[ i ], ADMF_BANIMMUNITY ) ) ? "I" : "", vic->client->pers.netname ) ); drawn++; } @@ -2793,6 +2796,12 @@ qboolean G_admin_listplayers( gentity_t *ent, int skiparg ) Q_strncpyz( immune, "I", sizeof( immune ) ); } + if( p->pers.paused ) + { + // use immunity slot for paused player status + Q_strncpyz( immune, "L", sizeof( immune ) ); + } + l = 0; G_SanitiseName( p->pers.netname, n2 ); n[ 0 ] = '\0'; @@ -3860,6 +3869,12 @@ qboolean G_admin_putmespec( gentity_t *ent, int skiparg ) ADMP( "!specme: sorry, but console isn't allowed on the spectators team\n"); return qfalse; } + + if( level.paused ) + { + ADMP("!specme: disabled when game is paused\n"); + return qfalse; + } if(ent->client->pers.teamSelection == PTE_NONE) return qfalse; @@ -4092,31 +4107,95 @@ AP( va( "print \"^3!unforcespec: ^7%s^7 has allowed joining of teams for ^7%s\n\ } +static qboolean G_admin_global_pause( gentity_t *ent, int skiparg ) +{ + if( level.paused ) + { + level.pauseTime = level.time; + ADMP( "^3!pause: ^7Game is already paused, unpause timer reset\n" ); + return qfalse; + } + + level.paused = qtrue; + level.pauseTime = level.time; + + level.pause_speed = g_speed.value; + level.pause_gravity = g_gravity.value; + level.pause_knockback = g_knockback.value; + level.pause_ff = g_friendlyFire.integer; + level.pause_ffb = g_friendlyBuildableFire.integer; + + g_speed.value = 0; + g_gravity.value = 0; + g_knockback.value = 0; + g_friendlyFire.integer = 0; + g_friendlyBuildableFire.integer = 0; + + CP( "cp \"^1Game is PAUSED\"" ); + AP( va( "print \"^3!pause: ^7The game has been paused by %s\n\"", + ( ent ) ? ent->client->pers.netname : "console" ) ); + + return qtrue; +} + +static qboolean G_admin_global_unpause( gentity_t *ent, int skiparg ) +{ + if( !level.paused ) + { + ADMP( "^3!unpause: ^7Game is not paused\n" ); + return qfalse; + } + + level.paused = qfalse; + + g_speed.value = level.pause_speed; + g_gravity.value = level.pause_gravity; + g_knockback.value = level.pause_knockback; + g_friendlyFire.integer = level.pause_ff; + g_friendlyBuildableFire.integer = level.pause_ffb; + + CP( "cp \"^2Game is RESUMED\"" ); + AP( va( "print \"^3!unpause: ^7The game has been resumed by %s\n\"", + ( ent ) ? ent->client->pers.netname : "console" ) ); + + return qtrue; +} + qboolean G_admin_pause( gentity_t *ent, int skiparg ) { //this is all very similar to denybuild, //it performs an essentially identical function int i, j = 0, pids[ MAX_CLIENTS + 1 ]; char name[ MAX_NAME_LENGTH ], err[ MAX_STRING_CHARS ]; char command[ MAX_ADMIN_CMD_LEN ], *cmd; - int minargc; qboolean targeted = qfalse; //targeted is set to ensure we don't get spam when pausing everybody gentity_t *vic; - minargc = 2 + skiparg; - - if( G_SayArgc() < minargc ) - { - //Removed game-wide pause, and made it echo an error message, with instructions. - ADMP( va( "^3!pause: ^7usage: ^3!pause ^7(^5name|slot^7)\n" ) ); - return qfalse; - } - G_SayArgv( skiparg, command, sizeof( command ) ); cmd = command; if( cmd && *cmd == '!' ) cmd++; - if( G_SayArgc() == 1 + skiparg ) + + if( G_SayArgc() < 2 + skiparg ) + { + // global pause + if( !Q_stricmp( cmd, "pause" ) ) + { + return G_admin_global_pause( ent, skiparg ); + } + else + { + return G_admin_global_unpause( ent, skiparg ); + } + } + if( G_SayArgc() != 2 + skiparg ) + { + ADMP( va( "^3!pause: ^7usage: ^7(^5name|slot|*^7)\n", cmd, cmd ) ); + return qfalse; + } + + G_SayArgv( 1 + skiparg, name, sizeof( name ) ); + if( !Q_stricmp( name, "*" ) ) { for( i = 0; i < MAX_CLIENTS; i++ ) { @@ -4130,9 +4209,8 @@ qboolean G_admin_pause( gentity_t *ent, int skiparg ) } pids[ j ] = -1; } - else if( G_SayArgc() == 2 + skiparg ) + else { - G_SayArgv( 1 + skiparg, name, sizeof( name ) ); if( G_ClientNumbersFromString( name, pids ) != 1 ) { G_MatchOnePlayer( pids, err, sizeof( err ) ); @@ -4141,11 +4219,7 @@ qboolean G_admin_pause( gentity_t *ent, int skiparg ) } targeted = qtrue; } - else if( G_SayArgc() > 2 + skiparg ) - { - ADMP( va( "^3!pause: ^7usage: ^7(^5name|slot^7)\n", cmd, cmd ) ); - return qfalse; - } + for( i = 0; pids[ i ] >= 0; i++ ) { vic = &g_entities[ pids[ i ] ]; diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 1138b39..2dbfa1f 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -1079,6 +1079,7 @@ void AAcidTube_Think( gentity_t *self ) continue; if( enemy->client && enemy->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS && + !level.paused && !enemy->client->pers.paused ) { self->timestamp = level.time; @@ -1154,6 +1155,7 @@ void AHive_Think( gentity_t *self ) continue; if( enemy->client && enemy->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS && + !level.paused && !enemy->client->pers.paused ) { self->active = qtrue; @@ -1751,6 +1753,7 @@ void HReactor_Think( gentity_t *self ) continue; if( enemy->client && !enemy->client->pers.paused && + !level.paused && enemy->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS ) { self->timestamp = level.time; @@ -2085,6 +2088,9 @@ qboolean HMGTurret_CheckTarget( gentity_t *self, gentity_t *target, qboolean ign if( target->client->pers.paused ) return qfalse; + if( level.paused ) + return qfalse; + if( target->health <= 0 ) return qfalse; @@ -2283,6 +2289,7 @@ void HTeslaGen_Think( gentity_t *self ) if( enemy->client && enemy->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS && enemy->health > 0 && !enemy->client->pers.paused && + !level.paused && Distance( enemy->s.pos.trBase, self->s.pos.trBase ) <= TESLAGEN_RANGE ) { VectorSubtract( enemy->s.pos.trBase, self->s.pos.trBase, dir ); @@ -2601,7 +2608,7 @@ void G_BuildableThink( gentity_t *ent, int msec ) //pack health, power and dcc //toggle spawned flag for buildables - if( !ent->spawned && ent->health > 0 && !level.pausedTime ) + if( !ent->spawned && ent->health > 0 ) { if( ent->buildTime + bTime < level.time ) ent->spawned = qtrue; diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 4525725..18a1068 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -4094,7 +4094,15 @@ void ClientCommand( int clientNum ) // do tests here to reduce the amount of repeated code if( !( cmds[ i ].cmdFlags & CMD_INTERMISSION ) && ( level.intermissiontime || level.paused ) ) + { + if ( level.paused && + cmds[ i ].cmdHandler == Cmd_Team_f ) + { + trap_SendServerCommand( clientNum, + "print \"Teams are locked when the game is paused\n\"" ); + } return; + } if( cmds[ i ].cmdFlags & CMD_CHEAT && !g_cheats.integer ) { diff --git a/src/game/g_combat.c b/src/game/g_combat.c index 17f2ccf..aba1f8a 100644 --- a/src/game/g_combat.c +++ b/src/game/g_combat.c @@ -1247,6 +1247,10 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, // check for godmode if ( targ->flags & FL_GODMODE && !g_devmapNoGod.integer) return; + + // paused + if ( level.paused ) + return; if(targ->s.eType == ET_BUILDABLE && g_cheats.integer && g_devmapNoStructDmg.integer) return; diff --git a/src/game/g_local.h b/src/game/g_local.h index 4e9a311..bf63f89 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -714,8 +714,14 @@ typedef struct qboolean uncondHumanWin; qboolean alienTeamLocked; qboolean humanTeamLocked; - qboolean paused; - int pausedTime; + + qboolean paused; + int pauseTime; + float pause_speed; + float pause_gravity; + float pause_knockback; + int pause_ff; + int pause_ffb; int unlaggedIndex; int unlaggedTimes[ MAX_UNLAGGED_MARKERS ]; diff --git a/src/game/g_main.c b/src/game/g_main.c index 94f76cf..7fd7e07 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -2387,20 +2387,19 @@ void G_RunFrame( int levelTime ) // if we are waiting for the level to restart, do nothing if( level.restarted ) return; - - - if( level.paused ) + + if( level.paused ) { - level.pausedTime = levelTime - level.time; - if( ( level.pausedTime % 3000 ) == 0) - trap_SendServerCommand( -1, "cp \"The game has been paused. Please wait.\"" ); - - for(i=0;i 3 * 60000 ) + { + trap_SendConsoleCommand( EXEC_APPEND, "!unpause" ); + } } level.framenum++; @@ -2545,8 +2544,6 @@ void G_RunFrame( int levelTime ) G_Printf( "%4i: %s\n", i, g_entities[ i ].classname ); trap_Cvar_Set( "g_listEntity", "0" ); - - level.pausedTime=0; } } diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index fe0cbfa..659f53f 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -1537,6 +1537,9 @@ void FireWeapon( gentity_t *ent ) VectorCopy( ent->s.pos.trBase, muzzle ); } + // paused + if ( level.paused ) return; + // fire the specific weapon switch( ent->s.weapon ) {