void ObjectAccessor::Update(uint32 diff) { UpdateDataMapType update_players; { Guard guard(i_updateGuard); while(!i_objects.empty()) { Object* obj = *i_objects.begin(); assert(obj && obj->IsInWorld()); i_objects.erase(i_objects.begin()); if (!obj) continue; //obj->BuildUpdateData(update_players); } } WorldPacket packet; // here we allocate a std::vector with a size of 0x10000 for(UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter) { iter->second.BuildPacket(&packet); iter->first->GetSession()->SendPacket(&packet); packet.clear(); // clean the string } }
void ObjectAccessor::Update(uint32 /*diff*/) { UpdateDataMapType update_players; // Critical section { ACE_GUARD(LockType, g, i_updateGuard); while (!i_objects.empty()) { Object* obj = *i_objects.begin(); ASSERT(obj && obj->IsInWorld()); i_objects.erase(i_objects.begin()); obj->BuildUpdate(update_players); } } WorldPacket packet; // here we allocate a std::vector with a size of 0x10000 for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter) { iter->second.BuildPacket(&packet); iter->first->GetSession()->SendPacket(&packet); packet.clear(); // clean the string } }
void MapCell::RemoveObjects() { ObjectSet::iterator itr; uint32 count = 0; //uint32 ltime = getMSTime(); //Zack : we are delaying cell removal so transports can see objects far away. We are waiting for the event to remove us if (_unloadpending == true) return; /* delete objects in pending respawn state */ for (itr = _respawnObjects.begin(); itr != _respawnObjects.end(); ++itr) { switch ((*itr)->GetTypeId()) { case TYPEID_UNIT: { if (!(*itr)->IsPet()) { _mapmgr->_reusable_guids_creature.push_back((*itr)->GetUIdFromGUID()); static_cast<Creature*>(*itr)->m_respawnCell = NULL; delete static_cast<Creature*>(*itr); } }break; case TYPEID_GAMEOBJECT: { _mapmgr->_reusable_guids_gameobject.push_back((*itr)->GetUIdFromGUID()); static_cast<GameObject*>(*itr)->m_respawnCell = NULL; delete static_cast<GameObject*>(*itr); }break; } } _respawnObjects.clear(); //This time it's simpler! We just remove everything :) for (itr = _objects.begin(); itr != _objects.end();) { count++; Object *obj = (*itr); itr++; //zack : we actually never set this to null. Useless check for lucky memory corruption hit. if (!obj) continue; if (_unloadpending) { if (obj->GetTypeFromGUID() == HIGHGUID_TYPE_TRANSPORTER) continue; if (obj->GetTypeId() == TYPEID_CORPSE && obj->GetUInt32Value(CORPSE_FIELD_OWNER) != 0) continue; if (!obj->m_loadedFromDB) continue; } if (obj->Active) obj->Deactivate(_mapmgr); if (obj->IsInWorld()) obj->RemoveFromWorld(true); delete obj; } _objects.clear(); _playerCount = 0; _loaded = false; }
void MapCell::RemoveObjects() { ObjectSet::iterator itr; //uint32 ltime = getMSTime(); /* delete objects in pending respawn state */ Object* pObject; for(itr = _respawnObjects.begin(); itr != _respawnObjects.end(); ++itr) { pObject = *itr; if(!pObject) continue; switch(pObject->GetTypeId()) { case TYPEID_UNIT: { if( pObject->IsVehicle() ) { _mapmgr->_reusable_guids_vehicle.push_back( pObject->GetUIdFromGUID() ); TO_VEHICLE(pObject)->m_respawnCell=NULL; TO_VEHICLE(pObject)->Destructor(); } else if( !pObject->IsPet() ) { _mapmgr->_reusable_guids_creature.push_back( pObject->GetUIdFromGUID() ); TO_CREATURE(pObject)->m_respawnCell=NULL; TO_CREATURE(pObject)->Destructor(); } }break; case TYPEID_GAMEOBJECT: { TO_GAMEOBJECT(pObject)->m_respawnCell=NULL; TO_GAMEOBJECT(pObject)->Destructor(); }break; default: pObject->Destructor(); break; } } _respawnObjects.clear(); //This time it's simpler! We just remove everything :) Object* obj; //do this outside the loop! for(itr = _objects.begin(); itr != _objects.end();) { obj = (*itr); itr++; if(!obj) continue; if( _unloadpending ) { if(obj->GetTypeFromGUID() == HIGHGUID_TYPE_TRANSPORTER) continue; if(obj->GetTypeId()==TYPEID_CORPSE && obj->GetUInt32Value(CORPSE_FIELD_OWNER) != 0) continue; if(!obj->m_loadedFromDB) continue; } if( obj->Active ) obj->Deactivate( _mapmgr ); if( obj->IsInWorld()) obj->RemoveFromWorld( true ); obj->Destructor(); } _playerCount = 0; _loaded = false; }
void MapCell::RemoveObjects() { ObjectSet::iterator itr; uint32 count = 0; //uint32 ltime = getMSTime(); /* delete objects in pending respawn state */ for(itr = _respawnObjects.begin(); itr != _respawnObjects.end(); ++itr) { switch((*itr)->GetTypeId()) { case TYPEID_UNIT: { if( !(*itr)->IsPet() ) { _mapmgr->_reusable_guids_creature.push_back( (*itr)->GetUIdFromGUID() ); static_cast< Creature* >( *itr )->m_respawnCell=NULL; delete static_cast< Creature* >( *itr ); } }break; case TYPEID_GAMEOBJECT: { static_cast< GameObject* >( *itr )->m_respawnCell=NULL; delete static_cast< GameObject* >( *itr ); }break; } } _respawnObjects.clear(); //This time it's simpler! We just remove everything :) for(itr = _objects.begin(); itr != _objects.end(); ) { count++; Object *obj = (*itr); itr++; if(!obj) continue; if( _unloadpending ) { if(obj->GetTypeFromGUID() == HIGHGUID_TYPE_TRANSPORTER) continue; if(obj->GetTypeId()==TYPEID_CORPSE && obj->GetUInt32Value(CORPSE_FIELD_OWNER) != 0) continue; if(!obj->m_loadedFromDB) continue; } if( obj->Active ) obj->Deactivate( _mapmgr ); if( obj->IsInWorld() ) obj->RemoveFromWorld( true ); delete obj; } _playerCount = 0; _loaded = false; }
void MapMgr::_UpdateObjects() { if(!_updates.size() && !_processQueue.size()) return; Object *pObj; Player *pOwner; //std::set<Object*>::iterator it_start, it_end, itr; std::set<Player*>::iterator it_start, it_end, itr; Player * lplr; ByteBuffer update(2500); uint32 count = 0; m_updateMutex.Acquire(); UpdateQueue::iterator iter = _updates.begin(); PUpdateQueue::iterator it, eit; for(; iter != _updates.end();) { pObj = *iter; ++iter; if(!pObj) continue; if(pObj->GetTypeId() == TYPEID_ITEM || pObj->GetTypeId() == TYPEID_CONTAINER) { // our update is only sent to the owner here. pOwner = static_cast< Item* >(pObj)->GetOwner(); if( pOwner != NULL ) { count = static_cast< Item* >( pObj )->BuildValuesUpdateBlockForPlayer( &update, pOwner ); // send update to owner if( count ) { pOwner->PushUpdateData( &update, count ); update.clear(); } } } else { if( pObj->IsInWorld() ) { // players have to receive their own updates ;) if( pObj->GetTypeId() == TYPEID_PLAYER ) { // need to be different! ;) count = pObj->BuildValuesUpdateBlockForPlayer( &update, static_cast< Player* >( pObj ) ); if( count ) { static_cast< Player* >( pObj )->PushUpdateData( &update, count ); update.clear(); } } if( pObj->IsUnit() && pObj->HasUpdateField( UNIT_FIELD_HEALTH ) ) static_cast< Unit* >( pObj )->EventHealthChangeSinceLastUpdate(); // build the update count = pObj->BuildValuesUpdateBlockForPlayer( &update, static_cast< Player* >( NULL ) ); if( count ) { it_start = pObj->GetInRangePlayerSetBegin(); it_end = pObj->GetInRangePlayerSetEnd(); for(itr = it_start; itr != it_end;) { lplr = *itr; ++itr; // Make sure that the target player can see us. if( lplr->GetTypeId() == TYPEID_PLAYER && lplr->IsVisible( pObj ) ) lplr->PushUpdateData( &update, count ); } update.clear(); } } } pObj->ClearUpdateMask(); } _updates.clear(); m_updateMutex.Release(); // generate pending a9packets and send to clients. Player *plyr; for(it = _processQueue.begin(); it != _processQueue.end();) { plyr = *it; eit = it; ++it; _processQueue.erase(eit); if(plyr->GetMapMgr() == this) plyr->ProcessPendingUpdates(); } }
void MapCell::RemoveEventIdObjects(uint8 eventToRemove) { if(!eventToRemove) return; ObjectSet::iterator itr; /* delete objects in pending respawn state */ Object* pObject; if(_respawnObjects.size()) { for(itr = _respawnObjects.begin(); itr != _respawnObjects.end();) { pObject = (*itr); ++itr; if(!pObject) continue; switch(pObject->GetTypeId()) { case TYPEID_UNIT: { if(!(TO_CREATURE(pObject)->m_spawn->eventinfo->eventchangesflag & EVENTID_FLAG_SPAWN)) continue; if(TO_CREATURE(pObject)->m_spawn->eventid == eventToRemove) { if( pObject->IsVehicle()) { _mapmgr->_reusable_guids_vehicle.push_back( pObject->GetUIdFromGUID() ); TO_VEHICLE(pObject)->m_respawnCell=NULL; TO_VEHICLE(pObject)->Destructor(); _respawnObjects.erase(pObject); } else if( !pObject->IsPet() ) { _mapmgr->_reusable_guids_creature.push_back( pObject->GetUIdFromGUID() ); TO_CREATURE(pObject)->m_respawnCell=NULL; TO_CREATURE(pObject)->Destructor(); _respawnObjects.erase(pObject); } } }break; case TYPEID_GAMEOBJECT: { if(!(TO_GAMEOBJECT(pObject)->m_spawn->eventinfo->eventchangesflag & EVENTID_FLAG_SPAWN)) continue; if(TO_GAMEOBJECT(pObject)->m_spawn->eventid == eventToRemove) { TO_GAMEOBJECT(pObject)->m_respawnCell=NULL; TO_GAMEOBJECT(pObject)->Destructor(); _respawnObjects.erase(pObject); }break; } } } } if(_objects.size()) { for(itr = _objects.begin(); itr != _objects.end();) { pObject = (*itr); ++itr; if(!pObject) continue; switch(pObject->GetTypeId()) { case TYPEID_UNIT: { if( pObject->IsPet() ) continue; if(TO_CREATURE(pObject)->m_spawn->eventid != eventToRemove) continue; if(!(TO_CREATURE(pObject)->m_spawn->eventinfo->eventchangesflag & EVENTID_FLAG_SPAWN)) continue; }break; case TYPEID_GAMEOBJECT: { if(TO_GAMEOBJECT(pObject)->m_spawn->eventid != eventToRemove) continue; if(!(TO_GAMEOBJECT(pObject)->m_spawn->eventinfo->eventchangesflag & EVENTID_FLAG_SPAWN)) continue; }break; default: { continue; }break; } if( _unloadpending ) { if(!pObject->m_loadedFromDB) continue; } if( pObject->Active ) pObject->Deactivate( _mapmgr ); if( pObject->IsInWorld() ) pObject->RemoveFromWorld( true ); pObject->Destructor(); } } }