summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lua_api.txt12
-rw-r--r--src/mg_decoration.cpp6
-rw-r--r--src/mg_decoration.h9
3 files changed, 18 insertions, 9 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index e2589d226..5fa164e6b 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -792,11 +792,13 @@ Schematic attributes
--------------------
See section "Flag Specifier Format".
-Currently supported flags: `place_center_x`, `place_center_y`, `place_center_z`.
+Currently supported flags: `place_center_x`, `place_center_y`,
+ `place_center_z`, `force_placement`.
* `place_center_x`: Placement of this decoration is centered along the X axis.
* `place_center_y`: Placement of this decoration is centered along the Y axis.
* `place_center_z`: Placement of this decoration is centered along the Z axis.
+* `force_placement`: Schematic nodes other than "ignore" will replace existing nodes.
HUD element types
@@ -3191,8 +3193,10 @@ Definition tables
schematic = {
size = {x=4, y=6, z=4},
data = {
- {name="cobble", param1=255, param2=0},
- {name="dirt_with_grass", param1=255, param2=0},
+ {name="default:cobble", param1=255, param2=0},
+ {name="default:dirt_with_grass", param1=255, param2=0},
+ {name="ignore", param1=255, param2=0},
+ {name="air", param1=255, param2=0},
...
},
yslice_prob = {
@@ -3203,7 +3207,7 @@ Definition tables
},
-- ^ See 'Schematic specifier' for details.
replacements = {["oldname"] = "convert_to", ...},
- flags = "place_center_x, place_center_z",
+ flags = "place_center_x, place_center_y, place_center_z, force_placement",
-- ^ Flags for schematic decorations. See 'Schematic attributes'.
rotation = "90" -- rotate schematic 90 degrees on placement
-- ^ Rotation can be "0", "90", "180", "270", or "random".
diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp
index a67c3cd8c..ab9401e28 100644
--- a/src/mg_decoration.cpp
+++ b/src/mg_decoration.cpp
@@ -31,6 +31,7 @@ FlagDesc flagdesc_deco[] = {
{"place_center_x", DECO_PLACE_CENTER_X},
{"place_center_y", DECO_PLACE_CENTER_Y},
{"place_center_z", DECO_PLACE_CENTER_Z},
+ {"force_placement", DECO_FORCE_PLACEMENT},
{NULL, 0}
};
@@ -140,6 +141,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
s16 y = mg->heightmap ?
mg->heightmap[mapindex] :
mg->findGroundLevel(v2s16(x, z), nmin.Y, nmax.Y);
+ y = MYMAX(y, mg->water_level);
if (y < nmin.Y || y > nmax.Y ||
y < y_min || y > y_max)
@@ -333,6 +335,8 @@ size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, s16 max_y, v3s16
if (flags & DECO_PLACE_CENTER_Z)
p.Z -= (schematic->size.Z + 1) / 2;
+ bool force_placement = (flags & DECO_FORCE_PLACEMENT);
+
if (!vm->m_area.contains(p))
return 0;
@@ -344,7 +348,7 @@ size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, s16 max_y, v3s16
Rotation rot = (rotation == ROTATE_RAND) ?
(Rotation)pr->range(ROTATE_0, ROTATE_270) : rotation;
- schematic->blitToVManip(p, vm, rot, false, m_ndef);
+ schematic->blitToVManip(p, vm, rot, force_placement, m_ndef);
return 1;
}
diff --git a/src/mg_decoration.h b/src/mg_decoration.h
index ab4a9377b..fd7739b92 100644
--- a/src/mg_decoration.h
+++ b/src/mg_decoration.h
@@ -35,10 +35,11 @@ enum DecorationType {
DECO_LSYSTEM
};
-#define DECO_PLACE_CENTER_X 0x01
-#define DECO_PLACE_CENTER_Y 0x02
-#define DECO_PLACE_CENTER_Z 0x04
-#define DECO_USE_NOISE 0x08
+#define DECO_PLACE_CENTER_X 0x01
+#define DECO_PLACE_CENTER_Y 0x02
+#define DECO_PLACE_CENTER_Z 0x04
+#define DECO_USE_NOISE 0x08
+#define DECO_FORCE_PLACEMENT 0x10
extern FlagDesc flagdesc_deco[];