From ac6efa25390cbe522ac4fb3efc68c22081a023c4 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 21 Apr 2015 12:09:32 +0100 Subject: [PATCH] DecoSchematic: Fix missing trees in rough terrain Move place_on check to before place_center_x/y/z displacement of p Reduce displacement of p by place_center_x/y/z flags to correctly position schematics --- src/mg_decoration.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp index ec2d3e8b..84f60b02 100644 --- a/src/mg_decoration.cpp +++ b/src/mg_decoration.cpp @@ -324,26 +324,23 @@ size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, v3s16 p) if (schematic == NULL) return 0; - if (flags & DECO_PLACE_CENTER_X) - p.X -= (schematic->size.X + 1) / 2; - if (flags & DECO_PLACE_CENTER_Y) - p.Y -= (schematic->size.Y + 1) / 2; - 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; - u32 vi = vm->m_area.index(p); content_t c = vm->m_data[vi].getContent(); if (!CONTAINS(c_place_on, c)) return 0; + if (flags & DECO_PLACE_CENTER_X) + p.X -= (schematic->size.X - 1) / 2; + if (flags & DECO_PLACE_CENTER_Y) + p.Y -= (schematic->size.Y - 1) / 2; + if (flags & DECO_PLACE_CENTER_Z) + p.Z -= (schematic->size.Z - 1) / 2; + Rotation rot = (rotation == ROTATE_RAND) ? (Rotation)pr->range(ROTATE_0, ROTATE_270) : rotation; + bool force_placement = (flags & DECO_FORCE_PLACEMENT); + schematic->blitToVManip(p, vm, rot, force_placement, m_ndef); return 1;