From ff740a417946abb003426734645f823458eee9f3 Mon Sep 17 00:00:00 2001
From: kwolekr <kwolekr@minetest.net>
Date: Fri, 8 May 2015 13:31:03 -0400
Subject: [PATCH] Ensure that Map::findNodesWithMetadata() reports nodes
 strictly within the node-granular area

---
 src/map.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/map.cpp b/src/map.cpp
index 7f8059cc4..47c66055d 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -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;
-- 
GitLab