diff options
author | kwolekr <kwolekr@minetest.net> | 2015-08-15 14:03:36 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-08-16 15:55:07 -0400 |
commit | bcf38a2ad19116b50d0456bdd6f79d0d218e39d1 (patch) | |
tree | d56db4bc83c85d00a13dab8615c5661665b78922 /src | |
parent | 5556ba168fb8bb3c234311564de36c4b130c8ab1 (diff) | |
download | minetest-bcf38a2ad19116b50d0456bdd6f79d0d218e39d1.tar.gz minetest-bcf38a2ad19116b50d0456bdd6f79d0d218e39d1.tar.bz2 minetest-bcf38a2ad19116b50d0456bdd6f79d0d218e39d1.zip |
SEnv: Remove static_exists from ActiveObjects in deleted blocks
Diffstat (limited to 'src')
-rw-r--r-- | src/environment.cpp | 28 | ||||
-rw-r--r-- | src/environment.h | 5 | ||||
-rw-r--r-- | src/script/lua_api/l_env.cpp | 6 |
3 files changed, 36 insertions, 3 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index 5bed11476..dbbfc6f1f 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -1424,6 +1424,33 @@ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, } } +void ServerEnvironment::setStaticForActiveObjectsInBlock( + v3s16 blockpos, bool static_exists, v3s16 static_block) +{ + MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); + if (!block) + return; + + for (std::map<u16, StaticObject>::iterator + so_it = block->m_static_objects.m_active.begin(); + so_it != block->m_static_objects.m_active.end(); ++so_it) { + // Get the ServerActiveObject counterpart to this StaticObject + std::map<u16, ServerActiveObject *>::iterator ao_it; + ao_it = m_active_objects.find(so_it->first); + if (ao_it == m_active_objects.end()) { + // If this ever happens, there must be some kind of nasty bug. + errorstream << "ServerEnvironment::setStaticForObjectsInBlock(): " + "Object from MapBlock::m_static_objects::m_active not found " + "in m_active_objects"; + continue; + } + + ServerActiveObject *sao = ao_it->second; + sao->m_static_exists = static_exists; + sao->m_static_block = static_block; + } +} + ActiveObjectMessage ServerEnvironment::getActiveObjectMessage() { if(m_active_object_messages.empty()) @@ -1960,7 +1987,6 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) } } - #ifndef SERVER #include "clientsimpleobject.h" diff --git a/src/environment.h b/src/environment.h index 2bc128f40..c70694316 100644 --- a/src/environment.h +++ b/src/environment.h @@ -327,6 +327,11 @@ public: std::set<v3s16>* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; + // Sets the static object status all the active objects in the specified block + // This is only really needed for deleting blocks from the map + void setStaticForActiveObjectsInBlock(v3s16 blockpos, + bool static_exists, v3s16 static_block=v3s16(0,0,0)); + private: /* diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 9d1936769..28afdd071 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -773,10 +773,12 @@ int ModApiEnvMod::l_delete_area(lua_State *L) for (s16 y = bpmin.Y; y <= bpmax.Y; y++) for (s16 x = bpmin.X; x <= bpmax.X; x++) { v3s16 bp(x, y, z); - if (map.deleteBlock(bp)) + if (map.deleteBlock(bp)) { + env->setStaticForActiveObjectsInBlock(bp, false); event.modified_blocks.insert(bp); - else + } else { success = false; + } } map.dispatchEvent(&event); |