Skip to content
Snippets Groups Projects
Commit b3591019 authored by Perttu Ahola's avatar Perttu Ahola
Browse files

Fix object duplication bug (at least in the most reproducible UFO case)

parent 34e0a0ca
No related branches found
No related tags found
No related merge requests found
......@@ -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="<<id
<<" to it's current block "<<PP(blockpos_o)
<<std::endl;
continue;
}
std::string staticdata_new = obj->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="<<id
<<" from it's previous block "<<PP(old_static_block)
<<std::endl;
continue;
}
block->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;
......
......@@ -54,7 +54,7 @@ class StaticObjectList
public:
/*
Inserts an object to the container.
Id must be unique or 0.
Id must be unique (active) or 0 (stored).
*/
void insert(u16 id, StaticObject obj)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment