sqwarmed/sdk_src/game/server/swarm/asw_fire.h

244 lines
6.8 KiB
C++

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