From 749407ffc26c647c1faf675734559ab9fd8774fe Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Sat, 1 Dec 2001 14:03:50 +0000 Subject: Tag based turrets --- src/cgame/cg_buildable.c | 65 +++++++++++++++++++++++++++++++++++++----------- src/game/g_buildable.c | 30 +++++++++++++--------- 2 files changed, 68 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c index a91725fa..de0b1061 100644 --- a/src/cgame/cg_buildable.c +++ b/src/cgame/cg_buildable.c @@ -382,7 +382,6 @@ CG_Buildable void CG_Buildable( centity_t *cent ) { refEntity_t ent; - refEntity_t ent2; entityState_t *es; vec3_t angles; vec3_t forward, surfNormal, end, start, mins, maxs; @@ -442,29 +441,65 @@ void CG_Buildable( centity_t *cent ) CG_BuildableAnimation( cent, &ent.oldframe, &ent.frame, &ent.backlerp ); //turret barrel bit - if( cg_buildables[ es->modelindex ].models[ 1 ] != 0 ) + if( cg_buildables[ es->modelindex ].models[ 1 ] ) { - vec3_t turretOrigin; + refEntity_t turretBarrel; - memset( &ent2, 0, sizeof( ent2 ) ); + memset( &turretBarrel, 0, sizeof( turretBarrel ) ); - AnglesToAxis( es->angles2, ent2.axis ); + AnglesToAxis( es->angles2, turretBarrel.axis ); + + turretBarrel.hModel = cg_buildables[ es->modelindex ].models[ 1 ]; + VectorCopy( cent->lerpOrigin, turretBarrel.lightingOrigin ); + + CG_PositionRotatedEntityOnTag( &turretBarrel, &ent, ent.hModel, "tag_turret" ); + +/* AngleVectors( es->angles2, forward, NULL, NULL ); + VectorCopy( surfNormal, turretBarrel.axis[ 2 ] ); + ProjectPointOnPlane( turretBarrel.axis[ 0 ], forward, turretBarrel.axis[ 2 ] ); + + if( !VectorNormalize( turretBarrel.axis[ 0 ] ) ) + { + AngleVectors( es->angles2, NULL, NULL, forward ); + ProjectPointOnPlane( turretBarrel.axis[ 0 ], forward, turretBarrel.axis[ 2 ] ); + VectorNormalize( turretBarrel.axis[ 0 ] ); + } + + CrossProduct( turretBarrel.axis[ 0 ], turretBarrel.axis[ 2 ], turretBarrel.axis[ 1 ] ); + turretBarrel.axis[ 1 ][ 0 ] = -turretBarrel.axis[ 1 ][ 0 ]; + turretBarrel.axis[ 1 ][ 1 ] = -turretBarrel.axis[ 1 ][ 1 ]; + turretBarrel.axis[ 1 ][ 2 ] = -turretBarrel.axis[ 1 ][ 2 ];*/ + + turretBarrel.oldframe = ent.oldframe; + turretBarrel.frame = ent.frame; + turretBarrel.backlerp = ent.backlerp; - ent2.hModel = cg_buildables[ es->modelindex ].models[ 1 ]; + trap_R_AddRefEntityToScene( &turretBarrel ); + } - VectorCopy( cent->lerpOrigin, turretOrigin ); - turretOrigin[ 2 ] += 5; + //turret barrel bit + if( cg_buildables[ es->modelindex ].models[ 2 ] ) + { + refEntity_t turretBarrel; + vec3_t swivelAngles; - VectorCopy( turretOrigin, ent2.origin ); - VectorCopy( turretOrigin, ent2.oldorigin ); + memset( &turretBarrel, 0, sizeof( turretBarrel ) ); + + VectorCopy( es->angles2, swivelAngles ); + swivelAngles[ PITCH ] = 0.0f; + + AnglesToAxis( swivelAngles, turretBarrel.axis ); + + turretBarrel.hModel = cg_buildables[ es->modelindex ].models[ 1 ]; + VectorCopy( cent->lerpOrigin, turretBarrel.lightingOrigin ); - ent2.nonNormalizedAxes = qfalse; + CG_PositionRotatedEntityOnTag( &turretBarrel, &ent, ent.hModel, "tag_turret" ); - ent2.oldframe = ent.oldframe; - ent2.frame = ent.frame; - ent2.backlerp = ent.backlerp; + turretBarrel.oldframe = ent.oldframe; + turretBarrel.frame = ent.frame; + turretBarrel.backlerp = ent.backlerp; - trap_R_AddRefEntityToScene( &ent2 ); + trap_R_AddRefEntityToScene( &turretBarrel ); } // add to refresh list diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c index 300f2ad7..41b6d4f9 100644 --- a/src/game/g_buildable.c +++ b/src/game/g_buildable.c @@ -1074,7 +1074,7 @@ Used by HDef1_Think to track enemy location */ qboolean hdef1_trackenemy( gentity_t *self ) { - vec3_t dirToTarget, angleToTarget, angularDiff, xNormal; + vec3_t dirToTarget, dttAdjusted, angleToTarget, angularDiff, xNormal; vec3_t refNormal = { 0.0f, 0.0f, 1.0f }; float temp, rotAngle; float distanceToTarget = BG_FindRangeForBuildable( self->s.modelindex ); @@ -1119,15 +1119,13 @@ qboolean hdef1_trackenemy( gentity_t *self ) CrossProduct( self->s.origin2, refNormal, xNormal ); VectorNormalize( xNormal ); rotAngle = RAD2DEG( acos( DotProduct( self->s.origin2, refNormal ) ) ); - RotatePointAroundVector( dirToTarget, xNormal, dirToTarget, -rotAngle ); + RotatePointAroundVector( dttAdjusted, xNormal, dirToTarget, rotAngle ); - vectoangles( dirToTarget, angleToTarget ); + vectoangles( dttAdjusted, angleToTarget ); angularDiff[ PITCH ] = AngleSubtract( self->s.angles2[ PITCH ], angleToTarget[ PITCH ] ); angularDiff[ YAW ] = AngleSubtract( self->s.angles2[ YAW ], angleToTarget[ YAW ] ); - G_Printf( "%f\n", angularDiff[ PITCH ] ); - //if not pointing at our target then move accordingly if( angularDiff[ PITCH ] < -HDEF1_ACCURACYTOLERANCE ) self->s.angles2[ PITCH ] += HDEF1_ANGULARSPEED; @@ -1154,9 +1152,9 @@ qboolean hdef1_trackenemy( gentity_t *self ) else self->s.angles2[ YAW ] = angleToTarget[ YAW ]; - AngleVectors( self->s.angles2, dirToTarget, NULL, NULL ); - RotatePointAroundVector( self->turretAim, xNormal, dirToTarget, rotAngle ); - vectoangles( self->turretAim, self->turretAim ); + AngleVectors( self->s.angles2, dttAdjusted, NULL, NULL ); + RotatePointAroundVector( dirToTarget, xNormal, dttAdjusted, -rotAngle ); + vectoangles( dirToTarget, self->turretAim ); //if pointing at our target return true if( abs( angleToTarget[ YAW ] - self->s.angles2[ YAW ] ) <= HDEF1_ACCURACYTOLERANCE && @@ -1179,14 +1177,20 @@ Used by HDef1_Think to track enemy location */ qboolean hdef2_trackenemy( gentity_t *self ) { - vec3_t dirToTarget, angleToTarget, angularDiff; - float temp; + vec3_t dirToTarget, dttAdjusted, angleToTarget, angularDiff, xNormal; + vec3_t refNormal = { 0.0f, 0.0f, 1.0f }; + float temp, rotAngle; VectorSubtract( self->enemy->s.pos.trBase, self->s.pos.trBase, dirToTarget ); VectorNormalize( dirToTarget ); - vectoangles( dirToTarget, angleToTarget ); + CrossProduct( self->s.origin2, refNormal, xNormal ); + VectorNormalize( xNormal ); + rotAngle = RAD2DEG( acos( DotProduct( self->s.origin2, refNormal ) ) ); + RotatePointAroundVector( dttAdjusted, xNormal, dirToTarget, rotAngle ); + + vectoangles( dttAdjusted, angleToTarget ); angularDiff[ PITCH ] = AngleSubtract( self->s.angles2[ PITCH ], angleToTarget[ PITCH ] ); angularDiff[ YAW ] = AngleSubtract( self->s.angles2[ YAW ], angleToTarget[ YAW ] ); @@ -1215,7 +1219,9 @@ qboolean hdef2_trackenemy( gentity_t *self ) else self->s.angles2[ YAW ] = angleToTarget[ YAW ]; - VectorCopy( self->s.angles2, self->turretAim ); + AngleVectors( self->s.angles2, dttAdjusted, NULL, NULL ); + RotatePointAroundVector( dirToTarget, xNormal, dttAdjusted, -rotAngle ); + vectoangles( dirToTarget, self->turretAim ); //if pointing at our target return true if( abs( angleToTarget[ YAW ] - self->s.angles2[ YAW ] ) <= HDEF2_ACCURACYTOLERANCE && -- cgit