From 98216e2762f3da3e96578c45365b497871dd2f3d Mon Sep 17 00:00:00 2001 From: zml2008 Date: Mon, 12 Dec 2011 19:20:31 -0800 Subject: [PATCH] Added support for non-128 worldheights --- .../java/com/sk89q/worldedit/EditSession.java | 28 +++++----- .../java/com/sk89q/worldedit/LocalPlayer.java | 4 +- .../com/sk89q/worldedit/LocalSession.java | 18 +++---- .../java/com/sk89q/worldedit/LocalWorld.java | 2 +- .../sk89q/worldedit/bukkit/BukkitWorld.java | 13 +++-- .../EditSessionBlockChangeDelegate.java | 2 +- .../worldedit/bukkit/WorldEditPlugin.java | 2 +- .../bukkit/selections/CuboidSelection.java | 4 +- .../selections/Polygonal2DSelection.java | 13 +++-- .../worldedit/commands/RegionCommands.java | 8 +-- .../worldedit/commands/SelectionCommands.java | 51 ++++++++++--------- .../worldedit/commands/UtilityCommands.java | 8 +-- .../java/com/sk89q/worldedit/data/Chunk.java | 19 ++++--- .../com/sk89q/worldedit/data/ChunkStore.java | 6 +-- .../worldedit/data/LegacyChunkStore.java | 2 +- .../worldedit/data/McRegionChunkStore.java | 6 ++- .../sk89q/worldedit/regions/CuboidRegion.java | 33 ++++++++++-- .../regions/CuboidRegionSelector.java | 9 +++- .../worldedit/regions/Polygonal2DRegion.java | 29 ++++++++++- .../regions/Polygonal2DRegionSelector.java | 11 ++-- .../com/sk89q/worldedit/regions/Region.java | 15 ++++++ .../worldedit/snapshots/SnapshotRestore.java | 2 +- .../worldedit/tools/brushes/SmoothBrush.java | 5 +- .../com/sk89q/worldedit/util/TargetBlock.java | 2 +- 24 files changed, 190 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/sk89q/worldedit/EditSession.java b/src/main/java/com/sk89q/worldedit/EditSession.java index c0bcba033..040be35a0 100644 --- a/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/src/main/java/com/sk89q/worldedit/EditSession.java @@ -168,7 +168,7 @@ public class EditSession { public boolean rawSetBlock(Vector pt, BaseBlock block) { final int y = pt.getBlockY(); final int type = block.getType(); - if (y < 0 || y > 127) { + if (y < 0 || y > world.getMaxY()) { return false; } @@ -1046,7 +1046,7 @@ public class EditSession { */ public int removeAbove(Vector pos, int size, int height) throws MaxChangedBlocksException { - int maxY = Math.min(127, pos.getBlockY() + height - 1); + int maxY = Math.min(world.getMaxY(), pos.getBlockY() + height - 1); --size; int affected = 0; @@ -1122,7 +1122,7 @@ public class EditSession { int minX = pos.getBlockX() - size; int maxX = pos.getBlockX() + size; int minY = Math.max(0, pos.getBlockY() - size); - int maxY = Math.min(127, pos.getBlockY() + size); + int maxY = Math.min(world.getMaxY(), pos.getBlockY() + size); int minZ = pos.getBlockZ() - size; int maxZ = pos.getBlockZ() + size; @@ -1584,7 +1584,7 @@ public class EditSession { Vector min = region.getMinimumPoint(); Vector max = region.getMaximumPoint(); - int upperY = Math.min(127, max.getBlockY() + 1); + int upperY = Math.min(world.getMaxY(), max.getBlockY() + 1); int lowerY = Math.max(0, min.getBlockY() - 1); int affected = 0; @@ -1599,7 +1599,7 @@ public class EditSession { for (int y = upperY; y >= lowerY; --y) { Vector above = new Vector(x, y + 1, z); - if (y + 1 <= 127 && !getBlock(new Vector(x, y, z)).isAir() + if (y + 1 <= world.getMaxY() && !getBlock(new Vector(x, y, z)).isAir() && getBlock(above).isAir()) { if (setBlock(above, block)) { ++affected; @@ -1626,7 +1626,7 @@ public class EditSession { Vector min = region.getMinimumPoint(); Vector max = region.getMaximumPoint(); - int upperY = Math.min(127, max.getBlockY() + 1); + int upperY = Math.min(world.getMaxY(), max.getBlockY() + 1); int lowerY = Math.max(0, min.getBlockY() - 1); int affected = 0; @@ -1641,7 +1641,7 @@ public class EditSession { for (int y = upperY; y >= lowerY; --y) { Vector above = new Vector(x, y + 1, z); - if (y + 1 <= 127 && !getBlock(new Vector(x, y, z)).isAir() + if (y + 1 <= world.getMaxY() && !getBlock(new Vector(x, y, z)).isAir() && getBlock(above).isAir()) { if (setBlock(above, pattern.next(above))) { ++affected; @@ -1668,7 +1668,7 @@ public class EditSession { Vector min = region.getMinimumPoint(); Vector max = region.getMaximumPoint(); - int upperY = Math.min(127, max.getBlockY() + 1); + int upperY = Math.min(world.getMaxY(), max.getBlockY() + 1); int lowerY = Math.max(0, min.getBlockY() - 1); int affected = 0; @@ -2020,8 +2020,8 @@ public class EditSession { if (pos.getBlockY() - height - 1 < 0) { height = pos.getBlockY() + 1; - } else if (pos.getBlockY() + height - 1 > 127) { - height = 127 - pos.getBlockY() + 1; + } else if (pos.getBlockY() + height - 1 > world.getMaxY()) { + height = world.getMaxY() - pos.getBlockY() + 1; } final double invRadiusX = 1 / radiusX; @@ -2253,7 +2253,7 @@ public class EditSession { continue; } - for (int y = 127; y >= 1; --y) { + for (int y = world.getMaxY(); y >= 1; --y) { Vector pt = new Vector(x, y, z); int id = getBlockType(pt); @@ -2312,7 +2312,7 @@ public class EditSession { continue; } - for (int y = 127; y >= 1; --y) { + for (int y = world.getMaxY(); y >= 1; --y) { Vector pt = new Vector(x, y, z); int id = getBlockType(pt); @@ -2334,7 +2334,7 @@ public class EditSession { } // Too high? - if (y == 127) { + if (y == world.getMaxY()) { break; } @@ -2376,7 +2376,7 @@ public class EditSession { continue; } - loop: for (int y = 127; y >= 1; --y) { + loop: for (int y = world.getMaxY(); y >= 1; --y) { final Vector pt = new Vector(x, y, z); final int id = getBlockType(pt); diff --git a/src/main/java/com/sk89q/worldedit/LocalPlayer.java b/src/main/java/com/sk89q/worldedit/LocalPlayer.java index 9f3989224..983343161 100644 --- a/src/main/java/com/sk89q/worldedit/LocalPlayer.java +++ b/src/main/java/com/sk89q/worldedit/LocalPlayer.java @@ -230,7 +230,7 @@ public abstract class LocalPlayer extends LocalCommandSender { return false; } - while (y <= 127) { + while (y <= world.getMaxY()) { // Found a ceiling! if (!BlockType.canPassThrough(world.getBlockType(new Vector(x, y, z)))) { int platformY = Math.max(initialY, y - 3 - clearance); @@ -257,7 +257,7 @@ public abstract class LocalPlayer extends LocalCommandSender { int initialY = Math.max(0, pos.getBlockY()); int y = Math.max(0, pos.getBlockY() + 1); int z = pos.getBlockZ(); - int maxY = Math.min(128, initialY + distance); + int maxY = Math.min(getWorld().getMaxY() + 1, initialY + distance); LocalWorld world = getPosition().getWorld(); while (y <= 129) { diff --git a/src/main/java/com/sk89q/worldedit/LocalSession.java b/src/main/java/com/sk89q/worldedit/LocalSession.java index cf563c984..733f88f0b 100644 --- a/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -56,7 +56,6 @@ public class LocalSession { private LocalConfiguration config; private long expirationTime = 0; - private LocalWorld selectionWorld; private RegionSelector selector = new CuboidRegionSelector(); private boolean placeAtPos1 = false; private LinkedList history = new LinkedList(); @@ -183,10 +182,10 @@ public class LocalSession { * @return position */ public RegionSelector getRegionSelector(LocalWorld world) { - if (selectionWorld == null) { - selectionWorld = world; - } else if (!selectionWorld.equals(world)) { - selectionWorld = world; + if (selector.getIncompleteRegion().getWorld() == null) { + selector = new CuboidRegionSelector(world); + } else if (!selector.getIncompleteRegion().getWorld().equals(world)) { + selector.getIncompleteRegion().setWorld(world); selector.clear(); } return selector; @@ -198,6 +197,7 @@ public class LocalSession { * * @return position */ + @Deprecated public RegionSelector getRegionSelector() { return selector; } @@ -209,7 +209,7 @@ public class LocalSession { * @param selector */ public void setRegionSelector(LocalWorld world, RegionSelector selector) { - selectionWorld = world; + selector.getIncompleteRegion().setWorld(world); this.selector = selector; } @@ -230,7 +230,7 @@ public class LocalSession { * @return */ public boolean isSelectionDefined(LocalWorld world) { - if (selectionWorld == null || !selectionWorld.equals(world)) { + if (selector.getIncompleteRegion().getWorld() == null || !selector.getIncompleteRegion().getWorld().equals(world)) { return false; } return selector.isDefined(); @@ -258,7 +258,7 @@ public class LocalSession { * @throws IncompleteRegionException */ public Region getSelection(LocalWorld world) throws IncompleteRegionException { - if (selectionWorld == null || !selectionWorld.equals(world)) { + if (selector.getIncompleteRegion().getWorld() == null || !selector.getIncompleteRegion().getWorld().equals(world)) { throw new IncompleteRegionException(); } return selector.getRegion(); @@ -270,7 +270,7 @@ public class LocalSession { * @return */ public LocalWorld getSelectionWorld() { - return selectionWorld; + return selector.getIncompleteRegion().getWorld(); } /** diff --git a/src/main/java/com/sk89q/worldedit/LocalWorld.java b/src/main/java/com/sk89q/worldedit/LocalWorld.java index 9912976c5..f63d980ad 100644 --- a/src/main/java/com/sk89q/worldedit/LocalWorld.java +++ b/src/main/java/com/sk89q/worldedit/LocalWorld.java @@ -357,7 +357,7 @@ public abstract class LocalWorld { * * @return */ - public int getHeight() { + public int getMaxY() { return 127; } diff --git a/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 59bac1fe1..450e95e0c 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -226,14 +226,14 @@ public class BukkitWorld extends LocalWorld { */ @Override public boolean regenerate(Region region, EditSession editSession) { - BaseBlock[] history = new BaseBlock[16 * 16 * 128]; + BaseBlock[] history = new BaseBlock[16 * 16 * (getMaxY() + 1)]; for (Vector2D chunk : region.getChunks()) { Vector min = new Vector(chunk.getBlockX() * 16, 0, chunk.getBlockZ() * 16); // First save all the blocks inside for (int x = 0; x < 16; ++x) { - for (int y = 0; y < 128; ++y) { + for (int y = 0; y < (getMaxY() + 1); ++y) { for (int z = 0; z < 16; ++z) { Vector pt = min.add(x, y, z); int index = y * 16 * 16 + z * 16 + x; @@ -250,7 +250,7 @@ public class BukkitWorld extends LocalWorld { // Then restore for (int x = 0; x < 16; ++x) { - for (int y = 0; y < 128; ++y) { + for (int y = 0; y < (getMaxY() + 1); ++y) { for (int z = 0; z < 16; ++z) { Vector pt = min.add(x, y, z); int index = y * 16 * 16 + z * 16 + x; @@ -761,7 +761,7 @@ public class BukkitWorld extends LocalWorld { } @Override - public int getHeight() { + public int getMaxY() { return world.getMaxHeight() - 1; } @@ -775,7 +775,6 @@ public class BukkitWorld extends LocalWorld { } private static final int chunkSizeX = 16; - private static final int chunkSizeY = 128; private static final int chunkSizeZ = 16; @Override @@ -810,8 +809,8 @@ public class BukkitWorld extends LocalWorld { boolean xBorder = x == 0 || x == chunkSizeX - 1; for (int z = 0; z < chunkSizeZ; ++z) { boolean zBorder = z == 0 || z == chunkSizeZ - 1; - for (int y = 0; y < chunkSizeY; ++y) { - final int index = y + z * chunkSizeY + x * chunkSizeY * chunkSizeZ; + for (int y = 0; y < world.getMaxHeight(); ++y) { + final int index = y + z * world.getMaxHeight() + x * world.getMaxHeight() * chunkSizeZ; byte blockID = blocks[index]; if (!BlockType.emitsLight(blockID)) { if (xBorder || zBorder && BlockType.isTranslucent(blockID)) { diff --git a/src/main/java/com/sk89q/worldedit/bukkit/EditSessionBlockChangeDelegate.java b/src/main/java/com/sk89q/worldedit/bukkit/EditSessionBlockChangeDelegate.java index a7a813d55..df61cdcf7 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/EditSessionBlockChangeDelegate.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/EditSessionBlockChangeDelegate.java @@ -58,6 +58,6 @@ public class EditSessionBlockChangeDelegate implements BlockChangeDelegate { } public int getHeight() { - return editSession.getWorld().getHeight(); + return editSession.getWorld().getMaxY(); } } diff --git a/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index adbc00a98..b6dc0142e 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -378,7 +378,7 @@ public class WorldEditPlugin extends JavaPlugin { } LocalSession session = controller.getSession(wrapPlayer(player)); - RegionSelector selector = session.getRegionSelector(); + RegionSelector selector = session.getRegionSelector(BukkitUtil.getLocalWorld(player.getWorld())); try { Region region = selector.getRegion(); diff --git a/src/main/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java b/src/main/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java index f40ab3567..24ab3ab2c 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/selections/CuboidSelection.java @@ -44,8 +44,8 @@ public class CuboidSelection extends RegionSelection { if (pt2 == null) { throw new IllegalArgumentException("Null point 2 not permitted"); } - - CuboidRegionSelector sel = new CuboidRegionSelector(); + + CuboidRegionSelector sel = new CuboidRegionSelector(BukkitUtil.getLocalWorld(world)); sel.selectPrimary(pt1); sel.selectSecondary(pt2); diff --git a/src/main/java/com/sk89q/worldedit/bukkit/selections/Polygonal2DSelection.java b/src/main/java/com/sk89q/worldedit/bukkit/selections/Polygonal2DSelection.java index fb5f77ef9..0a892479a 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/selections/Polygonal2DSelection.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/selections/Polygonal2DSelection.java @@ -21,8 +21,11 @@ package com.sk89q.worldedit.bukkit.selections; import java.util.Collections; import java.util.List; + +import com.sk89q.worldedit.LocalWorld; import org.bukkit.World; import com.sk89q.worldedit.BlockVector2D; +import com.sk89q.worldedit.bukkit.BukkitUtil; import com.sk89q.worldedit.regions.*; public class Polygonal2DSelection extends RegionSelection { @@ -36,13 +39,13 @@ public class Polygonal2DSelection extends RegionSelection { public Polygonal2DSelection(World world, List points, int minY, int maxY) { super(world); + LocalWorld lWorld = BukkitUtil.getLocalWorld(world); - minY = Math.min(Math.max(0, minY), 127); - maxY = Math.min(Math.max(0, maxY), 127); - - Polygonal2DRegionSelector sel = new Polygonal2DRegionSelector(); - poly2d = new Polygonal2DRegion(points, minY, maxY); + minY = Math.min(Math.max(0, minY), world.getMaxHeight()); + maxY = Math.min(Math.max(0, maxY), world.getMaxHeight()); + Polygonal2DRegionSelector sel = new Polygonal2DRegionSelector(BukkitUtil.getLocalWorld(world)); + poly2d = new Polygonal2DRegion(lWorld, points, minY, maxY); sel.learnChanges(); setRegionSelector(sel); diff --git a/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java b/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java index de230baa1..f139aa86b 100644 --- a/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java +++ b/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java @@ -264,8 +264,8 @@ public class RegionCommands { region.expand(dir.multiply(count)); region.contract(dir.multiply(count)); - session.getRegionSelector().learnChanges(); - session.getRegionSelector().explainRegionAdjust(player, session); + session.getRegionSelector(player.getWorld()).learnChanges(); + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); } catch (RegionOperationException e) { player.printError(e.getMessage()); } @@ -309,8 +309,8 @@ public class RegionCommands { region.expand(shiftVector); region.contract(shiftVector); - session.getRegionSelector().learnChanges(); - session.getRegionSelector().explainRegionAdjust(player, session); + session.getRegionSelector(player.getWorld()).learnChanges(); + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); } catch (RegionOperationException e) { player.printError(e.getMessage()); } diff --git a/src/main/java/com/sk89q/worldedit/commands/SelectionCommands.java b/src/main/java/com/sk89q/worldedit/commands/SelectionCommands.java index caaa328c5..1f3461a6b 100644 --- a/src/main/java/com/sk89q/worldedit/commands/SelectionCommands.java +++ b/src/main/java/com/sk89q/worldedit/commands/SelectionCommands.java @@ -194,7 +194,7 @@ public class SelectionCommands { final Vector2D max2D = ChunkStore.toChunk(region.getMaximumPoint()); min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16); - max = new Vector(max2D.getBlockX() * 16 + 15, 127, max2D.getBlockZ() * 16 + 15); + max = new Vector(max2D.getBlockX() * 16 + 15, player.getWorld().getMaxY(), max2D.getBlockZ() * 16 + 15); player.print("Chunks selected: (" + min2D.getBlockX() + ", " + min2D.getBlockZ() + ") - (" @@ -203,13 +203,13 @@ public class SelectionCommands { final Vector2D min2D = ChunkStore.toChunk(player.getBlockIn()); min = new Vector(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16); - max = min.add(15, 127, 15); + max = min.add(15, player.getWorld().getMaxY(), 15); player.print("Chunk selected: " + min2D.getBlockX() + ", " + min2D.getBlockZ()); } - CuboidRegionSelector selector = new CuboidRegionSelector(); + CuboidRegionSelector selector = new CuboidRegionSelector(player.getWorld()); selector.selectPrimary(min); selector.selectSecondary(max); session.setRegionSelector(player.getWorld(), selector); @@ -276,11 +276,11 @@ public class SelectionCommands { Region region = session.getSelection(player.getWorld()); try { int oldSize = region.getArea(); - region.expand(new Vector(0, 128, 0)); - region.expand(new Vector(0, -128, 0)); - session.getRegionSelector().learnChanges(); + region.expand(new Vector(0, (player.getWorld().getMaxY() + 1), 0)); + region.expand(new Vector(0, -(player.getWorld().getMaxY() + 1), 0)); + session.getRegionSelector(player.getWorld()).learnChanges(); int newSize = region.getArea(); - session.getRegionSelector().explainRegionAdjust(player, session); + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); player.print("Region expanded " + (newSize - oldSize) + " blocks [top-to-bottom]."); } catch (RegionOperationException e) { @@ -323,10 +323,10 @@ public class SelectionCommands { region.expand(dir.multiply(reverseChange)); } - session.getRegionSelector().learnChanges(); + session.getRegionSelector(player.getWorld()).learnChanges(); int newSize = region.getArea(); - - session.getRegionSelector().explainRegionAdjust(player, session); + + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); player.print("Region expanded " + (newSize - oldSize) + " blocks."); } @@ -374,10 +374,11 @@ public class SelectionCommands { if (reverseChange != 0) { region.contract(dir.multiply(reverseChange)); } - session.getRegionSelector().learnChanges(); + session.getRegionSelector(player.getWorld()).learnChanges(); int newSize = region.getArea(); + + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); - session.getRegionSelector().explainRegionAdjust(player, session); player.print("Region contracted " + (oldSize - newSize) + " blocks."); } catch (RegionOperationException e) { @@ -409,9 +410,9 @@ public class SelectionCommands { Region region = session.getSelection(player.getWorld()); region.expand(dir.multiply(change)); region.contract(dir.multiply(change)); - session.getRegionSelector().learnChanges(); - - session.getRegionSelector().explainRegionAdjust(player, session); + session.getRegionSelector(player.getWorld()).learnChanges(); + + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); player.print("Region shifted."); } catch (RegionOperationException e) { @@ -453,9 +454,9 @@ public class SelectionCommands { region.expand((new Vector(0, 0, -1)).multiply(change)); } - session.getRegionSelector().learnChanges(); - - session.getRegionSelector().explainRegionAdjust(player, session); + session.getRegionSelector(player.getWorld()).learnChanges(); + + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); player.print("Region outset."); } catch (RegionOperationException e) { @@ -496,9 +497,9 @@ public class SelectionCommands { region.contract((new Vector(0, 0, -1)).multiply(change)); } - session.getRegionSelector().learnChanges(); - - session.getRegionSelector().explainRegionAdjust(player, session); + session.getRegionSelector(player.getWorld()).learnChanges(); + + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); player.print("Region inset."); } @@ -520,9 +521,9 @@ public class SelectionCommands { .subtract(region.getMinimumPoint()) .add(1, 1, 1); - player.print("Type: " + session.getRegionSelector().getTypeName()); - - for (String line : session.getRegionSelector().getInformationLines()) { + player.print("Type: " + session.getRegionSelector(player.getWorld()).getTypeName()); + + for (String line : session.getRegionSelector(player.getWorld()).getInformationLines()) { player.print(line); } @@ -625,7 +626,7 @@ public class SelectionCommands { selector = new ExtendingCuboidRegionSelector(oldSelector); player.print("Cuboid: left click for a starting point, right click to extend"); } else if (typeName.equalsIgnoreCase("poly")) { - selector = new Polygonal2DRegionSelector(); + selector = new Polygonal2DRegionSelector(world); player.print("2D polygon selector: Left/right click to add a point."); } else { player.printError("Only 'cuboid', 'extend' and 'poly' are accepted."); diff --git a/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java b/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java index 08e871217..0343944fd 100644 --- a/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java +++ b/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java @@ -173,7 +173,8 @@ public class UtilityCommands { int size = args.argsLength() > 0 ? Math.max(1, args.getInteger(0)) : 1; we.checkMaxRadius(size); - int height = args.argsLength() > 1 ? Math.min(128, args.getInteger(1) + 2) : 128; + LocalWorld world = player.getWorld(); + int height = args.argsLength() > 1 ? Math.min((world.getMaxY() + 1), args.getInteger(1) + 2) : (world.getMaxY() + 1); int affected = editSession.removeAbove( session.getPlacementPosition(player), size, height); @@ -195,7 +196,8 @@ public class UtilityCommands { int size = args.argsLength() > 0 ? Math.max(1, args.getInteger(0)) : 1; we.checkMaxRadius(size); - int height = args.argsLength() > 1 ? Math.min(128, args.getInteger(1) + 2) : 128; + LocalWorld world = player.getWorld(); + int height = args.argsLength() > 1 ? Math.min((world.getMaxY() + 1), args.getInteger(1) + 2) : (world.getMaxY() + 1); int affected = editSession.removeBelow(session.getPlacementPosition(player), size, height); player.print(affected + " block(s) have been removed."); @@ -251,7 +253,7 @@ public class UtilityCommands { Vector base = session.getPlacementPosition(player); Vector min = base.subtract(size, size, size); Vector max = base.add(size, size, size); - Region region = new CuboidRegion(min, max); + Region region = new CuboidRegion(player.getWorld(), min, max); if (to instanceof SingleBlockPattern) { affected = editSession.replaceBlocks(region, from, ((SingleBlockPattern) to).getBlock()); diff --git a/src/main/java/com/sk89q/worldedit/data/Chunk.java b/src/main/java/com/sk89q/worldedit/data/Chunk.java index 37629de1a..493d468b6 100644 --- a/src/main/java/com/sk89q/worldedit/data/Chunk.java +++ b/src/main/java/com/sk89q/worldedit/data/Chunk.java @@ -37,7 +37,9 @@ public class Chunk { private byte[] data; private int rootX; private int rootZ; - private Map> tileEntities; + + private Map> tileEntities; + private LocalWorld world; /** * Construct the chunk with a compound tag. @@ -45,8 +47,9 @@ public class Chunk { * @param tag * @throws DataException */ - public Chunk(CompoundTag tag) throws DataException { + public Chunk(LocalWorld world, CompoundTag tag) throws DataException { rootTag = tag; + this.world = world; blocks = getChildTag( rootTag.getValue(), "Blocks", ByteArrayTag.class).getValue(); @@ -57,14 +60,14 @@ public class Chunk { rootZ = getChildTag( rootTag.getValue(), "zPos", IntTag.class).getValue(); - if (blocks.length != 32768) { + if (blocks.length != 16*16*(world.getMaxY() + 1)) { throw new InvalidFormatException("Chunk blocks byte array expected " - + "to be 32,768 bytes; found " + blocks.length); + + "to be " + 16*16*(world.getMaxY() + 1) + " bytes; found " + blocks.length); } - if (data.length != 16384) { + if (data.length != 16*16*((world.getMaxY() + 1)/2)) { throw new InvalidFormatException("Chunk block data byte array " - + "expected to be 16,384 bytes; found " + data.length); + + "expected to be " + 16*16*((world.getMaxY() + 1)/2) + " bytes; found " + data.length); } } @@ -79,7 +82,7 @@ public class Chunk { int x = pos.getBlockX() - rootX * 16; int y = pos.getBlockY(); int z = pos.getBlockZ() - rootZ * 16; - int index = y + (z * 128 + (x * 128 * 16)); + int index = y + (z * (world.getMaxY() + 1) + (x * (world.getMaxY() + 1) * 16)); try { return blocks[index]; @@ -99,7 +102,7 @@ public class Chunk { int x = pos.getBlockX() - rootX * 16; int y = pos.getBlockY(); int z = pos.getBlockZ() - rootZ * 16; - int index = y + (z * 128 + (x * 128 * 16)); + int index = y + (z * (world.getMaxY() + 1) + (x * (world.getMaxY() + 1) * 16)); boolean shift = index % 2 == 0; index /= 2; diff --git a/src/main/java/com/sk89q/worldedit/data/ChunkStore.java b/src/main/java/com/sk89q/worldedit/data/ChunkStore.java index 4c5574b27..c2745245a 100644 --- a/src/main/java/com/sk89q/worldedit/data/ChunkStore.java +++ b/src/main/java/com/sk89q/worldedit/data/ChunkStore.java @@ -50,7 +50,7 @@ public abstract class ChunkStore { * @throws DataException * @throws IOException */ - public abstract CompoundTag getChunkTag(Vector2D pos, String world) + public abstract CompoundTag getChunkTag(Vector2D pos, LocalWorld world) throws DataException, IOException; /** @@ -62,9 +62,9 @@ public abstract class ChunkStore { * @throws IOException * @throws DataException */ - public Chunk getChunk(Vector2D pos, String world) + public Chunk getChunk(Vector2D pos, LocalWorld world) throws DataException, IOException { - return new Chunk(getChunkTag(pos, world)); + return new Chunk(world, getChunkTag(pos, world)); } /** diff --git a/src/main/java/com/sk89q/worldedit/data/LegacyChunkStore.java b/src/main/java/com/sk89q/worldedit/data/LegacyChunkStore.java index c10f20b53..61efc35a3 100644 --- a/src/main/java/com/sk89q/worldedit/data/LegacyChunkStore.java +++ b/src/main/java/com/sk89q/worldedit/data/LegacyChunkStore.java @@ -74,7 +74,7 @@ public abstract class LegacyChunkStore extends ChunkStore { * @throws IOException */ @Override - public CompoundTag getChunkTag(Vector2D pos, String world) + public CompoundTag getChunkTag(Vector2D pos, LocalWorld world) throws DataException, IOException { int x = pos.getBlockX(); int z = pos.getBlockZ(); diff --git a/src/main/java/com/sk89q/worldedit/data/McRegionChunkStore.java b/src/main/java/com/sk89q/worldedit/data/McRegionChunkStore.java index f6106cf1e..58ad4c799 100644 --- a/src/main/java/com/sk89q/worldedit/data/McRegionChunkStore.java +++ b/src/main/java/com/sk89q/worldedit/data/McRegionChunkStore.java @@ -25,6 +25,7 @@ import java.util.Map; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector2D; public abstract class McRegionChunkStore extends ChunkStore { @@ -65,10 +66,11 @@ public abstract class McRegionChunkStore extends ChunkStore { } @Override - public CompoundTag getChunkTag(Vector2D pos, String worldname) throws DataException, + public CompoundTag getChunkTag(Vector2D pos, LocalWorld world) throws DataException, IOException { + + McRegionReader reader = getReader(pos, world.getName()); - McRegionReader reader = getReader(pos, worldname); InputStream stream = reader.getChunkInputStream(pos); NBTInputStream nbt = new NBTInputStream(stream); Tag tag; diff --git a/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java b/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java index 9f706c27e..fcdd2a080 100644 --- a/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java +++ b/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.regions; import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.data.ChunkStore; @@ -40,6 +41,10 @@ public class CuboidRegion implements Region { * Store the second point. */ private Vector pos2; + /** + * Stores the world. + */ + private LocalWorld world; /** * Construct a new instance of this cuboid region. @@ -48,7 +53,19 @@ public class CuboidRegion implements Region { * @param pos2 */ public CuboidRegion(Vector pos1, Vector pos2) { + this(null, pos1, pos2); + } + + /** + * Construct a new instance of this cuboid region. + * + * @param world + * @param pos1 + * @param pos2 + */ + public CuboidRegion(LocalWorld world, Vector pos1, Vector pos2) { this.pos1 = pos1; + this.world = world; this.pos2 = pos2; } @@ -172,8 +189,8 @@ public class CuboidRegion implements Region { } } - pos1 = pos1.clampY(0, 127); - pos2 = pos2.clampY(0, 127); + pos1 = pos1.clampY(0, world.getMaxY()); + pos2 = pos2.clampY(0, world.getMaxY()); } /** @@ -224,8 +241,8 @@ public class CuboidRegion implements Region { } } - pos1 = pos1.clampY(0, 127); - pos2 = pos2.clampY(0, 127); + pos1 = pos1.clampY(0, world == null ? 127 : world.getMaxY()); + pos2 = pos2.clampY(0, world == null ? 127 : world.getMaxY()); } /** @@ -353,4 +370,12 @@ public class CuboidRegion implements Region { public String toString() { return getMinimumPoint() + " - " + getMaximumPoint(); } + + public LocalWorld getWorld() { + return world; + } + + public void setWorld(LocalWorld world) { + this.world = world; + } } diff --git a/src/main/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java index 4cfdb487c..4ef908bb3 100644 --- a/src/main/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/CuboidRegionSelector.java @@ -25,6 +25,7 @@ import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.cui.CUIPointBasedRegion; import com.sk89q.worldedit.cui.SelectionPointEvent; @@ -37,12 +38,18 @@ import com.sk89q.worldedit.cui.SelectionPointEvent; public class CuboidRegionSelector implements RegionSelector, CUIPointBasedRegion { protected BlockVector pos1; protected BlockVector pos2; - protected CuboidRegion region = new CuboidRegion(new Vector(), new Vector()); + protected CuboidRegion region; + + public CuboidRegionSelector(LocalWorld world) { + region = new CuboidRegion(world, new Vector(), new Vector()); + } public CuboidRegionSelector() { + this((LocalWorld)null); } public CuboidRegionSelector(RegionSelector oldSelector) { + region = new CuboidRegion(oldSelector.getIncompleteRegion().getWorld(), new Vector(), new Vector()); if (oldSelector instanceof CuboidRegionSelector) { final CuboidRegionSelector cuboidRegionSelector = (CuboidRegionSelector) oldSelector; diff --git a/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java b/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java index 0d8bd30c7..ca69cecce 100644 --- a/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java +++ b/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegion.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Set; import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.BlockVector2D; +import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector2D; import com.sk89q.worldedit.data.ChunkStore; @@ -43,30 +44,43 @@ public class Polygonal2DRegion implements Region { protected int minY; protected int maxY; protected boolean hasY = false; + protected LocalWorld world; /** - * Construct the region. + * Construct the region */ public Polygonal2DRegion() { + this(null); + } + + /** + * Construct the region. + * + * @param world + */ + public Polygonal2DRegion(LocalWorld world) { points = new ArrayList(); minY = 0; maxY = 0; hasY = false; + this.world = world; recalculate(); } /** * Construct the region. * + * @param world * @param points * @param minY * @param maxY */ - public Polygonal2DRegion(List points, int minY, int maxY) { + public Polygonal2DRegion(LocalWorld world, List points, int minY, int maxY) { this.points = points; this.minY = minY; this.maxY = maxY; hasY = true; + this.world = world; recalculate(); } @@ -109,6 +123,9 @@ public class Polygonal2DRegion implements Region { minY = Math.min(oldMinY, oldMaxY); maxY = Math.max(oldMinY, oldMaxY); + minY = Math.min(Math.max(0, minY), world == null ? 127 : world.getMaxY()); + maxY = Math.min(Math.max(0, maxY), world == null ? 127 : world.getMaxY()); + min = new BlockVector(minX, minY, minZ); max = new BlockVector(maxX, maxY, maxZ); } @@ -567,4 +584,12 @@ public class Polygonal2DRegion implements Region { throw new UnsupportedOperationException("Not supported"); } } + + public LocalWorld getWorld() { + return world; + } + + public void setWorld(LocalWorld world) { + this.world = world; + } } diff --git a/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java b/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java index 452ae42be..3597eb498 100644 --- a/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java +++ b/src/main/java/com/sk89q/worldedit/regions/Polygonal2DRegionSelector.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.BlockVector2D; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalPlayer; import com.sk89q.worldedit.LocalSession; +import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.cui.CUIPointBasedRegion; import com.sk89q.worldedit.cui.SelectionMinMaxEvent; @@ -39,7 +40,11 @@ import com.sk89q.worldedit.cui.SelectionShapeEvent; */ public class Polygonal2DRegionSelector implements RegionSelector, CUIPointBasedRegion { protected BlockVector pos1; - protected Polygonal2DRegion region = new Polygonal2DRegion(); + protected Polygonal2DRegion region; + + public Polygonal2DRegionSelector(LocalWorld world) { + region = new Polygonal2DRegion(world); + } public boolean selectPrimary(Vector pos) { if (pos.equals(pos1)) { @@ -47,7 +52,7 @@ public class Polygonal2DRegionSelector implements RegionSelector, CUIPointBasedR } pos1 = pos.toBlockVector(); - region = new Polygonal2DRegion(); + region = new Polygonal2DRegion(region.getWorld()); region.addPoint(pos); region.expandY(pos.getBlockY()); @@ -124,7 +129,7 @@ public class Polygonal2DRegionSelector implements RegionSelector, CUIPointBasedR public void clear() { pos1 = null; - region = new Polygonal2DRegion(); + region = new Polygonal2DRegion(region.getWorld()); } public String getTypeName() { diff --git a/src/main/java/com/sk89q/worldedit/regions/Region.java b/src/main/java/com/sk89q/worldedit/regions/Region.java index 1f4c0d3bf..d75becee4 100644 --- a/src/main/java/com/sk89q/worldedit/regions/Region.java +++ b/src/main/java/com/sk89q/worldedit/regions/Region.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.regions; import com.sk89q.worldedit.BlockVector; +import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector2D; import java.util.Set; @@ -101,4 +102,18 @@ public interface Region extends Iterable { * @return */ public Set getChunks(); + + /** + * Get the world the selection is in + * + * @return + */ + public LocalWorld getWorld(); + + /** + * Sets the world the selection is in + * + * @return + */ + public void setWorld(LocalWorld world); } diff --git a/src/main/java/com/sk89q/worldedit/snapshots/SnapshotRestore.java b/src/main/java/com/sk89q/worldedit/snapshots/SnapshotRestore.java index 19fa972d2..5f28ac404 100644 --- a/src/main/java/com/sk89q/worldedit/snapshots/SnapshotRestore.java +++ b/src/main/java/com/sk89q/worldedit/snapshots/SnapshotRestore.java @@ -147,7 +147,7 @@ public class SnapshotRestore { Chunk chunk; try { - chunk = chunkStore.getChunk(chunkPos, editSession.getWorld().getName()); + chunk = chunkStore.getChunk(chunkPos, editSession.getWorld()); // Good, the chunk could be at least loaded // Now just copy blocks! diff --git a/src/main/java/com/sk89q/worldedit/tools/brushes/SmoothBrush.java b/src/main/java/com/sk89q/worldedit/tools/brushes/SmoothBrush.java index 74dbcea0d..c7ec35847 100644 --- a/src/main/java/com/sk89q/worldedit/tools/brushes/SmoothBrush.java +++ b/src/main/java/com/sk89q/worldedit/tools/brushes/SmoothBrush.java @@ -23,6 +23,7 @@ import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.HeightMap; import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.WorldVector; import com.sk89q.worldedit.filtering.GaussianKernel; import com.sk89q.worldedit.filtering.HeightMapFilter; import com.sk89q.worldedit.patterns.Pattern; @@ -45,9 +46,9 @@ public class SmoothBrush implements Brush { public void build(EditSession editSession, Vector pos, Pattern mat, double size) throws MaxChangedBlocksException { double rad = size; - Vector min = pos.subtract(rad, rad, rad); + WorldVector min = new WorldVector(editSession.getWorld(), pos.subtract(rad, rad, rad)); Vector max = pos.add(rad, rad + 10, rad); - Region region = new CuboidRegion(min, max); + Region region = new CuboidRegion(editSession.getWorld(), min, max); HeightMap heightMap = new HeightMap(editSession, region, naturalOnly); HeightMapFilter filter = new HeightMapFilter(new GaussianKernel(5, 1.0)); heightMap.applyFilter(filter, iterations); diff --git a/src/main/java/com/sk89q/worldedit/util/TargetBlock.java b/src/main/java/com/sk89q/worldedit/util/TargetBlock.java index 3fc09ba34..568afacae 100644 --- a/src/main/java/com/sk89q/worldedit/util/TargetBlock.java +++ b/src/main/java/com/sk89q/worldedit/util/TargetBlock.java @@ -115,7 +115,7 @@ public class TargetBlock { if (world.getBlockType(getCurrentBlock()) == BlockID.AIR) { if (searchForLastBlock) { lastBlock = getCurrentBlock(); - if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= 127) { + if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= world.getMaxY()) { searchForLastBlock = false; } }