void CParticleProperty::StopParticlesWithNameAndAttachment( const char *pszEffectName, int iAttachmentPoint, bool bForceRemoveInstantly /* =false */ ) { CParticleSystemDefinition *pDef = g_pParticleSystemMgr->FindParticleSystem( pszEffectName ); AssertMsg1(pDef, "Could not find particle definition %s", pszEffectName ); if (!pDef) return; // If we return from dormancy and are then told to stop emitting, // we should have died while dormant. Remove ourselves immediately. bool bRemoveInstantly = (m_iDormancyChangedAtFrame == gpGlobals->framecount); // force remove particles instantly if caller specified bRemoveInstantly |= bForceRemoveInstantly; int nCount = m_ParticleEffects.Count(); for ( int i = 0; i < nCount; ++i ) { // for each effect... ParticleEffectList_t *pParticleEffectList = &m_ParticleEffects[i]; CNewParticleEffect *pParticleEffect = pParticleEffectList->pParticleEffect.GetObject(); if (pParticleEffect->m_pDef() == pDef) { int nControlPointCount = pParticleEffectList->pControlPoints.Count(); for ( int j = 0; j < nControlPointCount; ++j ) { if ( pParticleEffectList->pControlPoints[j].iAttachmentPoint == iAttachmentPoint ) { pParticleEffect->StopEmission( false, bRemoveInstantly ); break; } } } } }
//----------------------------------------------------------------------------- // Purpose: Stop effects from emitting more particles. If no effect is // specified, all effects attached to this entity are stopped. //----------------------------------------------------------------------------- void CParticleProperty::StopEmission( CNewParticleEffect *pEffect, bool bWakeOnStop, bool bDestroyAsleepSystems ) { // If we return from dormancy and are then told to stop emitting, // we should have died while dormant. Remove ourselves immediately. bool bRemoveInstantly = (m_iDormancyChangedAtFrame == gpGlobals->framecount); if ( pEffect ) { if ( FindEffect( pEffect ) != -1 ) { pEffect->StopEmission( false, bRemoveInstantly, bWakeOnStop ); } } else { // Stop all effects float flNow = g_pParticleSystemMgr->GetLastSimulationTime(); int nCount = m_ParticleEffects.Count(); for ( int i = nCount-1; i >= 0; i-- ) { CNewParticleEffect *pTmp = m_ParticleEffects[i].pParticleEffect.GetObject(); bool bRemoveSystem = bRemoveInstantly || ( bDestroyAsleepSystems && ( flNow >= pTmp->m_flNextSleepTime ) ); if ( bRemoveSystem ) { m_ParticleEffects.Remove( i ); pTmp->SetOwner( NULL ); } pTmp->StopEmission( false, bRemoveSystem, !bRemoveSystem && bWakeOnStop ); } } }
//----------------------------------------------------------------------------- // Purpose: Remove effects immediately, including all current particles. If no // effect is specified, all effects attached to this entity are removed. //----------------------------------------------------------------------------- void CParticleProperty::StopEmissionAndDestroyImmediately( CNewParticleEffect *pEffect ) { if ( pEffect ) { int iIndex = FindEffect( pEffect ); //Assert( iIndex != -1 ); if ( iIndex != -1 ) { m_ParticleEffects.Remove( iIndex ); // Clear the owner so it doesn't try to call back to us on deletion pEffect->SetOwner( NULL ); pEffect->StopEmission( false, true ); } } else { // Immediately destroy all effects int nCount = m_ParticleEffects.Count(); for ( int i = nCount-1; i >= 0; i-- ) { CNewParticleEffect *pTmp = m_ParticleEffects[i].pParticleEffect.GetObject(); m_ParticleEffects.Remove( i ); // Clear the owner so it doesn't try to call back to us on deletion pTmp->SetOwner( NULL ); pTmp->StopEmission( false, true ); } } }
//----------------------------------------------------------------------------- // Purpose: Stop all effects that were created using the given definition // name. //----------------------------------------------------------------------------- void CParticleProperty::StopParticlesNamed( const char *pszEffectName, bool bForceRemoveInstantly /* =false */, int nSplitScreenPlayerSlot /*= -1*/ ) { CParticleSystemDefinition *pDef = g_pParticleSystemMgr->FindParticleSystem( pszEffectName ); AssertMsg1(pDef, "Could not find particle definition %s", pszEffectName ); if (!pDef) return; // If we return from dormancy and are then told to stop emitting, // we should have died while dormant. Remove ourselves immediately. bool bRemoveInstantly = (m_iDormancyChangedAtFrame == gpGlobals->framecount); // force remove particles instantly if caller specified bRemoveInstantly |= bForceRemoveInstantly; int nCount = m_ParticleEffects.Count(); for ( int i = 0; i < nCount; ++i ) { // for each effect... CNewParticleEffect *pParticleEffect = m_ParticleEffects[i].pParticleEffect.GetObject(); if (pParticleEffect->m_pDef() == pDef) { if ( nSplitScreenPlayerSlot != -1 ) { if ( !pParticleEffect->ShouldDrawForSplitScreenUser( nSplitScreenPlayerSlot ) ) continue; } pParticleEffect->StopEmission( false, bRemoveInstantly ); } } }