Example #1
0
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
    }
}
Example #2
0
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
    }
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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();
	}
}
Example #7
0
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();
		}
	}
}