Created
October 16, 2013 21:10
-
-
Save celeron55/7014947 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From b3591019ad7e9bdce2a0a20cbbf64a769c1717c2 Mon Sep 17 00:00:00 2001 | |
From: Perttu Ahola <celeron55@gmail.com> | |
Date: Thu, 17 Oct 2013 00:10:16 +0300 | |
Subject: [PATCH] Fix object duplication bug (at least in the most | |
reproducible UFO case) | |
--- | |
src/environment.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ | |
src/staticobject.h | 2 +- | |
2 files changed, 42 insertions(+), 1 deletion(-) | |
diff --git a/src/environment.cpp b/src/environment.cpp | |
index 03b4368..dd160d1 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="<<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; | |
diff --git a/src/staticobject.h b/src/staticobject.h | |
index 640747e..575c15b 100644 | |
--- a/src/staticobject.h | |
+++ b/src/staticobject.h | |
@@ -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) | |
{ | |
-- | |
1.7.12 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment