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.
86 lines
2.1 KiB
86 lines
2.1 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include "c_entity_burn_effect.h"
|
||
|
|
||
|
|
||
|
#define NUM_BURN_PARTICLES_PER_SEC 50
|
||
|
|
||
|
|
||
|
|
||
|
IMPLEMENT_CLIENTCLASS_DT( C_EntityBurnEffect, DT_EntityBurnEffect, CEntityBurnEffect )
|
||
|
RecvPropInt( RECVINFO( m_hBurningEntity ) )
|
||
|
END_RECV_TABLE()
|
||
|
|
||
|
|
||
|
|
||
|
C_EntityBurnEffect::C_EntityBurnEffect()
|
||
|
{
|
||
|
m_pEmitter = CSimpleEmitter::Create( "Entity burn effect" );
|
||
|
if ( m_pEmitter.IsValid() )
|
||
|
{
|
||
|
m_hFireMaterial = m_pEmitter->GetPMaterial( "particle/fire" );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_hFireMaterial = INVALID_MATERIAL_HANDLE;
|
||
|
}
|
||
|
m_Timer.Init( NUM_BURN_PARTICLES_PER_SEC );
|
||
|
}
|
||
|
|
||
|
|
||
|
void C_EntityBurnEffect::OnDataChanged( DataUpdateType_t updateType )
|
||
|
{
|
||
|
if ( updateType == DATA_UPDATE_CREATED )
|
||
|
{
|
||
|
SetNextClientThink( CLIENT_THINK_ALWAYS );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void C_EntityBurnEffect::ClientThink()
|
||
|
{
|
||
|
if ( !m_pEmitter.IsValid() || IsDormant() )
|
||
|
return;
|
||
|
|
||
|
// Add some burning particles to our target entity.
|
||
|
C_BaseEntity *pEnt = ClientEntityList().GetBaseEntity( m_hBurningEntity );
|
||
|
if ( !pEnt )
|
||
|
return;
|
||
|
|
||
|
float dt = gpGlobals->frametime;
|
||
|
while ( m_Timer.NextEvent( dt ) )
|
||
|
{
|
||
|
Vector vDims = (pEnt->WorldAlignMaxs() - pEnt->WorldAlignMins()) * 0.5f;
|
||
|
Vector vCenter = pEnt->GetAbsOrigin() + pEnt->WorldAlignMins() + vDims;
|
||
|
Vector vPos = vCenter + vDims * RandomVector( -0.7, 0.7 );
|
||
|
|
||
|
float flLifetime = 1;
|
||
|
float flRadius = 3;
|
||
|
unsigned char uchColor[4] = { 255, 100, 0, 100 };
|
||
|
|
||
|
SimpleParticle *pParticle = m_pEmitter->AddSimpleParticle( m_hFireMaterial, vPos, flLifetime, flRadius );
|
||
|
if ( pParticle )
|
||
|
{
|
||
|
pParticle->m_uchColor[0] = uchColor[0];
|
||
|
pParticle->m_uchColor[1] = uchColor[1];
|
||
|
pParticle->m_uchColor[2] = uchColor[2];
|
||
|
|
||
|
pParticle->m_uchEndAlpha = 0;
|
||
|
pParticle->m_uchStartAlpha = uchColor[3];
|
||
|
|
||
|
pParticle->m_vecVelocity.x = RandomFloat( -2, 2 );
|
||
|
pParticle->m_vecVelocity.y = RandomFloat( -2, 2 );
|
||
|
pParticle->m_vecVelocity.z = RandomFloat( 3, 29 );
|
||
|
|
||
|
// Pick up some velocity from the burning guy running around.
|
||
|
pParticle->m_vecVelocity += pEnt->GetAbsVelocity() * 0.6;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|