Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Schematic decorations: Fix placement bug when centred and rotated (#7365
)

Previously, the centering caused by the 'place center x/z' flags did
not take rotation into account. So schematics with unequal X and Z
dimensions were incorrectly placed. The bug was hidden for schematics
equal in X and Z dimensions.
  • Loading branch information
paramat committed May 24, 2018
1 parent 53d5b3e commit d6a6d31
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions src/mapgen/mg_decoration.cpp
Expand Up @@ -360,13 +360,22 @@ size_t DecoSchematic::generate(MMVManip *vm, PcgRandom *pr, v3s16 p, bool ceilin
if (p.Y < vm->m_area.MinEdge.Y)
return 0;

if (flags & DECO_PLACE_CENTER_X)
p.X -= (schematic->size.X - 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;

if (flags & DECO_PLACE_CENTER_X) {
if (rot == ROTATE_0 || rot == ROTATE_180)
p.X -= (schematic->size.X - 1) / 2;
else
p.Z -= (schematic->size.X - 1) / 2;
}
if (flags & DECO_PLACE_CENTER_Z) {
if (rot == ROTATE_0 || rot == ROTATE_180)
p.Z -= (schematic->size.Z - 1) / 2;
else
p.X -= (schematic->size.Z - 1) / 2;
}

bool force_placement = (flags & DECO_FORCE_PLACEMENT);

schematic->blitToVManip(vm, p, rot, force_placement);
Expand Down

0 comments on commit d6a6d31

Please sign in to comment.