diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java index 67bb630bd..8a025f2f2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ApplyBrushCommands.java @@ -29,6 +29,8 @@ import com.sk89q.worldedit.command.factory.ReplaceFactory; import com.sk89q.worldedit.command.factory.TreeGeneratorFactory; import com.sk89q.worldedit.command.util.CommandPermissions; import com.sk89q.worldedit.command.util.CommandPermissionsConditionGenerator; +import com.sk89q.worldedit.command.util.CommandQueued; +import com.sk89q.worldedit.command.util.CommandQueuedConditionGenerator; import com.sk89q.worldedit.command.util.PermissionCondition; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.function.Contextual; 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 5e4e36ece..7bd76c175 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 @@ -42,6 +42,8 @@ import com.sk89q.worldedit.WorldEdit; 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.CommandQueued; +import com.sk89q.worldedit.command.util.CommandQueuedConditionGenerator; import com.sk89q.worldedit.command.util.CreatureButcher; import com.sk89q.worldedit.command.util.EntityRemover; import com.sk89q.worldedit.command.util.Logging; @@ -102,7 +104,7 @@ import org.enginehub.piston.annotation.param.Switch; /** * Utility commands. */ -@CommandContainer(superTypes = CommandPermissionsConditionGenerator.Registration.class) +@CommandContainer(superTypes = {CommandPermissionsConditionGenerator.Registration.class, CommandQueuedConditionGenerator.Registration.class}) @Command(aliases = {}, desc = "Various utility commands: [More Info](http://wiki.sk89q.com/wiki/WorldEdit/Utilities)") public class UtilityCommands { @@ -174,9 +176,9 @@ public class UtilityCommands { name = "/cancel", aliases= {"fcancel"}, desc = "Cancel your current command" - //queued = false ) @CommandPermissions("fawe.cancel") + @CommandQueued(false) public void cancel(FawePlayer player) { int cancelled = player.cancel(false); BBC.WORLDEDIT_CANCEL_COUNT.send(player, cancelled); @@ -213,8 +215,8 @@ public class UtilityCommands { " - Use , to OR multiple\n" + "e.g. #surfacespread[10][#existing],andesite\n" + "More Info: https://git.io/vSPmA" - //queued = false ) + @CommandQueued(false) @CommandPermissions("worldedit.patterns") public void patterns(Player player, LocalSession session, CommandContext args) throws WorldEditException { displayModifierHelp(player, DefaultPatternParser.class, args); @@ -229,8 +231,8 @@ public class UtilityCommands { " - Use & to AND multiple\n" + "e.g. >[stone,dirt],#light[0][5],$jungle\n" + "More Info: https://git.io/v9r4K" - //queued = false ) + @CommandQueued(false) @CommandPermissions("worldedit.masks") public void masks(Player player, LocalSession session, CommandContext args) throws WorldEditException { displayModifierHelp(player, DefaultMaskParser.class, args); @@ -244,8 +246,8 @@ public class UtilityCommands { " - Use , to OR multiple\n" + " - Use & to AND multiple\n" + "More Info: https://git.io/v9KHO", - queued = false ) + @CommandQueued(false) @CommandPermissions("worldedit.transforms") public void transforms(Player player, LocalSession session, CommandContext args) throws WorldEditException { displayModifierHelp(player, DefaultTransformParser.class, args); 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 b8648f74b..39664aa18 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 @@ -29,6 +29,8 @@ import com.sk89q.worldedit.WorldEdit; 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.CommandQueued; +import com.sk89q.worldedit.command.util.CommandQueuedConditionGenerator; import com.sk89q.worldedit.command.util.PrintCommandHelp; import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.event.platform.ConfigurationLoadEvent; @@ -53,7 +55,7 @@ import org.enginehub.piston.annotation.param.Arg; import org.enginehub.piston.annotation.param.ArgFlag; import org.enginehub.piston.annotation.param.Switch; -@CommandContainer(superTypes = CommandPermissionsConditionGenerator.Registration.class) +@CommandContainer(superTypes = {CommandPermissionsConditionGenerator.Registration.class, CommandQueuedConditionGenerator.Registration.class}) public class WorldEditCommands { private static final DateTimeFormatter dateFormat = DateTimeFormatter @@ -69,8 +71,8 @@ public class WorldEditCommands { name = "version", aliases = { "ver" }, desc = "Get WorldEdit/FAWE version" - //queued = false ) + @CommandQueued(false) public void version(Actor actor) { FaweVersion fVer = Fawe.get().getVersion(); String fVerStr = fVer == null ? "unknown" : "-" + fVer.build; @@ -119,8 +121,8 @@ public class WorldEditCommands { 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" -// queued = false ) + @CommandQueued(false) @CommandPermissions({"worldedit.report", "worldedit.debugpaste"}) public void report(Actor actor) throws WorldEditException, IOException { BBC.DOWNLOAD_LINK.send(actor, IncendoPaster.debugPaste()); @@ -129,8 +131,8 @@ public class WorldEditCommands { @Command( name = "threads", desc = "Print all thread stacks" - //queued = false ) + @CommandQueued(false) @CommandPermissions("worldedit.threads") public void threads(Actor actor) throws WorldEditException { Map stacks = Thread.getAllStackTraces(); @@ -179,8 +181,8 @@ public class WorldEditCommands { @Command( name = "help", desc = "Displays help for FAWE commands" - //queued = false ) + @CommandQueued(false) @CommandPermissions("worldedit.help") public void help(Actor actor, @Switch(name = 's', desc = "List sub-commands of the given command, if applicable") diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueued.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueued.java new file mode 100644 index 000000000..9e01e6afc --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueued.java @@ -0,0 +1,15 @@ +package com.sk89q.worldedit.command.util; + +import org.enginehub.piston.annotation.CommandCondition; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Sets a command to be queued + */ +@Retention(RetentionPolicy.RUNTIME) +@CommandCondition(CommandQueuedConditionGenerator.class) +public @interface CommandQueued { + boolean value() default false; +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueuedCondition.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueuedCondition.java new file mode 100644 index 000000000..c8f3492b2 --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueuedCondition.java @@ -0,0 +1,24 @@ +package com.sk89q.worldedit.command.util; + +import org.enginehub.piston.Command; +import org.enginehub.piston.inject.InjectedValueAccess; + +/** + * Dummy class + */ +public class CommandQueuedCondition implements Command.Condition { + private final boolean value; + + public CommandQueuedCondition(boolean value) { + this.value = value; + } + + public boolean isQueued() { + return value; + } + + @Override + public boolean satisfied(InjectedValueAccess injectedValueAccess) { + return true; + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueuedConditionGenerator.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueuedConditionGenerator.java new file mode 100644 index 000000000..e38ba6b2b --- /dev/null +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/util/CommandQueuedConditionGenerator.java @@ -0,0 +1,24 @@ +package com.sk89q.worldedit.command.util; + +import org.enginehub.piston.Command; +import org.enginehub.piston.gen.CommandConditionGenerator; +import org.enginehub.piston.util.NonnullByDefault; + +import java.lang.reflect.Method; + +import static com.google.common.base.Preconditions.checkNotNull; + +@NonnullByDefault +public final class CommandQueuedConditionGenerator implements CommandConditionGenerator { + + public interface Registration { + Registration commandQueuedConditionGenerator(CommandPermissionsConditionGenerator generator); + } + + @Override + public Command.Condition generateCondition(Method commandMethod) { + CommandQueued annotation = commandMethod.getAnnotation(CommandQueued.class); + checkNotNull(annotation, "Annotation is missing from commandMethod"); + return new CommandQueuedCondition(annotation.value()); + } +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java index 0bea104d8..a28ecd63a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java @@ -84,6 +84,8 @@ import com.sk89q.worldedit.command.argument.RegionFactoryConverter; import com.sk89q.worldedit.command.argument.RegistryConverter; import com.sk89q.worldedit.command.argument.VectorConverter; import com.sk89q.worldedit.command.argument.ZonedDateTimeConverter; +import com.sk89q.worldedit.command.util.CommandQueued; +import com.sk89q.worldedit.command.util.CommandQueuedCondition; import com.sk89q.worldedit.command.util.PermissionCondition; import com.sk89q.worldedit.command.util.SubCommandPermissionCondition; import com.sk89q.worldedit.entity.Entity; @@ -294,121 +296,122 @@ public final class PlatformCommandManager { private void registerAllCommands() { if (Settings.IMP.ENABLED_COMPONENTS.COMMANDS) { - registerSubCommands( - "schematic", - ImmutableList.of("schem", "/schematic", "/schem"), - "Schematic commands for saving/loading areas", - SchematicCommandsRegistration.builder(), - new SchematicCommands(worldEdit) - ); - registerSubCommands( - "snapshot", - ImmutableList.of("snap"), - "Snapshot commands for restoring backups", - SnapshotCommandsRegistration.builder(), - new SnapshotCommands(worldEdit) - ); - registerSubCommands( - "superpickaxe", - ImmutableList.of("pickaxe", "sp"), - "Super-pickaxe commands", - SuperPickaxeCommandsRegistration.builder(), - new SuperPickaxeCommands(worldEdit) - ); - registerSubCommands( - "brush", - ImmutableList.of("br", "/brush", "/br"), - "Brushing commands", - BrushCommandsRegistration.builder(), - new BrushCommands(worldEdit), - (Consumer) manager -> { - PaintBrushCommands.register(commandManagerService, manager, registration); - ApplyBrushCommands.register(commandManagerService, manager, registration); - } - ); - registerSubCommands( - "worldedit", - ImmutableList.of("we"), - "WorldEdit commands", - WorldEditCommandsRegistration.builder(), - new WorldEditCommands(worldEdit) - ); - this.registration.register( - commandManager, - BiomeCommandsRegistration.builder(), - new BiomeCommands() - ); - this.registration.register( - commandManager, - ChunkCommandsRegistration.builder(), - new ChunkCommands(worldEdit) - ); - this.registration.register( - commandManager, - ClipboardCommandsRegistration.builder(), - new ClipboardCommands(worldEdit) - ); - this.registration.register( - commandManager, - GeneralCommandsRegistration.builder(), - new GeneralCommands(worldEdit) - ); - this.registration.register( - commandManager, - GenerationCommandsRegistration.builder(), - new GenerationCommands(worldEdit) - ); - this.registration.register( - commandManager, - HistoryCommandsRegistration.builder(), - new HistoryCommands(worldEdit) - ); - this.registration.register( - commandManager, - NavigationCommandsRegistration.builder(), - new NavigationCommands(worldEdit) - ); - this.registration.register( - commandManager, - RegionCommandsRegistration.builder(), - new RegionCommands(worldEdit) - ); - this.registration.register( - commandManager, - ScriptingCommandsRegistration.builder(), - new ScriptingCommands(worldEdit) - ); - this.registration.register( - commandManager, - SelectionCommandsRegistration.builder(), - new SelectionCommands(worldEdit) - ); - ExpandCommands.register(registration, commandManager, commandManagerService); - this.registration.register( - commandManager, - SnapshotUtilCommandsRegistration.builder(), - new SnapshotUtilCommands(worldEdit) - ); - this.registration.register( - commandManager, - ToolCommandsRegistration.builder(), - new ToolCommands(worldEdit) - ); - this.registration.register( - commandManager, - ToolUtilCommandsRegistration.builder(), - new ToolUtilCommands(worldEdit) - ); - this.registration.register( - commandManager, - UtilityCommandsRegistration.builder(), - new UtilityCommands(worldEdit) - ); - this.registration.register( - commandManager, - AnvilCommandsRegistration.builder(), - new AnvilCommands(worldEdit) - ); + // TODO NOT IMPLEMENTED dunno why these have issues generating +// registerSubCommands( +// "schematic", +// ImmutableList.of("schem", "/schematic", "/schem"), +// "Schematic commands for saving/loading areas", +// SchematicCommandsRegistration.builder(), +// new SchematicCommands(worldEdit) +// ); +// registerSubCommands( +// "snapshot", +// ImmutableList.of("snap"), +// "Snapshot commands for restoring backups", +// SnapshotCommandsRegistration.builder(), +// new SnapshotCommands(worldEdit) +// ); +// registerSubCommands( +// "superpickaxe", +// ImmutableList.of("pickaxe", "sp"), +// "Super-pickaxe commands", +// SuperPickaxeCommandsRegistration.builder(), +// new SuperPickaxeCommands(worldEdit) +// ); +// registerSubCommands( +// "brush", +// ImmutableList.of("br", "/brush", "/br"), +// "Brushing commands", +// BrushCommandsRegistration.builder(), +// new BrushCommands(worldEdit), +// (Consumer) manager -> { +// PaintBrushCommands.register(commandManagerService, manager, registration); +// ApplyBrushCommands.register(commandManagerService, manager, registration); +// } +// ); +// registerSubCommands( +// "worldedit", +// ImmutableList.of("we"), +// "WorldEdit commands", +// WorldEditCommandsRegistration.builder(), +// new WorldEditCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// BiomeCommandsRegistration.builder(), +// new BiomeCommands() +// ); +// this.registration.register( +// commandManager, +// ChunkCommandsRegistration.builder(), +// new ChunkCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// ClipboardCommandsRegistration.builder(), +// new ClipboardCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// GeneralCommandsRegistration.builder(), +// new GeneralCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// GenerationCommandsRegistration.builder(), +// new GenerationCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// HistoryCommandsRegistration.builder(), +// new HistoryCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// NavigationCommandsRegistration.builder(), +// new NavigationCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// RegionCommandsRegistration.builder(), +// new RegionCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// ScriptingCommandsRegistration.builder(), +// new ScriptingCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// SelectionCommandsRegistration.builder(), +// new SelectionCommands(worldEdit) +// ); +// ExpandCommands.register(registration, commandManager, commandManagerService); +// this.registration.register( +// commandManager, +// SnapshotUtilCommandsRegistration.builder(), +// new SnapshotUtilCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// ToolCommandsRegistration.builder(), +// new ToolCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// ToolUtilCommandsRegistration.builder(), +// new ToolUtilCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// UtilityCommandsRegistration.builder(), +// new UtilityCommands(worldEdit) +// ); +// this.registration.register( +// commandManager, +// AnvilCommandsRegistration.builder(), +// new AnvilCommands(worldEdit) +// ); } } @@ -533,12 +536,13 @@ public final class PlatformCommandManager { TaskManager.IMP.taskNow(() -> { int space0 = args.indexOf(' '); String arg0 = space0 == -1 ? args : args.substring(0, space0); - Optional cmd = commandManager.getCommand(arg0); - if (cmd.isPresent()) { - if (!cmd.queued()) { - handleCommandOnCurrentThread(finalEvent); - return; - } + Optional optional = commandManager.getCommand(arg0); + if (!optional.isPresent()) return; + Command cmd = optional.get(); + CommandQueuedCondition queued = cmd.getCondition().as(CommandQueuedCondition.class).orElse(null); + if (queued != null && !queued.isQueued()) { + handleCommandOnCurrentThread(finalEvent); + return; } if (!fp.runAction( () -> PlatformCommandManager.this.handleCommandOnCurrentThread(finalEvent), false, true)) {