aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lua_api.txt4
-rw-r--r--src/mg_decoration.cpp3
-rw-r--r--src/mg_decoration.h2
-rw-r--r--src/script/lua_api/l_mapgen.cpp22
4 files changed, 20 insertions, 11 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 7474c2bf4..1bfe0a0c2 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -2758,6 +2758,10 @@ Decoration definition (register_decoration)
biomes = {"Oceanside", "Hills", "Plains"},
^ List of biomes in which this decoration occurs. Occurs in all biomes if this is omitted,
^ and ignored if the Mapgen being used does not support biomes.
+ height_min = -31000
+ height_max = 31000
+ ^ Minimum and maximum y positions these decorations can be generated at. This parameter refers to the
+ ^ y position of the decoration base, so the actual maximum height would be (height_max + size.Y).
----- Simple-type parameters
decoration = "default:grass",
diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp
index 50e8fb05a..dec82a638 100644
--- a/src/mg_decoration.cpp
+++ b/src/mg_decoration.cpp
@@ -140,7 +140,8 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
mg->heightmap[mapindex] :
mg->findGroundLevel(v2s16(x, z), nmin.Y, nmax.Y);
- if (y < nmin.Y || y > nmax.Y)
+ if (y < nmin.Y || y > nmax.Y ||
+ y < height_min || y > height_max)
continue;
int height = getHeight();
diff --git a/src/mg_decoration.h b/src/mg_decoration.h
index 910f1a581..3c96611c7 100644
--- a/src/mg_decoration.h
+++ b/src/mg_decoration.h
@@ -66,6 +66,8 @@ public:
int mapseed;
std::vector<content_t> c_place_on;
s16 sidelen;
+ s16 height_min;
+ s16 height_max;
float fill_ratio;
NoiseParams np;
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index a2e5d31d1..cccbba5a8 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -423,14 +423,14 @@ int ModApiMapgen::l_register_biome(lua_State *L)
Biome *b = bmgr->create(biometype);
b->name = getstringfield_default(L, index, "name", "");
- b->depth_top = getintfield_default(L, index, "depth_top", 1);
- b->depth_filler = getintfield_default(L, index, "depth_filler", 3);
- b->height_shore = getintfield_default(L, index, "height_shore", 3);
- b->depth_water_top = getintfield_default(L, index, "depth_water_top", 0);
- b->height_min = getintfield_default(L, index, "height_min", 0);
- b->height_max = getintfield_default(L, index, "height_max", 0);
- b->heat_point = getfloatfield_default(L, index, "heat_point", 0.);
- b->humidity_point = getfloatfield_default(L, index, "humidity_point", 0.);
+ b->depth_top = getintfield_default(L, index, "depth_top", 1);
+ b->depth_filler = getintfield_default(L, index, "depth_filler", 3);
+ b->height_shore = getintfield_default(L, index, "height_shore", 3);
+ b->depth_water_top = getintfield_default(L, index, "depth_water_top", 0);
+ b->height_min = getintfield_default(L, index, "height_min", -31000);
+ b->height_max = getintfield_default(L, index, "height_max", 31000);
+ b->heat_point = getfloatfield_default(L, index, "heat_point", 0.f);
+ b->humidity_point = getfloatfield_default(L, index, "humidity_point", 0.f);
b->flags = 0; //reserved
u32 id = bmgr->add(b);
@@ -501,6 +501,8 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
deco->name = getstringfield_default(L, index, "name", "");
deco->fill_ratio = getfloatfield_default(L, index, "fill_ratio", 0.02);
+ deco->height_min = getintfield_default(L, index, "height_min", 31000);
+ deco->height_max = getintfield_default(L, index, "height_max", -31000);
deco->sidelen = getintfield_default(L, index, "sidelen", 8);
if (deco->sidelen <= 0) {
errorstream << "register_decoration: sidelen must be "
@@ -660,8 +662,8 @@ int ModApiMapgen::l_register_ore(lua_State *L)
ore->clust_scarcity = getintfield_default(L, index, "clust_scarcity", 1);
ore->clust_num_ores = getintfield_default(L, index, "clust_num_ores", 1);
ore->clust_size = getintfield_default(L, index, "clust_size", 0);
- ore->height_min = getintfield_default(L, index, "height_min", 0);
- ore->height_max = getintfield_default(L, index, "height_max", 0);
+ ore->height_min = getintfield_default(L, index, "height_min", -31000);
+ ore->height_max = getintfield_default(L, index, "height_max", 31000);
ore->nthresh = getfloatfield_default(L, index, "noise_threshhold", 0);
ore->noise = NULL;
ore->flags = 0;