//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "hud.h" #include "c_baseobject.h" #include "particles_simple.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class C_ObjectEMPGenerator : public C_BaseObject { DECLARE_CLASS( C_ObjectEMPGenerator, C_BaseObject ); public: DECLARE_CLIENTCLASS(); C_ObjectEMPGenerator(); virtual void OnDataChanged( DataUpdateType_t updateType ); virtual void ClientThink( void ); private: CSmartPtr m_pEmitter; PMaterialHandle m_hParticleMaterial; TimedEvent m_ParticleEvent; private: C_ObjectEMPGenerator( const C_ObjectEMPGenerator & ); // not defined, not accessible }; IMPLEMENT_CLIENTCLASS_DT(C_ObjectEMPGenerator, DT_ObjectEMPGenerator, CObjectEMPGenerator) END_RECV_TABLE() //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- C_ObjectEMPGenerator::C_ObjectEMPGenerator() { m_ParticleEvent.Init( 300 ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_ObjectEMPGenerator::OnDataChanged( DataUpdateType_t updateType ) { BaseClass::OnDataChanged( updateType ); if ( updateType == DATA_UPDATE_CREATED ) { m_pEmitter = CSimpleEmitter::Create( "C_ObjectEMPGenerator" ); m_hParticleMaterial = m_pEmitter->GetPMaterial( "sprites/chargeball" ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_ObjectEMPGenerator::ClientThink( void ) { // Add particles at the target. float flCur = gpGlobals->frametime; while ( m_ParticleEvent.NextEvent( flCur ) ) { Vector vPos = WorldSpaceCenter( ); Vector vOffset = RandomVector( -1, 1 ); VectorNormalize( vOffset ); vPos += vOffset * RandomFloat( 0, 50 ); SimpleParticle *pParticle = m_pEmitter->AddSimpleParticle( m_hParticleMaterial, vPos ); if ( pParticle ) { // Move the points along the path. pParticle->m_vecVelocity.Init(); pParticle->m_flRoll = 0; pParticle->m_flRollDelta = 0; pParticle->m_flDieTime = 0.4f; pParticle->m_flLifetime = 0; pParticle->m_uchColor[0] = 255; pParticle->m_uchColor[1] = 255; pParticle->m_uchColor[2] = 255; pParticle->m_uchStartAlpha = 32; pParticle->m_uchEndAlpha = 0; pParticle->m_uchStartSize = 6; pParticle->m_uchEndSize = 4; pParticle->m_iFlags = 0; } } }