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[];