//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: TF Sniper Rifle // //=============================================================================// #ifndef TF_WEAPON_SNIPERRIFLE_H #define TF_WEAPON_SNIPERRIFLE_H #ifdef _WIN32 #pragma once #endif #include "tf_weaponbase_gun.h" #include "Sprite.h" #if defined( CLIENT_DLL ) #define CTFSniperRifle C_TFSniperRifle #define CTFSniperRifleDecap C_TFSniperRifleDecap #define CTFSniperRifleClassic C_TFSniperRifleClassic #define CTFSniperRifleRevolver C_TFSniperRifleRevolver #define CSniperDot C_SniperDot #endif enum RifleTypes_t { RIFLE_NORMAL = 0, RIFLE_JARATE, RIFLE_MACHINA, RIFLE_CLASSIC, }; //============================================================================= // // Sniper Rifle Laser Dot class. // class CSniperDot : public CBaseEntity { public: DECLARE_CLASS( CSniperDot, CBaseEntity ); DECLARE_NETWORKCLASS(); DECLARE_DATADESC(); // Creation/Destruction. CSniperDot( void ); ~CSniperDot( void ); static CSniperDot *Create( const Vector &origin, CBaseEntity *pOwner = NULL, bool bVisibleDot = true ); void ResetChargeTime( void ) { m_flChargeStartTime = gpGlobals->curtime; } // Attributes. int ObjectCaps() { return (BaseClass::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_DONT_SAVE; } // Targeting. void Update( CBaseEntity *pTarget, const Vector &vecOrigin, const Vector &vecNormal ); CBaseEntity *GetTargetEntity( void ) { return m_hTargetEnt; } Vector GetChasePosition(); // Client specific. #ifdef CLIENT_DLL bool GetRenderingPositions( C_TFPlayer *pPlayer, Vector &vecAttachment, Vector &vecEndPos, float &flSize ); // Rendering. virtual bool IsTransparent( void ) { return true; } virtual RenderGroup_t GetRenderGroup( void ) { return RENDER_GROUP_TRANSLUCENT_ENTITY; } virtual int DrawModel( int flags ); virtual bool ShouldDraw( void ); virtual void ClientThink( void ); virtual void OnDataChanged( DataUpdateType_t updateType ); CMaterialReference m_hSpriteMaterial; HPARTICLEFFECT m_laserBeamEffect; #endif protected: Vector m_vecSurfaceNormal; EHANDLE m_hTargetEnt; CNetworkVar( float, m_flChargeStartTime ); }; //============================================================================= // // Sniper Rifle class. // class CTFSniperRifle : public CTFWeaponBaseGun { public: DECLARE_CLASS( CTFSniperRifle, CTFWeaponBaseGun ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); DECLARE_DATADESC(); CTFSniperRifle(); virtual ~CTFSniperRifle(); virtual int GetWeaponID( void ) const { return TF_WEAPON_SNIPERRIFLE; } virtual void Spawn(); virtual void Precache() OVERRIDE; void ResetTimers( void ); virtual bool Reload( void ); virtual bool CanHolster( void ) const; virtual bool Holster( CBaseCombatWeapon *pSwitchingTo ); virtual bool OwnerCanJump( void ) OVERRIDE; virtual void HandleZooms( void ); virtual void ItemPostFrame( void ); virtual bool Lower( void ); virtual float GetProjectileDamage( void ); virtual int GetDamageType() const; int GetRifleType( void ) const { int iMode = 0; CALL_ATTRIB_HOOK_INT( iMode, set_weapon_mode ); return iMode; }; virtual void WeaponReset( void ); virtual bool CanFireCriticalShot( bool bIsHeadshot = false ); virtual void PlayWeaponShootSound( void ); virtual bool MustBeZoomedToFire( void ); virtual ETFDmgCustom GetPenetrateType() const; #ifdef CLIENT_DLL float GetHUDDamagePerc( void ); virtual bool ShouldEjectBrass(); #endif bool IsZoomed( void ); bool IsFullyCharged( void ) const; // have we been zoomed in long enough for our shot to do max damage virtual void OnControlStunned( void ); virtual int GetCustomDamageType() const; #ifdef GAME_DLL // Hit tracking for achievements virtual void OnPlayerKill( CTFPlayer *pVictim, const CTakeDamageInfo &info ) OVERRIDE; virtual void OnBulletFire( int iEnemyPlayersHit ) OVERRIDE; void ExplosiveHeadShot( CTFPlayer *pAttacker, CTFPlayer *pVictim ); #endif void Detach( void ) OVERRIDE; virtual bool IsJarateRifle( void ) const; virtual float GetJarateTime( void ) const; virtual float SniperRifleChargeRateMod() { return 0.f; } virtual int GetBuffType() { int iBuffType = 0; CALL_ATTRIB_HOOK_INT( iBuffType, set_buff_type ); return iBuffType; } float GetProgress( void ); bool IsRageFull( void ); // same as GetProgress() without the division by 100.0f const char* GetEffectLabelText( void ) { return "#TF_SNIPERRAGE"; } bool EffectMeterShouldFlash( void ); #ifdef SIXENSE float GetRezoomTime() const; #endif virtual void ZoomIn( void ); virtual void ZoomOut( void ); void ApplyScopeSpeedModifications( float &flBaseRef ); void ApplyChargeSpeedModifications( float &flBaseRef ); protected: float GetJarateTimeInternal( void ) const; bool m_bCurrentShotIsHeadshot; void CreateSniperDot( void ); void DestroySniperDot( void ); void UpdateSniperDot( void ); void Fire( CTFPlayer *pPlayer ); // Auto-rezooming handling void SetRezoom( bool bRezoom, float flDelay ); virtual void Zoom( void ); void ZoomOutIn( void ); void HandleNoScopeFireDeny( void ); CNetworkVar( float, m_flChargedDamage ); #ifdef GAME_DLL CHandle m_hSniperDot; #else bool m_bPlayedBell; #endif // Handles rezooming after the post-fire unzoom float m_flUnzoomTime; float m_flRezoomTime; bool m_bRezoomAfterShot; float m_flChargePerSec; bool m_bWasAimedAtEnemy; CTFSniperRifle( const CTFSniperRifle & ); }; class CTFSniperRifleDecap : public CTFSniperRifle { public: DECLARE_CLASS( CTFSniperRifleDecap, CTFSniperRifle ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); virtual int GetWeaponID( void ) const { return TF_WEAPON_SNIPERRIFLE_DECAP; } #ifdef GAME_DLL virtual void OnPlayerKill( CTFPlayer *pVictim, const CTakeDamageInfo &info ); #endif // GAME_DLL virtual float SniperRifleChargeRateMod() OVERRIDE; const char* GetEffectLabelText( void ) { return "#TF_BERZERK"; } float GetProgress( void ) { return 0.f; } int GetCount( void ); }; //============================================================================= // // Classic Sniper Rifle class. // class CTFSniperRifleClassic : public CTFSniperRifle { public: DECLARE_CLASS( CTFSniperRifleClassic, CTFSniperRifle ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); CTFSniperRifleClassic(); ~CTFSniperRifleClassic(); virtual void Precache() OVERRIDE; virtual int GetWeaponID( void ) const { return TF_WEAPON_SNIPERRIFLE_CLASSIC; } virtual void ZoomOut( void ) OVERRIDE; virtual void ZoomIn( void ) OVERRIDE; virtual void Zoom( void ) OVERRIDE; virtual void HandleZooms( void ) OVERRIDE; virtual void ItemPostFrame( void ) OVERRIDE; virtual bool Lower( void ) OVERRIDE; virtual bool Deploy( void ) OVERRIDE; virtual bool MustBeZoomedToFire( void ) OVERRIDE { return false; } virtual int GetDamageType() const OVERRIDE; virtual bool Holster( CBaseCombatWeapon *pSwitchingTo ) OVERRIDE; virtual void WeaponReset( void ) OVERRIDE; #ifdef CLIENT_DLL virtual void OnDataChanged( DataUpdateType_t updateType ) OVERRIDE; #endif void Detach( void ) OVERRIDE; private: CNetworkVar( bool, m_bCharging ); #ifdef CLIENT_DLL void ManageChargeBeam( void ); HPARTICLEFFECT m_pChargedEffect; #endif }; #ifdef STAGING_ONLY //============================================================================= // // Projectile Based Sniper Rifle // class CTFSniperRifleRevolver : public CTFSniperRifleClassic { public: DECLARE_CLASS( CTFSniperRifleRevolver, CTFSniperRifleClassic ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); virtual int GetWeaponID( void ) const { return TF_WEAPON_SNIPERRIFLE_REVOLVER; } // Fire the sniper shot. virtual void PrimaryAttack() OVERRIDE; virtual float GetProjectileDamage() OVERRIDE; virtual void ZoomIn( void ) OVERRIDE; virtual void ZoomOut( void ) OVERRIDE; virtual bool Reload( void ) OVERRIDE; virtual void ItemPostFrame( void ) OVERRIDE; virtual bool CanFireCriticalShot( bool bIsHeadshot = false ) OVERRIDE; virtual float GetProjectileSpeed( void ) OVERRIDE; virtual float GetProjectileGravity( void ) OVERRIDE; }; #endif // STAGING_ONLY #endif // TF_WEAPON_SNIPERRIFLE_H