//----------------------------------------------------------------------------- // Purpose: Fire a flare //----------------------------------------------------------------------------- CBaseEntity *CTFWeaponBaseGun::FireFlare(CTFPlayer *pPlayer) { PlayWeaponShootSound(); #ifdef GAME_DLL Vector vecSrc; QAngle angForward; Vector vecOffset( 23.5f, 12.0f, -3.0f ); if ( pPlayer->GetFlags() & FL_DUCKING ) { vecOffset.z = 8.0f; } GetProjectileFireSetup( pPlayer, vecOffset, &vecSrc, &angForward, false ); CTFProjectile_Flare *pProjectile = CTFProjectile_Flare::Create( vecSrc, angForward, pPlayer, pPlayer ); if ( pProjectile ) { pProjectile->SetCritical( IsCurrentAttackACrit() ); pProjectile->SetDamage( GetProjectileDamage() ); } return pProjectile; #endif return NULL; }
//----------------------------------------------------------------------------- // Purpose: Fire a pipe bomb //----------------------------------------------------------------------------- CBaseEntity *CTFWeaponBaseGun::FirePipeBomb( CTFPlayer *pPlayer, bool bRemoteDetonate ) { PlayWeaponShootSound(); #ifdef GAME_DLL Vector vecForward, vecRight, vecUp; AngleVectors( pPlayer->EyeAngles(), &vecForward, &vecRight, &vecUp ); // Create grenades here!! Vector vecSrc = pPlayer->Weapon_ShootPosition(); vecSrc += vecForward * 16.0f + vecRight * 8.0f + vecUp * -6.0f; Vector vecVelocity = ( vecForward * GetProjectileSpeed() ) + ( vecUp * 200.0f ) + ( random->RandomFloat( -10.0f, 10.0f ) * vecRight ) + ( random->RandomFloat( -10.0f, 10.0f ) * vecUp ); CTFGrenadePipebombProjectile *pProjectile = CTFGrenadePipebombProjectile::Create( vecSrc, pPlayer->EyeAngles(), vecVelocity, AngularImpulse( 600, random->RandomInt( -1200, 1200 ), 0 ), pPlayer, GetTFWpnData(), bRemoteDetonate ); if ( pProjectile ) { pProjectile->SetCritical( IsCurrentAttackACrit() ); } return pProjectile; #endif return NULL; }
//----------------------------------------------------------------------------- // Purpose: Fire a flare //----------------------------------------------------------------------------- CBaseEntity *CTFWeaponBaseGun::FireArrow( CTFPlayer *pPlayer, int iType ) { PlayWeaponShootSound(); #ifdef GAME_DLL Vector vecSrc; QAngle angForward; Vector vecOffset( 23.5f, 12.0f, -3.0f ); if ( pPlayer->GetFlags() & FL_DUCKING ) { vecOffset.z = 8.0f; } if ( IsWeapon( TF_WEAPON_COMPOUND_BOW ) ) { // Valve were apparently too lazy to fix the viewmodel and just flipped it through the code. vecOffset.y *= -1.0f; } GetProjectileFireSetup( pPlayer, vecOffset, &vecSrc, &angForward, false, true ); CTFProjectile_Arrow *pProjectile = CTFProjectile_Arrow::Create( this, vecSrc, angForward, GetProjectileSpeed(), GetProjectileGravity(), pPlayer, pPlayer, iType ); if ( pProjectile ) { pProjectile->SetCritical( IsCurrentAttackACrit() ); pProjectile->SetDamage( GetProjectileDamage() ); } return pProjectile; #endif return NULL; }
//----------------------------------------------------------------------------- // Purpose: Use this for any grenades: pipes, stickies, MIRV... //----------------------------------------------------------------------------- CBaseEntity *CTFWeaponBaseGun::FireGrenade( CTFPlayer *pPlayer, int iType ) { PlayWeaponShootSound(); #ifdef GAME_DLL Vector vecForward, vecRight, vecUp; AngleVectors( pPlayer->EyeAngles(), &vecForward, &vecRight, &vecUp ); // Create grenades here!! Vector vecSrc = pPlayer->Weapon_ShootPosition(); vecSrc += vecForward * 16.0f + vecRight * 8.0f + vecUp * -6.0f; Vector vecVelocity = ( vecForward * GetProjectileSpeed() ) + ( vecUp * 200.0f ) + ( random->RandomFloat( -10.0f, 10.0f ) * vecRight ) + ( random->RandomFloat( -10.0f, 10.0f ) * vecUp ); CTFWeaponBaseGrenadeProj *pProjectile = NULL; switch( iType ) { case TF_PROJECTILE_PIPEBOMB_REMOTE: case TF_PROJECTILE_PIPEBOMB_REMOTE_PRACTICE: pProjectile = CTFGrenadeStickybombProjectile::Create( vecSrc, pPlayer->EyeAngles(), vecVelocity, AngularImpulse( 600, random->RandomInt( -1200, 1200 ), 0 ), pPlayer, this ); break; case TF_PROJECTILE_PIPEBOMB: pProjectile = CTFGrenadePipebombProjectile::Create( vecSrc, pPlayer->EyeAngles(), vecVelocity, AngularImpulse( 600, random->RandomInt( -1200, 1200 ), 0 ), pPlayer, this ); break; case TF_PROJECTILE_MIRV: pProjectile = CTFGrenadeMirvProjectile::Create( vecSrc, pPlayer->EyeAngles(), vecVelocity, AngularImpulse( 600, random->RandomInt( -1200, 1200 ), 0 ), pPlayer, this ); break; } if ( pProjectile ) { pProjectile->SetCritical( IsCurrentAttackACrit() ); } return pProjectile; #endif return NULL; }
//----------------------------------------------------------------------------- // Purpose: Fire a bullet! //----------------------------------------------------------------------------- void CTFWeaponBaseGun::FireBullet( CTFPlayer *pPlayer ) { PlayWeaponShootSound(); FX_FireBullets( pPlayer->entindex(), pPlayer->Weapon_ShootPosition(), pPlayer->EyeAngles() + pPlayer->GetPunchAngle(), GetWeaponID(), m_iWeaponMode, CBaseEntity::GetPredictionRandomSeed() & 255, GetWeaponSpread(), GetProjectileDamage(), IsCurrentAttackACrit() ); }
//----------------------------------------------------------------------------- // Purpose: Fire a projectile nail //----------------------------------------------------------------------------- CBaseEntity *CTFWeaponBaseGun::FireNail( CTFPlayer *pPlayer, int iSpecificNail ) { PlayWeaponShootSound(); Vector vecSrc; QAngle angForward; GetProjectileFireSetup( pPlayer, Vector(16,6,-8), &vecSrc, &angForward ); // Add some spread (no spread on tranq. gun) if ( iSpecificNail != TF_PROJECTILE_DART ) { float flSpread = 1.5; angForward.x += RandomFloat(-flSpread, flSpread); angForward.y += RandomFloat(-flSpread, flSpread); } CTFBaseProjectile *pProjectile = NULL; switch( iSpecificNail ) { case TF_PROJECTILE_SYRINGE: pProjectile = CTFProjectile_Syringe::Create( vecSrc, angForward, pPlayer, pPlayer, IsCurrentAttackACrit() ); break; case TF_PROJECTILE_NAIL: pProjectile = CTFProjectile_Nail::Create(vecSrc, angForward, pPlayer, pPlayer, IsCurrentAttackACrit()); break; case TF_PROJECTILE_DART: pProjectile = CTFProjectile_Dart::Create(vecSrc, angForward, pPlayer, pPlayer, IsCurrentAttackACrit()); break; default: Assert(0); } if ( pProjectile ) { pProjectile->SetWeaponID( GetWeaponID() ); pProjectile->SetCritical( IsCurrentAttackACrit() ); #ifdef GAME_DLL pProjectile->SetDamage( GetProjectileDamage() ); #endif } return pProjectile; }