//----------------------------------------------------------------------------- // Purpose: Starts the effect // Input : *pParticleMgr - // *pArgs - //----------------------------------------------------------------------------- void C_SteamJet::Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs) { #ifdef GE_DLL // If the client doesn't want the heat wave effect for explosions disable starting if ( m_bIsForExplosion && cl_ge_noexpheatwave.GetBool() ) return; #endif pParticleMgr->AddEffect( &m_ParticleEffect, this ); switch(m_nType) { case STEAM_NORMAL: default: m_MaterialHandle = g_Mat_DustPuff[0]; break; case STEAM_HEATWAVE: m_MaterialHandle = m_ParticleEffect.FindOrAddMaterial("sprites/heatwave"); break; } m_ParticleSpawn.Init(m_Rate); m_Lifetime = m_JetLength / m_Speed; m_pParticleMgr = pParticleMgr; UpdateLightingRamp(); }
//----------------------------------------------------------------------------- // Purpose: Starts the effect // Input : *pParticleMgr - // *pArgs - //----------------------------------------------------------------------------- void C_SteamJet::Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs) { pParticleMgr->AddEffect( &m_ParticleEffect, this ); switch(m_nType) { case STEAM_NORMAL: default: m_MaterialHandle = m_ParticleEffect.FindOrAddMaterial("particle/particle_smokegrenade"); break; case STEAM_HEATWAVE: m_MaterialHandle = m_ParticleEffect.FindOrAddMaterial("sprites/heatwave"); break; } m_ParticleSpawn.Init(m_Rate); m_Lifetime = m_JetLength / m_Speed; m_pParticleMgr = pParticleMgr; UpdateLightingRamp(); }
void C_SteamJet::Update(float fTimeDelta) { if(!m_pParticleMgr) { assert(false); return; } if( m_bEmit ) { // Add new particles. int nToEmit = 0; float tempDelta = fTimeDelta; while( m_ParticleSpawn.NextEvent(tempDelta) ) ++nToEmit; if ( nToEmit > 0 ) { Vector forward, right, up; AngleVectors(GetAbsAngles(), &forward, &right, &up); // Legacy env_steamjet entities faced left instead of forward. if (m_bFaceLeft) { Vector temp = forward; forward = -right; right = temp; } // EVIL: Ideally, we could tell the renderer our OBB, and let it build a big box that encloses // the entity with its parent so it doesn't have to setup its parent's bones here. Vector vEndPoint = GetAbsOrigin() + forward * m_Speed; Vector vMin, vMax; VectorMin( GetAbsOrigin(), vEndPoint, vMin ); VectorMax( GetAbsOrigin(), vEndPoint, vMax ); m_ParticleEffect.SetBBox( vMin, vMax ); if ( m_ParticleEffect.WasDrawnPrevFrame() ) { while ( nToEmit-- ) { // Make a new particle. if( SteamJetParticle *pParticle = (SteamJetParticle*) m_ParticleEffect.AddParticle( sizeof(SteamJetParticle), m_MaterialHandle ) ) { pParticle->m_Pos = GetAbsOrigin(); pParticle->m_Velocity = FRand(-m_SpreadSpeed,m_SpreadSpeed) * right + FRand(-m_SpreadSpeed,m_SpreadSpeed) * up + m_Speed * forward; pParticle->m_Lifetime = 0; pParticle->m_DieTime = m_Lifetime; pParticle->m_uchStartSize = m_StartSize; pParticle->m_uchEndSize = m_EndSize; pParticle->m_flRoll = random->RandomFloat( 0, 360 ); pParticle->m_flRollDelta = random->RandomFloat( -m_flRollSpeed, m_flRollSpeed ); } } } UpdateLightingRamp(); } } }