- s16 d_max = g_settings.getS16("active_object_range");
-
- // Number of blocks whose objects were written to bos
- u16 blockcount = 0;
-
- std::ostringstream bos(std::ios_base::binary);
-
- for(s16 d = 0; d <= d_max; d++)
- {
- core::list<v3s16> list;
- getFacePositions(list, d);
-
- core::list<v3s16>::Iterator li;
- for(li=list.begin(); li!=list.end(); li++)
- {
- v3s16 p = *li + center;
-
- /*
- Ignore blocks that haven't been sent to the client
- */
- {
- if(m_blocks_sent.find(p) == NULL)
- continue;
- }
-
- // Try stepping block and add it to a send queue
- try
- {
-
- // Get block
- MapBlock *block = server->m_env.getMap().getBlockNoCreate(p);
-
- /*
- Step block if not in stepped_blocks and add to stepped_blocks.
- */
- if(stepped_blocks.find(p) == NULL)
- {
- block->stepObjects(dtime, true, server->m_env.getDayNightRatio());
- stepped_blocks.insert(p, true);
- block->setChangedFlag();
- }
-
- // Skip block if there are no objects
- if(block->getObjectCount() == 0)
- continue;
-
- /*
- Write objects
- */
-
- // Write blockpos
- writeV3S16(buf, p);
- bos.write((char*)buf, 6);
-
- // Write objects
- //block->serializeObjects(bos, serialization_version); // DEPRECATED
- // count=0
- writeU16(bos, 0);
-
- blockcount++;
-
- /*
- Stop collecting objects if data is already too big
- */
- // Sum of player and object data sizes
- s32 sum = (s32)os.tellp() + 2 + (s32)bos.tellp();
- // break out if data too big
- if(sum > MAX_OBJECTDATA_SIZE)
- {
- goto skip_subsequent;
- }
-
- } //try
- catch(InvalidPositionException &e)
- {
- // Not in memory
- // Add it to the emerge queue and trigger the thread.
- // Fetch the block only if it is on disk.
-
- // Grab and increment counter
- /*SharedPtr<JMutexAutoLock> lock
- (m_num_blocks_in_emerge_queue.getLock());
- m_num_blocks_in_emerge_queue.m_value++;*/
-
- // Add to queue as an anonymous fetch from disk
- u8 flags = BLOCK_EMERGE_FLAG_FROMDISK;
- server->m_emerge_queue.addBlock(0, p, flags);
- server->m_emergethread.trigger();
- }
- }
- }
-
-skip_subsequent:
-