summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--models/weapons/mdriver/weapon.cfg13
-rw-r--r--scripts/weapons.particle6
-rw-r--r--src/cgame/cg_weapons.c29
-rw-r--r--src/game/g_weapon.c86
-rw-r--r--src/game/tremulous.h2
5 files changed, 63 insertions, 73 deletions
diff --git a/models/weapons/mdriver/weapon.cfg b/models/weapons/mdriver/weapon.cfg
new file mode 100644
index 00000000..2c74131f
--- /dev/null
+++ b/models/weapons/mdriver/weapon.cfg
@@ -0,0 +1,13 @@
+weaponModel models/weapons/mdriver/mdriver.md3
+icon icons/iconw_driver
+crosshair 24 gfx/2d/crosshair-mdriver_s
+
+primary
+{
+ flashDlightColor 0.0 1.0 0.0
+ flashSound 0 models/weapons/mdriver/flash0.wav
+
+ impactMark 6 gfx/marks/bullet_mrk
+ impactParticleSystem models/weapons/mdriver/impactPS
+ alwaysImpact
+}
diff --git a/scripts/weapons.particle b/scripts/weapons.particle
index c0b2ab24..e837c7b0 100644
--- a/scripts/weapons.particle
+++ b/scripts/weapons.particle
@@ -419,11 +419,7 @@ models/weapons/mdriver/impactPS
{
shader sync gfx/mdriver/green_particle
- normalDisplacement 1.0
-
- velocityType normal
-
- radius 0 6.0 12.0
+ radius 0 4.0 6.0
alpha 70 1.0 0.0
rotation 0 ~360 -
diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c
index d5c91aa8..d3c52e13 100644
--- a/src/cgame/cg_weapons.c
+++ b/src/cgame/cg_weapons.c
@@ -1623,18 +1623,33 @@ Draws the mass driver trail
==============
*/
+#define MDRIVER_MUZZLE_OFFSET 48.0f
+
void CG_MassDriverFire( entityState_t *es )
{
+ vec3_t front, frontToBack;
trailSystem_t *ts;
+ float length;
ts = CG_SpawnNewTrailSystem( cgs.media.massDriverTS );
- if( CG_IsTrailSystemValid( &ts ) )
- {
- CG_SetAttachmentPoint( &ts->frontAttachment, es->origin2 );
- CG_SetAttachmentPoint( &ts->backAttachment, es->pos.trBase );
- CG_AttachToPoint( &ts->frontAttachment );
- CG_AttachToPoint( &ts->backAttachment );
- }
+ if( !CG_IsTrailSystemValid( &ts ) )
+ return;
+
+ // trail front attaches to the player, needs to be pushed forward a bit
+ // so that it doesn't look like it shot out of the wrong location
+ VectorCopy( es->origin2, front );
+ VectorSubtract( es->pos.trBase, front, frontToBack );
+ length = VectorLength( frontToBack );
+ if( length - MDRIVER_MUZZLE_OFFSET < 0.0f )
+ return;
+ VectorScale( frontToBack, 1.0f / length, frontToBack );
+ VectorMA( front, MDRIVER_MUZZLE_OFFSET, frontToBack, front );
+ CG_SetAttachmentPoint( &ts->frontAttachment, front );
+ CG_AttachToPoint( &ts->frontAttachment );
+
+ // trail back attaches to the impact point
+ CG_SetAttachmentPoint( &ts->backAttachment, es->pos.trBase );
+ CG_AttachToPoint( &ts->backAttachment );
}
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index 22d4dd74..52624862 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -197,6 +197,7 @@ static void G_WideTrace( trace_t *tr, gentity_t *ent, float range,
/*
======================
SnapVectorTowards
+SnapVectorNormal
Round a vector to integers for more efficient network
transmission, but make sure that it rounds towards a given point
@@ -210,10 +211,23 @@ void SnapVectorTowards( vec3_t v, vec3_t to )
for( i = 0 ; i < 3 ; i++ )
{
- if( to[ i ] <= v[ i ] )
- v[ i ] = (int)v[ i ];
+ if( v[ i ] >= 0 )
+ v[ i ] = (int)( v[ i ] + ( to[ i ] <= v[ i ] ? 0 : 1 ) );
else
- v[ i ] = (int)v[ i ] + 1;
+ v[ i ] = (int)( v[ i ] + ( to[ i ] <= v[ i ] ? -1 : 0 ) );
+ }
+}
+
+void SnapVectorNormal( vec3_t v, vec3_t normal )
+{
+ int i;
+
+ for( i = 0 ; i < 3 ; i++ )
+ {
+ if( v[ i ] >= 0 )
+ v[ i ] = (int)( v[ i ] + ( normal[ i ] <= 0 ? 0 : 1 ) );
+ else
+ v[ i ] = (int)( v[ i ] + ( normal[ i ] <= 0 ? -1 : 0 ) );
}
}
@@ -437,14 +451,11 @@ MASS DRIVER
======================================================================
*/
-#ifdef MDRIVER_SHOOT_THROUGH
-#define MDRIVER_MAX_HITS 16
-
void massDriverFire( gentity_t *ent )
{
trace_t tr;
vec3_t hitPoints[ MDRIVER_MAX_HITS ], hitNormals[ MDRIVER_MAX_HITS ],
- origin, originToEnd, muzzleToOrigin, end;
+ origin, originToEnd, muzzleToEnd, muzzleToOrigin, end;
gentity_t *traceEnts[ MDRIVER_MAX_HITS ], *traceEnt, *tent;
float length_offset;
int i, hits = 0, skipent;
@@ -480,17 +491,15 @@ void massDriverFire( gentity_t *ent )
// save the hit entity, position, and normal
VectorCopy( tr.endpos, hitPoints[ hits ] );
VectorCopy( tr.plane.normal, hitNormals[ hits ] );
- SnapVectorTowards( hitPoints[ hits ], muzzle );
+ SnapVectorNormal( hitPoints[ hits ], tr.plane.normal );
traceEnts[ hits++ ] = traceEnt;
}
- if( !hits )
- return;
// originate trail line from the gun tip, not the head!
VectorCopy( muzzle, origin );
- VectorMA( origin, -8, up, origin );
- VectorMA( origin, 6, right, origin );
- VectorMA( origin, 48, forward, origin );
+ VectorMA( origin, -6, up, origin );
+ VectorMA( origin, 4, right, origin );
+ VectorMA( origin, 24, forward, origin );
// save the final position
VectorCopy( tr.endpos, end );
@@ -499,7 +508,9 @@ void massDriverFire( gentity_t *ent )
// origin is further in front than muzzle, need to adjust length
VectorSubtract( origin, muzzle, muzzleToOrigin );
- length_offset = VectorLength( muzzleToOrigin );
+ VectorSubtract( end, muzzle, muzzleToEnd );
+ VectorNormalize( muzzleToEnd );
+ length_offset = DotProduct( muzzleToEnd, muzzleToOrigin );
// now that the trace is finished, we know where we stopped and can generate
// visually correct impact locations
@@ -535,7 +546,7 @@ void massDriverFire( gentity_t *ent )
}
// create an event entity for the trail, doubles as an impact event
- SnapVectorTowards( end, muzzle );
+ SnapVectorNormal( end, tr.plane.normal );
tent = G_TempEntity( end, EV_MASS_DRIVER );
tent->s.eventParm = DirToByte( tr.plane.normal );
tent->s.weapon = ent->s.weapon;
@@ -545,51 +556,6 @@ void massDriverFire( gentity_t *ent )
G_UnlaggedOff( );
}
-#else
-
-void massDriverFire( gentity_t *ent )
-{
- trace_t tr;
- vec3_t end;
- gentity_t *tent;
- gentity_t *traceEnt;
-
- VectorMA( muzzle, 8192 * 16, forward, end );
-
- G_UnlaggedOn( muzzle, 8192 * 16 );
- trap_Trace( &tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT );
- G_UnlaggedOff( );
-
- if( tr.surfaceFlags & SURF_NOIMPACT )
- return;
-
- traceEnt = &g_entities[ tr.entityNum ];
-
- // snap the endpos to integers, but nudged towards the line
- SnapVectorTowards( tr.endpos, muzzle );
-
- // send impact
- if( traceEnt->takedamage && traceEnt->client )
- {
- BloodSpurt( ent, traceEnt, &tr );
- }
- else
- {
- tent = G_TempEntity( tr.endpos, EV_MISSILE_MISS );
- tent->s.eventParm = DirToByte( tr.plane.normal );
- tent->s.weapon = ent->s.weapon;
- tent->s.generic1 = ent->s.generic1; //weaponMode
- }
-
- if( traceEnt->takedamage )
- {
- G_Damage( traceEnt, ent, ent, forward, tr.endpos,
- MDRIVER_DMG, 0, MOD_MDRIVER );
- }
-}
-
-#endif
-
/*
======================================================================
diff --git a/src/game/tremulous.h b/src/game/tremulous.h
index ae56f4a4..55761533 100644
--- a/src/game/tremulous.h
+++ b/src/game/tremulous.h
@@ -422,7 +422,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define MDRIVER_REPEAT 1000
#define MDRIVER_K_SCALE 1.0f
#define MDRIVER_RELOAD 2000
-#define MDRIVER_SHOOT_THROUGH // uncomment to enable MD shooting through entities
+#define MDRIVER_MAX_HITS 16
#define CHAINGUN_PRICE 400
#define CHAINGUN_BULLETS 300