diff options
author | Weblate <42@minetest.ru> | 2013-04-03 20:32:13 +0200 |
---|---|---|
committer | Weblate <42@minetest.ru> | 2013-04-03 20:32:13 +0200 |
commit | 82709549ff61b4963e8b446fca4ead114650ce1a (patch) | |
tree | 691bea32cd002742a6f844b2fe4e74a08aa95296 /src/mapgen.cpp | |
parent | 6e96bc98ded56ebefb5e597f3d8bee4d4d692dd8 (diff) | |
parent | 9ff8012655f13269f33d406f024374c67b650a9a (diff) | |
download | minetest-82709549ff61b4963e8b446fca4ead114650ce1a.tar.gz minetest-82709549ff61b4963e8b446fca4ead114650ce1a.tar.bz2 minetest-82709549ff61b4963e8b446fca4ead114650ce1a.zip |
Merge remote branch 'origin/master'
Diffstat (limited to 'src/mapgen.cpp')
-rw-r--r-- | src/mapgen.cpp | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/src/mapgen.cpp b/src/mapgen.cpp index b5deaae52..64c1886b3 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -42,7 +42,14 @@ FlagDesc flagdesc_mapgen[] = { {"v6_jungles", MGV6_JUNGLES}, {"v6_biome_blend", MGV6_BIOME_BLEND}, {"flat", MG_FLAT}, - {NULL, 0} + {NULL, 0} +}; + +FlagDesc flagdesc_ore[] = { + {"absheight", OREFLAG_ABSHEIGHT}, + {"scatter_noisedensity", OREFLAG_DENSITY}, + {"claylike_nodeisnt", OREFLAG_NODEISNT}, + {NULL, 0} }; @@ -87,17 +94,28 @@ void Ore::resolveNodeNames(INodeDefManager *ndef) { void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { - if (nmin.Y > height_max || nmax.Y < height_min) + int in_range = 0; + + in_range |= (nmin.Y <= height_max && nmax.Y >= height_min); + if (flags & OREFLAG_ABSHEIGHT) + in_range |= (nmin.Y >= -height_max && nmax.Y <= -height_min) << 1; + if (!in_range) return; - + resolveNodeNames(mg->ndef); MapNode n_ore(ore); ManualMapVoxelManipulator *vm = mg->vm; PseudoRandom pr(blockseed); + int ymin, ymax; - int ymin = MYMAX(nmin.Y, height_min); - int ymax = MYMIN(nmax.Y, height_max); + if (in_range & ORE_RANGE_MIRROR) { + ymin = MYMAX(nmin.Y, -height_max); + ymax = MYMIN(nmax.Y, -height_min); + } else { + ymin = MYMAX(nmin.Y, height_min); + ymax = MYMIN(nmax.Y, height_max); + } if (clust_size >= ymax - ymin + 1) return; @@ -131,17 +149,29 @@ void OreScatter::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { void OreSheet::generate(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax) { - if (nmin.Y > height_max || nmax.Y < height_min) - return; + int in_range = 0; + in_range |= (nmin.Y <= height_max && nmax.Y >= height_min); + if (flags & OREFLAG_ABSHEIGHT) + in_range |= (nmin.Y >= -height_max && nmax.Y <= -height_min) << 1; + if (!in_range) + return; + resolveNodeNames(mg->ndef); MapNode n_ore(ore); ManualMapVoxelManipulator *vm = mg->vm; PseudoRandom pr(blockseed + 4234); + int ymin, ymax; - int ymin = MYMAX(nmin.Y, height_min); - int ymax = MYMIN(nmax.Y, height_max); + if (in_range & ORE_RANGE_MIRROR) { + ymin = MYMAX(nmin.Y, -height_max); + ymax = MYMIN(nmax.Y, -height_min); + } else { + ymin = MYMAX(nmin.Y, height_min); + ymax = MYMIN(nmax.Y, height_max); + } + if (clust_size >= ymax - ymin + 1) return; |