Permalink
Browse files

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
  • Loading branch information...
paramat committed Apr 21, 2015
1 parent ccc09ab commit ac6efa25390cbe522ac4fb3efc68c22081a023c4
Showing with 9 additions and 12 deletions.
  1. +9 −12 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;

0 comments on commit ac6efa2

Please sign in to comment.