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
FlagDesc flagdesc_ore[] = {
- {"absheight", OREFLAG_ABSHEIGHT}, // Non-functional
+ {"absheight", OREFLAG_ABSHEIGHT},
{"puff_cliffs", OREFLAG_PUFF_CLIFFS},
{"puff_additive_composition", OREFLAG_PUFF_ADDITIVE},
{NULL, 0}
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;
/////////////////// 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,