diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mg_decoration.cpp | 6 | ||||
-rw-r--r-- | src/mg_decoration.h | 9 |
2 files changed, 10 insertions, 5 deletions
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[]; |