summaryrefslogtreecommitdiff
path: root/src/map.cpp
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2015-05-05 14:30:46 -0400
committerkwolekr <kwolekr@minetest.net>2015-05-05 16:21:59 -0400
commitb785577f03d00c83236782876def4c900edbba4e (patch)
tree389f3baa9e4b3d6abcab1d752a248bcdc933b52d /src/map.cpp
parentb45df9d6a73d97671cbdd38d77e9b153a80fb458 (diff)
downloadminetest-b785577f03d00c83236782876def4c900edbba4e.tar.gz
minetest-b785577f03d00c83236782876def4c900edbba4e.tar.bz2
minetest-b785577f03d00c83236782876def4c900edbba4e.zip
Add core.find_nodes_with_meta() script API
Diffstat (limited to 'src/map.cpp')
-rw-r--r--src/map.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/map.cpp b/src/map.cpp
index 9fead00c6..7f8059cc4 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -1890,6 +1890,40 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
}
}
+std::vector<v3s16> Map::findNodesWithMetadata(v3s16 p1, v3s16 p2)
+{
+ std::vector<v3s16> positions_with_meta;
+
+ sortBoxVerticies(p1, p2);
+ v3s16 bpmin = getNodeBlockPos(p1);
+ v3s16 bpmax = getNodeBlockPos(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++) {
+ v3s16 blockpos(x, y, z);
+
+ MapBlock *block = getBlockNoCreateNoEx(blockpos);
+ if (!block) {
+ verbosestream << "Map::getNodeMetadata(): Need to emerge "
+ << PP(blockpos) << std::endl;
+ block = emergeBlock(blockpos, false);
+ }
+ if (!block) {
+ infostream << "WARNING: Map::getNodeMetadata(): Block not found"
+ << std::endl;
+ continue;
+ }
+
+ 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);
+ }
+
+ return positions_with_meta;
+}
+
NodeMetadata *Map::getNodeMetadata(v3s16 p)
{
v3s16 blockpos = getNodeBlockPos(p);