CElementGroup::~CElementGroup() { // Delete all the elements if (!m_elements.empty()) { if (!g_pGame->IsBeingDeleted()) { CEntityRemovePacket removePacket; for (CFastList<CElement*>::iterator iter = m_elements.begin(); iter != m_elements.end(); iter++) { CElement* pElement = (*iter); switch (pElement->GetType()) { case CElement::DATABASE_CONNECTION: case CElement::SCRIPTFILE: continue; default: break; } // Tell everyone to destroy it if this is not a per-player entity if (pElement->IsPerPlayerEntity()) { // Unsync it (will destroy it for those that know about it) CPerPlayerEntity* pEntity = static_cast<CPerPlayerEntity*>(pElement); pEntity->Sync(false); } else { // Tell everyone to destroy it removePacket.Add(pElement); } } g_pGame->GetPlayerManager()->BroadcastOnlyJoined(removePacket); } CElementDeleter* deleter = g_pGame->GetElementDeleter(); CElement* pElement = NULL; for (CFastList<CElement*>::iterator iter = m_elements.begin(); iter != m_elements.end(); iter++) { pElement = *iter; pElement->SetElementGroup(NULL); pElement->DeleteAllEvents(); deleter->Delete(pElement, true, false); } // Do this at the end for speed g_pGame->GetMapManager()->GetRootElement()->UpdatePerPlayerEntities(); } }
void CClientProjectileManager::DoPulse ( void ) { CElementDeleter* pElementDeleter = g_pClientGame->GetElementDeleter(); CClientProjectile* pProjectile = NULL; list < CClientProjectile* > cloneList = m_List; list < CClientProjectile* > ::iterator iter = cloneList.begin (); for ( ; iter != cloneList.end () ; ++iter ) { pProjectile = *iter; // Is this projectile still active? if ( pProjectile->IsActive () ) { pProjectile->DoPulse (); } else { // Remove this projectile m_List.remove ( pProjectile ); pProjectile->m_bLinked = false; pElementDeleter->Delete ( pProjectile ); } } }