//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Recon's dual semi-auto pistols // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "tf_player.h" #include "tf_basecombatweapon.h" #include "in_buttons.h" #include "gamerules.h" #include "ammodef.h" #include "basegrenade_shared.h" ConVar weapon_pistols_damage( "weapon_pistols_damage","0", FCVAR_NONE, "Recon pistols maximum damage" ); ConVar weapon_pistols_range( "weapon_pistols_range","0", FCVAR_NONE, "Recon pistols maximum range" ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CWeaponPistols : public CTFMachineGun { DECLARE_CLASS( CWeaponPistols, CTFMachineGun ); public: virtual float GetFireRate( void ); virtual const Vector& GetBulletSpread( void ); virtual bool Deploy( void ); virtual void PrimaryAttack( void ); virtual void SecondaryAttack( void ); virtual void ItemPostFrame( void ); private: float m_flSoonestPrimaryAttack; float m_flLastPrimaryAttack; }; LINK_ENTITY_TO_CLASS( weapon_pistols, CWeaponPistols ); PRECACHE_WEAPON_REGISTER(weapon_pistols); //----------------------------------------------------------------------------- // Purpose: Get the accuracy derived from weapon and player, and return it //----------------------------------------------------------------------------- const Vector& CWeaponPistols::GetBulletSpread( void ) { static Vector cone; cone = VECTOR_CONE_10DEGREES; // Modify accuracy based upon firing rate // Maximum accuracy's used if you're firing at the standard rate of the gun float flModifier = MIN( GetFireRate(), gpGlobals->curtime - m_flLastPrimaryAttack ); flModifier = 1.0 - RemapVal( flModifier, 0, GetFireRate(), 0, 1.0 ); cone *= flModifier; return cone; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- float CWeaponPistols::GetFireRate( void ) { return 0.5; } //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- bool CWeaponPistols::Deploy( void ) { m_flSoonestPrimaryAttack = gpGlobals->curtime; m_flLastPrimaryAttack = gpGlobals->curtime; return BaseClass::Deploy(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponPistols::PrimaryAttack( void ) { m_flSoonestPrimaryAttack = gpGlobals->curtime + 0.1; BaseClass::PrimaryAttack(); m_flLastPrimaryAttack = gpGlobals->curtime; } //----------------------------------------------------------------------------- // Purpose: Throw out a sticky bomb //----------------------------------------------------------------------------- void CWeaponPistols::SecondaryAttack( void ) { /* FIXME: Temporarily disabled CBasePlayer *pPlayer = GetOwner(); if ( pPlayer == NULL ) return; // Calculate position & velocity Vector vecForward; pPlayer->EyeVectors( &vecForward ); Vector vecOrigin = pPlayer->EyePosition(); vecOrigin += (vecForward * 16); // Create the stickybomb CBaseGrenade *pGrenade = (CBaseGrenade*)CreateEntityByName("grenade_stickybomb"); UTIL_SetOrigin( pGrenade->pev, vecOrigin ); pGrenade->Spawn(); pGrenade->SetOwnerEntity( pPlayer ); pGrenade->m_hOwner = pPlayer; pGrenade->m_vecVelocity = vecForward * 1200; VectorAngles( vecForward, pGrenade->GetAngles() ); // Reduce ammo, setup for refire pPlayer->m_iAmmo[m_iSecondaryAmmoType]--; m_flNextSecondaryAttack = gpGlobals->curtime + 0.5; */ } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponPistols::ItemPostFrame( void ) { CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( pPlayer == NULL ) return; // Allow a refire as fast as the player can click if ( ( ( pPlayer->m_nButtons & IN_ATTACK ) == false ) && ( m_flSoonestPrimaryAttack < gpGlobals->curtime ) /* && ( m_flNextSecondaryAttack < gpGlobals->curtime )*/ ) { m_flNextPrimaryAttack = gpGlobals->curtime - 0.1f; } BaseClass::ItemPostFrame(); }