From b3591019ad7e9bdce2a0a20cbbf64a769c1717c2 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Thu, 17 Oct 2013 00:10:16 +0300 Subject: Fix object duplication bug (at least in the most reproducible UFO case) --- src/environment.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/environment.cpp') diff --git a/src/environment.cpp b/src/environment.cpp index 03b436890..dd160d1f7 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -1805,6 +1805,47 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) // The block in which the object resides in v3s16 blockpos_o = getNodeBlockPos(floatToInt(objectpos, BS)); + // If object's static data is stored in a deactivated block and object + // is actually located in an active block, re-save to the block in + // which the object is actually located in. + if(!force_delete && + obj->m_static_exists && + !m_active_blocks.contains(obj->m_static_block) && + m_active_blocks.contains(blockpos_o)) + { + v3s16 old_static_block = obj->m_static_block; + + // Save to block where object is located + MapBlock *block = m_map->emergeBlock(blockpos_o, false); + if(!block){ + errorstream<<"ServerEnvironment::deactivateFarObjects(): " + <<"Could not save object id="<getStaticData(); + StaticObject s_obj(obj->getType(), objectpos, staticdata_new); + block->m_static_objects.insert(id, s_obj); + obj->m_static_block = blockpos_o; + block->raiseModified(MOD_STATE_WRITE_NEEDED, + "deactivateFarObjects: Static data moved in"); + + // Delete from block where object was located + block = m_map->emergeBlock(old_static_block, false); + if(!block){ + errorstream<<"ServerEnvironment::deactivateFarObjects(): " + <<"Could not delete object id="<m_static_objects.remove(id); + block->raiseModified(MOD_STATE_WRITE_NEEDED, + "deactivateFarObjects: Static data moved out"); + continue; + } + // If block is active, don't remove if(!force_delete && m_active_blocks.contains(blockpos_o)) continue; -- cgit v1.2.3