From c1396a2468f018ea642545696599d49a95bafc9a Mon Sep 17 00:00:00 2001 From: TomyLobo Date: Sun, 4 Aug 2013 01:22:29 +0200 Subject: [PATCH] Added EditSession.moveRegion. --- .../java/com/sk89q/worldedit/EditSession.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/main/java/com/sk89q/worldedit/EditSession.java b/src/main/java/com/sk89q/worldedit/EditSession.java index 59b26cee0..a81818844 100644 --- a/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/src/main/java/com/sk89q/worldedit/EditSession.java @@ -44,6 +44,7 @@ import com.sk89q.worldedit.masks.Mask; import com.sk89q.worldedit.patterns.Pattern; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.regions.RegionOperationException; import com.sk89q.worldedit.util.TreeGenerator; /** @@ -1835,6 +1836,54 @@ public class EditSession { return affected; } + /** + * Move a region. + * + * @param region + * @param dir + * @param distance + * @param copyAir + * @param replace + * @return number of blocks moved + * @throws MaxChangedBlocksException + * @throws RegionOperationException + */ + public int moveRegion(Region region, Vector dir, int distance, + boolean copyAir, BaseBlock replace) + throws MaxChangedBlocksException, RegionOperationException { + int affected = 0; + + final Vector shift = dir.multiply(distance); + + final Region newRegion = region.clone(); + newRegion.shift(shift); + + final Map delayed = new LinkedHashMap(); + + for (Vector pos : region) { + final BaseBlock block = getBlock(pos); + + if (!block.isAir() || copyAir) { + final Vector newPos = pos.add(shift); + + delayed.put(newPos, getBlock(pos)); + + // Don't want to replace the old block if it's in + // the new area + if (!newRegion.contains(pos)) { + setBlock(pos, replace); + } + } + } + + for (Map.Entry entry : delayed.entrySet()) { + setBlock(entry.getKey(), entry.getValue()); + ++affected; + } + + return affected; + } + /** * Move a cuboid region. *