summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mg_ore.cpp19
-rw-r--r--src/mg_ore.h5
2 files changed, 19 insertions, 5 deletions
diff --git a/src/mg_ore.cpp b/src/mg_ore.cpp
index 73af2e2e6..f959ca9e6 100644
--- a/src/mg_ore.cpp
+++ b/src/mg_ore.cpp
@@ -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;
diff --git a/src/mg_ore.h b/src/mg_ore.h
index 5aeb3631c..4b052e07a 100644
--- a/src/mg_ore.h
+++ b/src/mg_ore.h
@@ -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,