Applied global pause fix patch, now functions as its supposed to. Added listadmins search listing for immunity.
This commit is contained in:
1 parent
b95ce8be3d
commit
1c6bd56fb2
8 files changed
+151
-43
No files matched your search
+11
-2
@@ -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
|
||||
|
||||
+97
-23
@@ -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 ] ];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
+8
-2
@@ -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 ];
|
||||
|
||||
+12
-15
@@ -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<level.maxclients;i++)
|
||||
{
|
||||
level.clients[ i ].ps.commandTime = levelTime;
|
||||
}
|
||||
|
||||
return;
|
||||
if( ( levelTime % 6000 ) == 0)
|
||||
trap_SendServerCommand( -1, "cp \"^3Game is paused.\"" );
|
||||
|
||||
level.startTime += levelTime - level.time;
|
||||
trap_SetConfigstring( CS_LEVEL_START_TIME, va( "%i", level.startTime ) );
|
||||
|
||||
if( levelTime - level.pauseTime > 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user