summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/bg_pmove.c4
-rw-r--r--src/game/g_active.c46
-rw-r--r--src/game/g_admin.c285
-rw-r--r--src/game/g_buildable.c81
-rw-r--r--src/game/g_client.c26
-rw-r--r--src/game/g_cmds.c161
-rw-r--r--src/game/g_combat.c17
-rw-r--r--src/game/g_main.c24
-rw-r--r--src/game/g_svcmds.c4
9 files changed, 286 insertions, 362 deletions
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index e1129dcf..d0f0a1c6 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -2694,10 +2694,10 @@ PM_BeginWeaponChange
*/
static void PM_BeginWeaponChange( int weapon )
{
- if( weapon < WP_NONE || weapon >= WP_NUM_WEAPONS )
+ if( weapon <= WP_NONE || weapon >= WP_NUM_WEAPONS )
return;
- if( !BG_InventoryContainsWeapon( weapon, pm->ps->stats ) && weapon != WP_NONE )
+ if( !BG_InventoryContainsWeapon( weapon, pm->ps->stats ) )
return;
if( pm->ps->weaponstate == WEAPON_DROPPING )
diff --git a/src/game/g_active.c b/src/game/g_active.c
index e4ba5c9b..63e9feaf 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -286,7 +286,7 @@ void ClientImpacts( gentity_t *ent, pmove_t *pm )
// see G_UnlaggedDetectCollisions(), this is the inverse of that.
// if our movement is blocked by another player's real position,
- // don't use the unlagged position for them because they are
+ // don't use the unlagged position for them because they are
// blocking or server-side Pmove() from reaching it
if( other->client && other->client->unlaggedCalc.used )
other->client->unlaggedCalc.used = qfalse;
@@ -973,8 +973,8 @@ void SendPendingPredictableEvents( playerState_t *ps )
==============
G_UnlaggedStore
- Called on every server frame. Stores position data for the client at that
- into client->unlaggedHist[] and the time into level.unlaggedTimes[].
+ Called on every server frame. Stores position data for the client at that
+ into client->unlaggedHist[] and the time into level.unlaggedTimes[].
This data is used by G_UnlaggedCalc()
==============
*/
@@ -983,24 +983,24 @@ void G_UnlaggedStore( void )
int i = 0;
gentity_t *ent;
unlagged_t *save;
-
+
if( !g_unlagged.integer )
return;
- level.unlaggedIndex++;
+ level.unlaggedIndex++;
if( level.unlaggedIndex >= MAX_UNLAGGED_MARKERS )
level.unlaggedIndex = 0;
level.unlaggedTimes[ level.unlaggedIndex ] = level.time;
-
+
for( i = 0; i < level.maxclients; i++ )
{
ent = &g_entities[ i ];
save = &ent->client->unlaggedHist[ level.unlaggedIndex ];
- save->used = qfalse;
+ save->used = qfalse;
if( !ent->r.linked || !( ent->r.contents & CONTENTS_BODY ) )
continue;
if( ent->client->pers.connected != CON_CONNECTED )
- continue;
+ continue;
VectorCopy( ent->r.mins, save->mins );
VectorCopy( ent->r.maxs, save->maxs );
VectorCopy( ent->s.pos.trBase, save->origin );
@@ -1011,7 +1011,7 @@ void G_UnlaggedStore( void )
/*
==============
G_UnlaggedClear
-
+
Mark all unlaggedHist[] markers for this client invalid. Useful for
preventing teleporting and death.
==============
@@ -1043,7 +1043,7 @@ void G_UnlaggedCalc( int time, gentity_t *rewindEnt )
if( !g_unlagged.integer )
return;
-
+
// clear any calculated values from a previous run
for( i = 0; i < level.maxclients; i++ )
{
@@ -1075,10 +1075,10 @@ void G_UnlaggedCalc( int time, gentity_t *rewindEnt )
level.unlaggedTimes[ startIndex ];
if( frameMsec > 0 )
{
- lerp = ( float )( time - level.unlaggedTimes[ startIndex ] )
- / ( float )frameMsec;
+ lerp = ( float )( time - level.unlaggedTimes[ startIndex ] ) /
+ ( float )frameMsec;
}
-
+
for( i = 0; i < level.maxclients; i++ )
{
ent = &g_entities[ i ];
@@ -1119,10 +1119,10 @@ void G_UnlaggedOff( void )
{
int i = 0;
gentity_t *ent;
-
+
if( !g_unlagged.integer )
return;
-
+
for( i = 0; i < level.maxclients; i++ )
{
ent = &g_entities[ i ];
@@ -1155,10 +1155,10 @@ void G_UnlaggedOn( vec3_t muzzle, float range )
int i = 0;
gentity_t *ent;
unlagged_t *calc;
-
+
if( !g_unlagged.integer )
return;
-
+
for( i = 0; i < level.maxclients; i++ )
{
ent = &g_entities[ i ];
@@ -1179,7 +1179,7 @@ void G_UnlaggedOn( vec3_t muzzle, float range )
float maxRadius = ( r1 > r2 ) ? r1 : r2;
if( Distance( muzzle, calc->origin ) > range + maxRadius )
- continue;
+ continue;
}
// create a backup of the real positions
@@ -1796,6 +1796,7 @@ void SpectatorClientEndFrame( gentity_t *ent )
{
gclient_t *cl;
int clientNum, flags;
+ int score, ping;
// if we are doing a chase cam or a remote view, grab the latest info
if( ent->client->sess.spectatorState == SPECTATOR_FOLLOW )
@@ -1808,10 +1809,19 @@ void SpectatorClientEndFrame( gentity_t *ent )
{
if( cl->sess.sessionTeam != TEAM_SPECTATOR )
{
+ // Save
flags = ( cl->ps.eFlags & ~( EF_VOTED | EF_TEAMVOTED ) ) |
( ent->client->ps.eFlags & ( EF_VOTED | EF_TEAMVOTED ) );
+ score = ent->client->ps.persistant[ PERS_SCORE ];
+ ping = ent->client->ps.ping;
+
+ // Copy
ent->client->ps = cl->ps;
+
+ // Restore
ent->client->ps.eFlags = flags;
+ ent->client->ps.persistant[ PERS_SCORE ] = score;
+ ent->client->ps.ping = ping;
}
ent->client->ps.clientNum = clientNum;
diff --git a/src/game/g_admin.c b/src/game/g_admin.c
index a6004b8f..b99fdea7 100644
--- a/src/game/g_admin.c
+++ b/src/game/g_admin.c
@@ -11,7 +11,7 @@ and Travis Maurer.
The functionality of this code mimics the behaviour of the currently
inactive project shrubet (http://www.etstats.com/shrubet/index.php?ver=2)
-by Ryan Mannion. However, shrubet was a closed-source project and
+by Ryan Mannion. However, shrubet was a closed-source project and
none of it's code has been copied, only it's functionality.
Tremulous is free software; you can redistribute it
@@ -36,7 +36,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
static char g_bfb[ 32000 ];
// note: list ordered alphabetically
-g_admin_cmd_t g_admin_cmds[ ] =
+g_admin_cmd_t g_admin_cmds[ ] =
{
{"admintest", G_admin_admintest, "a",
"display your current admin level",
@@ -47,7 +47,7 @@ g_admin_cmd_t g_admin_cmds[ ] =
"restore a player's ability to build",
"[^3name|slot#^7]"
},
-
+
{"allready", G_admin_allready, "y",
"makes everyone ready in intermission",
""
@@ -79,12 +79,12 @@ g_admin_cmd_t g_admin_cmds[ ] =
"kick a player with an optional reason",
"(^5reason^7)"
},
-
+
{"listadmins", G_admin_listadmins, "D",
"display a list of all server admins and their levels",
"(^5name|start admin#^7)"
},
-
+
{"listlayouts", G_admin_listlayouts, "L",
"display a list of all available layouts for a map",
"(^5mapname^7)"
@@ -94,12 +94,12 @@ g_admin_cmd_t g_admin_cmds[ ] =
"display a list of players, their client numbers and their levels",
""
},
-
+
{"lock", G_admin_lock, "K",
"lock a team to prevent anyone from joining it",
"[^3a|h^7]"
},
-
+
{"map", G_admin_map, "M",
"load a map (and optionally force layout)",
"[^3mapname^7] (^5layout^7)"
@@ -109,7 +109,7 @@ g_admin_cmd_t g_admin_cmds[ ] =
"mute a player",
"[^3name|slot#^7]"
},
-
+
{"namelog", G_admin_namelog, "e",
"display a list of names used by recently connected players",
"(^5name^7)"
@@ -167,7 +167,7 @@ g_admin_cmd_t g_admin_cmds[ ] =
"unbans a player specified by the slot as seen in showbans",
"[^3ban slot#^7]"
},
-
+
{"unlock", G_admin_unlock, "K",
"unlock a locked team",
"[^3a|h^7]"
@@ -213,7 +213,7 @@ qboolean G_admin_permission( gentity_t *ent, char flag )
{
if( *flags == flag )
return qfalse;
- else if( *flags == '+' )
+ if( *flags == '+' )
break;
}
}
@@ -225,16 +225,9 @@ qboolean G_admin_permission( gentity_t *ent, char flag )
return qfalse;
}
// flags with significance only for individuals (
- // like ADMF_INCOGNITO and ADMF_IMMUTABLE are NOT covered
+ // like ADMF_INCOGNITO and ADMF_IMMUTABLE are NOT covered
// by the '*' wildcard. They must be specified manually.
- switch( flag )
- {
- case ADMF_INCOGNITO:
- case ADMF_IMMUTABLE:
- return qfalse;
- default:
- return qtrue;
- }
+ return ( flag != ADMF_INCOGNITO && flag != ADMF_IMMUTABLE );
}
flags++;
}
@@ -258,16 +251,9 @@ qboolean G_admin_permission( gentity_t *ent, char flag )
return qfalse;
}
// flags with significance only for individuals (
- // like ADMF_INCOGNITO and ADMF_IMMUTABLE are NOT covered
+ // like ADMF_INCOGNITO and ADMF_IMMUTABLE are NOT covered
// by the '*' wildcard. They must be specified manually.
- switch( flag )
- {
- case ADMF_INCOGNITO:
- case ADMF_IMMUTABLE:
- return qfalse;
- default:
- return qtrue;
- }
+ return ( flag != ADMF_INCOGNITO && flag != ADMF_IMMUTABLE );
}
flags++;
}
@@ -285,17 +271,14 @@ qboolean G_admin_name_check( gentity_t *ent, char *name, char *err, int len )
G_SanitiseName( name, name2 );
- if( !Q_stricmp( name2, "UnnamedPlayer" ) )
+ if( !Q_stricmp( name2, "UnnamedPlayer" ) )
return qtrue;
for( i = 0; i < level.maxclients; i++ )
{
client = &level.clients[ i ];
- if( client->pers.connected != CON_CONNECTING
- && client->pers.connected != CON_CONNECTED )
- {
+ if( client->pers.connected == CON_DISCONNECTED )
continue;
- }
// can rename ones self to the same name using different colors
if( i == ( ent - g_entities ) )
@@ -397,7 +380,6 @@ static void admin_writeconfig( void )
{
fileHandle_t f;
int len, i, j;
- qtime_t qt;
int t;
char levels[ MAX_STRING_CHARS ] = {""};
@@ -407,7 +389,7 @@ static void admin_writeconfig( void )
" configuration will not be saved to a file.\n" );
return;
}
- t = trap_RealTime( &qt );
+ t = trap_RealTime( NULL );
len = trap_FS_FOpenFile( g_admin.string, &f, FS_WRITE );
if( len < 0 )
{
@@ -448,7 +430,7 @@ static void admin_writeconfig( void )
// don't write expired bans
// if expires is 0, then it's a perm ban
if( g_admin_bans[ i ]->expires != 0 &&
- ( g_admin_bans[ i ]->expires - t ) < 1 )
+ ( g_admin_bans[ i ]->expires - t ) < 1 )
continue;
trap_FS_Write( "[ban]\n", 6, f );
@@ -492,7 +474,7 @@ static void admin_writeconfig( void )
static void admin_readconfig_string( char **cnf, char *s, int size )
{
- char * t;
+ char *t;
//COM_MatchToken(cnf, "=");
t = COM_ParseExt( cnf, qfalse );
@@ -510,8 +492,8 @@ static void admin_readconfig_string( char **cnf, char *s, int size )
s[ 0 ] = '\0';
while( t[ 0 ] )
{
- if( ( s[ 0 ] == '\0' && strlen( t ) <= size )
- || ( strlen( t ) + strlen( s ) < size ) )
+ if( ( s[ 0 ] == '\0' && strlen( t ) <= size ) ||
+ ( strlen( t ) + strlen( s ) < size ) )
{
Q_strcat( s, size, t );
@@ -526,7 +508,7 @@ static void admin_readconfig_string( char **cnf, char *s, int size )
static void admin_readconfig_int( char **cnf, int *v )
{
- char * t;
+ char *t;
//COM_MatchToken(cnf, "=");
t = COM_ParseExt( cnf, qfalse );
@@ -548,7 +530,7 @@ static void admin_readconfig_int( char **cnf, int *v )
// ones to make new installs easier for admins
static void admin_default_levels( void )
{
- g_admin_level_t * l;
+ g_admin_level_t *l;
int i;
for( i = 0; i < MAX_ADMIN_LEVELS && g_admin_levels[ i ]; i++ )
@@ -625,7 +607,7 @@ static qboolean admin_command_permission( gentity_t *ent, char *command )
if( !ent )
return qtrue;
- level = ent->client->pers.adminLevel;
+ level = ent->client->pers.adminLevel;
for( i = 0; i < MAX_ADMIN_COMMANDS && g_admin_commands[ i ]; i++ )
{
if( !Q_stricmp( command, g_admin_commands[ i ]->command ) )
@@ -656,14 +638,14 @@ static void admin_log( gentity_t *admin, char *cmd, int skiparg )
char name[ MAX_NAME_LENGTH ];
if( !g_adminLog.string[ 0 ] )
- return ;
+ return;
len = trap_FS_FOpenFile( g_adminLog.string, &f, FS_APPEND );
if( len < 0 )
{
G_Printf( "admin_log: error could not open %s\n", g_adminLog.string );
- return ;
+ return;
}
sec = level.time / 1000;
@@ -753,7 +735,7 @@ static int admin_listadmins( gentity_t *ent, int start, char *search )
gentity_t *vic;
int l = 0;
qboolean dup = qfalse;
-
+
ADMBP_begin();
// print out all connected players regardless of level if name searching
@@ -763,7 +745,7 @@ static int admin_listadmins( gentity_t *ent, int start, char *search )
if( vic->client && vic->client->pers.connected != CON_CONNECTED )
continue;
-
+
l = vic->client->pers.adminLevel;
G_SanitiseName( vic->client->pers.netname, name );
@@ -773,8 +755,8 @@ static int admin_listadmins( gentity_t *ent, int start, char *search )
for( j = 0; j <= 8; j++ )
guid_stub[ j ] = vic->client->pers.guid[ j + 24 ];
guid_stub[ j ] = '\0';
-
- lname[ 0 ] = '\0';
+
+ lname[ 0 ] = '\0';
Q_strncpyz( lname_fmt, "%s", sizeof( lname_fmt ) );
for( j = 0; j < MAX_ADMIN_LEVELS && g_admin_levels[ j ]; j++ )
{
@@ -798,15 +780,15 @@ static int admin_listadmins( gentity_t *ent, int start, char *search )
drawn++;
}
- for( i = start; i < MAX_ADMIN_ADMINS && g_admin_admins[ i ]
- && drawn < MAX_ADMIN_LISTITEMS; i++ )
+ for( i = start; i < MAX_ADMIN_ADMINS && g_admin_admins[ i ] &&
+ drawn < MAX_ADMIN_LISTITEMS; i++ )
{
if( search[ 0 ] )
{
G_SanitiseName( g_admin_admins[ i ]->name, name );
if( !strstr( name, search ) )
continue;
-
+
// verify we don't have the same guid/name pair in connected players
// since we don't want to draw the same player twice
dup = qfalse;
@@ -816,8 +798,8 @@ static int admin_listadmins( gentity_t *ent, int start, char *search )
if( !vic->client || vic->client->pers.connected != CON_CONNECTED )
continue;
G_SanitiseName( vic->client->pers.netname, name2 );
- if( !Q_stricmp( vic->client->pers.guid, g_admin_admins[ i ]->guid )
- && strstr( name2, search ) )
+ if( !Q_stricmp( vic->client->pers.guid, g_admin_admins[ i ]->guid ) &&
+ strstr( name2, search ) )
{
dup = qtrue;
break;
@@ -829,8 +811,8 @@ static int admin_listadmins( gentity_t *ent, int start, char *search )
for( j = 0; j <= 8; j++ )
guid_stub[ j ] = g_admin_admins[ i ]->guid[ j + 24 ];
guid_stub[ j ] = '\0';
-
- lname[ 0 ] = '\0';
+
+ lname[ 0 ] = '\0';
Q_strncpyz( lname_fmt, "%s", sizeof( lname_fmt ) );
for( j = 0; j < MAX_ADMIN_LEVELS && g_admin_levels[ j ]; j++ )
{
@@ -885,11 +867,10 @@ qboolean G_admin_ban_check( char *userinfo, char *reason, int rlen )
{
char *guid, *ip;
int i;
- qtime_t qt;
int t;
-
- *reason = '\0';
- t = trap_RealTime( &qt );
+
+ *reason = '\0';
+ t = trap_RealTime( NULL );
if( !*userinfo )
return qfalse;
ip = Info_ValueForKey( userinfo, "ip" );
@@ -915,7 +896,7 @@ qboolean G_admin_ban_check( char *userinfo, char *reason, int rlen )
g_admin_bans[ i ]->reason,
duration
);
- G_Printf("Banned player tried to connect from IP %s\n", ip);
+ G_Printf( "Banned player tried to connect from IP %s\n", ip );
return qtrue;
}
if( *guid && !Q_stricmp( g_admin_bans[ i ]->guid, guid ) )
@@ -931,7 +912,7 @@ qboolean G_admin_ban_check( char *userinfo, char *reason, int rlen )
g_admin_bans[ i ]->reason,
duration
);
- G_Printf("Banned player tried to connect with GUID %s\n", guid);
+ G_Printf( "Banned player tried to connect with GUID %s\n", guid );
return qtrue;
}
}
@@ -1035,14 +1016,14 @@ void G_admin_namelog_update( gclient_t *client, qboolean disconnect )
continue;
}
- if( !Q_stricmp( client->pers.ip, g_admin_namelog[ i ]->ip )
- && !Q_stricmp( client->pers.guid, g_admin_namelog[ i ]->guid ) )
+ if( !Q_stricmp( client->pers.ip, g_admin_namelog[ i ]->ip ) &&
+ !Q_stricmp( client->pers.guid, g_admin_namelog[ i ]->guid ) )
{
- for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES
- && g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
+ for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES &&
+ g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
{
G_SanitiseName( g_admin_namelog[ i ]->name[ j ], n2 );
- if( !Q_stricmp( n1, n2 ) )
+ if( !Q_stricmp( n1, n2 ) )
break;
}
if( j == MAX_ADMIN_NAMELOG_NAMES )
@@ -1065,7 +1046,7 @@ void G_admin_namelog_update( gclient_t *client, qboolean disconnect )
}
namelog = G_Alloc( sizeof( g_admin_namelog_t ) );
memset( namelog, 0, sizeof( namelog ) );
- for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES ; j++ )
+ for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES; j++ )
namelog->name[ j ][ 0 ] = '\0';
Q_strncpyz( namelog->ip, client->pers.ip, sizeof( namelog->ip ) );
Q_strncpyz( namelog->guid, client->pers.guid, sizeof( namelog->guid ) );
@@ -1077,7 +1058,7 @@ void G_admin_namelog_update( gclient_t *client, qboolean disconnect )
qboolean G_admin_readconfig( gentity_t *ent, int skiparg )
{
- g_admin_level_t * l = NULL;
+ g_admin_level_t *l = NULL;
g_admin_admin_t *a = NULL;
g_admin_ban_t *b = NULL;
g_admin_command_t *c = NULL;
@@ -1099,7 +1080,7 @@ qboolean G_admin_readconfig( gentity_t *ent, int skiparg )
return qfalse;
}
- len = trap_FS_FOpenFile( g_admin.string, &f, FS_READ ) ;
+ len = trap_FS_FOpenFile( g_admin.string, &f, FS_READ );
if( len < 0 )
{
ADMP( va( "^3!readconfig: ^7could not open admin config file %s\n",
@@ -1313,10 +1294,7 @@ qboolean G_admin_readconfig( gentity_t *ent, int skiparg )
t = COM_Parse( &cnf );
}
if( level_open )
- {
-
g_admin_levels[ lc++ ] = l;
- }
if( admin_open )
g_admin_admins[ ac++ ] = a;
if( ban_open )
@@ -1332,8 +1310,8 @@ qboolean G_admin_readconfig( gentity_t *ent, int skiparg )
{
char n[ MAX_NAME_LENGTH ] = {""};
int i = 0;
-
- // max printable name length for formatting
+
+ // max printable name length for formatting
for( i = 0; i < MAX_ADMIN_LEVELS && g_admin_levels[ i ]; i++ )
{
G_DecolorString( l->name, n );
@@ -1347,9 +1325,8 @@ qboolean G_admin_readconfig( gentity_t *ent, int skiparg )
qboolean G_admin_time( gentity_t *ent, int skiparg )
{
qtime_t qt;
- int t;
- t = trap_RealTime( &qt );
+ trap_RealTime( &qt );
ADMP( va( "^3!time: ^7local time is %02i:%02i:%02i\n",
qt.tm_hour, qt.tm_min, qt.tm_sec ) );
return qtrue;
@@ -1382,9 +1359,9 @@ qboolean G_admin_setlevel( gentity_t *ent, int skiparg )
G_SayArgv( 2 + skiparg, lstr, sizeof( lstr ) );
l = atoi( lstr );
G_SanitiseName( testname, name );
- for( i = 0; i < sizeof( name ) && name[ i ] ; i++ )
+ for( i = 0; i < sizeof( name ) && name[ i ]; i++ )
{
- if( name[ i ] < '0' || name[ i ] > '9' )
+ if( !isdigit( name[ i ] ) )
{
numeric = qfalse;
break;
@@ -1419,12 +1396,11 @@ qboolean G_admin_setlevel( gentity_t *ent, int skiparg )
return qfalse;
}
- if( numeric && id >= 0 && id < level.maxclients )
+ if( numeric && id >= 0 && id < level.maxclients )
vic = &g_entities[ id ];
- if( vic && vic->client && vic->client->pers.connected == CON_CONNECTED )
+ if( vic && vic->client && vic->client->pers.connected == CON_CONNECTED )
{
- vic = &g_entities[ id ];
Q_strncpyz( adminname, vic->client->pers.netname, sizeof( adminname ) );
Q_strncpyz( guid, vic->client->pers.guid, sizeof( guid ) );
matches = 1;
@@ -1467,8 +1443,8 @@ qboolean G_admin_setlevel( gentity_t *ent, int skiparg )
if( !vic->client || vic->client->pers.connected != CON_CONNECTED )
continue;
G_SanitiseName( vic->client->pers.netname, testname2 );
- if( !Q_stricmp( vic->client->pers.guid, g_admin_admins[ i ]->guid )
- && strstr( testname2, name ) )
+ if( !Q_stricmp( vic->client->pers.guid, g_admin_admins[ i ]->guid ) &&
+ strstr( testname2, name ) )
{
dup = qtrue;
break;
@@ -1534,12 +1510,12 @@ qboolean G_admin_setlevel( gentity_t *ent, int skiparg )
g_admin_admins[ i ] = a;
}
- AP( va(
+ AP( va(
"print \"^3!setlevel: ^7%s^7 was given level %d admin rights by %s\n\"",
adminname, l, ( ent ) ? ent->client->pers.netname : "console" ) );
if( vic )
vic->client->pers.adminLevel = l;
-
+
if( !g_admin.string[ 0 ] )
ADMP( "^3!setlevel: ^7WARNING g_admin not set, not saving admin record "
"to a file\n" );
@@ -1553,7 +1529,7 @@ static qboolean admin_create_ban( gentity_t *ent,
char *guid,
char *ip,
int seconds,
- char *reason )
+ char *reason )
{
g_admin_ban_t *b = NULL;
qtime_t qt;
@@ -1642,7 +1618,7 @@ qboolean G_admin_kick( gentity_t *ent, int skiparg )
if( g_admin.string[ 0 ] )
admin_writeconfig();
}
-
+
trap_SendServerCommand( pids[ 0 ],
va( "disconnect \"You have been kicked.\n%s^7\nreason:\n%s\"",
( ent ) ? va( "admin:\n%s", ent->client->pers.netname ) : "",
@@ -1706,7 +1682,7 @@ qboolean G_admin_ban( gentity_t *ent, int skiparg )
modifier = 60 * 60;
else if( secs[ lastchar ] == 'm' )
modifier = 60;
- else if( secs[ lastchar ] < '0' || secs[ lastchar ] > '9' )
+ else if( !isdigit( secs[ lastchar ] ) )
secs[ lastchar ] = '\0';
}
seconds = atoi( secs );
@@ -1741,14 +1717,14 @@ qboolean G_admin_ban( gentity_t *ent, int skiparg )
if( g_admin_namelog[ i ]->slot == -1 )
continue;
- if( !Q_stricmp( va( "%d", g_admin_namelog[ i ]->slot ), s2 ) )
+ if( !Q_stricmp( va( "%d", g_admin_namelog[ i ]->slot ), search ) )
{
logmatches = 1;
logmatch = i;
exactmatch = qtrue;
break;
}
- }
+ }
for( i = 0;
!exactmatch && i < MAX_ADMIN_NAMELOGS && g_admin_namelog[ i ];
@@ -1758,31 +1734,31 @@ qboolean G_admin_ban( gentity_t *ent, int skiparg )
if( g_admin_namelog[ i ]->banned )
continue;
- if( !Q_stricmp( g_admin_namelog[ i ]->ip, s2 ) )
+ if( !Q_stricmp( g_admin_namelog[ i ]->ip, search ) )
{
logmatches = 1;
logmatch = i;
exactmatch = qtrue;
break;
}
- for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES
- && g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
+ for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES &&
+ g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
{
- G_SanitiseName(g_admin_namelog[ i ]->name[ j ], n2);
+ G_SanitiseName( g_admin_namelog[ i ]->name[ j ], n2 );
if( strstr( n2, s2 ) )
{
if( logmatch != i )
logmatches++;
- logmatch = i;
+ logmatch = i;
}
}
}
-
- if( !logmatches )
+
+ if( !logmatches )
{
ADMP( "^3!ban: ^7no player found by that name, IP, or slot number\n" );
return qfalse;
- }
+ }
else if( logmatches > 1 )
{
ADMBP_begin();
@@ -1792,16 +1768,16 @@ qboolean G_admin_ban( gentity_t *ent, int skiparg )
for( j = 0; j <= 8; j++ )
guid_stub[ j ] = g_admin_namelog[ i ]->guid[ j + 24 ];
guid_stub[ j ] = '\0';
- for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES
- && g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
+ for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES &&
+ g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
{
- G_SanitiseName(g_admin_namelog[ i ]->name[ j ], n2);
+ G_SanitiseName( g_admin_namelog[ i ]->name[ j ], n2 );
if( strstr( n2, s2 ) )
{
if( g_admin_namelog[ i ]->slot > -1 )
ADMBP( "^3" );
ADMBP( va( "%-2s (*%s) %15s ^7'%s^7'\n",
- (g_admin_namelog[ i ]->slot > -1) ?
+ ( g_admin_namelog[ i ]->slot > -1 ) ?
va( "%d", g_admin_namelog[ i ]->slot ) : "-",
guid_stub,
g_admin_namelog[ i ]->ip,
@@ -1812,7 +1788,7 @@ qboolean G_admin_ban( gentity_t *ent, int skiparg )
ADMBP_end();
return qfalse;
}
-
+
G_admin_duration( ( seconds ) ? seconds : -1,
duration, sizeof( duration ) );
@@ -1829,7 +1805,7 @@ qboolean G_admin_ban( gentity_t *ent, int skiparg )
g_admin_namelog[ logmatch ]->name[ 0 ],
g_admin_namelog[ logmatch ]->guid,
g_admin_namelog[ logmatch ]->ip,
- seconds, reason );
+ seconds, reason );
g_admin_namelog[ logmatch ]->banned = qtrue;
@@ -1838,7 +1814,7 @@ qboolean G_admin_ban( gentity_t *ent, int skiparg )
else
admin_writeconfig();
- if(g_admin_namelog[ logmatch ]->slot == -1 )
+ if( g_admin_namelog[ logmatch ]->slot == -1 )
{
// client is already disconnected so stop here
AP( va( "print \"^3!ban:^7 %s^7 has been banned by %s^7 "
@@ -1869,10 +1845,7 @@ qboolean G_admin_unban( gentity_t *ent, int skiparg )
{
int bnum;
char bs[ 4 ];
- qtime_t qt;
- int t;
- t = trap_RealTime( &qt );
if( G_SayArgc() < 2 + skiparg )
{
ADMP( "^3!unban: ^7usage: !unban [ban #]\n" );
@@ -1890,7 +1863,7 @@ qboolean G_admin_unban( gentity_t *ent, int skiparg )
ADMP( "^3!unban: ^7invalid ban #\n" );
return qfalse;
}
- g_admin_bans[ bnum -1 ]->expires = t;
+ g_admin_bans[ bnum - 1 ]->expires = trap_RealTime( NULL );
AP( va( "print \"^3!unban: ^7ban #%d for %s^7 has been removed by %s\n\"",
bnum,
g_admin_bans[ bnum - 1 ]->name,
@@ -1960,7 +1933,7 @@ qboolean G_admin_map( gentity_t *ent, int skiparg )
{
char map[ MAX_QPATH ];
char layout[ MAX_QPATH ] = { "" };
-
+
if( G_SayArgc( ) < 2 + skiparg )
{
ADMP( "^3!map: ^7usage: !map [map] (layout)\n" );
@@ -2055,7 +2028,6 @@ qboolean G_admin_mute( gentity_t *ent, int skiparg )
vic->client->pers.netname,
( ent ) ? ent->client->pers.netname : "console" ) );
}
- ClientUserinfoChanged( pids[ 0 ] );
return qtrue;
}
@@ -2118,23 +2090,18 @@ qboolean G_admin_denybuild( gentity_t *ent, int skiparg )
vic->client->pers.netname,
( ent ) ? ent->client->pers.netname : "console" ) );
}
- ClientUserinfoChanged( pids[ 0 ] );
return qtrue;
}
qboolean G_admin_listadmins( gentity_t *ent, int skiparg )
{
int i, found = 0;
- qtime_t qt;
- int t;
char search[ MAX_NAME_LENGTH ] = {""};
char s[ MAX_NAME_LENGTH ] = {""};
int start = 0;
qboolean numeric = qtrue;
int drawn = 0;
- t = trap_RealTime( &qt );
-
for( i = 0; i < MAX_ADMIN_ADMINS && g_admin_admins[ i ]; i++ )
{
if( g_admin_admins[ i ]->level == 0 )
@@ -2152,11 +2119,11 @@ qboolean G_admin_listadmins( gentity_t *ent, int skiparg )
G_SayArgv( 1 + skiparg, s, sizeof( s ) );
for( i = 0; i < sizeof( s ) && s[ i ]; i++ )
{
- if( s[ i ] >= '0' && s[ i ] <= '9' )
+ if( isdigit( s[ i ] ) )
continue;
- numeric = qfalse;
+ numeric = qfalse;
}
- if( numeric )
+ if( numeric )
{
start = atoi( s );
if( start > 0 )
@@ -2211,12 +2178,12 @@ qboolean G_admin_listlayouts( gentity_t *ent, int skiparg )
char *s;
char layout[ MAX_QPATH ] = { "" };
int i = 0;
-
- if( G_SayArgc( ) == 2 + skiparg )
- G_SayArgv( 1 +skiparg, map, sizeof( map ) );
+
+ if( G_SayArgc( ) == 2 + skiparg )
+ G_SayArgv( 1 + skiparg, map, sizeof( map ) );
else
trap_Cvar_VariableStringBuffer( "mapname", map, sizeof( map ) );
-
+
count = G_LayoutList( map, list, sizeof( list ) );
ADMBP_begin( );
ADMBP( va( "^3!listlayouts:^7 %d layouts found for '%s':\n", count, map ) );
@@ -2258,7 +2225,7 @@ qboolean G_admin_listplayers( gentity_t *ent, int skiparg )
char lname_fmt[ 5 ];
ADMBP_begin();
- ADMBP( va( "^3!listplayers^7: %d players connected:\n",
+ ADMBP( va( "^3!listplayers: ^7%d players connected:\n",
level.numConnectedClients ) );
for( i = 0; i < level.maxclients; i++ )
{
@@ -2308,9 +2275,8 @@ qboolean G_admin_listplayers( gentity_t *ent, int skiparg )
{
if( !Q_stricmp( g_admin_admins[ j ]->guid, p->pers.guid ) )
{
-
// don't gather aka or level info if the admin is incognito
- if( G_admin_permission( &g_entities[ i ], ADMF_INCOGNITO ) )
+ if( ent && G_admin_permission( &g_entities[ i ], ADMF_INCOGNITO ) )
{
break;
}
@@ -2341,15 +2307,15 @@ qboolean G_admin_listplayers( gentity_t *ent, int skiparg )
}
}
-
- if( G_admin_permission(ent, ADMF_SEESFULLLISTPLAYERS ) )
+
+ if( G_admin_permission( ent, ADMF_SEESFULLLISTPLAYERS ) )
{
ADMBP( va( "%2i %s%s^7 %-2i %s^7 (*%s) ^1%1s%1s^7 %s^7 %s%s^7%s\n",
i,
c,
t,
l,
- ( *lname ) ? lname2 : "",
+ ( *lname ) ? lname2 : "",
guid_stub,
muted,
denied,
@@ -2376,7 +2342,6 @@ qboolean G_admin_listplayers( gentity_t *ent, int skiparg )
qboolean G_admin_showbans( gentity_t *ent, int skiparg )
{
int i, found = 0;
- qtime_t qt;
int t;
char duration[ 32 ];
char name_fmt[ 32 ] = { "%s" };
@@ -2391,12 +2356,12 @@ qboolean G_admin_showbans( gentity_t *ent, int skiparg )
char n1[ MAX_NAME_LENGTH ] = {""};
char n2[ MAX_NAME_LENGTH ] = {""};
- t = trap_RealTime( &qt );
+ t = trap_RealTime( NULL );
for( i = 0; i < MAX_ADMIN_BANS && g_admin_bans[ i ]; i++ )
{
- if( g_admin_bans[ i ]->expires != 0
- && ( g_admin_bans[ i ]->expires - t ) < 1 )
+ if( g_admin_bans[ i ]->expires != 0 &&
+ ( g_admin_bans[ i ]->expires - t ) < 1 )
{
continue;
}
@@ -2417,8 +2382,8 @@ qboolean G_admin_showbans( gentity_t *ent, int skiparg )
if( start >= MAX_ADMIN_BANS || start < 0 )
start = 0;
- for( i = start; i < MAX_ADMIN_BANS && g_admin_bans[ i ]
- && ( i - start ) < MAX_ADMIN_SHOWBANS; i++ )
+ for( i = start; i < MAX_ADMIN_BANS && g_admin_bans[ i ] &&
+ ( i - start ) < MAX_ADMIN_SHOWBANS; i++ )
{
G_DecolorString( g_admin_bans[ i ]->name, n1 );
G_DecolorString( g_admin_bans[ i ]->banner, n2 );
@@ -2436,11 +2401,11 @@ qboolean G_admin_showbans( gentity_t *ent, int skiparg )
return qfalse;
}
ADMBP_begin();
- for( i = start; i < MAX_ADMIN_BANS && g_admin_bans[ i ]
- && ( i - start ) < MAX_ADMIN_SHOWBANS; i++ )
+ for( i = start; i < MAX_ADMIN_BANS && g_admin_bans[ i ] &&
+ ( i - start ) < MAX_ADMIN_SHOWBANS; i++ )
{
- if( g_admin_bans[ i ]->expires != 0
- && ( g_admin_bans[ i ]->expires - t ) < 1 )
+ if( g_admin_bans[ i ]->expires != 0 &&
+ ( g_admin_bans[ i ]->expires - t ) < 1 )
continue;
// only print out the the date part of made
@@ -2463,12 +2428,12 @@ qboolean G_admin_showbans( gentity_t *ent, int skiparg )
G_DecolorString( g_admin_bans[ i ]->name, n1 );
Com_sprintf( name_fmt, sizeof( name_fmt ), "%%%is",
( max_name + strlen( g_admin_bans[ i ]->name ) - strlen( n1 ) ) );
- Com_sprintf( n1, sizeof( n1 ), name_fmt, g_admin_bans[ i ]->name );
+ Com_sprintf( n1, sizeof( n1 ), name_fmt, g_admin_bans[ i ]->name );
G_DecolorString( g_admin_bans[ i ]->banner, n2 );
Com_sprintf( banner_fmt, sizeof( banner_fmt ), "%%%is",
( max_banner + strlen( g_admin_bans[ i ]->banner ) - strlen( n2 ) ) );
- Com_sprintf( n2, sizeof( n2 ), banner_fmt, g_admin_bans[ i ]->banner );
+ Com_sprintf( n2, sizeof( n2 ), banner_fmt, g_admin_bans[ i ]->banner );
ADMBP( va( "%4i %s^7 %-15s %-8s %s^7 %-10s\n \\__ %s\n",
( i + 1 ),
@@ -2663,7 +2628,7 @@ qboolean G_admin_allready( gentity_t *ent, int skiparg )
cl->readyToExit = 1;
}
AP( va( "print \"^3!allready:^7 %s^7 says everyone is READY now\n\"",
- ( ent ) ? ent->client->pers.netname : "console" ) );
+ ( ent ) ? ent->client->pers.netname : "console" ) );
return qtrue;
}
@@ -2672,7 +2637,7 @@ qboolean G_admin_cancelvote( gentity_t *ent, int skiparg )
if(!level.voteTime && !level.teamVoteTime[ 0 ] && !level.teamVoteTime[ 1 ] )
{
- ADMP( "^3!cancelvote^7: no vote in progress\n" );
+ ADMP( "^3!cancelvote: ^7no vote in progress\n" );
return qfalse;
}
level.voteNo = level.numConnectedClients;
@@ -2693,7 +2658,7 @@ qboolean G_admin_passvote( gentity_t *ent, int skiparg )
{
if(!level.voteTime && !level.teamVoteTime[ 0 ] && !level.teamVoteTime[ 1 ] )
{
- ADMP( "^3!passvote^7: no vote in progress\n" );
+ ADMP( "^3!passvote: ^7no vote in progress\n" );
return qfalse;
}
level.voteYes = level.numConnectedClients;
@@ -2728,7 +2693,7 @@ qboolean G_admin_spec999( gentity_t *ent, int skiparg )
{
G_ChangeTeam( vic, PTE_NONE );
AP( va( "print \"^3!spec999: ^7%s^7 moved ^7%s^7 to spectators\n\"",
- ( ent ) ? ent->client->pers.netname : "console",
+ ( ent ) ? ent->client->pers.netname : "console",
vic->client->pers.netname ) );
}
}
@@ -2760,7 +2725,7 @@ qboolean G_admin_rename( gentity_t *ent, int skiparg )
ADMP( va( "^3!rename: ^7%s\n", err ) );
return qfalse;
}
- victim = &g_entities[ pids[ 0 ] ] ;
+ victim = &g_entities[ pids[ 0 ] ];
if( !admin_higher( ent, victim ) )
{
ADMP( "^3!rename: ^7sorry, but your intended victim has a higher admin"
@@ -2850,7 +2815,7 @@ qboolean G_admin_namelog( gentity_t *ent, int skiparg )
if( search[0] )
{
found = qfalse;
- for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES &&
+ for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES &&
g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
{
G_SanitiseName( g_admin_namelog[ i ]->name[ j ], n2 );
@@ -2869,17 +2834,17 @@ qboolean G_admin_namelog( gentity_t *ent, int skiparg )
guid_stub[ j ] = '\0';
if( g_admin_namelog[ i ]->slot > -1 )
ADMBP( "^3" );
- ADMBP( va( "%-2s (*%s) %15s^7",
- (g_admin_namelog[ i ]->slot > -1 ) ?
+ ADMBP( va( "%-2s (*%s) %15s^7",
+ ( g_admin_namelog[ i ]->slot > -1 ) ?
va( "%d", g_admin_namelog[ i ]->slot ) : "-",
guid_stub, g_admin_namelog[ i ]->ip ) );
- for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES &&
+ for( j = 0; j < MAX_ADMIN_NAMELOG_NAMES &&
g_admin_namelog[ i ]->name[ j ][ 0 ]; j++ )
{
ADMBP( va( " '%s^7'", g_admin_namelog[ i ]->name[ j ] ) );
}
- ADMBP( "\n" );
- }
+ ADMBP( "\n" );
+ }
ADMBP( va( "^3!namelog:^7 %d recent clients found\n", printed ) );
ADMBP_end();
return qtrue;
@@ -2930,7 +2895,7 @@ qboolean G_admin_lock( gentity_t *ent, int skiparg )
( team == PTE_ALIENS ) ? "Alien" : "Human",
( ent ) ? ent->client->pers.netname : "console" ) );
return qtrue;
-}
+}
qboolean G_admin_unlock( gentity_t *ent, int skiparg )
{
@@ -2952,7 +2917,7 @@ qboolean G_admin_unlock( gentity_t *ent, int skiparg )
ADMP( va( "^3!unlock: ^7invalid team\"%c\"\n", teamName[0] ) );
return qfalse;
}
-
+
if( team == PTE_ALIENS )
{
if( !level.alienTeamLocked )
@@ -2977,7 +2942,7 @@ qboolean G_admin_unlock( gentity_t *ent, int skiparg )
( team == PTE_ALIENS ) ? "Alien" : "Human",
( ent ) ? ent->client->pers.netname : "console" ) );
return qtrue;
-}
+}
/*
================
@@ -2989,14 +2954,18 @@ qboolean G_admin_unlock( gentity_t *ent, int skiparg )
*/
void G_admin_print( gentity_t *ent, char *m )
{
-
if( ent )
trap_SendServerCommand( ent - level.gentities, va( "print \"%s\"", m ) );
else
{
char m2[ MAX_STRING_CHARS ];
- G_DecolorString( m, m2 );
- G_Printf( m2 );
+ if( !trap_Cvar_VariableIntegerValue( "com_ansiColor" ) )
+ {
+ G_DecolorString( m, m2 );
+ G_Printf( m2 );
+ }
+ else
+ G_Printf( m );
}
}
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c
index dfefb0be..bad5e157 100644
--- a/src/game/g_buildable.c
+++ b/src/game/g_buildable.c
@@ -140,7 +140,7 @@ static int G_NumberOfDependants( gentity_t *self )
int i, n = 0;
gentity_t *ent;
- for ( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ for( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
{
if( ent->s.eType != ET_BUILDABLE )
continue;
@@ -167,7 +167,7 @@ static qboolean G_FindPower( gentity_t *self )
gentity_t *ent;
gentity_t *closestPower = NULL;
int distance = 0;
- int minDistance = 10000;
+ int minDistance = REPEATER_BASESIZE + 1;
vec3_t temp_v;
if( self->biteam != BIT_HUMANS )
@@ -185,27 +185,25 @@ static qboolean G_FindPower( gentity_t *self )
self->parentNode = NULL;
//iterate through entities
- for( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ for( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
{
if( ent->s.eType != ET_BUILDABLE )
continue;
//if entity is a power item calculate the distance to it
if( ( ent->s.modelindex == BA_H_REACTOR || ent->s.modelindex == BA_H_REPEATER ) &&
- ent->spawned && ent->health > 0 )
+ ent->spawned && ent->powered && ent->health > 0 )
{
VectorSubtract( self->s.origin, ent->s.origin, temp_v );
distance = VectorLength( temp_v );
// Always prefer a reactor if there is one in range
- if( ent->s.modelindex == BA_H_REACTOR && ent->powered &&
- distance <= REACTOR_BASESIZE )
+ if( ent->s.modelindex == BA_H_REACTOR && distance <= REACTOR_BASESIZE )
{
self->parentNode = ent;
return qtrue;
}
- else if( distance < minDistance && ent->powered &&
- distance <= REPEATER_BASESIZE )
+ else if( distance < minDistance )
{
closestPower = ent;
minDistance = distance;
@@ -283,7 +281,7 @@ int G_FindDCC( gentity_t *self )
return 0;
//iterate through entities
- for( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ for( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
{
if( ent->s.eType != ET_BUILDABLE )
continue;
@@ -344,7 +342,7 @@ static qboolean G_FindOvermind( gentity_t *self )
self->overmindNode = NULL;
//iterate through entities
- for( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ for( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
{
if( ent->s.eType != ET_BUILDABLE )
continue;
@@ -403,7 +401,7 @@ qboolean G_FindCreep( gentity_t *self )
if( self->client || self->parentNode == NULL || !self->parentNode->inuse ||
self->parentNode->health <= 0 )
{
- for ( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ for( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
{
if( ent->s.eType != ET_BUILDABLE )
continue;
@@ -769,11 +767,9 @@ Think function for Alien Overmind
*/
void AOvermind_Think( gentity_t *self )
{
- int entityList[ MAX_GENTITIES ];
- vec3_t range = { OVERMIND_ATTACK_RANGE, OVERMIND_ATTACK_RANGE, OVERMIND_ATTACK_RANGE };
- vec3_t mins, maxs;
- int i, num;
- gentity_t *enemy;
+ vec3_t range = { OVERMIND_ATTACK_RANGE, OVERMIND_ATTACK_RANGE, OVERMIND_ATTACK_RANGE };
+ vec3_t mins, maxs;
+ int i;
VectorAdd( self->s.origin, range, maxs );
VectorSubtract( self->s.origin, range, mins );
@@ -781,20 +777,11 @@ void AOvermind_Think( gentity_t *self )
if( self->spawned && ( self->health > 0 ) )
{
//do some damage
- num = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES );
- for( i = 0; i < num; i++ )
+ if( G_SelectiveRadiusDamage( self->s.pos.trBase, self, self->splashDamage,
+ self->splashRadius, self, MOD_OVERMIND, PTE_ALIENS ) )
{
- enemy = &g_entities[ entityList[ i ] ];
-
- if( enemy->client && enemy->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
- {
- self->timestamp = level.time;
- G_SelectiveRadiusDamage( self->s.pos.trBase, self, self->splashDamage,
- self->splashRadius, self, MOD_OVERMIND, PTE_ALIENS );
- G_SetBuildableAnim( self, BANIM_ATTACK1, qfalse );
-
- break;
- }
+ self->timestamp = level.time;
+ G_SetBuildableAnim( self, BANIM_ATTACK1, qfalse );
}
// just in case an egg finishes building after we tell overmind to stfu
@@ -1252,10 +1239,7 @@ qboolean AHovel_Blocked( gentity_t *hovel, gentity_t *player, qboolean provideEx
G_SetClientViewAngle( player, angles );
}
- if( tr.fraction < 1.0f )
- return qtrue;
- else
- return qfalse;
+ return tr.fraction < 1.0f;
}
/*
@@ -2782,7 +2766,7 @@ static itemBuildError_t G_SufficientBPAvailable( buildable_t buildable,
return bpError;
// Check for buildable<->buildable collisions
- for( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ for( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
{
if( ent->s.eType != ET_BUILDABLE )
continue;
@@ -2800,7 +2784,7 @@ static itemBuildError_t G_SufficientBPAvailable( buildable_t buildable,
level.numBuildablesForRemoval = 0;
// Build a list of buildable entities
- for( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+ for( i = MAX_CLIENTS, ent = g_entities + i; i < level.num_entities; i++, ent++ )
{
if( ent->s.eType != ET_BUILDABLE )
continue;
@@ -3145,9 +3129,9 @@ static gentity_t *G_Build( gentity_t *builder, buildable_t buildable, vec3_t ori
{
// initial base layout created by server
- if( builder->s.origin2[ 0 ]
- || builder->s.origin2[ 1 ]
- || builder->s.origin2[ 2 ] )
+ if( builder->s.origin2[ 0 ] ||
+ builder->s.origin2[ 1 ] ||
+ builder->s.origin2[ 2 ] )
{
VectorCopy( builder->s.origin2, normal );
}
@@ -3533,7 +3517,7 @@ void G_LayoutSave( char *name )
return;
}
- G_Printf("layoutsave: saving layout to %s\n", fileName );
+ G_Printf( "layoutsave: saving layout to %s\n", fileName );
for( i = MAX_CLIENTS; i < level.num_entities; i++ )
{
@@ -3643,15 +3627,17 @@ void G_LayoutSelect( void )
Q_strncpyz( layouts2, layouts, sizeof( layouts2 ) );
l = &layouts2[ 0 ];
layouts[ 0 ] = '\0';
- s = COM_ParseExt( &l, qfalse );
- while( *s )
+ while( 1 )
{
+ s = COM_ParseExt( &l, qfalse );
+ if( !*s )
+ break;
+
if( !Q_stricmp( s, "*BUILTIN*" ) )
{
Q_strcat( layouts, sizeof( layouts ), s );
Q_strcat( layouts, sizeof( layouts ), " " );
cnt++;
- s = COM_ParseExt( &l, qfalse );
continue;
}
@@ -3664,7 +3650,6 @@ void G_LayoutSelect( void )
}
else
G_Printf( S_COLOR_YELLOW "WARNING: layout \"%s\" does not exist\n", s );
- s = COM_ParseExt( &l, qfalse );
}
if( !cnt )
{
@@ -3677,16 +3662,18 @@ void G_LayoutSelect( void )
Q_strncpyz( layouts2, layouts, sizeof( layouts2 ) );
l = &layouts2[ 0 ];
- s = COM_ParseExt( &l, qfalse );
- while( *s )
+ while( 1 )
{
+ s = COM_ParseExt( &l, qfalse );
+ if( !*s )
+ break;
+
Q_strncpyz( level.layout, s, sizeof( level.layout ) );
cnt++;
if( cnt >= layoutNum )
break;
- s = COM_ParseExt( &l, qfalse );
}
- G_Printf("using layout \"%s\" from list ( %s)\n", level.layout, layouts );
+ G_Printf( "using layout \"%s\" from list (%s)\n", level.layout, layouts );
}
/*
diff --git a/src/game/g_client.c b/src/game/g_client.c
index f9742109..3022a9cc 100644
--- a/src/game/g_client.c
+++ b/src/game/g_client.c
@@ -801,7 +801,6 @@ ClientCheckName
static void ClientCleanName( const char *in, char *out, int outSize )
{
int len, colorlessLen;
- char ch;
char *p;
int spaces;
@@ -814,42 +813,33 @@ static void ClientCleanName( const char *in, char *out, int outSize )
*p = 0;
spaces = 0;
- while( 1 )
+ for( ; *in; in++ )
{
- ch = *in++;
- if( !ch )
- break;
-
// don't allow leading spaces
- if( !*p && ch == ' ' )
+ if( colorlessLen == 0 && *in == ' ' )
continue;
// check colors
- if( ch == Q_COLOR_ESCAPE )
+ if( Q_IsColorString( in ) )
{
- // solo trailing carat is not a color prefix
- if( !*in )
- break;
+ in++;
// don't allow black in a name, period
if( ColorIndex( *in ) == 0 )
- {
- in++;
continue;
- }
// make sure room in dest for both chars
if( len > outSize - 2 )
break;
- *out++ = ch;
- *out++ = *in++;
+ *out++ = Q_COLOR_ESCAPE;
+ *out++ = *in;
len += 2;
continue;
}
// don't allow too many consecutive spaces
- if( ch == ' ' )
+ if( *in == ' ' )
{
spaces++;
if( spaces > 3 )
@@ -861,7 +851,7 @@ static void ClientCleanName( const char *in, char *out, int outSize )
if( len > outSize - 1 )
break;
- *out++ = ch;
+ *out++ = *in;
colorlessLen++;
len++;
}
diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c
index 2c5a9764..3c01256b 100644
--- a/src/game/g_cmds.c
+++ b/src/game/g_cmds.c
@@ -53,7 +53,7 @@ void G_SanitiseName( char *in, char *out )
skip = qfalse;
}
- if( *in == 27 || *in == '^' )
+ if( *in == 27 || Q_IsColorString( in ) )
{
in += 2; // skip color code
continue;
@@ -193,7 +193,7 @@ int G_ClientNumbersFromString( char *s, int *plist, int max )
// we must assume that if only a number is provided, it is a clientNum
return 0;
}
-
+
// now look for name matches
G_SanitiseName( s, s2 );
if( strlen( s2 ) < 1 )
@@ -557,9 +557,6 @@ void G_LeaveTeam( gentity_t *self )
if( !ent->inuse )
continue;
- // clean up projectiles
- if( ent->s.eType == ET_MISSILE && ent->r.ownerNum == self->s.number )
- G_FreeEntity( ent );
if( ent->client && ent->client->pers.connected == CON_CONNECTED )
{
// cure poison
@@ -567,6 +564,8 @@ void G_LeaveTeam( gentity_t *self )
ent->client->lastPoisonClient == self )
ent->client->ps.stats[ STAT_STATE ] &= ~SS_POISONED;
}
+ else if( ent->s.eType == ET_MISSILE && ent->r.ownerNum == self->s.number )
+ G_FreeEntity( ent );
}
}
@@ -618,9 +617,9 @@ void Cmd_Team_f( gentity_t *ent )
trap_Argv( 1, s, sizeof( s ) );
- if( !strlen( s ) )
+ if( !s[ 0 ] )
{
- trap_SendServerCommand( ent-g_entities, va("print \"team: %i\n\"",
+ trap_SendServerCommand( ent-g_entities, va( "print \"team: %i\n\"",
oldteam ) );
return;
}
@@ -640,8 +639,8 @@ void Cmd_Team_f( gentity_t *ent )
if( level.alienTeamLocked )
{
trap_SendServerCommand( ent-g_entities,
- va( "print \"Alien team has been ^1LOCKED\n\"" ) );
- return;
+ "print \"Alien team has been ^1LOCKED\n\"" );
+ return;
}
else if( level.humanTeamLocked )
{
@@ -663,8 +662,8 @@ void Cmd_Team_f( gentity_t *ent )
if( level.humanTeamLocked )
{
trap_SendServerCommand( ent-g_entities,
- va( "print \"Human team has been ^1LOCKED\n\"" ) );
- return;
+ "print \"Human team has been ^1LOCKED\n\"" );
+ return;
}
else if( level.alienTeamLocked )
{
@@ -765,7 +764,7 @@ static void G_SayTo( gentity_t *ent, gentity_t *other, int mode, int color, cons
if( BG_ClientListTest( &other->client->sess.ignoreList, ent-g_entities ) )
ignore = qtrue;
-
+
trap_SendServerCommand( other-g_entities, va( "%s \"%s%s%c%c%s%s\"",
mode == SAY_TEAM ? "tchat" : "chat",
( ignore ) ? "[skipnotify]" : "",
@@ -785,9 +784,9 @@ void G_Say( gentity_t *ent, gentity_t *target, int mode, const char *chatText )
char text[ MAX_SAY_TEXT ];
char location[ 64 ];
- if (g_chatTeamPrefix.integer)
+ if( g_chatTeamPrefix.integer )
{
- switch( ent->client->pers.teamSelection)
+ switch( ent->client->pers.teamSelection )
{
default:
case PTE_NONE:
@@ -852,7 +851,7 @@ void G_Say( gentity_t *ent, gentity_t *target, int mode, const char *chatText )
other = &g_entities[ j ];
G_SayTo( ent, other, mode, color, name, text );
}
-
+
if( g_adminParseSay.integer )
{
G_admin_cmd_check ( ent, qtrue );
@@ -878,8 +877,8 @@ static void Cmd_Say_f( gentity_t *ent )
// support parsing /m out of say text since some people have a hard
// time figuring out what the console is.
if( !Q_stricmpn( args, "say /m ", 7 ) ||
- !Q_stricmpn( args, "say_team /m ", 12 ) ||
- !Q_stricmpn( args, "say /mt ", 8 ) ||
+ !Q_stricmpn( args, "say_team /m ", 12 ) ||
+ !Q_stricmpn( args, "say /mt ", 8 ) ||
!Q_stricmpn( args, "say_team /mt ", 13 ) )
{
G_PrivateMessage( ent );
@@ -969,9 +968,9 @@ void Cmd_CallVote_f( gentity_t *ent )
return;
}
- if( g_voteLimit.integer > 0
- && ent->client->pers.voteCount >= g_voteLimit.integer
- && !G_admin_permission( ent, ADMF_NO_VOTE_LIMIT ) )
+ if( g_voteLimit.integer > 0 &&
+ ent->client->pers.voteCount >= g_voteLimit.integer &&
+ !G_admin_permission( ent, ADMF_NO_VOTE_LIMIT ) )
{
trap_SendServerCommand( ent-g_entities, va(
"print \"You have already called the maximum number of votes (%d)\n\"",
@@ -1013,11 +1012,11 @@ void Cmd_CallVote_f( gentity_t *ent )
if( G_ClientNumbersFromString( arg2, clientNums, MAX_CLIENTS ) == 1 )
{
// there was only one partial name match
- clientNum = clientNums[ 0 ];
+ clientNum = clientNums[ 0 ];
}
else
{
- // look for an exact name match (sets clientNum to -1 if it fails)
+ // look for an exact name match (sets clientNum to -1 if it fails)
clientNum = G_ClientNumberFromString( ent, arg2 );
}
@@ -1040,7 +1039,7 @@ void Cmd_CallVote_f( gentity_t *ent )
return;
}
}
-
+
if( !Q_stricmp( arg1, "kick" ) )
{
if( G_admin_permission( &g_entities[ clientNum ], ADMF_IMMUNITY ) )
@@ -1136,7 +1135,7 @@ void Cmd_CallVote_f( gentity_t *ent )
level.voteNo = 0;
ent->client->pers.vote = qtrue;
- for( i = 0 ; i < level.maxclients ; i++ )
+ for( i = 0; i < level.maxclients; i++ )
level.clients[i].ps.eFlags &= ~EF_VOTED;
ent->client->ps.eFlags |= EF_VOTED;
@@ -1190,7 +1189,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent )
char arg2[ MAX_STRING_TOKENS ];
int clientNum = -1;
char name[ MAX_NETNAME ];
-
+
team = ent->client->pers.teamSelection;
if( team == PTE_ALIENS )
@@ -1208,9 +1207,9 @@ void Cmd_CallTeamVote_f( gentity_t *ent )
return;
}
- if( g_voteLimit.integer > 0
- && ent->client->pers.voteCount >= g_voteLimit.integer
- && !G_admin_permission( ent, ADMF_NO_VOTE_LIMIT ) )
+ if( g_voteLimit.integer > 0 &&
+ ent->client->pers.voteCount >= g_voteLimit.integer &&
+ !G_admin_permission( ent, ADMF_NO_VOTE_LIMIT ) )
{
trap_SendServerCommand( ent-g_entities, va(
"print \"You have already called the maximum number of votes (%d)\n\"",
@@ -1227,7 +1226,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent )
trap_SendServerCommand( ent-g_entities, "print \"Invalid team vote string\n\"" );
return;
}
-
+
// detect clientNum for partial name match votes
if( !Q_stricmp( arg1, "kick" ) ||
!Q_stricmp( arg1, "denybuild" ) ||
@@ -1245,11 +1244,11 @@ void Cmd_CallTeamVote_f( gentity_t *ent )
if( G_ClientNumbersFromString( arg2, clientNums, MAX_CLIENTS ) == 1 )
{
// there was only one partial name match
- clientNum = clientNums[ 0 ];
+ clientNum = clientNums[ 0 ];
}
else
{
- // look for an exact name match (sets clientNum to -1 if it fails)
+ // look for an exact name match (sets clientNum to -1 if it fails)
clientNum = G_ClientNumberFromString( ent, arg2 );
}
@@ -1259,7 +1258,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent )
{
clientNum = -1;
}
-
+
if( clientNum != -1 &&
level.clients[ clientNum ].pers.connected == CON_DISCONNECTED )
{
@@ -1366,7 +1365,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent )
level.teamVoteNo[ cs_offset ] = 0;
ent->client->pers.teamVote = qtrue;
- for( i = 0 ; i < level.maxclients ; i++ )
+ for( i = 0; i < level.maxclients; i++ )
{
if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == team )
level.clients[ i ].ps.eFlags &= ~EF_TEAMVOTED;
@@ -1432,13 +1431,13 @@ void Cmd_SetViewpos_f( gentity_t *ent )
if( trap_Argc( ) != 5 )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"usage: setviewpos x y z yaw\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"usage: setviewpos x y z yaw\n\"" );
return;
}
VectorClear( angles );
- for( i = 0 ; i < 3 ; i++ )
+ for( i = 0; i < 3; i++ )
{
trap_Argv( i + 1, buffer, sizeof( buffer ) );
origin[ i ] = atof( buffer );
@@ -1507,10 +1506,7 @@ static qboolean G_RoomForClassChange( gentity_t *ent, pClass_t class,
ent->s.number, MASK_PLAYERSOLID );
//check there is room to evolve
- if( !tr.startsolid && tr.fraction == 1.0f )
- return qtrue;
- else
- return qfalse;
+ return ( !tr.startsolid && tr.fraction == 1.0f );
}
/*
@@ -1677,26 +1673,16 @@ void Cmd_Class_f( gentity_t *ent )
ClientUserinfoChanged( clientNum );
VectorCopy( infestOrigin, ent->s.pos.trBase );
ClientSpawn( ent, ent, ent->s.pos.trBase, ent->s.apos.trBase );
- return;
}
else
- {
G_TriggerMenu2( clientNum, MN_A_CANTEVOLVE, newClass );
- return;
- }
}
else
- {
G_TriggerMenu( clientNum, MN_A_NOEROOM );
- return;
- }
}
}
else if( ent->client->pers.teamSelection == PTE_HUMANS )
- {
G_TriggerMenu( clientNum, MN_H_DEADTOCLASS );
- return;
- }
}
@@ -1795,7 +1781,9 @@ void Cmd_Destroy_f( gentity_t *ent )
if( g_markDeconstruct.integer )
{
- if( g_markDeconstruct.integer )
+ if( !deconstruct )
+ G_Damage( traceEnt, ent, ent, forward, tr.endpos, ent->health, 0, MOD_SUICIDE );
+ else if( g_markDeconstruct.integer )
{
traceEnt->deconstruct = qtrue; // Mark buildable for deconstruction
traceEnt->deconstructTime = level.time;
@@ -1813,17 +1801,14 @@ void Cmd_Destroy_f( gentity_t *ent )
ent->client->pers.netname,
BG_FindNameForBuildable( traceEnt->s.modelindex ) );
- if( !deconstruct )
- G_Damage( traceEnt, ent, ent, forward, tr.endpos, ent->health, 0, MOD_SUICIDE );
- else
- {
- G_Damage( traceEnt, ent, ent, forward, tr.endpos, ent->health, 0, MOD_SUICIDE );
- G_FreeEntity( traceEnt );
- }
+ G_Damage( traceEnt, ent, ent, forward, tr.endpos, ent->health, 0, MOD_SUICIDE );
+ G_FreeEntity( traceEnt );
+ }
- if( !g_cheats.integer )
- ent->client->ps.stats[ STAT_MISC ] +=
- BG_FindBuildTimeForBuildable( traceEnt->s.modelindex );
+ if( !g_cheats.integer )
+ {
+ ent->client->ps.stats[ STAT_MISC ] +=
+ BG_FindBuildTimeForBuildable( traceEnt->s.modelindex );
}
}
}
@@ -1900,7 +1885,7 @@ Cmd_ToggleItem_f
void Cmd_ToggleItem_f( gentity_t *ent )
{
char s[ MAX_TOKEN_CHARS ];
- int upgrade, weapon, i;
+ int upgrade, weapon;
trap_Argv( 1, s, sizeof( s ) );
upgrade = BG_FindUpgradeNumForName( s );
@@ -1916,23 +1901,7 @@ void Cmd_ToggleItem_f( gentity_t *ent )
if( ent->client->ps.weapon != WP_BLASTER )
weapon = WP_BLASTER;
else
- {
- //find a held weapon which isn't the blaster
- for( i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++ )
- {
- if( i == WP_BLASTER )
- continue;
-
- if( BG_InventoryContainsWeapon( i, ent->client->ps.stats ) )
- {
- weapon = i;
- break;
- }
- }
-
- if( i == WP_NUM_WEAPONS )
- weapon = WP_BLASTER;
- }
+ weapon = WP_NONE;
G_ForceWeaponChange( ent, weapon );
}
@@ -2007,21 +1976,21 @@ void Cmd_Buy_f( gentity_t *ent )
// Only humans can buy stuff
if( BG_FindTeamForWeapon( weapon ) != WUT_HUMANS )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't buy alien items\n\"" );
return;
}
//are we /allowed/ to buy this?
if( !BG_FindPurchasableForWeapon( weapon ) )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't buy this item\n\"" );
return;
}
//are we /allowed/ to buy this?
if( !BG_FindStagesForWeapon( weapon, g_humanStage.integer ) || !BG_WeaponIsAllowed( weapon ) )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't buy this item\n\"" );
return;
}
@@ -2074,21 +2043,21 @@ void Cmd_Buy_f( gentity_t *ent )
// Only humans can buy stuff
if( BG_FindTeamForUpgrade( upgrade ) != WUT_HUMANS )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy alien items\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't buy alien items\n\"" );
return;
}
//are we /allowed/ to buy this?
if( !BG_FindPurchasableForUpgrade( upgrade ) )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't buy this item\n\"" );
return;
}
//are we /allowed/ to buy this?
if( !BG_FindStagesForUpgrade( upgrade, g_humanStage.integer ) || !BG_UpgradeIsAllowed( upgrade ) )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't buy this item\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't buy this item\n\"" );
return;
}
@@ -2161,7 +2130,7 @@ void Cmd_Sell_f( gentity_t *ent )
//are we /allowed/ to sell this?
if( !BG_FindPurchasableForWeapon( weapon ) )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't sell this weapon\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't sell this weapon\n\"" );
return;
}
@@ -2190,7 +2159,7 @@ void Cmd_Sell_f( gentity_t *ent )
//are we /allowed/ to sell this?
if( !BG_FindPurchasableForUpgrade( upgrade ) )
{
- trap_SendServerCommand( ent-g_entities, va( "print \"You can't sell this item\n\"" ) );
+ trap_SendServerCommand( ent-g_entities, "print \"You can't sell this item\n\"" );
return;
}
//remove upgrade if carried
@@ -2699,7 +2668,7 @@ void Cmd_PTRCVerify_f( gentity_t *ent )
trap_Argv( 1, s, sizeof( s ) );
- if( !strlen( s ) )
+ if( !s[ 0 ] )
return;
code = atoi( s );
@@ -2743,7 +2712,7 @@ void Cmd_PTRCRestore_f( gentity_t *ent )
trap_Argv( 1, s, sizeof( s ) );
- if( !strlen( s ) )
+ if( !s[ 0 ] )
return;
code = atoi( s );
@@ -2794,12 +2763,12 @@ static void Cmd_Ignore_f( gentity_t *ent )
if( trap_Argc() < 2 )
{
trap_SendServerCommand( ent-g_entities, va( "print \"[skipnotify]"
- "%s: usage \\%s [clientNum | partial name match]\n\"", cmd, cmd ) );
+ "usage: %s [clientNum | partial name match]\n\"", cmd ) );
return;
}
Q_strncpyz( name, ConcatArgs( 1 ), sizeof( name ) );
- matches = G_ClientNumbersFromString( name, pids, MAX_CLIENTS );
+ matches = G_ClientNumbersFromString( name, pids, MAX_CLIENTS );
if( matches < 1 )
{
trap_SendServerCommand( ent-g_entities, va( "print \"[skipnotify]"
@@ -3050,7 +3019,7 @@ int G_SayArgc()
{
if( *s == ' ' )
{
- s++;
+ s++;
if( *s != ' ' )
{
c++;
@@ -3140,9 +3109,9 @@ char *G_SayConcatArgs(int start)
}
void G_DecolorString( char *in, char *out )
-{
+{
while( *in ) {
- if( *in == 27 || *in == '^' ) {
+ if( *in == 27 || Q_IsColorString( in ) ) {
in++;
if( *in )
in++;
@@ -3197,7 +3166,7 @@ void G_PrivateMessage( gentity_t *ent )
{
int count = 0;
- for( i=0; i < pcount; i++ )
+ for( i = 0; i < pcount; i++ )
{
tmpent = &g_entities[ pids[ i ] ];
@@ -3248,9 +3217,9 @@ void G_PrivateMessage( gentity_t *ent )
{
trap_SendServerCommand( pids[ i ], va(
"print \">> to reply, say: /m %d [your message] <<\n\"",
- ( ent - g_entities ) ) );
+ ( ent - g_entities ) ) );
}
- trap_SendServerCommand( pids[ i ], va(
+ trap_SendServerCommand( pids[ i ], va(
"cp \"^%cprivate message from ^7%s^7\"", color,
( ent ) ? ent->client->pers.netname : "console" ) );
}
diff --git a/src/game/g_combat.c b/src/game/g_combat.c
index 1abb9780..003ade97 100644
--- a/src/game/g_combat.c
+++ b/src/game/g_combat.c
@@ -987,13 +987,13 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
}
else if( !g_friendlyFire.integer )
{
- if( !g_friendlyFireHumans.integer
- && targ->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
+ if( !g_friendlyFireHumans.integer &&
+ targ->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
{
return;
}
- if( !g_friendlyFireAliens.integer
- && targ->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
+ if( !g_friendlyFireAliens.integer &&
+ targ->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
{
return;
}
@@ -1238,14 +1238,16 @@ qboolean G_SelectiveRadiusDamage( vec3_t origin, gentity_t *attacker, float dama
points = damage * ( 1.0 - dist / radius );
- if( CanDamage( ent, origin ) )
+ if( CanDamage( ent, origin ) && ent->client &&
+ ent->client->ps.stats[ STAT_PTEAM ] != team )
{
VectorSubtract( ent->r.currentOrigin, origin, dir );
// push the center of mass higher than the origin so players
// get knocked into the air more
dir[ 2 ] += 24;
- G_SelectiveDamage( ent, NULL, attacker, dir, origin,
- (int)points, DAMAGE_RADIUS|DAMAGE_NO_LOCDAMAGE, mod, team );
+ hitClient = qtrue;
+ G_Damage( ent, NULL, attacker, dir, origin,
+ (int)points, DAMAGE_RADIUS|DAMAGE_NO_LOCDAMAGE, mod );
}
}
@@ -1315,6 +1317,7 @@ qboolean G_RadiusDamage( vec3_t origin, gentity_t *attacker, float damage,
// push the center of mass higher than the origin so players
// get knocked into the air more
dir[ 2 ] += 24;
+ hitClient = qtrue;
G_Damage( ent, NULL, attacker, dir, origin,
(int)points, DAMAGE_RADIUS|DAMAGE_NO_LOCDAMAGE, mod );
}
diff --git a/src/game/g_main.c b/src/game/g_main.c
index a1219909..b753bdc7 100644
--- a/src/game/g_main.c
+++ b/src/game/g_main.c
@@ -220,14 +220,14 @@ static cvarTable_t gameCvarTable[ ] =
{ &g_alienMaxStage, "g_alienMaxStage", DEFAULT_ALIEN_MAX_STAGE, 0, 0, qfalse },
{ &g_alienStage2Threshold, "g_alienStage2Threshold", DEFAULT_ALIEN_STAGE2_THRESH, 0, 0, qfalse },
{ &g_alienStage3Threshold, "g_alienStage3Threshold", DEFAULT_ALIEN_STAGE3_THRESH, 0, 0, qfalse },
-
+
{ &g_unlagged, "g_unlagged", "1", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qfalse },
{ &g_disabledEquipment, "g_disabledEquipment", "", CVAR_ROM, 0, qfalse },
{ &g_disabledClasses, "g_disabledClasses", "", CVAR_ROM, 0, qfalse },
{ &g_disabledBuildables, "g_disabledBuildables", "", CVAR_ROM, 0, qfalse },
- { &g_chatTeamPrefix, "g_chatTeamPrefix", "0", CVAR_ARCHIVE },
+ { &g_chatTeamPrefix, "g_chatTeamPrefix", "0", CVAR_ARCHIVE, 0, qfalse },
{ &g_markDeconstruct, "g_markDeconstruct", "1", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qfalse },
@@ -248,13 +248,13 @@ static cvarTable_t gameCvarTable[ ] =
{ &g_adminParseSay, "g_adminParseSay", "1", CVAR_ARCHIVE, 0, qfalse },
{ &g_adminNameProtect, "g_adminNameProtect", "1", CVAR_ARCHIVE, 0, qfalse },
{ &g_adminTempBan, "g_adminTempBan", "120", CVAR_ARCHIVE, 0, qfalse },
-
+
{ &g_dretchPunt, "g_dretchPunt", "0", CVAR_ARCHIVE, 0, qfalse },
{ &g_privateMessages, "g_privateMessages", "1", CVAR_ARCHIVE, 0, qfalse },
-
+
{ &g_tag, "g_tag", "main", CVAR_INIT, 0, qfalse },
-
+
{ &g_rankings, "g_rankings", "0", 0, 0, qfalse}
};
@@ -507,7 +507,7 @@ void G_MapConfigs( const char *mapname )
trap_SendConsoleCommand( EXEC_APPEND,
va( "exec \"%s/default.cfg\"\n", g_mapConfigs.string ) );
-
+
trap_SendConsoleCommand( EXEC_APPEND,
va( "exec \"%s/%s.cfg\"\n", g_mapConfigs.string, mapname ) );
@@ -577,9 +577,7 @@ void G_InitGame( int levelTime, int randomSeed, int restart )
// we're done with g_mapConfigs, so reset this for the next map
trap_Cvar_Set( "g_mapConfigsLoaded", "0" );
- if ( g_admin.string[ 0 ] ) {
- G_admin_readconfig( NULL, 0 );
- }
+ G_admin_readconfig( NULL, 0 );
// initialize all entities for this game
memset( g_entities, 0, MAX_GENTITIES * sizeof( g_entities[ 0 ] ) );
@@ -1302,7 +1300,6 @@ void CalculateRanks( void )
int ff = 0;
level.numConnectedClients = 0;
- level.numNonSpectatorClients = 0;
level.numPlayingClients = 0;
level.numVotingClients = 0; // don't count bots
level.numAlienClients = 0;
@@ -1326,9 +1323,6 @@ void CalculateRanks( void )
if( level.clients[ i ].pers.teamSelection != PTE_NONE )
{
level.numPlayingClients++;
- if( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR )
- level.numNonSpectatorClients++;
-
if( level.clients[ i ].pers.teamSelection == PTE_ALIENS )
{
level.numAlienClients++;
@@ -1344,6 +1338,8 @@ void CalculateRanks( void )
}
}
}
+ level.numNonSpectatorClients = level.numLiveAlienClients +
+ level.numLiveHumanClients;
level.numteamVotingClients[ 0 ] = level.numHumanClients;
level.numteamVotingClients[ 1 ] = level.numAlienClients;
P[ i + 1 ] = '\0';
@@ -2345,7 +2341,7 @@ void G_RunFrame( int levelTime )
ClientEndFrame( ent );
}
- // save position information for all active clients
+ // save position information for all active clients
G_UnlaggedStore( );
end = trap_Milliseconds();
diff --git a/src/game/g_svcmds.c b/src/game/g_svcmds.c
index 34ff66c5..7cf3a97d 100644
--- a/src/game/g_svcmds.c
+++ b/src/game/g_svcmds.c
@@ -344,9 +344,9 @@ void Svcmd_EntityList_f( void )
int e;
gentity_t *check;
- check = g_entities + 1;
+ check = g_entities;
- for( e = 1; e < level.num_entities; e++, check++ )
+ for( e = 0; e < level.num_entities; e++, check++ )
{
if( !check->inuse )
continue;