diff options
Diffstat (limited to 'src/map.cpp')
-rw-r--r-- | src/map.cpp | 34 |
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); |