157 lines
4.4 KiB
C++
157 lines
4.4 KiB
C++
//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//===========================================================================//
|
|
|
|
#include "cbase.h"
|
|
#include "c_entityflame.h"
|
|
#include "particle_property.h"
|
|
#include "iefx.h"
|
|
#include "dlight.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Datadesc
|
|
//-----------------------------------------------------------------------------
|
|
IMPLEMENT_CLIENTCLASS_DT( C_EntityFlame, DT_EntityFlame, CEntityFlame )
|
|
RecvPropEHandle(RECVINFO(m_hEntAttached)),
|
|
RecvPropBool(RECVINFO(m_bCheapEffect)),
|
|
END_RECV_TABLE()
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
C_EntityFlame::C_EntityFlame( void ) : m_hEffect( NULL )
|
|
{
|
|
m_hOldAttached = NULL;
|
|
AddToEntityList( ENTITY_LIST_SIMULATE );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
C_EntityFlame::~C_EntityFlame( void )
|
|
{
|
|
StopEffect();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void C_EntityFlame::StopEffect( void )
|
|
{
|
|
if ( m_hEffect )
|
|
{
|
|
ParticleProp()->StopEmission( m_hEffect, true );
|
|
m_hEffect = NULL;
|
|
}
|
|
|
|
if ( m_hEntAttached )
|
|
{
|
|
m_hEntAttached->RemoveFlag( FL_ONFIRE );
|
|
m_hEntAttached->SetEffectEntity( NULL );
|
|
m_hEntAttached->StopSound( "General.BurningFlesh" );
|
|
m_hEntAttached->StopSound( "General.BurningObject" );
|
|
m_hEntAttached = NULL;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void C_EntityFlame::UpdateOnRemove( void )
|
|
{
|
|
StopEffect();
|
|
BaseClass::UpdateOnRemove();
|
|
}
|
|
|
|
void C_EntityFlame::CreateEffect( void )
|
|
{
|
|
if ( m_hEffect )
|
|
{
|
|
m_hOldAttached = m_hEntAttached;
|
|
ParticleProp()->StopEmission( m_hEffect, true );
|
|
m_hEffect = NULL;
|
|
}
|
|
|
|
C_BaseEntity *pEntity = m_hEntAttached;
|
|
if ( pEntity && !pEntity->IsAbleToHaveFireEffect() )
|
|
return;
|
|
|
|
m_hEffect = ParticleProp()->Create( m_bCheapEffect ? "burning_gib_01" : "burning_character", PATTACH_ABSORIGIN_FOLLOW );
|
|
if ( m_hEffect )
|
|
{
|
|
m_hOldAttached = m_hEntAttached;
|
|
|
|
ParticleProp()->AddControlPoint( m_hEffect, 1, pEntity, PATTACH_ABSORIGIN_FOLLOW );
|
|
m_hEffect->SetControlPoint( 0, GetAbsOrigin() );
|
|
m_hEffect->SetControlPoint( 1, GetAbsOrigin() );
|
|
m_hEffect->SetControlPointEntity( 0, pEntity );
|
|
m_hEffect->SetControlPointEntity( 1, pEntity );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void C_EntityFlame::OnDataChanged( DataUpdateType_t updateType )
|
|
{
|
|
if ( updateType == DATA_UPDATE_CREATED )
|
|
{
|
|
CreateEffect();
|
|
}
|
|
|
|
// FIXME: This is a bit of a shady path
|
|
if ( updateType == DATA_UPDATE_DATATABLE_CHANGED )
|
|
{
|
|
// If our owner changed, then recreate the effect
|
|
if ( m_hEntAttached != m_hOldAttached )
|
|
{
|
|
CreateEffect();
|
|
}
|
|
}
|
|
|
|
BaseClass::OnDataChanged( updateType );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
bool C_EntityFlame::Simulate( void )
|
|
{
|
|
if ( gpGlobals->frametime <= 0.0f )
|
|
return true;
|
|
|
|
#ifdef HL2_EPISODIC
|
|
if ( IsEffectActive(EF_BRIGHTLIGHT) || IsEffectActive(EF_DIMLIGHT) )
|
|
{
|
|
dlight_t *dl = effects->CL_AllocDlight( index );
|
|
dl->origin = GetAbsOrigin();
|
|
dl->origin[2] += 16;
|
|
dl->color.r = 254;
|
|
dl->color.g = 174;
|
|
dl->color.b = 10;
|
|
dl->radius = random->RandomFloat(400,431);
|
|
dl->die = gpGlobals->curtime + 0.001;
|
|
}
|
|
|
|
#endif // HL2_EPISODIC
|
|
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void C_EntityFlame::ClientThink( void )
|
|
{
|
|
StopEffect();
|
|
Release();
|
|
}
|