void CSector::GoAwake() { ADDTOCALLSTACK("CSector::GoAwake"); ProfileTask charactersTask(PROFILE_TIMERS); CTimedObject::GoAwake(); // Awake it first, otherwise other things won't work. CChar * pCharNext = nullptr; CChar * pChar = static_cast <CChar*>(m_Chars_Active.GetHead()); for (; pChar != nullptr; pChar = pCharNext) { pCharNext = pChar->GetNext(); if (pChar->IsSleeping()) pChar->GoAwake(); } pChar = static_cast<CChar*>(m_Chars_Disconnect.GetHead()); for (; pChar != nullptr; pChar = pCharNext) { pCharNext = pChar->GetNext(); if (pChar->IsSleeping()) pChar->GoAwake(); } CItem * pItemNext = nullptr; CItem * pItem = static_cast <CItem*>(m_Items_Timer.GetHead()); for (; pItem != nullptr; pItem = pItemNext) { pItemNext = pItem->GetNext(); if (pItem->IsSleeping()) pItem->GoAwake(); } pItem = static_cast <CItem*>(m_Items_Inert.GetHead()); for (; pItem != nullptr; pItem = pItemNext) { pItemNext = pItem->GetNext(); if (pItem->IsSleeping()) pItem->GoAwake(); } /* * Awake adjacent sectors when awaking this one to avoid the effect * of NPCs being stop until you enter the sector, or all the spawns * generating NPCs at once. */ static CSector *pCentral = nullptr; // do this only for the awaken sector if (!pCentral) { pCentral = this; for (int i = 0; i < (int)DIR_QTY; ++i) { CSector *pSector = GetAdjacentSector((DIR_TYPE)i); if (pSector && !pSector->IsSleeping()) { pSector->GoAwake(); } } pCentral = nullptr; } OnTick(); // Unknown time passed, make the sector tick now to reflect any possible environ changes. }
void CSector::GoSleep() { ADDTOCALLSTACK("CSector::Sleep"); ProfileTask charactersTask(PROFILE_TIMERS); CTimedObject::GoSleep(); CChar * pCharNext = nullptr; CChar * pChar = static_cast <CChar*>(m_Chars_Active.GetHead()); for (; pChar != nullptr; pChar = pCharNext) { pCharNext = pChar->GetNext(); if (!pChar->IsSleeping()) pChar->GoSleep(); } CItem * pItemNext = nullptr; CItem * pItem = static_cast <CItem*>(m_Items_Timer.GetHead()); for (; pItem != nullptr; pItem = pItemNext) { pItemNext = pItem->GetNext(); if (!pItem->IsSleeping()) pItem->GoSleep(); } pItemNext = nullptr; pItem = static_cast <CItem*>(m_Items_Inert.GetHead()); for (; pItem != nullptr; pItem = pItemNext) { pItemNext = pItem->GetNext(); if (!pItem->IsSleeping()) pItem->GoSleep(); } }