CBaseEntity *CTFWeaponBaseGun::FireProjectile( CTFPlayer *pPlayer ) { int iProjectile = m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iProjectile; CBaseEntity *pProjectile = NULL; switch( iProjectile ) { case TF_PROJECTILE_BULLET: FireBullet( pPlayer ); break; case TF_PROJECTILE_ROCKET: pProjectile = FireRocket( pPlayer ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_SYRINGE: pProjectile = FireNail( pPlayer, iProjectile ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_NAIL: pProjectile = FireNail(pPlayer, iProjectile); pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); break; case TF_PROJECTILE_DART: pProjectile = FireNail(pPlayer, iProjectile); pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); break; case TF_PROJECTILE_PIPEBOMB: pProjectile = FirePipeBomb( pPlayer, false ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_PIPEBOMB_REMOTE: pProjectile = FirePipeBomb( pPlayer, true ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_FLARE: pProjectile = FireFlare(pPlayer); pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); break; case TF_PROJECTILE_NONE: default: // do nothing! DevMsg( "Weapon does not have a projectile type set\n" ); break; } if ( m_iClip1 != -1 ) { m_iClip1 -= m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iAmmoPerShot; } else { if ( m_iWeaponMode == TF_WEAPON_PRIMARY_MODE ) { pPlayer->RemoveAmmo( m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iAmmoPerShot, m_iPrimaryAmmoType ); } else { pPlayer->RemoveAmmo( m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iAmmoPerShot, m_iSecondaryAmmoType ); } } DoFireEffects(); UpdatePunchAngles( pPlayer ); return pProjectile; }
CBaseEntity *CTFWeaponBaseGun::FireProjectile( CTFPlayer *pPlayer ) { int iProjectile = TF_PROJECTILE_NONE; CALL_ATTRIB_HOOK_INT( iProjectile, override_projectile_type ); if ( !iProjectile ) iProjectile = m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iProjectile; CBaseEntity *pProjectile = NULL; switch( iProjectile ) { case TF_PROJECTILE_BULLET: FireBullet( pPlayer ); break; case TF_PROJECTILE_ROCKET: pProjectile = FireRocket( pPlayer ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_SYRINGE: case TF_PROJECTILE_NAIL: pProjectile = FireNail( pPlayer, iProjectile ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_DART: pProjectile = FireNail(pPlayer, iProjectile); pPlayer->DoAnimationEvent(PLAYERANIMEVENT_ATTACK_PRIMARY); break; case TF_PROJECTILE_PIPEBOMB: case TF_PROJECTILE_CANNONBALL: pProjectile = FireGrenade( pPlayer, iProjectile ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_PIPEBOMB_REMOTE: case TF_PROJECTILE_PIPEBOMB_REMOTE_PRACTICE: pProjectile = FireGrenade( pPlayer, iProjectile ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_FLARE: pProjectile = FireFlare( pPlayer ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_MIRV: pProjectile = FireGrenade( pPlayer, iProjectile ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_JAR: case TF_PROJECTILE_JAR_MILK: case TF_PROJECTILE_CLEAVER: case TF_PROJECTILE_THROWABLE: case TF_PROJECTILE_FESTITIVE_URINE: case TF_PROJECTILE_BREADMONSTER_JARATE: case TF_PROJECTILE_BREADMONSTER_MADMILK: // TO-DO: Implement 'grenade' support break; case TF_PROJECTILE_ARROW: case TF_PROJECTILE_HEALING_BOLT: case TF_PROJECTILE_BUILDING_REPAIR_BOLT: case TF_PROJECTILE_FESTITIVE_ARROW: case TF_PROJECTILE_FESTITIVE_HEALING_BOLT: case TF_PROJECTILE_GRAPPLINGHOOK: pProjectile = FireArrow( pPlayer, iProjectile ); pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); break; case TF_PROJECTILE_NONE: default: // do nothing! DevMsg( "Weapon does not have a projectile type set\n" ); break; } if ( UsesClipsForAmmo1() ) { m_iClip1 -= m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iAmmoPerShot; } else { if ( m_iWeaponMode == TF_WEAPON_PRIMARY_MODE ) { pPlayer->RemoveAmmo( m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iAmmoPerShot, m_iPrimaryAmmoType ); } else { pPlayer->RemoveAmmo( m_pWeaponInfo->GetWeaponData( m_iWeaponMode ).m_iAmmoPerShot, m_iSecondaryAmmoType ); } } DoFireEffects(); UpdatePunchAngles( pPlayer ); return pProjectile; }