summaryrefslogtreecommitdiff
path: root/src/game/g_weapon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/g_weapon.c')
-rw-r--r--src/game/g_weapon.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index 1179ce3e..93e98e01 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -796,6 +796,110 @@ qboolean CheckGrabAttack( gentity_t *ent )
return qtrue;
}
+/*
+======================================================================
+
+CLAW AND POUNCE
+
+======================================================================
+*/
+
+/*
+===============
+Weapon_Claw_Fire
+===============
+*/
+void Weapon_Claw_Fire( gentity_t *ent )
+{
+ trace_t tr;
+ vec3_t end;
+ gentity_t *tent;
+ gentity_t *traceEnt;
+
+ // set aiming directions
+ AngleVectors (ent->client->ps.viewangles, forward, right, up);
+
+ CalcMuzzlePoint( ent, forward, right, up, muzzle );
+
+ VectorMA( muzzle, 32, forward, end );
+
+ trap_Trace( &tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT );
+ if ( tr.surfaceFlags & SURF_NOIMPACT )
+ return;
+
+ traceEnt = &g_entities[ tr.entityNum ];
+
+ // send blood impact
+ if ( traceEnt->takedamage && traceEnt->client )
+ {
+ tent = G_TempEntity( tr.endpos, EV_MISSILE_HIT );
+ tent->s.otherEntityNum = traceEnt->s.number;
+ tent->s.eventParm = DirToByte( tr.plane.normal );
+ tent->s.weapon = ent->s.weapon;
+ }
+
+ if ( traceEnt->takedamage )
+ G_Damage( traceEnt, ent, ent, forward, tr.endpos, 50, DAMAGE_NO_KNOCKBACK, MOD_VENOM );
+}
+
+/*
+===============
+CheckPounceAttack
+===============
+*/
+qboolean CheckPounceAttack( gentity_t *ent )
+{
+ trace_t tr;
+ vec3_t end;
+ gentity_t *tent;
+ gentity_t *traceEnt;
+ int damage;
+
+ if( !ent->client->allowedToPounce )
+ return qfalse;
+
+ if( ent->client->ps.groundEntityNum != ENTITYNUM_NONE )
+ return qfalse;
+
+ // set aiming directions
+ AngleVectors (ent->client->ps.viewangles, forward, right, up);
+
+ CalcMuzzlePoint( ent, forward, right, up, muzzle );
+
+ VectorMA (muzzle, 32, forward, end);
+
+ trap_Trace (&tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT);
+
+ //miss
+ if( tr.fraction >= 1.0 )
+ return qfalse;
+
+ if ( tr.surfaceFlags & SURF_NOIMPACT )
+ return qfalse;
+
+ traceEnt = &g_entities[ tr.entityNum ];
+
+ // send blood impact
+ if ( traceEnt->takedamage && traceEnt->client )
+ {
+ tent = G_TempEntity( tr.endpos, EV_MISSILE_HIT );
+ tent->s.otherEntityNum = traceEnt->s.number;
+ tent->s.eventParm = DirToByte( tr.plane.normal );
+ tent->s.weapon = ent->s.weapon;
+ }
+
+ if( !traceEnt->takedamage)
+ return qfalse;
+
+ damage = (int)( (float)ent->client->pouncePayload / ( MAX_POUNCE_SPEED / 100.0f ) );
+
+ G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage, DAMAGE_NO_KNOCKBACK, MOD_VENOM );
+
+ ent->client->allowedToPounce = qfalse;
+
+ return qtrue;
+}
+
//======================================================================
/*
@@ -915,6 +1019,9 @@ void FireWeapon2( gentity_t *ent )
case WP_GRABANDCSAW:
Weapon_Grab_Fire( ent );
break;
+ case WP_POUNCE:
+ //Weapon_Claw_Fire( ent );
+ break;
case WP_DBUILD:
Weapon_Abuild_Fire( ent );
break;
@@ -992,6 +1099,9 @@ void FireWeapon( gentity_t *ent )
case WP_GRABANDCSAW:
Weapon_CSaw_Fire( ent );
break;
+ case WP_POUNCE:
+ Weapon_Claw_Fire( ent );
+ break;
case WP_DBUILD:
Weapon_Abuild_Fire( ent );
break;