diff options
author | Perttu Ahola <celeron55@gmail.com> | 2012-09-09 14:18:14 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-09-09 16:11:05 +0300 |
commit | 1cc1b93e65d6d88e20786383cb09caf22a8c6494 (patch) | |
tree | 325b714495c67769c1417504a00d56c5de774555 | |
parent | c4f400acd01d1951c6355e2eec42d10d0a2d871a (diff) | |
download | minetest-1cc1b93e65d6d88e20786383cb09caf22a8c6494.tar.gz minetest-1cc1b93e65d6d88e20786383cb09caf22a8c6494.tar.bz2 minetest-1cc1b93e65d6d88e20786383cb09caf22a8c6494.zip |
Fix ServerActiveObject stuff
-rw-r--r-- | src/environment.cpp | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index 05629b09d..10ebd4127 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -743,19 +743,25 @@ neighbor_found: u32 active_object_count = block->m_static_objects.m_active.size(); // Find out how many objects this and all the neighbors contain u32 active_object_count_wider = 0; + u32 wider_unknown_count = 0; for(s16 x=-1; x<=1; x++) for(s16 y=-1; y<=1; y++) for(s16 z=-1; z<=1; z++) { MapBlock *block2 = map->getBlockNoCreateNoEx( block->getPos() + v3s16(x,y,z)); - if(block2==NULL) + if(block2==NULL){ + wider_unknown_count = 0; continue; + } active_object_count_wider += block2->m_static_objects.m_active.size() + block2->m_static_objects.m_stored.size(); } - + // Extrapolate + u32 wider_known_count = 3*3*3 - wider_unknown_count; + active_object_count_wider += wider_unknown_count * active_object_count_wider / wider_known_count; + // Call all the trigger variations i->abm->trigger(m_env, p, n); i->abm->trigger(m_env, p, n, @@ -1465,9 +1471,10 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, "addActiveObjectRaw"); } else{ + v3s16 p = floatToInt(objectpos, BS); errorstream<<"ServerEnvironment::addActiveObjectRaw(): " <<"could not find block for storing id="<<object->getId() - <<" statically"<<std::endl; + <<" statically (pos="<<PP(p)<<")"<<std::endl; } } @@ -1756,7 +1763,12 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) // Add to the block where the object is located in v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); // Get or generate the block - MapBlock *block = m_map->emergeBlock(blockpos); + MapBlock *block = NULL; + try{ + block = m_map->emergeBlock(blockpos); + } catch(InvalidPositionException &e){ + // Handled via NULL pointer + } if(block) { @@ -1793,9 +1805,10 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) } else{ if(!force_delete){ + v3s16 p = floatToInt(objectpos, BS); errorstream<<"ServerEnv: Could not find or generate " <<"a block for storing id="<<obj->getId() - <<" statically"<<std::endl; + <<" statically (pos="<<PP(p)<<")"<<std::endl; continue; } } |