|
|
//========= 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
|