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.
328 lines
10 KiB
328 lines
10 KiB
![]()
4 years ago
|
//========= 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
|