DecoSchematic: Fix missing trees in rough terrain
authorparamat <mat.gregory@virginmedia.com>
Tue, 21 Apr 2015 11:09:32 +0000 (12:09 +0100)
committerparamat <mat.gregory@virginmedia.com>
Thu, 23 Apr 2015 01:44:25 +0000 (02:44 +0100)
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

index ec2d3e8b0f6cbe0f40ec8882dcfbc8fec3b38771..84f60b029f8a28609c77a86ef934086dfcc7f38e 100644 (file)
@@ -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;