Ensure that Map::findNodesWithMetadata() reports nodes strictly within the node-granu...
authorkwolekr <kwolekr@minetest.net>
Fri, 8 May 2015 17:31:03 +0000 (13:31 -0400)
committerkwolekr <kwolekr@minetest.net>
Fri, 8 May 2015 17:31:03 +0000 (13:31 -0400)
src/map.cpp

index 7f8059cc480e6f7825f9b25a8d1e9da7a1994418..47c66055d6cf4cb63c5e0d2defe6699acd30e4a2 100644 (file)
@@ -1898,6 +1898,8 @@ std::vector<v3s16> Map::findNodesWithMetadata(v3s16 p1, v3s16 p2)
        v3s16 bpmin = getNodeBlockPos(p1);
        v3s16 bpmax = getNodeBlockPos(p2);
 
+       VoxelArea area(p1, p2);
+
        for (s16 z = bpmin.Z; z <= bpmax.Z; z++)
        for (s16 y = bpmin.Y; y <= bpmax.Y; y++)
        for (s16 x = bpmin.X; x <= bpmax.X; x++) {
@@ -1917,8 +1919,13 @@ std::vector<v3s16> Map::findNodesWithMetadata(v3s16 p1, v3s16 p2)
 
                v3s16 p_base = blockpos * MAP_BLOCKSIZE;
                std::vector<v3s16> keys = block->m_node_metadata.getAllKeys();
-               for (size_t i = 0; i != keys.size(); i++)
-                       positions_with_meta.push_back(keys[i] + p_base);
+               for (size_t i = 0; i != keys.size(); i++) {
+                       v3s16 p(keys[i] + p_base);
+                       if (!area.contains(p))
+                               continue;
+
+                       positions_with_meta.push_back(p);
+               }
        }
 
        return positions_with_meta;