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.
243 lines
6.6 KiB
243 lines
6.6 KiB
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef FIRE_H |
|
#define FIRE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "entityoutput.h" |
|
#include "fire_smoke.h" |
|
#include "plasma.h" |
|
#include "asw_shareddefs.h" |
|
|
|
#ifdef INFESTED_DLL |
|
// asw |
|
//#include "asw_marine.h" |
|
//#include "asw_marine_resource.h" |
|
//#include "asw_alien.h" |
|
//#include "asw_extinguisher_projectile.h" |
|
//#include "asw_generic_emitter_entity.h" |
|
#include "asw_dynamic_light.h" |
|
//#include "asw_flamer_projectile.h" |
|
//#include "iasw_spawnable_npc.h" |
|
//#include "asw_shareddefs.h" |
|
#endif |
|
|
|
//Spawnflags |
|
#define SF_FIRE_INFINITE 0x00000001 |
|
#define SF_FIRE_SMOKELESS 0x00000002 |
|
#define SF_FIRE_START_ON 0x00000004 |
|
#define SF_FIRE_START_FULL 0x00000008 |
|
#define SF_FIRE_DONT_DROP 0x00000010 |
|
#define SF_FIRE_NO_GLOW 0x00000020 |
|
#define SF_FIRE_DIE_PERMANENT 0x00000080 |
|
//asw |
|
#define SF_FIRE_NO_SOUND 0x00000100 |
|
#define SF_FIRE_NO_IGNITE_SOUND 0x00000200 |
|
#define SF_FIRE_NO_FUELLING_ONCE_LIT 0x00000400 |
|
#define SF_FIRE_FAST_BURN_THINK 0x00000800 |
|
|
|
//================================================== |
|
// CFire |
|
//================================================== |
|
|
|
enum fireType_e |
|
{ |
|
FIRE_NATURAL = 0, |
|
FIRE_WALL_MINE, |
|
FIRE_PLASMA, |
|
}; |
|
|
|
//================================================== |
|
|
|
// NPCs and grates do not prevent fire from travelling |
|
#define MASK_FIRE_SOLID ( MASK_SOLID & (~(CONTENTS_MONSTER|CONTENTS_GRATE)) ) |
|
|
|
class CFire : public CBaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( CFire, CBaseEntity ); |
|
DECLARE_SERVERCLASS(); |
|
|
|
int DrawDebugTextOverlays(void); |
|
|
|
CFire( void ); |
|
|
|
virtual void UpdateOnRemove( void ); |
|
|
|
void Precache( void ); |
|
void Init( const Vector &position, float scale, float attackTime, float fuel, int flags, int fireType ); |
|
bool GoOut(); |
|
|
|
void BurnThink(); |
|
#ifdef INFESTED_DLL |
|
void FastBurnThink(); |
|
void ASWFireTouch(CBaseEntity* pOther); // asw |
|
#endif |
|
void GoOutThink(); |
|
void GoOutInSeconds( float seconds ); |
|
|
|
void SetOwner( CBaseEntity *hOwner ) { m_hOwner = hOwner; } |
|
CBaseEntity* GetOwner( void ) { return m_hOwner; } |
|
|
|
void Scale( float end, float time ); |
|
void AddHeat( float heat, bool selfHeat = false ); |
|
int OnTakeDamage( const CTakeDamageInfo &info ); |
|
|
|
bool IsBurning( void ) const; |
|
|
|
bool GetFireDimensions( Vector *pFireMins, Vector *pFireMaxs ); |
|
|
|
void Extinguish( float heat ); |
|
void DestroyEffect(); |
|
|
|
virtual void Update( float simTime ); |
|
|
|
void Spawn( void ); |
|
void Activate( void ); |
|
void StartFire( void ); |
|
void Start(); |
|
void SetToOutSize() |
|
{ |
|
UTIL_SetSize( this, Vector(-8,-8,0), Vector(8,8,8) ); |
|
} |
|
|
|
float GetHeatLevel() { return m_flHeatLevel; } |
|
#ifdef INFESTED_DLL |
|
void SetHeatLevel(float fHeat) { m_flHeatLevel = fHeat; } |
|
#endif |
|
|
|
virtual int UpdateTransmitState(); |
|
|
|
void DrawDebugGeometryOverlays(void) |
|
{ |
|
if (m_debugOverlays & OVERLAY_BBOX_BIT) |
|
{ |
|
if ( m_lastDamage > gpGlobals->curtime && m_flHeatAbsorb > 0 ) |
|
{ |
|
NDebugOverlay::EntityBounds(this, 88, 255, 128, 0 ,0); |
|
char tempstr[512]; |
|
Q_snprintf( tempstr, sizeof(tempstr), "Heat: %.1f", m_flHeatAbsorb ); |
|
EntityText(1,tempstr, 0); |
|
} |
|
else if ( !IsBurning() ) |
|
{ |
|
NDebugOverlay::EntityBounds(this, 88, 88, 128, 0 ,0); |
|
} |
|
|
|
if ( IsBurning() ) |
|
{ |
|
Vector mins, maxs; |
|
if ( GetFireDimensions( &mins, &maxs ) ) |
|
{ |
|
NDebugOverlay::Box(GetAbsOrigin(), mins, maxs, 128, 0, 0, 10, 0); |
|
} |
|
} |
|
|
|
|
|
} |
|
BaseClass::DrawDebugGeometryOverlays(); |
|
} |
|
|
|
void Disable(); |
|
EHANDLE m_hCreatorWeapon; |
|
|
|
//Inputs |
|
void InputStartFire( inputdata_t &inputdata ); |
|
void InputExtinguish( inputdata_t &inputdata ); |
|
void InputExtinguishTemporary( inputdata_t &inputdata ); |
|
void InputEnable( inputdata_t &inputdata ); |
|
void InputDisable( inputdata_t &inputdata ); |
|
|
|
// Classification |
|
virtual Class_T Classify( void ) { return (Class_T) CLASS_ASW_FIRE; } |
|
protected: |
|
|
|
void Spread( void ); |
|
void SpawnEffect( fireType_e type, float scale ); |
|
|
|
CHandle<CBaseFire> m_hEffect; |
|
#ifdef INFESTED_DLL |
|
//CHandle<CASW_Emitter> m_hEmitter; |
|
CHandle<CASW_Dynamic_Light> m_hFireLight; |
|
bool m_bFirefighterCounted; // has this fire been counted towards the firefighter stats yet? (so we don't count more than once) |
|
#endif |
|
EHANDLE m_hOwner; |
|
|
|
CNetworkVar( int, m_nFireType ); |
|
|
|
float m_flFuel; |
|
float m_flDamageTime; |
|
float m_lastDamage; |
|
CNetworkVar( float, m_flFireSize ); // size of the fire in world units |
|
CNetworkVar( float, m_flHeatLevel ); // Used as a "health" for the fire. > 0 means the fire is burning |
|
float m_flHeatAbsorb; // This much heat must be "absorbed" before it gets transferred to the flame size |
|
float m_flDamageScale; |
|
|
|
CNetworkVar( float, m_flMaxHeat ); |
|
float m_flLastHeatLevel; |
|
|
|
//NOTENOTE: Lifetime is an expression of the sum total of these amounts plus the global time when started |
|
float m_flAttackTime; //Amount of time to scale up |
|
|
|
CNetworkVar( bool, m_bEnabled ); |
|
bool m_bStartDisabled; |
|
bool m_bDidActivate; |
|
|
|
#ifdef INFESTED_DLL |
|
// asw |
|
CSoundPatch *m_pLoopSound; |
|
string_t m_LoopSoundName; |
|
string_t m_StartSoundName; |
|
color32 m_LightColor; |
|
float m_fLightRadiusScale; |
|
int m_iLightBrightness; |
|
bool m_bNoFuelingOnceLit; |
|
#endif |
|
|
|
COutputEvent m_OnIgnited; |
|
COutputEvent m_OnExtinguished; |
|
|
|
DECLARE_DATADESC(); |
|
}; |
|
|
|
class CFireSphere : public IPartitionEnumerator |
|
{ |
|
public: |
|
CFireSphere( CFire **pList, int listMax, bool onlyActiveFires, const Vector &origin, float radius ); |
|
// This gets called by the enumeration methods with each element |
|
// that passes the test. |
|
virtual IterationRetval_t EnumElement( IHandleEntity *pHandleEntity ); |
|
|
|
int GetCount() { return m_count; } |
|
bool AddToList( CFire *pEntity ); |
|
|
|
private: |
|
Vector m_origin; |
|
float m_radiusSqr; |
|
CFire **m_pList; |
|
int m_listMax; |
|
int m_count; |
|
bool m_onlyActiveFires; |
|
}; |
|
|
|
//================================================== |
|
// FireSystem |
|
//================================================== |
|
bool FireSystem_StartFire( const Vector &position, float fireHeight, float attack, float fuel, int flags, CBaseEntity *owner, fireType_e type = FIRE_NATURAL, float flRotation = 0, CBaseEntity *pCreatorWeapon = NULL ); |
|
void FireSystem_ExtinguishInRadius( const Vector &origin, float radius, float rate ); |
|
void FireSystem_AddHeatInRadius( const Vector &origin, float radius, float heat ); |
|
|
|
bool FireSystem_GetFireDamageDimensions( CBaseEntity *pFire, Vector *pFireMins, Vector *pFireMaxs ); |
|
|
|
#ifdef INFESTED_DLL |
|
bool FireSystem_StartDormantFire( const Vector &position, float fireHeight, float attack, float fuel, int flags, CBaseEntity *owner, fireType_e type = FIRE_NATURAL); |
|
bool FireSystem_ExtinguishFire(CBaseEntity *pEnt); |
|
#endif |
|
#endif // FIRE_H
|
|
|