forked from Mirrorlandia_minetest/minetest
Fix object duplication bug (at least in the most reproducible UFO case)
This commit is contained in:
parent
34e0a0ca0f
commit
b3591019ad
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user