Revert "Ores: Make 'absheight' flag non-functional"
authorLoic Blot <loic.blot@unix-experience.fr>
Sun, 25 Jun 2017 21:08:31 +0000 (23:08 +0200)
committerLoic Blot <loic.blot@unix-experience.fr>
Sun, 25 Jun 2017 21:08:31 +0000 (23:08 +0200)
This reverts commit 90ed6fc732ca667ca970b7c38d39c809e5c3553e.

doc/lua_api.txt
src/mg_ore.cpp
src/mg_ore.h

index 63d090ebe30b0cbcae02ad0c0a36814a26843707..540bbe1180b7bc90266f2a400852773c2fa50545 100644 (file)
@@ -1076,7 +1076,12 @@ Ore attributes
 See section "Flag Specifier Format".
 
 Currently supported flags:
-`puff_cliffs`, `puff_additive_composition`.
+`absheight`, `puff_cliffs`, `puff_additive_composition`.
+
+### `absheight`
+Also produce this same ore between the height range of `-y_max` and `-y_min`.
+
+Useful for having ore in sky realms without having to duplicate ore entries.
 
 ### `puff_cliffs`
 If set, puff ore generation will not taper down large differences in displacement
index 73af2e2e6cdb9ededf1f4da84925237b3fe3b903..f959ca9e65b9fa760282baf392e620da9a26d5ab 100644 (file)
@@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 
 FlagDesc flagdesc_ore[] = {
-       {"absheight",                 OREFLAG_ABSHEIGHT}, // Non-functional
+       {"absheight",                 OREFLAG_ABSHEIGHT},
        {"puff_cliffs",               OREFLAG_PUFF_CLIFFS},
        {"puff_additive_composition", OREFLAG_PUFF_ADDITIVE},
        {NULL,                        0}
@@ -87,11 +87,22 @@ void Ore::resolveNodeNames()
 
 size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
 {
-       if (!(nmin.Y <= y_max && nmax.Y >= y_min))
+       int in_range = 0;
+
+       in_range |= (nmin.Y <= y_max && nmax.Y >= y_min);
+       if (flags & OREFLAG_ABSHEIGHT)
+               in_range |= (nmin.Y >= -y_max && nmax.Y <= -y_min) << 1;
+       if (!in_range)
                return 0;
 
-       int actual_ymin = MYMAX(nmin.Y, y_min);
-       int actual_ymax = MYMIN(nmax.Y, y_max);
+       int actual_ymin, actual_ymax;
+       if (in_range & ORE_RANGE_MIRROR) {
+               actual_ymin = MYMAX(nmin.Y, -y_max);
+               actual_ymax = MYMIN(nmax.Y, -y_min);
+       } else {
+               actual_ymin = MYMAX(nmin.Y, y_min);
+               actual_ymax = MYMIN(nmax.Y, y_max);
+       }
        if (clust_size >= actual_ymax - actual_ymin + 1)
                return 0;
 
index 5aeb3631c925c25299253f2da63f2aa7176be4f7..4b052e07a29a3cbc69a548742c8c8e4241ecac61 100644 (file)
@@ -32,11 +32,14 @@ class MMVManip;
 
 /////////////////// Ore generation flags
 
-#define OREFLAG_ABSHEIGHT     0x01 // Non-functional but kept to not break flags
+#define OREFLAG_ABSHEIGHT     0x01
 #define OREFLAG_PUFF_CLIFFS   0x02
 #define OREFLAG_PUFF_ADDITIVE 0x04
 #define OREFLAG_USE_NOISE     0x08
 
+#define ORE_RANGE_ACTUAL 1
+#define ORE_RANGE_MIRROR 2
+
 enum OreType {
        ORE_SCATTER,
        ORE_SHEET,