diff options
author | Tim Angus <tim@ngus.net> | 2004-01-21 01:45:59 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2004-01-21 01:45:59 +0000 |
commit | bddf02ca99719240d6a47efc3940ec96656eb810 (patch) | |
tree | fd6b8eccd6833e88daf442d59a889d7878d67bfe /src | |
parent | 96abedcb8c792d4ad2c77bcf522b7998b165bdb0 (diff) |
* (Experimental) fix for a remaining broken buildable bug
* Decreased door trigger size again
* Creep is now triggered by s.time instead of events
* Added CVAR_CHEAT cg_drawBBOX to show the bounding boxes of some entities
* Prevent sprinting if BUTTON_WALK is down
* Increased sprint drain rate
* Client spawning code unified with buildable validation code
* Spawns are now testing for validity before they are built
Diffstat (limited to 'src')
-rw-r--r-- | src/cgame/cg_buildable.c | 22 | ||||
-rw-r--r-- | src/cgame/cg_ents.c | 7 | ||||
-rw-r--r-- | src/cgame/cg_event.c | 4 | ||||
-rw-r--r-- | src/game/g_buildable.c | 127 | ||||
-rw-r--r-- | src/game/g_client.c | 94 | ||||
-rw-r--r-- | src/game/g_cmds.c | 3 | ||||
-rw-r--r-- | src/game/g_local.h | 3 | ||||
-rw-r--r-- | src/game/g_mover.c | 8 | ||||
-rw-r--r-- | src/game/tremulous.h | 4 |
9 files changed, 129 insertions, 143 deletions
diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c index dd008dee..d788657d 100644 --- a/src/cgame/cg_buildable.c +++ b/src/cgame/cg_buildable.c @@ -220,19 +220,22 @@ static void CG_Creep( centity_t *cent ) trace_t tr, tr2; vec3_t temp, origin, p1, p2; int scaleUpTime = BG_FindBuildTimeForBuildable( cent->currentState.modelindex ); + int time; + + time = cent->currentState.time; //should the creep be growing or receding? - if( cent->miscTime >= 0 ) + if( time >= 0 ) { - msec = cg.time - cent->miscTime; + msec = cg.time - time; if( msec >= 0 && msec < scaleUpTime ) frac = (float)msec / scaleUpTime; else frac = 1.0f; } - else if( cent->miscTime < 0 ) + else if( time < 0 ) { - msec = cg.time + cent->miscTime; + msec = cg.time + time; if( msec >= 0 && msec < CREEP_SCALEDOWN_TIME ) frac = 1.0f - ( (float)msec / CREEP_SCALEDOWN_TIME ); else @@ -984,8 +987,15 @@ void CG_Buildable( centity_t *cent ) ent.nonNormalizedAxes = qfalse; - if( team == BIT_HUMANS && !( es->generic1 & B_SPAWNED_TOGGLEBIT ) ) - ent.customShader = cgs.media.humanSpawningShader; + if( !( es->generic1 & B_SPAWNED_TOGGLEBIT ) ) + { + if( team == BIT_HUMANS ) + { + ent.customShader = cgs.media.humanSpawningShader; + } + + /*trap_S_AddLoopingSound*/ + } CG_BuildableAnimation( cent, &ent.oldframe, &ent.frame, &ent.backlerp ); diff --git a/src/cgame/cg_ents.c b/src/cgame/cg_ents.c index c4b7ecc9..1d6d5733 100644 --- a/src/cgame/cg_ents.c +++ b/src/cgame/cg_ents.c @@ -878,13 +878,14 @@ static void CG_CEntityPVSEnter( centity_t *cent ) //clear any particle systems from previous uses of this centity_t cent->muzzlePS = NULL; cent->muzzlePsTrigger = qfalse; - cent->jetPackPS = NULL; cent->jetPackState = JPS_OFF; - cent->buildablePS = NULL; - cent->entityPS = NULL; + + //make sure that the buildable animations are in a consistent state + //when a buildable enters the PVS + cent->buildableAnim = BANIM_NONE; } diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c index 3e512204..3157b660 100644 --- a/src/cgame/cg_event.c +++ b/src/cgame/cg_event.c @@ -654,12 +654,12 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) case EV_BUILD_CONSTRUCT: DEBUGNAME( "EV_BUILD_CONSTRUCT" ); - cent->miscTime = cg.time; // scale up from this + //do something useful here break; case EV_BUILD_DESTROY: DEBUGNAME( "EV_BUILD_DESTROY" ); - cent->miscTime = -cg.time; // scale down from this + //do something useful here break; case EV_RPTUSE_SOUND: diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index fe6d0362..10662feb 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -44,6 +44,66 @@ void G_setIdleBuildableAnim( gentity_t *ent, buildableAnimNumber_t anim ) ent->s.torsoAnim = anim; } +/* +=============== +G_CheckSpawnPoint + +Check if a spawn at a specified point is valid +=============== +*/ +gentity_t *G_CheckSpawnPoint( vec3_t origin, vec3_t normal, buildable_t spawn, vec3_t spawnOrigin ) +{ + float displacement; + vec3_t mins, maxs; + vec3_t cmins, cmaxs; + vec3_t localOrigin; + trace_t tr; + + BG_FindBBoxForBuildable( spawn, mins, maxs ); + + if( spawn == BA_A_SPAWN ) + { + VectorSet( cmins, -MAX_ALIEN_BBOX, -MAX_ALIEN_BBOX, -MAX_ALIEN_BBOX ); + VectorSet( cmaxs, MAX_ALIEN_BBOX, MAX_ALIEN_BBOX, MAX_ALIEN_BBOX ); + + displacement = ( maxs[ 2 ] + MAX_ALIEN_BBOX ) * M_ROOT3; + VectorMA( origin, displacement, normal, localOrigin ); + + trap_Trace( &tr, localOrigin, cmins, cmaxs, localOrigin, -1, MASK_SHOT ); + + if( tr.entityNum == ENTITYNUM_NONE ) + { + if( spawnOrigin != NULL ) + VectorCopy( localOrigin, spawnOrigin ); + + return NULL; + } + else + return &g_entities[ tr.entityNum ]; + } + else if( spawn == BA_H_SPAWN ) + { + BG_FindBBoxForClass( PCL_H_BASE, cmins, cmaxs, NULL, NULL, NULL ); + + VectorCopy( origin, localOrigin ); + localOrigin[ 2 ] += maxs[ 2 ] + fabs( cmins[ 2 ] ) + 1.0f; + + trap_Trace( &tr, localOrigin, cmins, cmaxs, localOrigin, -1, MASK_SHOT ); + + if( tr.entityNum == ENTITYNUM_NONE ) + { + if( spawnOrigin != NULL ) + VectorCopy( localOrigin, spawnOrigin ); + + return NULL; + } + else + return &g_entities[ tr.entityNum ]; + } + + return NULL; +} + #define POWER_REFRESH_TIME 2000 /* @@ -353,6 +413,7 @@ void A_CreepRecede( gentity_t *self ) { self->s.eFlags |= EF_DEAD; G_AddEvent( self, EV_BUILD_DESTROY, 0 ); + self->s.time = -level.time; } //creep is still receeding @@ -387,6 +448,7 @@ void ASpawn_Melt( gentity_t *self ) { self->s.eFlags |= EF_DEAD; G_AddEvent( self, EV_BUILD_DESTROY, 0 ); + self->s.time = -level.time; } //not dead yet @@ -459,34 +521,24 @@ think function for Alien Spawn */ void ASpawn_Think( gentity_t *self ) { - vec3_t mins, maxs, origin; gentity_t *ent; - trace_t tr; - float displacement; if( self->spawned ) { - VectorSet( mins, -MAX_ALIEN_BBOX, -MAX_ALIEN_BBOX, -MAX_ALIEN_BBOX ); - VectorSet( maxs, MAX_ALIEN_BBOX, MAX_ALIEN_BBOX, MAX_ALIEN_BBOX ); - - VectorCopy( self->s.origin, origin ); - displacement = ( self->r.maxs[ 2 ] + MAX_ALIEN_BBOX ) * M_ROOT3; - VectorMA( origin, displacement, self->s.origin2, origin ); - //only suicide if at rest if( self->s.groundEntityNum ) { - trap_Trace( &tr, origin, mins, maxs, origin, self->s.number, MASK_SHOT ); - ent = &g_entities[ tr.entityNum ]; - - if( ent->s.eType == ET_BUILDABLE || ent->s.number == ENTITYNUM_WORLD ) + if( ( ent = G_CheckSpawnPoint( self->s.origin, self->s.origin2, BA_A_SPAWN, NULL ) ) != NULL ) { - G_Damage( self, NULL, NULL, NULL, NULL, 10000, 0, MOD_SUICIDE ); - return; - } + if( ent->s.eType == ET_BUILDABLE || ent->s.number == ENTITYNUM_WORLD ) + { + G_Damage( self, NULL, NULL, NULL, NULL, 10000, 0, MOD_SUICIDE ); + return; + } - if( ent->s.eType == ET_CORPSE ) - G_FreeEntity( ent ); //quietly remove + if( ent->s.eType == ET_CORPSE ) + G_FreeEntity( ent ); //quietly remove + } } } @@ -1896,33 +1948,28 @@ Think for human spawn */ void HSpawn_Think( gentity_t *self ) { - vec3_t mins, maxs, origin; gentity_t *ent; - trace_t tr; - vec3_t up = { 0.0f, 0.0f, 1.0f }; - - BG_FindBBoxForClass( PCL_H_BASE, mins, maxs, NULL, NULL, NULL ); - VectorCopy( self->s.origin, origin ); - origin[ 2 ] += self->r.maxs[ 2 ] + fabs( mins[ 2 ] ) + 1.0f; - //make sure we have power self->powered = findPower( self ); - //only suicide if at rest - if( self->s.groundEntityNum ) + if( self->spawned ) { - trap_Trace( &tr, origin, mins, maxs, origin, self->s.number, MASK_SHOT ); - ent = &g_entities[ tr.entityNum ]; - - if( ent->s.eType == ET_BUILDABLE || ent->s.number == ENTITYNUM_WORLD ) + //only suicide if at rest + if( self->s.groundEntityNum ) { - G_Damage( self, NULL, NULL, NULL, NULL, 10000, 0, MOD_SUICIDE ); - return; - } + if( ( ent = G_CheckSpawnPoint( self->s.origin, self->s.origin2, BA_H_SPAWN, NULL ) ) != NULL ) + { + if( ent->s.eType == ET_BUILDABLE || ent->s.number == ENTITYNUM_WORLD ) + { + G_Damage( self, NULL, NULL, NULL, NULL, 10000, 0, MOD_SUICIDE ); + return; + } - if( ent->s.eType == ET_CORPSE ) - G_FreeEntity( ent ); //quietly remove + if( ent->s.eType == ET_CORPSE ) + G_FreeEntity( ent ); //quietly remove + } + } } self->nextthink = level.time + BG_FindNextThinkForBuildable( self->s.modelindex ); @@ -2043,6 +2090,10 @@ itemBuildError_t G_itemFits( gentity_t *ent, buildable_t buildable, int distance if( tr1.entityNum != ENTITYNUM_WORLD ) return IBE_NORMAL; + //check there is enough room to spawn from (presuming this is a spawn) + if( G_CheckSpawnPoint( origin, normal, buildable, NULL ) != NULL ) + return IBE_NORMAL; + if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS ) { //alien criteria diff --git a/src/game/g_client.c b/src/game/g_client.c index e6a2450a..f6394d41 100644 --- a/src/game/g_client.c +++ b/src/game/g_client.c @@ -276,17 +276,10 @@ gentity_t *SelectAlienSpawnPoint( void ) int count; int selection; gentity_t *spots[ MAX_SPAWN_POINTS ]; - vec3_t mins, maxs, origin; - gentity_t *ent; - trace_t tr; - float displacement; if( level.numAlienSpawns <= 0 ) return NULL; - VectorSet( mins, -MAX_ALIEN_BBOX, -MAX_ALIEN_BBOX, -MAX_ALIEN_BBOX ); - VectorSet( maxs, MAX_ALIEN_BBOX, MAX_ALIEN_BBOX, MAX_ALIEN_BBOX ); - count = 0; spot = NULL; @@ -301,20 +294,8 @@ gentity_t *SelectAlienSpawnPoint( void ) if( !spot->s.groundEntityNum ) continue; - - VectorCopy( spot->s.origin, origin ); - displacement = ( spot->r.maxs[ 2 ] + MAX_ALIEN_BBOX ) * M_ROOT3; - VectorMA( origin, displacement, spot->s.origin2, origin ); - - trap_Trace( &tr, origin, mins, maxs, origin, spot->s.number, MASK_SHOT ); - ent = &g_entities[ tr.entityNum ]; - //spawn will suicide itself in the next 100ms - if( ent->s.eType == ET_BUILDABLE || ent->s.number == ENTITYNUM_WORLD ) - continue; - - //spawn is blocked - if( tr.fraction < 1.0f || tr.startsolid ) + if( G_CheckSpawnPoint( spot->s.origin, spot->s.origin2, BA_A_SPAWN, NULL ) != NULL ) continue; spots[ count ] = spot; @@ -342,15 +323,10 @@ gentity_t *SelectHumanSpawnPoint( void ) int count; int selection; gentity_t *spots[ MAX_SPAWN_POINTS ]; - vec3_t mins, maxs, origin; - gentity_t *ent; - trace_t tr; if( level.numHumanSpawns <= 0 ) return NULL; - BG_FindBBoxForClass( PCL_H_BASE, mins, maxs, NULL, NULL, NULL ); - count = 0; spot = NULL; @@ -366,18 +342,7 @@ gentity_t *SelectHumanSpawnPoint( void ) if( !spot->s.groundEntityNum ) continue; - VectorCopy( spot->s.origin, origin ); - origin[ 2 ] += spot->r.maxs[ 2 ] + fabs( mins[ 2 ] ) + 1.0f; - - trap_Trace( &tr, origin, mins, maxs, origin, spot->s.number, MASK_SHOT ); - ent = &g_entities[ tr.entityNum ]; - - //spawn will suicide itself in the next 100ms - if( ent->s.eType == ET_BUILDABLE || ent->s.number == ENTITYNUM_WORLD ) - continue; - - //spawn is blocked - if( tr.fraction < 1.0f || tr.startsolid ) + if( G_CheckSpawnPoint( spot->s.origin, spot->s.origin2, BA_H_SPAWN, NULL ) != NULL ) continue; spots[ count ] = spot; @@ -402,34 +367,6 @@ Chooses a player start, deathmatch start, etc gentity_t *SelectSpawnPoint( vec3_t avoidPoint, vec3_t origin, vec3_t angles ) { return SelectRandomFurthestSpawnPoint( avoidPoint, origin, angles ); - - /* - gentity_t *spot; - gentity_t *nearestSpot; - - nearestSpot = SelectNearestDeathmatchSpawnPoint( avoidPoint ); - - spot = SelectRandomDeathmatchSpawnPoint ( ); - if ( spot == nearestSpot ) { - // roll again if it would be real close to point of death - spot = SelectRandomDeathmatchSpawnPoint ( ); - if ( spot == nearestSpot ) { - // last try - spot = SelectRandomDeathmatchSpawnPoint ( ); - } - } - - // find a single player start spot - if (!spot) { - G_Error( "Couldn't find a spawn point" ); - } - - VectorCopy (spot->s.origin, origin); - origin[2] += 9; - VectorCopy (spot->s.angles, angles); - - return spot; - */ } @@ -440,12 +377,9 @@ SelectTremulousSpawnPoint Chooses a player start, deathmatch start, etc ============ */ -gentity_t *SelectTremulousSpawnPoint( int team, vec3_t origin, vec3_t angles ) +gentity_t *SelectTremulousSpawnPoint( pTeam_t team, vec3_t origin, vec3_t angles ) { gentity_t *spot; - float displacement; - vec3_t classMins, classMaxs, spawnMins, spawnMaxs; - vec3_t normal = { 0, 0, 1 }; if( team == PTE_ALIENS ) spot = SelectAlienSpawnPoint( ); @@ -456,27 +390,13 @@ gentity_t *SelectTremulousSpawnPoint( int team, vec3_t origin, vec3_t angles ) if( !spot ) return NULL; - VectorCopy( spot->s.pos.trBase, origin ); - VectorCopy( spot->s.angles, angles ); - - angles[ ROLL ] = 0; - if( team == PTE_ALIENS ) - { - BG_FindBBoxForBuildable( BA_A_SPAWN, spawnMins, spawnMaxs ); - - //TA: really a *safe* extreme upper limit - displacement = ( spawnMaxs[ 2 ] + MAX_ALIEN_BBOX ) * M_ROOT3; - VectorMA( origin, displacement, spot->s.origin2, origin ); - } + G_CheckSpawnPoint( spot->s.origin, spot->s.origin2, BA_A_SPAWN, origin ); else if( team == PTE_HUMANS ) - { - BG_FindBBoxForClass( PCL_H_BASE, classMins, classMaxs, NULL, NULL, NULL ); - BG_FindBBoxForBuildable( BA_H_SPAWN, spawnMins, spawnMaxs ); + G_CheckSpawnPoint( spot->s.origin, spot->s.origin2, BA_H_SPAWN, origin ); - displacement = spawnMaxs[ 2 ] + fabs( classMins[ 2 ] ) + 1.0f; - origin[ 2 ] += displacement; - } + VectorCopy( spot->s.angles, angles ); + angles[ ROLL ] = 0; return spot; diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c index 1f4de832..c63eee1a 100644 --- a/src/game/g_cmds.c +++ b/src/game/g_cmds.c @@ -1642,6 +1642,9 @@ void Cmd_Boost_f( gentity_t *ent ) BG_activated( UP_JETPACK, ent->client->ps.stats ) ) return; + if( ent->client->pers.cmd.buttons & BUTTON_WALKING ) + return; + if( ( ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) && ( ent->client->ps.stats[ STAT_STAMINA ] > 0 ) ) ent->client->ps.stats[ STAT_STATE ] |= SS_SPEEDBOOST; diff --git a/src/game/g_local.h b/src/game/g_local.h index 16b40896..9ca44a71 100644 --- a/src/game/g_local.h +++ b/src/game/g_local.h @@ -574,6 +574,7 @@ typedef enum } itemBuildError_t; 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_BuildableRange( vec3_t origin, float r, buildable_t buildable ); itemBuildError_t G_itemFits( gentity_t *ent, buildable_t buildable, int distance, vec3_t origin ); @@ -698,7 +699,7 @@ void ChargeAttack( gentity_t *ent, gentity_t *victim ); // team_t TeamCount( int ignoreClientNum, int team ); void SetClientViewAngle( gentity_t *ent, vec3_t angle ); -gentity_t *SelectTremulousSpawnPoint( int team, vec3_t origin, vec3_t angles ); +gentity_t *SelectTremulousSpawnPoint( pTeam_t team, vec3_t origin, vec3_t angles ); gentity_t *SelectSpawnPoint( vec3_t avoidPoint, vec3_t origin, vec3_t angles ); void SpawnCorpse( gentity_t *ent ); void respawn( gentity_t *ent ); diff --git a/src/game/g_mover.c b/src/game/g_mover.c index 3bc4e94b..404453ed 100644 --- a/src/game/g_mover.c +++ b/src/game/g_mover.c @@ -1209,8 +1209,8 @@ static void manualDoorTriggerSpectator( gentity_t *door, gentity_t *player ) best = i; } - maxs[ best ] += 60; - mins[ best ] -= 60; + maxs[ best ] += 30; + mins[ best ] -= 30; VectorCopy( mins, triggerHull.r.absmin ); VectorCopy( maxs, triggerHull.r.absmax ); @@ -1340,8 +1340,8 @@ void Think_SpawnNewDoorTrigger( gentity_t *ent ) best = i; } - maxs[ best ] += 60; - mins[ best ] -= 60; + maxs[ best ] += 30; + mins[ best ] -= 30; // create a trigger with this size other = G_Spawn( ); diff --git a/src/game/tremulous.h b/src/game/tremulous.h index bb8031ac..9e9c0534 100644 --- a/src/game/tremulous.h +++ b/src/game/tremulous.h @@ -516,8 +516,8 @@ #define STAMINA_STOP_RESTORE 20 #define STAMINA_WALK_RESTORE 10 -#define STAMINA_SPRINT_TAKE 6 -#define STAMINA_LARMOUR_TAKE 3 +#define STAMINA_SPRINT_TAKE 8 +#define STAMINA_LARMOUR_TAKE 4 /* * Misc |