SEnv: Remove static_exists from ActiveObjects in deleted blocks

This commit is contained in:
kwolekr 2015-08-15 14:03:36 -04:00
parent 5556ba168f
commit bcf38a2ad1
3 changed files with 36 additions and 3 deletions

@ -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() ActiveObjectMessage ServerEnvironment::getActiveObjectMessage()
{ {
if(m_active_object_messages.empty()) if(m_active_object_messages.empty())
@ -1960,7 +1987,6 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
} }
} }
#ifndef SERVER #ifndef SERVER
#include "clientsimpleobject.h" #include "clientsimpleobject.h"

@ -327,6 +327,11 @@ public:
std::set<v3s16>* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; 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: private:
/* /*

@ -773,11 +773,13 @@ int ModApiEnvMod::l_delete_area(lua_State *L)
for (s16 y = bpmin.Y; y <= bpmax.Y; y++) for (s16 y = bpmin.Y; y <= bpmax.Y; y++)
for (s16 x = bpmin.X; x <= bpmax.X; x++) { for (s16 x = bpmin.X; x <= bpmax.X; x++) {
v3s16 bp(x, y, z); v3s16 bp(x, y, z);
if (map.deleteBlock(bp)) if (map.deleteBlock(bp)) {
env->setStaticForActiveObjectsInBlock(bp, false);
event.modified_blocks.insert(bp); event.modified_blocks.insert(bp);
else } else {
success = false; success = false;
} }
}
map.dispatchEvent(&event); map.dispatchEvent(&event);
lua_pushboolean(L, success); lua_pushboolean(L, success);