From f41337f8a814169a50adcc267cecc112ce35bc79 Mon Sep 17 00:00:00 2001 From: Jeremy Wood Date: Thu, 8 Oct 2020 02:24:07 -0400 Subject: [PATCH 001/178] Bumped version to 5.0.0-SNAPSHOT for development of next major version. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7be31cabf..7f149d082 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.onarandombox.multiversecore Multiverse-Core - 4.2.3-SNAPSHOT + 5.0.0-SNAPSHOT Multiverse-Core World Management Plugin From d8ff0834183051b99b3ab55c2d85ab2748bfd675 Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Sun, 13 Dec 2020 23:09:16 +0800 Subject: [PATCH 002/178] First test implementation of ACF (mocking test are completely broken rip) --- pom.xml | 17 +++ .../MultiverseCore/MultiverseCore.java | 129 +++--------------- .../onarandombox/MultiverseCore/api/Core.java | 3 +- .../MultiverseCore/api/MultiversePlugin.java | 13 -- .../commands/ConfirmCommand.java | 2 +- .../MultiverseCore/commands/CoordCommand.java | 1 - .../MultiverseCore/commands/DebugCommand.java | 1 - .../commands/DeleteCommand.java | 8 +- .../MultiverseCore/commands/HelpCommand.java | 65 +++++---- .../MultiverseCore/commands/RegenCommand.java | 4 +- .../commands/TeleportCommand.java | 5 +- .../commands_acf/CommandTools.java | 121 ++++++++++++++++ .../commands_acf/ConfigCommand.java | 69 ++++++++++ .../commands_acf/DebugCommand.java | 67 +++++++++ .../commands_acf/InfoCommand.java | 47 +++++++ .../commands_acf/LoadCommand.java | 33 +++++ .../commands_acf/MultiverseCommand.java | 12 ++ .../commands_acf/PageOrWorld.java | 34 +++++ .../commands_acf/UnloadCommand.java | 33 +++++ .../destination/DestinationFactory.java | 18 ++- .../MultiverseCore/TestDebugMode.java | 2 + .../MultiverseCore/TestEntitySpawnRules.java | 2 + .../TestEntryFeeConversion.java | 2 + .../MultiverseCore/TestModifyCommand.java | 2 + .../MultiverseCore/TestWorldProperties.java | 2 + .../MultiverseCore/TestWorldPurger.java | 2 + .../MultiverseCore/TestWorldStuff.java | 2 + 27 files changed, 519 insertions(+), 177 deletions(-) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java diff --git a/pom.xml b/pom.xml index 7be31cabf..809244c29 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,10 @@ CodeMC https://repo.codemc.org/repository/maven-public + + aikar + https://repo.aikar.co/content/groups/aikar/ + @@ -256,6 +260,14 @@ de.themoep.idconverter com.onarandombox.idconverter + + co.aikar.commands + com.onarandombox.acf + + + co.aikar.locales + com.onarandombox.locales + @@ -383,6 +395,11 @@ 2.4 test + + co.aikar + acf-paper + 0.5.0-SNAPSHOT + diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 4af01ad61..8fdb190cd 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -13,8 +13,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -23,6 +21,7 @@ import java.util.logging.Level; import buscript.Buscript; +import co.aikar.commands.PaperCommandManager; import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.MVWorld.NullLocation; import com.onarandombox.MultiverseCore.api.BlockSafety; @@ -33,41 +32,12 @@ import com.onarandombox.MultiverseCore.api.MultiverseCoreConfig; import com.onarandombox.MultiverseCore.api.MultiverseMessaging; import com.onarandombox.MultiverseCore.api.SafeTTeleporter; -import com.onarandombox.MultiverseCore.commands.AnchorCommand; -import com.onarandombox.MultiverseCore.commands.CheckCommand; -import com.onarandombox.MultiverseCore.commands.CloneCommand; -import com.onarandombox.MultiverseCore.commands.ConfigCommand; -import com.onarandombox.MultiverseCore.commands.ConfirmCommand; -import com.onarandombox.MultiverseCore.commands.CoordCommand; -import com.onarandombox.MultiverseCore.commands.CreateCommand; -import com.onarandombox.MultiverseCore.commands.DebugCommand; -import com.onarandombox.MultiverseCore.commands.DeleteCommand; -import com.onarandombox.MultiverseCore.commands.EnvironmentCommand; -import com.onarandombox.MultiverseCore.commands.GameruleCommand; -import com.onarandombox.MultiverseCore.commands.GamerulesCommand; -import com.onarandombox.MultiverseCore.commands.GeneratorCommand; -import com.onarandombox.MultiverseCore.commands.HelpCommand; -import com.onarandombox.MultiverseCore.commands.ImportCommand; -import com.onarandombox.MultiverseCore.commands.InfoCommand; -import com.onarandombox.MultiverseCore.commands.ListCommand; -import com.onarandombox.MultiverseCore.commands.LoadCommand; -import com.onarandombox.MultiverseCore.commands.ModifyAddCommand; -import com.onarandombox.MultiverseCore.commands.ModifyClearCommand; -import com.onarandombox.MultiverseCore.commands.ModifyCommand; -import com.onarandombox.MultiverseCore.commands.ModifyRemoveCommand; -import com.onarandombox.MultiverseCore.commands.ModifySetCommand; -import com.onarandombox.MultiverseCore.commands.PurgeCommand; -import com.onarandombox.MultiverseCore.commands.RegenCommand; -import com.onarandombox.MultiverseCore.commands.ReloadCommand; -import com.onarandombox.MultiverseCore.commands.RemoveCommand; -import com.onarandombox.MultiverseCore.commands.ScriptCommand; -import com.onarandombox.MultiverseCore.commands.SetSpawnCommand; -import com.onarandombox.MultiverseCore.commands.SilentCommand; -import com.onarandombox.MultiverseCore.commands.SpawnCommand; -import com.onarandombox.MultiverseCore.commands.TeleportCommand; -import com.onarandombox.MultiverseCore.commands.UnloadCommand; -import com.onarandombox.MultiverseCore.commands.VersionCommand; -import com.onarandombox.MultiverseCore.commands.WhoCommand; +import com.onarandombox.MultiverseCore.commands_acf.CommandTools; +import com.onarandombox.MultiverseCore.commands_acf.ConfigCommand; +import com.onarandombox.MultiverseCore.commands_acf.DebugCommand; +import com.onarandombox.MultiverseCore.commands_acf.InfoCommand; +import com.onarandombox.MultiverseCore.commands_acf.LoadCommand; +import com.onarandombox.MultiverseCore.commands_acf.UnloadCommand; import com.onarandombox.MultiverseCore.destination.AnchorDestination; import com.onarandombox.MultiverseCore.destination.BedDestination; import com.onarandombox.MultiverseCore.destination.CannonDestination; @@ -101,14 +71,12 @@ import com.onarandombox.MultiverseCore.utils.UnsafeCallWrapper; import com.onarandombox.MultiverseCore.utils.VaultHandler; import com.onarandombox.MultiverseCore.utils.WorldManager; -import com.pneumaticraft.commandhandler.CommandHandler; import me.main__.util.SerializationConfig.NoSuchPropertyException; import me.main__.util.SerializationConfig.SerializationConfig; import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.configuration.Configuration; import org.bukkit.configuration.ConfigurationSection; @@ -202,7 +170,7 @@ public int getProtocolVersion() { } // Setup our Map for our Commands using the CommandHandler. - private CommandHandler commandHandler; + private PaperCommandManager commandHandler; private static final String LOG_TAG = "[Multiverse-Core]"; @@ -283,9 +251,8 @@ public void onEnable() { // Setup Permissions, we'll do an initial check for the Permissions plugin then fall back on isOP(). this.ph = new MVPermissions(this); - // Setup the command manager - this.commandHandler = new CommandHandler(this, this.ph); - // Call the Function to assign all the Commands to their Class. + // Setup commands + commandHandler = new PaperCommandManager(this); this.registerCommands(); // Initialize the Destination factor AFTER the commands @@ -742,45 +709,15 @@ public MultiverseMessaging getMessaging() { * Register Multiverse-Core commands to Command Manager. */ private void registerCommands() { - // Intro Commands - this.commandHandler.registerCommand(new HelpCommand(this)); - this.commandHandler.registerCommand(new VersionCommand(this)); - this.commandHandler.registerCommand(new ListCommand(this)); - this.commandHandler.registerCommand(new InfoCommand(this)); - this.commandHandler.registerCommand(new CreateCommand(this)); - this.commandHandler.registerCommand(new CloneCommand(this)); - this.commandHandler.registerCommand(new ImportCommand(this)); - this.commandHandler.registerCommand(new ReloadCommand(this)); - this.commandHandler.registerCommand(new SetSpawnCommand(this)); - this.commandHandler.registerCommand(new CoordCommand(this)); - this.commandHandler.registerCommand(new TeleportCommand(this)); - this.commandHandler.registerCommand(new WhoCommand(this)); - this.commandHandler.registerCommand(new SpawnCommand(this)); - // Dangerous Commands - this.commandHandler.registerCommand(new UnloadCommand(this)); - this.commandHandler.registerCommand(new LoadCommand(this)); - this.commandHandler.registerCommand(new RemoveCommand(this)); - this.commandHandler.registerCommand(new DeleteCommand(this)); - this.commandHandler.registerCommand(new RegenCommand(this)); - this.commandHandler.registerCommand(new ConfirmCommand(this)); - // Modification commands - this.commandHandler.registerCommand(new ModifyCommand(this)); - this.commandHandler.registerCommand(new PurgeCommand(this)); - this.commandHandler.registerCommand(new ModifyAddCommand(this)); - this.commandHandler.registerCommand(new ModifySetCommand(this)); - this.commandHandler.registerCommand(new ModifyRemoveCommand(this)); - this.commandHandler.registerCommand(new ModifyClearCommand(this)); - this.commandHandler.registerCommand(new ConfigCommand(this)); - this.commandHandler.registerCommand(new AnchorCommand(this)); - // Misc Commands - this.commandHandler.registerCommand(new EnvironmentCommand(this)); - this.commandHandler.registerCommand(new DebugCommand(this)); - this.commandHandler.registerCommand(new SilentCommand(this)); - this.commandHandler.registerCommand(new GeneratorCommand(this)); - this.commandHandler.registerCommand(new CheckCommand(this)); - this.commandHandler.registerCommand(new ScriptCommand(this)); - this.commandHandler.registerCommand(new GameruleCommand(this)); - this.commandHandler.registerCommand(new GamerulesCommand(this)); + CommandTools tools = new CommandTools(this); + tools.registerCommandContext(); + tools.registerCommandCompletions(); + + commandHandler.registerCommand(new UnloadCommand(this)); + commandHandler.registerCommand(new LoadCommand(this)); + commandHandler.registerCommand(new ConfigCommand(this)); + commandHandler.registerCommand(new InfoCommand(this)); + commandHandler.registerCommand(new DebugCommand(this)); } /** @@ -813,30 +750,6 @@ public MVPermissions getMVPerms() { return this.ph; } - /** - * {@inheritDoc} - */ - @Override - public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args) { - if (!this.isEnabled()) { - sender.sendMessage("This plugin is Disabled!"); - return true; - } - ArrayList allArgs = new ArrayList(Arrays.asList(args)); - allArgs.add(0, command.getName()); - try { - return this.commandHandler.locateAndRunCommand(sender, allArgs, getMVConfig().getDisplayPermErrors()); - } catch (Exception e) { - e.printStackTrace(); - sender.sendMessage(ChatColor.RED + "An internal error occurred when attempting to perform this command."); - if (sender.isOp()) - sender.sendMessage(ChatColor.RED + "Details were printed to the server console and logs, please add that to your bug report."); - else - sender.sendMessage(ChatColor.RED + "Try again and contact the server owner or an admin if this problem persists."); - return true; - } - } - /** * {@inheritDoc} * @@ -907,8 +820,8 @@ public String getAuthors() { * {@inheritDoc} */ @Override - public CommandHandler getCommandHandler() { - return this.commandHandler; + public PaperCommandManager getCommandHandler() { + return commandHandler; } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/Core.java b/src/main/java/com/onarandombox/MultiverseCore/api/Core.java index ff8513d4c..6754e8607 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/Core.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/Core.java @@ -8,6 +8,7 @@ package com.onarandombox.MultiverseCore.api; import buscript.Buscript; +import co.aikar.commands.PaperCommandManager; import com.onarandombox.MultiverseCore.destination.DestinationFactory; import com.onarandombox.MultiverseCore.utils.AnchorManager; import com.onarandombox.MultiverseCore.utils.MVEconomist; @@ -84,7 +85,7 @@ public interface Core { * * @return A non-null {@link CommandHandler}. */ - CommandHandler getCommandHandler(); + PaperCommandManager getCommandHandler(); /** * Gets the factory class responsible for loading many different destinations diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java b/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java index a6a064b8a..d5bd9dea7 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java @@ -102,19 +102,6 @@ protected String getAuthors() { */ protected abstract void registerCommands(CommandHandler handler); - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (!this.isEnabled()) { - sender.sendMessage("This plugin is Disabled!"); - return true; - } - - ArrayList allArgs = new ArrayList(args.length + 1); - allArgs.add(command.getName()); - allArgs.addAll(Arrays.asList(args)); - return this.getCore().getCommandHandler().locateAndRunCommand(sender, allArgs); - } - @Override public void log(Level level, String msg) { int debugLevel = this.getCore().getMVConfig().getGlobalDebug(); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java index 2a68f353d..27a980b1e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java @@ -33,7 +33,7 @@ public ConfirmCommand(MultiverseCore plugin) { @Override public void runCommand(CommandSender sender, List args) { - this.plugin.getCommandHandler().confirmQueuedCommand(sender); +// this.plugin.getCommandHandler().confirmQueuedCommand(sender); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java index 485cc3701..d6eb6173c 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java @@ -11,7 +11,6 @@ import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java index b2ccd99e4..1f5fbe271 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java @@ -14,7 +14,6 @@ import org.bukkit.permissions.PermissionDefault; import java.util.List; -import java.util.logging.Level; /** * Enables debug-information. diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java index 2e7b3c8b0..476ab7243 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java @@ -37,9 +37,9 @@ public void runCommand(CommandSender sender, List args) { Class[] paramTypes = {String.class}; List objectArgs = new ArrayList(args); - this.plugin.getCommandHandler() - .queueCommand(sender, "mvdelete", "deleteWorld", objectArgs, - paramTypes, ChatColor.GREEN + "World '" + worldName + "' Deleted!", - ChatColor.RED + "World '" + worldName + "' could NOT be deleted!"); +// this.plugin.getCommandHandler() +// .queueCommand(sender, "mvdelete", "deleteWorld", objectArgs, +// paramTypes, ChatColor.GREEN + "World '" + worldName + "' Deleted!", +// ChatColor.RED + "World '" + worldName + "' could NOT be deleted!"); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java index 90913026c..587d1c0fe 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java @@ -11,7 +11,6 @@ import com.pneumaticraft.commandhandler.Command; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionDefault; import java.util.ArrayList; @@ -70,37 +69,37 @@ protected String getItemText(Command item) { @Override public void runCommand(CommandSender sender, List args) { - sender.sendMessage(ChatColor.AQUA + "====[ Multiverse Help ]===="); - - FilterObject filterObject = this.getPageAndFilter(args); - - List availableCommands = new ArrayList(this.plugin.getCommandHandler().getCommands(sender)); - if (filterObject.getFilter().length() > 0) { - availableCommands = this.getFilteredItems(availableCommands, filterObject.getFilter()); - if (availableCommands.size() == 0) { - sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE - + "No commands matched your filter: " + ChatColor.AQUA + filterObject.getFilter()); - return; - } - } - - if (!(sender instanceof Player)) { - sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); - for (Command c : availableCommands) { - sender.sendMessage(ChatColor.AQUA + c.getCommandUsage()); - } - return; - } - - int totalPages = (int) Math.ceil(availableCommands.size() / (this.itemsPerPage + 0.0)); - - if (filterObject.getPage() > totalPages) { - filterObject.setPage(totalPages); - } - - sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages); - sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); - - this.showPage(filterObject.getPage(), sender, availableCommands); +// sender.sendMessage(ChatColor.AQUA + "====[ Multiverse Help ]===="); +// +// FilterObject filterObject = this.getPageAndFilter(args); +// +// List availableCommands = new ArrayList(this.plugin.getCommandHandler().getCommands(sender)); +// if (filterObject.getFilter().length() > 0) { +// availableCommands = this.getFilteredItems(availableCommands, filterObject.getFilter()); +// if (availableCommands.size() == 0) { +// sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE +// + "No commands matched your filter: " + ChatColor.AQUA + filterObject.getFilter()); +// return; +// } +// } +// +// if (!(sender instanceof Player)) { +// sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); +// for (Command c : availableCommands) { +// sender.sendMessage(ChatColor.AQUA + c.getCommandUsage()); +// } +// return; +// } +// +// int totalPages = (int) Math.ceil(availableCommands.size() / (this.itemsPerPage + 0.0)); +// +// if (filterObject.getPage() > totalPages) { +// filterObject.setPage(totalPages); +// } +// +// sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages); +// sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); +// +// this.showPage(filterObject.getPage(), sender, availableCommands); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java index c93e36a70..f17be13c7 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java @@ -47,7 +47,7 @@ public void runCommand(CommandSender sender, List args) { objectArgs.add(useseed); objectArgs.add(randomseed); objectArgs.add(seed); - this.plugin.getCommandHandler().queueCommand(sender, "mvregen", "regenWorld", objectArgs, - paramTypes, ChatColor.GREEN + "World Regenerated!", ChatColor.RED + "World could NOT be regenerated!"); +// this.plugin.getCommandHandler().queueCommand(sender, "mvregen", "regenWorld", objectArgs, +// paramTypes, ChatColor.GREEN + "World Regenerated!", ChatColor.RED + "World could NOT be regenerated!"); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/TeleportCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/TeleportCommand.java index ee88616b9..b4f681046 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/TeleportCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/TeleportCommand.java @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; /** * Used to teleport players. @@ -177,8 +176,8 @@ public void runCommand(CommandSender sender, List args) { } String message = String.format("%sMultiverse %sdid not teleport %s%s %sto %s%s %sbecause it was unsafe.", ChatColor.GREEN, ChatColor.WHITE, ChatColor.AQUA, player, ChatColor.WHITE, ChatColor.DARK_AQUA, d.getName(), ChatColor.WHITE); - this.plugin.getCommandHandler().queueCommand(sender, "mvteleport", "teleportPlayer", items, - paramTypes, message, "Would you like to try anyway?", "", "", UNSAFE_TELEPORT_EXPIRE_DELAY); +// this.plugin.getCommandHandler().queueCommand(sender, "mvteleport", "teleportPlayer", items, +// paramTypes, message, "Would you like to try anyway?", "", "", UNSAFE_TELEPORT_EXPIRE_DELAY); } // else: Player was teleported successfully (or the tp event was fired I should say) } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java new file mode 100644 index 000000000..b98b332ac --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java @@ -0,0 +1,121 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.InvalidCommandArgument; +import co.aikar.commands.PaperCommandManager; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MVWorldManager; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.stream.Collectors; + +public class CommandTools { + private final MultiverseCore plugin; + private final PaperCommandManager commandHandler; + private final MVWorldManager worldManager; + + public CommandTools(MultiverseCore plugin) { + this.plugin = plugin; + this.commandHandler = this.plugin.getCommandHandler(); + this.worldManager = this.plugin.getMVWorldManager(); + } + + public void registerCommandCompletions() { + commandHandler.getCommandCompletions().registerAsyncCompletion( + "mvworlds", + context -> worldManager.getMVWorlds() + .stream() + .map(MultiverseWorld::getName) + .collect(Collectors.toList()) + ); + + commandHandler.getCommandCompletions().registerAsyncCompletion( + "unloadedmvworlds", + context -> new ArrayList<>(this.worldManager.getUnloadedWorlds()) + ); + + commandHandler.getCommandCompletions().registerAsyncCompletion( + "mvconfig", + context -> this.plugin.getMVConfig().serialize().keySet() + ); + + //TODO: set properties + + //TODO: add properties + + //TODO: remove properties + + //TODO: destination + + //TODO: version + + //TODO: environment + + //TODO: world types + } + + public void registerCommandContext() { + commandHandler.getCommandContexts().registerIssuerAwareContext( + MultiverseWorld.class, + context -> { + String worldName = context.popFirstArg(); + if (worldName != null) { + MultiverseWorld targetWorld = this.worldManager.getMVWorld(worldName); + if (targetWorld == null) { + throw new InvalidCommandArgument("World '" + worldName + "' not found."); + } + return targetWorld; + } + + return GetPlayerMVWorld(context.getPlayer()); + } + ); + + commandHandler.getCommandContexts().registerIssuerAwareContext( + PageOrWorld.class, + context -> { + String arg = context.popFirstArg(); + MultiverseWorld targetWorld = this.worldManager.getMVWorld(arg); + if (targetWorld != null) { + return new PageOrWorld(targetWorld); + } + + targetWorld = GetPlayerMVWorld(context.getPlayer()); + int page = ParsePageNumber(arg); + + return new PageOrWorld(targetWorld, page); + } + ); + + //TODO: Destination + } + + @NotNull + private MultiverseWorld GetPlayerMVWorld(Player player) { + if (player == null) { + throw new InvalidCommandArgument("You need to specific a world from console."); + } + + MultiverseWorld targetWorld = this.worldManager.getMVWorld(player.getWorld()); + if (targetWorld == null) { + throw new InvalidCommandArgument("Player is not in a multiverse world."); + } + + return targetWorld; + } + + private int ParsePageNumber(String arg) { + if (arg == null) { + return 1; + } + + try { + return Integer.parseInt(arg); + } + catch (NumberFormatException ignored) { + throw new InvalidCommandArgument("Invalid page number: " + arg); + } + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java new file mode 100644 index 000000000..e340fc9d0 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java @@ -0,0 +1,69 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Single; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.Map; + +@CommandAlias("mv") +@Subcommand("config") +@CommandPermission("multiverse.core.config") +public class ConfigCommand extends MultiverseCommand { + + public ConfigCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("show") + @Description("Show Global MV Variables.") + public void onShowCommand(CommandSender sender) { + StringBuilder builder = new StringBuilder(); + Map serializedConfig = this.plugin.getMVConfig().serialize(); + + for (Map.Entry entry : serializedConfig.entrySet()) { + builder.append(ChatColor.GREEN) + .append(entry.getKey()) + .append(ChatColor.WHITE).append(" = ").append(ChatColor.GOLD) + .append(entry.getValue().toString()) + .append(ChatColor.WHITE).append(", "); + } + + String message = builder.toString(); + message = message.substring(0, message.length() - 2); + sender.sendMessage(message); + } + + @Subcommand("set") + @Syntax(" ") + @CommandCompletion("@mvconfig") + @Description("Set Global MV Variables.") + public void onSetCommand(CommandSender sender, String property, @Single String value) { + property = property.toLowerCase(); + + if (!this.plugin.getMVConfig().setConfigProperty(property, value)) { + sender.sendMessage(String.format("%sSetting '%s' to '%s' failed!", ChatColor.RED, property, value)); + return; + } + + // special rule + if (property.equalsIgnoreCase("firstspawnworld")) { + // Don't forget to set the world! + this.plugin.getMVWorldManager().setFirstSpawnWorld(value); + } + + if (this.plugin.saveMVConfigs()) { + sender.sendMessage(ChatColor.GREEN + "SUCCESS!" + ChatColor.WHITE + " Values were updated successfully!"); + this.plugin.loadConfigs(); + } else { + sender.sendMessage(ChatColor.RED + "FAIL!" + ChatColor.WHITE + " Check your console for details!"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java new file mode 100644 index 000000000..9005e1a65 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java @@ -0,0 +1,67 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.dumptruckman.minecraft.util.Logging; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +@CommandAlias("mv") +public class DebugCommand extends MultiverseCommand { + + public DebugCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("debug") + @CommandPermission("multiverse.core.debug") + @Description("Show the current debug level.") + public void showDebugCommand(CommandSender sender) { + displayDebugMode(sender); + } + + @Subcommand("debug") + @CommandPermission("multiverse.core.debug") + @Syntax("") + @Description("Change debug level.") + public void changeDebugCommand(CommandSender sender, String debugLevel) { + int parsedLevel; + if (debugLevel.equalsIgnoreCase("off")) { + parsedLevel = 0; + } + else { + try { + parsedLevel = Integer.parseInt(debugLevel); + if (parsedLevel > 3 || parsedLevel < 0) { + throw new NumberFormatException(); + } + } catch (NumberFormatException e) { + sender.sendMessage(ChatColor.RED + "Error" + ChatColor.WHITE + + " setting debug level. Please use a number 0-3 " + ChatColor.AQUA + "(3 being many many messages!)"); + return; + } + } + + plugin.getMVConfig().setGlobalDebug(parsedLevel); + if (!plugin.saveMVConfigs()) { + sender.sendMessage(ChatColor.RED + "Error saving changes to config! See console for more info."); + } + + this.displayDebugMode(sender); + } + + private void displayDebugMode(CommandSender sender) { + final int debugLevel = plugin.getMVConfig().getGlobalDebug(); + if (debugLevel == 0) { + sender.sendMessage("Multiverse Debug mode is " + ChatColor.RED + "OFF"); + } + else { + sender.sendMessage("Multiverse Debug mode is " + ChatColor.GREEN + debugLevel); + Logging.fine("Multiverse Debug ENABLED"); + } + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java new file mode 100644 index 000000000..0de5697bf --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java @@ -0,0 +1,47 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.InvalidCommandArgument; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Default; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandAlias("mv") +public class InfoCommand extends MultiverseCommand { + + public InfoCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("info") + @CommandPermission("multiverse.core.info") + @Syntax("[page]") + @Description("") + public void onPlayerInfoCommand(CommandSender sender, PageOrWorld pageOrWorld) { + ShowWorldInfo(sender, pageOrWorld.getWorld(), pageOrWorld.getPage()); + } + + @Subcommand("info") + @CommandPermission("multiverse.core.info") + @Syntax("[world] [page]") + @CommandCompletion("@mvworlds") + @Description("") + public void onInfoCommand(CommandSender sender, PageOrWorld pageOrWorld, @Default("1") int page) { + ShowWorldInfo(sender, pageOrWorld.getWorld(), page); + } + + private void ShowWorldInfo(CommandSender sender, MultiverseWorld world, int page) { + sender.sendMessage(world.toString()); + sender.sendMessage("Page of " + page); + } + +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java new file mode 100644 index 000000000..7e1c35499 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java @@ -0,0 +1,33 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Single; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +@CommandAlias("mv") +public class LoadCommand extends MultiverseCommand { + + public LoadCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("load") + @CommandPermission("multiverse.core.load") + @Syntax("") + @CommandCompletion("@unloadedmvworlds") + @Description("Loads a world into Multiverse.") + public void onLoadCommand(CommandSender sender, @Single String world) { + if (!this.plugin.getMVWorldManager().loadWorld(world)) { + sender.sendMessage("Error trying to load world '" + world + "'!"); + return; + } + Command.broadcastCommandMessage(sender, "Loaded world '" + world + "'!"); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java new file mode 100644 index 000000000..a056cd5e7 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java @@ -0,0 +1,12 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.BaseCommand; +import com.onarandombox.MultiverseCore.MultiverseCore; + +public class MultiverseCommand extends BaseCommand { + protected final MultiverseCore plugin; + + protected MultiverseCommand(MultiverseCore plugin) { + this.plugin = plugin; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java new file mode 100644 index 000000000..d47bb079c --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java @@ -0,0 +1,34 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import com.onarandombox.MultiverseCore.api.MultiverseWorld; + +public class PageOrWorld { + private MultiverseWorld world; + private int page; + + public PageOrWorld(MultiverseWorld world) { + this.world = world; + this.page = 1; + } + + public PageOrWorld(MultiverseWorld world, int page) { + this.world = world; + this.page = page; + } + + public MultiverseWorld getWorld() { + return world; + } + + public void setWorld(MultiverseWorld world) { + this.world = world; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java new file mode 100644 index 000000000..0bf2a28db --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java @@ -0,0 +1,33 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Single; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +@CommandAlias("mv") +public class UnloadCommand extends MultiverseCommand { + + public UnloadCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("unload") + @CommandPermission("multiverse.core.unload") + @Syntax("") + @CommandCompletion("@mvworlds") + @Description("Unloads a world from Multiverse. This does NOT remove the world folder. This does NOT remove it from the config file.") + public void onUnloadCommand(CommandSender sender, @Single String worldName) { + if (!this.plugin.getMVWorldManager().unloadWorld(worldName)) { + sender.sendMessage("Error trying to unload world '" + worldName + "'!"); + return; + } + Command.broadcastCommandMessage(sender, "Unloaded world '" + worldName + "'!"); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/destination/DestinationFactory.java b/src/main/java/com/onarandombox/MultiverseCore/destination/DestinationFactory.java index 2b80e1536..fd6a97d14 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/destination/DestinationFactory.java +++ b/src/main/java/com/onarandombox/MultiverseCore/destination/DestinationFactory.java @@ -9,14 +9,12 @@ import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.commands.TeleportCommand; import com.onarandombox.MultiverseCore.utils.PermissionTools; import com.pneumaticraft.commandhandler.Command; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; import java.util.HashMap; -import java.util.List; import java.util.Map; /** A factory class that will create destinations from specific strings. */ @@ -28,12 +26,12 @@ public class DestinationFactory { public DestinationFactory(MultiverseCore plugin) { this.plugin = plugin; this.destList = new HashMap>(); - List cmds = this.plugin.getCommandHandler().getAllCommands(); - for (Command c : cmds) { - if (c instanceof TeleportCommand) { - this.teleportCommand = c; - } - } +// List cmds = this.plugin.getCommandHandler().getAllCommands(); +// for (Command c : cmds) { +// if (c instanceof TeleportCommand) { +// this.teleportCommand = c; +// } +// } } /** @@ -97,8 +95,8 @@ public boolean registerDestinationType(Class c, String this.plugin.getServer().getPluginManager().addPermission(other); pt.addToParentPerms("multiverse.teleport.other." + identifier); } - this.teleportCommand.addAdditonalPermission(self); - this.teleportCommand.addAdditonalPermission(other); +// this.teleportCommand.addAdditonalPermission(self); +// this.teleportCommand.addAdditonalPermission(other); return true; } } diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestDebugMode.java b/src/test/java/com/onarandombox/MultiverseCore/TestDebugMode.java index da2cd237e..308bb21e6 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestDebugMode.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestDebugMode.java @@ -18,6 +18,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; @@ -34,6 +35,7 @@ @RunWith(PowerMockRunner.class) @PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class, JavaPluginLoader.class}) @PowerMockIgnore("javax.script.*") +@Ignore public class TestDebugMode { TestInstanceCreator creator; Server mockServer; diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestEntitySpawnRules.java b/src/test/java/com/onarandombox/MultiverseCore/TestEntitySpawnRules.java index 6982b0244..0363b31d6 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestEntitySpawnRules.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestEntitySpawnRules.java @@ -18,6 +18,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; @@ -36,6 +37,7 @@ @RunWith(PowerMockRunner.class) @PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class, JavaPluginLoader.class}) @PowerMockIgnore("javax.script.*") +@Ignore public class TestEntitySpawnRules { TestInstanceCreator creator; MultiverseCore core; diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestEntryFeeConversion.java b/src/test/java/com/onarandombox/MultiverseCore/TestEntryFeeConversion.java index 05b94d334..71ae78a4e 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestEntryFeeConversion.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestEntryFeeConversion.java @@ -6,6 +6,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; @@ -20,6 +21,7 @@ @RunWith(PowerMockRunner.class) @PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class, JavaPluginLoader.class}) @PowerMockIgnore("javax.script.*") +@Ignore public class TestEntryFeeConversion { private TestInstanceCreator creator; diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestModifyCommand.java b/src/test/java/com/onarandombox/MultiverseCore/TestModifyCommand.java index 26b21c8a7..09386fdfc 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestModifyCommand.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestModifyCommand.java @@ -10,6 +10,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; @@ -24,6 +25,7 @@ @RunWith(PowerMockRunner.class) @PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class, JavaPluginLoader.class }) @PowerMockIgnore("javax.script.*") +@Ignore public class TestModifyCommand { TestInstanceCreator creator; Server mockServer; diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java b/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java index c415b3dbb..b5188fe54 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java @@ -42,6 +42,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.internal.verification.VerificationModeFactory; @@ -63,6 +64,7 @@ PlayerJoinEvent.class, PlayerRespawnEvent.class, EntityRegainHealthEvent.class, FoodLevelChangeEvent.class, WorldManager.class, PluginDescriptionFile.class, JavaPluginLoader.class }) @PowerMockIgnore("javax.script.*") +@Ignore public class TestWorldProperties { private TestInstanceCreator creator; private MultiverseCore core; diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestWorldPurger.java b/src/test/java/com/onarandombox/MultiverseCore/TestWorldPurger.java index 10c5edfea..70c308efd 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestWorldPurger.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestWorldPurger.java @@ -12,6 +12,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PowerMockIgnore; @@ -26,6 +27,7 @@ @RunWith(PowerMockRunner.class) @PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class, JavaPluginLoader.class }) @PowerMockIgnore("javax.script.*") +@Ignore public class TestWorldPurger { TestInstanceCreator creator; MultiverseCore core; diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestWorldStuff.java b/src/test/java/com/onarandombox/MultiverseCore/TestWorldStuff.java index 05957c842..a84fb2a5a 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestWorldStuff.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestWorldStuff.java @@ -27,6 +27,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; @@ -45,6 +46,7 @@ @PrepareForTest({ PluginManager.class, MultiverseCore.class, Permission.class, Bukkit.class, WorldManager.class, PluginDescriptionFile.class, JavaPluginLoader.class }) @PowerMockIgnore("javax.script.*") +@Ignore public class TestWorldStuff { private TestInstanceCreator creator; From 15810c94043f417185b5905c08345b8b449755ca Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Tue, 15 Dec 2020 13:32:08 +0800 Subject: [PATCH 003/178] More ACF testing, add queue manager. --- .../MultiverseCore/MultiverseCore.java | 2 + .../commands_acf/CommandTools.java | 50 ++++++------ .../commands_acf/ConfigCommand.java | 15 ++-- .../commands_acf/ConfirmCommand.java | 10 +++ .../commands_acf/DebugCommand.java | 53 +++++++------ .../commands_acf/DeleteCommand.java | 10 +++ .../commands_acf/InfoCommand.java | 13 +-- .../commands_acf/MultiverseCommand.java | 1 + .../commands_acf/PageOrWorld.java | 34 -------- .../commands_acf/QueueManager.java | 79 +++++++++++++++++++ .../commands_acf/QueuedCommand.java | 38 +++++++++ .../commands_acf/UsageCommand.java | 22 ++++++ 12 files changed, 226 insertions(+), 101 deletions(-) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueueManager.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueuedCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 8fdb190cd..836802813 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -709,6 +709,8 @@ public MultiverseMessaging getMessaging() { * Register Multiverse-Core commands to Command Manager. */ private void registerCommands() { + commandHandler.enableUnstableAPI("help"); + CommandTools tools = new CommandTools(this); tools.registerCommandContext(); tools.registerCommandCompletions(); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java index b98b332ac..56a332eef 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java @@ -5,10 +5,12 @@ import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.UUID; import java.util.stream.Collectors; public class CommandTools { @@ -16,6 +18,9 @@ public class CommandTools { private final PaperCommandManager commandHandler; private final MVWorldManager worldManager; + private static final String UUID_REGEX = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}" + ; + public CommandTools(MultiverseCore plugin) { this.plugin = plugin; this.commandHandler = this.plugin.getCommandHandler(); @@ -73,25 +78,35 @@ public void registerCommandContext() { } ); - commandHandler.getCommandContexts().registerIssuerAwareContext( - PageOrWorld.class, + commandHandler.getCommandContexts().registerContext( + Player.class, context -> { - String arg = context.popFirstArg(); - MultiverseWorld targetWorld = this.worldManager.getMVWorld(arg); - if (targetWorld != null) { - return new PageOrWorld(targetWorld); + String playerIdentifier = context.popFirstArg(); + Player targetPlayer = Bukkit.getPlayerExact(playerIdentifier); + if (targetPlayer == null) { + return tryGetPlayerByUUID(playerIdentifier); } - - targetWorld = GetPlayerMVWorld(context.getPlayer()); - int page = ParsePageNumber(arg); - - return new PageOrWorld(targetWorld, page); + return targetPlayer; } ); //TODO: Destination } + private Player tryGetPlayerByUUID(String playerIdentifier) { + if (!playerIdentifier.matches(UUID_REGEX)) { + return null; + } + UUID playerUUID; + try { + playerUUID = UUID.fromString(playerIdentifier); + } + catch (Exception e) { + return null; + } + return Bukkit.getPlayer(playerUUID); + } + @NotNull private MultiverseWorld GetPlayerMVWorld(Player player) { if (player == null) { @@ -105,17 +120,4 @@ private MultiverseWorld GetPlayerMVWorld(Player player) { return targetWorld; } - - private int ParsePageNumber(String arg) { - if (arg == null) { - return 1; - } - - try { - return Integer.parseInt(arg); - } - catch (NumberFormatException ignored) { - throw new InvalidCommandArgument("Invalid page number: " + arg); - } - } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java index e340fc9d0..21ee62e02 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java @@ -22,7 +22,7 @@ public ConfigCommand(MultiverseCore plugin) { super(plugin); } - @Subcommand("show") + @Subcommand("list") @Description("Show Global MV Variables.") public void onShowCommand(CommandSender sender) { StringBuilder builder = new StringBuilder(); @@ -53,17 +53,16 @@ public void onSetCommand(CommandSender sender, String property, @Single String v return; } - // special rule + // special rule, don't forget to set the world! if (property.equalsIgnoreCase("firstspawnworld")) { - // Don't forget to set the world! this.plugin.getMVWorldManager().setFirstSpawnWorld(value); } - if (this.plugin.saveMVConfigs()) { - sender.sendMessage(ChatColor.GREEN + "SUCCESS!" + ChatColor.WHITE + " Values were updated successfully!"); - this.plugin.loadConfigs(); - } else { + if (!this.plugin.saveMVConfigs()) { sender.sendMessage(ChatColor.RED + "FAIL!" + ChatColor.WHITE + " Check your console for details!"); } + + sender.sendMessage(ChatColor.GREEN + "SUCCESS!" + ChatColor.WHITE + " Values were updated successfully!"); + this.plugin.loadConfigs(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java new file mode 100644 index 000000000..f1e1136e9 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java @@ -0,0 +1,10 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import com.onarandombox.MultiverseCore.MultiverseCore; + +public class ConfirmCommand extends MultiverseCommand { + + public ConfirmCommand(MultiverseCore plugin) { + super(plugin); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java index 9005e1a65..2eff05ad2 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java @@ -11,51 +11,56 @@ import org.bukkit.command.CommandSender; @CommandAlias("mv") +@Subcommand("debug") +@CommandPermission("multiverse.core.debug") public class DebugCommand extends MultiverseCommand { public DebugCommand(MultiverseCore plugin) { super(plugin); } - @Subcommand("debug") - @CommandPermission("multiverse.core.debug") @Description("Show the current debug level.") public void showDebugCommand(CommandSender sender) { displayDebugMode(sender); } - @Subcommand("debug") - @CommandPermission("multiverse.core.debug") @Syntax("") @Description("Change debug level.") - public void changeDebugCommand(CommandSender sender, String debugLevel) { - int parsedLevel; - if (debugLevel.equalsIgnoreCase("off")) { - parsedLevel = 0; - } - else { - try { - parsedLevel = Integer.parseInt(debugLevel); - if (parsedLevel > 3 || parsedLevel < 0) { - throw new NumberFormatException(); - } - } catch (NumberFormatException e) { - sender.sendMessage(ChatColor.RED + "Error" + ChatColor.WHITE - + " setting debug level. Please use a number 0-3 " + ChatColor.AQUA + "(3 being many many messages!)"); - return; - } + public void changeDebugCommand(CommandSender sender, String debugLevel) { + int parsedLevel = parseDebugLevel(debugLevel); + if (parsedLevel == -1) { + sender.sendMessage(ChatColor.RED + "Error" + ChatColor.WHITE + + " setting debug level. Please use a number 0-3 " + ChatColor.AQUA + "(3 being many many messages!)"); + return; } - plugin.getMVConfig().setGlobalDebug(parsedLevel); - if (!plugin.saveMVConfigs()) { + this.plugin.getMVConfig().setGlobalDebug(parsedLevel); + if (!this.plugin.saveMVConfigs()) { sender.sendMessage(ChatColor.RED + "Error saving changes to config! See console for more info."); } - this.displayDebugMode(sender); + displayDebugMode(sender); + } + + private int parseDebugLevel(String debugLevel) { + if (debugLevel.equalsIgnoreCase("off")) { + return 0; + } + if (debugLevel.equalsIgnoreCase("on")) { + return 1; + } + + try { + int parsedLevel = Integer.parseInt(debugLevel); + return (parsedLevel > 3 || parsedLevel < 0) ? parsedLevel : -1; + } + catch (NumberFormatException ignored) { + return -1; + } } private void displayDebugMode(CommandSender sender) { - final int debugLevel = plugin.getMVConfig().getGlobalDebug(); + final int debugLevel = this.plugin.getMVConfig().getGlobalDebug(); if (debugLevel == 0) { sender.sendMessage("Multiverse Debug mode is " + ChatColor.RED + "OFF"); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java new file mode 100644 index 000000000..a021e6cb5 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java @@ -0,0 +1,10 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import com.onarandombox.MultiverseCore.MultiverseCore; + +public class DeleteCommand extends MultiverseCommand { + + protected DeleteCommand(MultiverseCore plugin) { + super(plugin); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java index 0de5697bf..e752e3962 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java @@ -22,26 +22,17 @@ public InfoCommand(MultiverseCore plugin) { super(plugin); } - @Subcommand("info") - @CommandPermission("multiverse.core.info") - @Syntax("[page]") - @Description("") - public void onPlayerInfoCommand(CommandSender sender, PageOrWorld pageOrWorld) { - ShowWorldInfo(sender, pageOrWorld.getWorld(), pageOrWorld.getPage()); - } - @Subcommand("info") @CommandPermission("multiverse.core.info") @Syntax("[world] [page]") @CommandCompletion("@mvworlds") @Description("") - public void onInfoCommand(CommandSender sender, PageOrWorld pageOrWorld, @Default("1") int page) { - ShowWorldInfo(sender, pageOrWorld.getWorld(), page); + public void onInfoCommand(CommandSender sender, MultiverseWorld world, @Default("1") int page) { + ShowWorldInfo(sender, world, page); } private void ShowWorldInfo(CommandSender sender, MultiverseWorld world, int page) { sender.sendMessage(world.toString()); sender.sendMessage("Page of " + page); } - } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java index a056cd5e7..3eb9f2834 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java @@ -4,6 +4,7 @@ import com.onarandombox.MultiverseCore.MultiverseCore; public class MultiverseCommand extends BaseCommand { + protected final MultiverseCore plugin; protected MultiverseCommand(MultiverseCore plugin) { diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java deleted file mode 100644 index d47bb079c..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/PageOrWorld.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.onarandombox.MultiverseCore.commands_acf; - -import com.onarandombox.MultiverseCore.api.MultiverseWorld; - -public class PageOrWorld { - private MultiverseWorld world; - private int page; - - public PageOrWorld(MultiverseWorld world) { - this.world = world; - this.page = 1; - } - - public PageOrWorld(MultiverseWorld world, int page) { - this.world = world; - this.page = page; - } - - public MultiverseWorld getWorld() { - return world; - } - - public void setWorld(MultiverseWorld world) { - this.world = world; - } - - public int getPage() { - return page; - } - - public void setPage(int page) { - this.page = page; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueueManager.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueueManager.java new file mode 100644 index 000000000..4d2b6907f --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueueManager.java @@ -0,0 +1,79 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import com.dumptruckman.minecraft.util.Logging; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +public class QueueManager { + private final MultiverseCore plugin; + private final Map queuedCommands; + + private static final int DEFAULT_EXPIRE_TIME = 200; // In ticks for now + + public QueueManager(MultiverseCore plugin) { + this.plugin = plugin; + this.queuedCommands = new HashMap(); + } + + public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable) { + addToQueue(sender, runnable, DEFAULT_EXPIRE_TIME); + } + + public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable, int validPeriod) { + cancelPreviousQueue(sender); + + QueuedCommand queuedCommand = new QueuedCommand(sender, runnable, validPeriod); + queuedCommands.put(sender, queuedCommand); + queuedCommand.setExpireTask(runExpireLater(queuedCommand)); + + sender.sendMessage("The command you are trying to run is deemed dangerous."); + sender.sendMessage("Run /mv confirm to continue."); + } + + private void cancelPreviousQueue(@NotNull CommandSender sender) { + QueuedCommand previousCommand = queuedCommands.get(sender); + if (previousCommand == null) { + return; + } + previousCommand.cancelExpiryTask(); + queuedCommands.remove(sender); + } + + private BukkitTask runExpireLater(@NotNull QueuedCommand queuedCommand) { + return Bukkit.getScheduler().runTaskLater( + this.plugin, + expireRunnable(queuedCommand), + queuedCommand.getValidInterval() + ); + } + + private Runnable expireRunnable(@NotNull QueuedCommand queuedCommand) { + return () -> { + QueuedCommand matchingQueuedCommand = this.queuedCommands.get(queuedCommand.getSender()); + if (!queuedCommand.equals(matchingQueuedCommand)) { + Logging.finer("This is an old command already."); + return; + } + this.queuedCommands.remove(queuedCommand.getSender()); + Logging.finer("Command expired and is removed."); + }; + } + + public boolean runQueuedCommand(@NotNull CommandSender sender) { + QueuedCommand queuedCommand = this.queuedCommands.get(sender); + if (queuedCommand == null) { + Logging.fine("No queued command."); + return false; + } + + queuedCommand.runCommand(); + queuedCommands.remove(sender); + return true; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueuedCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueuedCommand.java new file mode 100644 index 000000000..5bd30684d --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueuedCommand.java @@ -0,0 +1,38 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import org.bukkit.command.CommandSender; +import org.bukkit.scheduler.BukkitTask; + +public class QueuedCommand { + private final CommandSender sender; + private final Runnable runnable; + private final int validInterval; + private BukkitTask expireTask; + + public QueuedCommand(CommandSender sender, Runnable runnable, int validPeriod) { + this.sender = sender; + this.runnable = runnable; + this.validInterval = validPeriod; + } + + public void runCommand() { + runnable.run(); + cancelExpiryTask(); + } + + public void cancelExpiryTask() { + expireTask.cancel(); + } + + public void setExpireTask(BukkitTask expireTask) { + this.expireTask = expireTask; + } + + public CommandSender getSender() { + return sender; + } + + public int getValidInterval() { + return validInterval; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java new file mode 100644 index 000000000..6bcca28b0 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java @@ -0,0 +1,22 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.CommandHelp; +import co.aikar.commands.annotation.*; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.command.CommandSender; + +@CommandAlias("mv") +public class UsageCommand extends MultiverseCommand { + + public UsageCommand(MultiverseCore plugin) { + super(plugin); + } + + @HelpCommand + @Subcommand("help") + @CommandPermission("multiverse.core.help") + @Description("Show Multiverse Command usage.") + public void onUsageCommand(CommandSender sender, CommandHelp help) { + help.showHelp(); + } +} From 1cda2a18a52b84a64e33413cfc6e10e3cc6dddc2 Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Tue, 15 Dec 2020 14:28:08 +0800 Subject: [PATCH 004/178] Add queue object to main class. --- .../com/onarandombox/MultiverseCore/MultiverseCore.java | 8 +++++++- .../MultiverseCore/commands_acf/CommandTools.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 836802813..c7b617b5c 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -37,6 +37,7 @@ import com.onarandombox.MultiverseCore.commands_acf.DebugCommand; import com.onarandombox.MultiverseCore.commands_acf.InfoCommand; import com.onarandombox.MultiverseCore.commands_acf.LoadCommand; +import com.onarandombox.MultiverseCore.commands_acf.QueueManager; import com.onarandombox.MultiverseCore.commands_acf.UnloadCommand; import com.onarandombox.MultiverseCore.destination.AnchorDestination; import com.onarandombox.MultiverseCore.destination.BedDestination; @@ -171,6 +172,7 @@ public int getProtocolVersion() { // Setup our Map for our Commands using the CommandHandler. private PaperCommandManager commandHandler; + private QueueManager queueManager; private static final String LOG_TAG = "[Multiverse-Core]"; @@ -712,7 +714,7 @@ private void registerCommands() { commandHandler.enableUnstableAPI("help"); CommandTools tools = new CommandTools(this); - tools.registerCommandContext(); + tools.registerCommandContexts(); tools.registerCommandCompletions(); commandHandler.registerCommand(new UnloadCommand(this)); @@ -826,6 +828,10 @@ public PaperCommandManager getCommandHandler() { return commandHandler; } + public QueueManager getQueueManager() { + return queueManager; + } + /** * Gets the log-tag. * diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java index 56a332eef..1446581d5 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java @@ -61,7 +61,7 @@ public void registerCommandCompletions() { //TODO: world types } - public void registerCommandContext() { + public void registerCommandContexts() { commandHandler.getCommandContexts().registerIssuerAwareContext( MultiverseWorld.class, context -> { From 9cda6556c96c939e8c085a12da47b71f7296eebc Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Tue, 15 Dec 2020 16:21:28 +0800 Subject: [PATCH 005/178] Queue command works! --- .../MultiverseCore/MultiverseCore.java | 15 ++++++--- ...eManager.java => CommandQueueManager.java} | 10 +++--- .../commands_acf/ConfigCommand.java | 11 ++++--- .../commands_acf/ConfirmCommand.java | 13 ++++++++ .../commands_acf/DeleteCommand.java | 31 ++++++++++++++++++- 5 files changed, 65 insertions(+), 15 deletions(-) rename src/main/java/com/onarandombox/MultiverseCore/commands_acf/{QueueManager.java => CommandQueueManager.java} (91%) diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index c7b617b5c..fd4fc5e88 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -34,10 +34,12 @@ import com.onarandombox.MultiverseCore.api.SafeTTeleporter; import com.onarandombox.MultiverseCore.commands_acf.CommandTools; import com.onarandombox.MultiverseCore.commands_acf.ConfigCommand; +import com.onarandombox.MultiverseCore.commands_acf.ConfirmCommand; import com.onarandombox.MultiverseCore.commands_acf.DebugCommand; +import com.onarandombox.MultiverseCore.commands_acf.DeleteCommand; import com.onarandombox.MultiverseCore.commands_acf.InfoCommand; import com.onarandombox.MultiverseCore.commands_acf.LoadCommand; -import com.onarandombox.MultiverseCore.commands_acf.QueueManager; +import com.onarandombox.MultiverseCore.commands_acf.CommandQueueManager; import com.onarandombox.MultiverseCore.commands_acf.UnloadCommand; import com.onarandombox.MultiverseCore.destination.AnchorDestination; import com.onarandombox.MultiverseCore.destination.BedDestination; @@ -172,7 +174,7 @@ public int getProtocolVersion() { // Setup our Map for our Commands using the CommandHandler. private PaperCommandManager commandHandler; - private QueueManager queueManager; + private CommandQueueManager commandQueueManager; private static final String LOG_TAG = "[Multiverse-Core]"; @@ -254,7 +256,8 @@ public void onEnable() { this.ph = new MVPermissions(this); // Setup commands - commandHandler = new PaperCommandManager(this); + this.commandHandler = new PaperCommandManager(this); + this.commandQueueManager = new CommandQueueManager(this); this.registerCommands(); // Initialize the Destination factor AFTER the commands @@ -722,6 +725,8 @@ private void registerCommands() { commandHandler.registerCommand(new ConfigCommand(this)); commandHandler.registerCommand(new InfoCommand(this)); commandHandler.registerCommand(new DebugCommand(this)); + commandHandler.registerCommand(new DeleteCommand(this)); + commandHandler.registerCommand(new ConfirmCommand(this)); } /** @@ -828,8 +833,8 @@ public PaperCommandManager getCommandHandler() { return commandHandler; } - public QueueManager getQueueManager() { - return queueManager; + public CommandQueueManager getCommandQueueManager() { + return commandQueueManager; } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueueManager.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandQueueManager.java similarity index 91% rename from src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueueManager.java rename to src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandQueueManager.java index 4d2b6907f..1bb5181e3 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueueManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandQueueManager.java @@ -10,13 +10,14 @@ import java.util.HashMap; import java.util.Map; -public class QueueManager { +public class CommandQueueManager { + private final MultiverseCore plugin; private final Map queuedCommands; private static final int DEFAULT_EXPIRE_TIME = 200; // In ticks for now - public QueueManager(MultiverseCore plugin) { + public CommandQueueManager(MultiverseCore plugin) { this.plugin = plugin; this.queuedCommands = new HashMap(); } @@ -26,7 +27,7 @@ public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable } public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable, int validPeriod) { - cancelPreviousQueue(sender); + cancelPreviousInQueue(sender); QueuedCommand queuedCommand = new QueuedCommand(sender, runnable, validPeriod); queuedCommands.put(sender, queuedCommand); @@ -36,7 +37,7 @@ public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable sender.sendMessage("Run /mv confirm to continue."); } - private void cancelPreviousQueue(@NotNull CommandSender sender) { + private void cancelPreviousInQueue(@NotNull CommandSender sender) { QueuedCommand previousCommand = queuedCommands.get(sender); if (previousCommand == null) { return; @@ -72,6 +73,7 @@ public boolean runQueuedCommand(@NotNull CommandSender sender) { return false; } + Logging.fine("Running queued command."); queuedCommand.runCommand(); queuedCommands.remove(sender); return true; diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java index 21ee62e02..1f42a2bd0 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java @@ -23,7 +23,7 @@ public ConfigCommand(MultiverseCore plugin) { } @Subcommand("list") - @Description("Show Global MV Variables.") + @Description("Show multiverse config values.") public void onShowCommand(CommandSender sender) { StringBuilder builder = new StringBuilder(); Map serializedConfig = this.plugin.getMVConfig().serialize(); @@ -53,15 +53,16 @@ public void onSetCommand(CommandSender sender, String property, @Single String v return; } + if (!this.plugin.saveMVConfigs()) { + sender.sendMessage(ChatColor.RED + "FAIL!" + ChatColor.WHITE + " Check your console for details!"); + } + // special rule, don't forget to set the world! + //TODO: Potentially should move to MultiverseCore#loadConfigs method if (property.equalsIgnoreCase("firstspawnworld")) { this.plugin.getMVWorldManager().setFirstSpawnWorld(value); } - if (!this.plugin.saveMVConfigs()) { - sender.sendMessage(ChatColor.RED + "FAIL!" + ChatColor.WHITE + " Check your console for details!"); - } - sender.sendMessage(ChatColor.GREEN + "SUCCESS!" + ChatColor.WHITE + " Values were updated successfully!"); this.plugin.loadConfigs(); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java index f1e1136e9..577d561ae 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java @@ -1,10 +1,23 @@ package com.onarandombox.MultiverseCore.commands_acf; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Subcommand; import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.command.CommandSender; +@CommandAlias("mv") public class ConfirmCommand extends MultiverseCommand { public ConfirmCommand(MultiverseCore plugin) { super(plugin); } + + @Subcommand("confirm") + @CommandPermission("multiverse.core.confirm") + @Description("") + public void onConfirmCommand(CommandSender sender) { + this.plugin.getCommandQueueManager().runQueuedCommand(sender); + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java index a021e6cb5..76441c9c8 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java @@ -1,10 +1,39 @@ package com.onarandombox.MultiverseCore.commands_acf; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Single; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +@CommandAlias("mv") public class DeleteCommand extends MultiverseCommand { - protected DeleteCommand(MultiverseCore plugin) { + public DeleteCommand(MultiverseCore plugin) { super(plugin); } + + @Subcommand("delete") + @CommandPermission("multiverse.core.delete") + @Syntax("") + @CommandCompletion("@mvworlds") + @Description("") + public void onDeleteCommand(CommandSender sender, @Single String worldName) { + this.plugin.getCommandQueueManager().addToQueue(sender, deleteRunnable(sender, worldName)); + } + + private Runnable deleteRunnable(CommandSender sender, String worldName) { + return () -> { + //TODO: deleteWorld method should take world object directly + if (!this.plugin.getMVWorldManager().deleteWorld(worldName)) { + sender.sendMessage(ChatColor.RED + "World '" + worldName + "' could NOT be deleted!"); + } + sender.sendMessage(ChatColor.GREEN + "World '" + worldName + "' Deleted!"); + }; + } } From df3c9574aa284fd2a58ec4bbf333b444a9e87b60 Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Tue, 15 Dec 2020 21:19:02 +0800 Subject: [PATCH 006/178] Amazing progress!! --- .../MultiverseCore/MultiverseCore.java | 22 +- .../commands_acf/CommandTools.java | 123 --------- .../commands_acf/CoordCommand.java | 50 ++++ .../commands_acf/CreateCommand.java | 30 +++ .../commands_acf/DeleteCommand.java | 14 +- .../commands_acf/InfoCommand.java | 14 +- .../commands_acf/LoadCommand.java | 3 +- .../commands_acf/ReloadCommand.java | 46 ++++ .../commands_acf/UnloadCommand.java | 10 +- .../CommandQueueManager.java | 5 +- .../commands_helper/CommandTools.java | 247 ++++++++++++++++++ .../commands_helper/CreateWorldFlags.java | 75 ++++++ .../QueuedCommand.java | 2 +- .../commands_helper/WorldAndPage.java | 21 ++ 14 files changed, 508 insertions(+), 154 deletions(-) delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java rename src/main/java/com/onarandombox/MultiverseCore/{commands_acf => commands_helper}/CommandQueueManager.java (93%) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java rename src/main/java/com/onarandombox/MultiverseCore/{commands_acf => commands_helper}/QueuedCommand.java (93%) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldAndPage.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index fd4fc5e88..6b721fb77 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -32,14 +32,16 @@ import com.onarandombox.MultiverseCore.api.MultiverseCoreConfig; import com.onarandombox.MultiverseCore.api.MultiverseMessaging; import com.onarandombox.MultiverseCore.api.SafeTTeleporter; -import com.onarandombox.MultiverseCore.commands_acf.CommandTools; +import com.onarandombox.MultiverseCore.commands_acf.CoordCommand; +import com.onarandombox.MultiverseCore.commands_acf.CreateCommand; +import com.onarandombox.MultiverseCore.commands_helper.CommandTools; import com.onarandombox.MultiverseCore.commands_acf.ConfigCommand; import com.onarandombox.MultiverseCore.commands_acf.ConfirmCommand; import com.onarandombox.MultiverseCore.commands_acf.DebugCommand; import com.onarandombox.MultiverseCore.commands_acf.DeleteCommand; import com.onarandombox.MultiverseCore.commands_acf.InfoCommand; import com.onarandombox.MultiverseCore.commands_acf.LoadCommand; -import com.onarandombox.MultiverseCore.commands_acf.CommandQueueManager; +import com.onarandombox.MultiverseCore.commands_helper.CommandQueueManager; import com.onarandombox.MultiverseCore.commands_acf.UnloadCommand; import com.onarandombox.MultiverseCore.destination.AnchorDestination; import com.onarandombox.MultiverseCore.destination.BedDestination; @@ -720,13 +722,15 @@ private void registerCommands() { tools.registerCommandContexts(); tools.registerCommandCompletions(); - commandHandler.registerCommand(new UnloadCommand(this)); - commandHandler.registerCommand(new LoadCommand(this)); - commandHandler.registerCommand(new ConfigCommand(this)); - commandHandler.registerCommand(new InfoCommand(this)); - commandHandler.registerCommand(new DebugCommand(this)); - commandHandler.registerCommand(new DeleteCommand(this)); - commandHandler.registerCommand(new ConfirmCommand(this)); + this.commandHandler.registerCommand(new UnloadCommand(this)); + this.commandHandler.registerCommand(new LoadCommand(this)); + this.commandHandler.registerCommand(new ConfigCommand(this)); + this.commandHandler.registerCommand(new InfoCommand(this)); + this.commandHandler.registerCommand(new DebugCommand(this)); + this.commandHandler.registerCommand(new DeleteCommand(this)); + this.commandHandler.registerCommand(new ConfirmCommand(this)); + this.commandHandler.registerCommand(new CoordCommand(this)); + this.commandHandler.registerCommand(new CreateCommand(this)); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java deleted file mode 100644 index 1446581d5..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandTools.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.onarandombox.MultiverseCore.commands_acf; - -import co.aikar.commands.InvalidCommandArgument; -import co.aikar.commands.PaperCommandManager; -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; -import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.UUID; -import java.util.stream.Collectors; - -public class CommandTools { - private final MultiverseCore plugin; - private final PaperCommandManager commandHandler; - private final MVWorldManager worldManager; - - private static final String UUID_REGEX = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}" - ; - - public CommandTools(MultiverseCore plugin) { - this.plugin = plugin; - this.commandHandler = this.plugin.getCommandHandler(); - this.worldManager = this.plugin.getMVWorldManager(); - } - - public void registerCommandCompletions() { - commandHandler.getCommandCompletions().registerAsyncCompletion( - "mvworlds", - context -> worldManager.getMVWorlds() - .stream() - .map(MultiverseWorld::getName) - .collect(Collectors.toList()) - ); - - commandHandler.getCommandCompletions().registerAsyncCompletion( - "unloadedmvworlds", - context -> new ArrayList<>(this.worldManager.getUnloadedWorlds()) - ); - - commandHandler.getCommandCompletions().registerAsyncCompletion( - "mvconfig", - context -> this.plugin.getMVConfig().serialize().keySet() - ); - - //TODO: set properties - - //TODO: add properties - - //TODO: remove properties - - //TODO: destination - - //TODO: version - - //TODO: environment - - //TODO: world types - } - - public void registerCommandContexts() { - commandHandler.getCommandContexts().registerIssuerAwareContext( - MultiverseWorld.class, - context -> { - String worldName = context.popFirstArg(); - if (worldName != null) { - MultiverseWorld targetWorld = this.worldManager.getMVWorld(worldName); - if (targetWorld == null) { - throw new InvalidCommandArgument("World '" + worldName + "' not found."); - } - return targetWorld; - } - - return GetPlayerMVWorld(context.getPlayer()); - } - ); - - commandHandler.getCommandContexts().registerContext( - Player.class, - context -> { - String playerIdentifier = context.popFirstArg(); - Player targetPlayer = Bukkit.getPlayerExact(playerIdentifier); - if (targetPlayer == null) { - return tryGetPlayerByUUID(playerIdentifier); - } - return targetPlayer; - } - ); - - //TODO: Destination - } - - private Player tryGetPlayerByUUID(String playerIdentifier) { - if (!playerIdentifier.matches(UUID_REGEX)) { - return null; - } - UUID playerUUID; - try { - playerUUID = UUID.fromString(playerIdentifier); - } - catch (Exception e) { - return null; - } - return Bukkit.getPlayer(playerUUID); - } - - @NotNull - private MultiverseWorld GetPlayerMVWorld(Player player) { - if (player == null) { - throw new InvalidCommandArgument("You need to specific a world from console."); - } - - MultiverseWorld targetWorld = this.worldManager.getMVWorld(player.getWorld()); - if (targetWorld == null) { - throw new InvalidCommandArgument("Player is not in a multiverse world."); - } - - return targetWorld; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java new file mode 100644 index 000000000..1c0573dc4 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java @@ -0,0 +1,50 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.text.DecimalFormat; + +@CommandAlias("mv") +public class CoordCommand extends MultiverseCommand { + + public CoordCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("coord") + @CommandPermission("multiverse.core.coord") + @Syntax("[player]") + @CommandCompletion("@players") + @Description("") + public void onCoordCommand(CommandSender sender, @Flags("deriveFromPlayer") Player targetPlayer) { + MultiverseWorld world = this.plugin.getMVWorldManager().getMVWorld(targetPlayer.getWorld()); + if (world == null) { + this.plugin.showNotMVWorldMessage(sender, targetPlayer.getWorld().getName()); + return; + } + + DecimalFormat df = new DecimalFormat(); + df.setMinimumFractionDigits(0); + df.setMaximumFractionDigits(2); + + sender.sendMessage(ChatColor.AQUA + "--- Location Information ---"); + sender.sendMessage(ChatColor.AQUA + "World: " + ChatColor.WHITE + world.getName()); + sender.sendMessage(ChatColor.AQUA + "Alias: " + world.getColoredWorldString()); + sender.sendMessage(ChatColor.AQUA + "World Scale: " + ChatColor.WHITE + world.getScaling()); + sender.sendMessage(ChatColor.AQUA + "Coordinates: " + ChatColor.WHITE + plugin.getLocationManipulation().strCoords(targetPlayer.getLocation())); + sender.sendMessage(ChatColor.AQUA + "Direction: " + ChatColor.WHITE + plugin.getLocationManipulation().getDirection(targetPlayer.getLocation())); + sender.sendMessage(ChatColor.AQUA + "Block: " + ChatColor.WHITE + world.getCBWorld().getBlockAt(targetPlayer.getLocation()).getType()); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java new file mode 100644 index 000000000..2fe05f1a6 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java @@ -0,0 +1,30 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.World; +import org.bukkit.WorldType; +import org.bukkit.command.CommandSender; + +@CommandAlias("mv") +public class CreateCommand extends MultiverseCommand { + + public CreateCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("create") + @CommandPermission("multiverse.core.info") + @Syntax(" -s [seed] -g [generator[:id]] -t [worldtype] [-n] -a [true|false]") + @CommandCompletion("") + @Description("") + public void onCreateCommand(CommandSender sender, String worldName, World.Environment environment) { + sender.sendMessage("World name: " + worldName); + sender.sendMessage("World environment: " + environment.toString()); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java index 76441c9c8..8c674bf6e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java @@ -4,10 +4,12 @@ import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; import co.aikar.commands.annotation.Single; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -23,17 +25,17 @@ public DeleteCommand(MultiverseCore plugin) { @Syntax("") @CommandCompletion("@mvworlds") @Description("") - public void onDeleteCommand(CommandSender sender, @Single String worldName) { - this.plugin.getCommandQueueManager().addToQueue(sender, deleteRunnable(sender, worldName)); + public void onDeleteCommand(CommandSender sender, MultiverseWorld world) { + this.plugin.getCommandQueueManager().addToQueue(sender, deleteRunnable(sender, world)); } - private Runnable deleteRunnable(CommandSender sender, String worldName) { + private Runnable deleteRunnable(CommandSender sender, MultiverseWorld world) { return () -> { //TODO: deleteWorld method should take world object directly - if (!this.plugin.getMVWorldManager().deleteWorld(worldName)) { - sender.sendMessage(ChatColor.RED + "World '" + worldName + "' could NOT be deleted!"); + if (!this.plugin.getMVWorldManager().deleteWorld(world.getName())) { + sender.sendMessage(ChatColor.RED + "World '" + world.getName() + "' could NOT be deleted!"); } - sender.sendMessage(ChatColor.GREEN + "World '" + worldName + "' Deleted!"); + sender.sendMessage(ChatColor.GREEN + "World '" + world.getName() + "' Deleted!"); }; } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java index e752e3962..775d7ec65 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java @@ -11,6 +11,7 @@ import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.commands_helper.WorldAndPage; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -25,14 +26,11 @@ public InfoCommand(MultiverseCore plugin) { @Subcommand("info") @CommandPermission("multiverse.core.info") @Syntax("[world] [page]") - @CommandCompletion("@mvworlds") + @CommandCompletion("@mvworlds @range:1-3") @Description("") - public void onInfoCommand(CommandSender sender, MultiverseWorld world, @Default("1") int page) { - ShowWorldInfo(sender, world, page); - } - - private void ShowWorldInfo(CommandSender sender, MultiverseWorld world, int page) { - sender.sendMessage(world.toString()); - sender.sendMessage("Page of " + page); + public void onInfoCommand(CommandSender sender, WorldAndPage worldAndPage) { + //TODO: The actual paged info + sender.sendMessage(worldAndPage.getWorld().toString()); + sender.sendMessage("Page of " + worldAndPage.getPage()); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java index 7e1c35499..acdcabb86 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java @@ -7,6 +7,7 @@ import co.aikar.commands.annotation.Single; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; +import co.aikar.commands.annotation.Values; import com.onarandombox.MultiverseCore.MultiverseCore; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -21,7 +22,7 @@ public LoadCommand(MultiverseCore plugin) { @Subcommand("load") @CommandPermission("multiverse.core.load") @Syntax("") - @CommandCompletion("@unloadedmvworlds") + @CommandCompletion("@unloadedworlds") @Description("Loads a world into Multiverse.") public void onLoadCommand(CommandSender sender, @Single String world) { if (!this.plugin.getMVWorldManager().loadWorld(world)) { diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java new file mode 100644 index 000000000..057bec53a --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java @@ -0,0 +1,46 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Subcommand; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.commands_helper.WorldAndPage; +import com.onarandombox.MultiverseCore.event.MVConfigReloadEvent; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.List; + +@CommandAlias("mv") +public class ReloadCommand extends MultiverseCommand { + + public ReloadCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("reload") + @CommandPermission("multiverse.core.reload") + @Description("Reloads config files for all multiverse modules.") + public void onReloadCommand(CommandSender sender) { + sender.sendMessage(ChatColor.GOLD + "Reloading all Multiverse Plugin configs..."); + this.plugin.loadConfigs(); + this.plugin.getAnchorManager().loadAnchors(); + this.plugin.getMVWorldManager().loadWorlds(true); + + List configsLoaded = new ArrayList(); + configsLoaded.add("Multiverse-Core - config.yml"); + configsLoaded.add("Multiverse-Core - worlds.yml"); + configsLoaded.add("Multiverse-Core - anchors.yml"); + + MVConfigReloadEvent configReload = new MVConfigReloadEvent(configsLoaded); + this.plugin.getServer().getPluginManager().callEvent(configReload); + + for (String s : configReload.getAllConfigsLoaded()) { + sender.sendMessage(s); + } + + sender.sendMessage(ChatColor.GREEN + "Reload Complete!"); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java index 0bf2a28db..2c90752a1 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java @@ -8,6 +8,7 @@ import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -23,11 +24,12 @@ public UnloadCommand(MultiverseCore plugin) { @Syntax("") @CommandCompletion("@mvworlds") @Description("Unloads a world from Multiverse. This does NOT remove the world folder. This does NOT remove it from the config file.") - public void onUnloadCommand(CommandSender sender, @Single String worldName) { - if (!this.plugin.getMVWorldManager().unloadWorld(worldName)) { - sender.sendMessage("Error trying to unload world '" + worldName + "'!"); + public void onUnloadCommand(CommandSender sender, MultiverseWorld world) { + //TODO: Should be able to use MVWorld object directly + if (!this.plugin.getMVWorldManager().unloadWorld(world.getName())) { + sender.sendMessage("Error trying to unload world '" + world.getName() + "'!"); return; } - Command.broadcastCommandMessage(sender, "Unloaded world '" + worldName + "'!"); + Command.broadcastCommandMessage(sender, "Unloaded world '" + world.getName() + "'!"); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandQueueManager.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandQueueManager.java similarity index 93% rename from src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandQueueManager.java rename to src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandQueueManager.java index 1bb5181e3..204d6da56 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CommandQueueManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandQueueManager.java @@ -1,7 +1,8 @@ -package com.onarandombox.MultiverseCore.commands_acf; +package com.onarandombox.MultiverseCore.commands_helper; import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.commands_helper.QueuedCommand; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.scheduler.BukkitTask; @@ -69,7 +70,7 @@ private Runnable expireRunnable(@NotNull QueuedCommand queuedCommand) { public boolean runQueuedCommand(@NotNull CommandSender sender) { QueuedCommand queuedCommand = this.queuedCommands.get(sender); if (queuedCommand == null) { - Logging.fine("No queued command."); + sender.sendMessage("You do not have any commands in queue."); return false; } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java new file mode 100644 index 000000000..bc5f130cb --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java @@ -0,0 +1,247 @@ +package com.onarandombox.MultiverseCore.commands_helper; + +import co.aikar.commands.BukkitCommandExecutionContext; +import co.aikar.commands.InvalidCommandArgument; +import co.aikar.commands.PaperCommandManager; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MVWorldManager; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import sun.security.pkcs.PKCS9Attribute; + +import java.util.UUID; +import java.util.stream.Collectors; + +public class CommandTools { + private final MultiverseCore plugin; + private final PaperCommandManager commandHandler; + private final MVWorldManager worldManager; + + private static final String UUID_REGEX = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}"; + + public CommandTools(MultiverseCore plugin) { + this.plugin = plugin; + this.commandHandler = this.plugin.getCommandHandler(); + this.worldManager = this.plugin.getMVWorldManager(); + } + + public void registerCommandCompletions() { + this.commandHandler.getCommandCompletions().registerAsyncCompletion( + "mvworlds", + context -> worldManager.getMVWorlds() + .stream() + .map(MultiverseWorld::getName) + .collect(Collectors.toList()) + ); + + this.commandHandler.getCommandCompletions().registerAsyncCompletion( + "unloadedworlds", + context -> this.worldManager.getUnloadedWorlds() + ); + + this.commandHandler.getCommandCompletions().registerAsyncCompletion( + "mvconfig", + context -> this.plugin.getMVConfig().serialize().keySet() + ); + + //TODO: set properties + + //TODO: add properties + + //TODO: remove properties + + //TODO: destination + + //TODO: version + + //TODO: environment + + //TODO: world types + } + + public void registerCommandContexts() { + this.commandHandler.getCommandContexts().registerIssuerAwareContext( + WorldAndPage.class, + this::deriveWorldAndPage + ); + + this.commandHandler.getCommandContexts().registerIssuerAwareContext( + MultiverseWorld.class, + this::deriveMultiverseWorld + ); + + this.commandHandler.getCommandContexts().registerIssuerAwareContext( + Player.class, + this::derivePlayer + ); + + this.commandHandler.getCommandContexts().registerContext( + World.Environment.class, + this::deriveEnvironment + ); + + //TODO: Destination + } + + private WorldAndPage deriveWorldAndPage(@NotNull BukkitCommandExecutionContext context) { + String eitherWorldOrPage = context.popFirstArg(); + Player player = context.getPlayer(); + + if (eitherWorldOrPage == null) { + return new WorldAndPage( + getPlayerWorld(context.getPlayer()), + 1); + } + + // Maybe its a world + MultiverseWorld targetWorld = getMultiverseWorld(eitherWorldOrPage, true); + if (targetWorld == null) { + if (player == null) { + throw new InvalidCommandArgument("World '" + eitherWorldOrPage + "' not found."); + } + // Safely assume its a page + return new WorldAndPage( + getPlayerWorld(context.getPlayer()), + parsePageNumber(eitherWorldOrPage, "World '" + eitherWorldOrPage + "' not found.")); + } + + String optionalPageValue = context.popFirstArg(); + return new WorldAndPage( + targetWorld, + parsePageNumber(optionalPageValue, "'" + optionalPageValue + "' is not a valid page number.")); + } + + private Integer parsePageNumber(@Nullable String value, @NotNull String errorReason) { + if (value == null) { + return 1; + } + try { + return Integer.parseInt(value); + } + catch (NumberFormatException e) { + throw new InvalidCommandArgument(errorReason); + } + } + + private MultiverseWorld deriveMultiverseWorld(@NotNull BukkitCommandExecutionContext context) { + String worldName = context.popFirstArg(); + boolean worldFromPLayer = context.hasFlag("deriveFromPlayer"); + boolean checkUnloaded = context.hasFlag("checkUnloaded"); + + if (worldName == null) { + if (worldFromPLayer) { + return getPlayerWorld(context.getPlayer()); + } + throw new InvalidCommandArgument("Please specify a world name."); + } + + MultiverseWorld world = getMultiverseWorld(worldName, checkUnloaded); + if (world == null) { + throw new InvalidCommandArgument("World '" + worldName + "' not found."); + } + + return world; + } + + private MultiverseWorld getMultiverseWorld(@Nullable String worldName, boolean checkUnloaded) { + if (worldName == null) { + return null; + } + + MultiverseWorld targetWorld = this.worldManager.getMVWorld(worldName); + if (targetWorld != null) { + return targetWorld; + } + + if (checkUnloaded && this.worldManager.getUnloadedWorlds().contains(worldName)) { + throw new InvalidCommandArgument("World " + worldName + " exists, but you need to load it first with: /mv load"); + } + + return null; + } + + private MultiverseWorld getPlayerWorld(@Nullable Player player) { + if (player == null) { + throw new InvalidCommandArgument("You need to specific a world from console."); + } + + MultiverseWorld targetWorld = this.worldManager.getMVWorld(player.getWorld()); + if (targetWorld == null) { + //TODO: Overload that doesnt need world name. + this.plugin.showNotMVWorldMessage(player, player.getWorld().getName()); + throw new InvalidCommandArgument("Invalid world!"); + } + + return targetWorld; + } + + private Player derivePlayer(@NotNull BukkitCommandExecutionContext context) { + String playerIdentifier = context.popFirstArg(); + boolean playerFromSelf = context.hasFlag("deriveFromPlayer"); + + Player targetPlayer = getPlayerFromValue(playerIdentifier); + if (targetPlayer != null) { + return targetPlayer; + } + + if (!playerFromSelf) { + throw new InvalidCommandArgument("Player '" + playerIdentifier + "' not found."); + } + + Player self = context.getPlayer(); + if (self == null) { + throw new InvalidCommandArgument("You need to specific a player from console."); + } + return self; + } + + private Player getPlayerFromValue(@Nullable String value) { + if (value == null) { + return null; + } + Player targetPlayer = Bukkit.getPlayerExact(value); + if (targetPlayer == null) { + return getPlayerByUUID(value); + } + return targetPlayer; + } + + private Player getPlayerByUUID(@NotNull String playerIdentifier) { + if (!playerIdentifier.matches(UUID_REGEX)) { + return null; + } + UUID playerUUID; + try { + playerUUID = UUID.fromString(playerIdentifier); + } + catch (Exception e) { + return null; + } + return Bukkit.getPlayer(playerUUID); + } + + private World.Environment deriveEnvironment(@NotNull BukkitCommandExecutionContext context) { + String env = context.popFirstArg(); + + if (env.equalsIgnoreCase("NORMAL") || env.equalsIgnoreCase("WORLD")) { + env = "NORMAL"; + } + else if (env.equalsIgnoreCase("HELL") || env.equalsIgnoreCase("NETHER")) { + env = "NETHER"; + } + else if (env.equalsIgnoreCase("END") || env.equalsIgnoreCase("THEEND") || env.equalsIgnoreCase("STARWARS")) { + env = "THE_END"; + } + + try { + return World.Environment.valueOf(env); + } + catch (IllegalArgumentException e) { + return null; + } + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java new file mode 100644 index 000000000..5d7ba550f --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java @@ -0,0 +1,75 @@ +package com.onarandombox.MultiverseCore.commands_helper; + +import co.aikar.commands.BukkitCommandExecutionContext; +import com.dumptruckman.minecraft.util.Logging; +import org.bukkit.WorldType; + +import java.util.Map; + +public class CreateWorldFlags { + private final String seed; + private final String generator; + private final WorldType worldType; + private final boolean spawnAdjust; + private final boolean generateStructures; + + public CreateWorldFlags(String seed, String generator, WorldType worldType, boolean spawnAdjust, boolean generateStructures) { + this.seed = seed; + this.generator = generator; + this.worldType = worldType; + this.spawnAdjust = spawnAdjust; + this.generateStructures = generateStructures; + } + +// public static CreateWorldFlags Parse(Map flags) { +// return new CreateWorldFlags( +// +// ) +// } + + private WorldType getWorldType(String type) { + if (type == null) { + return WorldType.NORMAL; + } + + if (type.equalsIgnoreCase("normal")) { + type = "NORMAL"; + } + else if (type.equalsIgnoreCase("flat")) { + type = "FLAT"; + } + else if (type.equalsIgnoreCase("largebiomes")) { + type = "LARGE_BIOMES"; + } + else if (type.equalsIgnoreCase("amplified")) { + type = "AMPLIFIED"; + } + + try { + return WorldType.valueOf(type); + } + catch (IllegalArgumentException e) { + return null; + } + } + + public String getSeed() { + return seed; + } + + public String getGenerator() { + return generator; + } + + public WorldType getWorldType() { + return worldType; + } + + public boolean isSpawnAdjust() { + return spawnAdjust; + } + + public boolean isGenerateStructures() { + return generateStructures; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueuedCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/QueuedCommand.java similarity index 93% rename from src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueuedCommand.java rename to src/main/java/com/onarandombox/MultiverseCore/commands_helper/QueuedCommand.java index 5bd30684d..b969b5da5 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/QueuedCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/QueuedCommand.java @@ -1,4 +1,4 @@ -package com.onarandombox.MultiverseCore.commands_acf; +package com.onarandombox.MultiverseCore.commands_helper; import org.bukkit.command.CommandSender; import org.bukkit.scheduler.BukkitTask; diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldAndPage.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldAndPage.java new file mode 100644 index 000000000..4391c5202 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldAndPage.java @@ -0,0 +1,21 @@ +package com.onarandombox.MultiverseCore.commands_helper; + +import com.onarandombox.MultiverseCore.api.MultiverseWorld; + +public class WorldAndPage { + private final MultiverseWorld world; + private final int page; + + public WorldAndPage(MultiverseWorld world, int page) { + this.world = world; + this.page = page; + } + + public MultiverseWorld getWorld() { + return world; + } + + public int getPage() { + return page; + } +} From 6f12290a01a5bdf1205e8f444a672a6eee6020e7 Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Tue, 15 Dec 2020 23:38:35 +0800 Subject: [PATCH 007/178] Cleannnn command classes. --- .../MultiverseCore/MultiverseCore.java | 11 +- .../commands_acf/ConfigCommand.java | 8 +- .../commands_acf/ConfirmCommand.java | 3 +- .../commands_acf/CoordCommand.java | 5 +- .../commands_acf/CreateCommand.java | 28 ++- .../commands_acf/DebugCommand.java | 7 +- .../commands_acf/DeleteCommand.java | 9 +- .../commands_acf/InfoCommand.java | 13 +- .../commands_acf/LoadCommand.java | 7 +- .../commands_acf/ReloadCommand.java | 5 +- .../commands_acf/UnloadCommand.java | 7 +- .../commands_acf/UsageCommand.java | 6 +- .../commands_helper/CommandTools.java | 180 ++++++++++++++++-- .../commands_helper/CreateWorldFlags.java | 75 -------- .../commands_helper/WorldFlags.java | 50 +++++ 15 files changed, 292 insertions(+), 122 deletions(-) delete mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldFlags.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 6b721fb77..dabb39bb8 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -34,6 +34,7 @@ import com.onarandombox.MultiverseCore.api.SafeTTeleporter; import com.onarandombox.MultiverseCore.commands_acf.CoordCommand; import com.onarandombox.MultiverseCore.commands_acf.CreateCommand; +import com.onarandombox.MultiverseCore.commands_acf.UsageCommand; import com.onarandombox.MultiverseCore.commands_helper.CommandTools; import com.onarandombox.MultiverseCore.commands_acf.ConfigCommand; import com.onarandombox.MultiverseCore.commands_acf.ConfirmCommand; @@ -721,16 +722,18 @@ private void registerCommands() { CommandTools tools = new CommandTools(this); tools.registerCommandContexts(); tools.registerCommandCompletions(); + tools.registerCommandConditions(); - this.commandHandler.registerCommand(new UnloadCommand(this)); + this.commandHandler.registerCommand(new UsageCommand(this)); + this.commandHandler.registerCommand(new CreateCommand(this)); this.commandHandler.registerCommand(new LoadCommand(this)); - this.commandHandler.registerCommand(new ConfigCommand(this)); + this.commandHandler.registerCommand(new UnloadCommand(this)); this.commandHandler.registerCommand(new InfoCommand(this)); - this.commandHandler.registerCommand(new DebugCommand(this)); this.commandHandler.registerCommand(new DeleteCommand(this)); this.commandHandler.registerCommand(new ConfirmCommand(this)); + this.commandHandler.registerCommand(new ConfigCommand(this)); + this.commandHandler.registerCommand(new DebugCommand(this)); this.commandHandler.registerCommand(new CoordCommand(this)); - this.commandHandler.registerCommand(new CreateCommand(this)); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java index 1f42a2bd0..aa97bd800 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java @@ -10,6 +10,7 @@ import com.onarandombox.MultiverseCore.MultiverseCore; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -43,9 +44,12 @@ public void onShowCommand(CommandSender sender) { @Subcommand("set") @Syntax(" ") - @CommandCompletion("@mvconfig") + @CommandCompletion("@MVConfigs") @Description("Set Global MV Variables.") - public void onSetCommand(CommandSender sender, String property, @Single String value) { + public void onSetCommand(@NotNull CommandSender sender, + @NotNull String property, + @NotNull @Single String value) { + property = property.toLowerCase(); if (!this.plugin.getMVConfig().setConfigProperty(property, value)) { diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java index 577d561ae..78b49519b 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java @@ -6,6 +6,7 @@ import co.aikar.commands.annotation.Subcommand; import com.onarandombox.MultiverseCore.MultiverseCore; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") public class ConfirmCommand extends MultiverseCommand { @@ -17,7 +18,7 @@ public ConfirmCommand(MultiverseCore plugin) { @Subcommand("confirm") @CommandPermission("multiverse.core.confirm") @Description("") - public void onConfirmCommand(CommandSender sender) { + public void onConfirmCommand(@NotNull CommandSender sender) { this.plugin.getCommandQueueManager().runQueuedCommand(sender); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java index 1c0573dc4..c8c0f886a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java @@ -13,6 +13,7 @@ import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.text.DecimalFormat; @@ -28,7 +29,9 @@ public CoordCommand(MultiverseCore plugin) { @Syntax("[player]") @CommandCompletion("@players") @Description("") - public void onCoordCommand(CommandSender sender, @Flags("deriveFromPlayer") Player targetPlayer) { + public void onCoordCommand(@NotNull CommandSender sender, + @NotNull @Flags("deriveFromPlayer") Player targetPlayer) { + MultiverseWorld world = this.plugin.getMVWorldManager().getMVWorld(targetPlayer.getWorld()); if (world == null) { this.plugin.showNotMVWorldMessage(sender, targetPlayer.getWorld().getName()); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java index 2fe05f1a6..7c3eb06d6 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java @@ -3,13 +3,17 @@ import co.aikar.commands.annotation.CommandAlias; import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Conditions; import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.commands_helper.WorldFlags; +import org.bukkit.ChatColor; import org.bukkit.World; -import org.bukkit.WorldType; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") public class CreateCommand extends MultiverseCommand { @@ -22,9 +26,23 @@ public CreateCommand(MultiverseCore plugin) { @CommandPermission("multiverse.core.info") @Syntax(" -s [seed] -g [generator[:id]] -t [worldtype] [-n] -a [true|false]") @CommandCompletion("") - @Description("") - public void onCreateCommand(CommandSender sender, String worldName, World.Environment environment) { - sender.sendMessage("World name: " + worldName); - sender.sendMessage("World environment: " + environment.toString()); + @Description("Creates a new world and loads it.") + public void onCreateCommand(@NotNull CommandSender sender, + @NotNull @Conditions("isMVWorld:false|worldFolderExist:false") String worldName, + @NotNull World.Environment environment, + @NotNull WorldFlags flags) { + + Command.broadcastCommandMessage(sender, "Starting creation of world '" + worldName + "'..."); + if (!this.plugin.getMVWorldManager().addWorld( + worldName, + environment, + flags.getSeed(), + flags.getWorldType(), + flags.isGenerateStructures(), + flags.getGenerator(), + flags.isSpawnAdjust())) { + Command.broadcastCommandMessage(sender, ChatColor.RED + "Failed to create world! See console for errors."); + } + Command.broadcastCommandMessage(sender, "Complete!"); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java index 2eff05ad2..a1d4a103c 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java @@ -9,6 +9,7 @@ import com.onarandombox.MultiverseCore.MultiverseCore; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") @Subcommand("debug") @@ -20,13 +21,15 @@ public DebugCommand(MultiverseCore plugin) { } @Description("Show the current debug level.") - public void showDebugCommand(CommandSender sender) { + public void showDebugCommand(@NotNull CommandSender sender) { displayDebugMode(sender); } @Syntax("") @Description("Change debug level.") - public void changeDebugCommand(CommandSender sender, String debugLevel) { + public void changeDebugCommand(@NotNull CommandSender sender, + @NotNull String debugLevel) { + int parsedLevel = parseDebugLevel(debugLevel); if (parsedLevel == -1) { sender.sendMessage(ChatColor.RED + "Error" + ChatColor.WHITE diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java index 8c674bf6e..0ca1af553 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java @@ -4,14 +4,13 @@ import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; -import co.aikar.commands.annotation.Flags; -import co.aikar.commands.annotation.Single; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MultiverseWorld; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") public class DeleteCommand extends MultiverseCommand { @@ -23,9 +22,11 @@ public DeleteCommand(MultiverseCore plugin) { @Subcommand("delete") @CommandPermission("multiverse.core.delete") @Syntax("") - @CommandCompletion("@mvworlds") + @CommandCompletion("@MVWorlds") @Description("") - public void onDeleteCommand(CommandSender sender, MultiverseWorld world) { + public void onDeleteCommand(@NotNull CommandSender sender, + @NotNull MultiverseWorld world) { + this.plugin.getCommandQueueManager().addToQueue(sender, deleteRunnable(sender, world)); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java index 775d7ec65..17d9642a8 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java @@ -1,20 +1,15 @@ package com.onarandombox.MultiverseCore.commands_acf; -import co.aikar.commands.InvalidCommandArgument; import co.aikar.commands.annotation.CommandAlias; import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; -import co.aikar.commands.annotation.Default; import co.aikar.commands.annotation.Description; -import co.aikar.commands.annotation.Optional; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MultiverseWorld; import com.onarandombox.MultiverseCore.commands_helper.WorldAndPage; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") public class InfoCommand extends MultiverseCommand { @@ -26,9 +21,11 @@ public InfoCommand(MultiverseCore plugin) { @Subcommand("info") @CommandPermission("multiverse.core.info") @Syntax("[world] [page]") - @CommandCompletion("@mvworlds @range:1-3") + @CommandCompletion("@MVWorlds @range:1-3") @Description("") - public void onInfoCommand(CommandSender sender, WorldAndPage worldAndPage) { + public void onInfoCommand(@NotNull CommandSender sender, + @NotNull WorldAndPage worldAndPage) { + //TODO: The actual paged info sender.sendMessage(worldAndPage.getWorld().toString()); sender.sendMessage("Page of " + worldAndPage.getPage()); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java index acdcabb86..c8f53b387 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/LoadCommand.java @@ -11,6 +11,7 @@ import com.onarandombox.MultiverseCore.MultiverseCore; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") public class LoadCommand extends MultiverseCommand { @@ -22,9 +23,11 @@ public LoadCommand(MultiverseCore plugin) { @Subcommand("load") @CommandPermission("multiverse.core.load") @Syntax("") - @CommandCompletion("@unloadedworlds") + @CommandCompletion("@unloadedWorlds") @Description("Loads a world into Multiverse.") - public void onLoadCommand(CommandSender sender, @Single String world) { + public void onLoadCommand(@NotNull CommandSender sender, + @NotNull @Single String world) { + if (!this.plugin.getMVWorldManager().loadWorld(world)) { sender.sendMessage("Error trying to load world '" + world + "'!"); return; diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java index 057bec53a..d0dbaf23e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java @@ -9,6 +9,7 @@ import com.onarandombox.MultiverseCore.event.MVConfigReloadEvent; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -16,14 +17,14 @@ @CommandAlias("mv") public class ReloadCommand extends MultiverseCommand { - public ReloadCommand(MultiverseCore plugin) { + public ReloadCommand(@NotNull MultiverseCore plugin) { super(plugin); } @Subcommand("reload") @CommandPermission("multiverse.core.reload") @Description("Reloads config files for all multiverse modules.") - public void onReloadCommand(CommandSender sender) { + public void onReloadCommand(@NotNull CommandSender sender) { sender.sendMessage(ChatColor.GOLD + "Reloading all Multiverse Plugin configs..."); this.plugin.loadConfigs(); this.plugin.getAnchorManager().loadAnchors(); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java index 2c90752a1..ae7368e6f 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java @@ -11,6 +11,7 @@ import com.onarandombox.MultiverseCore.api.MultiverseWorld; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") public class UnloadCommand extends MultiverseCommand { @@ -22,9 +23,11 @@ public UnloadCommand(MultiverseCore plugin) { @Subcommand("unload") @CommandPermission("multiverse.core.unload") @Syntax("") - @CommandCompletion("@mvworlds") + @CommandCompletion("@MVWorlds") @Description("Unloads a world from Multiverse. This does NOT remove the world folder. This does NOT remove it from the config file.") - public void onUnloadCommand(CommandSender sender, MultiverseWorld world) { + public void onUnloadCommand(@NotNull CommandSender sender, + @NotNull MultiverseWorld world) { + //TODO: Should be able to use MVWorld object directly if (!this.plugin.getMVWorldManager().unloadWorld(world.getName())) { sender.sendMessage("Error trying to unload world '" + world.getName() + "'!"); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java index 6bcca28b0..c5d7ca6d8 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java @@ -4,6 +4,7 @@ import co.aikar.commands.annotation.*; import com.onarandombox.MultiverseCore.MultiverseCore; import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; @CommandAlias("mv") public class UsageCommand extends MultiverseCommand { @@ -16,7 +17,10 @@ public UsageCommand(MultiverseCore plugin) { @Subcommand("help") @CommandPermission("multiverse.core.help") @Description("Show Multiverse Command usage.") - public void onUsageCommand(CommandSender sender, CommandHelp help) { + public void onUsageCommand(@NotNull CommandSender sender, + @NotNull CommandHelp help) { + + //TODO: Paging help.showHelp(); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java index bc5f130cb..614188185 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java @@ -1,18 +1,28 @@ package com.onarandombox.MultiverseCore.commands_helper; import co.aikar.commands.BukkitCommandExecutionContext; +import co.aikar.commands.BukkitCommandIssuer; +import co.aikar.commands.ConditionContext; +import co.aikar.commands.ConditionFailedException; import co.aikar.commands.InvalidCommandArgument; import co.aikar.commands.PaperCommandManager; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.World; +import org.bukkit.WorldType; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import sun.security.pkcs.PKCS9Attribute; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; @@ -31,7 +41,7 @@ public CommandTools(MultiverseCore plugin) { public void registerCommandCompletions() { this.commandHandler.getCommandCompletions().registerAsyncCompletion( - "mvworlds", + "MVWorlds", context -> worldManager.getMVWorlds() .stream() .map(MultiverseWorld::getName) @@ -39,12 +49,12 @@ public void registerCommandCompletions() { ); this.commandHandler.getCommandCompletions().registerAsyncCompletion( - "unloadedworlds", + "unloadedWorlds", context -> this.worldManager.getUnloadedWorlds() ); this.commandHandler.getCommandCompletions().registerAsyncCompletion( - "mvconfig", + "MVConfigs", context -> this.plugin.getMVConfig().serialize().keySet() ); @@ -84,6 +94,11 @@ public void registerCommandContexts() { this::deriveEnvironment ); + this.commandHandler.getCommandContexts().registerIssuerAwareContext( + WorldFlags.class, + this::deriveWorldFlags + ); + //TODO: Destination } @@ -121,8 +136,7 @@ private Integer parsePageNumber(@Nullable String value, @NotNull String errorRea } try { return Integer.parseInt(value); - } - catch (NumberFormatException e) { + } catch (NumberFormatException e) { throw new InvalidCommandArgument(errorReason); } } @@ -217,8 +231,7 @@ private Player getPlayerByUUID(@NotNull String playerIdentifier) { UUID playerUUID; try { playerUUID = UUID.fromString(playerIdentifier); - } - catch (Exception e) { + } catch (Exception e) { return null; } return Bukkit.getPlayer(playerUUID); @@ -229,19 +242,160 @@ private World.Environment deriveEnvironment(@NotNull BukkitCommandExecutionConte if (env.equalsIgnoreCase("NORMAL") || env.equalsIgnoreCase("WORLD")) { env = "NORMAL"; - } - else if (env.equalsIgnoreCase("HELL") || env.equalsIgnoreCase("NETHER")) { + } else if (env.equalsIgnoreCase("HELL") || env.equalsIgnoreCase("NETHER")) { env = "NETHER"; - } - else if (env.equalsIgnoreCase("END") || env.equalsIgnoreCase("THEEND") || env.equalsIgnoreCase("STARWARS")) { + } else if (env.equalsIgnoreCase("END") || env.equalsIgnoreCase("THEEND") || env.equalsIgnoreCase("STARWARS")) { env = "THE_END"; } try { return World.Environment.valueOf(env); + } catch (IllegalArgumentException e) { + throw new InvalidCommandArgument("'" + env + "' is not a valid environment."); + //TODO: Possibly show valid environments. } - catch (IllegalArgumentException e) { + } + + private WorldFlags deriveWorldFlags(@NotNull BukkitCommandExecutionContext context) { + Map flags = parseFlags(context.getArgs()); + return new WorldFlags( + flags.get("-s"), + validateGenerator(flags.get("-g")), + getWorldType(flags.get("-t")), + !flags.containsKey("-n"), + doGenerateStructures(flags.get("-a")) + ); + } + + private String validateGenerator(String value) { + if (value == null) { return null; } + + List genArray = new ArrayList<>(Arrays.asList(value.split(":"))); + if (genArray.size() < 2) { + // If there was only one arg specified, pad with another empty one. + genArray.add(""); + } + if (this.worldManager.getChunkGenerator(genArray.get(0), genArray.get(1), "test") == null) { + throw new InvalidCommandArgument("Invalid generator '" + value + "'."); + } + + return value; + } + + private WorldType getWorldType(String type) { + if (type == null || type.length() == 0) { + return WorldType.NORMAL; + } + + if (type.equalsIgnoreCase("normal")) { + type = "NORMAL"; + } else if (type.equalsIgnoreCase("flat")) { + type = "FLAT"; + } else if (type.equalsIgnoreCase("largebiomes")) { + type = "LARGE_BIOMES"; + } else if (type.equalsIgnoreCase("amplified")) { + type = "AMPLIFIED"; + } + + try { + return WorldType.valueOf(type); + } catch (IllegalArgumentException e) { + throw new InvalidCommandArgument("'" + type + "' is not a valid World Type."); + } + } + + private boolean doGenerateStructures(String value) { + if (value == null) { + return true; + } + return value.equalsIgnoreCase("true"); + } + + private Map parseFlags(List args) { + Map flags = new HashMap<>(); + if (!validateFlagArgs(args)) { + return flags; + } + + String preFlagKey = args.remove(0); + StringBuilder flagValue = new StringBuilder(); + + for (String arg : args) { + if (!isFlagKey(arg)) { + flagValue.append(arg); + continue; + } + if (preFlagKey != null) { + flags.put(preFlagKey, flagValue.toString()); + flagValue = new StringBuilder(); + } + preFlagKey = arg; + } + + flags.put(preFlagKey, flagValue.toString()); + + return flags; + } + + private boolean validateFlagArgs(List args) { + if (args == null || args.size() == 0) { + return false; + } + if (!isFlagKey(args.get(0))) { + throw new InvalidCommandArgument("No flag defined for value '" + args.get(0) + "'"); + } + return true; + } + + private boolean isFlagKey(String value) { + return value.charAt(0) == '-'; + } + + public void registerCommandConditions() { + this.commandHandler.getCommandConditions().addCondition( + String.class, + "isMVWorld", + this::checkIsMVWorld + ); + + this.commandHandler.getCommandConditions().addCondition( + String.class, + "worldFolderExist", + this::checkIsWorldFolderExist + ); + } + + private void checkIsMVWorld(ConditionContext context, BukkitCommandExecutionContext executionContext, String worldName) { + boolean shouldBeMVWorld = Boolean.parseBoolean(context.getConfig()); + boolean isMVWorld = this.plugin.getMVWorldManager().isMVWorld(worldName); + + if (isMVWorld && !shouldBeMVWorld) { + executionContext.getSender().sendMessage(ChatColor.RED + "Multiverse cannot create " + ChatColor.GOLD + ChatColor.UNDERLINE + + "another" + ChatColor.RESET + ChatColor.RED + " world named " + worldName); + throw new ConditionFailedException(); + } + if (!isMVWorld && shouldBeMVWorld) { + executionContext.getSender().sendMessage(ChatColor.RED + "Multiverse doesn't know about " + ChatColor.DARK_AQUA + worldName + ChatColor.WHITE + " yet."); + executionContext.getSender().sendMessage("Type " + ChatColor.DARK_AQUA + "/mv import ?" + ChatColor.WHITE + " for help!"); + throw new ConditionFailedException(); + } + } + + private void checkIsWorldFolderExist(ConditionContext context, BukkitCommandExecutionContext executionContext, String worldFolder) { + boolean shouldExist = Boolean.parseBoolean(context.getConfig()); + boolean worldFileExist = new File(this.plugin.getServer().getWorldContainer(), worldFolder).exists(); + + if (worldFileExist && !shouldExist) { + executionContext.getSender().sendMessage(ChatColor.RED + "A Folder/World already exists with this name!"); + executionContext.getSender().sendMessage(ChatColor.RED + "If you are confident it is a world you can import with /mv import"); + throw new ConditionFailedException(); + } + if (!worldFileExist && shouldExist) { + executionContext.getSender().sendMessage(ChatColor.RED + "World folder '" + worldFolder + "' does not exist."); + //TODO: Possibly show potential worlds. + throw new ConditionFailedException(); + } } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java deleted file mode 100644 index 5d7ba550f..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CreateWorldFlags.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.onarandombox.MultiverseCore.commands_helper; - -import co.aikar.commands.BukkitCommandExecutionContext; -import com.dumptruckman.minecraft.util.Logging; -import org.bukkit.WorldType; - -import java.util.Map; - -public class CreateWorldFlags { - private final String seed; - private final String generator; - private final WorldType worldType; - private final boolean spawnAdjust; - private final boolean generateStructures; - - public CreateWorldFlags(String seed, String generator, WorldType worldType, boolean spawnAdjust, boolean generateStructures) { - this.seed = seed; - this.generator = generator; - this.worldType = worldType; - this.spawnAdjust = spawnAdjust; - this.generateStructures = generateStructures; - } - -// public static CreateWorldFlags Parse(Map flags) { -// return new CreateWorldFlags( -// -// ) -// } - - private WorldType getWorldType(String type) { - if (type == null) { - return WorldType.NORMAL; - } - - if (type.equalsIgnoreCase("normal")) { - type = "NORMAL"; - } - else if (type.equalsIgnoreCase("flat")) { - type = "FLAT"; - } - else if (type.equalsIgnoreCase("largebiomes")) { - type = "LARGE_BIOMES"; - } - else if (type.equalsIgnoreCase("amplified")) { - type = "AMPLIFIED"; - } - - try { - return WorldType.valueOf(type); - } - catch (IllegalArgumentException e) { - return null; - } - } - - public String getSeed() { - return seed; - } - - public String getGenerator() { - return generator; - } - - public WorldType getWorldType() { - return worldType; - } - - public boolean isSpawnAdjust() { - return spawnAdjust; - } - - public boolean isGenerateStructures() { - return generateStructures; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldFlags.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldFlags.java new file mode 100644 index 000000000..48c4d7435 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/WorldFlags.java @@ -0,0 +1,50 @@ +package com.onarandombox.MultiverseCore.commands_helper; + +import org.bukkit.WorldType; + +public class WorldFlags { + private final String seed; + private final String generator; + private final WorldType worldType; + private final boolean spawnAdjust; + private final boolean generateStructures; + + public WorldFlags(String seed, String generator, WorldType worldType, boolean spawnAdjust, boolean generateStructures) { + this.seed = seed; + this.generator = generator; + this.worldType = worldType; + this.spawnAdjust = spawnAdjust; + this.generateStructures = generateStructures; + } + + public String getSeed() { + return seed; + } + + public String getGenerator() { + return generator; + } + + public WorldType getWorldType() { + return worldType; + } + + public boolean isSpawnAdjust() { + return spawnAdjust; + } + + public boolean isGenerateStructures() { + return generateStructures; + } + + @Override + public String toString() { + return "CreateWorldFlags{" + + "seed='" + seed + '\'' + + ", generator='" + generator + '\'' + + ", worldType=" + worldType + + ", spawnAdjust=" + spawnAdjust + + ", generateStructures=" + generateStructures + + '}'; + } +} From 5483988276fd7e8ad362de96d3dc20f4ee41181f Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Thu, 17 Dec 2020 00:16:20 +0800 Subject: [PATCH 008/178] Implement optional argument properly --- .../MultiverseCore/MultiverseCore.java | 4 + .../commands_acf/ConfigCommand.java | 5 +- .../commands_acf/ConfirmCommand.java | 2 +- .../commands_acf/CoordCommand.java | 37 ++- .../commands_acf/CreateCommand.java | 14 +- .../commands_acf/DebugCommand.java | 9 +- .../commands_acf/DeleteCommand.java | 16 +- .../commands_acf/InfoCommand.java | 10 +- .../commands_acf/MultiverseCommand.java | 1 + .../commands_acf/ReloadCommand.java | 1 - .../commands_acf/SpawnCommand.java | 63 ++++ .../commands_acf/UnloadCommand.java | 3 +- .../commands_acf/UsageCommand.java | 4 +- .../commands_helper/CommandPlayer.java | 22 ++ .../commands_helper/CommandQueueManager.java | 16 +- .../commands_helper/CommandTools.java | 294 +++++++++++------- 16 files changed, 356 insertions(+), 145 deletions(-) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/SpawnCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandPlayer.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index dabb39bb8..bb5c29af4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -34,6 +34,8 @@ import com.onarandombox.MultiverseCore.api.SafeTTeleporter; import com.onarandombox.MultiverseCore.commands_acf.CoordCommand; import com.onarandombox.MultiverseCore.commands_acf.CreateCommand; +import com.onarandombox.MultiverseCore.commands_acf.ReloadCommand; +import com.onarandombox.MultiverseCore.commands_acf.SpawnCommand; import com.onarandombox.MultiverseCore.commands_acf.UsageCommand; import com.onarandombox.MultiverseCore.commands_helper.CommandTools; import com.onarandombox.MultiverseCore.commands_acf.ConfigCommand; @@ -734,6 +736,8 @@ private void registerCommands() { this.commandHandler.registerCommand(new ConfigCommand(this)); this.commandHandler.registerCommand(new DebugCommand(this)); this.commandHandler.registerCommand(new CoordCommand(this)); + this.commandHandler.registerCommand(new SpawnCommand(this)); + this.commandHandler.registerCommand(new ReloadCommand(this)); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java index aa97bd800..a44c7fbe1 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfigCommand.java @@ -23,9 +23,9 @@ public ConfigCommand(MultiverseCore plugin) { super(plugin); } - @Subcommand("list") + @Subcommand("show") @Description("Show multiverse config values.") - public void onShowCommand(CommandSender sender) { + public void onShowCommand(@NotNull CommandSender sender) { StringBuilder builder = new StringBuilder(); Map serializedConfig = this.plugin.getMVConfig().serialize(); @@ -59,6 +59,7 @@ public void onSetCommand(@NotNull CommandSender sender, if (!this.plugin.saveMVConfigs()) { sender.sendMessage(ChatColor.RED + "FAIL!" + ChatColor.WHITE + " Check your console for details!"); + return; } // special rule, don't forget to set the world! diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java index 78b49519b..65b244fbd 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ConfirmCommand.java @@ -17,7 +17,7 @@ public ConfirmCommand(MultiverseCore plugin) { @Subcommand("confirm") @CommandPermission("multiverse.core.confirm") - @Description("") + @Description("Confirms dangerous commands before executing them.") public void onConfirmCommand(@NotNull CommandSender sender) { this.plugin.getCommandQueueManager().runQueuedCommand(sender); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java index c8c0f886a..36d299cb9 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CoordCommand.java @@ -3,14 +3,17 @@ import co.aikar.commands.annotation.CommandAlias; import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Conditions; import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Flags; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; +import co.aikar.commands.bukkit.contexts.OnlinePlayer; +import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.commands_helper.CommandPlayer; import org.bukkit.ChatColor; -import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -25,16 +28,30 @@ public CoordCommand(MultiverseCore plugin) { } @Subcommand("coord") - @CommandPermission("multiverse.core.coord") + @CommandPermission("multiverse.core.coord.self") + @Description("Detailed information on the your where abouts.") + public void onOtherCoordCommand(@NotNull Player player) { + showCoordInfo(player, player); + } + + @Subcommand("coord") + @CommandPermission("multiverse.core.coord.other") @Syntax("[player]") @CommandCompletion("@players") - @Description("") - public void onCoordCommand(@NotNull CommandSender sender, - @NotNull @Flags("deriveFromPlayer") Player targetPlayer) { + @Description("Detailed information on the another player's where abouts.") + public void showCoordInfo(@NotNull CommandSender sender, + @NotNull CommandPlayer targetPlayer) { + + showCoordInfo(sender, targetPlayer.getPlayer()); + } + + private void showCoordInfo(@NotNull CommandSender sender, + @NotNull Player player) { - MultiverseWorld world = this.plugin.getMVWorldManager().getMVWorld(targetPlayer.getWorld()); + //TODO: Should somehow clean this up + MultiverseWorld world = this.plugin.getMVWorldManager().getMVWorld(player.getWorld()); if (world == null) { - this.plugin.showNotMVWorldMessage(sender, targetPlayer.getWorld().getName()); + this.plugin.showNotMVWorldMessage(sender, player.getWorld().getName()); return; } @@ -46,8 +63,8 @@ public void onCoordCommand(@NotNull CommandSender sender, sender.sendMessage(ChatColor.AQUA + "World: " + ChatColor.WHITE + world.getName()); sender.sendMessage(ChatColor.AQUA + "Alias: " + world.getColoredWorldString()); sender.sendMessage(ChatColor.AQUA + "World Scale: " + ChatColor.WHITE + world.getScaling()); - sender.sendMessage(ChatColor.AQUA + "Coordinates: " + ChatColor.WHITE + plugin.getLocationManipulation().strCoords(targetPlayer.getLocation())); - sender.sendMessage(ChatColor.AQUA + "Direction: " + ChatColor.WHITE + plugin.getLocationManipulation().getDirection(targetPlayer.getLocation())); - sender.sendMessage(ChatColor.AQUA + "Block: " + ChatColor.WHITE + world.getCBWorld().getBlockAt(targetPlayer.getLocation()).getType()); + sender.sendMessage(ChatColor.AQUA + "Coordinates: " + ChatColor.WHITE + this.plugin.getLocationManipulation().strCoords(player.getLocation())); + sender.sendMessage(ChatColor.AQUA + "Direction: " + ChatColor.WHITE + this.plugin.getLocationManipulation().getDirection(player.getLocation())); + sender.sendMessage(ChatColor.AQUA + "Block: " + ChatColor.WHITE + world.getCBWorld().getBlockAt(player.getLocation()).getType()); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java index 7c3eb06d6..93e1b8234 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/CreateCommand.java @@ -33,16 +33,20 @@ public void onCreateCommand(@NotNull CommandSender sender, @NotNull WorldFlags flags) { Command.broadcastCommandMessage(sender, "Starting creation of world '" + worldName + "'..."); - if (!this.plugin.getMVWorldManager().addWorld( + + // TODO: Should Allow WorldFlags object to be passed directly + String resultMessage = (!this.plugin.getMVWorldManager().addWorld( worldName, environment, flags.getSeed(), flags.getWorldType(), flags.isGenerateStructures(), flags.getGenerator(), - flags.isSpawnAdjust())) { - Command.broadcastCommandMessage(sender, ChatColor.RED + "Failed to create world! See console for errors."); - } - Command.broadcastCommandMessage(sender, "Complete!"); + flags.isSpawnAdjust()) + ) + ? ChatColor.RED + "Failed to create world! See console for errors." + : ChatColor.GREEN + "Complete!"; + + Command.broadcastCommandMessage(sender, resultMessage); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java index a1d4a103c..e34ce5454 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DebugCommand.java @@ -1,6 +1,7 @@ package com.onarandombox.MultiverseCore.commands_acf; import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Subcommand; @@ -12,7 +13,6 @@ import org.jetbrains.annotations.NotNull; @CommandAlias("mv") -@Subcommand("debug") @CommandPermission("multiverse.core.debug") public class DebugCommand extends MultiverseCommand { @@ -20,11 +20,14 @@ public DebugCommand(MultiverseCore plugin) { super(plugin); } + @Subcommand("debug") @Description("Show the current debug level.") public void showDebugCommand(@NotNull CommandSender sender) { displayDebugMode(sender); } + @Subcommand("debug") + @CommandCompletion("on|off|@range:3") @Syntax("") @Description("Change debug level.") public void changeDebugCommand(@NotNull CommandSender sender, @@ -45,7 +48,7 @@ public void changeDebugCommand(@NotNull CommandSender sender, displayDebugMode(sender); } - private int parseDebugLevel(String debugLevel) { + private int parseDebugLevel(@NotNull String debugLevel) { if (debugLevel.equalsIgnoreCase("off")) { return 0; } @@ -62,7 +65,7 @@ private int parseDebugLevel(String debugLevel) { } } - private void displayDebugMode(CommandSender sender) { + private void displayDebugMode(@NotNull CommandSender sender) { final int debugLevel = this.plugin.getMVConfig().getGlobalDebug(); if (debugLevel == 0) { sender.sendMessage("Multiverse Debug mode is " + ChatColor.RED + "OFF"); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java index 0ca1af553..9bdf9da84 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/DeleteCommand.java @@ -4,6 +4,7 @@ import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; @@ -25,18 +26,21 @@ public DeleteCommand(MultiverseCore plugin) { @CommandCompletion("@MVWorlds") @Description("") public void onDeleteCommand(@NotNull CommandSender sender, - @NotNull MultiverseWorld world) { + @NotNull @Flags("other") MultiverseWorld world) { this.plugin.getCommandQueueManager().addToQueue(sender, deleteRunnable(sender, world)); } - private Runnable deleteRunnable(CommandSender sender, MultiverseWorld world) { + private Runnable deleteRunnable(@NotNull CommandSender sender, + @NotNull MultiverseWorld world) { + return () -> { //TODO: deleteWorld method should take world object directly - if (!this.plugin.getMVWorldManager().deleteWorld(world.getName())) { - sender.sendMessage(ChatColor.RED + "World '" + world.getName() + "' could NOT be deleted!"); - } - sender.sendMessage(ChatColor.GREEN + "World '" + world.getName() + "' Deleted!"); + String resultMessage = (this.plugin.getMVWorldManager().deleteWorld(world.getName())) + ? ChatColor.GREEN + "World '" + world.getName() + "' Deleted!" + : ChatColor.RED + "World '" + world.getName() + "' could NOT be deleted!"; + + sender.sendMessage(resultMessage); }; } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java index 17d9642a8..fb5099f8f 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/InfoCommand.java @@ -3,10 +3,13 @@ import co.aikar.commands.annotation.CommandAlias; import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Default; import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; import com.onarandombox.MultiverseCore.commands_helper.WorldAndPage; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -24,10 +27,11 @@ public InfoCommand(MultiverseCore plugin) { @CommandCompletion("@MVWorlds @range:1-3") @Description("") public void onInfoCommand(@NotNull CommandSender sender, - @NotNull WorldAndPage worldAndPage) { + @NotNull @Flags("other,defaultself,fallbackself") MultiverseWorld world, + @Default("1") int page) { //TODO: The actual paged info - sender.sendMessage(worldAndPage.getWorld().toString()); - sender.sendMessage("Page of " + worldAndPage.getPage()); + sender.sendMessage(world.toString()); + sender.sendMessage("Page of " + page); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java index 3eb9f2834..f8d35a1b5 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/MultiverseCommand.java @@ -6,6 +6,7 @@ public class MultiverseCommand extends BaseCommand { protected final MultiverseCore plugin; + //TODO: Should we put world manager here? protected MultiverseCommand(MultiverseCore plugin) { this.plugin = plugin; diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java index d0dbaf23e..72307bf27 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ReloadCommand.java @@ -5,7 +5,6 @@ import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Subcommand; import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.commands_helper.WorldAndPage; import com.onarandombox.MultiverseCore.event.MVConfigReloadEvent; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/SpawnCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/SpawnCommand.java new file mode 100644 index 000000000..4481222dc --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/SpawnCommand.java @@ -0,0 +1,63 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import co.aikar.commands.bukkit.contexts.OnlinePlayer; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.commands_helper.CommandPlayer; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +@CommandAlias("mv") +public class SpawnCommand extends MultiverseCommand { + + public SpawnCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("spawn") + @CommandPermission("multiverse.core.spawn.self") + @Description("Teleports you to the Spawn Point of the world you are in.") + public void onSelfSpawnCommand(@NotNull Player player) { + player.sendMessage("Teleporting to this world's spawn..."); + spawnAccurately(player); + } + + @Subcommand("spawn") + @CommandPermission("multiverse.core.spawn.other") + @CommandCompletion("@players") + @Syntax("[player]") + @Description("Teleport another player to the spawn of the world they are in.") + public void onOtherSpawnCommand(@NotNull CommandSender sender, + @NotNull CommandPlayer targetPlayer) { + + Player player = targetPlayer.getPlayer(); + spawnAccurately(player); + + String senderName = (sender instanceof ConsoleCommandSender) + ? ChatColor.LIGHT_PURPLE + "the console" + : ChatColor.YELLOW + sender.getName(); + + player.sendMessage("You were teleported by " + senderName); + } + + private void spawnAccurately(@NotNull Player player) { + //TODO: API should be able to take in player object directly + MultiverseWorld mvWorld = this.plugin.getMVWorldManager().getMVWorld(player.getWorld()); + Location spawnLocation = (mvWorld != null) + ? mvWorld.getSpawnLocation() + : player.getWorld().getSpawnLocation(); + + this.plugin.getSafeTTeleporter().safelyTeleport(player, player, spawnLocation, false); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java index ae7368e6f..61c2e3d58 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UnloadCommand.java @@ -4,6 +4,7 @@ import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; import co.aikar.commands.annotation.Single; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; @@ -26,7 +27,7 @@ public UnloadCommand(MultiverseCore plugin) { @CommandCompletion("@MVWorlds") @Description("Unloads a world from Multiverse. This does NOT remove the world folder. This does NOT remove it from the config file.") public void onUnloadCommand(@NotNull CommandSender sender, - @NotNull MultiverseWorld world) { + @NotNull @Flags("other") MultiverseWorld world) { //TODO: Should be able to use MVWorld object directly if (!this.plugin.getMVWorldManager().unloadWorld(world.getName())) { diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java index c5d7ca6d8..04524807e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/UsageCommand.java @@ -13,14 +13,16 @@ public UsageCommand(MultiverseCore plugin) { super(plugin); } - @HelpCommand @Subcommand("help") + @HelpCommand @CommandPermission("multiverse.core.help") + // @Syntax("[page]") @Description("Show Multiverse Command usage.") public void onUsageCommand(@NotNull CommandSender sender, @NotNull CommandHelp help) { //TODO: Paging + help.setPerPage(10); help.showHelp(); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandPlayer.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandPlayer.java new file mode 100644 index 000000000..d1777e95a --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandPlayer.java @@ -0,0 +1,22 @@ +package com.onarandombox.MultiverseCore.commands_helper; + +import org.bukkit.entity.Player; + +public class CommandPlayer { + private final Player player; + + public CommandPlayer(Player player) { + this.player = player; + } + + public Player getPlayer() { + return player; + } + + @Override + public String toString() { + return "CommandPlayer{" + + "player=" + player + + '}'; + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandQueueManager.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandQueueManager.java index 204d6da56..b4c79a411 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandQueueManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandQueueManager.java @@ -2,7 +2,6 @@ import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.commands_helper.QueuedCommand; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.scheduler.BukkitTask; @@ -16,18 +15,23 @@ public class CommandQueueManager { private final MultiverseCore plugin; private final Map queuedCommands; - private static final int DEFAULT_EXPIRE_TIME = 200; // In ticks for now + private static final int DEFAULT_VALID_TIME = 200; // In ticks for now public CommandQueueManager(MultiverseCore plugin) { this.plugin = plugin; - this.queuedCommands = new HashMap(); + this.queuedCommands = new HashMap<>(); } - public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable) { - addToQueue(sender, runnable, DEFAULT_EXPIRE_TIME); + public void addToQueue(@NotNull CommandSender sender, + @NotNull Runnable runnable) { + + addToQueue(sender, runnable, DEFAULT_VALID_TIME); } - public void addToQueue(@NotNull CommandSender sender, @NotNull Runnable runnable, int validPeriod) { + public void addToQueue(@NotNull CommandSender sender, + @NotNull Runnable runnable, + int validPeriod) { + cancelPreviousInQueue(sender); QueuedCommand queuedCommand = new QueuedCommand(sender, runnable, validPeriod); diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java index 614188185..567f40a72 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_helper/CommandTools.java @@ -1,11 +1,13 @@ package com.onarandombox.MultiverseCore.commands_helper; +import co.aikar.commands.BukkitCommandCompletionContext; import co.aikar.commands.BukkitCommandExecutionContext; import co.aikar.commands.BukkitCommandIssuer; import co.aikar.commands.ConditionContext; import co.aikar.commands.ConditionFailedException; import co.aikar.commands.InvalidCommandArgument; import co.aikar.commands.PaperCommandManager; +import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; @@ -13,6 +15,7 @@ import org.bukkit.ChatColor; import org.bukkit.World; import org.bukkit.WorldType; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,6 +26,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -42,20 +46,17 @@ public CommandTools(MultiverseCore plugin) { public void registerCommandCompletions() { this.commandHandler.getCommandCompletions().registerAsyncCompletion( "MVWorlds", - context -> worldManager.getMVWorlds() - .stream() - .map(MultiverseWorld::getName) - .collect(Collectors.toList()) + this::SuggestMVWorlds ); this.commandHandler.getCommandCompletions().registerAsyncCompletion( "unloadedWorlds", - context -> this.worldManager.getUnloadedWorlds() + this::SuggestUnloadedWorlds ); this.commandHandler.getCommandCompletions().registerAsyncCompletion( "MVConfigs", - context -> this.plugin.getMVConfig().serialize().keySet() + this::SuggestMVConfig ); //TODO: set properties @@ -73,17 +74,34 @@ public void registerCommandCompletions() { //TODO: world types } - public void registerCommandContexts() { - this.commandHandler.getCommandContexts().registerIssuerAwareContext( - WorldAndPage.class, - this::deriveWorldAndPage - ); + @NotNull + private List SuggestMVWorlds(@NotNull BukkitCommandCompletionContext context) { + return worldManager.getMVWorlds().stream() + .map(MultiverseWorld::getName) + .collect(Collectors.toList()); + } + @NotNull + private List SuggestUnloadedWorlds(@NotNull BukkitCommandCompletionContext context) { + return this.worldManager.getUnloadedWorlds(); + } + + @NotNull + private Set SuggestMVConfig(@NotNull BukkitCommandCompletionContext context) { + return this.plugin.getMVConfig().serialize().keySet(); + } + + public void registerCommandContexts() { this.commandHandler.getCommandContexts().registerIssuerAwareContext( MultiverseWorld.class, this::deriveMultiverseWorld ); + this.commandHandler.getCommandContexts().registerContext( + CommandPlayer.class, + this::deriveCommandPlayer + ); + this.commandHandler.getCommandContexts().registerIssuerAwareContext( Player.class, this::derivePlayer @@ -102,128 +120,176 @@ public void registerCommandContexts() { //TODO: Destination } - private WorldAndPage deriveWorldAndPage(@NotNull BukkitCommandExecutionContext context) { - String eitherWorldOrPage = context.popFirstArg(); + @NotNull + private MultiverseWorld deriveMultiverseWorld(@NotNull BukkitCommandExecutionContext context) { Player player = context.getPlayer(); - if (eitherWorldOrPage == null) { - return new WorldAndPage( - getPlayerWorld(context.getPlayer()), - 1); + if (!context.hasFlag("other")) { + return getPlayerWorld(player, "You cannot run this command from console."); } - // Maybe its a world - MultiverseWorld targetWorld = getMultiverseWorld(eitherWorldOrPage, true); - if (targetWorld == null) { - if (player == null) { - throw new InvalidCommandArgument("World '" + eitherWorldOrPage + "' not found."); - } - // Safely assume its a page - return new WorldAndPage( - getPlayerWorld(context.getPlayer()), - parsePageNumber(eitherWorldOrPage, "World '" + eitherWorldOrPage + "' not found.")); - } - - String optionalPageValue = context.popFirstArg(); - return new WorldAndPage( - targetWorld, - parsePageNumber(optionalPageValue, "'" + optionalPageValue + "' is not a valid page number.")); - } - - private Integer parsePageNumber(@Nullable String value, @NotNull String errorReason) { - if (value == null) { - return 1; - } - try { - return Integer.parseInt(value); - } catch (NumberFormatException e) { - throw new InvalidCommandArgument(errorReason); - } - } - - private MultiverseWorld deriveMultiverseWorld(@NotNull BukkitCommandExecutionContext context) { - String worldName = context.popFirstArg(); - boolean worldFromPLayer = context.hasFlag("deriveFromPlayer"); - boolean checkUnloaded = context.hasFlag("checkUnloaded"); - + String worldName = context.getFirstArg(); if (worldName == null) { - if (worldFromPLayer) { - return getPlayerWorld(context.getPlayer()); + if (context.hasFlag("defaultself")) { + return getPlayerWorld(player, "You need to specific a world name from console."); } - throw new InvalidCommandArgument("Please specify a world name."); + throw new InvalidCommandArgument("You need to specific a world name."); } - MultiverseWorld world = getMultiverseWorld(worldName, checkUnloaded); + MultiverseWorld world = getWorld(context.getSender(), worldName, !context.hasFlag("ignoreunload")); if (world == null) { - throw new InvalidCommandArgument("World '" + worldName + "' not found."); + if (context.hasFlag("fallbackself")) { + return getPlayerWorld(player, "World '" + worldName + "' not found."); + } + throw new InvalidCommandArgument("World '" + worldName + "' not found.", false); } + context.popFirstArg(); return world; } - private MultiverseWorld getMultiverseWorld(@Nullable String worldName, boolean checkUnloaded) { - if (worldName == null) { - return null; - } + @Nullable + private MultiverseWorld getWorld(@NotNull CommandSender sender, + @NotNull String worldName, + boolean checkUnloaded) { MultiverseWorld targetWorld = this.worldManager.getMVWorld(worldName); if (targetWorld != null) { return targetWorld; } + //TODO: API should have a isUnloadedWorld method. if (checkUnloaded && this.worldManager.getUnloadedWorlds().contains(worldName)) { - throw new InvalidCommandArgument("World " + worldName + " exists, but you need to load it first with: /mv load"); + sender.sendMessage("World '" + worldName + "' exists, but it is unloaded!"); + sender.sendMessage("You can load it with: " + ChatColor.AQUA + "/mv load " + worldName); + throw new InvalidCommandArgument(); } return null; } - private MultiverseWorld getPlayerWorld(@Nullable Player player) { + @NotNull + private MultiverseWorld getPlayerWorld(@Nullable Player player, String errorReason) { if (player == null) { - throw new InvalidCommandArgument("You need to specific a world from console."); + throw new InvalidCommandArgument(errorReason, false); } MultiverseWorld targetWorld = this.worldManager.getMVWorld(player.getWorld()); if (targetWorld == null) { - //TODO: Overload that doesnt need world name. - this.plugin.showNotMVWorldMessage(player, player.getWorld().getName()); - throw new InvalidCommandArgument("Invalid world!"); + player.sendMessage("Multiverse doesn't know about " + ChatColor.DARK_AQUA + player.getWorld().getName() + ChatColor.WHITE + " yet."); + player.sendMessage("Type " + ChatColor.DARK_AQUA + "/mv import ?" + ChatColor.WHITE + " for help!"); + throw new InvalidCommandArgument(); } return targetWorld; } - private Player derivePlayer(@NotNull BukkitCommandExecutionContext context) { + @NotNull CommandPlayer deriveCommandPlayer(@NotNull BukkitCommandExecutionContext context) { String playerIdentifier = context.popFirstArg(); - boolean playerFromSelf = context.hasFlag("deriveFromPlayer"); + if (playerIdentifier == null) { + throw new InvalidCommandArgument((context.getPlayer() == null) + ? "You need to specify a player from console." + : "You need to specify a player."); + } + + Player player = getPlayerFromValue(context.getSender(), playerIdentifier); + if (player == null) { + throw new InvalidCommandArgument("Player '" + playerIdentifier + "' not found."); + } - Player targetPlayer = getPlayerFromValue(playerIdentifier); - if (targetPlayer != null) { - return targetPlayer; + return new CommandPlayer(player); + } + + @NotNull + private Player derivePlayer(@NotNull BukkitCommandExecutionContext context) { + boolean mustBeSelf = context.hasFlag("onlyself"); + String error = (mustBeSelf) + ? "You cannot run this command from console." + : "You need to specify a player from console."; + + if (mustBeSelf || !context.hasFlag("other")) { + return getPlayerFromSelf(context, error); + } + + String playerIdentifier = context.getFirstArg(); + if (playerIdentifier == null) { + if (context.hasFlag("defaultself")) { + return getPlayerFromSelf(context, error); + } + throw new InvalidCommandArgument("You need to specify a player."); } - if (!playerFromSelf) { + Player player = getPlayerFromValue(context.getSender(), playerIdentifier); + if (player == null) { + if (context.hasFlag("fallbackself")) { + return getPlayerFromSelf(context, "Player '" + playerIdentifier + "' not found."); + } throw new InvalidCommandArgument("Player '" + playerIdentifier + "' not found."); } + context.popFirstArg(); + return player; + } + + @NotNull + private Player getPlayerFromSelf(@NotNull BukkitCommandExecutionContext context, String errorReason) { Player self = context.getPlayer(); if (self == null) { - throw new InvalidCommandArgument("You need to specific a player from console."); + throw new InvalidCommandArgument(errorReason, false); } return self; } - private Player getPlayerFromValue(@Nullable String value) { - if (value == null) { + @Nullable + private Player getPlayerFromValue(@NotNull CommandSender sender, + @Nullable String playerIdentifier) { + + if (playerIdentifier == null) { return null; } - Player targetPlayer = Bukkit.getPlayerExact(value); - if (targetPlayer == null) { - return getPlayerByUUID(value); + + Player player = getPlayerBySelector(sender, playerIdentifier); + if (player == null) { + player = Bukkit.getPlayerExact(playerIdentifier); } - return targetPlayer; + if (player == null) { + player = getPlayerByUUID(playerIdentifier); + } + + return player; } + @Nullable + private Player getPlayerBySelector(@NotNull CommandSender sender, + @NotNull String playerIdentifier) { + + if (playerIdentifier.charAt(0) != '@') { + return null; + } + + List matchedPlayers; + try { + matchedPlayers = this.plugin.getServer().selectEntities(sender, playerIdentifier).stream() + .filter(e -> e instanceof Player) + .map(e -> ((Player) e)) + .collect(Collectors.toList()); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + throw new InvalidCommandArgument("Error parsing selector '" + playerIdentifier + "' for " + sender.getName()); + } + if (matchedPlayers.isEmpty()) { + throw new InvalidCommandArgument("No player found with selector '" + playerIdentifier + "' for " + sender.getName()); + } + if (matchedPlayers.size() > 1) { + throw new InvalidCommandArgument("Error parsing selector '" + playerIdentifier + "' for " + sender.getName() + + ": ambiguous result (more than one player matched) - " + matchedPlayers.toString()); + } + + return matchedPlayers.get(0); + } + + @Nullable private Player getPlayerByUUID(@NotNull String playerIdentifier) { if (!playerIdentifier.matches(UUID_REGEX)) { return null; @@ -237,6 +303,7 @@ private Player getPlayerByUUID(@NotNull String playerIdentifier) { return Bukkit.getPlayer(playerUUID); } + @NotNull private World.Environment deriveEnvironment(@NotNull BukkitCommandExecutionContext context) { String env = context.popFirstArg(); @@ -256,6 +323,7 @@ private World.Environment deriveEnvironment(@NotNull BukkitCommandExecutionConte } } + @NotNull private WorldFlags deriveWorldFlags(@NotNull BukkitCommandExecutionContext context) { Map flags = parseFlags(context.getArgs()); return new WorldFlags( @@ -267,7 +335,8 @@ private WorldFlags deriveWorldFlags(@NotNull BukkitCommandExecutionContext conte ); } - private String validateGenerator(String value) { + @Nullable + private String validateGenerator(@Nullable String value) { if (value == null) { return null; } @@ -284,18 +353,22 @@ private String validateGenerator(String value) { return value; } - private WorldType getWorldType(String type) { + @NotNull + private WorldType getWorldType(@Nullable String type) { if (type == null || type.length() == 0) { return WorldType.NORMAL; } if (type.equalsIgnoreCase("normal")) { type = "NORMAL"; - } else if (type.equalsIgnoreCase("flat")) { + } + else if (type.equalsIgnoreCase("flat")) { type = "FLAT"; - } else if (type.equalsIgnoreCase("largebiomes")) { + } + else if (type.equalsIgnoreCase("largebiomes")) { type = "LARGE_BIOMES"; - } else if (type.equalsIgnoreCase("amplified")) { + } + else if (type.equalsIgnoreCase("amplified")) { type = "AMPLIFIED"; } @@ -306,19 +379,34 @@ private WorldType getWorldType(String type) { } } - private boolean doGenerateStructures(String value) { - if (value == null) { - return true; - } - return value.equalsIgnoreCase("true"); + private boolean doGenerateStructures(@Nullable String value) { + return value == null || value.equalsIgnoreCase("true"); } - private Map parseFlags(List args) { + @NotNull + private Map parseFlags(@NotNull List args) { Map flags = new HashMap<>(); if (!validateFlagArgs(args)) { return flags; } + mapOutTheArgs(args, flags); + return flags; + } + + private boolean validateFlagArgs(@Nullable List args) { + if (args == null || args.size() == 0) { + return false; + } + if (!isFlagKey(args.get(0))) { + throw new InvalidCommandArgument("No flag defined for value '" + args.get(0) + "'"); + } + return true; + } + + private void mapOutTheArgs(@NotNull List args, + @NotNull Map flags) { + String preFlagKey = args.remove(0); StringBuilder flagValue = new StringBuilder(); @@ -335,21 +423,9 @@ private Map parseFlags(List args) { } flags.put(preFlagKey, flagValue.toString()); - - return flags; - } - - private boolean validateFlagArgs(List args) { - if (args == null || args.size() == 0) { - return false; - } - if (!isFlagKey(args.get(0))) { - throw new InvalidCommandArgument("No flag defined for value '" + args.get(0) + "'"); - } - return true; } - private boolean isFlagKey(String value) { + private boolean isFlagKey(@NotNull String value) { return value.charAt(0) == '-'; } @@ -363,11 +439,14 @@ public void registerCommandConditions() { this.commandHandler.getCommandConditions().addCondition( String.class, "worldFolderExist", - this::checkIsWorldFolderExist + this::checkWorldFolderExist ); } - private void checkIsMVWorld(ConditionContext context, BukkitCommandExecutionContext executionContext, String worldName) { + private void checkIsMVWorld(@NotNull ConditionContext context, + @NotNull BukkitCommandExecutionContext executionContext, + @NotNull String worldName) { + boolean shouldBeMVWorld = Boolean.parseBoolean(context.getConfig()); boolean isMVWorld = this.plugin.getMVWorldManager().isMVWorld(worldName); @@ -383,7 +462,10 @@ private void checkIsMVWorld(ConditionContext context, Bukki } } - private void checkIsWorldFolderExist(ConditionContext context, BukkitCommandExecutionContext executionContext, String worldFolder) { + private void checkWorldFolderExist(@NotNull ConditionContext context, + @NotNull BukkitCommandExecutionContext executionContext, + @NotNull String worldFolder) { + boolean shouldExist = Boolean.parseBoolean(context.getConfig()); boolean worldFileExist = new File(this.plugin.getServer().getWorldContainer(), worldFolder).exists(); From d494017186455915ccdab7978f9b01df83b16c9f Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Thu, 17 Dec 2020 00:21:18 +0800 Subject: [PATCH 009/178] Add remove command. --- .../MultiverseCore/MultiverseCore.java | 2 ++ .../commands_acf/RemoveCommand.java | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/RemoveCommand.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index bb5c29af4..6784666e2 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -35,6 +35,7 @@ import com.onarandombox.MultiverseCore.commands_acf.CoordCommand; import com.onarandombox.MultiverseCore.commands_acf.CreateCommand; import com.onarandombox.MultiverseCore.commands_acf.ReloadCommand; +import com.onarandombox.MultiverseCore.commands_acf.RemoveCommand; import com.onarandombox.MultiverseCore.commands_acf.SpawnCommand; import com.onarandombox.MultiverseCore.commands_acf.UsageCommand; import com.onarandombox.MultiverseCore.commands_helper.CommandTools; @@ -738,6 +739,7 @@ private void registerCommands() { this.commandHandler.registerCommand(new CoordCommand(this)); this.commandHandler.registerCommand(new SpawnCommand(this)); this.commandHandler.registerCommand(new ReloadCommand(this)); + this.commandHandler.registerCommand(new RemoveCommand(this)); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/RemoveCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/RemoveCommand.java new file mode 100644 index 000000000..ac30eab2a --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/RemoveCommand.java @@ -0,0 +1,36 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +@CommandAlias("mv") +public class RemoveCommand extends MultiverseCommand { + + public RemoveCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("remove") + @CommandPermission("multiverse.core.spawn.other") + @CommandCompletion("@MVWorlds|@unloadedWorlds") + @Syntax("") + @Description("Unloads a world from Multiverse and removes it from worlds.yml, this does NOT DELETE the world folder.") + public void onRemoveCommand(@NotNull CommandSender sender, + @NotNull @Flags("other") MultiverseWorld world) { + + String resultMessage = (this.plugin.getMVWorldManager().removeWorldFromConfig(world.getName())) + ? "World removed from config!" + : "Error trying to remove world from config!"; + + sender.sendMessage(resultMessage); + } +} From c8d1aa467d8fbfc4760d609a606dddfab3bca101 Mon Sep 17 00:00:00 2001 From: benwoo1110 <30431861+benwoo1110@users.noreply.github.com> Date: Thu, 17 Dec 2020 13:46:23 +0800 Subject: [PATCH 010/178] Add gamerules, list and script. --- .../MultiverseCore/MultiverseCore.java | 4 ++ .../commands_acf/GamerulesCommand.java | 51 +++++++++++++++++++ .../commands_acf/ListCommand.java | 31 +++++++++++ .../commands_acf/ScriptCommand.java | 50 ++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/GamerulesCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/ListCommand.java create mode 100644 src/main/java/com/onarandombox/MultiverseCore/commands_acf/ScriptCommand.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 6784666e2..27296ec09 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -34,8 +34,10 @@ import com.onarandombox.MultiverseCore.api.SafeTTeleporter; import com.onarandombox.MultiverseCore.commands_acf.CoordCommand; import com.onarandombox.MultiverseCore.commands_acf.CreateCommand; +import com.onarandombox.MultiverseCore.commands_acf.ListCommand; import com.onarandombox.MultiverseCore.commands_acf.ReloadCommand; import com.onarandombox.MultiverseCore.commands_acf.RemoveCommand; +import com.onarandombox.MultiverseCore.commands_acf.ScriptCommand; import com.onarandombox.MultiverseCore.commands_acf.SpawnCommand; import com.onarandombox.MultiverseCore.commands_acf.UsageCommand; import com.onarandombox.MultiverseCore.commands_helper.CommandTools; @@ -740,6 +742,8 @@ private void registerCommands() { this.commandHandler.registerCommand(new SpawnCommand(this)); this.commandHandler.registerCommand(new ReloadCommand(this)); this.commandHandler.registerCommand(new RemoveCommand(this)); + this.commandHandler.registerCommand(new ListCommand(this)); + this.commandHandler.registerCommand(new ScriptCommand(this)); } /** diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/GamerulesCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/GamerulesCommand.java new file mode 100644 index 000000000..5de46ec81 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/GamerulesCommand.java @@ -0,0 +1,51 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.ChatColor; +import org.bukkit.GameRule; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +@CommandAlias("mv") +public class GamerulesCommand extends MultiverseCommand { + + public GamerulesCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("info") + @CommandPermission("multiverse.core.gamerule.list") + @Syntax("[world]") + @CommandCompletion("@MVWorlds") + @Description("See the list gamerules values for a given world.") + public void onGamerulesCommand(@NotNull CommandSender sender, + @NotNull @Flags("other|defaultself") MultiverseWorld world) { + + World CBWorld = world.getCBWorld(); + StringBuilder gameRules = new StringBuilder(); + + for (String gameRule : CBWorld.getGameRules()) { + if (gameRules.length() != 0) { + gameRules.append(ChatColor.WHITE).append(", "); + } + gameRules.append(ChatColor.AQUA) + .append(gameRule) + .append(ChatColor.WHITE) + .append(": ") + .append(ChatColor.GREEN) + .append(CBWorld.getGameRuleValue(GameRule.getByName(gameRule))); + } + + sender.sendMessage("=== Gamerules for " + ChatColor.AQUA + world.getName() + ChatColor.WHITE + " ==="); + sender.sendMessage(gameRules.toString()); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ListCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ListCommand.java new file mode 100644 index 000000000..ad8e157ee --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ListCommand.java @@ -0,0 +1,31 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Default; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +@CommandAlias("mv") +public class ListCommand extends MultiverseCommand { + + public ListCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("list") + @CommandPermission("multiverse.core.list.worlds") + @Syntax("[page]") + @Description("Displays a listing of all worlds that you can enter.") + public void onListCommand(@NotNull CommandSender sender, + @Default("1") int page) { + + sender.sendMessage(this.plugin.getMVWorldManager().getMVWorlds().toString()); + sender.sendMessage("Page of: " + page); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ScriptCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ScriptCommand.java new file mode 100644 index 000000000..f1c261bb8 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands_acf/ScriptCommand.java @@ -0,0 +1,50 @@ +package com.onarandombox.MultiverseCore.commands_acf; + +import buscript.Buscript; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Flags; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; +import com.onarandombox.MultiverseCore.MultiverseCore; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.File; + +@CommandAlias("mv") +public class ScriptCommand extends MultiverseCommand { + + public ScriptCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("script") + @CommandPermission("multiverse.core.script") + @CommandCompletion(" @players") + @Syntax("