From a476ab1ea0dca3cb50f8ef695e24cec4990fd40c Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Wed, 7 Aug 2019 01:29:49 +1000 Subject: [PATCH] merge --- .../worldedit/command/ClipboardCommands.java | 29 ++- .../worldedit/command/GenerationCommands.java | 45 ++-- .../worldedit/command/HistoryCommands.java | 2 +- .../sk89q/worldedit/command/ListFilters.java | 3 +- .../sk89q/worldedit/command/MaskCommands.java | 54 +++-- .../worldedit/command/SchematicCommands.java | 46 ++-- .../worldedit/command/SelectionCommands.java | 144 +++++++------ .../worldedit/command/SnapshotCommands.java | 32 +-- .../command/SnapshotUtilCommands.java | 32 +-- .../worldedit/command/WorldEditCommands.java | 20 +- .../com/sk89q/worldedit/entity/Entity.java | 27 +-- .../com/sk89q/worldedit/entity/Player.java | 6 +- .../parser/mask/DefaultMaskParser.java | 198 ++++++++---------- .../parser/pattern/DefaultPatternParser.java | 26 +-- .../platform/AbstractPlayerActor.java | 162 ++++++++------ .../worldedit/extension/platform/Actor.java | 2 +- .../function/mask/BlockMaskBuilder.java | 2 +- .../function/mask/MaskIntersection.java | 17 +- .../worldedit/function/mask/MaskUnion.java | 8 +- .../function/pattern/BlockPattern.java | 4 +- .../function/visitor/RegionVisitor.java | 4 + .../worldedit/function/visitor/ScanChunk.java | 44 ++-- .../WorldEditExceptionConverter.java | 11 +- .../worldedit/math/convolution/HeightMap.java | 10 +- .../java/com/sk89q/worldedit/world/World.java | 8 +- .../worldedit/world/block/BaseBlock.java | 4 +- .../worldedit/world/block/BlockState.java | 6 +- 27 files changed, 461 insertions(+), 485 deletions(-) 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 36f19c2c8..4e24f8282 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 @@ -19,6 +19,10 @@ package com.sk89q.worldedit.command; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.sk89q.worldedit.command.util.Logging.LogMode.PLACEMENT; +import static com.sk89q.worldedit.command.util.Logging.LogMode.REGION; + import com.boydti.fawe.FaweAPI; import com.boydti.fawe.config.BBC; import com.boydti.fawe.config.Settings; @@ -35,10 +39,6 @@ import com.boydti.fawe.object.schematic.Schematic; import com.boydti.fawe.util.ImgurUtility; import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.MaskTraverser; - -import static com.google.common.base.Preconditions.checkNotNull; -import org.enginehub.piston.inject.InjectedValueAccess; - import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.LocalConfiguration; import com.sk89q.worldedit.LocalSession; @@ -47,8 +47,6 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.util.CommandPermissions; import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.command.util.Logging; -import static com.sk89q.worldedit.command.util.Logging.LogMode.PLACEMENT; -import static com.sk89q.worldedit.command.util.Logging.LogMode.REGION; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.event.extent.PasteEvent; import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; @@ -74,12 +72,6 @@ import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.RegionSelector; import com.sk89q.worldedit.regions.selector.CuboidRegionSelector; import com.sk89q.worldedit.session.ClipboardHolder; -import org.enginehub.piston.annotation.Command; -import org.enginehub.piston.annotation.CommandContainer; -import org.enginehub.piston.annotation.param.Arg; -import org.enginehub.piston.annotation.param.ArgFlag; -import org.enginehub.piston.annotation.param.Switch; - import java.io.File; import java.io.IOException; import java.io.OutputStream; @@ -91,6 +83,12 @@ import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.enginehub.piston.annotation.Command; +import org.enginehub.piston.annotation.CommandContainer; +import org.enginehub.piston.annotation.param.Arg; +import org.enginehub.piston.annotation.param.ArgFlag; +import org.enginehub.piston.annotation.param.Switch; +import org.enginehub.piston.inject.InjectedValueAccess; /** @@ -128,7 +126,8 @@ public class ClipboardCommands { BlockVector3 min = region.getMinimumPoint(); BlockVector3 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)); + 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 FaweException.MAX_CHECKS; @@ -159,7 +158,7 @@ public class ClipboardCommands { if (!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, context); + }, "/copy", region, context); } @Command( @@ -283,7 +282,7 @@ public class ClipboardCommands { if (!player.hasPermission("fawe.tips")) { BBC.TIP_LAZYCUT.send(player); } - }, getArguments(context), region, context); + }, "cut", region, context); } 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 cd546794c..f15c2e22b 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 @@ -93,7 +93,7 @@ public class GenerationCommands { @CommandPermissions("worldedit.generation.caves") @Logging(PLACEMENT) public void caves(FawePlayer fp, LocalSession session, EditSession editSession, @Selection Region region, - @Arg(desc = "TODO", def = "8") int size, + @Arg(name = "size", desc = "TODO", def = "8") int sizeOpt, @Arg(desc = "TODO", def = "40") int frequency, @Arg(desc = "TODO", def = "7") int rarity, @Arg(desc = "TODO", def = "8") int minY, @@ -104,10 +104,10 @@ public class GenerationCommands { @Arg(desc = "TODO", def = "0") int pocketMin, @Arg(desc = "TODO", def = "3") int pocketMax, InjectedValueAccess context) throws WorldEditException { fp.checkConfirmationRegion(() -> { - CavesGen gen = new CavesGen(size, frequency, rarity, minY, maxY, systemFrequency, individualRarity, pocketChance, pocketMin, pocketMax); + CavesGen gen = new CavesGen(sizeOpt, frequency, rarity, minY, maxY, systemFrequency, individualRarity, pocketChance, pocketMin, pocketMax); editSession.generate(region, gen); BBC.VISITOR_BLOCK.send(fp, editSession.getBlockChangeCount()); - }, getArguments(context), region, context); + }, "/caves", region, context); } @@ -117,11 +117,11 @@ public class GenerationCommands { ) @CommandPermissions("worldedit.generation.ore") @Logging(PLACEMENT) - public void ores(FawePlayer player, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, InjectedValueAccess context) throws WorldEditException { - player.checkConfirmationRegion(() -> { + public void ores(FawePlayer fp, LocalSession session, EditSession editSession, @Selection Region region, Mask mask, InjectedValueAccess context) throws WorldEditException { + fp.checkConfirmationRegion(() -> { editSession.addOres(region, mask); - BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); - }, getArguments(context), region, context); + BBC.VISITOR_BLOCK.send(fp, editSession.getBlockChangeCount()); + }, "/ores", region, context); } @Command( @@ -171,11 +171,11 @@ public class GenerationCommands { ) @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, InjectedValueAccess context) throws WorldEditException { - player.checkConfirmationRegion(() -> { + public void ore(FawePlayer fp, 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, InjectedValueAccess context) throws WorldEditException { + fp.checkConfirmationRegion(() -> { editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY); - BBC.VISITOR_BLOCK.send(player, editSession.getBlockChangeCount()); - }, getArguments(context), region, context); + BBC.VISITOR_BLOCK.send(fp, editSession.getBlockChangeCount()); + }, "/ore", region, context); } @Command( @@ -197,7 +197,7 @@ public class GenerationCommands { 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, context); + }, "/hcyl", (int) max, context); } @Command( @@ -220,7 +220,7 @@ public class GenerationCommands { 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, context); + }, "/cyl", (int) max, context); } @Command( @@ -262,7 +262,7 @@ public class GenerationCommands { int affected = editSession.makeSphere(finalPos, pattern, radii.getX(), radii.getY(), radii.getZ(), !hollow); player.findFreePosition(); BBC.VISITOR_BLOCK.send(fp, affected); - }, getArguments(context), (int) max, context); + }, "sphere", (int) max, context); } @Command( @@ -272,15 +272,15 @@ public class GenerationCommands { @CommandPermissions("worldedit.generation.forest") @Logging(POSITION) public int forestGen(Player player, LocalSession session, EditSession editSession, - @Arg(desc = "The size of the forest, in blocks", def = "10") - int size, + @Arg(name = "size", desc = "The size of the forest, in blocks", def = "10") + int sizeOpt, @Arg(desc = "The type of forest", def = "tree") TreeType type, @Range(min = 0, max = 100) @Arg(desc = "The density of the forest, between 0 and 100", def = "5") double density) throws WorldEditException { checkCommandArgument(0 <= density && density <= 100, "Density must be between 0 and 100"); density /= 100; - int affected = editSession.makeForest(session.getPlacementPosition(player), size, density, type); + int affected = editSession.makeForest(session.getPlacementPosition(player), sizeOpt, density, type); player.print(affected + " trees created."); return affected; } @@ -292,12 +292,13 @@ public class GenerationCommands { @CommandPermissions("worldedit.generation.pumpkins") @Logging(POSITION) public int pumpkins(Player player, LocalSession session, EditSession editSession, - @Arg(desc = "The size of the patch", def = "10") - int size, + @Arg(name = "size", desc = "The size of the patch", def = "10") + int sizeOpt, @Arg(desc = "//TODO", def = "10") int apothem, - @Range(min = 0, max = 100) @Arg(desc = "//TODO ", def = "0.02") + @Arg(desc = "//TODO ", def = "0.02") double density) throws WorldEditException { + checkCommandArgument(0 <= density && density <= 100, "Density must be between 0 and 100"); int affected = editSession.makePumpkinPatches(session.getPlacementPosition(player), apothem, density); BBC.COMMAND_PUMPKIN.send(player, affected); return affected; @@ -401,7 +402,7 @@ public class GenerationCommands { } catch (ExpressionException e) { player.printError(e.getMessage()); } - }, getArguments(context), region, context); + }, "/generate", region, context); } @Command( @@ -464,7 +465,7 @@ public class GenerationCommands { } catch (ExpressionException e) { fp.printError(e.getMessage()); } - }, getArguments(context), region, context); + }, "/generatebiome", region, context); } } 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 ef90d74a9..a65fd30f5 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 @@ -257,7 +257,7 @@ public class HistoryCommands { if (undone == null) { BBC.COMMAND_UNDO_ERROR.send(player); } - }, getArguments(context), times, 50, context); + }, "undo", times, 50, context); } @Command( diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java index 7924d9b49..2b390d2fa 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ListFilters.java @@ -10,11 +10,10 @@ import java.util.UUID; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.enginehub.piston.annotation.Command; -import org.enginehub.piston.annotation.CommandContainer; import org.enginehub.piston.exception.StopExecutionException; //TODO This class breaks compilation -@CommandContainer +//@CommandContainer public class ListFilters { public class Filter { public boolean listPrivate() { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java index 89706f114..c730ded0c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/MaskCommands.java @@ -72,7 +72,7 @@ public class MaskCommands { name = "#simplex", desc = "Use simplex noise as the mask" ) - public Mask simplex(double scale, double min, double max) { + public Mask simplex(double scale, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { scale = 1d / Math.max(1, scale); min = (min - 50) / 50; max = (max - 50) / 50; @@ -83,13 +83,12 @@ public class MaskCommands { name = "#light", desc = "Restrict to specific light levels" ) - public Mask light(Extent extent, double min, double max) { + public Mask light(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { return new LightMask(extent, (int) min, (int) max); } @Command( name = "#false", - aliases = {"false"}, desc = "Always false" ) public Mask falseMask(Extent extent) { @@ -98,7 +97,6 @@ public class MaskCommands { @Command( name = "#true", - aliases = {"true"}, desc = "Always true" ) public Mask trueMask(Extent extent) { @@ -109,8 +107,8 @@ public class MaskCommands { name = "#skylight", desc = "Restrict to specific sky light levels" ) - public Mask skylight(Extent extent, double min, double max) { - return new SkyLightMask(extent, (int) min, (int) max); + public Mask skylight(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { + return new SkyLightMask(extent, (int) minInt, (int) maxInt); } @Command( @@ -118,24 +116,24 @@ public class MaskCommands { aliases = {"#emittedlight"}, desc = "Restrict to specific block light levels" ) - public Mask blocklight(Extent extent, double min, double max) { - return new BlockLightMask(extent, (int) min, (int) max); + public Mask blocklight(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { + return new BlockLightMask(extent, (int) minInt, (int) maxInt); } @Command( name = "#opacity", desc = "Restrict to specific opacity levels" ) - public Mask opacity(Extent extent, double min, double max) { - return new OpacityMask(extent, (int) min, (int) max); + public Mask opacity(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { + return new OpacityMask(extent, (int) minInt, (int) maxInt); } @Command( name = "#brightness", desc = "Restrict to specific block brightness" ) - public Mask brightness(Extent extent, double min, double max) { - return new BrightnessMask(extent, (int) min, (int) max); + public Mask brightness(Extent extent, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) { + return new BrightnessMask(extent, (int) minInt, (int) maxInt); } @Command( @@ -288,17 +286,17 @@ public class MaskCommands { "Example: /[3][20]\n" + "Explanation: Allows any block where the adjacent block is between 3 and 20 blocks below" ) - public Mask angle(Extent extent, String min, String max, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "1") int distance) throws ExpressionException { + public Mask angle(Extent extent, String minStr, String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "1") int distance) throws ExpressionException { double y1, y2; boolean override; - if (max.endsWith("d")) { - double y1d = Expression.compile(min.substring(0, min.length() - 1)).evaluate(); - double y2d = Expression.compile(max.substring(0, max.length() - 1)).evaluate(); + if (maxStr.endsWith("d")) { + double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate(); + double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate(); y1 = Math.tan(y1d * (Math.PI / 180)); y2 = Math.tan(y2d * (Math.PI / 180)); } else { - y1 = Expression.compile(min).evaluate(); - y2 = Expression.compile(max).evaluate(); + y1 = Expression.compile(minStr).evaluate(); + y2 = Expression.compile(maxStr).evaluate(); } return new AngleMask(extent, y1, y2, overlay, distance); } @@ -313,17 +311,17 @@ public class MaskCommands { "Explanation: Restrict near where the angle changes between 0-45 degrees within 5 blocks\n" + "Note: Use negatives for decreasing slope" ) - public Mask roc(Extent extent, String min, String max, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "4") int distance) throws ExpressionException { + public Mask roc(Extent extent, String minStr, String maxStr, @Switch(name = 'o', desc = "TODO") boolean overlay, @Arg(name = "distance", desc = "int", def = "4") int distance) throws ExpressionException { double y1, y2; boolean override; - if (max.endsWith("d")) { - double y1d = Expression.compile(min.substring(0, min.length() - 1)).evaluate(); - double y2d = Expression.compile(max.substring(0, max.length() - 1)).evaluate(); + if (maxStr.endsWith("d")) { + double y1d = Expression.compile(minStr.substring(0, minStr.length() - 1)).evaluate(); + double y2d = Expression.compile(maxStr.substring(0, maxStr.length() - 1)).evaluate(); y1 = Math.tan(y1d * (Math.PI / 180)); y2 = Math.tan(y2d * (Math.PI / 180)); } else { - y1 = Expression.compile(min).evaluate(); - y2 = Expression.compile(max).evaluate(); + y1 = Expression.compile(minStr).evaluate(); + y2 = Expression.compile(maxStr).evaluate(); } return new ROCAngleMask(extent, y1, y2, overlay, distance); } @@ -358,8 +356,8 @@ public class MaskCommands { aliases = {"#{"}, desc = "Restricts blocks to within a specific radius range of the initial block" ) - public Mask radius(double min, double max) throws ExpressionException { - return new RadiusMask((int) min, (int) max); + public Mask radius(@Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) throws ExpressionException { + return new RadiusMask((int) minInt, (int) maxInt); } @Command( @@ -367,8 +365,8 @@ public class MaskCommands { aliases = {"#|", "#side"}, desc = "sides with a specific number of other blocks" ) - public Mask wall(Mask mask, double min, double max) throws ExpressionException { - return new WallMask(mask, (int) min, (int) max); + public Mask wall(Mask mask, @Arg(name="mine", desc = "min light") double minInt, @Arg(name="mine", desc = "max light") double maxInt) throws ExpressionException { + return new WallMask(mask, (int) minInt, (int) maxInt); } @Command( diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java index 6cd085572..3496c042c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SchematicCommands.java @@ -292,7 +292,7 @@ public class SchematicCommands { desc = "Save a schematic into your clipboard" ) @CommandPermissions({"worldedit.clipboard.save", "worldedit.schematic.save", "worldedit.schematic.save.other"}) - public void save(Player player, LocalSession session, + public void save(Actor actor, LocalSession session, @Arg(desc = "File name.") String filename, @Arg(desc = "Format name.", def = "sponge") @@ -307,20 +307,20 @@ public class SchematicCommands { File dir = worldEdit.getWorkingDirectoryFile(config.saveDir); if (!global && Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS) { - dir = new File(dir, player.getUniqueId().toString()); + dir = new File(dir, actor.getUniqueId().toString()); } ClipboardFormat format = ClipboardFormats.findByAlias(formatName); if (format == null) { - player.printError("Unknown schematic format: " + formatName); + actor.printError("Unknown schematic format: " + formatName); return; } boolean other = false; if (filename.contains("../")) { other = true; - if (!player.hasPermission("worldedit.schematic.save.other")) { - BBC.NO_PERM.send(player, "worldedit.schematic.save.other"); + if (!actor.hasPermission("worldedit.schematic.save.other")) { + BBC.NO_PERM.send(actor, "worldedit.schematic.save.other"); return; } if (filename.startsWith("../")) { @@ -329,21 +329,21 @@ public class SchematicCommands { } } - File f = worldEdit.getSafeSaveFile(player, dir, filename, format.getPrimaryFileExtension()); + File f = worldEdit.getSafeSaveFile(actor, dir, filename, format.getPrimaryFileExtension()); boolean overwrite = f.exists(); if (overwrite) { - if (!player.hasPermission("worldedit.schematic.delete")) { + if (!actor.hasPermission("worldedit.schematic.delete")) { throw new StopExecutionException(TextComponent.of("That schematic already exists!")); } if (other) { - if (!player.hasPermission("worldedit.schematic.delete.other")) { + if (!actor.hasPermission("worldedit.schematic.delete.other")) { BBC.NO_PERM.send(player, "worldedit.schematic.delete.other"); return; } } if (!allowOverwrite) { - player.printError("That schematic already exists. Use the -f flag to overwrite it."); + actor.printError("That schematic already exists. Use the -f flag to overwrite it."); return; } } @@ -359,8 +359,8 @@ public class SchematicCommands { ClipboardHolder holder = session.getClipboard(); - SchematicSaveTask task = new SchematicSaveTask(player, f, format, holder, overwrite); - AsyncCommandBuilder.wrap(task, player) + SchematicSaveTask task = new SchematicSaveTask(actor, f, format, holder, overwrite); + AsyncCommandBuilder.wrap(task, actor) .registerWithSupervisor(worldEdit.getSupervisor(), "Saving schematic " + filename) .sendMessageAfterDelay("(Please wait... saving schematic.)") .onSuccess(filename + " saved" + (overwrite ? " (overwriting previous file)." : "."), null) @@ -577,7 +577,7 @@ public class SchematicCommands { boolean oldFirst, @Switch(name = 'n', desc = "Sort by date, newest first") boolean newFirst, - @Switch(name = 'f', desc = "Restricts by format.") + @ArgFlag(name = 'f', desc = "Restricts by format.") String formatName, @Arg(name = "filter", desc = "Filter for schematics", def = "all") String filter) throws WorldEditException { @@ -635,12 +635,12 @@ public class SchematicCommands { } private static class SchematicLoadTask implements Callable { - private final Player player; + private final Actor actor; private final File file; private final ClipboardFormat format; - SchematicLoadTask(Player player, File file, ClipboardFormat format) { - this.player = player; + SchematicLoadTask(Actor actor, File file, ClipboardFormat format) { + this.actor = actor; this.file = file; this.format = format; } @@ -653,21 +653,21 @@ public class SchematicCommands { ClipboardReader reader = closer.register(format.getReader(bis)); Clipboard clipboard = reader.read(); - log.info(player.getName() + " loaded " + file.getCanonicalPath()); + log.info(actor.getName() + " loaded " + file.getCanonicalPath()); return new ClipboardHolder(clipboard); } } } private static class SchematicSaveTask implements Callable { - private final Player player; + private final Actor actor; private final File file; private final ClipboardFormat format; private final ClipboardHolder holder; private final boolean overwrite; - SchematicSaveTask(Player player, File file, ClipboardFormat format, ClipboardHolder holder, boolean overwrite) { - this.player = player; + SchematicSaveTask(Actor actor, File file, ClipboardFormat format, ClipboardHolder holder, boolean overwrite) { + this.actor = actor; this.file = file; this.format = format; this.holder = holder; @@ -700,14 +700,14 @@ public class SchematicCommands { } if (new PlayerSaveClipboardEvent(player, clipboard, uri, file.toURI()).call()) { if (writer instanceof MinecraftStructure) { - ((MinecraftStructure) writer).write(target, player.getName()); + ((MinecraftStructure) writer).write(target, actor.getName()); } else { writer.write(target); } - log.info(player.getName() + " saved " + file.getCanonicalPath()); - BBC.SCHEMATIC_SAVED.send(player, file.getName()); + log.info(actor.getName() + " saved " + file.getCanonicalPath()); + BBC.SCHEMATIC_SAVED.send(actor, file.getName()); } else { - BBC.WORLDEDIT_CANCEL_REASON_MANUAL.send(player); + BBC.WORLDEDIT_CANCEL_REASON_MANUAL.send(actor); } } return null; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java index 591f61d76..5481447e6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java @@ -40,6 +40,8 @@ import com.sk89q.worldedit.command.util.CommandPermissions; import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.command.util.Logging; import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extension.platform.Locatable; import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.clipboard.Clipboard; @@ -61,6 +63,7 @@ import com.sk89q.worldedit.regions.selector.RegionSelectorType; import com.sk89q.worldedit.regions.selector.SphereRegionSelector; import com.sk89q.worldedit.session.ClipboardHolder; import com.sk89q.worldedit.util.Countable; +import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.formatting.component.CommandListBox; import com.sk89q.worldedit.util.formatting.component.SubtleFormat; import com.sk89q.worldedit.util.formatting.component.TextComponentProducer; @@ -99,23 +102,26 @@ public class SelectionCommands { ) @Logging(POSITION) @CommandPermissions("worldedit.selection.pos") - public void pos1(Player player, LocalSession session, + public void pos1(Actor actor, World world, LocalSession session, @Arg(desc = "Coordinates to set position 1 to", def = "") BlockVector3 coordinates) throws WorldEditException { - BlockVector3 pos; + Location pos; if (coordinates != null) { - pos = coordinates; + pos = new Location(world, coordinates.toVector3()); + } else if (actor instanceof Locatable) { + pos = ((Locatable) actor).getBlockLocation(); } else { - pos = player.getBlockIn().toBlockPoint(); - } - pos = pos.clampY(0, player.getWorld().getMaximumPoint().getBlockY()); - if (!session.getRegionSelector(player.getWorld()).selectPrimary(pos, ActorSelectorLimits.forActor(player))) { - BBC.SELECTOR_ALREADY_SET.send(player); + actor.printError("You must provide coordinates as console."); return; } - session.getRegionSelector(player.getWorld()) - .explainPrimarySelection(player, session, pos); + if (!session.getRegionSelector(world).selectPrimary(pos.toBlockPoint(), ActorSelectorLimits.forActor(actor))) { + BBC.SELECTOR_ALREADY_SET.send(actor); + return; + } + + session.getRegionSelector(world) + .explainPrimarySelection(actor, session, pos.toBlockPoint()); } @Command( @@ -124,23 +130,25 @@ public class SelectionCommands { ) @Logging(POSITION) @CommandPermissions("worldedit.selection.pos") - public void pos2(Player player, LocalSession session, + public void pos2(Actor actor, World world, LocalSession session, @Arg(desc = "Coordinates to set position 2 to", def = "") BlockVector3 coordinates) throws WorldEditException { - BlockVector3 pos; + Location pos; if (coordinates != null) { - pos = coordinates; + pos = new Location(world, coordinates.toVector3()); + } else if (actor instanceof Locatable) { + pos = ((Locatable) actor).getBlockLocation(); } else { - pos = player.getBlockIn().toBlockPoint(); + actor.printError("You must provide coordinates as console."); + return; } - pos = pos.clampY(0, player.getWorld().getMaximumPoint().getBlockY()); - if (!session.getRegionSelector(player.getWorld()).selectSecondary(pos, ActorSelectorLimits.forActor(player))) { - BBC.SELECTOR_ALREADY_SET.send(player); + if (!session.getRegionSelector(world).selectSecondary(pos.toBlockPoint(), ActorSelectorLimits.forActor(actor))) { + BBC.SELECTOR_ALREADY_SET.send(actor); return; } - session.getRegionSelector(player.getWorld()) - .explainSecondarySelection(player, session, pos); + session.getRegionSelector(world) + .explainSecondarySelection(actor, session, pos.toBlockPoint()); } @Command( @@ -222,7 +230,7 @@ public class SelectionCommands { : ChunkStore.toChunk(coordinates.toBlockVector3()); } else { // use player loc - min2D = ChunkStore.toChunk(player.getBlockIn().toBlockPoint()); + min2D = ChunkStore.toChunk(player.getBlockLocation().toBlockPoint()); } min = BlockVector3.at(min2D.getBlockX() * 16, 0, min2D.getBlockZ() * 16); @@ -296,7 +304,7 @@ public class SelectionCommands { ) @Logging(REGION) @CommandPermissions("worldedit.selection.contract") - public void contract(Player player, LocalSession session, + public void contract(Actor actor, World world, LocalSession session, @Arg(desc = "Amount to contract the selection by") int amount, @Arg(desc = "Amount to contract the selection by in the other direction", def = "0") @@ -305,7 +313,7 @@ public class SelectionCommands { @MultiDirection List direction) throws WorldEditException { try { - Region region = session.getSelection(player.getWorld()); + Region region = session.getSelection(world); int oldSize = region.getArea(); if (reverseAmount == 0) { for (BlockVector3 dir : direction) { @@ -316,15 +324,15 @@ public class SelectionCommands { region.contract(dir.multiply(amount), dir.multiply(-reverseAmount)); } } - session.getRegionSelector(player.getWorld()).learnChanges(); + session.getRegionSelector(world).learnChanges(); int newSize = region.getArea(); - session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); + session.getRegionSelector(world).explainRegionAdjust(actor, session); - BBC.SELECTION_CONTRACT.send(player, (oldSize - newSize)); + BBC.SELECTION_CONTRACT.send(actor, (oldSize - newSize)); } catch (RegionOperationException e) { - player.printError(e.getMessage()); + actor.printError(e.getMessage()); } } @@ -334,26 +342,26 @@ public class SelectionCommands { ) @Logging(REGION) @CommandPermissions("worldedit.selection.shift") - public void shift(Player player, LocalSession session, + public void shift(Actor actor, World world, LocalSession session, @Arg(desc = "Amount to shift the selection by") int amount, @Arg(desc = "Direction to contract", def = Direction.AIM) @MultiDirection List direction) throws WorldEditException { try { - Region region = session.getSelection(player.getWorld()); + Region region = session.getSelection(world); for (BlockVector3 dir : direction) { region.shift(dir.multiply(amount)); } - session.getRegionSelector(player.getWorld()).learnChanges(); + session.getRegionSelector(world).learnChanges(); - session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); + session.getRegionSelector(world).explainRegionAdjust(actor, session); - BBC.SELECTION_SHIFT.send(player); + BBC.SELECTION_SHIFT.send(actor); } catch (RegionOperationException e) { - player.printError(e.getMessage()); + actor.printError(e.getMessage()); } } @@ -363,18 +371,18 @@ public class SelectionCommands { ) @Logging(REGION) @CommandPermissions("worldedit.selection.outset") - public void outset(Player player, LocalSession session, + public void outset(Actor actor, World world, LocalSession session, @Arg(desc = "Amount to expand the selection by in all directions") int amount, @Switch(name = 'h', desc = "Only expand horizontally") boolean onlyHorizontal, @Switch(name = 'v', desc = "Only expand vertically") boolean onlyVertical) throws WorldEditException { - Region region = session.getSelection(player.getWorld()); + Region region = session.getSelection(world); region.expand(getChangesForEachDir(amount, onlyHorizontal, onlyVertical)); - session.getRegionSelector(player.getWorld()).learnChanges(); - session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); - BBC.SELECTION_OUTSET.send(player); + session.getRegionSelector(world).learnChanges(); + session.getRegionSelector(world).explainRegionAdjust(actor, session); + BBC.SELECTION_OUTSET.send(actor); } @Command( @@ -383,18 +391,18 @@ public class SelectionCommands { ) @Logging(REGION) @CommandPermissions("worldedit.selection.inset") - public void inset(Player player, LocalSession session, + public void inset(Actor actor, World world, LocalSession session, @Arg(desc = "Amount to contract the selection by in all directions") int amount, @Switch(name = 'h', desc = "Only contract horizontally") boolean onlyHorizontal, @Switch(name = 'v', desc = "Only contract vertically") boolean onlyVertical) throws WorldEditException { - Region region = session.getSelection(player.getWorld()); + Region region = session.getSelection(world); region.contract(getChangesForEachDir(amount, onlyHorizontal, onlyVertical)); - session.getRegionSelector(player.getWorld()).learnChanges(); - session.getRegionSelector(player.getWorld()).explainRegionAdjust(player, session); - BBC.SELECTION_INSET.send(player); + session.getRegionSelector(world).learnChanges(); + session.getRegionSelector(world).explainRegionAdjust(actor, session); + actor.print("Region inset."); } private BlockVector3[] getChangesForEachDir(int amount, boolean onlyHorizontal, boolean onlyVertical) { @@ -544,17 +552,16 @@ public class SelectionCommands { aliases = { ";", "/desel", "/deselect" }, desc = "Choose a region selector" ) - public void select(Player player, LocalSession session, EditSession editSession, + public void select(Actor actor, World world, LocalSession session, EditSession editSession, @Arg(desc = "Selector to switch to", def = "") SelectorChoice selector, @Arg(desc = "Selector mask", def = "") Mask mask, @Switch(name = 'd', desc = "Set default selector") boolean setDefaultSelector) throws WorldEditException { - final World world = player.getWorld(); if (selector == null) { session.getRegionSelector(world).clear(); - session.dispatchCUISelection(player); - BBC.SELECTION_CLEARED.send(player); + session.dispatchCUISelection(actor); + BBC.SELECTION_CLEARED.send(actor); return; } @@ -564,55 +571,56 @@ public class SelectionCommands { switch (selector) { case CUBOID: newSelector = new CuboidRegionSelector(oldSelector); - player.print(BBC.SEL_CUBOID.s()); + actor.print(BBC.SEL_CUBOID.s()); break; case EXTEND: newSelector = new ExtendingCuboidRegionSelector(oldSelector); - player.print(BBC.SEL_CUBOID_EXTEND.s()); + actor.print(BBC.SEL_CUBOID_EXTEND.s()); break; case POLY: { newSelector = new Polygonal2DRegionSelector(oldSelector); - player.print(BBC.SEL_2D_POLYGON.s()); - Optional limit = ActorSelectorLimits.forActor(player).getPolygonVertexLimit(); - limit.ifPresent(integer -> player.print(BBC.SEL_MAX.format(integer))); + actor.print(BBC.SEL_2D_POLYGON.s()); + Optional limit = ActorSelectorLimits.forActor(actor).getPolygonVertexLimit(); + limit.ifPresent(integer -> actor.print(BBC.SEL_MAX.format(integer))); break; } case ELLIPSOID: newSelector = new EllipsoidRegionSelector(oldSelector); - player.print(BBC.SEL_ELLIPSIOD.s()); + actor.print(BBC.SAL_ELLIPSOID.s()); break; case SPHERE: newSelector = new SphereRegionSelector(oldSelector); - player.print(BBC.SEL_SPHERE.s()); + actor.print(BBC.SEL_SPHERE.s()); break; case CYL: newSelector = new CylinderRegionSelector(oldSelector); - player.print(BBC.SEL_CYLINDRICAL.s()); + actor.print(BBC.SEL_CYLINDRICAL.s()); break; case CONVEX: case HULL: case POLYHEDRON: { newSelector = new ConvexPolyhedralRegionSelector(oldSelector); - player.print(BBC.SEL_CONVEX_POLYHEDRAL.s()); - Optional limit = ActorSelectorLimits.forActor(player).getPolyhedronVertexLimit(); - limit.ifPresent(integer -> player.print(BBC.SEL_MAX.format(integer))); + actor.print(BBC.SEL_CONVEX_POLYHEDRAL.s()); + Optional limit = ActorSelectorLimits.forActor(actor).getPolyhedronVertexLimit(); + limit.ifPresent(integer -> actor.print(BBC.SEL_MAX.format(integer))); break; } case POLYHEDRAL: - newSelector = new PolyhedralRegionSelector(player.getWorld()); - player.print(BBC.SEL_CONVEX_POLYHEDRAL.s()); - Optional limit = ActorSelectorLimits.forActor(player).getPolyhedronVertexLimit(); - limit.ifPresent(integer -> player.print(BBC.SEL_MAX.format(integer))); - player.print(BBC.SEL_LIST.s()); + newSelector = new PolyhedralRegionSelector(world); + actor.print(BBC.SEL_CONVEX_POLYHEDRAL.s()); + Optional limit = ActorSelectorLimits.forActor(actor).getPolyhedronVertexLimit(); + limit.ifPresent(integer -> actor.print(BBC.SEL_MAX.format(integer))); + actor.print(BBC.SEL_LIST.s()); break; case FUZZY: case MAGIC: if (mask == null) { mask = new IdMask(world); } - newSelector = new FuzzyRegionSelector(player, editSession, mask); - player.print(BBC.SEL_FUZZY.s()); - player.print(BBC.SEL_LIST.s()); + //TODO Make FuzzyRegionSelector accept actors + newSelector = new FuzzyRegionSelector((Player) actor, editSession, mask); + actor.print(BBC.SEL_FUZZY.s()); + actor.print(BBC.SEL_LIST.s()); break; case LIST: default: @@ -631,7 +639,7 @@ public class SelectionCommands { box.appendCommand("polyhedral", "Select a hollow polyhedral", "//sel polyhedral"); box.appendCommand("fuzzy[=]", "Select all connected blocks (magic wand)", "//sel fuzzy[=]"); - player.print(box.create(1)); + actor.print(box.create(1)); return; } @@ -646,14 +654,14 @@ public class SelectionCommands { if (found != null) { session.setDefaultRegionSelector(found); - BBC.SELECTOR_SET_DEFAULT.send(player, found.name()); + BBC.SELECTOR_SET_DEFAULT.send(actor, found.name()); } else { throw new RuntimeException("Something unexpected happened. Please report this."); } } session.setRegionSelector(world, newSelector); - session.dispatchCUISelection(player); + session.dispatchCUISelection(actor); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java index f8a012b46..a4ed9ed90 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotCommands.java @@ -29,12 +29,14 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.util.CommandPermissions; import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.util.formatting.component.PaginationBox; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import com.sk89q.worldedit.util.formatting.text.event.HoverEvent; import com.sk89q.worldedit.util.formatting.text.format.TextColor; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.snapshot.InvalidSnapshotException; import com.sk89q.worldedit.world.snapshot.Snapshot; import com.sk89q.worldedit.world.storage.MissingWorldException; @@ -67,24 +69,24 @@ public class SnapshotCommands { desc = "List snapshots" ) @CommandPermissions("worldedit.snapshots.list") - public void list(Player player, + public void list(Actor actor, World world, @ArgFlag(name = 'p', desc = "Page of results to return", def = "1") int page) throws WorldEditException { LocalConfiguration config = we.getConfiguration(); if (config.snapshotRepo == null) { - BBC.SNAPSHOT_NOT_CONFIGURED.send(player); + BBC.SNAPSHOT_NOT_CONFIGURED.send(actor); return; } try { - List snapshots = config.snapshotRepo.getSnapshots(true, player.getWorld().getName()); + List snapshots = config.snapshotRepo.getSnapshots(true, world.getName()); if (!snapshots.isEmpty()) { - player.print(new SnapshotListBox(player.getWorld().getName(), snapshots).create(page)); + actor.print(new SnapshotListBox(world.getName(), snapshots).create(page)); } else { - BBC.SNAPSHOT_NOT_AVAILABLE.send(player); + BBC.SNAPSHOT_NOT_AVAILABLE.send(actor); // Okay, let's toss some debugging information! File dir = config.snapshotRepo.getDirectory(); @@ -99,7 +101,7 @@ public class SnapshotCommands { } } } catch (MissingWorldException ex) { - BBC.SNAPSHOT_NOT_FOUND_WORLD.send(player); + BBC.SNAPSHOT_NOT_FOUND_WORLD.send(actor); } } @@ -108,37 +110,37 @@ public class SnapshotCommands { desc = "Choose a snapshot to use" ) @CommandPermissions("worldedit.snapshots.restore") - public void use(Player player, LocalSession session, - @Arg(desc = "Snapeshot to use") + public void use(Actor actor, World world, LocalSession session, + @Arg(desc = "Snapshot to use") String name) throws WorldEditException { LocalConfiguration config = we.getConfiguration(); if (config.snapshotRepo == null) { - BBC.SNAPSHOT_NOT_CONFIGURED.send(player); + BBC.SNAPSHOT_NOT_CONFIGURED.send(actor); return; } // Want the latest snapshot? if (name.equalsIgnoreCase("latest")) { try { - Snapshot snapshot = config.snapshotRepo.getDefaultSnapshot(player.getWorld().getName()); + Snapshot snapshot = config.snapshotRepo.getDefaultSnapshot(world.getName()); if (snapshot != null) { session.setSnapshot(null); - BBC.SNAPSHOT_NEWEST.send(player); + BBC.SNAPSHOT_NEWEST.send(actor); } else { - BBC.SNAPSHOT_NOT_FOUND.send(player); + BBC.SNAPSHOT_NOT_FOUND.send(actor); } } catch (MissingWorldException ex) { - BBC.SNAPSHOT_NOT_FOUND_WORLD.send(player); + BBC.SNAPSHOT_NOT_FOUND_WORLD.send(actor); } } else { try { session.setSnapshot(config.snapshotRepo.getSnapshot(name)); - BBC.SNAPSHOT_SET.send(player, name); + BBC.SNAPSHOT_SET.send(actor, name); } catch (InvalidSnapshotException e) { - BBC.SNAPSHOT_NOT_AVAILABLE.send(player); + BBC.SNAPSHOT_NOT_AVAILABLE.send(actor); } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java index aa6fda420..75b115a30 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SnapshotUtilCommands.java @@ -30,9 +30,10 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.command.util.CommandPermissions; import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; import com.sk89q.worldedit.command.util.Logging; -import com.sk89q.worldedit.entity.Player; +import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.world.DataException; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.snapshot.InvalidSnapshotException; import com.sk89q.worldedit.world.snapshot.Snapshot; import com.sk89q.worldedit.world.snapshot.SnapshotRestore; @@ -60,25 +61,25 @@ public class SnapshotUtilCommands { ) @Logging(REGION) @CommandPermissions("worldedit.snapshots.restore") - public void restore(Player player, LocalSession session, EditSession editSession, + public void restore(Actor actor, World world, LocalSession session, EditSession editSession, @Arg(name = "snapshot", desc = "The snapshot to restore", def = "") String snapshotName) throws WorldEditException { LocalConfiguration config = we.getConfiguration(); if (config.snapshotRepo == null) { - BBC.SNAPSHOT_NOT_CONFIGURED.send(player); + BBC.SNAPSHOT_NOT_CONFIGURED.send(actor); return; } - Region region = session.getSelection(player.getWorld()); + Region region = session.getSelection(world); Snapshot snapshot; if (snapshotName != null) { try { snapshot = config.snapshotRepo.getSnapshot(snapshotName); } catch (InvalidSnapshotException e) { - BBC.SNAPSHOT_NOT_AVAILABLE.send(player); + BBC.SNAPSHOT_NOT_AVAILABLE.send(actor); return; } } else { @@ -88,10 +89,10 @@ public class SnapshotUtilCommands { // No snapshot set? if (snapshot == null) { try { - snapshot = config.snapshotRepo.getDefaultSnapshot(player.getWorld().getName()); + snapshot = config.snapshotRepo.getDefaultSnapshot(world.getName()); if (snapshot == null) { - BBC.SNAPSHOT_NOT_AVAILABLE.send(player); + BBC.SNAPSHOT_NOT_AVAILABLE.send(actor); // Okay, let's toss some debugging information! File dir = config.snapshotRepo.getDirectory(); @@ -108,7 +109,7 @@ public class SnapshotUtilCommands { return; } } catch (MissingWorldException ex) { - BBC.SNAPSHOT_NOT_FOUND_WORLD.send(player); + BBC.SNAPSHOT_NOT_FOUND_WORLD.send(actor); return; } } @@ -116,7 +117,7 @@ public class SnapshotUtilCommands { // Load chunk store try (ChunkStore chunkStore = snapshot.getChunkStore()) { - BBC.SNAPSHOT_LOADED.send(player, snapshot.getName()); + BBC.SNAPSHOT_LOADED.send(actor, snapshot.getName()); // Restore snapshot SnapshotRestore restore = new SnapshotRestore(chunkStore, editSession, region); @@ -127,21 +128,20 @@ public class SnapshotUtilCommands { if (restore.hadTotalFailure()) { String error = restore.getLastErrorMessage(); if (!restore.getMissingChunks().isEmpty()) { - BBC.SNAPSHOT_ERROR_RESTORE.send(player); + BBC.SNAPSHOT_ERROR_RESTORE.send(actor); } else if (error != null) { - player.printError("Errors prevented any blocks from being restored."); - player.printError("Last error: " + error); + actor.printError("Errors prevented any blocks from being restored."); + actor.printError("Last error: " + error); } else { - BBC.SNAPSHOT_ERROR_RESTORE_CHUNKS.send(player); + BBC.SNAPSHOT_ERROR_RESTORE_CHUNKS.send(actor); } } else { - player.print(String.format("Restored; %d " - + "missing chunks and %d other errors.", + actor.print(String.format("Restored; %d missing chunks and %d other errors.", restore.getMissingChunks().size(), restore.getErrorChunks().size())); } } catch (DataException | IOException e) { - player.printError("Failed to load snapshot: " + e.getMessage()); + actor.printError("Failed to load snapshot: " + e.getMessage()); } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java index a700bf576..6b55e6457 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/WorldEditCommands.java @@ -36,6 +36,7 @@ import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.event.platform.ConfigurationLoadEvent; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Capability; +import com.sk89q.worldedit.extension.platform.NoCapablePlatformException; import com.sk89q.worldedit.extension.platform.Platform; import com.sk89q.worldedit.extension.platform.PlatformManager; import java.io.IOException; @@ -98,8 +99,13 @@ public class WorldEditCommands { actor.printDebug("----------- Capabilities -----------"); for (Capability capability : Capability.values()) { - Platform platform = pm.queryCapability(capability); - actor.printDebug(String.format("%s: %s", capability.name(), platform != null ? platform.getPlatformName() : "NONE")); + try { + Platform platform = pm.queryCapability(capability); + actor.printDebug(String.format("%s: %s", capability.name(), + platform != null ? platform.getPlatformName() : "NONE")); + } catch (NoCapablePlatformException e) { + actor.printDebug(String.format("%s: %s", capability.name(), "NONE")); + } } actor.printDebug(""); actor.printDebug("Wiki: " + "https://github.com/boy0001/FastAsyncWorldedit/wiki"); @@ -120,7 +126,7 @@ public class WorldEditCommands { @Command( name = "report", aliases = { "debugpaste" }, - desc = "Writes a report of latest.log, config.yml, message.yml and your commands.yml to https://athion.net/ISPaster/paste" + desc = "Writes a report of latest.log, config.yml, message.yml https://athion.net/ISPaster/paste" ) @CommandQueued(false) @CommandPermissions({"worldedit.report", "worldedit.debugpaste"}) @@ -162,19 +168,19 @@ public class WorldEditCommands { name = "tz", desc = "Set your timezone for snapshots" ) - public void tz(Player player, LocalSession session, + public void tz(Actor actor, LocalSession session, @Arg(desc = "The timezone to set") String timezone) { try { ZoneId tz = ZoneId.of(timezone); session.setTimezone(tz); - BBC.TIMEZONE_SET.send(player, tz.getDisplayName( + BBC.TIMEZONE_SET.send(actor, tz.getDisplayName( TextStyle.FULL, Locale.ENGLISH )); BBC.TIMEZONE_DISPLAY - .send(player, dateFormat.format(ZonedDateTime.now(tz))); + .send(actor, dateFormat.format(ZonedDateTime.now(tz))); } catch (ZoneRulesException e) { - player.printError("Invalid timezone"); + actor.printError("Invalid timezone"); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java index 23544ea30..b82be020d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Entity.java @@ -19,11 +19,10 @@ package com.sk89q.worldedit.entity; +import com.sk89q.worldedit.extension.platform.Locatable; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.util.Faceted; -import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.world.entity.EntityType; - import javax.annotation.Nullable; /** @@ -34,7 +33,7 @@ import javax.annotation.Nullable; * instance of an entity, but a {@link BaseEntity} can be created from * this entity by calling {@link #getState()}.

*/ -public interface Entity extends Faceted { +public interface Entity extends Faceted, Locatable { /** * Get a copy of the entity's state. @@ -48,33 +47,11 @@ public interface Entity extends Faceted { @Nullable BaseEntity getState(); - /** - * Get the location of this entity. - * - * @return the location of the entity - */ - Location getLocation(); - - /** - * Sets the location of this entity. - * - * @param location the new location of the entity - * @return if the teleport worked - */ - boolean setLocation(Location location); - default EntityType getType() { BaseEntity state = getState(); return state != null ? state.getType() : null; } - /** - * Get the extent that this entity is on. - * - * @return the extent - */ - Extent getExtent(); - /** * Remove this entity from it container. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java index 3673d8842..624bdbc6b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/entity/Player.java @@ -191,8 +191,12 @@ public interface Player extends Entity, Actor { * Get the point of the block that is being stood in. * * @return point + * @deprecated Use Locatable#getBlockLocation */ - Location getBlockIn(); + @Deprecated + default Location getBlockIn() { + return getBlockLocation(); + } /** * Get the point of the block that is being stood upon. diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/DefaultMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/DefaultMaskParser.java index b9d7990be..33b4b3db4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/DefaultMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/DefaultMaskParser.java @@ -23,71 +23,33 @@ import com.boydti.fawe.command.FaweParser; import com.boydti.fawe.command.SuggestInputParseException; import com.boydti.fawe.config.BBC; import com.boydti.fawe.util.StringMan; +import com.google.common.collect.Iterables; import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.minecraft.util.commands.CommandLocals; import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.command.MaskCommands; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extension.platform.PlatformCommandManager; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.BlockMaskBuilder; -import com.sk89q.worldedit.function.mask.BiomeMask2D; -import com.sk89q.worldedit.function.mask.BlockMask; -import com.sk89q.worldedit.function.mask.ExistingBlockMask; -import com.sk89q.worldedit.function.mask.ExpressionMask; import com.sk89q.worldedit.function.mask.Mask; import com.sk89q.worldedit.function.mask.MaskIntersection; import com.sk89q.worldedit.function.mask.MaskUnion; -import com.sk89q.worldedit.internal.command.ActorAuthorizer; -import com.sk89q.worldedit.internal.command.WorldEditBinding; -import com.sk89q.worldedit.function.mask.Masks; -import com.sk89q.worldedit.function.mask.OffsetMask; -import com.sk89q.worldedit.internal.expression.Expression; -import com.sk89q.worldedit.internal.expression.ExpressionException; -import com.sk89q.worldedit.internal.registry.InputParser; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.math.Vector3; -import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment; import com.sk89q.worldedit.session.request.Request; -import com.sk89q.worldedit.util.command.Dispatcher; -import com.sk89q.worldedit.util.command.SimpleDispatcher; -import com.sk89q.worldedit.util.command.parametric.ParametricBuilder; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockTypes; import java.util.ArrayList; -import com.sk89q.worldedit.world.biome.BiomeType; -import com.sk89q.worldedit.world.biome.Biomes; -import com.sk89q.worldedit.world.registry.BiomeRegistry; - -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; public class DefaultMaskParser extends FaweParser { - private final Dispatcher dispatcher; - private final Pattern INTERSECTION_PATTERN = Pattern.compile("[&|;]+(?![^\\[]*\\])"); - public DefaultMaskParser(WorldEdit worldEdit) { - super(worldEdit); - this.dispatcher = new SimpleDispatcher(); - this.register(new MaskCommands(worldEdit)); - } - - @Override - public Dispatcher getDispatcher() { - return dispatcher; - } - - public void register(Object clazz) { - ParametricBuilder builder = new ParametricBuilder(); - builder.setAuthorizer(new ActorAuthorizer()); - builder.addBinding(new WorldEditBinding(worldEdit)); - builder.registerMethodsAsCommands(dispatcher, clazz); + public DefaultMaskParser(WorldEdit worldEdit, PlatformCommandManager manager) { + super(worldEdit, manager, Mask.class); } @Override @@ -111,53 +73,58 @@ public class DefaultMaskParser extends FaweParser { ParseEntry pe = entry.getKey(); final String command = pe.input; String full = pe.full; - Mask mask = null; + Mask mask; if (command.isEmpty()) { mask = parseFromInput(StringMan.join(entry.getValue(), ','), context); - } else if (dispatcher.get(command) == null) { - // Legacy patterns - char char0 = command.charAt(0); - boolean charMask = input.length() > 1 && input.charAt(1) != '['; - if (charMask && input.charAt(0) == '=') { - return parseFromInput(char0 + "[" + input.substring(1) + "]", context); - } - if (char0 == '#' || char0 == '?') { - throw new SuggestInputParseException(new NoMatchException("Unknown mask: " + full + ", See: //masks"), full, - () -> { - if (full.length() == 1) return new ArrayList<>(dispatcher.getPrimaryAliases()); - return dispatcher.getAliases().stream().filter( - s -> s.startsWith(command.toLowerCase()) - ).collect(Collectors.toList()); + } else { + mask = Iterables.getFirst(parse(input, actor), null); + SuggestInputParseException suggestion = null; // TODO NOT IMPLEMENTED suggestion + if (mask == null) { + // Legacy patterns + char char0 = command.charAt(0); + boolean charMask = input.length() > 1 && input.charAt(1) != '['; + if (charMask && input.charAt(0) == '=') { + return parseFromInput(char0 + "[" + input.substring(1) + "]", context); + } + if (char0 == '#' || char0 == '?') { + throw suggestion; +// throw new SuggestInputParseException(new NoMatchException("Unknown mask: " + full + ", See: //masks"), full, +// () -> { +// if (full.length() == 1) return new ArrayList<>(dispatcher.getPrimaryAliases()); +// return dispatcher.getAliases().stream().filter( +// s -> s.startsWith(command.toLowerCase()) +// ).collect(Collectors.toList()); +// } +// ); + } + // Legacy syntax + if (charMask) { + switch (char0) { + case '\\': // + case '/': // + case '{': // + case '$': // + case '%': { + String value = command.substring(1) + ((entry.getValue().isEmpty()) ? "" : "[" + StringMan.join(entry.getValue(), "][") + "]"); + if (value.contains(":")) { + if (value.charAt(0) == ':') value.replaceFirst(":", ""); + value = value.replaceAll(":", "]["); + } + mask = parseFromInput("#" + char0 + "[" + value + "]", context); + break; } - ); - } - // Legacy syntax - if (charMask) { - switch (char0) { - case '\\': // - case '/': // - case '{': // - case '$': // - case '%': { - String value = command.substring(1) + ((entry.getValue().isEmpty()) ? "" : "[" + StringMan.join(entry.getValue(), "][") + "]"); - if (value.contains(":")) { - if (value.charAt(0) == ':') value.replaceFirst(":", ""); - value = value.replaceAll(":", "]["); - } - mask = parseFromInput("#" + char0 + "[" + value + "]", context); - break; + case '|': + case '~': + case '<': + case '>': + case '!': + input = input.substring(input.indexOf(char0) + 1); + mask = parseFromInput(char0 + "[" + input + "]", context); + if (actor != null) { + BBC.COMMAND_CLARIFYING_BRACKET.send(actor, char0 + "[" + input + "]"); + } + return mask; } - case '|': - case '~': - case '<': - case '>': - case '!': - input = input.substring(input.indexOf(char0) + 1); - mask = parseFromInput(char0 + "[" + input + "]", context); - if (actor != null) { - BBC.COMMAND_CLARIFYING_BRACKET.send(actor, char0 + "[" + input + "]"); - } - return mask; } } if (mask == null) { @@ -182,37 +149,38 @@ public class DefaultMaskParser extends FaweParser { } } } - } else { - List args = entry.getValue(); - String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " ")); - try { - mask = (Mask) dispatcher.call(command + cmdArgs, locals, new String[0]); - } catch (SuggestInputParseException rethrow) { - throw rethrow; - } catch (Throwable e) { - throw SuggestInputParseException.of(e, full, () -> { - try { - List suggestions = dispatcher.get(command).getCallable().getSuggestions(cmdArgs, locals); - if (suggestions.size() <= 2) { - for (int i = 0; i < suggestions.size(); i++) { - String suggestion = suggestions.get(i); - if (suggestion.indexOf(' ') != 0) { - String[] split = suggestion.split(" "); - suggestion = BBC.color("[" + StringMan.join(split, "][") + "]"); - suggestions.set(i, suggestion); - } - } - } - return suggestions; - } catch (CommandException e1) { - throw new InputParseException(e1.getMessage()); - } catch (Throwable e2) { - e2.printStackTrace(); - throw new InputParseException(e2.getMessage()); - } - }); - } } +// else { +// List args = entry.getValue(); +// String cmdArgs = ((args.isEmpty()) ? "" : " " + StringMan.join(args, " ")); +// try { +// mask = (Mask) dispatcher.call(command + cmdArgs, locals, new String[0]); +// } catch (SuggestInputParseException rethrow) { +// throw rethrow; +// } catch (Throwable e) { +// throw SuggestInputParseException.of(e, full, () -> { +// try { +// List suggestions = dispatcher.get(command).getCallable().getSuggestions(cmdArgs, locals); +// if (suggestions.size() <= 2) { +// for (int i = 0; i < suggestions.size(); i++) { +// String suggestion = suggestions.get(i); +// if (suggestion.indexOf(' ') != 0) { +// String[] split = suggestion.split(" "); +// suggestion = "[" + StringMan.join(split, "][") + "]"; +// suggestions.set(i, suggestion); +// } +// } +// } +// return suggestions; +// } catch (CommandException e1) { +// throw new InputParseException(e1.getMessage()); +// } catch (Throwable e2) { +// e2.printStackTrace(); +// throw new InputParseException(e2.getMessage()); +// } +// }); +// } +// } if (pe.and) { masks.add(new ArrayList<>()); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/DefaultPatternParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/DefaultPatternParser.java index 738cbea35..fe17e5c1a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/DefaultPatternParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/pattern/DefaultPatternParser.java @@ -32,14 +32,11 @@ import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.NoMatchException; import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extension.platform.PlatformCommandManager; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.RandomPattern; import com.sk89q.worldedit.internal.command.ActorAuthorizer; -import com.sk89q.worldedit.internal.command.WorldEditBinding; import com.sk89q.worldedit.internal.expression.Expression; -import com.sk89q.worldedit.util.command.Dispatcher; -import com.sk89q.worldedit.util.command.SimpleDispatcher; -import com.sk89q.worldedit.util.command.parametric.ParametricBuilder; import com.sk89q.worldedit.world.block.BlockTypes; import java.util.ArrayList; import java.util.List; @@ -49,24 +46,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; public class DefaultPatternParser extends FaweParser { - private final Dispatcher dispatcher; - public DefaultPatternParser(WorldEdit worldEdit) { - super(worldEdit); - this.dispatcher = new SimpleDispatcher(); - this.register(new PatternCommands()); - } - - @Override - public Dispatcher getDispatcher() { - return dispatcher; - } - - public void register(Object clazz) { - ParametricBuilder builder = new ParametricBuilder(); - builder.setAuthorizer(new ActorAuthorizer()); - builder.addBinding(new WorldEditBinding(worldEdit)); - builder.registerMethodsAsCommands(dispatcher, clazz); + public DefaultPatternParser(WorldEdit worldEdit, PlatformCommandManager commandManager) { + super(worldEdit, commandManager, Pattern.class); } @Override @@ -161,7 +143,7 @@ public class DefaultPatternParser extends FaweParser { String suggestion = suggestions.get(i); if (suggestion.indexOf(' ') != 0) { String[] split = suggestion.split(" "); - suggestion = BBC.color("[" + StringMan.join(split, "][") + "]"); + suggestion = "[" + StringMan.join(split, "][") + "]"; suggestions.set(i, suggestion); } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java index 30ecc7cef..964880def 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/AbstractPlayerActor.java @@ -19,7 +19,10 @@ package com.sk89q.worldedit.extension.platform; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.MaxChangedBlocksException; import com.sk89q.worldedit.NotABlockException; +import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extent.Extent; @@ -33,6 +36,7 @@ import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.TargetBlock; import com.sk89q.worldedit.util.auth.AuthorizationException; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -44,13 +48,13 @@ import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.registry.BlockMaterial; - import java.io.File; import javax.annotation.Nullable; /** - * An abstract implementation of both a {@link Actor} and a {@link Player} that is intended for - * implementations of WorldEdit to use to wrap players that make use of WorldEdit. + * An abstract implementation of both a {@link Actor} and a {@link Player} + * that is intended for implementations of WorldEdit to use to wrap + * players that make use of WorldEdit. */ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @@ -151,12 +155,12 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public void findFreePosition() { - findFreePosition(getBlockIn()); + findFreePosition(getBlockLocation()); } @Override public boolean ascendLevel() { - final Location pos = getBlockIn(); + final Location pos = getBlockLocation(); final int x = pos.getBlockX(); int y = Math.max(0, pos.getBlockY()); final int z = pos.getBlockZ(); @@ -214,7 +218,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public boolean descendLevel() { - final Location pos = getBlockIn(); + final Location pos = getBlockLocation(); final int x = pos.getBlockX(); int y = Math.max(0, pos.getBlockY()); final int z = pos.getBlockZ(); @@ -277,7 +281,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public boolean ascendToCeiling(int clearance, boolean alwaysGlass) { - Location pos = getBlockIn(); + Location pos = getBlockLocation(); int x = pos.getBlockX(); int initialY = Math.max(0, pos.getBlockY()); int y = Math.max(0, pos.getBlockY() + 2); @@ -294,6 +298,13 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { if (world.getBlock(BlockVector3.at(x, y, z)).getBlockType().getMaterial() .isMovementBlocker()) { int platformY = Math.max(initialY, y - 3 - clearance); + if (platformY < initialY) { // if ==, they already have the given clearance, if <, clearance is too large + printError("Not enough space above you!"); + return false; + } else if (platformY == initialY) { + printError("You're already at the ceiling."); + return false; + } floatAt(x, platformY + 1, z, alwaysGlass); return true; } @@ -311,7 +322,7 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public boolean ascendUpwards(int distance, boolean alwaysGlass) { - final Location pos = getBlockIn(); + final Location pos = getBlockLocation(); final int x = pos.getBlockX(); final int initialY = Math.max(0, pos.getBlockY()); int y = Math.max(0, pos.getBlockY() + 1); @@ -338,27 +349,41 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public void floatAt(int x, int y, int z, boolean alwaysGlass) { - try { + if (alwaysGlass || !isAllowedToFly()) { BlockVector3 spot = BlockVector3.at(x, y - 1, z); - if (!getLocation().getExtent().getBlock(spot).getBlockType().getMaterial() - .isMovementBlocker()) { - getLocation().getExtent().setBlock(spot, BlockTypes.GLASS.getDefaultState()); + final World world = getWorld(); + if (!world.getBlock(spot).getBlockType().getMaterial().isMovementBlocker()) { + try (EditSession session = WorldEdit.getInstance().getEditSessionFactory().getEditSession(world, 1, this)) { + session.setBlock(spot, BlockTypes.GLASS.getDefaultState()); + } catch (MaxChangedBlocksException ignored) { } - } catch (WorldEditException e) { - e.printStackTrace(); + } + } else { + setFlying(true); } setPosition(Vector3.at(x + 0.5, y, z + 0.5)); } - @Override - public Location getBlockIn() { - return getLocation().setPosition(getLocation().toVector().floor()); + /** + * Check whether the player is allowed to fly. + * + * @return true if allowed flight + */ + protected boolean isAllowedToFly() { + return false; + } + + /** + * Set whether the player is currently flying. + * + * @param flying true to fly + */ + protected void setFlying(boolean flying) { } @Override public Location getBlockOn() { - return getLocation() - .setPosition(getLocation().setY(getLocation().getY() - 1).toVector().floor()); + return getLocation().setPosition(getLocation().setY(getLocation().getY() - 1).toVector().floor()); } @Override @@ -407,15 +432,16 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { @Override public Direction getCardinalDirection(int yawOffset) { - if (getLocation().getPitch() > 67.5) { + final Location location = getLocation(); + if (location.getPitch() > 67.5) { return Direction.DOWN; } - if (getLocation().getPitch() < -67.5) { + if (location.getPitch() < -67.5) { return Direction.UP; } // From hey0's code - double rot = (getLocation().getYaw() + yawOffset) % 360; //let's use real yaw now + double rot = (location.getYaw() + yawOffset) % 360; //let's use real yaw now if (rot < 0) { rot += 360.0; } @@ -435,56 +461,66 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable { } } + private boolean canPassThroughBlock(Location curBlock) { + BlockVector3 blockPos = curBlock.toVector().toBlockPoint(); + BlockState block = curBlock.getExtent().getBlock(blockPos); + return !block.getBlockType().getMaterial().isMovementBlocker(); + } + /** - * Get the player's view yaw. - * - * @return yaw + * Advances the block target block until the current block is a wall + * @return true if a wall is found */ - - @Override - public boolean passThroughForwardWall(int range) { - int searchDist = 0; - TargetBlock hitBlox = new TargetBlock(this, range, 0.2); - Extent world = getLocation().getExtent(); - Location block; - boolean firstBlock = true; - int freeToFind = 2; - boolean inFree = false; - - while ((block = hitBlox.getNextBlock()) != null) { - boolean free = !world.getBlock(block.toVector().toBlockPoint()).getBlockType() - .getMaterial().isMovementBlocker(); - - if (firstBlock) { - firstBlock = false; - - if (!free) { - --freeToFind; - continue; - } - } - - ++searchDist; - if (searchDist > 20) { - return false; - } - - if (inFree != free) { - if (free) { - --freeToFind; - } - } - - if (freeToFind == 0) { - setOnGround(block); + private boolean advanceToWall(TargetBlock hitBlox) { + Location curBlock; + while ((curBlock = hitBlox.getCurrentBlock()) != null) { + if (!canPassThroughBlock(curBlock)) { return true; } - inFree = free; + hitBlox.getNextBlock(); } return false; } + /** + * Advances the block target block until the current block is a free + * @return true if a free spot is found + */ + private boolean advanceToFree(TargetBlock hitBlox) { + Location curBlock; + while ((curBlock = hitBlox.getCurrentBlock()) != null) { + if (canPassThroughBlock(curBlock)) { + return true; + } + + hitBlox.getNextBlock(); + } + + return false; + } + + @Override + public boolean passThroughForwardWall(int range) { + TargetBlock hitBlox = new TargetBlock(this, range, 0.2); + + if (!advanceToWall(hitBlox)) { + return false; + } + + if (!advanceToFree(hitBlox)) { + return false; + } + + Location foundBlock = hitBlox.getCurrentBlock(); + if (foundBlock != null) { + setOnGround(foundBlock); + return true; + } + + + return false; + } @Override public void setPosition(Vector3 pos) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java index cdcba32a2..de8adb1e5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/Actor.java @@ -83,7 +83,7 @@ public interface Actor extends Identifiable, SessionOwner, Subject { */ void print(Component component); - /** + /**F * Returns true if the actor can destroy bedrock. * * @return true if bedrock can be broken by the actor diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java index 54ee24e23..3d77e7b6d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/BlockMaskBuilder.java @@ -232,7 +232,7 @@ public class BlockMaskBuilder { private void suggest(String input, String property, Collection finalTypes) throws InputParseException { throw new SuggestInputParseException(input + " does not have: " + property, input, () -> { Set keys = new HashSet<>(); - finalTypes.forEach(t -> t.getProperties().stream().forEach(p -> keys.add(p.getKey()))); + finalTypes.forEach(t -> t.getProperties().forEach(p -> keys.add(p.getKey()))); return keys.stream().map(PropertyKey::getId) .filter(p -> StringMan.blockStateMatches(property, p)) .sorted(StringMan.blockStateComparator(property)) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java index f71639485..8dea4f786 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskIntersection.java @@ -22,20 +22,20 @@ package com.sk89q.worldedit.function.mask; import static com.google.common.base.Preconditions.checkNotNull; import com.boydti.fawe.Fawe; -import com.google.common.base.Function; - import com.sk89q.worldedit.math.BlockVector3; - -import javax.annotation.Nullable; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; +import java.util.function.Function; +import javax.annotation.Nullable; /** @@ -100,7 +100,7 @@ public class MaskIntersection extends AbstractMask { } } - public Function, Mask> pairingFunction() { + public Function, Mask> pairingFunction() { return input -> input.getKey().tryCombine(input.getValue()); } @@ -120,12 +120,11 @@ public class MaskIntersection extends AbstractMask { } if (changed) { masks.clear(); - for (Mask mask : masksArray) masks.add(mask); + Collections.addAll(masks, masksArray); } // Optimize this boolean formArray = false; - for (int i = 0; i < masksArray.length; i++) { - Mask mask = masksArray[i]; + for (Mask mask : masksArray) { if (mask.getClass() == this.getClass()) { this.masks.remove(mask); this.masks.addAll(((MaskIntersection) mask).getMasks()); @@ -162,7 +161,7 @@ public class MaskIntersection extends AbstractMask { return changed ? this : null; } - private boolean combineMasks(Function, Mask> pairing, Set> failedCombines) { + private boolean combineMasks(Function, Mask> pairing, Set> failedCombines) { boolean hasOptimized = false; while (true) { Mask[] result = null; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java index 690f14361..6151a6c15 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/MaskUnion.java @@ -19,16 +19,14 @@ package com.sk89q.worldedit.function.mask; -import com.google.common.base.Function; import com.sk89q.worldedit.math.BlockVector3; - import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; import java.util.List; - -import java.util.Map; +import java.util.Map.Entry; import java.util.Set; +import java.util.function.Function; import javax.annotation.Nullable; /** @@ -81,7 +79,7 @@ public class MaskUnion extends MaskIntersection { } @Override - public Function, Mask> pairingFunction() { + public Function, Mask> pairingFunction() { return input -> input.getKey().tryOr(input.getValue()); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java index 6ad68f5f9..118492bde 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/pattern/BlockPattern.java @@ -21,13 +21,14 @@ package com.sk89q.worldedit.function.pattern; import static com.google.common.base.Preconditions.checkNotNull; -import com.boydti.fawe.beta.FilterBlock; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; /** * A pattern that returns the same {@link BaseBlock} each time. + * + * @deprecated all BlockStateHolders can be used directly as a pattern */ @Deprecated public class BlockPattern extends AbstractPattern { @@ -39,7 +40,6 @@ public class BlockPattern extends AbstractPattern { * * @param block the block */ - @Deprecated public BlockPattern(BlockStateHolder block) { setBlock(block); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java index 159601b79..8bcea5e28 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RegionVisitor.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.function.visitor; import com.boydti.fawe.config.BBC; +import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.function.operation.Operation; @@ -58,6 +59,9 @@ public class RegionVisitor implements Operation { this.iterable = iterable; } + public RegionVisitor(Region region, RegionFunction regionFunction, EditSession editSession) { + } + /** * Get the number of affected objects. * diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java index 96ce3ca37..7e8b00667 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/ScanChunk.java @@ -1,17 +1,10 @@ package com.sk89q.worldedit.function.visitor; -import com.boydti.fawe.beta.IChunk; -import com.boydti.fawe.util.MathMan; import com.sk89q.worldedit.function.RegionFunction; import com.sk89q.worldedit.math.BlockVector3; -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.LongArraySet; -import it.unimi.dsi.fastutil.objects.ObjectIterator; - import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; @@ -24,12 +17,12 @@ public class ScanChunk { public static final BlockVector3[] DIAGONAL_DIRECTIONS; static { - DEFAULT_DIRECTIONS[0] = (BlockVector3.at(0, -1, 0)); - DEFAULT_DIRECTIONS[1] = (BlockVector3.at(0, 1, 0)); - DEFAULT_DIRECTIONS[2] = (BlockVector3.at(-1, 0, 0)); - DEFAULT_DIRECTIONS[3] = (BlockVector3.at(1, 0, 0)); - DEFAULT_DIRECTIONS[4] = (BlockVector3.at(0, 0, -1)); - DEFAULT_DIRECTIONS[5] = (BlockVector3.at(0, 0, 1)); + DEFAULT_DIRECTIONS[0] = BlockVector3.at(0, -1, 0); + DEFAULT_DIRECTIONS[1] = BlockVector3.at(0, 1, 0); + DEFAULT_DIRECTIONS[2] = BlockVector3.at(-1, 0, 0); + DEFAULT_DIRECTIONS[3] = BlockVector3.at(1, 0, 0); + DEFAULT_DIRECTIONS[4] = BlockVector3.at(0, 0, -1); + DEFAULT_DIRECTIONS[5] = BlockVector3.at(0, 0, 1); List list = new ArrayList<>(); for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { @@ -43,13 +36,8 @@ public class ScanChunk { } } } - Collections.sort(list, new Comparator() { - @Override - public int compare(BlockVector3 o1, BlockVector3 o2) { - return (int) Math.signum(o1.lengthSq() - o2.lengthSq()); - } - }); - DIAGONAL_DIRECTIONS = list.toArray(new BlockVector3[list.size()]); + list.sort((o1, o2) -> (int) Math.signum(o1.lengthSq() - o2.lengthSq())); + DIAGONAL_DIRECTIONS = list.toArray(new BlockVector3[0]); } private final RegionFunction function; @@ -57,7 +45,7 @@ public class ScanChunk { private final Long2ObjectOpenHashMap visits; private final Long2ObjectOpenHashMap queues; - public ScanChunk(final RegionFunction function) { + public ScanChunk(RegionFunction function) { this.function = function; this.directions = DEFAULT_DIRECTIONS; @@ -65,8 +53,8 @@ public class ScanChunk { this.visits = new Long2ObjectOpenHashMap<>(); } - public static final long pairInt(int x, int y) { - return (((long) x) << 32) | (y & 0xffffffffL); + public static long pairInt(int x, int y) { + return (long) x << 32 | y & 0xffffffffL; } public boolean isVisited(int x, int y, int z) { @@ -180,7 +168,7 @@ public class ScanChunk { char triple = queue[index]; int x = index & 15; - int z = (index >> 4) & 15; + int z = index >> 4 & 15; int y = index >> 8; int absX = xx + x; @@ -249,7 +237,7 @@ public class ScanChunk { char triple = queue[index]; int x = index & 15; - int z = (index >> 4) & 15; + int z = index >> 4 & 15; int y = index >> 8; } queuePool.add(queue); @@ -327,11 +315,11 @@ public class ScanChunk { } public void set(long[] bits, int i) { - bits[i >> 6] |= (1L << (i & 0x3F)); + bits[i >> 6] |= 1L << (i & 0x3F); } - public boolean get(long[] bits, final int i) { - return (bits[i >> 6] & (1L << (i & 0x3F))) != 0; + public boolean get(long[] bits, int i) { + return (bits[i >> 6] & 1L << (i & 0x3F)) != 0; } public char getLocalIndex(int x, int y, int z) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java index 94d628128..f9b68cbb6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/exception/WorldEditExceptionConverter.java @@ -20,6 +20,7 @@ package com.sk89q.worldedit.internal.command.exception; import static com.google.common.base.Preconditions.checkNotNull; + import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.DisallowedItemException; import com.sk89q.worldedit.EmptyClipboardException; @@ -40,11 +41,11 @@ import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.io.file.FileSelectionAbortedException; import com.sk89q.worldedit.util.io.file.FilenameResolutionException; import com.sk89q.worldedit.util.io.file.InvalidFilenameException; -import org.enginehub.piston.exception.CommandException; -import org.enginehub.piston.exception.UsageException; - +import com.sk89q.worldedit.world.storage.MissingWorldException; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.enginehub.piston.exception.CommandException; +import org.enginehub.piston.exception.UsageException; /** * converts WorldEdit exceptions and converts them into {@link CommandException}s. @@ -80,6 +81,10 @@ public class WorldEditExceptionConverter extends ExceptionConverterHelper { throw newCommandException("Make a region selection first.", e); } + @ExceptionMatch + public void convert(MissingWorldException e) throws CommandException { + throw newCommandException("You need to provide a world (Try //world)", e); + } @ExceptionMatch public void convert(UnknownItemException e) throws CommandException { throw newCommandException("Block name '" + e.getID() + "' was not recognized.", e); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java index 4aff22f49..be6917344 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java @@ -19,8 +19,6 @@ package com.sk89q.worldedit.math.convolution; -import com.boydti.fawe.object.visitor.Fast2DIterator; - import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.EditSession; @@ -34,7 +32,6 @@ import com.sk89q.worldedit.registry.state.PropertyGroup; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockTypes; - import java.util.Iterator; import javax.annotation.Nullable; @@ -93,11 +90,10 @@ public class HeightMap { BlockVector3 min = region.getMinimumPoint(); int bx = min.getBlockX(); int bz = min.getBlockZ(); - Iterable flat = Regions.asFlatRegion(region).asFlatRegion(); - Iterator iter = new Fast2DIterator(flat, session).iterator(); + Iterator flat = Regions.asFlatRegion(region).asFlatRegion().iterator(); int layer = 0; - while (iter.hasNext()) { - BlockVector2 pos = iter.next(); + while (flat.hasNext()) { + BlockVector2 pos = flat.next(); int x = pos.getBlockX(); int z = pos.getBlockZ(); layer = session.getNearestSurfaceLayer(x, z, (layer + 7) >> 3, 0, maxY); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java index a6e061d01..81342c6ef 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/World.java @@ -32,6 +32,7 @@ import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.TreeGenerator; import com.sk89q.worldedit.world.block.BlockState; @@ -41,11 +42,12 @@ import com.sk89q.worldedit.world.weather.WeatherType; import javax.annotation.Nullable; import java.nio.file.Path; +import java.util.Locale; /** * Represents a world (dimension). */ -public interface World extends Extent { +public interface World extends Extent, Keyed { /** * Get the name of the world. @@ -284,4 +286,8 @@ public interface World extends Extent { return true; } + @Override + default String getId() { + return getName().replace(" ", "_").toLowerCase(Locale.ROOT); + } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java index 80ed33065..f6ed36737 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BaseBlock.java @@ -182,7 +182,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { @Override public void setNbtData(@Nullable CompoundTag nbtData) { - throw new UnsupportedOperationException("Immutable"); + throw new UnsupportedOperationException("This class is immutable."); } /** @@ -239,7 +239,7 @@ public class BaseBlock implements BlockStateHolder, TileEntityBlock { } @Override - public final BaseBlock toBaseBlock() { + public BaseBlock toBaseBlock() { return this; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java index 07599940a..a0187ac4f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockState.java @@ -301,6 +301,9 @@ public class BlockState implements BlockStateHolder, FawePattern { @Override public boolean equalsFuzzy(BlockStateHolder o) { + if (null == o) { + return false; + } if (this == o) { // Added a reference equality check for speediness return true; @@ -308,9 +311,6 @@ public class BlockState implements BlockStateHolder, FawePattern { if (o.getClass() == BlockState.class) { return o.getOrdinal() == this.getOrdinal(); } - if (null == o) { - return false; - } return o.equalsFuzzy(this); }