summaryrefslogtreecommitdiff
path: root/src/game/g_mover.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/g_mover.c')
-rw-r--r--src/game/g_mover.c914
1 files changed, 496 insertions, 418 deletions
diff --git a/src/game/g_mover.c b/src/game/g_mover.c
index 13d99ff5..7327c4cd 100644
--- a/src/game/g_mover.c
+++ b/src/game/g_mover.c
@@ -28,13 +28,15 @@ PUSHMOVE
void MatchTeam( gentity_t *teamLeader, int moverState, int time );
-typedef struct {
+typedef struct
+{
gentity_t *ent;
vec3_t origin;
vec3_t angles;
float deltayaw;
} pushed_t;
-pushed_t pushed[MAX_GENTITIES], *pushed_p;
+
+pushed_t pushed[ MAX_GENTITIES ], *pushed_p;
/*
@@ -43,22 +45,22 @@ G_TestEntityPosition
============
*/
-gentity_t *G_TestEntityPosition( gentity_t *ent ) {
+gentity_t *G_TestEntityPosition( gentity_t *ent )
+{
trace_t tr;
int mask;
- if ( ent->clipmask ) {
+ if( ent->clipmask )
mask = ent->clipmask;
- } else {
+ else
mask = MASK_SOLID;
- }
- if ( ent->client ) {
+
+ if( ent->client )
trap_Trace( &tr, ent->client->ps.origin, ent->r.mins, ent->r.maxs, ent->client->ps.origin, ent->s.number, mask );
- } else {
+ else
trap_Trace( &tr, ent->s.pos.trBase, ent->r.mins, ent->r.maxs, ent->s.pos.trBase, ent->s.number, mask );
- }
- if (tr.startsolid)
+ if( tr.startsolid )
return &g_entities[ tr.entityNum ];
return NULL;
@@ -69,9 +71,10 @@ gentity_t *G_TestEntityPosition( gentity_t *ent ) {
G_CreateRotationMatrix
================
*/
-void G_CreateRotationMatrix(vec3_t angles, vec3_t matrix[3]) {
- AngleVectors(angles, matrix[0], matrix[1], matrix[2]);
- VectorInverse(matrix[1]);
+void G_CreateRotationMatrix( vec3_t angles, vec3_t matrix[ 3 ] )
+{
+ AngleVectors( angles, matrix[ 0 ], matrix[ 1 ], matrix[ 2 ] );
+ VectorInverse( matrix[ 1 ] );
}
/*
@@ -79,11 +82,15 @@ void G_CreateRotationMatrix(vec3_t angles, vec3_t matrix[3]) {
G_TransposeMatrix
================
*/
-void G_TransposeMatrix(vec3_t matrix[3], vec3_t transpose[3]) {
+void G_TransposeMatrix( vec3_t matrix[ 3 ], vec3_t transpose[ 3 ] )
+{
int i, j;
- for (i = 0; i < 3; i++) {
- for (j = 0; j < 3; j++) {
- transpose[i][j] = matrix[j][i];
+
+ for( i = 0; i < 3; i++ )
+ {
+ for( j = 0; j < 3; j++ )
+ {
+ transpose[ i ][ j ] = matrix[ j ][ i ];
}
}
}
@@ -93,13 +100,14 @@ void G_TransposeMatrix(vec3_t matrix[3], vec3_t transpose[3]) {
G_RotatePoint
================
*/
-void G_RotatePoint(vec3_t point, vec3_t matrix[3]) {
+void G_RotatePoint( vec3_t point, vec3_t matrix[ 3 ] )
+{
vec3_t tvec;
- VectorCopy(point, tvec);
- point[0] = DotProduct(matrix[0], tvec);
- point[1] = DotProduct(matrix[1], tvec);
- point[2] = DotProduct(matrix[2], tvec);
+ VectorCopy( point, tvec );
+ point[ 0 ] = DotProduct( matrix[ 0 ], tvec );
+ point[ 1 ] = DotProduct( matrix[ 1 ], tvec );
+ point[ 2 ] = DotProduct( matrix[ 2 ], tvec );
}
/*
@@ -109,28 +117,30 @@ G_TryPushingEntity
Returns qfalse if the move is blocked
==================
*/
-qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move, vec3_t amove ) {
- vec3_t matrix[3], transpose[3];
+qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move, vec3_t amove )
+{
+ vec3_t matrix[ 3 ], transpose[ 3 ];
vec3_t org, org2, move2;
gentity_t *block;
// EF_MOVER_STOP will just stop when contacting another entity
// instead of pushing it, but entities can still ride on top of it
- if ( ( pusher->s.eFlags & EF_MOVER_STOP ) &&
- check->s.groundEntityNum != pusher->s.number ) {
+ if( ( pusher->s.eFlags & EF_MOVER_STOP ) &&
+ check->s.groundEntityNum != pusher->s.number )
return qfalse;
- }
// save off the old position
- if (pushed_p > &pushed[MAX_GENTITIES]) {
+ if( pushed_p > &pushed[ MAX_GENTITIES ] )
G_Error( "pushed_p > &pushed[MAX_GENTITIES]" );
- }
+
pushed_p->ent = check;
- VectorCopy (check->s.pos.trBase, pushed_p->origin);
- VectorCopy (check->s.apos.trBase, pushed_p->angles);
- if ( check->client ) {
- pushed_p->deltayaw = check->client->ps.delta_angles[YAW];
- VectorCopy (check->client->ps.origin, pushed_p->origin);
+ VectorCopy( check->s.pos.trBase, pushed_p->origin );
+ VectorCopy( check->s.apos.trBase, pushed_p->angles );
+
+ if( check->client )
+ {
+ pushed_p->deltayaw = check->client->ps.delta_angles[ YAW ];
+ VectorCopy( check->client->ps.origin, pushed_p->origin );
}
pushed_p++;
@@ -138,52 +148,58 @@ qboolean G_TryPushingEntity( gentity_t *check, gentity_t *pusher, vec3_t move,
// figure movement due to the pusher's amove
G_CreateRotationMatrix( amove, transpose );
G_TransposeMatrix( transpose, matrix );
- if ( check->client ) {
- VectorSubtract (check->client->ps.origin, pusher->r.currentOrigin, org);
- }
- else {
- VectorSubtract (check->s.pos.trBase, pusher->r.currentOrigin, org);
- }
+
+ if( check->client )
+ VectorSubtract( check->client->ps.origin, pusher->r.currentOrigin, org );
+ else
+ VectorSubtract( check->s.pos.trBase, pusher->r.currentOrigin, org );
+
VectorCopy( org, org2 );
G_RotatePoint( org2, matrix );
- VectorSubtract (org2, org, move2);
+ VectorSubtract( org2, org, move2 );
// add movement
- VectorAdd (check->s.pos.trBase, move, check->s.pos.trBase);
- VectorAdd (check->s.pos.trBase, move2, check->s.pos.trBase);
- if ( check->client ) {
- VectorAdd (check->client->ps.origin, move, check->client->ps.origin);
- VectorAdd (check->client->ps.origin, move2, check->client->ps.origin);
+ VectorAdd( check->s.pos.trBase, move, check->s.pos.trBase );
+ VectorAdd( check->s.pos.trBase, move2, check->s.pos.trBase );
+
+ if( check->client )
+ {
+ VectorAdd( check->client->ps.origin, move, check->client->ps.origin );
+ VectorAdd( check->client->ps.origin, move2, check->client->ps.origin );
// make sure the client's view rotates when on a rotating mover
- check->client->ps.delta_angles[YAW] += ANGLE2SHORT(amove[YAW]);
+ check->client->ps.delta_angles[ YAW ] += ANGLE2SHORT( amove[ YAW ] );
}
// may have pushed them off an edge
- if ( check->s.groundEntityNum != pusher->s.number ) {
+ if( check->s.groundEntityNum != pusher->s.number )
check->s.groundEntityNum = -1;
- }
block = G_TestEntityPosition( check );
- if (!block) {
+
+ if( !block )
+ {
// pushed ok
- if ( check->client ) {
+ if( check->client )
VectorCopy( check->client->ps.origin, check->r.currentOrigin );
- } else {
+ else
VectorCopy( check->s.pos.trBase, check->r.currentOrigin );
- }
- trap_LinkEntity (check);
+
+ trap_LinkEntity( check );
return qtrue;
}
// if it is ok to leave in the old position, do it
// this is only relevent for riding entities, not pushed
// Sliding trapdoors can cause this.
- VectorCopy( (pushed_p-1)->origin, check->s.pos.trBase);
- if ( check->client ) {
- VectorCopy( (pushed_p-1)->origin, check->client->ps.origin);
- }
- VectorCopy( (pushed_p-1)->angles, check->s.apos.trBase );
- block = G_TestEntityPosition (check);
- if ( !block ) {
+ VectorCopy( ( pushed_p - 1 )->origin, check->s.pos.trBase );
+
+ if( check->client )
+ VectorCopy( ( pushed_p - 1 )->origin, check->client->ps.origin );
+
+ VectorCopy( ( pushed_p - 1 )->angles, check->s.apos.trBase );
+ block = G_TestEntityPosition( check );
+
+ if( !block )
+ {
check->s.groundEntityNum = -1;
pushed_p--;
return qtrue;
@@ -203,13 +219,14 @@ otherwise riders would continue to slide.
If qfalse is returned, *obstacle will be the blocking entity
============
*/
-qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **obstacle ) {
- int i, e;
+qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **obstacle )
+{
+ int i, e;
gentity_t *check;
vec3_t mins, maxs;
pushed_t *p;
- int entityList[MAX_GENTITIES];
- int listedEntities;
+ int entityList[ MAX_GENTITIES ];
+ int listedEntities;
vec3_t totalMins, totalMaxs;
*obstacle = NULL;
@@ -217,31 +234,37 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **
// mins/maxs are the bounds at the destination
// totalMins / totalMaxs are the bounds for the entire move
- if ( pusher->r.currentAngles[0] || pusher->r.currentAngles[1] || pusher->r.currentAngles[2]
- || amove[0] || amove[1] || amove[2] ) {
+ if( pusher->r.currentAngles[ 0 ] || pusher->r.currentAngles[ 1 ] || pusher->r.currentAngles[ 2 ]
+ || amove[ 0 ] || amove[ 1 ] || amove[ 2 ] )
+ {
float radius;
radius = RadiusFromBounds( pusher->r.mins, pusher->r.maxs );
- for ( i = 0 ; i < 3 ; i++ ) {
- mins[i] = pusher->r.currentOrigin[i] + move[i] - radius;
- maxs[i] = pusher->r.currentOrigin[i] + move[i] + radius;
- totalMins[i] = mins[i] - move[i];
- totalMaxs[i] = maxs[i] - move[i];
+
+ for( i = 0 ; i < 3 ; i++ )
+ {
+ mins[ i ] = pusher->r.currentOrigin[ i ] + move[ i ] - radius;
+ maxs[ i ] = pusher->r.currentOrigin[ i ] + move[ i ] + radius;
+ totalMins[ i ] = mins[ i ] - move[ i ];
+ totalMaxs[ i ] = maxs[ i ] - move[ i ];
}
- } else {
- for (i=0 ; i<3 ; i++) {
- mins[i] = pusher->r.absmin[i] + move[i];
- maxs[i] = pusher->r.absmax[i] + move[i];
+ }
+ else
+ {
+ for( i = 0; i < 3; i++ )
+ {
+ mins[ i ] = pusher->r.absmin[ i ] + move[ i ];
+ maxs[ i ] = pusher->r.absmax[ i ] + move[ i ];
}
VectorCopy( pusher->r.absmin, totalMins );
VectorCopy( pusher->r.absmax, totalMaxs );
- for (i=0 ; i<3 ; i++) {
- if ( move[i] > 0 ) {
- totalMaxs[i] += move[i];
- } else {
- totalMins[i] += move[i];
- }
+ for( i = 0; i < 3; i++ )
+ {
+ if( move[ i ] > 0 )
+ totalMaxs[ i ] += move[ i ];
+ else
+ totalMins[ i ] += move[ i ];
}
}
@@ -256,43 +279,43 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **
trap_LinkEntity( pusher );
// see if any solid entities are inside the final position
- for ( e = 0 ; e < listedEntities ; e++ ) {
+ for( e = 0 ; e < listedEntities ; e++ )
+ {
check = &g_entities[ entityList[ e ] ];
// only push items and players
- if ( check->s.eType != ET_ITEM && check->s.eType != ET_BUILDABLE &&
- check->s.eType != ET_CORPSE && check->s.eType != ET_PLAYER &&
- !check->physicsObject ) {
+ if( check->s.eType != ET_ITEM && check->s.eType != ET_BUILDABLE &&
+ check->s.eType != ET_CORPSE && check->s.eType != ET_PLAYER &&
+ !check->physicsObject )
continue;
- }
// if the entity is standing on the pusher, it will definitely be moved
- if ( check->s.groundEntityNum != pusher->s.number ) {
+ if( check->s.groundEntityNum != pusher->s.number )
+ {
// see if the ent needs to be tested
- if ( check->r.absmin[0] >= maxs[0]
- || check->r.absmin[1] >= maxs[1]
- || check->r.absmin[2] >= maxs[2]
- || check->r.absmax[0] <= mins[0]
- || check->r.absmax[1] <= mins[1]
- || check->r.absmax[2] <= mins[2] ) {
+ if( check->r.absmin[ 0 ] >= maxs[ 0 ]
+ || check->r.absmin[ 1 ] >= maxs[ 1 ]
+ || check->r.absmin[ 2 ] >= maxs[ 2 ]
+ || check->r.absmax[ 0 ] <= mins[ 0 ]
+ || check->r.absmax[ 1 ] <= mins[ 1 ]
+ || check->r.absmax[ 2 ] <= mins[ 2 ] )
continue;
- }
+
// see if the ent's bbox is inside the pusher's final position
// this does allow a fast moving object to pass through a thin entity...
- if (!G_TestEntityPosition (check)) {
+ if( !G_TestEntityPosition( check ) )
continue;
- }
}
// the entity needs to be pushed
- if ( G_TryPushingEntity( check, pusher, move, amove ) ) {
+ if( G_TryPushingEntity( check, pusher, move, amove ) )
continue;
- }
// the move was blocked an entity
// bobbing entities are instant-kill and never get blocked
- if ( pusher->s.pos.trType == TR_SINE || pusher->s.apos.trType == TR_SINE ) {
+ if( pusher->s.pos.trType == TR_SINE || pusher->s.apos.trType == TR_SINE )
+ {
G_Damage( check, pusher, pusher, NULL, NULL, 99999, 0, MOD_CRUSH );
continue;
}
@@ -304,15 +327,20 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **
// move back any entities we already moved
// go backwards, so if the same entity was pushed
// twice, it goes back to the original position
- for ( p=pushed_p-1 ; p>=pushed ; p-- ) {
- VectorCopy (p->origin, p->ent->s.pos.trBase);
- VectorCopy (p->angles, p->ent->s.apos.trBase);
- if ( p->ent->client ) {
- p->ent->client->ps.delta_angles[YAW] = p->deltayaw;
- VectorCopy (p->origin, p->ent->client->ps.origin);
+ for( p = pushed_p - 1; p >= pushed; p-- )
+ {
+ VectorCopy( p->origin, p->ent->s.pos.trBase );
+ VectorCopy( p->angles, p->ent->s.apos.trBase );
+
+ if( p->ent->client )
+ {
+ p->ent->client->ps.delta_angles[ YAW ] = p->deltayaw;
+ VectorCopy( p->origin, p->ent->client->ps.origin );
}
- trap_LinkEntity (p->ent);
+
+ trap_LinkEntity( p->ent );
}
+
return qfalse;
}
@@ -325,7 +353,8 @@ qboolean G_MoverPush( gentity_t *pusher, vec3_t move, vec3_t amove, gentity_t **
G_MoverTeam
=================
*/
-void G_MoverTeam( gentity_t *ent ) {
+void G_MoverTeam( gentity_t *ent )
+{
vec3_t move, amove;
gentity_t *part, *obstacle;
vec3_t origin, angles;
@@ -336,20 +365,22 @@ void G_MoverTeam( gentity_t *ent ) {
// any moves or calling any think functions
// if the move is blocked, all moved objects will be backed out
pushed_p = pushed;
- for (part = ent ; part ; part=part->teamchain) {
+ for( part = ent; part; part = part->teamchain )
+ {
// get current position
BG_EvaluateTrajectory( &part->s.pos, level.time, origin );
BG_EvaluateTrajectory( &part->s.apos, level.time, angles );
VectorSubtract( origin, part->r.currentOrigin, move );
VectorSubtract( angles, part->r.currentAngles, amove );
- if ( !G_MoverPush( part, move, amove, &obstacle ) ) {
+ if( !G_MoverPush( part, move, amove, &obstacle ) )
break; // move was blocked
- }
}
- if (part) {
+ if( part )
+ {
// go back to the previous position
- for ( part = ent ; part ; part = part->teamchain ) {
+ for( part = ent; part; part = part->teamchain )
+ {
part->s.pos.trTime += level.time - level.previousTime;
part->s.apos.trTime += level.time - level.previousTime;
BG_EvaluateTrajectory( &part->s.pos, level.time, part->r.currentOrigin );
@@ -358,20 +389,22 @@ void G_MoverTeam( gentity_t *ent ) {
}
// if the pusher has a "blocked" function, call it
- if (ent->blocked) {
+ if( ent->blocked )
ent->blocked( ent, obstacle );
- }
+
return;
}
// the move succeeded
- for ( part = ent ; part ; part = part->teamchain ) {
+ for( part = ent; part; part = part->teamchain )
+ {
// call the reached function if time is at or past end point
- if ( part->s.pos.trType == TR_LINEAR_STOP ) {
- if ( level.time >= part->s.pos.trTime + part->s.pos.trDuration ) {
- if ( part->reached ) {
+ if( part->s.pos.trType == TR_LINEAR_STOP )
+ {
+ if( level.time >= part->s.pos.trTime + part->s.pos.trDuration )
+ {
+ if( part->reached )
part->reached( part );
- }
}
}
}
@@ -383,17 +416,16 @@ G_RunMover
================
*/
-void G_RunMover( gentity_t *ent ) {
+void G_RunMover( gentity_t *ent )
+{
// if not a team captain, don't do anything, because
// the captain will handle everything
- if ( ent->flags & FL_TEAMSLAVE ) {
+ if( ent->flags & FL_TEAMSLAVE )
return;
- }
// if stationary at one of the positions, don't move anything
- if ( ent->s.pos.trType != TR_STATIONARY || ent->s.apos.trType != TR_STATIONARY ) {
+ if( ent->s.pos.trType != TR_STATIONARY || ent->s.apos.trType != TR_STATIONARY )
G_MoverTeam( ent );
- }
// check think function
G_RunThink( ent );
@@ -414,37 +446,43 @@ Pos1 is "at rest", pos2 is "activated"
SetMoverState
===============
*/
-void SetMoverState( gentity_t *ent, moverState_t moverState, int time ) {
- vec3_t delta;
- float f;
+void SetMoverState( gentity_t *ent, moverState_t moverState, int time )
+{
+ vec3_t delta;
+ float f;
ent->moverState = moverState;
ent->s.pos.trTime = time;
- switch( moverState ) {
- case MOVER_POS1:
- VectorCopy( ent->pos1, ent->s.pos.trBase );
- ent->s.pos.trType = TR_STATIONARY;
- break;
- case MOVER_POS2:
- VectorCopy( ent->pos2, ent->s.pos.trBase );
- ent->s.pos.trType = TR_STATIONARY;
- break;
- case MOVER_1TO2:
- VectorCopy( ent->pos1, ent->s.pos.trBase );
- VectorSubtract( ent->pos2, ent->pos1, delta );
- f = 1000.0 / ent->s.pos.trDuration;
- VectorScale( delta, f, ent->s.pos.trDelta );
- ent->s.pos.trType = TR_LINEAR_STOP;
- break;
- case MOVER_2TO1:
- VectorCopy( ent->pos2, ent->s.pos.trBase );
- VectorSubtract( ent->pos1, ent->pos2, delta );
- f = 1000.0 / ent->s.pos.trDuration;
- VectorScale( delta, f, ent->s.pos.trDelta );
- ent->s.pos.trType = TR_LINEAR_STOP;
- break;
- }
+ switch( moverState )
+ {
+ case MOVER_POS1:
+ VectorCopy( ent->pos1, ent->s.pos.trBase );
+ ent->s.pos.trType = TR_STATIONARY;
+ break;
+
+ case MOVER_POS2:
+ VectorCopy( ent->pos2, ent->s.pos.trBase );
+ ent->s.pos.trType = TR_STATIONARY;
+ break;
+
+ case MOVER_1TO2:
+ VectorCopy( ent->pos1, ent->s.pos.trBase );
+ VectorSubtract( ent->pos2, ent->pos1, delta );
+ f = 1000.0 / ent->s.pos.trDuration;
+ VectorScale( delta, f, ent->s.pos.trDelta );
+ ent->s.pos.trType = TR_LINEAR_STOP;
+ break;
+
+ case MOVER_2TO1:
+ VectorCopy( ent->pos2, ent->s.pos.trBase );
+ VectorSubtract( ent->pos1, ent->pos2, delta );
+ f = 1000.0 / ent->s.pos.trDuration;
+ VectorScale( delta, f, ent->s.pos.trDelta );
+ ent->s.pos.trType = TR_LINEAR_STOP;
+ break;
+ }
+
BG_EvaluateTrajectory( &ent->s.pos, level.time, ent->r.currentOrigin );
trap_LinkEntity( ent );
}
@@ -457,12 +495,12 @@ All entities in a mover team will move from pos1 to pos2
in the same amount of time
================
*/
-void MatchTeam( gentity_t *teamLeader, int moverState, int time ) {
+void MatchTeam( gentity_t *teamLeader, int moverState, int time )
+{
gentity_t *slave;
- for ( slave = teamLeader ; slave ; slave = slave->teamchain ) {
+ for( slave = teamLeader; slave; slave = slave->teamchain )
SetMoverState( slave, moverState, time );
- }
}
@@ -472,16 +510,16 @@ void MatchTeam( gentity_t *teamLeader, int moverState, int time ) {
ReturnToPos1
================
*/
-void ReturnToPos1( gentity_t *ent ) {
+void ReturnToPos1( gentity_t *ent )
+{
MatchTeam( ent, MOVER_2TO1, level.time );
// looping sound
ent->s.loopSound = ent->soundLoop;
// starting sound
- if ( ent->sound2to1 ) {
+ if( ent->sound2to1 )
G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound2to1 );
- }
}
@@ -490,45 +528,45 @@ void ReturnToPos1( gentity_t *ent ) {
Reached_BinaryMover
================
*/
-void Reached_BinaryMover( gentity_t *ent ) {
-
+void Reached_BinaryMover( gentity_t *ent )
+{
// stop the looping sound
ent->s.loopSound = ent->soundLoop;
- if ( ent->moverState == MOVER_1TO2 ) {
+ if( ent->moverState == MOVER_1TO2 )
+ {
// reached pos2
SetMoverState( ent, MOVER_POS2, level.time );
// play sound
- if ( ent->soundPos2 ) {
+ if( ent->soundPos2 )
G_AddEvent( ent, EV_GENERAL_SOUND, ent->soundPos2 );
- }
// return to pos1 after a delay
ent->think = ReturnToPos1;
ent->nextthink = level.time + ent->wait;
// fire targets
- if ( !ent->activator ) {
+ if( !ent->activator )
ent->activator = ent;
- }
+
G_UseTargets( ent, ent->activator );
- } else if ( ent->moverState == MOVER_2TO1 ) {
+ }
+ else if( ent->moverState == MOVER_2TO1 )
+ {
// reached pos1
SetMoverState( ent, MOVER_POS1, level.time );
// play sound
- if ( ent->soundPos1 ) {
+ if( ent->soundPos1 )
G_AddEvent( ent, EV_GENERAL_SOUND, ent->soundPos1 );
- }
// close areaportals
- if ( ent->teammaster == ent || !ent->teammaster ) {
+ if( ent->teammaster == ent || !ent->teammaster )
trap_AdjustAreaPortalState( ent, qfalse );
- }
- } else {
- G_Error( "Reached_BinaryMover: bad moverState" );
}
+ else
+ G_Error( "Reached_BinaryMover: bad moverState" );
}
@@ -537,73 +575,78 @@ void Reached_BinaryMover( gentity_t *ent ) {
Use_BinaryMover
================
*/
-void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator ) {
+void Use_BinaryMover( gentity_t *ent, gentity_t *other, gentity_t *activator )
+{
int total;
int partial;
// only the master should be used
- if ( ent->flags & FL_TEAMSLAVE ) {
+ if( ent->flags & FL_TEAMSLAVE )
+ {
Use_BinaryMover( ent->teammaster, other, activator );
return;
}
ent->activator = activator;
- if ( ent->moverState == MOVER_POS1 ) {
+ if( ent->moverState == MOVER_POS1 )
+ {
// start moving 50 msec later, becase if this was player
// triggered, level.time hasn't been advanced yet
MatchTeam( ent, MOVER_1TO2, level.time + 50 );
// starting sound
- if ( ent->sound1to2 ) {
+ if( ent->sound1to2 )
G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound1to2 );
- }
// looping sound
ent->s.loopSound = ent->soundLoop;
// open areaportal
- if ( ent->teammaster == ent || !ent->teammaster ) {
+ if( ent->teammaster == ent || !ent->teammaster )
trap_AdjustAreaPortalState( ent, qtrue );
- }
+
return;
}
// if all the way up, just delay before coming down
- if ( ent->moverState == MOVER_POS2 ) {
+ if( ent->moverState == MOVER_POS2 )
+ {
ent->nextthink = level.time + ent->wait;
return;
}
// only partway down before reversing
- if ( ent->moverState == MOVER_2TO1 ) {
+ if( ent->moverState == MOVER_2TO1 )
+ {
total = ent->s.pos.trDuration;
partial = level.time - ent->s.pos.trTime;
- if ( partial > total ) {
+
+ if( partial > total )
partial = total;
- }
MatchTeam( ent, MOVER_1TO2, level.time - ( total - partial ) );
- if ( ent->sound1to2 ) {
+ if( ent->sound1to2 )
G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound1to2 );
- }
+
return;
}
// only partway up before reversing
- if ( ent->moverState == MOVER_1TO2 ) {
+ if( ent->moverState == MOVER_1TO2 )
+ {
total = ent->s.pos.trDuration;
partial = level.time - ent->s.pos.trTime;
- if ( partial > total ) {
+
+ if( partial > total )
partial = total;
- }
MatchTeam( ent, MOVER_2TO1, level.time - ( total - partial ) );
- if ( ent->sound2to1 ) {
+ if( ent->sound2to1 )
G_AddEvent( ent, EV_GENERAL_SOUND, ent->sound2to1 );
- }
+
return;
}
}
@@ -618,47 +661,48 @@ InitMover
so the movement delta can be calculated
================
*/
-void InitMover( gentity_t *ent ) {
+void InitMover( gentity_t *ent )
+{
vec3_t move;
- float distance;
- float light;
+ float distance;
+ float light;
vec3_t color;
qboolean lightSet, colorSet;
- char *sound;
+ char *sound;
// if the "model2" key is set, use a seperate model
// for drawing, but clip against the brushes
- if ( ent->model2 ) {
+ if( ent->model2 )
ent->s.modelindex2 = G_ModelIndex( ent->model2 );
- }
// if the "loopsound" key is set, use a constant looping sound when moving
- if ( G_SpawnString( "noise", "100", &sound ) ) {
+ if( G_SpawnString( "noise", "100", &sound ) )
ent->s.loopSound = G_SoundIndex( sound );
- }
// if the "color" or "light" keys are set, setup constantLight
lightSet = G_SpawnFloat( "light", "100", &light );
colorSet = G_SpawnVector( "color", "1 1 1", color );
- if ( lightSet || colorSet ) {
+
+ if( lightSet || colorSet )
+ {
int r, g, b, i;
- r = color[0] * 255;
- if ( r > 255 ) {
+ r = color[ 0 ] * 255;
+ if( r > 255 )
r = 255;
- }
- g = color[1] * 255;
- if ( g > 255 ) {
+
+ g = color[ 1 ] * 255;
+ if( g > 255 )
g = 255;
- }
- b = color[2] * 255;
- if ( b > 255 ) {
+
+ b = color[ 2 ] * 255;
+ if( b > 255 )
b = 255;
- }
+
i = light / 4;
- if ( i > 255 ) {
+ if( i > 255 )
i = 255;
- }
+
ent->s.constantLight = r | ( g << 8 ) | ( b << 16 ) | ( i << 24 );
}
@@ -669,8 +713,8 @@ void InitMover( gentity_t *ent ) {
ent->moverState = MOVER_POS1;
ent->r.svFlags = SVF_USE_CURRENT_ORIGIN;
ent->s.eType = ET_MOVER;
- VectorCopy (ent->pos1, ent->r.currentOrigin);
- trap_LinkEntity (ent);
+ VectorCopy( ent->pos1, ent->r.currentOrigin );
+ trap_LinkEntity( ent );
ent->s.pos.trType = TR_STATIONARY;
VectorCopy( ent->pos1, ent->s.pos.trBase );
@@ -678,14 +722,14 @@ void InitMover( gentity_t *ent ) {
// calculate time to reach second position from speed
VectorSubtract( ent->pos2, ent->pos1, move );
distance = VectorLength( move );
- if ( ! ent->speed ) {
+ if( ! ent->speed )
ent->speed = 100;
- }
+
VectorScale( move, ent->speed, ent->s.pos.trDelta );
ent->s.pos.trDuration = distance * 1000 / ent->speed;
- if ( ent->s.pos.trDuration <= 0 ) {
+
+ if( ent->s.pos.trDuration <= 0 )
ent->s.pos.trDuration = 1;
- }
}
@@ -705,21 +749,22 @@ targeted by another entity.
Blocked_Door
================
*/
-void Blocked_Door( gentity_t *ent, gentity_t *other ) {
+void Blocked_Door( gentity_t *ent, gentity_t *other )
+{
// remove anything other than a client
- if ( !other->client ) {
+ if( !other->client )
+ {
// except CTF flags!!!!
G_TempEntity( other->s.origin, EV_ITEM_POP );
G_FreeEntity( other );
return;
}
- if ( ent->damage ) {
+ if( ent->damage )
G_Damage( other, ent, ent, NULL, NULL, ent->damage, 0, MOD_CRUSH );
- }
- if ( ent->spawnflags & 4 ) {
+
+ if( ent->spawnflags & 4 )
return; // crushers don't reverse
- }
// reverse direction
Use_BinaryMover( ent, ent, other );
@@ -730,27 +775,36 @@ void Blocked_Door( gentity_t *ent, gentity_t *other ) {
Touch_DoorTriggerSpectator
================
*/
-static void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_t *trace ) {
- int i, axis;
- vec3_t origin, dir, angles;
+static void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_t *trace )
+{
+ int i, axis;
+ vec3_t origin, dir, angles;
axis = ent->count;
- VectorClear(dir);
- if (fabs(other->s.origin[axis] - ent->r.absmax[axis]) <
- fabs(other->s.origin[axis] - ent->r.absmin[axis])) {
- origin[axis] = ent->r.absmin[axis] - 10;
- dir[axis] = -1;
- }
- else {
- origin[axis] = ent->r.absmax[axis] + 10;
- dir[axis] = 1;
- }
- for (i = 0; i < 3; i++) {
- if (i == axis) continue;
- origin[i] = (ent->r.absmin[i] + ent->r.absmax[i]) * 0.5;
+ VectorClear( dir );
+
+ if( fabs( other->s.origin[ axis ] - ent->r.absmax[ axis ] ) <
+ fabs( other->s.origin[ axis ] - ent->r.absmin[ axis ] ) )
+ {
+ origin[ axis ] = ent->r.absmin[ axis ] - 10;
+ dir[ axis ] = -1;
+ }
+ else
+ {
+ origin[ axis ] = ent->r.absmax[ axis ] + 10;
+ dir[ axis ] = 1;
+ }
+
+ for( i = 0; i < 3; i++ )
+ {
+ if( i == axis )
+ continue;
+
+ origin[ i ] = ( ent->r.absmin[ i ] + ent->r.absmax[ i ] ) * 0.5;
}
- vectoangles(dir, angles);
- TeleportPlayer(other, origin, angles );
+
+ vectoangles( dir, angles );
+ TeleportPlayer( other, origin, angles );
}
/*
@@ -758,17 +812,17 @@ static void Touch_DoorTriggerSpectator( gentity_t *ent, gentity_t *other, trace_
Touch_DoorTrigger
================
*/
-void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace ) {
- if ( other->client && other->client->sess.sessionTeam == TEAM_SPECTATOR ) {
+void Touch_DoorTrigger( gentity_t *ent, gentity_t *other, trace_t *trace )
+{
+ if( other->client && other->client->sess.sessionTeam == TEAM_SPECTATOR )
+ {
// if the door is not open and not opening
- if ( ent->parent->moverState != MOVER_1TO2 &&
- ent->parent->moverState != MOVER_POS2) {
+ if( ent->parent->moverState != MOVER_1TO2 &&
+ ent->parent->moverState != MOVER_POS2 )
Touch_DoorTriggerSpectator( ent, other, trace );
- }
}
- else if ( ent->parent->moverState != MOVER_1TO2 ) {
+ else if( ent->parent->moverState != MOVER_1TO2 )
Use_BinaryMover( ent->parent, ent, other );
- }
}
@@ -780,51 +834,54 @@ All of the parts of a door have been spawned, so create
a trigger that encloses all of them
======================
*/
-void Think_SpawnNewDoorTrigger( gentity_t *ent ) {
- gentity_t *other;
+void Think_SpawnNewDoorTrigger( gentity_t *ent )
+{
+ gentity_t *other;
vec3_t mins, maxs;
- int i, best;
+ int i, best;
// set all of the slaves as shootable
- for ( other = ent ; other ; other = other->teamchain ) {
+ for( other = ent; other; other = other->teamchain )
other->takedamage = qtrue;
- }
// find the bounds of everything on the team
- VectorCopy (ent->r.absmin, mins);
- VectorCopy (ent->r.absmax, maxs);
+ VectorCopy( ent->r.absmin, mins );
+ VectorCopy( ent->r.absmax, maxs );
- for (other = ent->teamchain ; other ; other=other->teamchain) {
- AddPointToBounds (other->r.absmin, mins, maxs);
- AddPointToBounds (other->r.absmax, mins, maxs);
+ for( other = ent->teamchain; other; other=other->teamchain )
+ {
+ AddPointToBounds( other->r.absmin, mins, maxs );
+ AddPointToBounds( other->r.absmax, mins, maxs );
}
// find the thinnest axis, which will be the one we expand
best = 0;
- for ( i = 1 ; i < 3 ; i++ ) {
- if ( maxs[i] - mins[i] < maxs[best] - mins[best] ) {
+ for( i = 1; i < 3; i++ )
+ {
+ if( maxs[ i ] - mins[ i ] < maxs[ best ] - mins[ best ] )
best = i;
- }
}
- maxs[best] += 120;
- mins[best] -= 120;
+
+ maxs[ best ] += 120;
+ mins[ best ] -= 120;
// create a trigger with this size
- other = G_Spawn ();
+ other = G_Spawn( );
other->classname = "door_trigger";
- VectorCopy (mins, other->r.mins);
- VectorCopy (maxs, other->r.maxs);
+ VectorCopy( mins, other->r.mins );
+ VectorCopy( maxs, other->r.maxs );
other->parent = ent;
other->r.contents = CONTENTS_TRIGGER;
other->touch = Touch_DoorTrigger;
// remember the thinnest axis
other->count = best;
- trap_LinkEntity (other);
+ trap_LinkEntity( other );
MatchTeam( ent, ent->moverState, level.time );
}
-void Think_MatchTeam( gentity_t *ent ) {
+void Think_MatchTeam( gentity_t *ent )
+{
MatchTeam( ent, ent->moverState, level.time );
}
@@ -845,24 +902,26 @@ NOMONSTER monsters will not trigger this door
"light" constantLight radius
"health" if set, the door must be shot open
*/
-void SP_func_door (gentity_t *ent) {
+void SP_func_door( gentity_t *ent )
+{
vec3_t abs_movedir;
- float distance;
+ float distance;
vec3_t size;
- float lip;
+ float lip;
- ent->sound1to2 = ent->sound2to1 = G_SoundIndex("sound/movers/doors/dr1_strt.wav");
- ent->soundPos1 = ent->soundPos2 = G_SoundIndex("sound/movers/doors/dr1_end.wav");
+ ent->sound1to2 = ent->sound2to1 = G_SoundIndex( "sound/movers/doors/dr1_strt.wav" );
+ ent->soundPos1 = ent->soundPos2 = G_SoundIndex( "sound/movers/doors/dr1_end.wav" );
ent->blocked = Blocked_Door;
// default speed of 400
- if (!ent->speed)
+ if( !ent->speed )
ent->speed = 400;
// default wait of 2 seconds
- if (!ent->wait)
+ if( !ent->wait )
ent->wait = 2;
+
ent->wait *= 1000;
// default lip of 8 units
@@ -876,16 +935,17 @@ void SP_func_door (gentity_t *ent) {
// calculate second position
trap_SetBrushModel( ent, ent->model );
- G_SetMovedir (ent->s.angles, ent->movedir);
- abs_movedir[0] = fabs(ent->movedir[0]);
- abs_movedir[1] = fabs(ent->movedir[1]);
- abs_movedir[2] = fabs(ent->movedir[2]);
+ G_SetMovedir( ent->s.angles, ent->movedir );
+ abs_movedir[ 0 ] = fabs( ent->movedir[ 0 ] );
+ abs_movedir[ 1 ] = fabs( ent->movedir[ 1 ] );
+ abs_movedir[ 2 ] = fabs( ent->movedir[ 2 ] );
VectorSubtract( ent->r.maxs, ent->r.mins, size );
distance = DotProduct( abs_movedir, size ) - lip;
VectorMA( ent->pos1, distance, ent->movedir, ent->pos2 );
// if "start_open", reverse position 1 and 2
- if ( ent->spawnflags & 1 ) {
+ if( ent->spawnflags & 1 )
+ {
vec3_t temp;
VectorCopy( ent->pos2, temp );
@@ -897,22 +957,22 @@ void SP_func_door (gentity_t *ent) {
ent->nextthink = level.time + FRAMETIME;
- if ( ! (ent->flags & FL_TEAMSLAVE ) ) {
+ if( ! (ent->flags & FL_TEAMSLAVE ) )
+ {
int health;
G_SpawnInt( "health", "0", &health );
- if ( health ) {
+ if( health )
ent->takedamage = qtrue;
- }
- if ( ent->targetname || health ) {
+
+ if( ent->targetname || health )
+ {
// non touch/shoot doors
ent->think = Think_MatchTeam;
- } else {
- ent->think = Think_SpawnNewDoorTrigger;
}
+ else
+ ent->think = Think_SpawnNewDoorTrigger;
}
-
-
}
/*
@@ -930,15 +990,14 @@ Touch_Plat
Don't allow decent if a living player is on it
===============
*/
-void Touch_Plat( gentity_t *ent, gentity_t *other, trace_t *trace ) {
- if ( !other->client || other->client->ps.stats[STAT_HEALTH] <= 0 ) {
+void Touch_Plat( gentity_t *ent, gentity_t *other, trace_t *trace )
+{
+ if( !other->client || other->client->ps.stats[ STAT_HEALTH ] <= 0 )
return;
- }
// delay return-to-pos1 by one second
- if ( ent->moverState == MOVER_POS2 ) {
+ if( ent->moverState == MOVER_POS2 )
ent->nextthink = level.time + 1000;
- }
}
/*
@@ -948,14 +1007,13 @@ Touch_PlatCenterTrigger
If the plat is at the bottom position, start it going up
===============
*/
-void Touch_PlatCenterTrigger(gentity_t *ent, gentity_t *other, trace_t *trace ) {
- if ( !other->client ) {
+void Touch_PlatCenterTrigger( gentity_t *ent, gentity_t *other, trace_t *trace )
+{
+ if( !other->client )
return;
- }
- if ( ent->parent->moverState == MOVER_POS1 ) {
+ if( ent->parent->moverState == MOVER_POS1 )
Use_BinaryMover( ent->parent, ent, other );
- }
}
@@ -968,39 +1026,43 @@ Elevator cars require that the trigger extend through the entire low position,
not just sit on top of it.
================
*/
-void SpawnPlatTrigger( gentity_t *ent ) {
+void SpawnPlatTrigger( gentity_t *ent )
+{
gentity_t *trigger;
- vec3_t tmin, tmax;
+ vec3_t tmin, tmax;
// the middle trigger will be a thin trigger just
// above the starting position
- trigger = G_Spawn();
+ trigger = G_Spawn( );
trigger->classname = "plat_trigger";
trigger->touch = Touch_PlatCenterTrigger;
trigger->r.contents = CONTENTS_TRIGGER;
trigger->parent = ent;
- tmin[0] = ent->pos1[0] + ent->r.mins[0] + 33;
- tmin[1] = ent->pos1[1] + ent->r.mins[1] + 33;
- tmin[2] = ent->pos1[2] + ent->r.mins[2];
+ tmin[ 0 ] = ent->pos1[ 0 ] + ent->r.mins[ 0 ] + 33;
+ tmin[ 1 ] = ent->pos1[ 1 ] + ent->r.mins[ 1 ] + 33;
+ tmin[ 2 ] = ent->pos1[ 2 ] + ent->r.mins[ 2 ];
- tmax[0] = ent->pos1[0] + ent->r.maxs[0] - 33;
- tmax[1] = ent->pos1[1] + ent->r.maxs[1] - 33;
- tmax[2] = ent->pos1[2] + ent->r.maxs[2] + 8;
+ tmax[ 0 ] = ent->pos1[ 0 ] + ent->r.maxs[ 0 ] - 33;
+ tmax[ 1 ] = ent->pos1[ 1 ] + ent->r.maxs[ 1 ] - 33;
+ tmax[ 2 ] = ent->pos1[ 2 ] + ent->r.maxs[ 2 ] + 8;
- if ( tmax[0] <= tmin[0] ) {
- tmin[0] = ent->pos1[0] + (ent->r.mins[0] + ent->r.maxs[0]) *0.5;
- tmax[0] = tmin[0] + 1;
+ if( tmax[ 0 ] <= tmin[ 0 ] )
+ {
+ tmin[ 0 ] = ent->pos1[ 0 ] + ( ent->r.mins[ 0 ] + ent->r.maxs[ 0 ] ) * 0.5;
+ tmax[ 0 ] = tmin[ 0 ] + 1;
}
- if ( tmax[1] <= tmin[1] ) {
- tmin[1] = ent->pos1[1] + (ent->r.mins[1] + ent->r.maxs[1]) *0.5;
- tmax[1] = tmin[1] + 1;
+
+ if( tmax[ 1 ] <= tmin[ 1 ] )
+ {
+ tmin[ 1 ] = ent->pos1[ 1 ] + ( ent->r.mins[ 1 ] + ent->r.maxs[ 1 ] ) * 0.5;
+ tmax[ 1 ] = tmin[ 1 ] + 1;
}
- VectorCopy (tmin, trigger->r.mins);
- VectorCopy (tmax, trigger->r.maxs);
+ VectorCopy( tmin, trigger->r.mins );
+ VectorCopy( tmax, trigger->r.maxs );
- trap_LinkEntity (trigger);
+ trap_LinkEntity( trigger );
}
@@ -1015,13 +1077,14 @@ Plats are always drawn in the extended position so they will light correctly.
"color" constantLight color
"light" constantLight radius
*/
-void SP_func_plat (gentity_t *ent) {
- float lip, height;
+void SP_func_plat( gentity_t *ent )
+{
+ float lip, height;
- ent->sound1to2 = ent->sound2to1 = G_SoundIndex("sound/movers/plats/pt1_strt.wav");
- ent->soundPos1 = ent->soundPos2 = G_SoundIndex("sound/movers/plats/pt1_end.wav");
+ ent->sound1to2 = ent->sound2to1 = G_SoundIndex( "sound/movers/plats/pt1_strt.wav" );
+ ent->soundPos1 = ent->soundPos2 = G_SoundIndex( "sound/movers/plats/pt1_end.wav" );
- VectorClear (ent->s.angles);
+ VectorClear( ent->s.angles );
G_SpawnFloat( "speed", "200", &ent->speed );
G_SpawnInt( "dmg", "2", &ent->damage );
@@ -1033,14 +1096,13 @@ void SP_func_plat (gentity_t *ent) {
// create second position
trap_SetBrushModel( ent, ent->model );
- if ( !G_SpawnFloat( "height", "0", &height ) ) {
- height = (ent->r.maxs[2] - ent->r.mins[2]) - lip;
- }
+ if( !G_SpawnFloat( "height", "0", &height ) )
+ height = ( ent->r.maxs[ 2 ] - ent->r.mins[ 2 ] ) - lip;
// pos1 is the rest (bottom) position, pos2 is the top
VectorCopy( ent->s.origin, ent->pos2 );
VectorCopy( ent->pos2, ent->pos1 );
- ent->pos1[2] -= height;
+ ent->pos1[ 2 ] -= height;
InitMover( ent );
@@ -1053,9 +1115,8 @@ void SP_func_plat (gentity_t *ent) {
ent->parent = ent; // so it can be treated as a door
// spawn the trigger if one hasn't been custom made
- if ( !ent->targetname ) {
- SpawnPlatTrigger(ent);
- }
+ if( !ent->targetname )
+ SpawnPlatTrigger( ent );
}
@@ -1073,14 +1134,13 @@ Touch_Button
===============
*/
-void Touch_Button(gentity_t *ent, gentity_t *other, trace_t *trace ) {
- if ( !other->client ) {
+void Touch_Button( gentity_t *ent, gentity_t *other, trace_t *trace )
+{
+ if( !other->client )
return;
- }
- if ( ent->moverState == MOVER_POS1 ) {
+ if( ent->moverState == MOVER_POS1 )
Use_BinaryMover( ent, other, other );
- }
}
@@ -1097,21 +1157,21 @@ When a button is touched, it moves some distance in the direction of it's angle,
"color" constantLight color
"light" constantLight radius
*/
-void SP_func_button( gentity_t *ent ) {
- vec3_t abs_movedir;
+void SP_func_button( gentity_t *ent )
+{
+ vec3_t abs_movedir;
float distance;
- vec3_t size;
+ vec3_t size;
float lip;
- ent->sound1to2 = G_SoundIndex("sound/movers/switches/butn2.wav");
+ ent->sound1to2 = G_SoundIndex( "sound/movers/switches/butn2.wav" );
- if ( !ent->speed ) {
+ if( !ent->speed )
ent->speed = 40;
- }
- if ( !ent->wait ) {
+ if( !ent->wait )
ent->wait = 1;
- }
+
ent->wait *= 1000;
// first position
@@ -1123,17 +1183,20 @@ void SP_func_button( gentity_t *ent ) {
G_SpawnFloat( "lip", "4", &lip );
G_SetMovedir( ent->s.angles, ent->movedir );
- abs_movedir[0] = fabs(ent->movedir[0]);
- abs_movedir[1] = fabs(ent->movedir[1]);
- abs_movedir[2] = fabs(ent->movedir[2]);
+ abs_movedir[ 0 ] = fabs( ent->movedir[ 0 ] );
+ abs_movedir[ 1 ] = fabs( ent->movedir[ 1 ] );
+ abs_movedir[ 2 ] = fabs( ent->movedir[ 2 ] );
VectorSubtract( ent->r.maxs, ent->r.mins, size );
- distance = abs_movedir[0] * size[0] + abs_movedir[1] * size[1] + abs_movedir[2] * size[2] - lip;
- VectorMA (ent->pos1, distance, ent->movedir, ent->pos2);
+ distance = abs_movedir[ 0 ] * size[ 0 ] + abs_movedir[ 1 ] * size[ 1 ] + abs_movedir[ 2 ] * size[ 2 ] - lip;
+ VectorMA( ent->pos1, distance, ent->movedir, ent->pos2 );
- if (ent->health) {
+ if( ent->health )
+ {
// shootable button
ent->takedamage = qtrue;
- } else {
+ }
+ else
+ {
// touchable button
ent->touch = Touch_Button;
}
@@ -1163,7 +1226,8 @@ Think_BeginMoving
The wait time at a corner has completed, so start moving again
===============
*/
-void Think_BeginMoving( gentity_t *ent ) {
+void Think_BeginMoving( gentity_t *ent )
+{
ent->s.pos.trTime = level.time;
ent->s.pos.trType = TR_LINEAR_STOP;
}
@@ -1173,17 +1237,17 @@ void Think_BeginMoving( gentity_t *ent ) {
Reached_Train
===============
*/
-void Reached_Train( gentity_t *ent ) {
- gentity_t *next;
+void Reached_Train( gentity_t *ent )
+{
+ gentity_t *next;
float speed;
- vec3_t move;
+ vec3_t move;
float length;
// copy the apropriate values
next = ent->nextTrain;
- if ( !next || !next->nextTrain ) {
+ if( !next || !next->nextTrain )
return; // just stop
- }
// fire all other targets
G_UseTargets( next, NULL );
@@ -1194,15 +1258,18 @@ void Reached_Train( gentity_t *ent ) {
VectorCopy( next->nextTrain->s.origin, ent->pos2 );
// if the path_corner has a speed, use that
- if ( next->speed ) {
+ if( next->speed )
+ {
speed = next->speed;
- } else {
+ }
+ else
+ {
// otherwise use the train's speed
speed = ent->speed;
}
- if ( speed < 1 ) {
+
+ if( speed < 1 )
speed = 1;
- }
// calculate duration
VectorSubtract( ent->pos2, ent->pos1, move );
@@ -1217,7 +1284,8 @@ void Reached_Train( gentity_t *ent ) {
SetMoverState( ent, MOVER_1TO2, level.time );
// if there is a "wait" value on the target, don't start moving yet
- if ( next->wait ) {
+ if( next->wait )
+ {
ent->nextthink = level.time + next->wait * 1000;
ent->think = Think_BeginMoving;
ent->s.pos.trType = TR_STATIONARY;
@@ -1232,25 +1300,29 @@ Think_SetupTrainTargets
Link all the corners together
===============
*/
-void Think_SetupTrainTargets( gentity_t *ent ) {
- gentity_t *path, *next, *start;
-
- ent->nextTrain = G_Find( NULL, FOFS(targetname), ent->target );
- if ( !ent->nextTrain ) {
+void Think_SetupTrainTargets( gentity_t *ent )
+{
+ gentity_t *path, *next, *start;
+
+ ent->nextTrain = G_Find( NULL, FOFS( targetname ), ent->target );
+
+ if( !ent->nextTrain )
+ {
G_Printf( "func_train at %s with an unfound target\n",
- vtos(ent->r.absmin) );
+ vtos( ent->r.absmin ) );
return;
}
start = NULL;
- for ( path = ent->nextTrain ; path != start ; path = next ) {
- if ( !start ) {
+ for( path = ent->nextTrain; path != start; path = next )
+ {
+ if( !start )
start = path;
- }
- if ( !path->target ) {
+ if( !path->target )
+ {
G_Printf( "Train corner at %s without a target\n",
- vtos(path->s.origin) );
+ vtos( path->s.origin ) );
return;
}
@@ -1258,14 +1330,17 @@ void Think_SetupTrainTargets( gentity_t *ent ) {
// there may also be other targets that get fired when the corner
// is reached
next = NULL;
- do {
- next = G_Find( next, FOFS(targetname), path->target );
- if ( !next ) {
+ do
+ {
+ next = G_Find( next, FOFS( targetname ), path->target );
+
+ if( !next )
+ {
G_Printf( "Train corner at %s without a target path_corner\n",
- vtos(path->s.origin) );
+ vtos( path->s.origin ) );
return;
}
- } while ( strcmp( next->classname, "path_corner" ) );
+ } while( strcmp( next->classname, "path_corner" ) );
path->nextTrain = next;
}
@@ -1282,9 +1357,11 @@ Target: next path corner and other targets to fire
"speed" speed to move to the next corner
"wait" seconds to wait before behining move to next corner
*/
-void SP_path_corner( gentity_t *self ) {
- if ( !self->targetname ) {
- G_Printf ("path_corner with no targetname at %s\n", vtos(self->s.origin));
+void SP_path_corner( gentity_t *self )
+{
+ if( !self->targetname )
+ {
+ G_Printf( "path_corner with no targetname at %s\n", vtos( self->s.origin ) );
G_FreeEntity( self );
return;
}
@@ -1305,23 +1382,23 @@ The train spawns at the first target it is pointing at.
"color" constantLight color
"light" constantLight radius
*/
-void SP_func_train (gentity_t *self) {
- VectorClear (self->s.angles);
+void SP_func_train( gentity_t *self )
+{
+ VectorClear( self->s.angles );
- if (self->spawnflags & TRAIN_BLOCK_STOPS) {
+ if( self->spawnflags & TRAIN_BLOCK_STOPS )
+ {
self->damage = 0;
- } else {
- if (!self->damage) {
- self->damage = 2;
- }
}
+ else if( !self->damage )
+ self->damage = 2;
- if ( !self->speed ) {
+ if( !self->speed )
self->speed = 100;
- }
- if ( !self->target ) {
- G_Printf ("func_train without a target at %s\n", vtos(self->r.absmin));
+ if( !self->target )
+ {
+ G_Printf( "func_train without a target at %s\n", vtos( self->r.absmin ) );
G_FreeEntity( self );
return;
}
@@ -1352,7 +1429,8 @@ A bmodel that just sits there, doing nothing. Can be used for conditional walls
"color" constantLight color
"light" constantLight radius
*/
-void SP_func_static( gentity_t *ent ) {
+void SP_func_static( gentity_t *ent )
+{
trap_SetBrushModel( ent, ent->model );
InitMover( ent );
VectorCopy( ent->s.origin, ent->s.pos.trBase );
@@ -1380,24 +1458,23 @@ check either the X_AXIS or Y_AXIS box to change that.
"color" constantLight color
"light" constantLight radius
*/
-void SP_func_rotating (gentity_t *ent) {
- if ( !ent->speed ) {
+void SP_func_rotating( gentity_t *ent )
+{
+ if( !ent->speed )
ent->speed = 100;
- }
// set the axis of rotation
ent->s.apos.trType = TR_LINEAR;
- if ( ent->spawnflags & 4 ) {
- ent->s.apos.trDelta[2] = ent->speed;
- } else if ( ent->spawnflags & 8 ) {
- ent->s.apos.trDelta[0] = ent->speed;
- } else {
- ent->s.apos.trDelta[1] = ent->speed;
- }
- if (!ent->damage) {
+ if( ent->spawnflags & 4 )
+ ent->s.apos.trDelta[ 2 ] = ent->speed;
+ else if( ent->spawnflags & 8 )
+ ent->s.apos.trDelta[ 0 ] = ent->speed;
+ else
+ ent->s.apos.trDelta[ 1 ] = ent->speed;
+
+ if( !ent->damage )
ent->damage = 2;
- }
trap_SetBrushModel( ent, ent->model );
InitMover( ent );
@@ -1429,7 +1506,8 @@ Normally bobs on the Z axis
"color" constantLight color
"light" constantLight radius
*/
-void SP_func_bobbing (gentity_t *ent) {
+void SP_func_bobbing( gentity_t *ent )
+{
float height;
float phase;
@@ -1449,13 +1527,12 @@ void SP_func_bobbing (gentity_t *ent) {
ent->s.pos.trType = TR_SINE;
// set the axis of bobbing
- if ( ent->spawnflags & 1 ) {
- ent->s.pos.trDelta[0] = height;
- } else if ( ent->spawnflags & 2 ) {
- ent->s.pos.trDelta[1] = height;
- } else {
- ent->s.pos.trDelta[2] = height;
- }
+ if( ent->spawnflags & 1 )
+ ent->s.pos.trDelta[ 0 ] = height;
+ else if( ent->spawnflags & 2 )
+ ent->s.pos.trDelta[ 1 ] = height;
+ else
+ ent->s.pos.trDelta[ 2 ] = height;
}
/*
@@ -1478,11 +1555,12 @@ Pendulum frequency is a physical constant based on the length of the beam and gr
"color" constantLight color
"light" constantLight radius
*/
-void SP_func_pendulum(gentity_t *ent) {
- float freq;
- float length;
- float phase;
- float speed;
+void SP_func_pendulum( gentity_t *ent )
+{
+ float freq;
+ float length;
+ float phase;
+ float speed;
G_SpawnFloat( "speed", "30", &speed );
G_SpawnInt( "dmg", "2", &ent->damage );
@@ -1491,10 +1569,10 @@ void SP_func_pendulum(gentity_t *ent) {
trap_SetBrushModel( ent, ent->model );
// find pendulum length
- length = fabs( ent->r.mins[2] );
- if ( length < 8 ) {
+ length = fabs( ent->r.mins[ 2 ] );
+
+ if( length < 8 )
length = 8;
- }
freq = 1 / ( M_PI * 2 ) * sqrt( g_gravity.value / ( 3 * length ) );
@@ -1510,5 +1588,5 @@ void SP_func_pendulum(gentity_t *ent) {
ent->s.apos.trDuration = 1000 / freq;
ent->s.apos.trTime = ent->s.apos.trDuration * phase;
ent->s.apos.trType = TR_SINE;
- ent->s.apos.trDelta[2] = speed;
+ ent->s.apos.trDelta[ 2 ] = speed;
}