void CElement::CallEventNoParent ( const char* szName, const CLuaArguments& Arguments, CElement* pSource, CPlayer* pCaller ) { // Call it on us if this isn't the same class it was raised on if ( pSource != this && m_pEventManager->HasEvents () ) { m_pEventManager->Call ( szName, Arguments, pSource, this, pCaller ); } // Call it on all our children CElementListSnapshot* pList = GetChildrenListSnapshot(); pList->AddRef(); // Keep list alive during use for ( CElementListSnapshot::const_iterator iter = pList->begin() ; iter != pList->end() ; iter++ ) { CElement* pElement = *iter; if ( !pElement->IsBeingDeleted() ) { if ( !pElement->m_pEventManager || pElement->m_pEventManager->HasEvents () || !pElement->m_Children.empty () ) { pElement->CallEventNoParent ( szName, Arguments, pSource, pCaller ); if ( m_bIsBeingDeleted ) break; } } } pList->Release(); }
void CElement::_GetEntitiesFromRoot ( unsigned int uiTypeHash, std::map < CElement*, int >& mapResults ) { t_mapEntitiesFromRoot::iterator find = ms_mapEntitiesFromRoot.find ( uiTypeHash ); if ( find != ms_mapEntitiesFromRoot.end () ) { CChildListType& listEntities = find->second; CElement* pEntity; unsigned int uiIndex = 0; for ( CChildListType::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 ( "Server: 0x%08x %s is flagged as IsBeingDeleted() but is still in GetEntitiesFromRoot\n", pEntity, pEntity->GetTypeName ().c_str () ) ); assert ( mapResults.find ( pEntity ) == mapResults.end () ); mapResults [ pEntity ] = 1; } } }
// Lua push/pop macros for our datatypes CElement* lua_toelement ( lua_State* luaVM, int iArgument ) { if ( lua_type ( luaVM, iArgument ) == LUA_TLIGHTUSERDATA ) { ElementID ID = TO_ELEMENTID ( lua_touserdata ( luaVM, iArgument ) ); CElement* pElement = CElementIDs::GetElement ( ID ); if ( !pElement || pElement->IsBeingDeleted () ) return NULL; return pElement; } else if ( lua_type ( luaVM, iArgument ) == LUA_TUSERDATA ) { ElementID ID = TO_ELEMENTID ( * ( ( void ** ) lua_touserdata ( luaVM, iArgument ) ) ); CElement* pElement = CElementIDs::GetElement ( ID ); if ( !pElement || pElement->IsBeingDeleted () ) return NULL; return pElement; } return NULL; }
CElement* CElement::FindChildIndex ( const char* szName, unsigned int uiIndex, unsigned int& uiCurrentIndex, bool bRecursive ) { assert ( szName ); // Look among our children CChildListType ::const_iterator iter = m_Children.begin (); for ( ; iter != m_Children.end (); iter++ ) { // Name matches? if ( strcmp ( (*iter)->GetName ().c_str (), szName ) == 0 ) { // Does the index match? If it doesn't, increment it and keep searching if ( uiIndex == uiCurrentIndex ) { return *iter; } else { ++uiCurrentIndex; } } // Tell this child to search too if recursive if ( bRecursive ) { CElement* pElement = (*iter)->FindChildIndex ( szName, uiIndex, uiCurrentIndex, true ); if ( pElement ) { if ( pElement->IsBeingDeleted() ) { // If it's being deleted right now we cannot return it. // Since we found a match we have to abort the search here. return NULL; } return pElement; } } } // Doesn't exist within us return NULL; }