diff options
Diffstat (limited to 'src/game/g_weapon.c')
-rw-r--r-- | src/game/g_weapon.c | 110 |
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; |