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.
327 lines
10 KiB
327 lines
10 KiB
//========= 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
|
|
|