diff --git a/core/src/main/java/com/boydti/fawe/example/CharFaweChunk.java b/core/src/main/java/com/boydti/fawe/example/CharFaweChunk.java index 8f1ac838..daf5b4eb 100644 --- a/core/src/main/java/com/boydti/fawe/example/CharFaweChunk.java +++ b/core/src/main/java/com/boydti/fawe/example/CharFaweChunk.java @@ -111,10 +111,12 @@ public abstract class CharFaweChunk extends FaweChunk * @param i * @return */ + @Override public char[] getIdArray(final int i) { return this.ids[i]; } + @Override public char[][] getCombinedIdArrays() { return this.ids; } diff --git a/core/src/main/java/com/boydti/fawe/example/NullFaweChunk.java b/core/src/main/java/com/boydti/fawe/example/NullFaweChunk.java index 85cbd94c..b4423736 100644 --- a/core/src/main/java/com/boydti/fawe/example/NullFaweChunk.java +++ b/core/src/main/java/com/boydti/fawe/example/NullFaweChunk.java @@ -27,6 +27,11 @@ public class NullFaweChunk extends FaweChunk { return new char[16][]; } + @Override + public char[] getIdArray(int layer) { + return null; + } + @Override public int getBitMask() { return 0; diff --git a/core/src/main/java/com/boydti/fawe/object/FaweChunk.java b/core/src/main/java/com/boydti/fawe/object/FaweChunk.java index b4fa8d3e..05adf5f0 100644 --- a/core/src/main/java/com/boydti/fawe/object/FaweChunk.java +++ b/core/src/main/java/com/boydti/fawe/object/FaweChunk.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; +import javax.annotation.Nullable; public abstract class FaweChunk implements Callable { @@ -123,8 +124,28 @@ public abstract class FaweChunk implements Callable { } } + /** + * Get the combined id array at a layer or null if it does not exist + * @param layer + * @return char[] or null + */ + public @Nullable char[] getIdArray(int layer) { + char[] ids = new char[4096]; + int by = layer << 4; + int index = 0; + for (int y = 0; y < 16; y++) { + int yy = by + y; + for (int z = 0; z < 16; z++) { + for (int x = 0; x < 16; x++) { + ids[index++] = (char) getBlockCombinedId(x, yy, z); + } + } + } + return ids; + } + public char[][] getCombinedIdArrays() { - char[][] ids = new char[16][]; + char[][] ids = new char[HEIGHT >> 4][]; for (int y = 0; y < HEIGHT >> 4; y++) { int y4 = y >> 4; short[][] i1 = FaweCache.CACHE_J[y]; diff --git a/core/src/main/java/com/boydti/fawe/object/changeset/FaweChangeSet.java b/core/src/main/java/com/boydti/fawe/object/changeset/FaweChangeSet.java index a0db0214..3449a9f8 100644 --- a/core/src/main/java/com/boydti/fawe/object/changeset/FaweChangeSet.java +++ b/core/src/main/java/com/boydti/fawe/object/changeset/FaweChangeSet.java @@ -33,6 +33,7 @@ public abstract class FaweChangeSet implements ChangeSet { private final World world; private final boolean mainThread; + private final int layers; private AtomicInteger waitingCombined = new AtomicInteger(0); private AtomicInteger waitingAsync = new AtomicInteger(0); private Object lockCombined = new Object(); @@ -49,6 +50,7 @@ public abstract class FaweChangeSet implements ChangeSet { public FaweChangeSet(World world) { this.world = world; this.mainThread = Fawe.get().isMainThread(); + this.layers = this.world.getMaxY() >> 4; } public World getWorld() { @@ -221,12 +223,12 @@ public abstract class FaweChangeSet implements ChangeSet { // Block changes { // Current blocks - char[][] currentIds = next.getCombinedIdArrays(); +// char[][] currentIds = next.getCombinedIdArrays(); // Previous blocks in modified sections (i.e. we skip sections that weren't modified) - char[][] previousIds = previous.getCombinedIdArrays(); - for (int layer = 0; layer < currentIds.length; layer++) { - char[] currentLayer = currentIds[layer]; - char[] previousLayer = previousIds[layer]; +// char[][] previousIds = previous.getCombinedIdArrays(); + for (int layer = 0; layer < layers; layer++) { + char[] currentLayer = next.getIdArray(layer); + char[] previousLayer = previous.getIdArray(layer); if (currentLayer == null) { continue; } diff --git a/core/src/main/java/com/sk89q/worldedit/EditSession.java b/core/src/main/java/com/sk89q/worldedit/EditSession.java index 36c056b4..c2b516af 100644 --- a/core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -524,6 +524,10 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting return history != null ? history.getChangeSet() : changeTask; } + public FaweChangeSet getChangeTask() { + return changeTask; + } + /** * Change the ChangeSet being used for this EditSession * - If history is disabled, no changeset can be set diff --git a/core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index ac3aa0ba..a8d8e4d2 100644 --- a/core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -319,7 +319,7 @@ public class RegionCommands { @CommandPermissions("worldedit.region.set") @Logging(REGION) public void set(Player player, LocalSession session, EditSession editSession, @Selection Region selection, Pattern to) throws WorldEditException { - if (selection instanceof CuboidRegion && editSession.hasFastMode() && to instanceof BlockPattern) { + if (selection instanceof CuboidRegion && (editSession.hasFastMode() || (editSession.getRegionExtent() == null && editSession.getChangeTask() != null)) && to instanceof BlockPattern) { try { CuboidRegion cuboid = (CuboidRegion) selection; RegionWrapper current = new RegionWrapper(cuboid.getMinimumPoint(), cuboid.getMaximumPoint()); @@ -363,9 +363,11 @@ public class RegionCommands { newChunk.addToQueue(); } }); + int volume = cuboid.getArea(); + editSession.setSize(volume); queue.enqueue(); long start = System.currentTimeMillis(); - BBC.OPERATION.send(player, BBC.VISITOR_BLOCK.format(cuboid.getArea())); + BBC.OPERATION.send(player, BBC.VISITOR_BLOCK.format(volume)); queue.flush(); BBC.ACTION_COMPLETE.send(player, (System.currentTimeMillis() - start) / 1000d); return;