//walls on non-cuboid regions no longer introduces gaps in walls beyond 45 degrees (aka slanted roofs :)).

This is a better way to solve #273.
This commit is contained in:
TomyLobo 2013-11-03 10:15:28 +01:00
parent 60f6580553
commit 164601644a
2 changed files with 14 additions and 20 deletions

View File

@ -1654,7 +1654,20 @@ public class EditSession {
* @throws MaxChangedBlocksException
*/
public int makeWalls(final Region region, Pattern pattern) throws MaxChangedBlocksException {
return new RegionShape(region).generate(this, pattern, true, true);
final int minY = region.getMinimumPoint().getBlockY();
final int maxY = region.getMaximumPoint().getBlockY();
final ArbitraryShape shape = new RegionShape(region) {
@Override
protected BaseBlock getMaterial(int x, int y, int z, BaseBlock defaultMaterial) {
if (y > maxY || y < minY) {
// Put holes into the floor and ceiling by telling ArbitraryShape that the shape goes on outside the region
return defaultMaterial;
}
return super.getMaterial(x, y, z, defaultMaterial);
}
};
return shape.generate(this, pattern, true);
}
/**

View File

@ -148,20 +148,6 @@ public abstract class ArbitraryShape {
* @throws MaxChangedBlocksException
*/
public int generate(EditSession editSession, Pattern pattern, boolean hollow) throws MaxChangedBlocksException {
return generate(editSession, pattern, hollow, false);
}
/**
* Generates the shape.
*
* @param editSession The EditSession to use.
* @param pattern The pattern to generate default materials from.
* @param hollow Specifies whether to generate a hollow shape.
* @param flat If hollow mode is enabled, disregard blocks above/below
* @return number of affected blocks.
* @throws MaxChangedBlocksException
*/
public int generate(EditSession editSession, Pattern pattern, boolean hollow, boolean flat) throws MaxChangedBlocksException {
int affected = 0;
for (BlockVector position : getExtent()) {
@ -201,11 +187,6 @@ public abstract class ArbitraryShape {
draw = true;
break;
}
if (flat) {
break;
}
if (!isInsideCached(x, y + 1, z, pattern)) {
draw = true;
break;