void CClientEntity::_GetEntitiesFromRoot ( unsigned int uiTypeHash, std::map < CClientEntity*, int >& mapResults ) { t_mapEntitiesFromRoot::iterator find = ms_mapEntitiesFromRoot.find ( uiTypeHash ); if ( find != ms_mapEntitiesFromRoot.end () ) { CFromRootListType& listEntities = find->second; CClientEntity* pEntity; unsigned int uiIndex = 0; for ( CFromRootListType::const_reverse_iterator i = listEntities.rbegin (); i != listEntities.rend (); ++i ) { pEntity = *i; assert ( pEntity ); ElementID ID = pEntity->GetID (); assert ( ID != INVALID_ELEMENT_ID ); assert ( pEntity == CElementIDs::GetElement ( ID ) ); if ( pEntity->IsBeingDeleted () ) OutputDebugString ( SString ( "Client: 0x%08x %s is flagged as IsBeingDeleted() but is still in GetEntitiesFromRoot\n", pEntity, pEntity->GetTypeName () ) ); assert ( mapResults.find ( pEntity ) == mapResults.end () ); mapResults [ pEntity ] = 1; } } }
void CClientEntity::GetEntitiesFromRoot ( unsigned int uiTypeHash, lua_State* luaVM, bool bStreamedIn ) { #if CHECK_ENTITIES_FROM_ROOT _CheckEntitiesFromRoot ( uiTypeHash ); #endif t_mapEntitiesFromRoot::iterator find = ms_mapEntitiesFromRoot.find ( uiTypeHash ); if ( find != ms_mapEntitiesFromRoot.end () ) { CFromRootListType& listEntities = find->second; CClientEntity* pEntity; unsigned int uiIndex = 0; for ( CFromRootListType::reverse_iterator i = listEntities.rbegin (); i != listEntities.rend (); ++i ) { pEntity = *i; // Only streamed in elements? if ( !bStreamedIn || !pEntity->IsStreamingCompatibleClass() || reinterpret_cast < CClientStreamElement* > ( pEntity )->IsStreamedIn() ) { // Add it to the table lua_pushnumber ( luaVM, ++uiIndex ); pEntity->PushStack( luaVM ); lua_settable ( luaVM, -3 ); } } } }
void CElement::GetEntitiesFromRoot ( unsigned int uiTypeHash, lua_State* pLua ) { #if CHECK_ENTITIES_FROM_ROOT _CheckEntitiesFromRoot ( uiTypeHash ); #endif t_mapEntitiesFromRoot::iterator find = ms_mapEntitiesFromRoot.find ( uiTypeHash ); if ( find != ms_mapEntitiesFromRoot.end () ) { CFromRootListType& listEntities = find->second; CElement* pEntity; unsigned int uiIndex = 0; for ( CChildListType::const_reverse_iterator i = listEntities.rbegin (); i != listEntities.rend (); ++i ) { pEntity = *i; // Add it to the table lua_pushnumber ( pLua, ++uiIndex ); lua_pushelement ( pLua, pEntity ); lua_settable ( pLua, -3 ); } } }
void CClientEntity::RemoveEntityFromRoot ( unsigned int uiTypeHash, CClientEntity* pEntity ) { // Remove from list t_mapEntitiesFromRoot::iterator find = ms_mapEntitiesFromRoot.find ( uiTypeHash ); if ( find != ms_mapEntitiesFromRoot.end () ) { CFromRootListType& listEntities = find->second; listEntities.remove ( pEntity ); if ( listEntities.size () == 0 ) ms_mapEntitiesFromRoot.erase ( find ); } // Apply to child elements as well CChildListType ::const_iterator iter = pEntity->IterBegin (); for ( ; iter != pEntity->IterEnd (); iter++ ) CClientEntity::RemoveEntityFromRoot ( (*iter)->GetTypeHash (), *iter ); }
void CElement::GetEntitiesFromRoot(unsigned int uiTypeHash, std::vector<CElement*>& outResult) { #if CHECK_ENTITIES_FROM_ROOT _CheckEntitiesFromRoot(uiTypeHash); #endif t_mapEntitiesFromRoot::iterator find = ms_mapEntitiesFromRoot.find(uiTypeHash); if (find != ms_mapEntitiesFromRoot.end()) { CFromRootListType& listEntities = find->second; CElement* pEntity; for (CChildListType::const_reverse_iterator i = listEntities.rbegin(); i != listEntities.rend(); ++i) { pEntity = *i; // Add it to the result outResult.push_back(pEntity); } } }