示例#1
0
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 );
        }
    }
}