summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_weapon_flamethrower.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_weapon_flamethrower.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/tf/tf_weapon_flamethrower.h')
-rw-r--r--game/shared/tf/tf_weapon_flamethrower.h327
1 files changed, 327 insertions, 0 deletions
diff --git a/game/shared/tf/tf_weapon_flamethrower.h b/game/shared/tf/tf_weapon_flamethrower.h
new file mode 100644
index 0000000..81a91e9
--- /dev/null
+++ b/game/shared/tf/tf_weapon_flamethrower.h
@@ -0,0 +1,327 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//=============================================================================
+#ifndef TF_WEAPON_FLAMETHROWER_H
+#define TF_WEAPON_FLAMETHROWER_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "tf_weaponbase_gun.h"
+#include "tf_weaponbase_rocket.h"
+#ifdef STAGING_ONLY
+#include "tf_weapon_jar.h"
+#endif // STAGING_ONLY
+
+// Client specific.
+#ifdef CLIENT_DLL
+ #include "particlemgr.h"
+ #include "particle_util.h"
+ #include "particles_simple.h"
+ #include "c_tf_projectile_rocket.h"
+
+ #define CTFFlameThrower C_TFFlameThrower
+ #define CTFFlameRocket C_TFFlameRocket
+#ifdef STAGING_ONLY
+ #define CTFProjectile_Napalm C_TFProjectile_Napalm
+#endif // STAGING_ONLY
+#else
+ #include "tf_projectile_rocket.h"
+ #include "baseentity.h"
+ #include "iscorer.h"
+#endif
+
+enum FlameThrowerState_t
+{
+ // Firing states.
+ FT_STATE_IDLE = 0,
+ FT_STATE_STARTFIRING,
+ FT_STATE_FIRING,
+ FT_STATE_SECONDARY,
+};
+
+enum EFlameThrowerAirblastFunction
+{
+ TF_FUNCTION_AIRBLAST_PUSHBACK = 0x01,
+ TF_FUNCTION_AIRBLAST_PUT_OUT_TEAMMATES = 0x02,
+ TF_FUNCTION_AIRBLAST_REFLECT_PROJECTILES = 0x04,
+
+ TF_FUNCTION_AIRBLAST_PUSHBACK__STUN = 0x08, // dependent on TF_FUNCTION_AIRBLAST_PUSHBACK
+ TF_FUNCTION_AIRBLAST_PUSHBACK__VIEW_PUNCH = 0x10, // dependent on TF_FUNCTION_AIRBLAST_PUSHBACK
+};
+
+//=========================================================
+// Flamethrower Weapon
+//=========================================================
+#ifdef GAME_DLL
+class CTFFlameThrower : public CTFWeaponBaseGun, public CGameEventListener
+#else
+class CTFFlameThrower : public CTFWeaponBaseGun
+#endif // GAME_DLL
+{
+ DECLARE_CLASS( CTFFlameThrower, CTFWeaponBaseGun );
+public:
+ DECLARE_DATADESC();
+ DECLARE_NETWORKCLASS();
+ DECLARE_PREDICTABLE();
+
+ CTFFlameThrower();
+ ~CTFFlameThrower();
+
+ virtual void Spawn( void );
+
+ virtual int GetWeaponID( void ) const { return TF_WEAPON_FLAMETHROWER; }
+
+ virtual bool Holster( CBaseCombatWeapon *pSwitchingTo );
+ virtual void ItemPostFrame( void );
+ virtual void PrimaryAttack();
+ virtual void SecondaryAttack();
+ virtual bool Lower( void );
+ virtual void WeaponReset( void );
+
+ virtual void DestroySounds( void );
+ virtual void Precache( void );
+
+ bool CanAirBlast() const;
+
+ bool SupportsAirBlastFunction( EFlameThrowerAirblastFunction eFunction ) const;
+ void FireAirBlast( int iAmmoPerShot );
+
+ float GetSpinUpTime( void ) const;
+ virtual bool IsFiring( void ) const OVERRIDE { return m_iWeaponState == FT_STATE_FIRING; }
+ void SetWeaponState( int nWeaponState );
+
+ void UseRage( void );
+
+ Vector GetVisualMuzzlePos();
+ Vector GetFlameOriginPos();
+
+ void IncrementFlameDamageCount( void );
+ void DecrementFlameDamageCount( void );
+ void IncrementActiveFlameCount( void );
+ void DecrementActiveFlameCount( void );
+ void ResetFlameHitCount( void );
+
+ 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_PYRORAGE"; }
+ bool EffectMeterShouldFlash( void );
+
+ virtual bool Deploy( void );
+
+#if defined( CLIENT_DLL )
+
+ virtual void OnDataChanged(DataUpdateType_t updateType);
+ virtual void UpdateOnRemove( void );
+ virtual void SetDormant( bool bDormant );
+ virtual int GetWorldModelIndex( void );
+
+ // Start/stop flame sound and particle effects
+ void StartFlame();
+ void StopFlame( bool bAbrupt = false );
+
+ virtual void RestartParticleEffect();
+ virtual const char* FlameEffectName( bool bIsFirstPersonView );
+ virtual const char* FlameCritEffectName( bool bIsFirstPersonView );
+ virtual const char* FullCritChargedEffectName( void );
+
+ void ClientEffectsThink( void );
+
+ // constant pilot light sound
+ void StartPilotLight();
+ void StopPilotLight();
+ void StopFullCritEffect();
+
+ // burning sound when you hit a player/building
+ void StopHitSound();
+
+ float GetFlameHitRatio( void );
+
+#else
+ void SetHitTarget( void );
+ void HitTargetThink( void );
+
+ virtual Vector GetDeflectionSize();
+ virtual bool DeflectPlayer( CTFPlayer *pTarget, CTFPlayer *pOwner, Vector &vecForward, Vector &vecCenter, Vector &vecSize );
+ virtual bool DeflectEntity( CBaseEntity *pTarget, CTFPlayer *pOwner, Vector &vecForward, Vector &vecCenter, Vector &vecSize );
+ virtual void PlayDeflectionSound( bool bPlayer );
+#endif
+
+#ifdef STAGING_ONLY
+ bool RocketPackCanActivate( int nAmmoCost );
+ bool RocketPackLaunch( int nAmmoCost );
+ bool ShootsNapalm( void );
+#endif // STAGING_ONLY
+
+ virtual void FireGameEvent( IGameEvent *event );
+
+ void CalculateHalloweenSpell( void );
+
+private:
+ Vector GetMuzzlePosHelper( bool bVisualPos );
+ CNetworkVar( int, m_iWeaponState );
+ CNetworkVar( bool, m_bCritFire );
+ CNetworkVar( bool, m_bHitTarget );
+ CNetworkVar( int, m_iActiveFlames ); // Number of flames we have in the world
+ CNetworkVar( int, m_iDamagingFlames ); // Number of flames that have done damage
+ CNetworkVar( float, m_flChargeBeginTime );
+ CNetworkVar( float, m_flSpinupBeginTime );
+ CNetworkVar( bool, m_bHasHalloweenSpell );
+
+ float m_flStartFiringTime;
+ float m_flNextPrimaryAttackAnim;
+
+ int m_iParticleWaterLevel;
+ float m_flAmmoUseRemainder;
+ float m_flResetBurstEffect;
+ bool m_bFiredSecondary;
+ bool m_bFiredBothAttacks;
+
+#if defined( CLIENT_DLL )
+ CSoundPatch *m_pFiringStartSound;
+ CSoundPatch *m_pFiringLoop;
+ CSoundPatch *m_pFiringAccuracyLoop;
+ CSoundPatch *m_pFiringHitLoop;
+ bool m_bFiringLoopCritical;
+ bool m_bFiringHitTarget;
+ CSoundPatch *m_pPilotLightSound;
+ CSoundPatch *m_pSpinUpSound;
+ float m_flFlameHitRatio;
+ float m_flPrevFlameHitRatio;
+ const char *m_szAccuracySound;
+ bool m_bEffectsThinking;
+ bool m_bFullRageEffect;
+
+ class FlameEffect_t
+ {
+ public:
+ FlameEffect_t( CTFWeaponBase* pOwner ) : m_pFlameEffect(NULL), m_pOwner(pOwner), m_hEffectWeapon(NULL)
+ {}
+
+ void StartEffects( const char* pszEffectName);
+ bool StopEffects();
+
+ private:
+ CNewParticleEffect* m_pFlameEffect;
+ CTFWeaponBase* m_pOwner;
+ EHANDLE m_hEffectWeapon;
+ };
+
+ FlameEffect_t m_FlameEffects;
+ FlameEffect_t m_MmmmphEffect;
+#else
+ float m_flTimeToStopHitSound;
+#endif
+
+ CTFFlameThrower( const CTFFlameThrower & );
+};
+
+//-----------------------------------------------------------------------------
+// Flame rocket. Not used in TF2, but is a part of data tables in demos and
+// must live on forever.
+//-----------------------------------------------------------------------------
+class CTFFlameRocket : public CTFBaseRocket
+{
+ DECLARE_CLASS( CTFFlameRocket, CTFBaseRocket );
+public:
+ DECLARE_NETWORKCLASS();
+};
+
+#ifdef GAME_DLL
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+DECLARE_AUTO_LIST( ITFFlameEntityAutoList );
+class CTFFlameEntity : public CBaseEntity, public ITFFlameEntityAutoList
+{
+ DECLARE_CLASS( CTFFlameEntity, CBaseEntity );
+public:
+
+ CTFFlameEntity();
+ virtual void Spawn( void );
+
+public:
+ static CTFFlameEntity *Create( const Vector &vecOrigin, const QAngle &vecAngles, CBaseEntity *pOwner, float flSpeed, int iDmgType, float m_flDmgAmount, bool bAlwaysCritFromBehind, bool bRandomize=true );
+
+ void FlameThink( void );
+ void SetCritFromBehind( bool bState ) { m_bCritFromBehind = bState; }
+ bool IsEntityAttacker( CBaseEntity *pEnt ) { return m_hAttacker.Get() == pEnt; }
+
+private:
+ void RemoveFlame();
+ void OnCollide( CBaseEntity *pOther );
+ void OnCollideWithTeammate( CTFPlayer *pPlayer );
+ void SetHitTarget( void );
+ bool IsBehindTarget( CBaseEntity *pTarget );
+ float DotProductToTarget( CBaseEntity *pTarget );
+ void UpdateFlameThrowerHitRatio( void );
+ float GetFlameFloat( void );
+ float GetFlameDrag( void );
+
+ Vector m_vecInitialPos; // position the flame was fired from
+ Vector m_vecPrevPos; // position from previous frame
+ Vector m_vecBaseVelocity; // base velocity vector of the flame (ignoring rise effect)
+ Vector m_vecAttackerVelocity; // velocity of attacking player at time flame was fired
+ float m_flTimeRemove; // time at which the flame should be removed
+ int m_iDmgType; // damage type
+ float m_flDmgAmount; // amount of base damage
+ CUtlVector<EHANDLE> m_hEntitiesBurnt; // list of entities this flame has burnt
+ EHANDLE m_hAttacker; // attacking player
+ int m_iAttackerTeam; // team of attacking player
+ bool m_bCritFromBehind; // Always crits from behind.
+ bool m_bBurnedEnemy; // We track hitting to calculate hit/miss ratio in the Flamethrower
+
+ CHandle< CTFFlameThrower > m_hFlameThrower;
+};
+#endif // GAME_DLL
+
+
+#ifdef STAGING_ONLY
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CTFProjectile_Napalm : public CTFProjectile_Jar
+{
+ DECLARE_CLASS( CTFProjectile_Napalm, CTFProjectile_Jar );
+ DECLARE_NETWORKCLASS();
+ DECLARE_PREDICTABLE();
+ DECLARE_DATADESC();
+
+public:
+ CTFProjectile_Napalm();
+ ~CTFProjectile_Napalm();
+
+ virtual void Precache();
+ virtual void Spawn();
+#ifdef GAME_DLL
+ static CTFProjectile_Napalm *Create( CBaseCombatCharacter *pOwner, CTFFlameThrower *pLauncher );
+ virtual int UpdateTransmitState();
+ void NapalmThink( void );
+ virtual void Explode( trace_t *pTrace, int bitsDamageType );
+ virtual void PipebombTouch( CBaseEntity *pOther );
+ virtual void ApplyBlastDamage( CTFPlayer *pThrower, Vector vecOrigin );
+ virtual bool InitialExplodeEffects( CTFPlayer *pThrower, const trace_t *pTrace );
+ virtual void ExplodeEffectOnTarget( CTFPlayer *pThrower, CTFPlayer *pTarget, CBaseCombatCharacter *pBaseTarget );
+ virtual const char *GetImpactEffect( void );
+ virtual void SetCustomPipebombModel( void );
+#endif
+
+#ifdef CLIENT_DLL
+ virtual void OnDataChanged( DataUpdateType_t updateType );
+ virtual const char *GetTrailParticleName( void );
+#endif // CLIENT_DLL
+
+ CNetworkHandle( CTFFlameThrower, m_hFlameThrower );
+
+#ifdef GAME_DLL
+ Vector m_vecBaseVelocity;
+ float m_flRemoveTime;
+ int m_nHitCount;
+ float m_flLastBurnTime;
+#endif // CLIENT_DLL
+};
+#endif // STAGING_ONLY
+#endif // TF_WEAPON_FLAMETHROWER_H