From 6ae0d3f64e15624abd444368dc779fcb68fca152 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Sat, 8 Sep 2018 01:09:31 +1000 Subject: [PATCH] Fixes boy0001/FastAsyncWorldEdit#1099 --- .../com/boydti/fawe/object/FawePlayer.java | 110 +++--- .../worldedit/command/ClipboardCommands.java | 122 ++++--- .../worldedit/command/GenerationCommands.java | 187 +++++----- .../worldedit/command/HistoryCommands.java | 41 ++- .../worldedit/command/RegionCommands.java | 340 +++++++++--------- .../worldedit/command/UtilityCommands.java | 5 +- .../event/platform/CommandEvent.java | 7 +- 7 files changed, 425 insertions(+), 387 deletions(-) diff --git a/worldedit-core/src/main/java/com/boydti/fawe/object/FawePlayer.java b/worldedit-core/src/main/java/com/boydti/fawe/object/FawePlayer.java index 50c3b5a30..5d08d83fd 100644 --- a/worldedit-core/src/main/java/com/boydti/fawe/object/FawePlayer.java +++ b/worldedit-core/src/main/java/com/boydti/fawe/object/FawePlayer.java @@ -28,6 +28,8 @@ import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.regions.selector.CylinderRegionSelector; import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.world.World; + +import javax.annotation.Nullable; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; @@ -36,6 +38,7 @@ import java.text.NumberFormat; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; public abstract class FawePlayer extends Metadatable { @@ -156,60 +159,64 @@ public abstract class FawePlayer extends Metadatable { return cancelled; } - public void checkConfirmation(String command, int times, int limit) throws RegionOperationException { - if (command == null || getMeta("cmdConfirmRunning", false)) { - return; - } - if (times > limit) { - setMeta("cmdConfirm", command); - String volume = ""; - throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(0, times, command, volume)); - } + private void setConfirmTask(@Nullable Runnable task, String command) { + setMeta("cmdConfirm", task == null ? new CommandEvent(getPlayer(), command) : task); } - public void checkConfirmationRadius(String command, int radius) throws RegionOperationException { - if (command == null || getMeta("cmdConfirmRunning", false)) { - return; - } - if (radius > 0) { - if (radius > 448) { - setMeta("cmdConfirm", command); - long volume = (long) (Math.PI * ((double) radius * radius)); - throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(0, radius, command, NumberFormat.getNumberInstance().format(volume))); + public void checkConfirmation(@Nullable Runnable task, String command, int times, int limit) throws RegionOperationException { + if (command != null && !getMeta("cmdConfirmRunning", false)) { + if (times > limit) { + setConfirmTask(task, command); + String volume = ""; + throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(0, times, command, volume)); } } + if (task != null) task.run(); } - public void checkConfirmationStack(String command, Region region, int times) throws RegionOperationException { - if (command == null || getMeta("cmdConfirmRunning", false)) { - return; - } - if (region != null) { - Vector min = region.getMinimumPoint().toBlockVector(); - Vector max = region.getMaximumPoint().toBlockVector(); - long area = (long) ((max.getX() - min.getX()) * (max.getZ() - min.getZ() + 1)) * times; - if (area > 2 << 18) { - setMeta("cmdConfirm", command); - long volume = (long) max.subtract(min).add(Vector.ONE).volume() * times; - throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(min, max, command, NumberFormat.getNumberInstance().format(volume))); + public void checkConfirmationRadius(@Nullable Runnable task, String command, int radius) throws RegionOperationException { + if (command != null && !getMeta("cmdConfirmRunning", false)) { + if (radius > 0) { + if (radius > 448) { + setConfirmTask(task, command); + long volume = (long) (Math.PI * ((double) radius * radius)); + throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(0, radius, command, NumberFormat.getNumberInstance().format(volume))); + } } } + if (task != null) task.run(); } - public void checkConfirmationRegion(String command, Region region) throws RegionOperationException { - if (command == null || getMeta("cmdConfirmRunning", false)) { - return; - } - if (region != null) { - Vector min = region.getMinimumPoint().toBlockVector(); - Vector max = region.getMaximumPoint().toBlockVector(); - long area = (long) ((max.getX() - min.getX()) * (max.getZ() - min.getZ() + 1)); - if (area > 2 << 18) { - setMeta("cmdConfirm", command); - long volume = (long) max.subtract(min).add(Vector.ONE).volume(); - throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(min, max, command, NumberFormat.getNumberInstance().format(volume))); + public void checkConfirmationStack(@Nullable Runnable task, String command, Region region, int times) throws RegionOperationException { + if (command != null && !getMeta("cmdConfirmRunning", false)) { + if (region != null) { + Vector min = region.getMinimumPoint().toBlockVector(); + Vector max = region.getMaximumPoint().toBlockVector(); + long area = (long) ((max.getX() - min.getX()) * (max.getZ() - min.getZ() + 1)) * times; + if (area > 2 << 18) { + setConfirmTask(task, command); + long volume = (long) max.subtract(min).add(Vector.ONE).volume() * times; + throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(min, max, command, NumberFormat.getNumberInstance().format(volume))); + } } } + if (task != null) task.run(); + } + + public void checkConfirmationRegion(@Nullable Runnable task, String command, Region region) throws RegionOperationException { + if (command != null && !getMeta("cmdConfirmRunning", false)) { + if (region != null) { + Vector min = region.getMinimumPoint().toBlockVector(); + Vector max = region.getMaximumPoint().toBlockVector(); + long area = (long) ((max.getX() - min.getX()) * (max.getZ() - min.getZ() + 1)); + if (area > 2 << 18) { + setConfirmTask(task, command); + long volume = (long) max.subtract(min).add(Vector.ONE).volume(); + throw new RegionOperationException(BBC.WORLDEDIT_CANCEL_REASON_CONFIRM.f(min, max, command, NumberFormat.getNumberInstance().format(volume))); + } + } + } + if (task != null) task.run(); } public void checkAllowedRegion(Region wrappedSelection) { @@ -222,16 +229,25 @@ public abstract class FawePlayer extends Metadatable { } } - public boolean confirm() { - String confirm = deleteMeta("cmdConfirm"); + public synchronized boolean confirm() { + Object confirm = deleteMeta("cmdConfirm"); if (confirm == null) { return false; } queueAction(() -> { setMeta("cmdConfirmRunning", true); - CommandEvent event = new CommandEvent(getPlayer(), confirm); - CommandManager.getInstance().handleCommandOnCurrentThread(event); - setMeta("cmdConfirmRunning", false); + try { + if (confirm instanceof String) { + CommandEvent event = new CommandEvent(getPlayer(), (String) confirm); + CommandManager.getInstance().handleCommandOnCurrentThread(event); + } else if (confirm instanceof Runnable) { + ((Runnable) confirm).run(); + } else { + throw new RuntimeException("Invalid confirm action: " + confirm); + } + } finally { + setMeta("cmdConfirmRunning", false); + } }); return true; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java index f6a610268..2716bdcb8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java @@ -151,35 +151,37 @@ public class ClipboardCommands extends MethodCommands { public void copy(FawePlayer fp, Player player, LocalSession session, EditSession editSession, @Selection Region region, @Switch('e') boolean skipEntities, @Switch('m') Mask mask, CommandContext context, @Switch('b') boolean copyBiomes) throws WorldEditException { - fp.checkConfirmationRegion(getArguments(context), region); - Vector min = region.getMinimumPoint(); - Vector max = region.getMaximumPoint(); - long volume = (((long) max.getX() - (long) min.getX() + 1) * ((long) max.getY() - (long) min.getY() + 1) * ((long) max.getZ() - (long) min.getZ() + 1)); - FaweLimit limit = FawePlayer.wrap(player).getLimit(); - if (volume >= limit.MAX_CHECKS) { - throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_CHECKS); - } - session.setClipboard(null); - BlockArrayClipboard clipboard = new BlockArrayClipboard(region, player.getUniqueId()); - session.setClipboard(new ClipboardHolder(clipboard)); + fp.checkConfirmationRegion(() -> { + Vector min = region.getMinimumPoint(); + Vector max = region.getMaximumPoint(); + long volume = (((long) max.getX() - (long) min.getX() + 1) * ((long) max.getY() - (long) min.getY() + 1) * ((long) max.getZ() - (long) min.getZ() + 1)); + FaweLimit limit = FawePlayer.wrap(player).getLimit(); + if (volume >= limit.MAX_CHECKS) { + throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_CHECKS); + } + session.setClipboard(null); + BlockArrayClipboard clipboard = new BlockArrayClipboard(region, player.getUniqueId()); + session.setClipboard(new ClipboardHolder(clipboard)); - clipboard.setOrigin(session.getPlacementPosition(player)); - ForwardExtentCopy copy = new ForwardExtentCopy(editSession, region, clipboard, region.getMinimumPoint()); - copy.setCopyingEntities(!skipEntities); - copy.setCopyBiomes(copyBiomes); - Mask sourceMask = editSession.getSourceMask(); - if (sourceMask != null) { - new MaskTraverser(sourceMask).reset(editSession); - copy.setSourceMask(sourceMask); - editSession.setSourceMask(null); - } - if (mask != null && mask != Masks.alwaysTrue()) { - copy.setSourceMask(mask); - } - Operations.completeLegacy(copy); - BBC.COMMAND_COPY.send(player, region.getArea()); - if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) - BBC.TIP_PASTE.or(BBC.TIP_DOWNLOAD, BBC.TIP_ROTATE, BBC.TIP_COPYPASTE, BBC.TIP_REPLACE_MARKER, BBC.TIP_COPY_PATTERN).send(player); + clipboard.setOrigin(session.getPlacementPosition(player)); + ForwardExtentCopy copy = new ForwardExtentCopy(editSession, region, clipboard, region.getMinimumPoint()); + copy.setCopyingEntities(!skipEntities); + copy.setCopyBiomes(copyBiomes); + Mask sourceMask = editSession.getSourceMask(); + if (sourceMask != null) { + new MaskTraverser(sourceMask).reset(editSession); + copy.setSourceMask(sourceMask); + editSession.setSourceMask(null); + } + if (mask != null && mask != Masks.alwaysTrue()) { + copy.setSourceMask(mask); + } + Operations.completeLegacy(copy); + BBC.COMMAND_COPY.send(player, region.getArea()); + if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) { + BBC.TIP_PASTE.or(BBC.TIP_DOWNLOAD, BBC.TIP_ROTATE, BBC.TIP_COPYPASTE, BBC.TIP_REPLACE_MARKER, BBC.TIP_COPY_PATTERN).send(player); + } + }, getArguments(context), region); } @Command( @@ -239,38 +241,40 @@ public class ClipboardCommands extends MethodCommands { public void cut(FawePlayer fp, Player player, LocalSession session, EditSession editSession, @Selection Region region, @Optional("air") Pattern leavePattern, @Switch('e') boolean skipEntities, @Switch('m') Mask mask, @Switch('b') boolean copyBiomes, CommandContext context) throws WorldEditException { - fp.checkConfirmationRegion(getArguments(context), region); - Vector min = region.getMinimumPoint(); - Vector max = region.getMaximumPoint(); - long volume = (((long) max.getX() - (long) min.getX() + 1) * ((long) max.getY() - (long) min.getY() + 1) * ((long) max.getZ() - (long) min.getZ() + 1)); - FaweLimit limit = FawePlayer.wrap(player).getLimit(); - if (volume >= limit.MAX_CHECKS) { - throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_CHECKS); - } - if (volume >= limit.MAX_CHANGES) { - throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_CHANGES); - } - session.setClipboard(null); - BlockArrayClipboard clipboard = new BlockArrayClipboard(region, player.getUniqueId()); - clipboard.setOrigin(session.getPlacementPosition(player)); - ForwardExtentCopy copy = new ForwardExtentCopy(editSession, region, clipboard, region.getMinimumPoint()); - copy.setSourceFunction(new BlockReplace(editSession, leavePattern)); - copy.setCopyingEntities(!skipEntities); - copy.setCopyBiomes(copyBiomes); - Mask sourceMask = editSession.getSourceMask(); - if (sourceMask != null) { - new MaskTraverser(sourceMask).reset(editSession); - copy.setSourceMask(sourceMask); - editSession.setSourceMask(null); - } - if (mask != null) { - copy.setSourceMask(mask); - } - Operations.completeLegacy(copy); - session.setClipboard(new ClipboardHolder(clipboard)); + fp.checkConfirmationRegion(() -> { + Vector min = region.getMinimumPoint(); + Vector max = region.getMaximumPoint(); + long volume = (((long) max.getX() - (long) min.getX() + 1) * ((long) max.getY() - (long) min.getY() + 1) * ((long) max.getZ() - (long) min.getZ() + 1)); + FaweLimit limit = FawePlayer.wrap(player).getLimit(); + if (volume >= limit.MAX_CHECKS) { + throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_CHECKS); + } + if (volume >= limit.MAX_CHANGES) { + throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_CHANGES); + } + session.setClipboard(null); + BlockArrayClipboard clipboard = new BlockArrayClipboard(region, player.getUniqueId()); + clipboard.setOrigin(session.getPlacementPosition(player)); + ForwardExtentCopy copy = new ForwardExtentCopy(editSession, region, clipboard, region.getMinimumPoint()); + copy.setSourceFunction(new BlockReplace(editSession, leavePattern)); + copy.setCopyingEntities(!skipEntities); + copy.setCopyBiomes(copyBiomes); + Mask sourceMask = editSession.getSourceMask(); + if (sourceMask != null) { + new MaskTraverser(sourceMask).reset(editSession); + copy.setSourceMask(sourceMask); + editSession.setSourceMask(null); + } + if (mask != null) { + copy.setSourceMask(mask); + } + Operations.completeLegacy(copy); + session.setClipboard(new ClipboardHolder(clipboard)); + + BBC.COMMAND_CUT_SLOW.send(player, region.getArea()); + if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) BBC.TIP_LAZYCUT.send(player); + }, getArguments(context), region); - BBC.COMMAND_CUT_SLOW.send(player, region.getArea()); - if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) BBC.TIP_LAZYCUT.send(player); } @Command(aliases = {"download"}, desc = "Downloads your clipboard through the configured web interface") diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java index 5adbe99f0..8893c7a37 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java @@ -88,10 +88,11 @@ public class GenerationCommands extends MethodCommands { @CommandPermissions("worldedit.generation.caves") @Logging(PLACEMENT) public void caves(FawePlayer fp, LocalSession session, EditSession editSession, @Selection Region region, @Optional("8") int size, @Optional("40") int frequency, @Optional("7") int rarity, @Optional("8") int minY, @Optional("127") int maxY, @Optional("1") int systemFrequency, @Optional("25") int individualRarity, @Optional("0") int pocketChance, @Optional("0") int pocketMin, @Optional("3") int pocketMax, CommandContext context) throws WorldEditException, ParameterException { - fp.checkConfirmationRegion(getArguments(context), region); - CavesGen gen = new CavesGen(size, frequency, rarity, minY, maxY, systemFrequency, individualRarity, pocketChance, pocketMin, pocketMax); - editSession.generate(region, gen); - BBC.VISITOR_BLOCK.send(fp, editSession.getBlockChangeCount()); + fp.checkConfirmationRegion(() -> { + CavesGen gen = new CavesGen(size, frequency, rarity, minY, maxY, systemFrequency, individualRarity, pocketChance, pocketMin, pocketMax); + editSession.generate(region, gen); + BBC.VISITOR_BLOCK.send(fp, editSession.getBlockChangeCount()); + }, getArguments(context), region); } // public void addOre(Mask mask, Pattern material, int size, int frequency, int rarity, int minY, int maxY) throws WorldEditException { @@ -106,9 +107,10 @@ public class GenerationCommands extends MethodCommands { @CommandPermissions("worldedit.generation.ore") @Logging(PLACEMENT) public void ores(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, CommandContext context) throws WorldEditException, ParameterException { - player.checkConfirmationRegion(getArguments(context), region); - editSession.addOres(region, mask); - BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); + player.checkConfirmationRegion(() -> { + editSession.addOres(region, mask); + BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); + }, getArguments(context), region); } @Command( @@ -169,9 +171,10 @@ public class GenerationCommands extends MethodCommands { @CommandPermissions("worldedit.generation.ore") @Logging(PLACEMENT) public void ore(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, Pattern material, @Range(min = 0) int size, int freq, @Range(min = 0, max = 100) int rarity, @Range(min = 0, max = 255) int minY, @Range(min = 0, max = 255) int maxY, CommandContext context) throws WorldEditException, ParameterException { - player.checkConfirmationRegion(getArguments(context), region); - editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY); - BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); + player.checkConfirmationRegion(() -> { + editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY); + BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); + }, getArguments(context), region); } @Command( @@ -191,11 +194,11 @@ public class GenerationCommands extends MethodCommands { public void hcyl(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, Vector2D radius, @Optional("1") int height, @Range(min = 1) @Optional("1") double thickness, CommandContext context) throws WorldEditException, ParameterException { double max = MathMan.max(radius.getBlockX(), radius.getBlockZ()); worldEdit.checkMaxRadius(max); - fp.checkConfirmationRadius(getArguments(context), (int) max); - height = Math.min(256, height); Vector pos = session.getPlacementPosition(player); - int affected = editSession.makeHollowCylinder(pos, pattern, radius.getX(), radius.getZ(), height, thickness - 1); - BBC.VISITOR_BLOCK.send(fp, affected); + fp.checkConfirmationRadius(() -> { + int affected = editSession.makeHollowCylinder(pos, pattern, radius.getX(), radius.getZ(), Math.min(256, height), thickness - 1); + BBC.VISITOR_BLOCK.send(fp, affected); + }, getArguments(context), (int) max); } @Command( @@ -216,11 +219,11 @@ public class GenerationCommands extends MethodCommands { public void cyl(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, Vector2D radius, @Optional("1") int height, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException, ParameterException { double max = MathMan.max(radius.getBlockX(), radius.getBlockZ()); worldEdit.checkMaxRadius(max); - fp.checkConfirmationRadius(getArguments(context), (int) max); - height = Math.min(256, height); Vector pos = session.getPlacementPosition(player); - int affected = editSession.makeCylinder(pos, pattern, radius.getX(), radius.getZ(), height, !hollow); - BBC.VISITOR_BLOCK.send(fp, affected); + fp.checkConfirmationRadius(() -> { + int affected = editSession.makeCylinder(pos, pattern, radius.getX(), radius.getZ(), Math.min(256, height), !hollow); + BBC.VISITOR_BLOCK.send(fp, affected); + }, getArguments(context), (int) max); } @Command( @@ -259,16 +262,15 @@ public class GenerationCommands extends MethodCommands { public void sphere(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, Vector radius, @Optional("false") boolean raised, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException, ParameterException { double max = MathMan.max(radius.getBlockX(), radius.getBlockY(), radius.getBlockZ()); worldEdit.checkMaxRadius(max); - fp.checkConfirmationRadius(getArguments(context), (int) max); - Vector pos = session.getPlacementPosition(player); - if (raised) { - pos = pos.add(0, radius.getY(), 0); - } + Vector finalPos = raised ? pos.add(0, radius.getY(), 0) : pos; + fp.checkConfirmationRadius(() -> { + int affected = editSession.makeSphere(finalPos, pattern, radius.getX(), radius.getY(), radius.getZ(), !hollow); + player.findFreePosition(); + BBC.VISITOR_BLOCK.send(fp, affected); + }, getArguments(context), (int) max); + - int affected = editSession.makeSphere(pos, pattern, radius.getX(), radius.getY(), radius.getZ(), !hollow); - player.findFreePosition(); - BBC.VISITOR_BLOCK.send(fp, affected); } @Command( @@ -325,12 +327,13 @@ public class GenerationCommands extends MethodCommands { @CommandPermissions("worldedit.generation.pyramid") @Logging(PLACEMENT) public void pyramid(FawePlayer fp, Player player, LocalSession session, EditSession editSession, Pattern pattern, @Range(min = 1) int size, @Switch('h') boolean hollow, CommandContext context) throws WorldEditException, ParameterException { - fp.checkConfirmationRadius(getArguments(context), size); - Vector pos = session.getPlacementPosition(player); worldEdit.checkMaxRadius(size); - int affected = editSession.makePyramid(pos, pattern, size, !hollow); - player.findFreePosition(); - BBC.VISITOR_BLOCK.send(fp, affected); + Vector pos = session.getPlacementPosition(player); + fp.checkConfirmationRadius(() -> { + int affected = editSession.makePyramid(pos, pattern, size, !hollow); + player.findFreePosition(); + BBC.VISITOR_BLOCK.send(fp, affected); + }, getArguments(context), size); } @Command( @@ -363,41 +366,42 @@ public class GenerationCommands extends MethodCommands { @Switch('o') boolean offset, @Switch('c') boolean offsetCenter, CommandContext context) throws WorldEditException, ParameterException { - fp.checkConfirmationRegion(getArguments(context), region); - final Vector zero; - Vector unit; + fp.checkConfirmationRegion(() -> { + final Vector zero; + Vector unit; - if (useRawCoords) { - zero = Vector.ZERO; - unit = Vector.ONE; - } else if (offset) { - zero = session.getPlacementPosition(player); - unit = Vector.ONE; - } else if (offsetCenter) { - final Vector min = region.getMinimumPoint(); - final Vector max = region.getMaximumPoint(); + if (useRawCoords) { + zero = Vector.ZERO; + unit = Vector.ONE; + } else if (offset) { + zero = session.getPlacementPosition(player); + unit = Vector.ONE; + } else if (offsetCenter) { + final Vector min = region.getMinimumPoint(); + final Vector max = region.getMaximumPoint(); - zero = max.add(min).multiply(0.5); - unit = Vector.ONE; - } else { - final Vector min = region.getMinimumPoint(); - final Vector max = region.getMaximumPoint(); + zero = max.add(min).multiply(0.5); + unit = Vector.ONE; + } else { + final Vector min = region.getMinimumPoint(); + final Vector max = region.getMaximumPoint(); - zero = max.add(min).multiply(0.5); - unit = max.subtract(zero); + zero = max.add(min).multiply(0.5); + unit = max.subtract(zero); - if (unit.getX() == 0) unit.mutX(1); - if (unit.getY() == 0) unit.mutY(1); - if (unit.getZ() == 0) unit.mutZ(1); - } + if (unit.getX() == 0) unit.mutX(1); + if (unit.getY() == 0) unit.mutY(1); + if (unit.getZ() == 0) unit.mutZ(1); + } - try { - final int affected = editSession.makeShape(region, zero, unit, pattern, expression, hollow); - player.findFreePosition(); - BBC.VISITOR_BLOCK.send(fp, affected); - } catch (ExpressionException e) { - fp.sendMessage(BBC.getPrefix() + e.getMessage()); - } + try { + final int affected = editSession.makeShape(region, zero, unit, pattern, expression, hollow); + player.findFreePosition(); + BBC.VISITOR_BLOCK.send(fp, affected); + } catch (ExpressionException e) { + fp.sendMessage(BBC.getPrefix() + e.getMessage()); + } + }, getArguments(context), region); } @Command( @@ -430,40 +434,41 @@ public class GenerationCommands extends MethodCommands { @Switch('o') boolean offset, @Switch('c') boolean offsetCenter, CommandContext context) throws WorldEditException, ParameterException { - fp.checkConfirmationRegion(getArguments(context), region); - final Vector zero; - Vector unit; + fp.checkConfirmationRegion(() -> { + final Vector zero; + Vector unit; - if (useRawCoords) { - zero = Vector.ZERO; - unit = Vector.ONE; - } else if (offset) { - zero = session.getPlacementPosition(player); - unit = Vector.ONE; - } else if (offsetCenter) { - final Vector min = region.getMinimumPoint(); - final Vector max = region.getMaximumPoint(); + if (useRawCoords) { + zero = Vector.ZERO; + unit = Vector.ONE; + } else if (offset) { + zero = session.getPlacementPosition(player); + unit = Vector.ONE; + } else if (offsetCenter) { + final Vector min = region.getMinimumPoint(); + final Vector max = region.getMaximumPoint(); - zero = max.add(min).multiply(0.5); - unit = Vector.ONE; - } else { - final Vector min = region.getMinimumPoint(); - final Vector max = region.getMaximumPoint(); + zero = max.add(min).multiply(0.5); + unit = Vector.ONE; + } else { + final Vector min = region.getMinimumPoint(); + final Vector max = region.getMaximumPoint(); - zero = max.add(min).multiply(0.5); - unit = max.subtract(zero); + zero = max.add(min).multiply(0.5); + unit = max.subtract(zero); - if (unit.getX() == 0) unit.mutX(1); - if (unit.getY() == 0) unit.mutY(1); - if (unit.getZ() == 0) unit.mutZ(1); - } + if (unit.getX() == 0) unit.mutX(1); + if (unit.getY() == 0) unit.mutY(1); + if (unit.getZ() == 0) unit.mutZ(1); + } - try { - final int affected = editSession.makeBiomeShape(region, zero, unit, target, expression, hollow); - player.findFreePosition(); - BBC.VISITOR_FLAT.send(fp, affected); - } catch (ExpressionException e) { - fp.sendMessage(BBC.getPrefix() + e.getMessage()); - } + try { + final int affected = editSession.makeBiomeShape(region, zero, unit, target, expression, hollow); + player.findFreePosition(); + BBC.VISITOR_FLAT.send(fp, affected); + } catch (ExpressionException e) { + fp.sendMessage(BBC.getPrefix() + e.getMessage()); + } + }, getArguments(context), region); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java index 04dbcab4d..00753062d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistoryCommands.java @@ -225,30 +225,29 @@ public class HistoryCommands extends MethodCommands { @CommandPermissions("worldedit.history.undo") public void undo(Player player, LocalSession session, CommandContext context) throws WorldEditException { int times = Math.max(1, context.getInteger(0, 1)); - if (times > 50) { - FawePlayer.wrap(player).checkConfirmation(getArguments(context), times, 50); - } - for (int i = 0; i < times; ++i) { - EditSession undone; - if (context.argsLength() < 2) { - undone = session.undo(session.getBlockBag(player), player); - } else { - player.checkPermission("worldedit.history.undo.other"); - LocalSession sess = worldEdit.getSessionManager().findByName(context.getString(1)); - if (sess == null) { - BBC.COMMAND_HISTORY_OTHER_ERROR.send(player, context.getString(1)); + FawePlayer.wrap(player).checkConfirmation(() -> { + for (int i = 0; i < times; ++i) { + EditSession undone; + if (context.argsLength() < 2) { + undone = session.undo(session.getBlockBag(player), player); + } else { + player.checkPermission("worldedit.history.undo.other"); + LocalSession sess = worldEdit.getSessionManager().findByName(context.getString(1)); + if (sess == null) { + BBC.COMMAND_HISTORY_OTHER_ERROR.send(player, context.getString(1)); + break; + } + undone = sess.undo(session.getBlockBag(player), player); + } + if (undone != null) { + BBC.COMMAND_UNDO_SUCCESS.send(player); + worldEdit.flushBlockBag(player, undone); + } else { + BBC.COMMAND_UNDO_ERROR.send(player); break; } - undone = sess.undo(session.getBlockBag(player), player); } - if (undone != null) { - BBC.COMMAND_UNDO_SUCCESS.send(player); - worldEdit.flushBlockBag(player, undone); - } else { - BBC.COMMAND_UNDO_ERROR.send(player); - break; - } - } + }, getArguments(context), times, 50); } @Command( diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index a3de791fb..97c7502a6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -281,15 +281,14 @@ public class RegionCommands extends MethodCommands { } worldEdit.checkMaxRadius(thickness); - player.checkConfirmationRegion(getArguments(context), region); - player.checkConfirmationRadius(getArguments(context), thickness); + player.checkConfirmationRegion(() -> { + ConvexPolyhedralRegion cpregion = (ConvexPolyhedralRegion) region; + List vectors = new ArrayList(cpregion.getVertices()); - ConvexPolyhedralRegion cpregion = (ConvexPolyhedralRegion) region; - List vectors = new ArrayList(cpregion.getVertices()); + int blocksChanged = editSession.drawSpline(pattern, vectors, 0, 0, 0, 10, thickness, !shell); - int blocksChanged = editSession.drawSpline(pattern, vectors, 0, 0, 0, 10, thickness, !shell); - - BBC.VISITOR_BLOCK.send(player, blocksChanged); + BBC.VISITOR_BLOCK.send(player, blocksChanged); + }, getArguments(context), region); } @Command( @@ -303,14 +302,12 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.replace") @Logging(REGION) public void replace(FawePlayer player, EditSession editSession, @Selection Region region, @Optional Mask from, Pattern to, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - if (from == null) { - from = new ExistingBlockMask(editSession); - } - int affected = editSession.replaceBlocks(region, from, to); - BBC.VISITOR_BLOCK.send(player, affected); - if (!player.hasPermission("fawe.tips")) - BBC.TIP_REPLACE_ID.or(BBC.TIP_REPLACE_LIGHT, BBC.TIP_REPLACE_MARKER, BBC.TIP_TAB_COMPLETE, BBC.TIP_REPLACE_REGEX, BBC.TIP_REPLACE_REGEX_2, BBC.TIP_REPLACE_REGEX_3, BBC.TIP_REPLACE_REGEX_4, BBC.TIP_REPLACE_REGEX_5).send(player); + player.checkConfirmationRegion(() -> { + int affected = editSession.replaceBlocks(region, from == null ? new ExistingBlockMask(editSession) : from, to); + BBC.VISITOR_BLOCK.send(player, affected); + if (!player.hasPermission("fawe.tips")) + BBC.TIP_REPLACE_ID.or(BBC.TIP_REPLACE_LIGHT, BBC.TIP_REPLACE_MARKER, BBC.TIP_TAB_COMPLETE, BBC.TIP_REPLACE_REGEX, BBC.TIP_REPLACE_REGEX_2, BBC.TIP_REPLACE_REGEX_3, BBC.TIP_REPLACE_REGEX_4, BBC.TIP_REPLACE_REGEX_5).send(player); + }, getArguments(context), region); } // Compatibility for SKCompat @@ -329,14 +326,15 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.set") @Logging(REGION) public void set(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region selection, Pattern to, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), selection); - int affected; - affected = editSession.setBlocks(selection, to); - if (affected != 0) { - BBC.OPERATION.send(player, affected); - if (!player.hasPermission("fawe.tips")) - BBC.TIP_FAST.or(BBC.TIP_CANCEL, BBC.TIP_MASK, BBC.TIP_MASK_ANGLE, BBC.TIP_SET_LINEAR, BBC.TIP_SURFACE_SPREAD, BBC.TIP_SET_HAND).send(player); - } + player.checkConfirmationRegion(() -> { + int affected; + affected = editSession.setBlocks(selection, to); + if (affected != 0) { + BBC.OPERATION.send(player, affected); + if (!player.hasPermission("fawe.tips")) + BBC.TIP_FAST.or(BBC.TIP_CANCEL, BBC.TIP_MASK, BBC.TIP_MASK_ANGLE, BBC.TIP_SET_LINEAR, BBC.TIP_SURFACE_SPREAD, BBC.TIP_SET_HAND).send(player); + } + }, getArguments(context), selection); } @Command( @@ -349,9 +347,10 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.overlay") @Logging(REGION) public void overlay(FawePlayer player, EditSession editSession, @Selection Region region, Pattern pattern, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - int affected = editSession.overlayCuboidBlocks(region, pattern); - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + int affected = editSession.overlayCuboidBlocks(region, pattern); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -364,28 +363,29 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.overlay") @Logging(REGION) public void lay(FawePlayer player, EditSession editSession, @Selection Region region, Pattern pattern, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - Vector min = region.getMinimumPoint(); - Vector max = region.getMaximumPoint(); - int maxY = max.getBlockY(); - int width = region.getWidth(); - int height = region.getLength(); - int bx = min.getBlockX(); - int bz = min.getBlockZ(); - Iterable flat = Regions.asFlatRegion(region).asFlatRegion(); - Iterator iter = new Fast2DIterator(flat, editSession).iterator(); - int y = 0; - int affected = 0; - MutableBlockVector mutable = new MutableBlockVector(); - while (iter.hasNext()) { - Vector2D pos = iter.next(); - int x = pos.getBlockX(); - int z = pos.getBlockZ(); - y = editSession.getNearestSurfaceTerrainBlock(x, z, y, 0, maxY); - editSession.setBlock(x, y, z, pattern); - affected++; - } - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + Vector min = region.getMinimumPoint(); + Vector max = region.getMaximumPoint(); + int maxY = max.getBlockY(); + int width = region.getWidth(); + int height = region.getLength(); + int bx = min.getBlockX(); + int bz = min.getBlockZ(); + Iterable flat = Regions.asFlatRegion(region).asFlatRegion(); + Iterator iter = new Fast2DIterator(flat, editSession).iterator(); + int y = 0; + int affected = 0; + MutableBlockVector mutable = new MutableBlockVector(); + while (iter.hasNext()) { + Vector2D pos = iter.next(); + int x = pos.getBlockX(); + int z = pos.getBlockZ(); + y = editSession.getNearestSurfaceTerrainBlock(x, z, y, 0, maxY); + editSession.setBlock(x, y, z, pattern); + affected++; + } + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -412,9 +412,10 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.naturalize") @Logging(REGION) public void naturalize(FawePlayer player, EditSession editSession, @Selection Region region, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - int affected = editSession.naturalizeCuboidBlocks(region); - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + int affected = editSession.naturalizeCuboidBlocks(region); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -427,9 +428,10 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.walls") @Logging(REGION) public void walls(FawePlayer player, EditSession editSession, @Selection Region region, Pattern pattern, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - int affected = editSession.makeWalls(region, pattern); - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + int affected = editSession.makeWalls(region, pattern); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -442,9 +444,10 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.faces") @Logging(REGION) public void faces(FawePlayer player, EditSession editSession, @Selection Region region, Pattern pattern, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - int affected = editSession.makeCuboidFaces(region, pattern); - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + int affected = editSession.makeCuboidFaces(region, pattern); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -470,11 +473,12 @@ public class RegionCommands extends MethodCommands { if (volume >= limit.MAX_CHECKS) { throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_CHECKS); } - player.checkConfirmationRegion(getArguments(context), region); - HeightMap heightMap = new HeightMap(editSession, region, affectNatural, snow); - HeightMapFilter filter = (HeightMapFilter) HeightMapFilter.class.getConstructors()[0].newInstance(GaussianKernel.class.getConstructors()[0].newInstance(5, 1)); - int affected = heightMap.applyFilter(filter, iterations); - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + HeightMap heightMap = new HeightMap(editSession, region, affectNatural, snow); + HeightMapFilter filter = (HeightMapFilter) HeightMapFilter.class.getConstructors()[0].newInstance(GaussianKernel.class.getConstructors()[0].newInstance(5, 1)); + int affected = heightMap.applyFilter(filter, iterations); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } catch (Throwable e) { throw new RuntimeException(e); } @@ -540,22 +544,22 @@ public class RegionCommands extends MethodCommands { @Switch('a') boolean skipAir, @Switch('s') boolean moveSelection, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); + player.checkConfirmationRegion(() -> { + int affected = editSession.moveRegion(region, direction, count, !skipAir, !skipEntities, copyBiomes, replace); - int affected = editSession.moveRegion(region, direction, count, !skipAir, !skipEntities, copyBiomes, replace); + if (moveSelection) { + try { + region.shift(direction.multiply(count)); - if (moveSelection) { - try { - region.shift(direction.multiply(count)); - - session.getRegionSelector(player.getWorld()).learnChanges(); - session.getRegionSelector(player.getWorld()).explainRegionAdjust(player.getPlayer(), session); - } catch (RegionOperationException e) { - player.sendMessage(BBC.getPrefix() + e.getMessage()); + session.getRegionSelector(player.getWorld()).learnChanges(); + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player.getPlayer(), session); + } catch (RegionOperationException e) { + player.sendMessage(BBC.getPrefix() + e.getMessage()); + } } - } - BBC.VISITOR_BLOCK.send(player, affected); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -576,9 +580,10 @@ public class RegionCommands extends MethodCommands { @Optional("air") BlockStateHolder replace, @Switch('m') boolean notFullHeight, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - int affected = editSession.fall(region, !notFullHeight, replace); - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + int affected = editSession.fall(region, !notFullHeight, replace); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -604,26 +609,27 @@ public class RegionCommands extends MethodCommands { @Switch('b') boolean copyBiomes, @Switch('e') boolean skipEntities, @Switch('a') boolean ignoreAirBlocks, @Switch('m') Mask sourceMask, CommandContext context) throws WorldEditException { - player.checkConfirmationStack(getArguments(context), region, count); - if (sourceMask != null) { - editSession.addSourceMask(sourceMask); - } - int affected = editSession.stackCuboidRegion(region, direction, count, !ignoreAirBlocks, !skipEntities, copyBiomes); - - if (moveSelection) { - try { - final Vector size = region.getMaximumPoint().subtract(region.getMinimumPoint()).add(1, 1, 1); - Vector shiftVector = new Vector(direction.getX() * size.getX() * count, direction.getY() * size.getY() * count, direction.getZ() * size.getZ() * count); - region.shift(shiftVector); - - session.getRegionSelector(player.getWorld()).learnChanges(); - session.getRegionSelector(player.getWorld()).explainRegionAdjust(player.getPlayer(), session); - } catch (RegionOperationException e) { - player.sendMessage(BBC.getPrefix() + e.getMessage()); + player.checkConfirmationStack(() -> { + if (sourceMask != null) { + editSession.addSourceMask(sourceMask); } - } + int affected = editSession.stackCuboidRegion(region, direction, count, !ignoreAirBlocks, !skipEntities, copyBiomes); - BBC.VISITOR_BLOCK.send(player, affected); + if (moveSelection) { + try { + final Vector size = region.getMaximumPoint().subtract(region.getMinimumPoint()).add(1, 1, 1); + Vector shiftVector = new Vector(direction.getX() * size.getX() * count, direction.getY() * size.getY() * count, direction.getZ() * size.getZ() * count); + region.shift(shiftVector); + + session.getRegionSelector(player.getWorld()).learnChanges(); + session.getRegionSelector(player.getWorld()).explainRegionAdjust(player.getPlayer(), session); + } catch (RegionOperationException e) { + player.sendMessage(BBC.getPrefix() + e.getMessage()); + } + } + + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region, count); } @Command( @@ -647,35 +653,36 @@ public class RegionCommands extends MethodCommands { @Switch('r') boolean useRawCoords, @Switch('o') boolean offset, CommandContext context) throws WorldEditException { - fp.checkConfirmationRegion(getArguments(context), region); - final Vector zero; - Vector unit; + fp.checkConfirmationRegion(() -> { + final Vector zero; + Vector unit; - if (useRawCoords) { - zero = Vector.ZERO; - unit = Vector.ONE; - } else if (offset) { - zero = session.getPlacementPosition(player); - unit = Vector.ONE; - } else { - final Vector min = region.getMinimumPoint(); - final Vector max = region.getMaximumPoint(); + if (useRawCoords) { + zero = Vector.ZERO; + unit = Vector.ONE; + } else if (offset) { + zero = session.getPlacementPosition(player); + unit = Vector.ONE; + } else { + final Vector min = region.getMinimumPoint(); + final Vector max = region.getMaximumPoint(); - zero = max.add(min).multiply(0.5); - unit = max.subtract(zero); + zero = max.add(min).multiply(0.5); + unit = max.subtract(zero); - if (unit.getX() == 0) unit.mutX(1); - if (unit.getY() == 0) unit.mutY(1); - if (unit.getZ() == 0) unit.mutZ(1); - } + if (unit.getX() == 0) unit.mutX(1); + if (unit.getY() == 0) unit.mutY(1); + if (unit.getZ() == 0) unit.mutZ(1); + } - try { - final int affected = editSession.deformRegion(region, zero, unit, expression); - player.findFreePosition(); - BBC.VISITOR_BLOCK.send(fp, affected); - } catch (ExpressionException e) { - fp.sendMessage(BBC.getPrefix() + e.getMessage()); - } + try { + final int affected = editSession.deformRegion(region, zero, unit, expression); + player.findFreePosition(); + BBC.VISITOR_BLOCK.send(fp, affected); + } catch (ExpressionException e) { + fp.sendMessage(BBC.getPrefix() + e.getMessage()); + } + }, getArguments(context), region); } @Command( @@ -692,33 +699,35 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.regen") @Logging(REGION) public void regenerateChunk(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, CommandContext args) throws WorldEditException { - player.checkConfirmationRegion(getArguments(args), region); + player.checkConfirmationRegion(() -> { + Mask mask = session.getMask(); + Mask sourceMask = session.getSourceMask(); + session.setMask((Mask) null); + session.setSourceMask((Mask) null); + BaseBiome biome = null; + if (args.argsLength() >= 1) { + BiomeRegistry biomeRegistry = worldEdit.getPlatformManager().queryCapability(Capability.GAME_HOOKS).getRegistries().getBiomeRegistry(); + List knownBiomes = biomeRegistry.getBiomes(); + biome = Biomes.findBiomeByName(knownBiomes, args.getString(0), biomeRegistry); + } + Long seed = args.argsLength() != 2 || !MathMan.isInteger(args.getString(1)) ? null : Long.parseLong(args.getString(1)); + editSession.regenerate(region, biome, seed); + session.setMask(mask); + session.setSourceMask(mask); + if (!player.hasPermission("fawe.tips")) { + BBC.COMMAND_REGEN_2.send(player); + } else if (biome == null) { + BBC.COMMAND_REGEN_0.send(player); + if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) BBC.TIP_REGEN_0.send(player); + } else if (seed == null) { + BBC.COMMAND_REGEN_1.send(player); + if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) BBC.TIP_REGEN_1.send(player); + } else { + BBC.COMMAND_REGEN_2.send(player); + } + }, getArguments(args), region); + - Mask mask = session.getMask(); - Mask sourceMask = session.getSourceMask(); - session.setMask((Mask) null); - session.setSourceMask((Mask) null); - BaseBiome biome = null; - if (args.argsLength() >= 1) { - BiomeRegistry biomeRegistry = worldEdit.getPlatformManager().queryCapability(Capability.GAME_HOOKS).getRegistries().getBiomeRegistry(); - List knownBiomes = biomeRegistry.getBiomes(); - biome = Biomes.findBiomeByName(knownBiomes, args.getString(0), biomeRegistry); - } - Long seed = args.argsLength() != 2 || !MathMan.isInteger(args.getString(1)) ? null : Long.parseLong(args.getString(1)); - editSession.regenerate(region, biome, seed); - session.setMask(mask); - session.setSourceMask(mask); - if (!player.hasPermission("fawe.tips")) { - BBC.COMMAND_REGEN_2.send(player); - } else if (biome == null) { - BBC.COMMAND_REGEN_0.send(player); - if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) BBC.TIP_REGEN_0.send(player); - } else if (seed == null) { - BBC.COMMAND_REGEN_1.send(player); - if (!FawePlayer.wrap(player).hasPermission("fawe.tips")) BBC.TIP_REGEN_1.send(player); - } else { - BBC.COMMAND_REGEN_2.send(player); - } } @Command( @@ -739,9 +748,10 @@ public class RegionCommands extends MethodCommands { @Optional("0") @Range(min = 0) int thickness, @Optional("air") Pattern pattern, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - int affected = editSession.hollowOutRegion(region, thickness, pattern); - BBC.VISITOR_BLOCK.send(player, affected); + player.checkConfirmationRegion(() -> { + int affected = editSession.hollowOutRegion(region, thickness, pattern); + BBC.VISITOR_BLOCK.send(player, affected); + }, getArguments(context), region); } @Command( @@ -756,16 +766,16 @@ public class RegionCommands extends MethodCommands { public void forest(FawePlayer player, EditSession editSession, @Selection Region region, @Optional("tree") TreeType type, @Optional("5") @Range(min = 0, max = 100) double density, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); + player.checkConfirmationRegion(() -> { + ForestGenerator generator = new ForestGenerator(editSession, type); + GroundFunction ground = new GroundFunction(new ExistingBlockMask(editSession), generator); + LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground); + visitor.setMask(new NoiseFilter2D(new RandomNoise(), density / 100)); + Operations.completeLegacy(visitor); - density = density / 100; - ForestGenerator generator = new ForestGenerator(editSession, type); - GroundFunction ground = new GroundFunction(new ExistingBlockMask(editSession), generator); - LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground); - visitor.setMask(new NoiseFilter2D(new RandomNoise(), density)); - Operations.completeLegacy(visitor); + BBC.COMMAND_TREE.send(player, ground.getAffected()); + }, getArguments(context), region); - BBC.COMMAND_TREE.send(player, ground.getAffected()); } @Command( @@ -778,15 +788,15 @@ public class RegionCommands extends MethodCommands { @CommandPermissions("worldedit.region.flora") @Logging(REGION) public void flora(FawePlayer player, EditSession editSession, @Selection Region region, @Optional("10") @Range(min = 0, max = 100) double density, CommandContext context) throws WorldEditException { - player.checkConfirmationRegion(getArguments(context), region); - density = density / 100; - FloraGenerator generator = new FloraGenerator(editSession); - GroundFunction ground = new GroundFunction(new ExistingBlockMask(editSession), generator); - LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground); - visitor.setMask(new NoiseFilter2D(new RandomNoise(), density)); - Operations.completeLegacy(visitor); + player.checkConfirmationRegion(() -> { + FloraGenerator generator = new FloraGenerator(editSession); + GroundFunction ground = new GroundFunction(new ExistingBlockMask(editSession), generator); + LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground); + visitor.setMask(new NoiseFilter2D(new RandomNoise(), density / 100)); + Operations.completeLegacy(visitor); - BBC.COMMAND_FLORA.send(player, ground.getAffected()); + BBC.COMMAND_FLORA.send(player, ground.getAffected()); + }, getArguments(context), region); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index bddbd716c..f69f4d310 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -173,8 +173,7 @@ public class UtilityCommands extends MethodCommands { @Command( aliases = {"/heightmapinterface"}, - desc = "Generate the heightmap interface: https://github.com/boy0001/HeightMap", - max = 0 + desc = "Generate the heightmap interface: https://github.com/boy0001/HeightMap" ) public void heightmapInterface(FawePlayer player, @Optional("100") int min, @Optional("200") int max) throws IOException { player.sendMessage("Please wait while we generate the minified heightmaps."); @@ -200,7 +199,7 @@ public class UtilityCommands extends MethodCommands { if (name.startsWith(File.separator)) name = name.replaceFirst(java.util.regex.Pattern.quote(File.separator), ""); BufferedImage img = MainUtil.readImage(file); BufferedImage minImg = ImageUtil.getScaledInstance(img, min, min, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true); - BufferedImage maxImg = ImageUtil.getScaledInstance(img, max, max, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true); + BufferedImage maxImg = max == -1 ? img : ImageUtil.getScaledInstance(img, max, max, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true); player.sendMessage("Writing " + name); File minFile = new File(minImages, name); File maxFile = new File(maxImages, name); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java index 0790787f4..2e1c58d08 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/event/platform/CommandEvent.java @@ -21,13 +21,14 @@ package com.sk89q.worldedit.event.platform; import com.sk89q.worldedit.event.AbstractCancellable; import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extension.platform.CommandManager; import static com.google.common.base.Preconditions.checkNotNull; /** * This class is currently only for internal use. Do not post or catch this event. */ -public class CommandEvent extends AbstractCancellable { +public class CommandEvent extends AbstractCancellable implements Runnable { private final Actor actor; private final String arguments; @@ -64,4 +65,8 @@ public class CommandEvent extends AbstractCancellable { return arguments; } + @Override + public void run() { + CommandManager.getInstance().handleCommandOnCurrentThread(this); + } }