From 95bc884481782639f876671336e404a1b83f5d8c Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Sun, 16 May 2004 01:37:02 +0000 Subject: * Fixed the gigantic spawn queue fuck up --- src/game/g_active.c | 30 +++++++++++++++--------------- src/game/g_buildable.c | 31 ++++++++++++++++++++++++------- src/game/g_local.h | 4 ++++ src/game/g_main.c | 21 +++++++++++++-------- src/game/g_weapon.c | 16 ++++++++++++++-- 5 files changed, 70 insertions(+), 32 deletions(-) (limited to 'src/game') diff --git a/src/game/g_active.c b/src/game/g_active.c index 0bbe5c82..dc00b0a7 100644 --- a/src/game/g_active.c +++ b/src/game/g_active.c @@ -369,6 +369,21 @@ void SpectatorThink( gentity_t *ent, usercmd_t *ucmd ) G_TriggerMenu( client->ps.clientNum, MN_H_SPAWN ); } } + + //set the queue position for the client side + if( client->ps.pm_flags & PMF_QUEUED ) + { + if( client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS ) + { + client->ps.persistant[ PERS_QUEUEPOS ] = + G_GetPosInSpawnQueue( &level.alienSpawnQueue, client->ps.clientNum ); + } + else if( client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) + { + client->ps.persistant[ PERS_QUEUEPOS ] = + G_GetPosInSpawnQueue( &level.humanSpawnQueue, client->ps.clientNum ); + } + } } if( ( client->buttons & BUTTON_USE_HOLDABLE ) && !( client->oldbuttons & BUTTON_USE_HOLDABLE ) ) @@ -986,21 +1001,6 @@ void ClientThink_real( gentity_t *ent ) } } - //set the queue position for the client side - if( client->ps.pm_flags & PMF_QUEUED ) - { - if( client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS ) - { - client->ps.persistant[ PERS_QUEUEPOS ] = - G_GetPosInSpawnQueue( &level.alienSpawnQueue, client->ps.clientNum ); - } - else if( client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) - { - client->ps.persistant[ PERS_QUEUEPOS ] = - G_GetPosInSpawnQueue( &level.humanSpawnQueue, client->ps.clientNum ); - } - } - // set speed client->ps.speed = g_speed.value * BG_FindSpeedForClass( client->ps.stats[ STAT_PCLASS ] ); diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index f8e83826..ad3b4c29 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -177,12 +177,12 @@ static qboolean findPower( gentity_t *self ) /* ================ -isPower +G_isPower -simple wrapper to findPower to check if a location has power +Simple wrapper to findPower to check if a location has power ================ */ -static qboolean isPower( vec3_t origin ) +qboolean G_isPower( vec3_t origin ) { gentity_t dummy; @@ -251,12 +251,12 @@ static qboolean findDCC( gentity_t *self ) /* ================ -isDCC +G_isDCC simple wrapper to findDCC to check for a dcc ================ */ -static qboolean isDCC( ) +qboolean G_isDCC( void ) { gentity_t dummy; @@ -305,6 +305,23 @@ static qboolean findOvermind( gentity_t *self ) return qfalse; } +/* +================ +G_isOvermind + +Simple wrapper to findOvermind to check if a location has an overmind +================ +*/ +qboolean G_isOvermind( void ) +{ + gentity_t dummy; + + dummy.overmindNode = NULL; + dummy.biteam = BIT_ALIENS; + + return findOvermind( &dummy ); +} + /* ================ findCreep @@ -2374,7 +2391,7 @@ itemBuildError_t G_itemFits( gentity_t *ent, buildable_t buildable, int distance else if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) { //human criteria - if( !isPower( entity_origin ) ) + if( !G_isPower( entity_origin ) ) { //tell player to build a repeater to provide power if( buildable != BA_H_REACTOR && buildable != BA_H_REPEATER ) @@ -2386,7 +2403,7 @@ itemBuildError_t G_itemFits( gentity_t *ent, buildable_t buildable, int distance } //this buildable requires a DCC - if( BG_FindDCCTestForBuildable( buildable ) && !isDCC( ) ) + if( BG_FindDCCTestForBuildable( buildable ) && !G_isDCC( ) ) reason = IBE_NODCC; //check that there is a parent reactor when building a repeater diff --git a/src/game/g_local.h b/src/game/g_local.h index 38d7f6b6..8d891279 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -608,6 +608,10 @@ typedef enum qboolean AHovel_Blocked( gentity_t *hovel, gentity_t *player, qboolean provideExit ); gentity_t *G_CheckSpawnPoint( vec3_t origin, vec3_t normal, buildable_t spawn, vec3_t spawnOrigin ); + +qboolean G_isPower( vec3_t origin ); +qboolean G_isDCC( void ); +qboolean G_isOvermind( void ); void G_BuildableThink( gentity_t *ent, int msec ); qboolean G_BuildableRange( vec3_t origin, float r, buildable_t buildable ); diff --git a/src/game/g_main.c b/src/game/g_main.c index c5546168..0fd433b7 100644 --- a/src/game/g_main.c +++ b/src/game/g_main.c @@ -717,13 +717,15 @@ Remove from front element from a spawn queue */ int G_PopSpawnQueue( spawnQueue_t *sq ) { - int popee = sq->front; + int clientNum = sq->clients[ sq->front ]; if( G_GetSpawnQueueLength( sq ) > 0 ) { + sq->clients[ sq->front ] = -1; sq->front = QUEUE_PLUS1( sq->front ); - g_entities[ sq->clients[ popee ] ].client->ps.pm_flags &= ~PMF_QUEUED; - return sq->clients[ popee ]; + g_entities[ clientNum ].client->ps.pm_flags &= ~PMF_QUEUED; + + return clientNum; } else return -1; @@ -769,7 +771,7 @@ qboolean G_RemoveFromSpawnQueue( spawnQueue_t *sq, int clientNum ) sq->clients[ i ] = sq->clients[ QUEUE_PLUS1( i ) ]; i = QUEUE_PLUS1( i ); - } while( i != sq->back ); + } while( i != QUEUE_PLUS1( sq->back ) ); sq->back = QUEUE_MINUS1( sq->back ); g_entities[ clientNum ].client->ps.pm_flags &= ~PMF_QUEUED; @@ -802,9 +804,9 @@ int G_GetPosInSpawnQueue( spawnQueue_t *sq, int clientNum ) if( sq->clients[ i ] == clientNum ) { if( i < sq->front ) - return i + MAX_CLIENTS - sq->front + 1; + return i + MAX_CLIENTS - sq->front; else - return i - sq->front + 1; + return i - sq->front; } i = QUEUE_PLUS1( i ); @@ -826,13 +828,16 @@ void G_PrintSpawnQueue( spawnQueue_t *sq ) int i = sq->front; int length = G_GetSpawnQueueLength( sq ); - G_Printf( "l: %d f: %d b: %d c: ", length, sq->front, sq->back ); + G_Printf( "l:%d f:%d b:%d :", length, sq->front, sq->back ); if( length > 0 ) { do { - G_Printf( "%d ", sq->clients[ i ] ); + if( sq->clients[ i ] == -1 ) + G_Printf( "*:" ); + else + G_Printf( "%d:", sq->clients[ i ] ); i = QUEUE_PLUS1( i ); } while( i != QUEUE_PLUS1( sq->back ) ); diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index 1aa7504c..9b6eb706 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -631,8 +631,20 @@ void buildFire( gentity_t *ent, dynMenu_t menu ) if( G_ValidateBuild( ent, ent->client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) ) { ent->client->ps.stats[ STAT_BUILDABLE ] = BA_NONE; - ent->client->ps.stats[ STAT_MISC ] += - BG_FindBuildDelayForWeapon( ent->s.weapon ); + + if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS && !G_isOvermind( ) ) + { + ent->client->ps.stats[ STAT_MISC ] += + BG_FindBuildDelayForWeapon( ent->s.weapon ) * 2; + } + else if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS && !G_isPower( muzzle ) ) + { + ent->client->ps.stats[ STAT_MISC ] += + BG_FindBuildDelayForWeapon( ent->s.weapon ) * 2; + } + else + ent->client->ps.stats[ STAT_MISC ] += + BG_FindBuildDelayForWeapon( ent->s.weapon ); } return; } -- cgit