//========= Copyright Valve Corporation, All rights reserved. ============// // // //============================================================================= #ifndef TF_WEAPON_MINIGUN_H #define TF_WEAPON_MINIGUN_H #ifdef _WIN32 #pragma once #endif #include "GameEventListener.h" #include "tf_weaponbase_gun.h" #ifdef CLIENT_DLL #include "particles_new.h" #endif // Client specific. #ifdef CLIENT_DLL #define CTFMinigun C_TFMinigun #endif #ifdef GAME_DLL class ITFProjectile; #endif // GAME_DLL enum MinigunState_t { // Firing states. AC_STATE_IDLE = 0, AC_STATE_STARTFIRING, AC_STATE_FIRING, AC_STATE_SPINNING, AC_STATE_DRYFIRE }; enum minigun_weapontypes_t { MINIGUN_STANDARD = 0, MINIGUN_STUN, // Natascha }; //============================================================================= // // TF Weapon Minigun // class CTFMinigun : public CTFWeaponBaseGun { public: DECLARE_CLASS( CTFMinigun, CTFWeaponBaseGun ); DECLARE_NETWORKCLASS(); DECLARE_PREDICTABLE(); // Server specific. #ifndef CLIENT_DLL DECLARE_DATADESC(); #endif CTFMinigun(); ~CTFMinigun(); virtual void Precache( void ); virtual int GetWeaponID( void ) const { return TF_WEAPON_MINIGUN; } virtual void ItemPostFrame( void ); virtual void PrimaryAttack(); virtual void SecondaryAttack(); void SharedAttack(); virtual void WeaponIdle(); virtual bool SendWeaponAnim( int iActivity ); virtual bool CanHolster( void ) const; virtual bool Holster( CBaseCombatWeapon *pSwitchingTo ); virtual bool HolsterOnDetach() { return true; } virtual bool Lower( void ); virtual void HandleFireOnEmpty( void ); virtual void WeaponReset( void ); virtual float GetProjectileDamage( void ); virtual bool ShouldDoMuzzleFlash( void ) { return false; } virtual float GetWeaponSpread( void ); virtual void FireGameEvent( IGameEvent *event ); #ifdef GAME_DLL virtual int UpdateTransmitState( void ); void AttackEnemyProjectiles( void ); void ActivatePushBackAttackMode( void ); #endif void RingOfFireAttack( int nDamage ); virtual int GetCustomDamageType() const { return TF_DMG_CUSTOM_MINIGUN; } int GetMinigunType( void ) const { int iMode = 0; CALL_ATTRIB_HOOK_INT( iMode, set_weapon_mode ); return iMode; }; bool HasSpinSounds( void ) const { int iMode = 0; CALL_ATTRIB_HOOK_INT( iMode, minigun_no_spin_sounds ); return iMode!=1; }; bool CanHolsterWhileSpinning( void ) const { int iMode = 0; CALL_ATTRIB_HOOK_INT( iMode, mod_minigun_can_holster_while_spinning ); return iMode!=0; }; float GetFiringDuration( void ) { return ( m_flStartedFiringAt >= 0.f ) ? ( gpGlobals->curtime - m_flStartedFiringAt ) : 0.f; } float GetWindUpDuration( void ) { return ( m_flStartedWindUpAt >= 0.f ) ? ( gpGlobals->curtime - m_flStartedWindUpAt ) : 0.f; } float GetProgress( void ); bool IsRageFull( void ); // same as GetProgress() without the division by 100.0f const char* GetEffectLabelText( void ) { return "#TF_Rage"; } bool EffectMeterShouldFlash( void ); virtual bool CanInspect() const OVERRIDE; #ifdef GAME_DLL virtual CDmgAccumulator *GetDmgAccumulator( void ) { return &m_Accumulator; } #endif // GAME_DLL #ifdef CLIENT_DLL float GetBarrelRotation(); #endif private: CTFMinigun( const CTFMinigun & ) {} void WindUp( void ); void WindDown( void ); #ifdef GAME_DLL CDmgAccumulator m_Accumulator; #endif // GAME_DLL #ifdef CLIENT_DLL // Barrel spinning virtual CStudioHdr *OnNewModel( void ); virtual void StandardBlendingRules( CStudioHdr *hdr, Vector pos[], Quaternion q[], float currentTime, int boneMask ); virtual void UpdateOnRemove( void ); void CreateMove( float flInputSampleTime, CUserCmd *pCmd, const QAngle &vecOldViewAngles ); void OnDataChanged( DataUpdateType_t type ); virtual void ItemPreFrame( void ); // Firing sound void WeaponSoundUpdate( void ); void PlayStopFiringSound(); void UpdateBarrelMovement( void ); virtual void SetDormant( bool bDormant ); virtual void ViewModelAttachmentBlending( CStudioHdr *hdr, Vector pos[], Quaternion q[], float currentTime, int boneMask ); #endif virtual bool CanReload( void ){ return false; } private: virtual void PlayWeaponShootSound( void ) {} // override base class call to play shoot sound; we handle that ourselves separately void SetWeaponState( MinigunState_t nState ); CNetworkVar( MinigunState_t, m_iWeaponState ); CNetworkVar( bool, m_bCritShot ); float m_flNextFiringSpeech; float m_flStartedFiringAt; float m_flStartedWindUpAt; float m_flBarrelCurrentVelocity; float m_flBarrelTargetVelocity; int m_iBarrelBone; float m_flBarrelAngle; CSoundPatch *m_pSoundCur; // the weapon sound currently being played int m_iMinigunSoundCur; // the enum value of the weapon sound currently being played float m_flMinigunSoundCurrentPitch; #ifdef GAME_DLL float m_flAegisCheckTime; #endif float m_flNextRingOfFireAttackTime; float m_flAccumulatedAmmoDrain; float m_flLastAmmoDrainTime; bool m_bAttack3Down; #ifdef CLIENT_DLL void StartBrassEffect(); void StopBrassEffect(); void HandleBrassEffect(); EHANDLE m_hEjectBrassWeapon; CNewParticleEffect *m_pEjectBrassEffect; int m_iEjectBrassAttachment; void StartMuzzleEffect(); void StopMuzzleEffect(); void HandleMuzzleEffect(); EHANDLE m_hMuzzleEffectWeapon; CNewParticleEffect *m_pMuzzleEffect; int m_iMuzzleAttachment; int m_nShotsFired; bool m_bRageDraining; bool m_bPrevRageDraining; MinigunState_t m_iPrevMinigunState; #endif }; #endif // TF_WEAPON_MINIGUN_H