diff --git a/pom.xml b/pom.xml index d8d98f855..2665c9a07 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 @@ -13,7 +13,7 @@ - + spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -38,6 +38,10 @@ CodeMC https://repo.codemc.org/repository/maven-public + + aikar + https://repo.aikar.co/content/groups/aikar/ + @@ -228,10 +232,6 @@ me.main__.util com.onarandombox.serializationconfig - - com.pneumaticraft.commandhandler - com.onarandombox.commandhandler - buscript com.onarandombox.buscript @@ -256,6 +256,14 @@ de.themoep.idconverter com.onarandombox.idconverter + + co.aikar.commands + com.onarandombox.acf + + + co.aikar.locales + com.onarandombox.locales + @@ -313,9 +321,9 @@ - com.pneumaticraft.commandhandler - CommandHandler - 11 + co.aikar + acf-paper + 0.5.0-SNAPSHOT com.dumptruckman.minecraft @@ -392,12 +400,12 @@ - OnARandomBox - http://repo.onarandombox.com/content/repositories/multiverse + benergy10 + http://repo.benergy10.dev/repository/minecraft/ - OnARandomBox - http://repo.onarandombox.com/content/repositories/multiverse-snapshots/ + benergy10 + http://repo.benergy10.dev/repository/minecraft-snapshots/ diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index d7367ad20..4db929421 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -28,7 +28,6 @@ import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.WorldType; -import org.bukkit.command.CommandSender; import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.entity.Player; import org.bukkit.permissions.Permission; @@ -37,11 +36,11 @@ import org.jetbrains.annotations.Nullable; import org.json.simple.JSONObject; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.logging.Level; /** * The implementation of a Multiverse handled world. @@ -1133,6 +1132,14 @@ public boolean getBedRespawn() { return this.props.getBedRespawn(); } + /** + * {@inheritDoc} + */ + @Override + public Collection getAllPropertyTypes() { + return this.props.serialize().keySet(); + } + /** * {@inheritDoc} */ diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index df00fbe69..0b3c7ba4e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -7,21 +7,6 @@ package com.onarandombox.MultiverseCore; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -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; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - import buscript.Buscript; import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.MVWorld.NullLocation; @@ -33,41 +18,8 @@ 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.commandtools.MVCommandManager; +import com.onarandombox.MultiverseCore.commandtools.flag.CoreFlags; import com.onarandombox.MultiverseCore.destination.AnchorDestination; import com.onarandombox.MultiverseCore.destination.BedDestination; import com.onarandombox.MultiverseCore.destination.CannonDestination; @@ -94,22 +46,20 @@ import com.onarandombox.MultiverseCore.utils.MVPermissions; import com.onarandombox.MultiverseCore.utils.MVPlayerSession; import com.onarandombox.MultiverseCore.utils.MaterialConverter; -import com.onarandombox.MultiverseCore.utils.TestingMode; -import com.onarandombox.MultiverseCore.utils.metrics.MetricsConfigurator; import com.onarandombox.MultiverseCore.utils.SimpleBlockSafety; import com.onarandombox.MultiverseCore.utils.SimpleLocationManipulation; import com.onarandombox.MultiverseCore.utils.SimpleSafeTTeleporter; +import com.onarandombox.MultiverseCore.utils.TestingMode; import com.onarandombox.MultiverseCore.utils.UnsafeCallWrapper; import com.onarandombox.MultiverseCore.utils.VaultHandler; import com.onarandombox.MultiverseCore.utils.WorldManager; -import com.pneumaticraft.commandhandler.CommandHandler; +import com.onarandombox.MultiverseCore.utils.metrics.MetricsConfigurator; 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; @@ -122,6 +72,19 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; + /** * The implementation of the Multiverse-{@link Core}. */ @@ -203,7 +166,7 @@ public int getProtocolVersion() { } // Setup our Map for our Commands using the CommandHandler. - private CommandHandler commandHandler; + private MVCommandManager commandManager; private static final String LOG_TAG = "[Multiverse-Core]"; @@ -255,8 +218,9 @@ public void onLoad() { // Setup our SafeTTeleporter this.safeTTeleporter = new SimpleSafeTTeleporter(this); this.unsafeCallWrapper = new UnsafeCallWrapper(this); - // Setup our CompatibilityLayer + // Setup our static classes CompatibilityLayer.init(); + CoreFlags.setCoreInstance(this); } @@ -286,12 +250,7 @@ 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. - this.registerCommands(); - - // Initialize the Destination factor AFTER the commands + // Initialize the Destination factory this.initializeDestinationFactory(); this.playerSessions = new HashMap(); @@ -337,6 +296,9 @@ public void onEnable() { this.initializeBuscript(); this.setupMetrics(); + // Setup commands + this.commandManager = new MVCommandManager(this); + // Output a little snippet to show it's enabled. Logging.config("Version %s (API v%s) Enabled - By %s", this.getDescription().getVersion(), PROTOCOL, getAuthors()); @@ -744,51 +706,6 @@ public MultiverseMessaging getMessaging() { return this.messaging; } - /** - * 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)); - } - /** * {@inheritDoc} */ @@ -819,30 +736,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} * @@ -911,10 +804,11 @@ public String getAuthors() { /** * {@inheritDoc} + * @return */ @Override - public CommandHandler getCommandHandler() { - return this.commandHandler; + public MVCommandManager getMVCommandManager() { + return commandManager; } /** @@ -981,18 +875,6 @@ public DestinationFactory getDestFactory() { return this.destFactory; } - /** - * This is a convenience method to allow the QueuedCommand system to call it. You should NEVER call this directly. - * - * @param teleporter The Person requesting that the teleport should happen. - * @param p Player The Person being teleported. - * @param l The potentially unsafe location. - */ - public void teleportPlayer(CommandSender teleporter, Player p, Location l) { - // This command is the override, and MUST NOT TELEPORT SAFELY - this.getSafeTTeleporter().safelyTeleport(teleporter, p, l, false); - } - /** * Gets the server's root-folder as {@link File}. * @@ -1091,40 +973,6 @@ public boolean saveMVConfigs() { return this.saveMVConfig() && this.saveWorldConfig(); } - /** - * NOT deprecated for the time as queued commands use this. - * However, this is not in the API and other plugins should therefore not use it. - * - * @param name World to delete - * @return True if success, false if fail. - */ - public Boolean deleteWorld(String name) { - return this.worldManager.deleteWorld(name); - } - - /** - * NOT deprecated for the time as queued commands use this. - * However, this is not in the API and other plugins should therefore not use it. - * - * @param oldName World to copy - * @param newName World to create - * @param generator The Custom generator plugin to use. - * @return True if success, false if fail. - */ - public Boolean cloneWorld(String oldName, String newName, String generator) { - return this.worldManager.cloneWorld(oldName, newName, generator); - } - - /** - * {@inheritDoc} - * @deprecated This is deprecated! - */ - @Override - @Deprecated - public Boolean regenWorld(String name, Boolean useNewSeed, Boolean randomSeed, String seed) { - return this.worldManager.regenWorld(name, useNewSeed, randomSeed, seed); - } - /** * {@inheritDoc} */ diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/Core.java b/src/main/java/com/onarandombox/MultiverseCore/api/Core.java index ff8513d4c..0e4d43a4c 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 com.onarandombox.MultiverseCore.commandtools.MVCommandManager; import com.onarandombox.MultiverseCore.destination.DestinationFactory; import com.onarandombox.MultiverseCore.utils.AnchorManager; import com.onarandombox.MultiverseCore.utils.MVEconomist; @@ -17,7 +18,6 @@ import com.onarandombox.MultiverseCore.utils.SimpleLocationManipulation; import com.onarandombox.MultiverseCore.utils.SimpleSafeTTeleporter; import com.onarandombox.MultiverseCore.utils.VaultHandler; -import com.pneumaticraft.commandhandler.CommandHandler; import org.bukkit.entity.Player; /** @@ -79,12 +79,12 @@ public interface Core { MVPermissions getMVPerms(); /** - * Multiverse uses {@link CommandHandler} to make adding and using commands + * Multiverse uses {@link MVCommandManager} to make adding and using commands * a piece of cake. * - * @return A non-null {@link CommandHandler}. + * @return A non-null {@link MVCommandManager}. */ - CommandHandler getCommandHandler(); + MVCommandManager getMVCommandManager(); /** * Gets the factory class responsible for loading many different destinations @@ -115,21 +115,6 @@ public interface Core { */ AnchorManager getAnchorManager(); - /** - * Used by queued commands to regenerate a world on a delay. - * - * @param name Name of the world to regenerate - * @param useNewSeed If a new seed should be used - * @param randomSeed IF the new seed should be random - * @param seed The seed of the world. - * - * @return True if success, false if fail. - * - * @deprecated Use {@link MVWorldManager#regenWorld(String, boolean, boolean, String)} instead. - */ - @Deprecated - Boolean regenWorld(String name, Boolean useNewSeed, Boolean randomSeed, String seed); - /** * Decrements the number of plugins that have specifically hooked into core. */ diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/FancyText.java b/src/main/java/com/onarandombox/MultiverseCore/api/FancyText.java deleted file mode 100644 index abc740db0..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/api/FancyText.java +++ /dev/null @@ -1,20 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.api; - -/** - * A fancy text. - */ -public interface FancyText { - /** - * Gets the {@link String}-representation of this {@link FancyText}. - * - * @return The {@link String}-representation of this {@link FancyText}. - */ - String getFancyText(); -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/LocationManipulation.java b/src/main/java/com/onarandombox/MultiverseCore/api/LocationManipulation.java index e246c8da1..eca3ec932 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/LocationManipulation.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/LocationManipulation.java @@ -40,6 +40,14 @@ public interface LocationManipulation { */ Location stringToLocation(String locationString); + /** + * Returns a colored string with x, y, z axis. + * + * @param l The {@link Location} + * @return The {@link String} + */ + String strAxis(Location l); + /** * Returns a colored string with the coords. * diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java index 3eb96e2d5..0d13a825d 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MVWorldManager.java @@ -7,6 +7,7 @@ package com.onarandombox.MultiverseCore.api; +import com.onarandombox.MultiverseCore.enums.WorldValidationResult; import com.onarandombox.MultiverseCore.utils.PurgeWorlds; import com.onarandombox.MultiverseCore.utils.SimpleWorldPurger; import org.bukkit.World; @@ -314,4 +315,20 @@ boolean addWorld(String name, Environment env, String seedString, WorldType type * does not exist. {@code includeLoaded} if the world exists and is loaded. */ boolean hasUnloadedWorld(String name, boolean includeLoaded); + + /** + * Check if a world name is a possible importable world folder. + * + * @param worldName Name of the world you want to check. + * @return True if world is valid, false otherwise. + */ + boolean isValidWorld(String worldName); + + /** + * Check if a world name is a possible importable world folder. + * + * @param worldName Name of the world you want to check. + * @return WorldValidationResult.VALID if world is valid, else the reason why its not valid. + */ + WorldValidationResult validateWorld(String worldName); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java b/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java index a6a064b8a..c518687cd 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MultiversePlugin.java @@ -1,20 +1,14 @@ package com.onarandombox.MultiverseCore.api; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.utils.DebugLog; +import org.bukkit.plugin.java.JavaPlugin; + import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.logging.Level; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.java.JavaPlugin; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.utils.DebugLog; -import com.pneumaticraft.commandhandler.CommandHandler; - /** * Make things easier for MV-Plugins! */ @@ -96,25 +90,6 @@ protected String getAuthors() { */ protected abstract void onPluginEnable(); - /** - * You can register commands here. - * @param handler The CommandHandler. - */ - 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/api/MultiverseWorld.java b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java index 07ba347f3..fa82e5c08 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java @@ -16,10 +16,10 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.WorldType; -import org.bukkit.command.CommandSender; import org.bukkit.permissions.Permission; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.List; /** @@ -651,6 +651,13 @@ public interface MultiverseWorld { */ List getWorldBlacklist(); + /** + * Gets all the names of all properties that can be SET. + * + * @return All property names in list. + */ + Collection getAllPropertyTypes(); + /** * Gets all the names of all properties that can be SET. * diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/PermissionsInterface.java b/src/main/java/com/onarandombox/MultiverseCore/api/PermissionsInterface.java new file mode 100644 index 000000000..758ea87bd --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/api/PermissionsInterface.java @@ -0,0 +1,13 @@ +package com.onarandombox.MultiverseCore.api; + +import org.bukkit.command.CommandSender; + +import java.util.List; + +public interface PermissionsInterface { + public boolean hasPermission(CommandSender sender, String node, boolean isOpRequired); + + public boolean hasAnyPermission(CommandSender sender, List allPermissionStrings, boolean opRequired); + + public boolean hasAllPermission(CommandSender sender, List allPermissionStrings, boolean opRequired); +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/AnchorCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/AnchorCommand.java index 55d0b2cff..998e2e0da 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/AnchorCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/AnchorCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,156 +7,127 @@ package com.onarandombox.MultiverseCore.commands; +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.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 com.onarandombox.MultiverseCore.commandtools.context.PageFilter; +import com.onarandombox.MultiverseCore.displaytools.ColorAlternator; +import com.onarandombox.MultiverseCore.displaytools.ContentDisplay; +import com.onarandombox.MultiverseCore.displaytools.DisplayHandlers; +import com.onarandombox.MultiverseCore.displaytools.DisplaySettings; +import com.onarandombox.MultiverseCore.utils.AnchorManager; import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.Set; -/** - * Allows management of Anchor Destinations. - */ -public class AnchorCommand extends PaginatedCoreCommand { +@CommandAlias("mv") +@Subcommand("anchors") +public class AnchorCommand extends MultiverseCoreCommand { + + private final AnchorManager anchorManager; public AnchorCommand(MultiverseCore plugin) { super(plugin); - this.setName("Create, Delete and Manage Anchor Destinations."); - this.setCommandUsage("/mv anchor " + ChatColor.GREEN + "{name}" + ChatColor.GOLD + " [-d]"); - this.setArgRange(0, 2); - this.addKey("mv anchor"); - this.addKey("mv anchors"); - this.addKey("mvanchor"); - this.addKey("mvanchors"); - this.addCommandExample("/mv anchor " + ChatColor.GREEN + "awesomething"); - this.addCommandExample("/mv anchor " + ChatColor.GREEN + "otherthing"); - this.addCommandExample("/mv anchor " + ChatColor.GREEN + "awesomething " + ChatColor.RED + "-d"); - this.addCommandExample("/mv anchors "); - this.setPermission("multiverse.core.anchor.list", "Allows a player to list all anchors.", PermissionDefault.OP); - this.addAdditonalPermission(new Permission("multiverse.core.anchor.create", - "Allows a player to create anchors.", PermissionDefault.OP)); - this.addAdditonalPermission(new Permission("multiverse.core.anchor.delete", - "Allows a player to delete anchors.", PermissionDefault.OP)); - this.setItemsPerPage(8); // SUPPRESS CHECKSTYLE: MagicNumberCheck + this.anchorManager = plugin.getAnchorManager(); } - private List getFancyAnchorList(Player p) { - List anchorList = new ArrayList(); - ChatColor color = ChatColor.GREEN; - for (String anchor : this.plugin.getAnchorManager().getAnchors(p)) { - anchorList.add(color + anchor); - color = (color == ChatColor.GREEN) ? ChatColor.GOLD : ChatColor.GREEN; - } - return anchorList; - } + @Subcommand("create") + @CommandPermission("multiverse.core.anchor.create") + @Syntax("") + @Description("Create a new anchor point.") + public void onCreateAnchorCommand(@NotNull Player player, - private void showList(CommandSender sender, List args) { - if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.list", true)) { - sender.sendMessage(ChatColor.RED + "You don't have the permission to list anchors!"); - return; - } + @NotNull + @Syntax("") + @Description("Name of your new anchor.") + @Flags("type=anchor name") + @Single String anchorName) { - sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ Multiverse Anchor List ]===="); - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } + player.sendMessage((this.plugin.getAnchorManager().saveAnchorLocation(anchorName, player.getLocation())) + ? String.format("Anchor '%s%s%s' was successfully %s created!", + ChatColor.AQUA, anchorName, ChatColor.WHITE, ChatColor.GREEN) - FilterObject filterObject = this.getPageAndFilter(args); + : String.format("%sThere was an error creating anchor '%s'! Check console for errors.", + ChatColor.RED, anchorName)); - List availableAnchors = new ArrayList(this.getFancyAnchorList(p)); - if (filterObject.getFilter().length() > 0) { - availableAnchors = this.getFilteredItems(availableAnchors, filterObject.getFilter()); - if (availableAnchors.size() == 0) { - sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE - + "No anchors matched your filter: " + ChatColor.AQUA + filterObject.getFilter()); - return; - } - } else { - if (availableAnchors.size() == 0) { - sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE + "No anchors were defined."); - return; - } - } + } + @Subcommand("delete") + @CommandPermission("multiverse.core.anchor.delete") + @Syntax("") + @CommandCompletion("@anchors") + @Description("Delete an existing anchor point.") + public void onDeleteAnchorCommand(@NotNull CommandSender sender, - if (!(sender instanceof Player)) { - for (String c : availableAnchors) { - sender.sendMessage(c); - } - return; - } + @NotNull + @Syntax("") + @Description("Name of anchor you want to delete.") + @Flags("type=anchor name") + @Single String anchorName) { - int totalPages = (int) Math.ceil(availableAnchors.size() / (this.itemsPerPage + 0.0)); + sender.sendMessage((this.plugin.getAnchorManager().deleteAnchor(anchorName)) - if (filterObject.getPage() > totalPages) { - filterObject.setPage(totalPages); - } else if (filterObject.getPage() < 1) { - filterObject.setPage(1); - } + ? String.format("Anchor '%s%s%s' was successfully %s deleted!", + ChatColor.AQUA, anchorName, ChatColor.WHITE, ChatColor.RED) - sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages); - - this.showPage(filterObject.getPage(), sender, availableAnchors); + : String.format("%sThere was an error deleting anchor '%s'! Check console for errors.", + ChatColor.RED, anchorName)); } - @Override - public void runCommand(CommandSender sender, List args) { - if (args.size() == 0) { - this.showList(sender, args); - return; - } - if (args.size() == 1 && (this.getPageAndFilter(args).getPage() != 1 || args.get(0).equals("1"))) { - this.showList(sender, args); - return; - } - if (args.size() == 2 && args.get(1).equalsIgnoreCase("-d")) { - if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.delete", true)) { - sender.sendMessage(ChatColor.RED + "You don't have the permission to delete anchors!"); - } else { - if (this.plugin.getAnchorManager().deleteAnchor(args.get(0))) { - sender.sendMessage("Anchor '" + args.get(0) + "' was successfully " + ChatColor.RED + "deleted!"); - } else { - sender.sendMessage("Anchor '" + args.get(0) + "' was " + ChatColor.RED + " NOT " + ChatColor.WHITE + "deleted!"); - } - } - return; - } - - if (!(sender instanceof Player)) { - sender.sendMessage("You must be a player to create Anchors."); - return; - } - - if (!this.plugin.getMVPerms().hasPermission(sender, "multiverse.core.anchor.create", true)) { - sender.sendMessage(ChatColor.RED + "You don't have the permission to create anchors!"); - } else { - Player player = (Player) sender; - if (this.plugin.getAnchorManager().saveAnchorLocation(args.get(0), player.getLocation())) { - sender.sendMessage("Anchor '" + args.get(0) + "' was successfully " + ChatColor.GREEN + "created!"); - } else { - sender.sendMessage("Anchor '" + args.get(0) + "' was " + ChatColor.RED + " NOT " + ChatColor.WHITE + "created!"); - } - } + @Subcommand("list") + @CommandPermission("multiverse.core.anchor.list") + @Syntax("[filter] [page]") + @Description("View a list of current anchors.") + public void onListAnchorCommand(@NotNull CommandSender sender, + @NotNull PageFilter pageFilter) { + + new ContentDisplay.Builder>() + .sender(sender) + .header("%s====[ Multiverse Anchor List ]====", ChatColor.LIGHT_PURPLE) + .contents(buildAnchorList(sender)) + .emptyMessage("You do not any anchors set. See /mv anchors create to get started!") + .displayHandler(DisplayHandlers.PAGE_LIST) + .colorTool(ColorAlternator.with(ChatColor.YELLOW, ChatColor.DARK_AQUA)) + .setting(DisplaySettings.SHOW_PAGE, pageFilter.getPage()) + .display(); } - @Override - protected List getFilteredItems(List availableItems, String filter) { - List filtered = new ArrayList(); - for (String s : availableItems) { - if (s.matches("(?i).*" + filter + ".*")) { - filtered.add(s); + private List buildAnchorList(@NotNull CommandSender sender) { + Set anchors = (sender instanceof Player) + ? this.anchorManager.getAnchors((Player) sender) + : this.anchorManager.getAllAnchors(); + + List anchorContent = new ArrayList<>(); + for (String anchor : anchors) { + Location anchorLocation = this.anchorManager.getAnchorLocation(anchor); + World world = anchorLocation.getWorld(); // this.plugin.getMVWorldManager().getMVWorld(); + + String locationString = ChatColor.RED + "!!INVALID!!"; + if (world != null) { + MultiverseWorld mvWorld = this.plugin.getMVWorldManager().getMVWorld(world); + locationString = (mvWorld == null) + ? String.format("%s%s !!NOT MULTIVERSE WORLD!!", ChatColor.RED, world.getName()) + : String.format("%s - %s", mvWorld.getColoredWorldString(), this.plugin.getLocationManipulation().strAxis(anchorLocation)); } + anchorContent.add(String.format("%s: %s", anchor, locationString)); } - return filtered; - } - @Override - protected String getItemText(String item) { - return item; + return anchorContent; } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/BedCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/BedCommand.java new file mode 100644 index 000000000..492aade72 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/BedCommand.java @@ -0,0 +1,64 @@ +/****************************************************************************** + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * + * Multiverse 2 is licensed under the BSD License. * + * For more information please check the README.md file included * + * with this project. * + ******************************************************************************/ + +package com.onarandombox.MultiverseCore.commands; + +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 com.onarandombox.MultiverseCore.commandtools.context.RequiredPlayer; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +@CommandAlias("mv") +public class BedCommand extends MultiverseCoreCommand { + + public BedCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("bed") + @CommandPermission("multiverse.core.bed.self") + @Description("Takes your current respawn point.") + public void onBedCommand(@NotNull Player player) { + doBedRespawn(player, player); + } + + @Subcommand("bed") + @CommandPermission("multiverse.core.bed.other") + @Syntax("[player]") + @CommandCompletion("@players") + @Description("Takes another player to their respawn location.") + public void onOtherBedCommand(@NotNull CommandSender sender, + + @Syntax("[player]") + @Description("Target player to teleport to respawn location.") + @NotNull RequiredPlayer player) { + + doBedRespawn(sender, player.get()); + } + + private void doBedRespawn(@NotNull CommandSender sender, + @NotNull Player player) { + + Location bedLocation = player.getBedSpawnLocation(); + if (bedLocation == null) { + sender.sendMessage(String.format("%sYou do not have a respawn point set!", ChatColor.RED)); + return; + } + sender.sendMessage((player.teleport(bedLocation)) + ? "You have been teleported to your respawn point!" + : String.format("%sThere was an error teleporting you to your respawn point.", ChatColor.RED)); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/CheckCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/CheckCommand.java index 34fa77914..de9f65926 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/CheckCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/CheckCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,51 +7,42 @@ package com.onarandombox.MultiverseCore.commands; +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 com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.destination.InvalidDestination; -import com.onarandombox.MultiverseCore.utils.MVPermissions; -import org.bukkit.ChatColor; +import com.onarandombox.MultiverseCore.commandtools.context.RequiredPlayer; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.List; -/** - * Checks to see if a player can go to a destination. - */ -public class CheckCommand extends MultiverseCommand { +@CommandAlias("mv") +public class CheckCommand extends MultiverseCoreCommand { public CheckCommand(MultiverseCore plugin) { super(plugin); - this.setName("Help you validate your multiverse settings"); - this.setCommandUsage("/mv check " + ChatColor.GREEN + "{PLAYER} {DESTINATION}"); - this.setArgRange(2, 2); - this.addKey("mv check"); - this.addKey("mvcheck"); - this.addCommandExample("/mv check " + ChatColor.GREEN + "fernferret " + ChatColor.LIGHT_PURPLE + "w:MyWorld"); - this.addCommandExample("/mv check " + ChatColor.GREEN + "Rigby90 " + ChatColor.LIGHT_PURPLE + "p:MyPortal"); - this.addCommandExample("/mv check " + ChatColor.GREEN + "lithium3141 " + ChatColor.LIGHT_PURPLE + "ow:WarpName"); - this.setPermission("multiverse.core.debug", "Checks to see if a player can go to a destination. Prints debug if false.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - Player p = this.plugin.getServer().getPlayerExact(args.get(0)); - if (p == null) { - sender.sendMessage("Could not find player " + ChatColor.GREEN + args.get(0)); - sender.sendMessage("Are they online?"); - return; - } - MVDestination dest = this.plugin.getDestFactory().getDestination(args.get(1)); - if (dest instanceof InvalidDestination) { - sender.sendMessage(String.format("You asked if '%s' could go to %s%s%s,", - args.get(0), ChatColor.GREEN, args.get(0), ChatColor.WHITE)); - sender.sendMessage("but I couldn't find a Destination of that name? Did you type it correctly?"); - return; - } - - MVPermissions perms = this.plugin.getMVPerms(); - perms.tellMeWhyICantDoThis(sender, p, dest); + @Subcommand("check") + @CommandPermission("multiverse.core.debug") + @Syntax(" ") + @CommandCompletion("@players @destinations|@MVWorlds") + @Description("Checks to see if a player can go to a destination. Prints debug if false.") + public void onCheckCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Player to check destination on.") + RequiredPlayer player, + + @NotNull + @Syntax("") + @Description("A destination location, e.g. a world name.") + MVDestination destination) { + + this.plugin.getMVPerms().tellMeWhyICantDoThis(sender, player.get(), destination); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/CloneCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/CloneCommand.java index 95a0bf146..01cd5c52f 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/CloneCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/CloneCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,49 +7,46 @@ package com.onarandombox.MultiverseCore.commands; -import java.util.List; - +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.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 org.bukkit.permissions.PermissionDefault; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; +import org.jetbrains.annotations.NotNull; -/** - * Creates a clone of a world. - */ -public class CloneCommand extends MultiverseCommand { - private MVWorldManager worldManager; +@CommandAlias("mv") +public class CloneCommand extends MultiverseCoreCommand { public CloneCommand(MultiverseCore plugin) { super(plugin); - this.setName("Clone World"); - this.setCommandUsage("/mv clone" + ChatColor.GREEN + " {TARGET} {NAME}" + ChatColor.GOLD + " -g [GENERATOR[:ID]]"); - this.setArgRange(2, 4); // SUPPRESS CHECKSTYLE: MagicNumberCheck - this.addKey("mvclone"); - this.addKey("mvcl"); - this.addKey("mv cl"); - this.addKey("mv clone"); - this.addCommandExample("/mv clone " + ChatColor.GOLD + "world" + ChatColor.GREEN + " world_backup"); - this.addCommandExample("/mv clone " + ChatColor.GOLD + "skyblock_pristine" + ChatColor.GREEN + " skyblock"); - this.setPermission("multiverse.core.clone", "Clones a world.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); } - @Override - public void runCommand(CommandSender sender, List args) { - String oldName = args.get(0); - if (!this.worldManager.hasUnloadedWorld(oldName, true)) { - // If no world was found, we can't clone. - sender.sendMessage("Sorry, Multiverse doesn't know about world " + oldName + ", so we can't clone it!"); - sender.sendMessage("Check the " + ChatColor.GREEN + "/mv list" + ChatColor.WHITE + " command to verify it is listed."); - return; - } - if (this.plugin.getMVWorldManager().cloneWorld(oldName, args.get(1))) { - sender.sendMessage(ChatColor.GREEN + "World cloned!"); - } else { - sender.sendMessage(ChatColor.RED + "World could NOT be cloned!"); - } + @Subcommand("clone") + @CommandPermission("multiverse.core.clone") + @Syntax(" ") + @CommandCompletion("@MVWorlds|@unloadedWorlds @empty") + @Description("Clones a world.") + public void onCloneCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Current multiverse world.") + @Conditions("isWorldInConfig") String worldName, + + @NotNull + @Syntax("") + @Description("New cloned world name.") + @Single @Flags("trim") @Conditions("creatableWorldName") String newWorldName) { + + sender.sendMessage((this.plugin.getMVWorldManager().cloneWorld(worldName, newWorldName)) + ? String.format("%sWorld cloned!", ChatColor.GREEN) + : String.format("%sWorld could not be cloned! See console for more details.", ChatColor.RED)); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java index 55424a941..75ef86931 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfigCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,66 +7,88 @@ package com.onarandombox.MultiverseCore.commands; +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 co.aikar.commands.annotation.Values; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.displaytools.ColorAlternator; +import com.onarandombox.MultiverseCore.displaytools.ContentDisplay; +import com.onarandombox.MultiverseCore.displaytools.ContentFilter; +import com.onarandombox.MultiverseCore.displaytools.DisplayHandlers; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.List; import java.util.Map; -/** - * Allows you to set Global MV Variables. - */ -public class ConfigCommand extends MultiverseCommand { +@CommandAlias("mv") +@Subcommand("config") +@CommandPermission("multiverse.core.config") +public class ConfigCommand extends MultiverseCoreCommand { + public ConfigCommand(MultiverseCore plugin) { super(plugin); - this.setName("Configuration"); - this.setCommandUsage("/mv config " + ChatColor.GREEN + "{PROPERTY} {VALUE}"); - this.setArgRange(1, 2); - this.addKey("mv config"); - this.addKey("mvconfig"); - this.addKey("mv conf"); - this.addKey("mvconf"); - this.addCommandExample("/mv config show"); - this.addCommandExample("/mv config " + ChatColor.GREEN + "debug" + ChatColor.AQUA + " 3"); - this.addCommandExample("/mv config " + ChatColor.GREEN + "enforceaccess" + ChatColor.AQUA + " false"); - this.setPermission("multiverse.core.config", "Allows you to set Global MV Variables.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - if (args.size() <= 1) { - StringBuilder builder = new StringBuilder(); - Map serializedConfig = this.plugin.getMVConfig().serialize(); - for (Map.Entry entry : serializedConfig.entrySet()) { - builder.append(ChatColor.GREEN); - builder.append(entry.getKey()); - builder.append(ChatColor.WHITE).append(" = ").append(ChatColor.GOLD); - builder.append(entry.getValue().toString()); - builder.append(ChatColor.WHITE).append(", "); - } - String message = builder.toString(); - message = message.substring(0, message.length() - 2); - sender.sendMessage(message); + @Subcommand("list") + @Syntax("[filter]") + @Description("Show multiverse config values.") + public void onShowCommand(@NotNull CommandSender sender, + @NotNull ContentFilter filter) { + + new ContentDisplay.Builder>() + .sender(sender) + .header("%s===[ Multiverse Config ]===", ChatColor.LIGHT_PURPLE) + .contents(this.plugin.getMVConfig().serialize()) + .emptyMessage("No config values found.") + .displayHandler(DisplayHandlers.INLINE_MAP) + .colorTool(ColorAlternator.with(ChatColor.GREEN, ChatColor.GOLD)) + .filter(filter) + .display(); + } + + @Subcommand("set") + @Syntax(" ") + @CommandCompletion("@MVConfigs") + @Description("Set Global MV Variables.") + public void onSetCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Config option.") + @Values("@MVConfigs") String property, + + @NotNull + @Syntax("") + @Description("New value for the given config option.") + @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; } - if (!this.plugin.getMVConfig().setConfigProperty(args.get(0).toLowerCase(), args.get(1))) { - sender.sendMessage(String.format("%sSetting '%s' to '%s' failed!", ChatColor.RED, args.get(0).toLowerCase(), args.get(1))); + + if (!this.plugin.saveMVConfigs()) { + sender.sendMessage(String.format("%sFailed to save config! Check your console for details.", ChatColor.RED)); return; } - // special rule - if (args.get(0).equalsIgnoreCase("firstspawnworld")) { - // Don't forget to set the world! - this.plugin.getMVWorldManager().setFirstSpawnWorld(args.get(1)); + // special rule, don't forget to set the world! + //TODO API: Potentially should move to MultiverseCore#loadConfigs method + if (property.equalsIgnoreCase("firstspawnworld")) { + 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!"); - } + sender.sendMessage(String.format("%sSuccess! %sConfig option %s%s %sis now set to %s%s%s.", + ChatColor.GREEN, ChatColor.WHITE, ChatColor.AQUA, property, ChatColor.WHITE, ChatColor.GREEN, value, ChatColor.WHITE)); + + this.plugin.loadConfigs(); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java index 2a68f353d..bb1e804f7 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ConfirmCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,33 +7,25 @@ package com.onarandombox.MultiverseCore.commands; +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; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.List; - -/** - * Confirms actions. - */ -public class ConfirmCommand extends MultiverseCommand { +@CommandAlias("mv") +public class ConfirmCommand extends MultiverseCoreCommand { public ConfirmCommand(MultiverseCore plugin) { super(plugin); - // Any command that is dangerous should require op - this.setName("Confirms a command that could destroy life, the universe and everything."); - this.setCommandUsage("/mv confirm"); - this.setArgRange(0, 0); - this.addKey("mvconfirm"); - this.addKey("mv confirm"); - this.addCommandExample("/mv confirm"); - this.setPermission("multiverse.core.confirm", "If you have not been prompted to use this, it will not do anything.", PermissionDefault.OP); - } - @Override - public void runCommand(CommandSender sender, List args) { - this.plugin.getCommandHandler().confirmQueuedCommand(sender); + @Subcommand("confirm") + @CommandPermission("multiverse.core.confirm") + @Description("Confirms dangerous commands before executing them.") + public void onConfirmCommand(@NotNull CommandSender sender) { + this.plugin.getMVCommandManager().getQueueManager().runQueuedCommand(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..f764d46d1 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,64 +7,69 @@ package com.onarandombox.MultiverseCore.commands; +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.Description; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.commandtools.context.RequiredPlayer; import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.text.DecimalFormat; -import java.util.List; - -/** - * Returns detailed information on the Players where abouts. - */ -public class CoordCommand extends MultiverseCommand { - private MVWorldManager worldManager; +@CommandAlias("mv") +public class CoordCommand extends MultiverseCoreCommand { public CoordCommand(MultiverseCore plugin) { super(plugin); - this.setName("Coordinates"); - this.setCommandUsage("/mv coord"); - this.setArgRange(0, 0); - this.addKey("mv coord"); - this.addKey("mvcoord"); - this.addKey("mvco"); - this.addCommandExample("/mv coord"); - this.setPermission("multiverse.core.coord", "Returns detailed information on the Players where abouts.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); } - @Override - public void runCommand(CommandSender sender, List args) { - // Check if the command was sent from a Player. - if (sender instanceof Player) { - Player p = (Player) sender; - World world = p.getWorld(); + @Subcommand("coord|coordinate") + @CommandPermission("multiverse.core.coord.self") + @Description("Detailed information on your own where abouts.") + public void onCoordCommand(@NotNull Player player) { + showCoordInfo(player, player); + } + + @Subcommand("coord|coordinate") + @CommandPermission("multiverse.core.coord.other") + @Syntax("[player]") + @CommandCompletion("@players") + @Description("Detailed information on the player's where abouts.") + public void onOtherCoordCommand(@NotNull CommandSender sender, - if (!this.worldManager.isMVWorld(world.getName())) { - this.plugin.showNotMVWorldMessage(sender, world.getName()); - return; - } + @NotNull + @Syntax("[player]") + @Description("Player you want coordinate info of.") + RequiredPlayer player) { - MultiverseWorld mvworld = this.worldManager.getMVWorld(world.getName()); + showCoordInfo(sender, player.get()); + } - p.sendMessage(ChatColor.AQUA + "--- Location Information ---"); - p.sendMessage(ChatColor.AQUA + "World: " + ChatColor.WHITE + world.getName()); - p.sendMessage(ChatColor.AQUA + "Alias: " + mvworld.getColoredWorldString()); - p.sendMessage(ChatColor.AQUA + "World Scale: " + ChatColor.WHITE + mvworld.getScaling()); - DecimalFormat df = new DecimalFormat(); - df.setMinimumFractionDigits(0); - df.setMaximumFractionDigits(2); - p.sendMessage(ChatColor.AQUA + "Coordinates: " + ChatColor.WHITE + plugin.getLocationManipulation().strCoords(p.getLocation())); - p.sendMessage(ChatColor.AQUA + "Direction: " + ChatColor.WHITE + plugin.getLocationManipulation().getDirection(p.getLocation())); - p.sendMessage(ChatColor.AQUA + "Block: " + ChatColor.WHITE + world.getBlockAt(p.getLocation()).getType()); - } else { - sender.sendMessage("This command needs to be used from a Player."); + private void showCoordInfo(@NotNull CommandSender sender, + @NotNull Player player) { + + MultiverseWorld world = this.plugin.getMVWorldManager().getMVWorld(player.getWorld()); + if (world == null) { + throw new InvalidCommandArgument("Player is not in a multiverse world."); } + + String name = player.equals(sender) + ? "" + : String.format("for %s%s%s",ChatColor.YELLOW, player.getName(), ChatColor.AQUA); + + sender.sendMessage(String.format("%s--- Location Information %s---", ChatColor.AQUA, name)); + sender.sendMessage(String.format("%sWorld: %s%s", ChatColor.AQUA, ChatColor.WHITE, world.getName())); + sender.sendMessage(String.format("%sAlias: %s%s", ChatColor.AQUA, ChatColor.WHITE, world.getColoredWorldString())); + sender.sendMessage(String.format("%sWorld Scale: %s%s", ChatColor.AQUA, ChatColor.WHITE, world.getScaling())); + sender.sendMessage(String.format("%sCoordinates: %s%s", ChatColor.AQUA, ChatColor.WHITE, this.plugin.getLocationManipulation().strCoords(player.getLocation()))); + sender.sendMessage(String.format("%sWorld Scale: %s%s", ChatColor.AQUA, ChatColor.WHITE, world.getScaling())); + sender.sendMessage(String.format("%sDirection: %s%s", ChatColor.AQUA, ChatColor.WHITE, this.plugin.getLocationManipulation().getDirection(player.getLocation()))); + sender.sendMessage(String.format("%sBlock: %s%s", ChatColor.AQUA, ChatColor.WHITE, world.getCBWorld().getBlockAt(player.getLocation()).getType())); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/CreateCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/CreateCommand.java index 87bdacab0..66dea8c9a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/CreateCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/CreateCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,114 +7,77 @@ package com.onarandombox.MultiverseCore.commands; +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 com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; -import com.pneumaticraft.commandhandler.CommandHandler; +import com.onarandombox.MultiverseCore.commandtools.flag.FlagGroup; +import com.onarandombox.MultiverseCore.commandtools.flag.FlagResult; +import com.onarandombox.MultiverseCore.commandtools.flag.CoreFlags; import org.bukkit.ChatColor; -import org.bukkit.World.Environment; -import org.bukkit.WorldType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import static org.bukkit.World.*; -/** - * Creates a new world and loads it. - */ -public class CreateCommand extends MultiverseCommand { - private MVWorldManager worldManager; +@CommandAlias("mv") +public class CreateCommand extends MultiverseCoreCommand { public CreateCommand(MultiverseCore plugin) { super(plugin); - this.setName("Create World"); - this.setCommandUsage(String.format("/mv create %s{NAME} {ENV} %s-s [SEED] -g [GENERATOR[:ID]] -t [WORLDTYPE] [-n] -a [true|false]", - ChatColor.GREEN, ChatColor.GOLD)); - this.setArgRange(2, 11); // SUPPRESS CHECKSTYLE: MagicNumberCheck - this.addKey("mvcreate"); - this.addKey("mvc"); - this.addKey("mv create"); - this.setPermission("multiverse.core.create", "Creates a new world and loads it.", PermissionDefault.OP); - this.addCommandExample("/mv create " + ChatColor.GOLD + "world" + ChatColor.GREEN + " normal"); - this.addCommandExample("/mv create " + ChatColor.GOLD + "lavaland" + ChatColor.RED + " nether"); - this.addCommandExample("/mv create " + ChatColor.GOLD + "starwars" + ChatColor.AQUA + " end"); - this.addCommandExample("/mv create " + ChatColor.GOLD + "flatroom" + ChatColor.GREEN + " normal" + ChatColor.AQUA + " -t flat"); - this.addCommandExample("/mv create " + ChatColor.GOLD + "gargamel" + ChatColor.GREEN + " normal" + ChatColor.DARK_AQUA + " -s gargamel"); - this.addCommandExample("/mv create " + ChatColor.GOLD + "moonworld" + ChatColor.GREEN + " normal" + ChatColor.DARK_AQUA + " -g BukkitFullOfMoon"); - this.worldManager = this.plugin.getMVWorldManager(); + this.setFlagGroup(FlagGroup.of( + CoreFlags.WORLD_TYPE, + CoreFlags.SEED, + CoreFlags.GENERATOR, + CoreFlags.GENERATE_STRUCTURES, + CoreFlags.SPAWN_ADJUST + )); } - @Override - public void runCommand(CommandSender sender, List args) { - String worldName = args.get(0); - File worldFile = new File(this.plugin.getServer().getWorldContainer(), worldName); - String env = args.get(1); - String seed = CommandHandler.getFlag("-s", args); - String generator = CommandHandler.getFlag("-g", args); - boolean allowStructures = true; - String structureString = CommandHandler.getFlag("-a", args); - if (structureString != null) { - allowStructures = Boolean.parseBoolean(structureString); - } - String typeString = CommandHandler.getFlag("-t", args); - boolean useSpawnAdjust = true; - for (String s : args) { - if (s.equalsIgnoreCase("-n")) { - useSpawnAdjust = false; - } - } + @Subcommand("create") + @CommandPermission("multiverse.core.create") + @Syntax(" -s [seed] -g [generator[:id]] -t [worldtype] [-n] -a [true|false]") + @CommandCompletion("@empty @environments @flags") + @Description("Creates a new world and loads it.") + public void onCreateCommand(@NotNull CommandSender sender, - if (this.worldManager.isMVWorld(worldName)) { - sender.sendMessage(ChatColor.RED + "Multiverse cannot create " + ChatColor.GOLD + ChatColor.UNDERLINE - + "another" + ChatColor.RESET + ChatColor.RED + " world named " + worldName); - return; - } + @NotNull + @Syntax("") + @Description("New world name.") + @Flags("trim") + @Conditions("creatableWorldName") String worldName, - if (worldFile.exists()) { - sender.sendMessage(ChatColor.RED + "A Folder/World already exists with this name!"); - sender.sendMessage(ChatColor.RED + "If you are confident it is a world you can import with /mvimport"); - return; - } + @NotNull + @Syntax("") + @Description("The world's environment. See: /mv env") + Environment environment, - Environment environment = EnvironmentCommand.getEnvFromString(env); - if (environment == null) { - sender.sendMessage(ChatColor.RED + "That is not a valid environment."); - EnvironmentCommand.showEnvironments(sender); - return; - } + @Nullable + @Syntax("[world-flags]") + @Description("Other world settings. See: http://gg.gg/nn8bl") + String[] flagsArray) { - // If they didn't specify a type, default to NORMAL - if (typeString == null) { - typeString = "NORMAL"; - } - WorldType type = EnvironmentCommand.getWorldTypeFromString(typeString); - if (type == null) { - sender.sendMessage(ChatColor.RED + "That is not a valid World Type."); - EnvironmentCommand.showWorldTypes(sender); - return; - } - // Determine if the generator is valid. #918 - if (generator != null) { - List genarray = new ArrayList(Arrays.asList(generator.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) { - // We have an invalid generator. - sender.sendMessage("Invalid generator! '" + generator + "'. " + ChatColor.RED + "Aborting world creation."); - return; - } - } - Command.broadcastCommandMessage(sender, "Starting creation of world '" + worldName + "'..."); + FlagResult flags = this.getFlagGroup().calculateResult(flagsArray); - if (this.worldManager.addWorld(worldName, environment, seed, type, allowStructures, generator, useSpawnAdjust)) { - Command.broadcastCommandMessage(sender, "Complete!"); - } else { - Command.broadcastCommandMessage(sender, "FAILED."); - } + Command.broadcastCommandMessage(sender, String.format("Starting creation of world '%s'...", worldName)); + Command.broadcastCommandMessage(sender, (this.plugin.getMVWorldManager().addWorld( + worldName, + environment, + // TODO API: Should Allow FlagResult object to be passed directly + flags.getValue(CoreFlags.SEED), + flags.getValue(CoreFlags.WORLD_TYPE), + flags.getValue(CoreFlags.GENERATE_STRUCTURES), + flags.getValue(CoreFlags.GENERATOR), + flags.getValue(CoreFlags.SPAWN_ADJUST)) + ) + ? String.format("%sComplete!", ChatColor.GREEN) + : String.format("%sFailed! See console for errors.", ChatColor.RED)); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java index b2ccd99e4..c6a2f81ed 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/DebugCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,61 +7,85 @@ package com.onarandombox.MultiverseCore.commands; +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.Description; +import co.aikar.commands.annotation.Single; +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; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.List; -import java.util.logging.Level; - -/** - * Enables debug-information. - */ -public class DebugCommand extends MultiverseCommand { +@CommandAlias("mv") +@CommandPermission("multiverse.core.debug") +public class DebugCommand extends MultiverseCoreCommand { public DebugCommand(MultiverseCore plugin) { super(plugin); - this.setName("Turn Debug on/off?"); - this.setCommandUsage("/mv debug" + ChatColor.GOLD + " [1|2|3|off|silent]"); - this.setArgRange(0, 1); - this.addKey("mv debug"); - this.addKey("mv d"); - this.addKey("mvdebug"); - this.addCommandExample("/mv debug " + ChatColor.GOLD + "2"); - this.setPermission("multiverse.core.debug", "Spams the console a bunch.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - if (args.size() == 1) { - if (args.get(0).equalsIgnoreCase("off")) { - plugin.getMVConfig().setGlobalDebug(0); - } else { - try { - int debugLevel = Integer.parseInt(args.get(0)); - if (debugLevel > 3 || debugLevel < 0) { - throw new NumberFormatException(); - } - plugin.getMVConfig().setGlobalDebug(debugLevel); - } 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!)"); - } - } - plugin.saveMVConfigs(); + @Subcommand("debug") + @CommandPermission("multiverse.core.debug") + @Description("Show the current debug level.") + public void onShowDebugCommand(@NotNull CommandSender sender) { + displayDebugMode(sender); + } + + @Subcommand("debug") + @CommandPermission("multiverse.core.debug") + @Syntax("") + @CommandCompletion("@toggles|@range:3") + @Description("Change debug level.") + public void onChangeDebugCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Set debug mode level, 0 to 3.") + @Single String debugLevel) { + + int parsedLevel = parseDebugLevel(debugLevel); + if (parsedLevel == -1) { + throw new InvalidCommandArgument("No such debug level. Please use a number from 0 to 3."); + } + + this.plugin.getMVConfig().setGlobalDebug(parsedLevel); + if (!this.plugin.saveMVConfigs()) { + sender.sendMessage(String.format("%sError saving changes to config! See console for more info.", ChatColor.RED)); + } + + displayDebugMode(sender); + } + + private int parseDebugLevel(@NotNull 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) ? -1 : parsedLevel; + } + catch (NumberFormatException ignored) { + return -1; } - this.displayDebugMode(sender); } - private void displayDebugMode(CommandSender sender) { - final int debugLevel = plugin.getMVConfig().getGlobalDebug(); + private void displayDebugMode(@NotNull CommandSender sender) { + int debugLevel = this.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"); + sender.sendMessage(String.format("Multiverse Debug mode is %soff", ChatColor.RED)); + } + else { + sender.sendMessage(String.format("Multiverse Debug mode at level %s%s", ChatColor.GREEN, debugLevel)); + Logging.fine("Multiverse debug mode enabled!"); } } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java index 2e7b3c8b0..22208fdd5 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/DeleteCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,39 +7,58 @@ package com.onarandombox.MultiverseCore.commands; +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.Single; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.commandtools.queue.QueuedCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; - -/** - * Deletes worlds. - */ -public class DeleteCommand extends MultiverseCommand { +@CommandAlias("mv") +public class DeleteCommand extends MultiverseCoreCommand { public DeleteCommand(MultiverseCore plugin) { super(plugin); - this.setName("Delete World"); - this.setCommandUsage("/mv delete" + ChatColor.GREEN + " {WORLD}"); - this.setArgRange(1, 1); - this.addKey("mvdelete"); - this.addKey("mv delete"); - this.addCommandExample("/mv delete " + ChatColor.GOLD + "MyWorld"); - this.setPermission("multiverse.core.delete", "Deletes a world on your server. " + ChatColor.RED + "PERMANENTLY.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - String worldName = args.get(0); + @Subcommand("delete") + @CommandPermission("multiverse.core.delete") + @Syntax("") + @CommandCompletion("@MVWorlds|@unloadedWorlds") + @Description("Deletes a world on your server PERMANENTLY.") + public void onDeleteCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Multiverse world you want to delete.") + @Flags("trim") + @Conditions("isWorldInConfig|validWorldFolder") + @Single String worldName) { + + this.plugin.getMVCommandManager().getQueueManager().addToQueue(new QueuedCommand.Builder() + .sender(sender) + .action(deleteRunnable(sender, worldName)) + .prompt("Are you sure you want to delete world '%s'?", worldName) + .build() + ); + } + + private Runnable deleteRunnable(@NotNull CommandSender sender, + @NotNull String worldName) { - 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!"); + return () -> { + sender.sendMessage(String.format("Deleting world '%s'...", worldName)); + sender.sendMessage((this.plugin.getMVWorldManager().deleteWorld(worldName)) + ? String.format("%sWorld %s was deleted!", ChatColor.GREEN, worldName) + : String.format("%sThere was an issue deleting '%s'! Please check console for errors.", ChatColor.RED, worldName)); + }; } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/EnvironmentCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/EnvironmentCommand.java index f9ac88600..e30c87d3f 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/EnvironmentCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/EnvironmentCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,32 +7,28 @@ package com.onarandombox.MultiverseCore.commands; +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.ChatColor; -import org.bukkit.World; -import org.bukkit.WorldType; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; -import java.util.List; - -/** - * Lists valid known environments. - */ -public class EnvironmentCommand extends MultiverseCommand { +@CommandAlias("mv") +public class EnvironmentCommand extends MultiverseCoreCommand { public EnvironmentCommand(MultiverseCore plugin) { super(plugin); - this.setName("List Environments"); - this.setCommandUsage("/mv env"); - this.setArgRange(0, 0); - this.addKey("mvenv"); - this.addKey("mv env"); - this.addKey("mv type"); - this.addKey("mv environment"); - this.addKey("mv environments"); - this.addCommandExample("/mv env"); - this.setPermission("multiverse.core.list.environments", "Lists valid known environments/world types.", PermissionDefault.OP); + } + + @Subcommand("env|environments") + @CommandPermission("multiverse.core.list.environments") + @Description("Lists valid known environments and world types.") + public void onEnvironmentCommand(CommandSender sender) { + showEnvironments(sender); + sender.sendMessage(""); + showWorldTypes(sender); } /** @@ -41,78 +37,19 @@ public EnvironmentCommand(MultiverseCore plugin) { * @param sender The {@link CommandSender}. */ public static void showEnvironments(CommandSender sender) { - sender.sendMessage(ChatColor.YELLOW + "Valid Environments are:"); - sender.sendMessage(ChatColor.GREEN + "NORMAL"); - sender.sendMessage(ChatColor.RED + "NETHER"); - sender.sendMessage(ChatColor.AQUA + "END"); + sender.sendMessage(String.format("%sValid Environments are:", ChatColor.YELLOW)); + sender.sendMessage(String.format("%sNORMAL%s, %sNETHER %sor %sEND", + ChatColor.GREEN, ChatColor.WHITE, ChatColor.RED, ChatColor.WHITE, ChatColor.AQUA)); } + /** * Shows all valid known world types to a {@link CommandSender}. * * @param sender The {@link CommandSender}. */ public static void showWorldTypes(CommandSender sender) { - sender.sendMessage(ChatColor.YELLOW + "Valid World Types are:"); - sender.sendMessage(String.format("%sNORMAL%s, %sFLAT, %sLARGEBIOMES %sor %sVERSION_1_1", - ChatColor.GREEN, ChatColor.WHITE, ChatColor.AQUA, ChatColor.RED, ChatColor.WHITE, ChatColor.GOLD)); - } - - @Override - public void runCommand(CommandSender sender, List args) { - EnvironmentCommand.showEnvironments(sender); - EnvironmentCommand.showWorldTypes(sender); - } - - /** - * Converts a {@link String} into a {@link WorldType}. - * - * @param type The WorldType as a {@link String} - * @return The WorldType as a {@link WorldType} - */ - public static WorldType getWorldTypeFromString(String type) { - // Don't reference the enum directly as there aren't that many, and we can be more forgiving to users this way - 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 { - // Now that we've converted a potentially unfriendly value - // to a friendly one, get it from the ENUM! - return WorldType.valueOf(type); - } catch (IllegalArgumentException e) { - return null; - } - } - - /** - * Converts a {@link String} into an {@link org.bukkit.World.Environment}. - * - * @param env The environment as {@link String} - * @return The environment as {@link org.bukkit.World.Environment} - */ - public static World.Environment getEnvFromString(String env) { - env = env.toUpperCase(); - // Don't reference the enum directly as there aren't that many, and we can be more forgiving to users this way - if (env.equalsIgnoreCase("HELL") || env.equalsIgnoreCase("NETHER")) - env = "NETHER"; - - if (env.equalsIgnoreCase("END") || env.equalsIgnoreCase("THEEND") || env.equalsIgnoreCase("STARWARS")) - env = "THE_END"; - - if (env.equalsIgnoreCase("NORMAL") || env.equalsIgnoreCase("WORLD")) - env = "NORMAL"; - - try { - // Now that we've converted a potentially unfriendly value - // to a friendly one, get it from the ENUM! - return World.Environment.valueOf(env); - } catch (IllegalArgumentException e) { - return null; - } + sender.sendMessage(String.format("%sValid World Types are:", ChatColor.YELLOW)); + sender.sendMessage(String.format("%sNORMAL%s, %sFLAT%s, %sLARGEBIOMES %sor %sAMPLIFIED", + ChatColor.GREEN, ChatColor.WHITE, ChatColor.AQUA, ChatColor.WHITE, ChatColor.RED, ChatColor.WHITE, ChatColor.GOLD)); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/GameRuleCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/GameRuleCommand.java new file mode 100644 index 000000000..b49d25a8f --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/GameRuleCommand.java @@ -0,0 +1,106 @@ +/****************************************************************************** + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * + * Multiverse 2 is licensed under the BSD License. * + * For more information please check the README.md file included * + * with this project. * + ******************************************************************************/ + +package com.onarandombox.MultiverseCore.commands; + +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 com.onarandombox.MultiverseCore.commandtools.context.GameRuleProperty; +import com.onarandombox.MultiverseCore.displaytools.ColorAlternator; +import com.onarandombox.MultiverseCore.displaytools.ContentDisplay; +import com.onarandombox.MultiverseCore.displaytools.ContentFilter; +import com.onarandombox.MultiverseCore.displaytools.DisplayHandlers; +import com.onarandombox.MultiverseCore.displaytools.DisplaySettings; +import org.bukkit.ChatColor; +import org.bukkit.GameRule; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +@CommandAlias("mv") +@Subcommand("gamerule") +public class GameRuleCommand extends MultiverseCoreCommand { + + public GameRuleCommand(MultiverseCore plugin) { + super(plugin); + } + + @Subcommand("list") + @CommandPermission("multiverse.core.gamerule.list") + @Syntax("[world] [filter]") + @CommandCompletion("@MVWorlds") + @Description("See the list gamerules values for a given world.") + public void onGameRulesCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("[world]") + @Description("World you want to see game rule info.") + @Flags("other,defaultself, fallbackself") MultiverseWorld world, + + @NotNull ContentFilter filter) { + + new ContentDisplay.Builder>() + .sender(sender) + .header("=== Gamerules for %s%s%s ===", ChatColor.AQUA, world.getName(), ChatColor.WHITE) + .contents(getGameRuleMap(world)) + .displayHandler(DisplayHandlers.INLINE_MAP) + .colorTool(ColorAlternator.with(ChatColor.GREEN, ChatColor.GOLD)) + .setting(DisplaySettings.OPERATOR, ": ") + .filter(filter) + .display(); + } + + private Map getGameRuleMap(MultiverseWorld world) { + return new HashMap() {{ + Arrays.stream(GameRule.values()) + .forEach(gr -> { + Object value = world.getCBWorld().getGameRuleValue(gr); + if (value != null) { + put(gr.getName(), value.toString()); + } + }); + }}; + } + + @Subcommand("set") + @CommandPermission("multiverse.core.gamerule.set") + @Syntax(" [world]") + @CommandCompletion("@gameRules @empty @MVWorlds") + @Description("Allows a player to set a gamerule for a given world.") + public void onGameRuleChangeCommand(@NotNull CommandSender sender, + @NotNull Player player, + + @Syntax(" ") + @Description("Game rule property and value you want to change to.") + @NotNull GameRuleProperty property, + + @Syntax("[world]") + @Description("World you want to set this game rule.") + @NotNull @Flags("other,defaultself") MultiverseWorld world) { + + sender.sendMessage((world.getCBWorld().setGameRule(property.getGameRule(), property.getValue())) + + ? String.format("%sSuccess! %sGamerule %s%s%s was set to %s%s%s.", + ChatColor.GREEN, ChatColor.WHITE, ChatColor.AQUA, property.getGameRule().getName(), + ChatColor.WHITE, ChatColor.GREEN, property.getValue(), ChatColor.WHITE) + + : String.format("%sFailure! Gamerule %s%s%s could not be set to %s%s%s.", + ChatColor.RED, ChatColor.AQUA, property.getGameRule().getName(), + ChatColor.RED, ChatColor.DARK_RED, property.getValue(), ChatColor.RED)); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/GameruleCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/GameruleCommand.java deleted file mode 100644 index ca0e1e076..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/GameruleCommand.java +++ /dev/null @@ -1,116 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameRule; -import org.bukkit.World; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; - -import java.util.List; - -/** - * Allows management of Anchor Destinations. - */ -public class GameruleCommand extends MultiverseCommand { - - public GameruleCommand(MultiverseCore plugin) { - super(plugin); - this.setName("Set a Minecraft Game Rule for a World."); - this.setCommandUsage("/mv gamerule " + ChatColor.GREEN + "{RULE} {VALUE}" + ChatColor.GOLD + " [WORLD]"); - this.setArgRange(2, 3); - this.addKey("mv gamerule"); - this.addKey("mv rule"); - this.addKey("mvgamerule"); - this.addKey("mvrule"); - this.addCommandExample("/mv gamerule " + ChatColor.GREEN + "doMobLoot false"); - this.addCommandExample("/mvrule " + ChatColor.GREEN + "keepInventory true " + ChatColor.RED + "world_nether"); - this.setPermission("multiverse.core.gamerule.set", "Allows a player to set a gamerule.", PermissionDefault.OP); - } - - - @Override - public void runCommand(CommandSender sender, List args) { - // We NEED a world from the command line - final Player p; - if (sender instanceof Player) { - p = (Player) sender; - } else { - p = null; - } - - if (args.size() == 2 && p == null) { - sender.sendMessage("From the command line, WORLD is required."); - sender.sendMessage(this.getCommandDesc()); - sender.sendMessage(this.getCommandUsage()); - sender.sendMessage("Nothing changed."); - return; - } - - final GameRule gameRule = GameRule.getByName(args.get(0)); - final String value = args.get(1); - final World world; - if (args.size() == 2) { - world = p.getWorld(); - } else { - world = Bukkit.getWorld(args.get(2)); - if (world == null) { - sender.sendMessage(ChatColor.RED + "Failure!" + ChatColor.WHITE + " World " + ChatColor.AQUA + args.get(2) - + ChatColor.WHITE + " does not exist."); - return; - } - } - - if (gameRule == null) { - sender.sendMessage(ChatColor.RED + "Failure! " + ChatColor.AQUA + args.get(0) + ChatColor.WHITE - + " is not a valid gamerule."); - } else { - if (gameRule.getType() == Boolean.class) { - boolean booleanValue; - if (value.equalsIgnoreCase("true")) { - booleanValue = true; - } else if (value.equalsIgnoreCase("false")) { - booleanValue = false; - } else { - sender.sendMessage(getErrorMessage(gameRule.getName(), value) + "it can only be set to true or false."); - return; - } - - if (!world.setGameRule(gameRule, booleanValue)) { - sender.sendMessage(getErrorMessage(gameRule.getName(), value) + "something went wrong."); - return; - } - } else if (gameRule.getType() == Integer.class) { - try { - if (!world.setGameRule(gameRule, Integer.parseInt(value))) { - throw new NumberFormatException(); - } - } catch (NumberFormatException e) { - sender.sendMessage(getErrorMessage(gameRule.getName(), value) + "it can only be set to a positive integer."); - return; - } - } else { - sender.sendMessage(ChatColor.RED + "Failure!" + ChatColor.WHITE + " Gamerule " + ChatColor.AQUA + gameRule.getName() - + ChatColor.WHITE + " isn't supported yet, please let us know about it."); - return; - } - - sender.sendMessage(ChatColor.GREEN + "Success!" + ChatColor.WHITE + " Gamerule " + ChatColor.AQUA + gameRule.getName() - + ChatColor.WHITE + " was set to " + ChatColor.GREEN + value + ChatColor.WHITE + "."); - } - } - - private String getErrorMessage(String gameRule, String value) { - return ChatColor.RED + "Failure!" + ChatColor.WHITE + " Gamerule " + ChatColor.AQUA + gameRule - + ChatColor.WHITE + " could not be set to " + ChatColor.RED + value + ChatColor.WHITE + ", "; - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/GamerulesCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/GamerulesCommand.java deleted file mode 100644 index 62b3e0607..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/GamerulesCommand.java +++ /dev/null @@ -1,82 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.GameRule; -import org.bukkit.World; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; - -import java.util.List; - -/** - * Allows management of Anchor Destinations. - */ -public class GamerulesCommand extends MultiverseCommand { - - public GamerulesCommand(MultiverseCore plugin) { - super(plugin); - this.setName("List the Minecraft Game Rules for a World."); - this.setCommandUsage("/mv gamerules" + ChatColor.GOLD + " [WORLD]"); - this.setArgRange(0, 1); - this.addKey("mv gamerules"); - this.addKey("mv rules"); - this.addKey("mvgamerules"); - this.addKey("mvrules"); - this.addCommandExample("/mv gamerules"); - this.addCommandExample("/mvrules " + ChatColor.RED + "world_nether"); - this.setPermission("multiverse.core.gamerule.list", "Allows a player to list gamerules.", PermissionDefault.OP); - } - - - @Override - public void runCommand(CommandSender sender, List args) { - // We NEED a world from the command line - final Player p; - if (sender instanceof Player) { - p = (Player) sender; - } else { - p = null; - } - - if (args.size() == 0 && p == null) { - sender.sendMessage("From the command line, WORLD is required."); - sender.sendMessage(this.getCommandDesc()); - sender.sendMessage(this.getCommandUsage()); - sender.sendMessage("Nothing changed."); - return; - } - - final World world; - if (args.size() == 0) { - world = p.getWorld(); - } else { - world = Bukkit.getWorld(args.get(0)); - if (world == null) { - sender.sendMessage(ChatColor.RED + "Failure!" + ChatColor.WHITE + " World " + ChatColor.AQUA + args.get(0) - + ChatColor.WHITE + " does not exist."); - return; - } - } - - final StringBuilder gameRules = new StringBuilder(); - for (final String gameRule : world.getGameRules()) { - if (gameRules.length() != 0) { - gameRules.append(ChatColor.WHITE).append(", "); - } - gameRules.append(ChatColor.AQUA).append(gameRule).append(ChatColor.WHITE).append(": "); - gameRules.append(ChatColor.GREEN).append(world.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/GeneratorCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/GeneratorCommand.java index 72d4379b6..62ebe8694 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/GeneratorCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/GeneratorCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,54 +7,39 @@ package com.onarandombox.MultiverseCore.commands; -import com.dumptruckman.minecraft.util.Logging; +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.commandtools.flag.CoreFlags; +import com.onarandombox.MultiverseCore.displaytools.ColorAlternator; +import com.onarandombox.MultiverseCore.displaytools.ContentDisplay; +import com.onarandombox.MultiverseCore.displaytools.DisplayHandlers; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; -import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; +import java.util.Collection; -/** - * Returns a list of loaded generator plugins. - */ -public class GeneratorCommand extends MultiverseCommand { +@CommandAlias("mv") +public class GeneratorCommand extends MultiverseCoreCommand { public GeneratorCommand(MultiverseCore plugin) { super(plugin); - this.setName("World Information"); - this.setCommandUsage("/mv generators"); - this.setArgRange(0, 0); - this.addKey("mv generators"); - this.addKey("mvgenerators"); - this.addKey("mv gens"); - this.addKey("mvgens"); - this.addCommandExample("/mv generators"); - this.setPermission("multiverse.core.generator", "Returns a list of Loaded Generator Plugins.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - Logging.info("PLEASE IGNORE the 'Plugin X does not contain any generators' message below!"); - Plugin[] plugins = this.plugin.getServer().getPluginManager().getPlugins(); - List generators = new ArrayList(); - for (Plugin p : plugins) { - if (p.isEnabled() && p.getDefaultWorldGenerator("world", "") != null) { - generators.add(p.getDescription().getName()); - } - } - sender.sendMessage(ChatColor.AQUA + "--- Loaded Generator Plugins ---"); - String loadedGens = ""; - boolean altColor = false; - for (String s : generators) { - loadedGens += (altColor ? ChatColor.YELLOW : ChatColor.WHITE) + s + " "; - altColor = !altColor; - } - if (loadedGens.length() == 0) { - loadedGens = ChatColor.RED + "No Generator Plugins found."; - } - sender.sendMessage(loadedGens); + @Subcommand("gens|generators") + @CommandPermission("multiverse.core.generator") + @Description("Shows a list of Loaded Generator Plugins.") + public void onGeneratorCommand(@NotNull CommandSender sender) { + new ContentDisplay.Builder>() + .sender(sender) + .header("%s--- Available Generator Plugins ---", ChatColor.GOLD) + .contents(CoreFlags.GENERATOR.suggestValue()) + .emptyMessage("%sYou do not have any generator plugins installed.", ChatColor.RED) + .displayHandler(DisplayHandlers.INLINE_LIST) + .colorTool(ColorAlternator.with(ChatColor.AQUA, ChatColor.WHITE)) + .display(); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java deleted file mode 100644 index 90913026c..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java +++ /dev/null @@ -1,106 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -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; -import java.util.List; - -/** - * Displays a nice help menu. - */ -public class HelpCommand extends PaginatedCoreCommand { - - public HelpCommand(MultiverseCore plugin) { - super(plugin); - this.setName("Get Help with Multiverse"); - this.setCommandUsage("/mv " + ChatColor.GOLD + "[FILTER] [PAGE #]"); - this.setArgRange(0, 2); - this.addKey("mv"); - this.addKey("mvh"); - this.addKey("mvhelp"); - this.addKey("mv help"); - this.addKey("mvsearch"); - this.addKey("mv search"); - this.addCommandExample("/mv help ?"); - this.setPermission("multiverse.help", "Displays a nice help menu.", PermissionDefault.TRUE); - this.setItemsPerPage(7); // SUPPRESS CHECKSTYLE: MagicNumberCheck - } - - @Override - protected List getFilteredItems(List availableItems, String filter) { - List filtered = new ArrayList(); - - for (Command c : availableItems) { - if (stitchThisString(c.getKeyStrings()).matches("(?i).*" + filter + ".*")) { - filtered.add(c); - } else if (c.getCommandName().matches("(?i).*" + filter + ".*")) { - filtered.add(c); - } else if (c.getCommandDesc().matches("(?i).*" + filter + ".*")) { - filtered.add(c); - } else if (c.getCommandUsage().matches("(?i).*" + filter + ".*")) { - filtered.add(c); - } else { - for (String example : c.getCommandExamples()) { - if (example.matches("(?i).*" + filter + ".*")) { - filtered.add(c); - break; - } - } - } - } - return filtered; - } - - @Override - protected String getItemText(Command item) { - return ChatColor.AQUA + item.getCommandUsage(); - } - - @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); - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java index b16bf2398..d1458bba3 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,165 +7,66 @@ package com.onarandombox.MultiverseCore.commands; +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.api.MVWorldManager; -import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.pneumaticraft.commandhandler.CommandHandler; +import com.onarandombox.MultiverseCore.commandtools.flag.FlagGroup; +import com.onarandombox.MultiverseCore.commandtools.flag.FlagResult; +import com.onarandombox.MultiverseCore.commandtools.flag.CoreFlags; import org.bukkit.ChatColor; -import org.bukkit.World.Environment; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import static org.bukkit.World.*; -/** - * Imports a new world of the specified type. - */ -public class ImportCommand extends MultiverseCommand { - private MVWorldManager worldManager; +@CommandAlias("mv") +public class ImportCommand extends MultiverseCoreCommand { public ImportCommand(MultiverseCore plugin) { super(plugin); - this.setName("Import World"); - this.setCommandUsage("/mv import" + ChatColor.GREEN + " {NAME} {ENV}" + ChatColor.GOLD + " -g [GENERATOR[:ID]] [-n]"); - this.setArgRange(1, 5); // SUPPRESS CHECKSTYLE: MagicNumberCheck - this.addKey("mvimport"); - this.addKey("mvim"); - this.addKey("mv import"); - this.addCommandExample("/mv import " + ChatColor.GOLD + "gargamel" + ChatColor.GREEN + " normal"); - this.addCommandExample("/mv import " + ChatColor.GOLD + "hell_world" + ChatColor.GREEN + " nether"); - this.addCommandExample("To import a world that uses a generator, you'll need the generator:"); - this.addCommandExample("/mv import " + ChatColor.GOLD + "CleanRoom" + ChatColor.GREEN + " normal" + ChatColor.DARK_AQUA + " CleanRoomGenerator"); - this.setPermission("multiverse.core.import", "Imports a new world of the specified type.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); + this.setFlagGroup(FlagGroup.of(CoreFlags.GENERATOR, CoreFlags.SPAWN_ADJUST)); } - /** - * A very basic check to see if a folder has a level.dat file. - * If it does, we can safely assume it's a world folder. - * - * @param worldFolder The File that may be a world. - * @return True if it looks like a world, false if not. - */ - private static boolean checkIfIsWorld(File worldFolder) { - if (worldFolder.isDirectory()) { - File[] files = worldFolder.listFiles(new FilenameFilter() { - @Override - public boolean accept(File file, String name) { - return name.toLowerCase().endsWith(".dat"); - } - }); - if (files != null && files.length > 0) { - return true; - } - } - return false; - } - - private String getPotentialWorlds() { - File worldFolder = this.plugin.getServer().getWorldContainer(); - if (worldFolder == null) { - return ""; - } - File[] files = worldFolder.listFiles(); - String worldList = ""; - Collection worlds = this.worldManager.getMVWorlds(); - List worldStrings = new ArrayList(); - for (MultiverseWorld world : worlds) { - worldStrings.add(world.getName()); - } - for (String world : this.worldManager.getUnloadedWorlds()) { - worldStrings.add(world); - } - ChatColor currColor = ChatColor.WHITE; - for (File file : files) { - if (file.isDirectory() && checkIfIsWorld(file) && !worldStrings.contains(file.getName())) { - worldList += currColor + file.getName() + " "; - if (currColor == ChatColor.WHITE) { - currColor = ChatColor.YELLOW; - } else { - currColor = ChatColor.WHITE; - } - } - } - return worldList; - } - - private String trimWorldName(String userInput) { - // Removes relative paths. - return userInput.replaceAll("^[./\\\\]+", ""); - } - - @Override - public void runCommand(CommandSender sender, List args) { - String worldName = trimWorldName(args.get(0)); - - if (worldName.toLowerCase().equals("--list") || worldName.toLowerCase().equals("-l")) { - String worldList = this.getPotentialWorlds(); - if (worldList.length() > 2) { - sender.sendMessage(ChatColor.AQUA + "====[ These look like worlds ]===="); - sender.sendMessage(worldList); - } else { - sender.sendMessage(ChatColor.RED + "No potential worlds found. Sorry!"); - } - return; - } - // Since we made an exception for the list, we have to make sure they have at least 2 params: - // Note the exception is --list, which is covered above. - if (args.size() == 1 || worldName.length() < 1) { - this.showHelp(sender); - return; - } + @Subcommand("import") + @CommandPermission("multiverse.core.import") + @Syntax(" -g [generator[:id]] [-n]") + @CommandCompletion("@potentialWorlds @environments @flags") + @Description("Imports a new world into multiverse.") + public void onImportCommand(@NotNull CommandSender sender, - // Make sure we don't already know about this world. - if (this.worldManager.isMVWorld(worldName)) { - sender.sendMessage(ChatColor.GREEN + "Multiverse" + ChatColor.WHITE - + " already knows about '" + ChatColor.AQUA + worldName + ChatColor.WHITE + "'!"); - return; - } + @Syntax("") + @Description("Folder name of the world.") + @NotNull @co.aikar.commands.annotation.Flags("trim") @Conditions("importableWorldName") String worldName, - File worldFile = new File(this.plugin.getServer().getWorldContainer(), worldName); + @NotNull + @Syntax("") + @Description("The world's environment. See: /mv env") + Environment environment, - String generator = CommandHandler.getFlag("-g", args); - boolean useSpawnAdjust = true; - for (String s : args) { - if (s.equalsIgnoreCase("-n")) { - useSpawnAdjust = false; - } - } + @Nullable + @Syntax("-g [generator[:id]] [-n]") + @Description("Other world settings. See: http://gg.gg/nn8c2") + String[] flagsArray) { - String env = args.get(1); - Environment environment = EnvironmentCommand.getEnvFromString(env); - if (environment == null) { - sender.sendMessage(ChatColor.RED + "That is not a valid environment."); - EnvironmentCommand.showEnvironments(sender); - return; - } + FlagResult flags = this.getFlagGroup().calculateResult(flagsArray); - if (!worldFile.exists()) { - sender.sendMessage(ChatColor.RED + "FAILED."); - String worldList = this.getPotentialWorlds(); - sender.sendMessage("That world folder does not exist. These look like worlds to me:"); - sender.sendMessage(worldList); - } else if (!checkIfIsWorld(worldFile)) { - sender.sendMessage(ChatColor.RED + "FAILED."); - sender.sendMessage(String.format("'%s' does not appear to be a world. It is lacking a .dat file.", - worldName)); - } else if (env == null) { - sender.sendMessage(ChatColor.RED + "FAILED."); - sender.sendMessage("That world environment did not exist."); - sender.sendMessage("For a list of available world types, type: " + ChatColor.AQUA + "/mvenv"); - } else { - Command.broadcastCommandMessage(sender, String.format("Starting import of world '%s'...", worldName)); - if (this.worldManager.addWorld(worldName, environment, null, null, null, generator, useSpawnAdjust)) - Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Complete!"); - else - Command.broadcastCommandMessage(sender, ChatColor.RED + "Failed!"); - } + Command.broadcastCommandMessage(sender, String.format("Starting import of world '%s'...", worldName)); + Command.broadcastCommandMessage(sender, (this.plugin.getMVWorldManager().addWorld(worldName, + environment, + null, + null, + null, + flags.getValue(CoreFlags.GENERATOR), + flags.getValue(CoreFlags.SPAWN_ADJUST)) + ) + ? String.format("%sComplete!", ChatColor.GREEN) + : String.format("%sFailed! See console for more details.", ChatColor.RED)); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/InfoCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/InfoCommand.java index 701424e70..ba07bba52 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/InfoCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/InfoCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,268 +7,141 @@ package com.onarandombox.MultiverseCore.commands; +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.FancyText; -import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.onarandombox.MultiverseCore.utils.FancyColorScheme; -import com.onarandombox.MultiverseCore.utils.FancyHeader; -import com.onarandombox.MultiverseCore.utils.FancyMessage; +import com.onarandombox.MultiverseCore.displaytools.ColorAlternator; +import com.onarandombox.MultiverseCore.displaytools.ContentDisplay; +import com.onarandombox.MultiverseCore.displaytools.DisplayHandlers; +import com.onarandombox.MultiverseCore.displaytools.DisplaySettings; import org.bukkit.ChatColor; -import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collection; import java.util.List; -// Will use when we can compile with JDK 6 -//import com.sun.xml.internal.ws.util.StringUtils; - -/** - * Returns detailed information about a world. - */ -public class InfoCommand extends MultiverseCommand { - private MVWorldManager worldManager; +@CommandAlias("mv") +public class InfoCommand extends MultiverseCoreCommand { public InfoCommand(MultiverseCore plugin) { super(plugin); - this.setName("World Information"); - this.setCommandUsage("/mv info" + ChatColor.GOLD + " [WORLD] [PAGE]"); - this.setArgRange(0, 2); - this.addKey("mvinfo"); - this.addKey("mvi"); - this.addKey("mv info"); - this.addCommandExample("/mv info " + ChatColor.GOLD + "1"); - this.addCommandExample("/mv info " + ChatColor.GOLD + "3"); - this.setPermission("multiverse.core.info", "Returns detailed information on the world.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); } - @Override - public void runCommand(CommandSender sender, List args) { - // Check if the command was sent from a Player. - String worldName = ""; - int pageNum = 0; - - if (args.size() == 0) { - if (sender instanceof Player) { - Player p = (Player) sender; - worldName = p.getWorld().getName(); - } else { - sender.sendMessage("You must enter a" + ChatColor.LIGHT_PURPLE + " world" + ChatColor.WHITE + " from the console!"); - return; - } - } else if (args.size() == 1) { - if (this.worldManager.isMVWorld(args.get(0))) { - // then we have a world! - worldName = args.get(0); - } else if (this.worldManager.getUnloadedWorlds().contains(args.get(0))) { - sender.sendMessage("That world exists, but it is unloaded!"); - sender.sendMessage(String.format("You can load it with: %s/mv load %s", ChatColor.AQUA, args.get(0))); - return; - } else { - if (sender instanceof Player) { - Player p = (Player) sender; - worldName = p.getWorld().getName(); - try { - pageNum = Integer.parseInt(args.get(0)) - 1; - } catch (NumberFormatException e) { - sender.sendMessage("That world does not exist."); - return; - } - } else { - sender.sendMessage("You must enter a" + ChatColor.LIGHT_PURPLE + " world" + ChatColor.WHITE + " from the console!"); - return; - } - } - } else if (args.size() == 2) { - worldName = args.get(0); - try { - pageNum = Integer.parseInt(args.get(1)) - 1; - } catch (NumberFormatException e) { - pageNum = 0; - } - } - - if (this.worldManager.isMVWorld(worldName)) { - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - showPage(pageNum, sender, this.buildEntireCommand(this.worldManager.getMVWorld(worldName), p)); - } else if (this.worldManager.getUnloadedWorlds().contains(worldName)) { - sender.sendMessage("That world exists, but it is unloaded!"); - sender.sendMessage(String.format("You can load it with: %s/mv load %s", ChatColor.AQUA, worldName)); - } else if (this.plugin.getServer().getWorld(worldName) != null) { - sender.sendMessage("That world exists, but Multiverse does not know about it!"); - sender.sendMessage("You can import it with" + ChatColor.AQUA + "/mv import " + ChatColor.GREEN + worldName + ChatColor.LIGHT_PURPLE + "{ENV}"); - sender.sendMessage("For available environments type " + ChatColor.GREEN + "/mv env"); - } + @Subcommand("info") + @CommandPermission("multiverse.core.info") + @Syntax("[world] [page]") + @CommandCompletion("@MVWorlds @range:1-5") + @Description("Display detailed information of the world.") + public void onInfoCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("[world]") + @Description("World you want to see info.") + @Flags("other,defaultself,fallbackself") MultiverseWorld world, + + @Syntax("[page]") + @Description("Info page to display.") + @Default("1") int page) { + + new ContentDisplay.Builder>() + .sender(sender) + .contents(buildWorldInfoContent(world)) + .displayHandler(DisplayHandlers.PAGE_LIST) + .colorTool(ColorAlternator.with(ChatColor.YELLOW, ChatColor.AQUA)).setting(DisplaySettings.SHOW_PAGE, page) + .display(); } - private List> buildEntireCommand(MultiverseWorld world, Player p) { - List message = new ArrayList(); - List> worldInfo = new ArrayList>(); - // Page 1 - FancyColorScheme colors = new FancyColorScheme(ChatColor.AQUA, ChatColor.AQUA, ChatColor.GOLD, ChatColor.WHITE); - message.add(new FancyHeader("General Info", colors)); - message.add(new FancyMessage("World Name: ", world.getName(), colors)); - message.add(new FancyMessage("World UID: ", world.getCBWorld().getUID().toString(), colors)); - message.add(new FancyMessage("World Alias: ", world.getColoredWorldString(), colors)); - message.add(new FancyMessage("Game Mode: ", world.getGameMode().toString(), colors)); - message.add(new FancyMessage("Difficulty: ", world.getDifficulty().toString(), colors)); + private List buildWorldInfoContent(MultiverseWorld world) { + List contents = new ArrayList<>(38); - //message.add(new FancyMessage("Game Mode: ", StringUtils.capitalize(world.getGameMode().toString()), colors)); - Location spawn = world.getSpawnLocation(); - message.add(new FancyMessage("Spawn Location: ", plugin.getLocationManipulation().strCoords(spawn), colors)); - message.add(new FancyMessage("World Scale: ", String.valueOf(world.getScaling()), colors)); - message.add(new FancyMessage("World Seed: ", String.valueOf(world.getSeed()), colors)); - if (world.getPrice() > 0) { - message.add(new FancyMessage("Price to enter this world: ", - plugin.getEconomist().formatPrice(world.getPrice(), world.getCurrency()), - colors)); - } else if (world.getPrice() < 0) { - message.add(new FancyMessage("Reward for entering this world: ", - plugin.getEconomist().formatPrice(-world.getPrice(), world.getCurrency()), - colors)); - } else { - message.add(new FancyMessage("Price to enter this world: ", ChatColor.GREEN + "FREE!", colors)); - } - - if (world.getRespawnToWorld() != null) { - MultiverseWorld respawn = this.worldManager.getMVWorld(world.getRespawnToWorld()); - if (respawn != null) { - message.add(new FancyMessage("Players will respawn in: ", respawn.getColoredWorldString(), colors)); - } else { - message.add(new FancyMessage("Players will respawn in: ", ChatColor.RED + "!!INVALID!!", colors)); - } - - } + // Page 1 + contents.add(parseHeader("General Info")); + contents.add(String.format("World Name: %s%s", ChatColor.WHITE, world.getName())); + contents.add(String.format("World Alias: %s%s", ChatColor.WHITE, world.getColoredWorldString())); + contents.add(String.format("Game Mode: %s%s", ChatColor.WHITE, world.getGameMode().toString())); + contents.add(String.format("Difficulty: %s%s", ChatColor.WHITE, world.getDifficulty().toString())); + contents.add(String.format("Spawn Location: %s%s", ChatColor.WHITE, this.plugin.getLocationManipulation().strCoords(world.getSpawnLocation()))); + contents.add(String.format("World Seed: %s%s", ChatColor.WHITE, world.getSeed())); + String priceString = (world.getPrice() == 0) + ? String.format("%sFREE!", ChatColor.GREEN) + : plugin.getEconomist().formatPrice(-world.getPrice(), world.getCurrency()); + contents.add(String.format((world.getPrice() >= 0) + ? "Price to enter this world: %s%s" + : "Reward for entering this world: %s%s", ChatColor.WHITE, priceString)); + World respawnWorld = world.getRespawnToWorld(); + MultiverseWorld respawn = this.plugin.getMVWorldManager().getMVWorld(respawnWorld); + String respawnWorldString = (respawn != null) + ? respawn.getColoredWorldString() + : ChatColor.RED + "!!INVALID!!"; + contents.add(String.format("Players will respawn in: %s%s", ChatColor.WHITE, respawnWorldString)); + contents.add(ContentDisplay.LINE_BREAK); - worldInfo.add(message); // Page 2 - message = new ArrayList(); - message.add(new FancyHeader("More World Settings", colors)); - message.add(new FancyMessage("World Type: ", world.getWorldType().toString(), colors)); - message.add(new FancyMessage("Generator: ", world.getGenerator(), colors)); - message.add(new FancyMessage("Structures: ", world.getCBWorld().canGenerateStructures() + "", colors)); - message.add(new FancyMessage("Weather: ", world.isWeatherEnabled() + "", colors)); - message.add(new FancyMessage("Players will get hungry: ", world.getHunger() + "", colors)); - message.add(new FancyMessage("Keep spawn in memory: ", world.isKeepingSpawnInMemory() + "", colors)); - message.add(new FancyHeader("PVP Settings", colors)); - message.add(new FancyMessage("Multiverse Setting: ", world.isPVPEnabled() + "", colors)); - message.add(new FancyMessage("Bukkit Setting: ", world.getCBWorld().getPVP() + "", colors)); - worldInfo.add(message); + contents.add(parseHeader("More World Settings")); + contents.add(String.format("World UID: %s%s", ChatColor.WHITE, world.getCBWorld().getUID())); + contents.add(String.format("World Type: %s%s", ChatColor.WHITE, world.getWorldType().toString())); + contents.add(String.format("World Scale: %s%s", ChatColor.WHITE, world.getScaling())); + contents.add(String.format("Generator: %s%s", ChatColor.WHITE, world.getGenerator())); + contents.add(String.format("Structures: %s%s", ChatColor.WHITE, world.getCBWorld().canGenerateStructures())); + contents.add(String.format("Weather: %s%s", ChatColor.WHITE, world.isWeatherEnabled())); + contents.add(String.format("Players will get hungry: %s%s", ChatColor.WHITE, world.getHunger())); + contents.add(String.format("Keep spawn in memory: %s%s", ChatColor.WHITE, world.isKeepingSpawnInMemory())); + contents.add(ContentDisplay.LINE_BREAK); + // Page 3 - message = new ArrayList(); - message.add(new FancyHeader("Monster Settings", colors)); - message.add(new FancyMessage("Multiverse Setting: ", world.canMonstersSpawn() + "", colors)); - message.add(new FancyMessage("Bukkit Setting: ", world.getCBWorld().getAllowMonsters() + "", colors)); - if (world.getMonsterList().size() > 0) { - if (world.canMonstersSpawn()) { - message.add(new FancyMessage("Monsters that" + ChatColor.RED + " CAN NOT " - + ChatColor.GREEN + "spawn: ", toCommaSeperated(world.getMonsterList()), colors)); - } else { - message.add(new FancyMessage("Monsters that" + ChatColor.GREEN + " CAN SPAWN: ", toCommaSeperated(world.getMonsterList()), colors)); - } - } else { - message.add(new FancyMessage("Monsters that CAN spawn: ", world.canMonstersSpawn() ? "ALL" : "NONE", colors)); - } - worldInfo.add(message); + contents.add(parseHeader("PVP Settings")); + contents.add(String.format("Multiverse Setting: %s%s", ChatColor.WHITE, world.isPVPEnabled())); + contents.add(String.format("Bukkit Setting: %s%s", ChatColor.WHITE, world.getCBWorld().getPVP())); + contents.add(ContentDisplay.LINE_BREAK); // Page 4 - message = new ArrayList(); - message.add(new FancyHeader("Animal Settings", colors)); - message.add(new FancyMessage("Multiverse Setting: ", world.canAnimalsSpawn() + "", colors)); - message.add(new FancyMessage("Bukkit Setting: ", world.getCBWorld().getAllowAnimals() + "", colors)); - if (world.getAnimalList().size() > 0) { - if (world.canAnimalsSpawn()) { - message.add(new FancyMessage("Animals that" + ChatColor.RED + " CAN NOT " - + ChatColor.GREEN + "spawn: ", toCommaSeperated(world.getAnimalList()), colors)); - } else { - message.add(new FancyMessage("Animals that" + ChatColor.GREEN + " CAN SPAWN: ", toCommaSeperated(world.getAnimalList()), colors)); - } - } else { - message.add(new FancyMessage("Animals that CAN spawn: ", world.canAnimalsSpawn() ? "ALL" : "NONE", colors)); - } - worldInfo.add(message); + contents.add(parseHeader("Monster Settings")); + contents.add(String.format("Multiverse Setting: %s%s", ChatColor.WHITE, world.canMonstersSpawn())); + contents.add(String.format("Bukkit Setting: %s%s", ChatColor.WHITE, world.getCBWorld().getAllowMonsters())); + contents.add((world.canMonstersSpawn()) + ? String.format("Monsters that %scannot spawn: %s%s", ChatColor.RED, ChatColor.WHITE, toCommaSeparated(world.getMonsterList())) + : String.format("Monsters that %scan spawn: %s%s", ChatColor.GREEN, ChatColor.WHITE, toCommaSeparated(world.getMonsterList()))); + contents.add(ContentDisplay.LINE_BREAK); + + // Page 5 + contents.add(parseHeader("Animal Settings")); + contents.add(String.format("Multiverse Setting: %s%s", ChatColor.WHITE, world.canAnimalsSpawn())); + contents.add(String.format("Bukkit Setting: %s%s", ChatColor.WHITE, world.getCBWorld().getAllowAnimals())); + contents.add((world.canAnimalsSpawn()) + ? String.format("Animals that %scannot spawn: %s%s", ChatColor.RED, ChatColor.WHITE, toCommaSeparated(world.getAnimalList())) + : String.format("Animals that %scan spawn: %s%s", ChatColor.GREEN, ChatColor.WHITE, toCommaSeparated(world.getAnimalList()))); + + return contents; + } - return worldInfo; + private String parseHeader(String header) { + return String.format("%s===[ %s %s]===", ChatColor.AQUA, header, ChatColor.AQUA); } - private static String toCommaSeperated(List list) { + private static String toCommaSeparated(List list) { if (list == null || list.size() == 0) { - return ""; + return ChatColor.GRAY + ChatColor.ITALIC.toString() + "none"; } if (list.size() == 1) { return list.get(0); } - String result = list.get(0); + StringBuilder result = new StringBuilder(list.get(0)); for (int i = 1; i < list.size() - 1; i++) { - result += ", " + list.get(i); + result.append(", ").append(list.get(i)); } - result += " and " + list.get(list.size() - 1); - return result; - } + result.append(" and ").append(list.get(list.size() - 1)); - /** - * Gets a "positive" or "negative" {@link ChatColor}. - * - * @param positive Whether this {@link ChatColor} should be "positive". - * @return The {@link ChatColor}. - */ - protected ChatColor getChatColor(boolean positive) { - return positive ? ChatColor.GREEN : ChatColor.RED; + return result.toString(); } - - private static void showPage(int page, CommandSender sender, List> doc) { - page = page < 0 ? 0 : page; - page = page > doc.size() - 1 ? doc.size() - 1 : page; - boolean altColor = false; - boolean appendedPageNum = false; - if (sender instanceof Player) { - List list = doc.get(page); - for (FancyText fancyT : list) { - if (fancyT instanceof FancyMessage) { - FancyMessage text = (FancyMessage) fancyT; - text.setAltColor(altColor); - altColor = !altColor; - sender.sendMessage(text.getFancyText()); - } else if (fancyT instanceof FancyHeader) { - FancyHeader text = (FancyHeader) fancyT; - if (!appendedPageNum) { - text.appendText(ChatColor.DARK_PURPLE + " [ Page " + (page + 1) + " of " + doc.size() + " ]"); - appendedPageNum = true; - } - sender.sendMessage(text.getFancyText()); - altColor = false; - } - } - - } else { - for (List list : doc) { - for (FancyText fancyT : list) { - if (fancyT instanceof FancyMessage) { - FancyMessage text = (FancyMessage) fancyT; - text.setAltColor(altColor); - altColor = !altColor; - sender.sendMessage(text.getFancyText()); - } else { - FancyText text = fancyT; - if (appendedPageNum) { - sender.sendMessage(" "); - } else { - appendedPageNum = true; - } - sender.sendMessage(text.getFancyText()); - altColor = false; - } - } - } - } - } - } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java index d702bf93e..1acd08d0b 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,124 +7,96 @@ package com.onarandombox.MultiverseCore.commands; +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.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.commandtools.context.PageFilter; +import com.onarandombox.MultiverseCore.displaytools.ColorAlternator; +import com.onarandombox.MultiverseCore.displaytools.ContentDisplay; +import com.onarandombox.MultiverseCore.displaytools.DisplayHandlers; +import com.onarandombox.MultiverseCore.displaytools.DisplaySettings; import org.bukkit.ChatColor; -import org.bukkit.World.Environment; +import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collection; import java.util.List; -/** - * Displays a listing of all worlds that a player can enter. - */ -public class ListCommand extends PaginatedCoreCommand { +@CommandAlias("mv") +public class ListCommand extends MultiverseCoreCommand { public ListCommand(MultiverseCore plugin) { super(plugin); - this.setName("World Listing"); - this.setCommandUsage("/mv list [page]"); - this.setArgRange(0, 2); - this.addKey("mvlist"); - this.addKey("mvl"); - this.addKey("mv list"); - this.setPermission("multiverse.core.list.worlds", "Displays a listing of all worlds that you can enter.", PermissionDefault.OP); - this.setItemsPerPage(8); // SUPPRESS CHECKSTYLE: MagicNumberCheck } - private List getFancyWorldList(Player p) { - List worldList = new ArrayList(); - for (MultiverseWorld world : this.plugin.getMVWorldManager().getMVWorlds()) { + @Subcommand("list") + @CommandPermission("multiverse.core.list.worlds") + @Syntax("[filter] [page]") + @Description("Displays a listing of all worlds that you can enter.") + public void onListCommand(@NotNull CommandSender sender, + + @NotNull PageFilter pageFilter) { + + new ContentDisplay.Builder>() + .sender(sender) + .header("%s====[ Multiverse World List ]====", ChatColor.GOLD) + .contents(getListContents(sender)) + .displayHandler(DisplayHandlers.PAGE_LIST) + .colorTool(ColorAlternator.with(ChatColor.AQUA, ChatColor.GOLD)) + .setting(DisplaySettings.SHOW_PAGE, pageFilter.getPage()) + .display(); + } - if (p != null && (!this.plugin.getMVPerms().canEnterWorld(p, world))) { - continue; - } + private List getListContents(@NotNull CommandSender sender) { + Player player = (sender instanceof Player) ? (Player) sender : null; + List worldList = new ArrayList<>(); - ChatColor color = ChatColor.GOLD; - Environment env = world.getEnvironment(); - if (env == Environment.NETHER) { - color = ChatColor.RED; - } else if (env == Environment.NORMAL) { - color = ChatColor.GREEN; - } else if (env == Environment.THE_END) { - color = ChatColor.AQUA; - } - StringBuilder builder = new StringBuilder(); - builder.append(world.getColoredWorldString()).append(ChatColor.WHITE); - builder.append(" - ").append(color).append(world.getEnvironment()); - if (world.isHidden()) { - if (p == null || this.plugin.getMVPerms().hasPermission(p, "multiverse.core.modify", true)) { - // Prefix hidden worlds with an "[H]" - worldList.add(ChatColor.GRAY + "[H]" + builder.toString()); - } - } else { - worldList.add(builder.toString()); - } - } - for (String name : this.plugin.getMVWorldManager().getUnloadedWorlds()) { - if (p == null || this.plugin.getMVPerms().hasPermission(p, "multiverse.access." + name, true)) { - worldList.add(ChatColor.GRAY + name + " - UNLOADED"); - } - } - return worldList; - } + this.plugin.getMVWorldManager().getMVWorlds().stream() + .filter(world -> player == null || plugin.getMVPerms().canEnterWorld(player, world)) + .filter(world -> canSeeWorld(player, world)) + .map(world -> hiddenText(world) + world.getColoredWorldString() + " - " + parseColouredEnvironment(world.getEnvironment())) + .sorted() + .forEach(worldList::add); - @Override - protected List getFilteredItems(List availableItems, String filter) { - List filtered = new ArrayList(); + this.plugin.getMVWorldManager().getUnloadedWorlds().stream() + .filter(world -> plugin.getMVPerms().hasPermission(sender, "multiverse.access." + world, true)) + .map(world -> ChatColor.GRAY + world + " - UNLOADED") + .sorted() + .forEach(worldList::add); - for (String s : availableItems) { - if (s.matches("(?i).*" + filter + ".*")) { - filtered.add(s); - } - } - return filtered; + return worldList; } - @Override - protected String getItemText(String item) { - return item; + private boolean canSeeWorld(Player player, MultiverseWorld world) { + return !world.isHidden() + || player == null + || this.plugin.getMVPerms().hasPermission(player, "multiverse.core.modify", true); } - @Override - public void runCommand(CommandSender sender, List args) { - sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ Multiverse World List ]===="); - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - - - FilterObject filterObject = this.getPageAndFilter(args); - - List availableWorlds = new ArrayList(this.getFancyWorldList(p)); - if (filterObject.getFilter().length() > 0) { - availableWorlds = this.getFilteredItems(availableWorlds, filterObject.getFilter()); - if (availableWorlds.size() == 0) { - sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE - + "No worlds matched your filter: " + ChatColor.AQUA + filterObject.getFilter()); - return; - } - } - - if (!(sender instanceof Player)) { - for (String c : availableWorlds) { - sender.sendMessage(c); - } - return; - } - - int totalPages = (int) Math.ceil(availableWorlds.size() / (this.itemsPerPage + 0.0)); + private String hiddenText(MultiverseWorld world) { + return (world.isHidden()) ? String.format("%s[H] ", ChatColor.GRAY) : ""; + } - if (filterObject.getPage() > totalPages) { - filterObject.setPage(totalPages); + private String parseColouredEnvironment(World.Environment env) { + ChatColor color = ChatColor.GOLD; + switch (env) { + case NETHER: + color = ChatColor.RED; + break; + case NORMAL: + color = ChatColor.GREEN; + break; + case THE_END: + color = ChatColor.AQUA; + break; } - - sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages); - - this.showPage(filterObject.getPage(), sender, availableWorlds); + return color + env.toString(); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/LoadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/LoadCommand.java index 4a96ef36c..2a40e24db 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/LoadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/LoadCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,36 +7,43 @@ package com.onarandombox.MultiverseCore.commands; +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 com.onarandombox.MultiverseCore.MultiverseCore; -import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.List; - -/** - * Loads a world into Multiverse. - */ -public class LoadCommand extends MultiverseCommand { +@CommandAlias("mv") +public class LoadCommand extends MultiverseCoreCommand { public LoadCommand(MultiverseCore plugin) { super(plugin); - this.setName("Load World"); - this.setCommandUsage("/mv load" + ChatColor.GREEN + " {WORLD}"); - this.setArgRange(1, 1); - this.addKey("mvload"); - this.addKey("mv load"); - this.addCommandExample("/mv load " + ChatColor.GREEN + "MyUnloadedWorld"); - this.setPermission("multiverse.core.load", "Loads a world into Multiverse.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - if (this.plugin.getMVWorldManager().loadWorld(args.get(0))) { - Command.broadcastCommandMessage(sender, "Loaded world '" + args.get(0) + "'!"); - } else { - sender.sendMessage("Error trying to load world '" + args.get(0) + "'!"); + @Subcommand("load") + @CommandPermission("multiverse.core.load") + @Syntax("") + @CommandCompletion("@unloadedWorlds") + @Description("Loads a world. World must be already in worlds.yml, else please use /mv import.") + public void onLoadCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Name of world you want to load.") + @Flags("type=world name") + @Conditions("isUnloadedWorld") String worldName) { + + if (!this.plugin.getMVWorldManager().loadWorld(worldName)) { + sender.sendMessage(String.format("Error trying to load world '%s'!", worldName)); + return; } + Command.broadcastCommandMessage(sender, String.format("Loaded world '%s'!", worldName)); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyAddCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyAddCommand.java deleted file mode 100644 index 1175d3408..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyAddCommand.java +++ /dev/null @@ -1,95 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; -import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.onarandombox.MultiverseCore.enums.Action; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; - -import java.util.List; - -// This will contain all the properties that support the ADD/REMOVE -// Anything not in here will only support the SET action - -/** - * Used to modify various aspects of worlds. - */ -public class ModifyAddCommand extends MultiverseCommand { - private MVWorldManager worldManager; - - public ModifyAddCommand(MultiverseCore plugin) { - super(plugin); - this.setName("Modify a World (Add a value)"); - this.setCommandUsage("/mv modify " + ChatColor.GREEN + "add {VALUE} {PROPERTY}" + ChatColor.GOLD + " [WORLD] "); - this.setArgRange(2, 3); - this.addKey("mvm add"); - this.addKey("mvmadd"); - this.addKey("mv modify add"); - this.addKey("mvmodify add"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "add " + ChatColor.GREEN + "sheep " + ChatColor.RED + "animals"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "add " + ChatColor.GREEN + "creeper " + ChatColor.RED + "monsters"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "add " + ChatColor.GREEN + "MyWorld " + ChatColor.RED + "worldblacklist"); - this.setPermission("multiverse.core.modify.add", "Modify various aspects of worlds. See the help wiki for how to use this command properly. " - + "If you do not include a world, the current world will be used.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); - } - - @Override - public void runCommand(CommandSender sender, List args) { - // We NEED a world from the command line - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - - if (args.size() == 2 && p == null) { - sender.sendMessage(ChatColor.RED + "From the console, WORLD is required."); - sender.sendMessage(this.getCommandDesc()); - sender.sendMessage(this.getCommandUsage()); - sender.sendMessage("Nothing changed."); - return; - } - - MultiverseWorld world; - String value = args.get(0); - String property = args.get(1); - - if (args.size() == 2) { - world = this.worldManager.getMVWorld(p.getWorld().getName()); - } else { - world = this.worldManager.getMVWorld(args.get(2)); - } - - if (world == null) { - sender.sendMessage("That world does not exist!"); - return; - } - - if (!ModifyCommand.validateAction(Action.Add, property)) { - sender.sendMessage("Sorry, you can't ADD to " + property); - sender.sendMessage("Please visit our Github Wiki for more information: https://goo.gl/OMGwzx"); - return; - } - - // TODO fix this - if (world.addToVariable(property, value)) { - sender.sendMessage(ChatColor.GREEN + "Success! " + ChatColor.AQUA - + value + ChatColor.WHITE + " was " + ChatColor.GREEN + "added to " + ChatColor.GREEN + property); - if (!plugin.saveWorldConfig()) { - sender.sendMessage(ChatColor.RED + "There was an issue saving worlds.yml! Your changes will only be temporary!"); - } - } else { - sender.sendMessage(value + " could not be added to " + property); - } - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyClearCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyClearCommand.java deleted file mode 100644 index 788b7452b..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyClearCommand.java +++ /dev/null @@ -1,92 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; -import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.onarandombox.MultiverseCore.enums.Action; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; - -import java.util.List; - -/** - * Removes all values from a world-property. - */ -public class ModifyClearCommand extends MultiverseCommand { - private MVWorldManager worldManager; - - public ModifyClearCommand(MultiverseCore plugin) { - super(plugin); - this.setName("Modify a World (Clear a property)"); - this.setCommandUsage("/mv modify" + ChatColor.GREEN + " clear {PROPERTY}" + ChatColor.GOLD + " [WORLD]"); - this.setArgRange(1, 2); - this.addKey("mvm clear"); - this.addKey("mvmclear"); - this.addKey("mv modify clear"); - this.addKey("mvmodify clear"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "clear " + ChatColor.RED + "animals"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "clear " + ChatColor.RED + "monsters"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "clear " + ChatColor.RED + "worldblacklist"); - this.setPermission("multiverse.core.modify.clear", - "Removes all values from a property. This will work on properties that contain lists.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); - } - - @Override - public void runCommand(CommandSender sender, List args) { - // We NEED a world from the command line - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - if (args.size() == 1 && p == null) { - sender.sendMessage(ChatColor.RED + "From the console, WORLD is required."); - sender.sendMessage(this.getCommandDesc()); - sender.sendMessage(this.getCommandUsage()); - sender.sendMessage("Nothing changed."); - return; - } - - MultiverseWorld world; - String property = args.get(0); - - if (args.size() == 1) { - world = this.worldManager.getMVWorld(p.getWorld().getName()); - } else { - world = this.worldManager.getMVWorld(args.get(1)); - } - - if (world == null) { - sender.sendMessage("That world does not exist!"); - return; - } - - if (!ModifyCommand.validateAction(Action.Clear, property)) { - sender.sendMessage("Sorry, you can't use CLEAR with " + property); - sender.sendMessage("Please visit our Github Wiki for more information: https://goo.gl/q1h01S"); - return; - } - // TODO fix this - if (world.clearList(property)) { - sender.sendMessage(property + " was cleared. It contains 0 values now."); - sender.sendMessage(ChatColor.GREEN + "Success! " + ChatColor.AQUA + property + ChatColor.WHITE + " was " - + ChatColor.GREEN + "CLEARED" + ChatColor.WHITE + ". It contains " + ChatColor.LIGHT_PURPLE + "0" + ChatColor.WHITE + " values now."); - if (!plugin.saveWorldConfig()) { - sender.sendMessage(ChatColor.RED + "There was an issue saving worlds.yml! Your changes will only be temporary!"); - } - } else { - sender.sendMessage(ChatColor.RED + "Error: " + ChatColor.GOLD + property - + ChatColor.WHITE + " was " + ChatColor.GOLD + "NOT" + ChatColor.WHITE + " cleared."); - } - } - -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyCommand.java index d8c74ac3d..c56827e1e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,70 +7,228 @@ package com.onarandombox.MultiverseCore.commands; +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.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 com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.enums.Action; -import com.onarandombox.MultiverseCore.enums.AddProperties; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseCore.displaytools.ContentDisplay; +import com.onarandombox.MultiverseCore.displaytools.ContentFilter; +import com.onarandombox.MultiverseCore.displaytools.DisplayHandlers; +import com.onarandombox.MultiverseCore.enums.EnglishChatColor; +import com.onarandombox.MultiverseCore.exceptions.PropertyDoesNotExistException; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; +import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; -/** - * Used to modify various aspects of worlds. - */ -public class ModifyCommand extends MultiverseCommand { +@CommandAlias("mv") +@Subcommand("modify") +//TODO API: Think why properties method for MultiverseWorld is deprecated. +public class ModifyCommand extends MultiverseCoreCommand { public ModifyCommand(MultiverseCore plugin) { super(plugin); - this.setName("Modify a World"); - this.setCommandUsage("/mv modify" + ChatColor.GREEN + " {set|add|remove|clear} ..."); - this.setArgRange(2, 3); - this.addKey("mvm"); - this.addKey("mvmodify"); - this.addKey("mv modify"); - Map children = new HashMap(); - children.put("multiverse.core.modify.add", true); - children.put("multiverse.core.modify.modify", true); - children.put("multiverse.core.modify.clear", true); - children.put("multiverse.core.modify.remove", true); - Permission modify = new Permission("multiverse.core.modify", - "Modify various aspects of worlds. It requires add/set/clear/remove. See the examples below", PermissionDefault.OP, children); - this.addCommandExample(ChatColor.AQUA + "/mv modify set ?"); - this.addCommandExample(ChatColor.GREEN + "/mv modify add ?"); - this.addCommandExample(ChatColor.BLUE + "/mv modify clear ?"); - this.addCommandExample(ChatColor.RED + "/mv modify remove ?"); - this.setPermission(modify); } - /** - * Validates the specified action. - * - * @param action The {@link Action}. - * @param property The property. - * @return Whether this action is valid. - */ - protected static boolean validateAction(Action action, String property) { - if (action != Action.Set) { + @Subcommand("set") + @CommandPermission("multiverse.core.modify.set") + @Syntax(" [world]") + @CommandCompletion("@setProperties @empty @MVWorlds") + @Description("Modify various aspects of worlds by setting a property. For more info; https://tinyurl.com/nehhzp6") + public void onModifySetCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Property option key.") + @Flags("type=property") + @Conditions("validAddProperty:set") String property, + + @NotNull + @Syntax("") + @Description("New property value.") + @Flags("type=property value") String value, + + @NotNull + @Syntax("[world]") + @Description("World that you want property change to apply.") + @Flags("other,defaultself") MultiverseWorld world) { + + if ((property.equalsIgnoreCase("aliascolor") + || property.equalsIgnoreCase("color")) + && !EnglishChatColor.isValidAliasColor(value)) { + sender.sendMessage(String.format("%s'%s' is not a valid color. Please pick one of the following:", + ChatColor.RED, value)); + sender.sendMessage(EnglishChatColor.getAllColors()); + return; + } + + try { + if (!world.setPropertyValue(property, value)) { + sender.sendMessage(ChatColor.RED + world.getPropertyHelp(property)); + return; + } + } + catch (PropertyDoesNotExistException e) { + sender.sendMessage(String.format("%sSorry, You can't set '%s%s%s'!", ChatColor.RED, ChatColor.GRAY, property, ChatColor.RED)); + sender.sendMessage(String.format("Valid world-properties: %s", world.getAllPropertyNames())); + return; + } + + sender.sendMessage(String.format("%sSuccess! %sProperty %s%s %swas set to %s%s%s.", + ChatColor.GREEN, ChatColor.WHITE, ChatColor.AQUA, property, ChatColor.WHITE, ChatColor.GREEN, value, ChatColor.WHITE)); + saveWorldConfig(); + } + + @Subcommand("add") + @CommandPermission("multiverse.core.modify.add") + @Syntax(" [world]") + @CommandCompletion("@addProperties @empty @MVWorlds") + @Description("Modify various aspects of worlds by adding a property. For more info: https://tinyurl.com/nehhzp6") + public void onModifyAddCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Property option key.") + @Flags("type=property") + @Conditions("validAddProperty:add") String property, + + @NotNull + @Syntax("") + @Description("Property value to add.") + @Flags("type=property value") String value, + + @NotNull + @Syntax("[world]") + @Description("World that you want property change to apply.") + @Flags("other,defaultself") MultiverseWorld world) { + + if (!world.addToVariable(property, value)) { + sender.sendMessage(String.format("%s %scould not be added to %s%s%s.", + value, ChatColor.RED, ChatColor.AQUA, property, ChatColor.RED)); + return; + } + + sender.sendMessage(String.format("%sSuccess! %s%s%s was added to %s%s%s.", + ChatColor.GREEN, ChatColor.AQUA, value, ChatColor.WHITE, ChatColor.GREEN, property, ChatColor.WHITE)); + + saveWorldConfig(); + } + + @Subcommand("remove") + @CommandPermission("multiverse.core.modify.remove") + @Syntax(" [world]") + @CommandCompletion("@addProperties @empty @MVWorlds") + @Description("Modify various aspects of worlds by removing a property. For more info: https://tinyurl.com/nehhzp6") + public void onModifyRemoveCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Property option key.") + @Flags("type=property") + @Conditions("validAddProperty:remove") String property, + + @NotNull + @Syntax("") + @Description("Property value to remove.") + @Flags("type=property value") String value, + + @NotNull + @Syntax("[world]") + @Description("World that you want property change to apply.") + @Flags("other,defaultself") MultiverseWorld world) { + + if (!world.removeFromVariable(property, value)) { + sender.sendMessage(String.format("%sThere was an error removing %s%s%s from %s%s%s!", + ChatColor.RED, ChatColor.GRAY, value, ChatColor.RED, ChatColor.GRAY, property, ChatColor.RED)); + return; + } + + sender.sendMessage(String.format("%sSuccess! %s%s%s was %sremoved %sfrom %s%s%s.", + ChatColor.GREEN, ChatColor.AQUA, value, ChatColor.WHITE, ChatColor.RED, ChatColor.WHITE, ChatColor.GREEN, property, ChatColor.WHITE)); + + saveWorldConfig(); + } + + @Subcommand("clear") + @CommandPermission("multiverse.core.modify.clear") + @Syntax(" [world]") + @CommandCompletion("@addProperties @empty @MVWorlds") + @Description("Modify various aspects of worlds by clearing a property. For more info: https://tinyurl.com/nehhzp6") + public void onModifyClearCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("Property option key.") + @Flags("type=property") @Conditions("validAddProperty:clear") String property, + + @NotNull + @Syntax("[world]") + @Description("World that you want property be cleared.") + @Flags("other,defaultself") MultiverseWorld world) { + + if (!world.clearList(property)) { + sender.sendMessage(String.format("%sThere was an error clearing %s%s%s.", + ChatColor.RED, ChatColor.GOLD, property, ChatColor.RED)); + } + + sender.sendMessage(String.format("%s%s%s was cleared. It contains 0 values now.", + ChatColor.GOLD, property, ChatColor.WHITE)); + + saveWorldConfig(); + } + + @Subcommand("list") + @CommandPermission("multiverse.core.modify.list") + @Syntax("[world] [filter]") + @CommandCompletion("@MVWorlds") + @Description("Show properties available to set.") + public void onModifyListCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("[world]") + @Description("World that you want to see current property values set.") + @Flags("other,defaultself,fallbackself") MultiverseWorld world, + + @NotNull ContentFilter filter) { + + new ContentDisplay.Builder>() + .sender(sender) + .header("%s===[ Property Values for %s%s ]===", ChatColor.GOLD, world.getColoredWorldString(), ChatColor.GOLD) + .contents(generateModifyList(world)) + .emptyMessage("No properties found.") + .displayHandler(DisplayHandlers.INLINE_MAP) + .filter(filter) + .display(); + } + + private Map generateModifyList(MultiverseWorld world) { + Collection properties = world.getAllPropertyTypes(); + Map propMap = new HashMap<>(properties.size()); + for (String property : properties) { + String value; try { - AddProperties.valueOf(property); - return true; - } catch (IllegalArgumentException e) { - return false; + value = world.getPropertyValue(property); + } catch (PropertyDoesNotExistException ignored) { + value = String.format("%s!!INAVLID!!", ChatColor.RED); } + propMap.put(property, value); } - return false; + return propMap; } - @Override - public void runCommand(CommandSender sender, List args) { - // This is just a place holder. The real commands are in: - // ModifyAddCommand - // ModifyRemoveCommand - // ModifySetCommand - // ModifyClearCommand + private void saveWorldConfig() { + if (!this.plugin.saveWorldConfig()) { + throw new InvalidCommandArgument("There was an issue saving worlds.yml! Your changes will only be temporary.", false); + } } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyRemoveCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyRemoveCommand.java deleted file mode 100644 index f714be763..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifyRemoveCommand.java +++ /dev/null @@ -1,97 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; -import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.onarandombox.MultiverseCore.enums.Action; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; - -import java.util.List; - -/** - * Removes values from a world-property. - */ -public class ModifyRemoveCommand extends MultiverseCommand { - private MVWorldManager worldManager; - - public ModifyRemoveCommand(MultiverseCore plugin) { - super(plugin); - this.setName("Modify a World (Remove a value)"); - this.setCommandUsage("/mv modify" + ChatColor.GREEN + " remove {PROPERTY} {VALUE}" + ChatColor.GOLD + " [WORLD]"); - this.setArgRange(2, 3); - this.addKey("mvm remove"); - this.addKey("mvmremove"); - this.addKey("mv modify remove"); - this.addKey("mvmodify remove"); - this.addKey("mvm delete"); - this.addKey("mvmdelete"); - this.addKey("mv modify delete"); - this.addKey("mvmodify delete"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "remove " + ChatColor.GREEN + "sheep " + ChatColor.RED + "animals"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "remove " + ChatColor.GREEN + "creeper " + ChatColor.RED + "monsters"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "remove " + ChatColor.GREEN + "MyWorld " + ChatColor.RED + "worldblacklist"); - this.setPermission("multiverse.core.modify.remove", "Modify various aspects of worlds. See the help wiki for how to use this command properly. " - + "If you do not include a world, the current world will be used.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); - } - - @Override - public void runCommand(CommandSender sender, List args) { - // We NEED a world from the command line - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - - if (args.size() == 2 && p == null) { - sender.sendMessage(ChatColor.RED + "From the console, WORLD is required."); - sender.sendMessage(this.getCommandDesc()); - sender.sendMessage(this.getCommandUsage()); - sender.sendMessage("Nothing changed."); - return; - } - - MultiverseWorld world; - String value = args.get(0); - String property = args.get(1); - - if (args.size() == 2) { - world = this.worldManager.getMVWorld(p.getWorld().getName()); - } else { - world = this.worldManager.getMVWorld(args.get(2)); - } - - if (world == null) { - sender.sendMessage("That world does not exist!"); - return; - } - - if (!ModifyCommand.validateAction(Action.Remove, property)) { - sender.sendMessage("Sorry, you can't REMOVE anything from" + property); - sender.sendMessage("Please visit our Github Wiki for more information: https://goo.gl/OMGwzx"); - return; - } - // TODO fix this - if (world.removeFromVariable(property, value)) { - sender.sendMessage(ChatColor.GREEN + "Success! " + ChatColor.AQUA + value + ChatColor.WHITE - + " was " + ChatColor.RED + "removed from " + ChatColor.GREEN + property); - if (!plugin.saveWorldConfig()) { - sender.sendMessage(ChatColor.RED + "There was an issue saving worlds.yml! Your changes will only be temporary!"); - } - } else { - sender.sendMessage(ChatColor.RED + "There was an error removing " + ChatColor.GRAY - + value + ChatColor.WHITE + " from " + ChatColor.GOLD + property); - } - } - -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifySetCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ModifySetCommand.java deleted file mode 100644 index 54bf8a11e..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ModifySetCommand.java +++ /dev/null @@ -1,125 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; -import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.onarandombox.MultiverseCore.enums.EnglishChatColor; -import com.onarandombox.MultiverseCore.exceptions.PropertyDoesNotExistException; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; - -import java.util.List; - -/** - * Used to set world-properties. - */ -public class ModifySetCommand extends MultiverseCommand { - private MVWorldManager worldManager; - - public ModifySetCommand(MultiverseCore plugin) { - super(plugin); - this.worldManager = this.plugin.getMVWorldManager(); - this.setName("Modify a World (Set a value)"); - this.setCommandUsage("/mv modify" + ChatColor.GREEN + " set {PROPERTY} {VALUE}" + ChatColor.GOLD + " [WORLD]"); - this.setArgRange(1, 3); - this.addKey("mvm set"); - this.addKey("mvmset"); - this.addKey("mv modify set"); - this.addKey("mvmodify set"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "mode " + ChatColor.RED + "creative"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "animals " + ChatColor.RED + "false"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "monsters " + ChatColor.RED + "false"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "alias " + ChatColor.RED + "MyWorld"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "color " + ChatColor.RED + "green"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "curr " + ChatColor.RED + "3"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "price " + ChatColor.RED + "5"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "scale " + ChatColor.RED + "1.2"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "memory " + ChatColor.RED + "true"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "diff " + ChatColor.RED + "hard"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "hunger " + ChatColor.RED + "false"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "hidden " + ChatColor.RED + "true"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "pvp " + ChatColor.RED + "false"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "heal " + ChatColor.RED + "true"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "adjustspawn " + ChatColor.RED + "false"); - this.addCommandExample("/mvm " + ChatColor.GOLD + "set " + ChatColor.GREEN + "spawn"); - this.setPermission("multiverse.core.modify.set", "Modify various aspects of worlds. See the help wiki for how to use this command properly. " - + "If you do not include a world, the current world will be used.", PermissionDefault.OP); - } - - @Override - public void runCommand(CommandSender sender, List args) { - // Special case for spawn: - if (args.size() == 1) { - if (!(sender instanceof Player)) { - sender.sendMessage("You must be a player to set the" + ChatColor.GREEN + " spawn"); - return; - } - if (args.get(0).equalsIgnoreCase("spawn")) { - SetSpawnCommand c = new SetSpawnCommand(this.plugin); - c.setWorldSpawn(sender); - - } else { - sender.sendMessage("Spawn is the only param with no" + ChatColor.GREEN + " VALUE"); - sender.sendMessage("Type " + ChatColor.GREEN + "/mv modify ?" + ChatColor.WHITE + " For help."); - } - return; - } - // We NEED a world from the command line - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - - if (args.size() == 2 && p == null) { - sender.sendMessage("From the command line, WORLD is required."); - sender.sendMessage(this.getCommandDesc()); - sender.sendMessage(this.getCommandUsage()); - sender.sendMessage("Nothing changed."); - return; - } - - MultiverseWorld world; - String value = args.get(1); - String property = args.get(0); - - if (args.size() == 2) { - world = this.worldManager.getMVWorld(p.getWorld().getName()); - } else { - world = this.worldManager.getMVWorld(args.get(2)); - } - - if (world == null) { - sender.sendMessage("That world does not exist!"); - return; - } - - if ((property.equalsIgnoreCase("aliascolor") || property.equalsIgnoreCase("color")) && !EnglishChatColor.isValidAliasColor(value)) { - sender.sendMessage(value + " is not a valid color. Please pick one of the following:"); - sender.sendMessage(EnglishChatColor.getAllColors()); - return; - } - try { - if (world.setPropertyValue(property, value)) { - sender.sendMessage(ChatColor.GREEN + "Success!" + ChatColor.WHITE + " Property " + ChatColor.AQUA + property - + ChatColor.WHITE + " was set to " + ChatColor.GREEN + value); - if (!plugin.saveWorldConfig()) { - sender.sendMessage(ChatColor.RED + "There was an issue saving worlds.yml! Your changes will only be temporary!"); - } - } else { - sender.sendMessage(ChatColor.RED + world.getPropertyHelp(property)); - } - } catch (PropertyDoesNotExistException e) { - sender.sendMessage(ChatColor.RED + "Sorry, You can't set: '" + ChatColor.GRAY + property + ChatColor.RED + "'"); - sender.sendMessage("Valid world-properties: " + world.getAllPropertyNames()); - } - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/MultiverseCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/MultiverseCommand.java deleted file mode 100644 index ae54a9b8f..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/MultiverseCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MultiverseMessaging; -import com.pneumaticraft.commandhandler.Command; -import org.bukkit.command.CommandSender; - -import java.util.List; - -/** - * A generic Multiverse-command. - */ -public abstract class MultiverseCommand extends Command { - - /** - * The reference to the core. - */ - protected MultiverseCore plugin; - /** - * The reference to {@link MultiverseMessaging}. - */ - protected MultiverseMessaging messaging; - - public MultiverseCommand(MultiverseCore plugin) { - super(plugin); - this.plugin = plugin; - this.messaging = this.plugin.getMessaging(); - } - - @Override - public abstract void runCommand(CommandSender sender, List args); - -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCoreCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/MultiverseCoreCommand.java similarity index 58% rename from src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCoreCommand.java rename to src/main/java/com/onarandombox/MultiverseCore/commands/MultiverseCoreCommand.java index 7071311aa..5978f4df5 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCoreCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/MultiverseCoreCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -8,19 +8,13 @@ package com.onarandombox.MultiverseCore.commands; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.commandtools.MultiverseCommand; -/** - * A generic paginated Multiverse-command. - * @param The type of items on the page. - */ -public abstract class PaginatedCoreCommand extends PaginatedCommand { - /** - * The reference to the core. - */ - protected MultiverseCore plugin; +public abstract class MultiverseCoreCommand extends MultiverseCommand { - public PaginatedCoreCommand(MultiverseCore plugin) { - super(plugin); + protected final MultiverseCore plugin; + + protected MultiverseCoreCommand(MultiverseCore plugin) { this.plugin = plugin; } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java deleted file mode 100644 index c3ddf09ba..000000000 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java +++ /dev/null @@ -1,164 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.commands; - -import com.pneumaticraft.commandhandler.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.List; - -/** - * A generic paginated command. - * @param The type of items on the page. - */ -public abstract class PaginatedCommand extends Command { - private static final int DEFAULT_ITEMS_PER_PAGE = 9; - /** - * The number of items per page. - */ - protected int itemsPerPage = DEFAULT_ITEMS_PER_PAGE; - - public PaginatedCommand(JavaPlugin plugin) { - super(plugin); - } - - /** - * Set the number of items per page. - * - * @param items The new number of items per page. - */ - protected void setItemsPerPage(int items) { - itemsPerPage = items; - } - - /** - * Gets filtered items. - * @param availableItems All available items. - * @param filter The filter-{@link String}. - * @return A list of items that match the filter. - */ - protected abstract List getFilteredItems(List availableItems, String filter); - - /** - * Constructs a single string from a list of strings. - * - * @param list The {@link List} of strings. - * @return A single {@link String}. - */ - protected String stitchThisString(List list) { - StringBuilder builder = new StringBuilder(); - for (String s : list) { - builder.append(s); - builder.append(' '); - } - return builder.toString(); - } - - /** - * Shows a page. - * - * @param page The number of the page to show. - * @param sender The {@link CommandSender} that wants to see the page. - * @param cmds The items that should be displayed on the page. - */ - protected void showPage(int page, CommandSender sender, List cmds) { - // Ensure the page is at least 1. - page = (page <= 0) ? 1 : page; - int start = (page - 1) * itemsPerPage; - int end = start + itemsPerPage; - - for (int i = start; i < end; i++) { - // For consistancy, print some extra lines if it's a player: - if (i < cmds.size()) { - sender.sendMessage(this.getItemText(cmds.get(i))); - } else if (sender instanceof Player) { - sender.sendMessage(" "); - } - } - } - - /** - * Converts an item into a string. - * - * @param item The item. - * @return A {@link String}. - */ - protected abstract String getItemText(T item); - - /** - * Constructs a {@link FilterObject} from a {@link List} of arguments. - * - * @param args The {@link List} of arguments. - * @return The {@link FilterObject}. - */ - protected FilterObject getPageAndFilter(List args) { - int page = 1; - - String filter = ""; - - if (args.size() == 0) { - filter = ""; - page = 1; - } else if (args.size() == 1) { - try { - page = Integer.parseInt(args.get(0)); - } catch (NumberFormatException ex) { - filter = args.get(0); - page = 1; - } - } else if (args.size() == 2) { - filter = args.get(0); - try { - page = Integer.parseInt(args.get(1)); - } catch (NumberFormatException ex) { - page = 1; - } - } - return new FilterObject(page, filter); - } - - /** - * "Key-Object" containing information about the page and the filter that were requested. - */ - protected class FilterObject { - private Integer page; - private String filter; - - public FilterObject(Integer page, String filter) { - this.page = page; - this.filter = filter; - } - - /** - * Gets the page. - * @return The page. - */ - public Integer getPage() { - return this.page; - } - - /** - * Sets the page. - * - * @param page The new page. - */ - public void setPage(int page) { - this.page = page; - } - - /** - * Gets the filter. - * @return The filter. - */ - public String getFilter() { - return this.filter; - } - } -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/PurgeCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/PurgeCommand.java index 8b7c4a26c..571edf0ae 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/PurgeCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/PurgeCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,86 +7,77 @@ package com.onarandombox.MultiverseCore.commands; +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.Split; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MultiverseWorld; -import com.onarandombox.MultiverseCore.api.WorldPurger; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; -/** - * Removes a type of mob from a world. - */ -public class PurgeCommand extends MultiverseCommand { - private MVWorldManager worldManager; +@CommandAlias("mv") +public class PurgeCommand extends MultiverseCoreCommand { public PurgeCommand(MultiverseCore plugin) { super(plugin); - this.setName("Purge World of Creatures"); - this.setCommandUsage("/mv purge" + ChatColor.GOLD + " [WORLD|all] " + ChatColor.GREEN + "{all|animals|monsters|MOBNAME}"); - this.setArgRange(1, 2); - this.addKey("mvpurge"); - this.addKey("mv purge"); - this.addCommandExample("/mv purge " + ChatColor.GREEN + "all"); - this.addCommandExample("/mv purge " + ChatColor.GOLD + "all " + ChatColor.GREEN + "all"); - this.addCommandExample("/mv purge " + ChatColor.GREEN + "monsters"); - this.addCommandExample("/mv purge " + ChatColor.GOLD + "all " + ChatColor.GREEN + "animals"); - this.addCommandExample("/mv purge " + ChatColor.GOLD + "MyWorld " + ChatColor.GREEN + "squid"); - this.addCommandExample("/mv purge " + ChatColor.GOLD + "MyWorld_nether " + ChatColor.GREEN + "ghast"); - this.setPermission("multiverse.core.purge", "Removed the specified type of mob from the specified world.", PermissionDefault.OP); - this.worldManager = this.plugin.getMVWorldManager(); } - @Override - public void runCommand(CommandSender sender, List args) { - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - if (args.size() == 1 && p == null) { - sender.sendMessage("This command requires a WORLD when being run from the console!"); - sender.sendMessage(this.getCommandUsage()); - return; - } - String worldName = null; - String deathName = null; - if (args.size() == 1) { - worldName = p.getWorld().getName(); - deathName = args.get(0); - } else { - worldName = args.get(0); - deathName = args.get(1); - } + @Subcommand("purgeall") + @CommandPermission("multiverse.core.purge.all") + @Syntax("") + @CommandCompletion("all|animals|monsters|@livingEntities") + @Description("Removed the specified type of mob from all worlds.") + public void onPurgeAllCommand(@NotNull CommandSender sender, - if (!worldName.equalsIgnoreCase("all") && !this.worldManager.isMVWorld(worldName)) { - this.plugin.showNotMVWorldMessage(sender, worldName); - sender.sendMessage("It cannot be purged."); - return; - } + @NotNull + @Syntax("") + @Description("Entity types that you want to remove from all worlds.") + @Split(",") String[] targetEntities) { - List worldsToRemoveEntitiesFrom = new ArrayList(); - // Handle all case any user who names a world "all" should know better... - if (worldName.equalsIgnoreCase("all")) { - worldsToRemoveEntitiesFrom.addAll(this.worldManager.getMVWorlds()); - } else { - worldsToRemoveEntitiesFrom.add(this.worldManager.getMVWorld(worldName)); - } + doPurge(sender, this.plugin.getMVWorldManager().getMVWorlds(), targetEntities); + } + + @Subcommand("purge") + @CommandPermission("multiverse.core.purge") + @Syntax("") + @CommandCompletion("@MVWorlds|all|animals|monsters|@livingEntities all|animals|monsters|@livingEntities") + @Description("Removed the specified type of mob from the specified world.") + public void onPurgeCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("[world]") + @Description("World that you want to remove entities.") + @Flags("other,defaultself,fallbackself") MultiverseWorld world, + + @NotNull + @Syntax("") + @Description("Entity types that you want to remove from a world.") + @Split(",") String[] targetEntities) { + + doPurge(sender, Collections.singleton(world), targetEntities); + } + + private void doPurge(@NotNull CommandSender sender, + @NotNull Collection targetWorlds, + @NotNull String[] targetEntities) { + + List thingsToKill = Arrays.stream(targetEntities) + .map(String::toUpperCase) + .collect(Collectors.toList()); - WorldPurger purger = this.worldManager.getTheWorldPurger(); - ArrayList thingsToKill = new ArrayList(); - if (deathName.equalsIgnoreCase("all") || deathName.equalsIgnoreCase("animals") || deathName.equalsIgnoreCase("monsters")) { - thingsToKill.add(deathName.toUpperCase()); - } else { - Collections.addAll(thingsToKill, deathName.toUpperCase().split(",")); - } - for (MultiverseWorld w : worldsToRemoveEntitiesFrom) { - purger.purgeWorld(w, thingsToKill, false, false, sender); - } + targetWorlds.forEach(w -> this.plugin.getMVWorldManager() + .getTheWorldPurger() + .purgeWorld(w, thingsToKill, false, false, sender)); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java index c93e36a70..657c521fc 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/RegenCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,47 +7,75 @@ package com.onarandombox.MultiverseCore.commands; +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 com.onarandombox.MultiverseCore.commandtools.flag.FlagGroup; +import com.onarandombox.MultiverseCore.commandtools.flag.FlagResult; +import com.onarandombox.MultiverseCore.commandtools.flag.CoreFlags; +import com.onarandombox.MultiverseCore.commandtools.queue.QueuedCommand; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; - -/** - * Regenerates a world. - */ -public class RegenCommand extends MultiverseCommand { +@CommandAlias("mv") +public class RegenCommand extends MultiverseCoreCommand { public RegenCommand(MultiverseCore plugin) { super(plugin); - this.setName("Regenerates a World"); - this.setCommandUsage("/mv regen" + ChatColor.GREEN + " {WORLD}" + ChatColor.GOLD + " [-s [SEED]]"); - this.setArgRange(1, 3); - this.addKey("mvregen"); - this.addKey("mv regen"); - this.addCommandExample("You can use the -s with no args to get a new seed:"); - this.addCommandExample("/mv regen " + ChatColor.GREEN + "MyWorld" + ChatColor.GOLD + " -s"); - this.addCommandExample("or specifiy a seed to get that one:"); - this.addCommandExample("/mv regen " + ChatColor.GREEN + "MyWorld" + ChatColor.GOLD + " -s" + ChatColor.AQUA + " gargamel"); - this.setPermission("multiverse.core.regen", "Regenerates a world on your server. The previous state will be lost " - + ChatColor.RED + "PERMANENTLY.", PermissionDefault.OP); + this.setFlagGroup(FlagGroup.of(CoreFlags.RANDOM_SEED)); } - @Override - public void runCommand(CommandSender sender, List args) { - Boolean useseed = (!(args.size() == 1)); - Boolean randomseed = (args.size() == 2 && args.get(1).equalsIgnoreCase("-s")); - String seed = (args.size() == 3) ? args.get(2) : ""; - - Class[] paramTypes = {String.class, Boolean.class, Boolean.class, String.class}; - List objectArgs = new ArrayList(); - objectArgs.add(args.get(0)); - 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!"); + @Subcommand("regen") + @CommandPermission("multiverse.core.regen") + @Syntax(" [-s [seed]]") + @CommandCompletion("@MVWorlds @worldFlags:-s") + @Description("Regenerates a world on your server. The previous state will be lost PERMANENTLY.") + public void onRegenCommand(@NotNull CommandSender sender, + + @NotNull + @Syntax("") + @Description("World that you want to regen.") + @Flags("other") MultiverseWorld world, + + @Nullable + @Syntax("[-s [seed]]") + @Description("Other world settings. See: http://gg.gg/nn8lk") + String[] flagsArray) { + + FlagResult flags = this.getFlagGroup().calculateResult(flagsArray); + + this.plugin.getMVCommandManager().getQueueManager().addToQueue(new QueuedCommand.Builder() + .sender(sender) + .action(regenRunnable(sender, world, flags)) + .prompt("Are you sure you want to regen world '%s'?", world.getColoredWorldString()) + .build() + ); + } + + private Runnable regenRunnable(@NotNull CommandSender sender, + @NotNull MultiverseWorld world, + @NotNull FlagResult flags) { + + return () -> { + sender.sendMessage(String.format("Regening world '%s'...", world.getName())); + + //TODO: API should allow regen of unloaded worlds. + sender.sendMessage((this.plugin.getMVWorldManager().regenWorld( + world.getName(), + !flags.isDefaulted(CoreFlags.RANDOM_SEED), + !flags.isByUserInput(CoreFlags.RANDOM_SEED), + flags.getValue(CoreFlags.RANDOM_SEED)) + ) + ? String.format("%sWorld Regenerated!", ChatColor.GREEN) + : String.format("%sWorld could not be regenerated!", ChatColor.RED)); + }; } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ReloadCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ReloadCommand.java index abe2b0a64..8fc880a9f 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ReloadCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ReloadCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,52 +7,44 @@ package com.onarandombox.MultiverseCore.commands; +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.event.MVConfigReloadEvent; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -/** - * Reloads worlds.yml and config.yml. - */ -public class ReloadCommand extends MultiverseCommand { +@CommandAlias("mv") +public class ReloadCommand extends MultiverseCoreCommand { - public ReloadCommand(MultiverseCore plugin) { + public ReloadCommand(@NotNull MultiverseCore plugin) { super(plugin); - this.setName("Reload Configs"); - this.setCommandUsage("/mv reload"); - this.setArgRange(0, 0); - this.addKey("mvreload"); - this.addKey("mvr"); - this.addKey("mv reload"); - this.addCommandExample("/mv reload"); - this.setPermission("multiverse.core.reload", "Reloads worlds.yml and config.yml.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { + @Subcommand("reload") + @CommandPermission("multiverse.core.reload") + @Description("Reloads config files for all multiverse modules.") + public void onReloadCommand(@NotNull 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(); + List configsLoaded = new ArrayList<>(); configsLoaded.add("Multiverse-Core - config.yml"); configsLoaded.add("Multiverse-Core - worlds.yml"); configsLoaded.add("Multiverse-Core - anchors.yml"); - // Create the event + MVConfigReloadEvent configReload = new MVConfigReloadEvent(configsLoaded); - // Fire it off this.plugin.getServer().getPluginManager().callEvent(configReload); - for (String s : configReload.getAllConfigsLoaded()) { - sender.sendMessage(s); - } - sender.sendMessage(ChatColor.GREEN + "Reload Complete!"); + configReload.getAllConfigsLoaded().forEach(sender::sendMessage); + sender.sendMessage(String.format("%sReload Complete!", ChatColor.GREEN)); } - } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/RemoveCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/RemoveCommand.java index ff24e7408..1019930b4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/RemoveCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/RemoveCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,36 +7,43 @@ package com.onarandombox.MultiverseCore.commands; +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.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 org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; -import java.util.List; - -/** - * Unloads a world and removes it from the config. - */ -public class RemoveCommand extends MultiverseCommand { +@CommandAlias("mv") +public class RemoveCommand extends MultiverseCoreCommand { public RemoveCommand(MultiverseCore plugin) { super(plugin); - this.setName("Remove World"); - this.setCommandUsage("/mv remove" + ChatColor.GREEN + " {WORLD}"); - this.setArgRange(1, 1); - this.addKey("mvremove"); - this.addKey("mv remove"); - this.addCommandExample("/mv remove " + ChatColor.GREEN + "MyWorld"); - this.setPermission("multiverse.core.remove", - "Unloads a world from Multiverse and removes it from worlds.yml, this does NOT DELETE the world folder.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - if (this.plugin.getMVWorldManager().removeWorldFromConfig(args.get(0))) { - sender.sendMessage("World removed from config!"); - } else { - sender.sendMessage("Error trying to remove world from config!"); - } + @Subcommand("remove") + @CommandPermission("multiverse.core.remove") + @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 + @Syntax("") + @Description("World you want to remove from mv's knowledge.") + @Flags("type=world name") + @Conditions("isWorldInConfig") + @Single String worldName) { + + sender.sendMessage((this.plugin.getMVWorldManager().removeWorldFromConfig(worldName)) + ? String.format("World '%s' is removed from config!", worldName) + : String.format("%sError trying to remove world from config!", ChatColor.RED)); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/RootCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/RootCommand.java new file mode 100644 index 000000000..8dd5f7811 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/RootCommand.java @@ -0,0 +1,25 @@ +package com.onarandombox.MultiverseCore.commands; + +import co.aikar.commands.annotation.CommandAlias; +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.displaytools.ColorAlternator; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class RootCommand extends MultiverseCoreCommand { + + public RootCommand(MultiverseCore plugin) { + super(plugin); + } + + @CommandAlias("mv") + public void onRootCommand(@NotNull CommandSender sender) { + this.plugin.getMVCommandManager().showPluginInfo( + sender, + this.plugin.getDescription(), + ColorAlternator.with(ChatColor.GOLD, ChatColor.YELLOW), + "mv" + ); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ScriptCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ScriptCommand.java index 665f6aa71..615d0b7cd 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ScriptCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ScriptCommand.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 Copyright (c) the Multiverse Team 2020. * * Multiverse 2 is licensed under the BSD License. * * For more information please check the README.md file included * * with this project. * @@ -7,52 +7,57 @@ package com.onarandombox.MultiverseCore.commands; +import buscript.Buscript; +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.Description; +import co.aikar.commands.annotation.Subcommand; +import co.aikar.commands.annotation.Syntax; import com.onarandombox.MultiverseCore.MultiverseCore; +import com.onarandombox.MultiverseCore.commandtools.context.RequiredPlayer; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.NotNull; import java.io.File; -import java.util.List; -/** - * States who is in what world. - */ -public class ScriptCommand extends MultiverseCommand { +@CommandAlias("mv") +public class ScriptCommand extends MultiverseCoreCommand { public ScriptCommand(MultiverseCore plugin) { super(plugin); - this.setName("Runs a script."); - this.setCommandUsage("/mv script" + ChatColor.GOLD + " {script} [target]"); - this.setArgRange(1, 2); - this.addKey("mv script"); - this.addKey("mvscript"); - this.addCommandExample(String.format("/mv script %sscript.txt", ChatColor.GOLD)); - this.addCommandExample(String.format("/mv script %stest.txt %ssomeplayer", ChatColor.GOLD, ChatColor.GREEN)); - this.setPermission("multiverse.core.script", "Runs a script.", PermissionDefault.OP); } - @Override - public void runCommand(CommandSender sender, List args) { - if (plugin.getScriptAPI() == null) { - sender.sendMessage("Buscript failed to load while the server was starting. Scripts cannot be run."); - return; + @Subcommand("script") + @CommandPermission("multiverse.core.script") + @Syntax("