Exemple #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();
    }
}