You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
8.1 KiB
305 lines
8.1 KiB
//========= 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<CSniperDot> 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
|
|
|