From 633299680f823abc119a74d96617909495f16e1d Mon Sep 17 00:00:00 2001 From: pietelite Date: Fri, 29 Jan 2021 15:23:09 -0600 Subject: [PATCH 1/2] Command object formatting, access modifiers, and root command abstraction --- pom.xml | 7 ++ src/main/java/edu/whimc/portals/Main.java | 2 + .../portals/commands/AbstractRootCommand.java | 112 ++++++++++++++++++ .../portals/commands/AbstractSubCommand.java | 52 ++++++-- .../destination/DestinationChange.java | 18 ++- .../destination/DestinationClear.java | 15 ++- .../destination/DestinationCommand.java | 91 +++----------- .../destination/DestinationCreate.java | 17 ++- .../commands/destination/DestinationInfo.java | 17 ++- .../commands/destination/DestinationList.java | 11 +- .../destination/DestinationPurge.java | 22 ++-- .../destination/DestinationRemove.java | 15 ++- .../commands/destination/DestinationSet.java | 15 ++- .../destination/DestinationSetHere.java | 19 ++- .../destination/DestinationTeleport.java | 17 ++- .../commands/portal/PortalCommand.java | 95 ++++----------- .../portals/commands/portal/PortalCreate.java | 22 +++- .../portals/commands/portal/PortalDebug.java | 16 ++- .../portals/commands/portal/PortalInfo.java | 15 ++- .../portals/commands/portal/PortalList.java | 11 +- .../commands/portal/PortalPermission.java | 15 ++- .../portals/commands/portal/PortalPurge.java | 21 ++-- .../portals/commands/portal/PortalRefill.java | 16 ++- .../portals/commands/portal/PortalRemove.java | 17 ++- .../commands/portal/PortalReshape.java | 19 ++- .../commands/portal/PortalSetFiller.java | 20 ++-- .../commands/portal/PortalTeleport.java | 18 ++- .../portals/commands/portal/PortalTool.java | 19 ++- .../portals/listeners/ToolSelectListener.java | 3 +- .../edu/whimc/portals/utils/Messenger.java | 4 +- 30 files changed, 458 insertions(+), 283 deletions(-) create mode 100644 src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java diff --git a/pom.xml b/pom.xml index 3ca6309..20f1642 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,13 @@ 1.14.4-R0.1-SNAPSHOT provided + + + org.jetbrains + annotations + 16.0.2 + provided + diff --git a/src/main/java/edu/whimc/portals/Main.java b/src/main/java/edu/whimc/portals/Main.java index c073766..ccc837a 100644 --- a/src/main/java/edu/whimc/portals/Main.java +++ b/src/main/java/edu/whimc/portals/Main.java @@ -3,6 +3,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import org.bukkit.permissions.Permission; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -21,6 +22,7 @@ public class Main extends JavaPlugin { public static final String PERM_PREFIX = "whimc-portals"; + public static final Material TOOL_MATERIAL = Material.WOODEN_SWORD; private MyConfigManager manager; private static MyConfig portalData; diff --git a/src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java b/src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java new file mode 100644 index 0000000..e77c75a --- /dev/null +++ b/src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java @@ -0,0 +1,112 @@ +package edu.whimc.portals.commands; + +import edu.whimc.portals.utils.Messenger; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * A blank template for any root command within this plugin, designed + * to be the first tier of a two-tier command tree, of which + * {@link AbstractSubCommand}s constitute the second tier. + */ +public abstract class AbstractRootCommand implements CommandExecutor, TabCompleter { + + private final Map subCommands = new HashMap<>(); + + /** + * Register a sub command below this root command. + * + * @param subCommand a sub command + */ + protected final void addSubCommand(final AbstractSubCommand subCommand) { + this.subCommands.put(subCommand.getCommand(), subCommand); + } + + /** + * Get the sub command associated with this name, or null if cannot be found. + * + * @param subCommand the sub command name + * @return the appropriate sub command object, or null if cannot be found + */ + @Nullable + protected final AbstractSubCommand getSubCommand(final String subCommand) { + return subCommands.getOrDefault(subCommand, null); + } + + protected final Set getSubCommandNames() { + return subCommands.keySet(); + } + + /** + * Message a command sender a list of sub commands. + * + * @param sender the command sender + */ + protected final void sendCommands(final CommandSender sender) { + Messenger.msg(sender, Messenger.Message.LINE_COMMAND_LIST.toString()); + subCommands.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .forEachOrdered(e -> Messenger.msg(sender, e.getValue().getHelpLine())); + Messenger.msg(sender, "&7/destination &8- &fList commands for destinations"); + } + + @Override + public final boolean onCommand(@NotNull CommandSender sender, + @NotNull Command cmd, + @NotNull String commandLabel, + String[] args) { + if (args.length == 0){ + sendCommands(sender); + return true; + } + + AbstractSubCommand subCmd = getSubCommand(args[0].toLowerCase()); + if (subCmd == null) { + sendCommands(sender); + return true; + } + + return subCmd.executeSubCommand(sender, args); + } + + @Override + public final List onTabComplete(@NotNull CommandSender sender, + @NotNull Command command, + @NotNull String alias, + String[] args) { + if (args.length == 0) { + return getSubCommandNames().stream().sorted().collect(Collectors.toList()); + } + + if (args.length == 1) { + return getSubCommandNames() + .stream() + .filter(v -> v.startsWith(args[0].toLowerCase())) + .sorted() + .collect(Collectors.toList()); + } + + AbstractSubCommand subCmd = getSubCommand(args[0].toLowerCase()); + if (subCmd == null) { + return null; + } + + if (!sender.hasPermission(subCmd.getPermission()) || args.length > subCmd.getArguments().length) { + return Collections.emptyList(); + } + return subCmd.onTabComplete(sender, args); + } + +} diff --git a/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java b/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java index 68c4bb0..09c11db 100644 --- a/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java +++ b/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -16,6 +17,11 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; +/** + * A blank template for any sub command within this plugin, designed + * to be the second tier of a two-tier command tree, of which + * an {@link AbstractRootCommand} is the root. + */ public abstract class AbstractSubCommand { private static final String PRIMARY = "&7"; @@ -44,17 +50,26 @@ public AbstractSubCommand(Main plugin, String baseCommand, String subCommand) { Bukkit.getPluginManager().addPermission(perm); } - protected void description(String desc) { this.description = desc; } - protected void arguments(String args) { this.arguments = args.split(" "); } - protected void requiresPlayer() { this.requiresPlayer = true; } + protected final void setDescription(String desc) { + this.description = desc; + } - protected List onTabComplete(CommandSender sender, String[] args) { return Arrays.asList(); } + /** + * Parses a single string of arguments into a private array. + * These arguments represents the required format for usage of this sub command. + * + * @param args a single string of space separated arguments + */ + protected final void provideArguments(String args) { + this.arguments = args.split(" "); + } - public List executeOnTabComplete(CommandSender sender, String args[]) { - if (!sender.hasPermission(getPermission()) || args.length > arguments.length) { - return Arrays.asList(); - } - return onTabComplete(sender, args); + protected final void setRequiresPlayer(boolean value) { + this.requiresPlayer = value; + } + + public List onTabComplete(CommandSender sender, String[] args) { + return Collections.emptyList(); } private String formatArg(String arg) { @@ -64,16 +79,25 @@ private String formatArg(String arg) { return PRIMARY + "<" + ACCENT + String.join(SEPARATOR + " | " + ACCENT, options) + PRIMARY + ">"; } + /** + * Formulate the entire command, including both this sub command and its base command. + * + * @return the full command string + */ public String getCommand() { return PRIMARY + "/" + this.baseCommand + " " + SECONDARY + this.subCommand; } + public String getSubCommand() { + return subCommand; + } + public String getUsage() { - String usage = getCommand() + " "; + StringBuilder usage = new StringBuilder(getCommand() + " "); for (String arg : this.arguments) { - usage += formatArg(arg) + " "; + usage.append(formatArg(arg)).append(" "); } - return usage.trim(); + return usage.toString().trim(); } public String getHelpLine() { @@ -88,6 +112,10 @@ public String getDescription() { return this.description; } + public String[] getArguments() { + return this.arguments; + } + protected abstract boolean onCommand(CommandSender sender, String[] args); public boolean executeSubCommand(CommandSender sender, String[] args) { diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java index a208f6d..e348309 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java @@ -11,17 +11,23 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationChange extends AbstractSubCommand { +/** + * Allow a user to change the location of a {@link Destination} + * to ones current position while in the game. + * + * @see DestinationCommand + */ +public final class DestinationChange extends AbstractSubCommand { public DestinationChange(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Sets the location of a destination to your current position"); - super.arguments("destination"); - super.requiresPlayer(); + super.setDescription("Sets the location of a destination to your current position"); + super.provideArguments("destination"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Destination dest = Destination.getDestination(args[0]); if (dest == null) { Messenger.msg(sender, ReplaceMessage.DESTINATION_DOES_NOT_EXIST, args[0]); @@ -34,7 +40,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Destination.getTabCompletedDestinations(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java index 7b2aa47..6ecfaad 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java @@ -10,16 +10,21 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationClear extends AbstractSubCommand { +/** + * Allows a user to remove a {@link edu.whimc.portals.Destination}. + * + * @see DestinationCommand + */ +public final class DestinationClear extends AbstractSubCommand { public DestinationClear(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Removes the destination of a portal"); - super.arguments("portal"); + super.setDescription("Removes the destination of a portal"); + super.provideArguments("portal"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null) { Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -32,7 +37,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Portal.getTabCompletedPortals(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java index cb8ea5c..0c74763 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java @@ -1,89 +1,34 @@ package edu.whimc.portals.commands.destination; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - +import edu.whimc.portals.commands.AbstractRootCommand; import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; import org.bukkit.permissions.Permission; import edu.whimc.portals.Main; -import edu.whimc.portals.commands.AbstractSubCommand; -import edu.whimc.portals.utils.Messenger; -import edu.whimc.portals.utils.Messenger.Message; - -public class DestinationCommand implements CommandExecutor,TabCompleter { - private Map subCommands = new HashMap<>(); +/** + * The root command for all portal-destination-related sub commands. + * + * @see edu.whimc.portals.Destination + * @see edu.whimc.portals.Portal + */ +public final class DestinationCommand extends AbstractRootCommand { public DestinationCommand(Main plugin) { Permission perm = new Permission(Main.PERM_PREFIX + ".destination.*"); perm.addParent(Main.PERM_PREFIX + ".*", true); Bukkit.getPluginManager().addPermission(perm); - subCommands.put("change", new DestinationChange(plugin, "destination", "change")); - subCommands.put("clear", new DestinationClear(plugin, "destination", "clear")); - subCommands.put("create", new DestinationCreate(plugin, "destination", "create")); - subCommands.put("info", new DestinationInfo(plugin, "destination", "info")); - subCommands.put("list", new DestinationList(plugin, "destination", "list")); - subCommands.put("purge", new DestinationPurge(plugin, "destination", "purge")); - subCommands.put("remove", new DestinationRemove(plugin, "destination", "remove")); - subCommands.put("set", new DestinationSet(plugin, "destination", "set")); - subCommands.put("sethere", new DestinationSetHere(plugin, "destination", "sethere")); - subCommands.put("teleport", new DestinationTeleport(plugin, "destination", "teleport")); - } - - @Override - public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { - if (args.length == 0){ - sendCommands(sender); - return true; - } - - AbstractSubCommand subCmd = subCommands.getOrDefault(args[0].toLowerCase(), null); - if (subCmd == null) { - sendCommands(sender); - return true; - } - - return subCmd.executeSubCommand(sender, args); - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - if (args.length == 0) { - return subCommands.keySet().stream().sorted().collect(Collectors.toList()); - } - - if (args.length == 1) { - return subCommands.keySet() - .stream() - .filter(v -> v.startsWith(args[0].toLowerCase())) - .sorted() - .collect(Collectors.toList()); - } - - AbstractSubCommand subCmd = subCommands.getOrDefault(args[0].toLowerCase(), null); - if (subCmd == null) { - return null; - } - - return subCmd.executeOnTabComplete(sender, Arrays.copyOfRange(args, 1, args.length)); - } - - private void sendCommands(CommandSender sender){ - Messenger.msg(sender, Message.LINE_COMMAND_LIST.toString()); - subCommands.entrySet() - .stream() - .sorted(Map.Entry.comparingByKey()) - .forEachOrdered(e -> Messenger.msg(sender, e.getValue().getHelpLine())); - Messenger.msg(sender, "&7/portal &8- &fList commands for portals"); + addSubCommand(new DestinationChange(plugin, "destination", "change")); + addSubCommand(new DestinationClear(plugin, "destination", "clear")); + addSubCommand(new DestinationCreate(plugin, "destination", "create")); + addSubCommand(new DestinationInfo(plugin, "destination", "info")); + addSubCommand(new DestinationList(plugin, "destination", "list")); + addSubCommand(new DestinationPurge(plugin, "destination", "purge")); + addSubCommand(new DestinationRemove(plugin, "destination", "remove")); + addSubCommand(new DestinationSet(plugin, "destination", "set")); + addSubCommand(new DestinationSetHere(plugin, "destination", "sethere")); + addSubCommand(new DestinationTeleport(plugin, "destination", "teleport")); } } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java index d2aad8a..25d4026 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java @@ -10,17 +10,24 @@ import edu.whimc.portals.utils.Messenger.Message; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationCreate extends AbstractSubCommand { +/** + * Allows a user to create a {@link Destination} for + * the purpose of later linking a {@link edu.whimc.portals.Portal} + * to that {@link Destination}. + * + * @see DestinationCommand + */ +public final class DestinationCreate extends AbstractSubCommand { public DestinationCreate(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Creates a new destination at your current location"); - super.arguments("name"); - super.requiresPlayer(); + super.setDescription("Creates a new destination at your current location"); + super.provideArguments("name"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { if (args[0].equalsIgnoreCase(Destination.NONE)) { Messenger.msg(sender, Message.NONE_RESERVED_WORD); return true; diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java index 7141d15..0a1ef94 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java @@ -10,18 +10,23 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationInfo extends AbstractSubCommand { +/** + * Provide a user with information about a {@link Destination}. + * + * @see DestinationCommand + */ +public final class DestinationInfo extends AbstractSubCommand { public DestinationInfo(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Gives information about a destination"); - super.arguments("destination"); + super.setDescription("Gives information about a destination"); + super.provideArguments("destination"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Destination dest = Destination.getDestination(args[0]); - if (dest == null){ + if (dest == null) { Messenger.msg(sender, ReplaceMessage.DESTINATION_DOES_NOT_EXIST, args[0]); return true; } @@ -31,7 +36,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Destination.getTabCompletedDestinations(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java index df59dcb..5ab4e71 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java @@ -9,15 +9,20 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; -public class DestinationList extends AbstractSubCommand { +/** + * Provides a user with a list of all registered {@link Destination}s. + * + * @see DestinationCommand + */ +public final class DestinationList extends AbstractSubCommand { public DestinationList(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Lists all destinations"); + super.setDescription("Lists all destinations"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { if (Destination.getDestinations().size() == 0) { Messenger.msg(sender, Message.NO_DESTINATIONS); return true; diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java index b627992..57125ce 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java @@ -1,8 +1,8 @@ package edu.whimc.portals.commands.destination; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.bukkit.command.CommandSender; @@ -12,16 +12,22 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationPurge extends AbstractSubCommand { +/** + * Allows a user to delete all {@link Destination}s which are not currently + * used by {@link edu.whimc.portals.Portal}s. + * + * @see DestinationCommand + */ +public final class DestinationPurge extends AbstractSubCommand { public DestinationPurge(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Purge unused destinations"); - super.arguments("'invalid'|'no-portals'|'both'"); + super.setDescription("Purge unused destinations"); + super.provideArguments("'invalid'|'no-portals'|'both'"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { String action = args[0]; List targets; ReplaceMessage msg; @@ -45,14 +51,14 @@ protected boolean onCommand(CommandSender sender, String[] args) { return true; } - targets.stream().forEachOrdered(Destination::remove); + targets.forEach(Destination::remove); Messenger.msg(sender, msg, Integer.toString(targets.size())); return true; } @Override - protected List onTabComplete(CommandSender sender, String[] args) { - return Arrays.asList("invalid", "no-portals", "both").stream() + public final List onTabComplete(CommandSender sender, String[] args) { + return Stream.of("invalid", "no-portals", "both") .filter(v -> v.toLowerCase().startsWith(args[0].toLowerCase())) .collect(Collectors.toList()); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java index 87c9379..2c0f7fb 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java @@ -10,16 +10,21 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationRemove extends AbstractSubCommand { +/** + * Allow a user to remove a specific {@link Destination} by name. + * + * @see DestinationCommand + */ +public final class DestinationRemove extends AbstractSubCommand { public DestinationRemove(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Removes a destination"); - super.arguments("destination"); + super.setDescription("Removes a destination"); + super.provideArguments("destination"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Destination dest = Destination.getDestination(args[0]); if (dest == null) { Messenger.msg(sender, ReplaceMessage.DESTINATION_DOES_NOT_EXIST, args[0]); @@ -32,7 +37,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Destination.getTabCompletedDestinations(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java index 32379c4..80bed56 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java @@ -11,16 +11,21 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationSet extends AbstractSubCommand { +/** + * Allow a user to set the {@link Destination} of a {@link Portal}. + * + * @see DestinationCommand + */ +public final class DestinationSet extends AbstractSubCommand { public DestinationSet(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Sets the destination of a portal"); - super.arguments("portal destination"); + super.setDescription("Sets the destination of a portal"); + super.provideArguments("portal destination"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null) { Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -39,7 +44,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { if (args.length == 2) { return Destination.getTabCompletedDestinations(args[1]); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java index f3824d6..3074d41 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java @@ -12,17 +12,24 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationSetHere extends AbstractSubCommand { +/** + * Allow a user to create a {@link Destination} and set it to + * a {@link Portal}. This is a simplification of using both + * {@link DestinationCreate} and {@link DestinationSet}. + * + * @see DestinationCommand + */ +public final class DestinationSetHere extends AbstractSubCommand { public DestinationSetHere(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Sets the destination of a portal to your current location using the name of the portal"); - super.arguments("portal"); - super.requiresPlayer(); + super.setDescription("Sets the destination of a portal to your current location using the name of the portal"); + super.provideArguments("portal"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null){ Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -46,7 +53,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Portal.getTabCompletedPortals(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java index b8c6da4..668b05f 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java @@ -11,17 +11,22 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class DestinationTeleport extends AbstractSubCommand { +/** + * Allow a player to teleport directly to a {@link Destination}. + * + * @see DestinationCommand + */ +public final class DestinationTeleport extends AbstractSubCommand { public DestinationTeleport(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Teleports you to the given destination"); - super.arguments("destination"); - super.requiresPlayer(); + super.setDescription("Teleports you to the given destination"); + super.provideArguments("destination"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Destination dest = Destination.getDestination(args[0]); if (dest == null) { Messenger.msg(sender, ReplaceMessage.DESTINATION_DOES_NOT_EXIST, args[0]); @@ -39,7 +44,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Destination.getTabCompletedDestinations(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java b/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java index 0e0d60d..39a8c17 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java @@ -1,91 +1,36 @@ package edu.whimc.portals.commands.portal; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - +import edu.whimc.portals.commands.AbstractRootCommand; import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; import org.bukkit.permissions.Permission; import edu.whimc.portals.Main; -import edu.whimc.portals.commands.AbstractSubCommand; -import edu.whimc.portals.utils.Messenger; -import edu.whimc.portals.utils.Messenger.Message; - -public class PortalCommand implements CommandExecutor, TabCompleter { - private Map subCommands = new HashMap<>(); +/** + * The root command for all portal-related sub commands. + * + * @see edu.whimc.portals.Portal + * @see edu.whimc.portals.Destination + */ +public final class PortalCommand extends AbstractRootCommand { public PortalCommand(Main plugin) { Permission perm = new Permission(Main.PERM_PREFIX + ".portal.*"); perm.addParent(Main.PERM_PREFIX + ".*", true); Bukkit.getPluginManager().addPermission(perm); - subCommands.put("create", new PortalCreate(plugin, "portal", "create")); - subCommands.put("debug", new PortalDebug(plugin, "portal", "debug")); - subCommands.put("info", new PortalInfo(plugin, "portal", "info")); - subCommands.put("list", new PortalList(plugin, "portal", "list")); - subCommands.put("permission", new PortalPermission(plugin, "portal", "permission")); - subCommands.put("purge", new PortalPurge(plugin, "portal", "purge")); - subCommands.put("refill", new PortalRefill(plugin, "portal", "refill")); - subCommands.put("remove", new PortalRemove(plugin, "portal", "remove")); - subCommands.put("reshape", new PortalReshape(plugin, "portal", "reshape")); - subCommands.put("setfiller", new PortalSetFiller(plugin, "portal", "setfiller")); - subCommands.put("teleport", new PortalTeleport(plugin, "portal", "teleport")); - subCommands.put("tool", new PortalTool(plugin, "portal", "tool")); - } - - @Override - public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { - if (args.length == 0){ - sendCommands(sender); - return true; - } - - AbstractSubCommand subCmd = subCommands.getOrDefault(args[0].toLowerCase(), null); - if (subCmd == null) { - sendCommands(sender); - return true; - } - - return subCmd.executeSubCommand(sender, args); - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - if (args.length == 0) { - return subCommands.keySet().stream().sorted().collect(Collectors.toList()); - } - - if (args.length == 1) { - return subCommands.keySet() - .stream() - .filter(v -> v.startsWith(args[0].toLowerCase())) - .sorted() - .collect(Collectors.toList()); - } - - AbstractSubCommand subCmd = subCommands.getOrDefault(args[0].toLowerCase(), null); - if (subCmd == null) { - return null; - } - - return subCmd.executeOnTabComplete(sender, Arrays.copyOfRange(args, 1, args.length)); - } - - private void sendCommands(CommandSender sender){ - Messenger.msg(sender, Message.LINE_COMMAND_LIST.toString()); - subCommands.entrySet() - .stream() - .sorted(Map.Entry.comparingByKey()) - .forEachOrdered(e -> Messenger.msg(sender, e.getValue().getHelpLine())); - Messenger.msg(sender, "&7/destination &8- &fList commands for destinations"); + addSubCommand(new PortalCreate(plugin, "portal", "create")); + addSubCommand(new PortalDebug(plugin, "portal", "debug")); + addSubCommand(new PortalInfo(plugin, "portal", "info")); + addSubCommand(new PortalList(plugin, "portal", "list")); + addSubCommand(new PortalPermission(plugin, "portal", "permission")); + addSubCommand(new PortalPurge(plugin, "portal", "purge")); + addSubCommand(new PortalRefill(plugin, "portal", "refill")); + addSubCommand(new PortalRemove(plugin, "portal", "remove")); + addSubCommand(new PortalReshape(plugin, "portal", "reshape")); + addSubCommand(new PortalSetFiller(plugin, "portal", "setfiller")); + addSubCommand(new PortalTeleport(plugin, "portal", "teleport")); + addSubCommand(new PortalTool(plugin, "portal", "tool")); } } \ No newline at end of file diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java b/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java index d2a70ba..dc5d44c 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java @@ -12,17 +12,23 @@ import edu.whimc.portals.utils.Messenger.Message; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalCreate extends AbstractSubCommand { +/** + * Allow a user to create a new {@link Portal} based on previously specified locations. + * + * @see PortalCommand + * @see ToolSelectListener + */ +public final class PortalCreate extends AbstractSubCommand { public PortalCreate(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Creates a permissionless portal using the selected location"); - super.arguments("name"); - super.requiresPlayer(); + super.setDescription("Creates a permission-less portal using the selected location"); + super.provideArguments("name"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Player player = (Player) sender; Location pos1 = ToolSelectListener.leftClicks.get(player.getUniqueId()); Location pos2 = ToolSelectListener.rightClicks.get(player.getUniqueId()); @@ -32,6 +38,12 @@ protected boolean onCommand(CommandSender sender, String[] args) { return true; } + if (pos1.getWorld() == null || pos2.getWorld() == null) { + plugin.getLogger().warning("Creating a portal gave a null world on one position"); + Messenger.msg(sender, Message.ERROR); + return true; + } + if (!pos1.getWorld().getName().equals(pos2.getWorld().getName())){ Messenger.msg(sender, Message.POS_IN_DIFF_WORLDS); return false; diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java b/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java index 138092c..9f80090 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java @@ -9,16 +9,24 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; -public class PortalDebug extends AbstractSubCommand { +/** + * Allow a player to enable debug mode for portals, which + * will provide the player with useful information when they would + * normally teleport through the portal. + * + * @see edu.whimc.portals.Portal + * @see PortalCommand + */ +public final class PortalDebug extends AbstractSubCommand { public PortalDebug(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Gives information about the portal you're entering instead of teleporting"); - super.requiresPlayer(); + super.setDescription("Gives information about the portal you're entering instead of teleporting"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Player player = (Player) sender; if (PortalEnterListener.playerIsDebug(player)) { diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java b/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java index 5bd7f16..eeab86b 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java @@ -10,16 +10,21 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalInfo extends AbstractSubCommand { +/** + * Give a user information about a {@link Portal} + * + * @see PortalCommand + */ +public final class PortalInfo extends AbstractSubCommand { public PortalInfo(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Gives information about a portal"); - super.arguments("portal"); + super.setDescription("Gives information about a portal"); + super.provideArguments("portal"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null){ Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -31,7 +36,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Portal.getTabCompletedPortals(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalList.java b/src/main/java/edu/whimc/portals/commands/portal/PortalList.java index 0767da1..e0ff12f 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalList.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalList.java @@ -9,15 +9,20 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; -public class PortalList extends AbstractSubCommand { +/** + * Provide a user with all registered {@link Portal}s. + * + * @see PortalCommand + */ +public final class PortalList extends AbstractSubCommand { public PortalList(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Lists all portals"); + super.setDescription("Lists all portals"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { if (Portal.getPortals().size() == 0) { Messenger.msg(sender, Message.NO_PORTALS); return true; diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java b/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java index 1da98ec..5b8fbc3 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java @@ -10,18 +10,23 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalPermission extends AbstractSubCommand { +/** + * Allow a user to set the permission associated with accessing a {@link Portal}. + * + * @see PortalCommand + */ +public final class PortalPermission extends AbstractSubCommand { private static final String PERMISSION_NONE = "none"; public PortalPermission(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Sets or removes portal permissions"); - super.arguments("portal permission|'" + PERMISSION_NONE + "'"); + super.setDescription("Sets or removes portal permissions"); + super.provideArguments("portal permission|'" + PERMISSION_NONE + "'"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null){ Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -41,7 +46,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { if (args.length == 2) { List res = Portal.getTabCompletedPermissions(args[1]); if (PERMISSION_NONE.startsWith(args[1].toLowerCase())) { diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java b/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java index db6a67b..72abdbf 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java @@ -1,8 +1,8 @@ package edu.whimc.portals.commands.portal; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.bukkit.command.CommandSender; @@ -12,16 +12,21 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalPurge extends AbstractSubCommand { +/** + * Allow the user to delete all unnecessary {@link Portal}s. + * + * @see PortalCommand + */ +public final class PortalPurge extends AbstractSubCommand { public PortalPurge(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Purge unused portals"); - super.arguments("'invalid'|'no-destination'|'both'"); + super.setDescription("Purge unused portals"); + super.provideArguments("'invalid'|'no-destination'|'both'"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { String action = args[0]; List targets; ReplaceMessage msg; @@ -45,14 +50,14 @@ protected boolean onCommand(CommandSender sender, String[] args) { return true; } - targets.stream().forEachOrdered(Portal::remove); + targets.forEach(Portal::remove); Messenger.msg(sender, msg, Integer.toString(targets.size())); return true; } @Override - protected List onTabComplete(CommandSender sender, String[] args) { - return Arrays.asList("invalid", "no-destination", "both").stream() + public final List onTabComplete(CommandSender sender, String[] args) { + return Stream.of("invalid", "no-destination", "both") .filter(v -> v.toLowerCase().startsWith(args[0].toLowerCase())) .collect(Collectors.toList()); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java b/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java index 4f13be4..1366e27 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java @@ -10,16 +10,22 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalRefill extends AbstractSubCommand { +/** + * Allow a user to regenerate the substance within a {@link Portal} in + * the case that it was damaged. + * + * @see PortalCommand + */ +public final class PortalRefill extends AbstractSubCommand { public PortalRefill(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Regenerates the filler of a portal"); - super.arguments("portal"); + super.setDescription("Regenerates the filler of a portal"); + super.provideArguments("portal"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null){ Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -38,7 +44,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Portal.getTabCompletedPortals(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java b/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java index c296485..0c54787 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java @@ -10,18 +10,23 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalRemove extends AbstractSubCommand { +/** + * Allow a user to remove a {@link Portal}. + * + * @see PortalCommand + */ +public final class PortalRemove extends AbstractSubCommand { public PortalRemove(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Removes a portal"); - super.arguments("portal"); + super.setDescription("Removes a portal"); + super.provideArguments("portal"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); - if (portal == null){ + if (portal == null) { Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); return true; } @@ -32,7 +37,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Portal.getTabCompletedPortals(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java b/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java index 3744d70..9bd22c6 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java @@ -14,17 +14,24 @@ import edu.whimc.portals.utils.Messenger.Message; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalReshape extends AbstractSubCommand { +/** + * Allow a player to change the shape of a {@link Portal} using + * predefined locations. + * + * @see PortalCommand + * @see ToolSelectListener + */ +public final class PortalReshape extends AbstractSubCommand { public PortalReshape(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Reshape a portal to your current selection"); - super.arguments("portal"); - super.requiresPlayer(); + super.setDescription("Reshape a portal to your current selection"); + super.provideArguments("portal"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null){ Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -51,7 +58,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Portal.getTabCompletedPortals(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java b/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java index d5c0dee..890e954 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java @@ -12,16 +12,22 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalSetFiller extends AbstractSubCommand { +/** + * Allow a user to set the type of substance within the {@link Portal} + * for visual effect. + * + * @see PortalCommand + */ +public final class PortalSetFiller extends AbstractSubCommand { public PortalSetFiller(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Sets the filler of a portal"); - super.arguments("portal block"); + super.setDescription("Sets the filler of a portal"); + super.provideArguments("portal block"); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null) { Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -36,11 +42,11 @@ protected boolean onCommand(CommandSender sender, String[] args) { Material mat = Material.matchMaterial(args[1]); if (mat == null || !Portal.isValidFiller(mat)) { - String validFillers = String.join(", ", Portal.getValidFillers() + String validFillers = Portal.getValidFillers() .stream() .map(Material::toString) .sorted() - .collect(Collectors.toList())); + .collect(Collectors.joining(", ")); Messenger.msg(sender, ReplaceMessage.INVALID_FILLER, args[1], validFillers); return true; } @@ -51,7 +57,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { if (args.length == 2) { return Portal.getValidFillers() .stream() diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java b/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java index be948d9..7381eb2 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java @@ -13,17 +13,23 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; -public class PortalTeleport extends AbstractSubCommand { +/** + * Allow a user to teleport to the location of a {@link Portal}. + * This is not to be confused with {@link edu.whimc.portals.commands.destination.DestinationTeleport}. + * + * @see PortalCommand + */ +public final class PortalTeleport extends AbstractSubCommand { public PortalTeleport(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Teleports you to a portal"); - super.arguments("portal"); - super.requiresPlayer(); + super.setDescription("Teleports you to a portal"); + super.provideArguments("portal"); + super.setRequiresPlayer(true); } @Override - protected boolean onCommand(CommandSender sender, String[] args) { + protected final boolean onCommand(CommandSender sender, String[] args) { Portal portal = Portal.getPortal(args[0]); if (portal == null){ Messenger.msg(sender, ReplaceMessage.PORTAL_DOES_NOT_EXIST, args[0]); @@ -51,7 +57,7 @@ protected boolean onCommand(CommandSender sender, String[] args) { } @Override - protected List onTabComplete(CommandSender sender, String[] args) { + public final List onTabComplete(CommandSender sender, String[] args) { return Portal.getTabCompletedPortals(args[0]); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java b/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java index 41c593d..8e9b07f 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java @@ -1,7 +1,6 @@ package edu.whimc.portals.commands.portal; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -12,22 +11,30 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; -public class PortalTool extends AbstractSubCommand { +/** + * Provides the user with a tool designed to designate the locations + * which define the boundaries of a new {@link edu.whimc.portals.Portal}. + * + * @see PortalCommand + * @see edu.whimc.portals.listeners.ToolSelectListener + */ +public final class PortalTool extends AbstractSubCommand { - private static final ItemStack TOOL = new ItemStack(Material.WOODEN_SWORD); + private static final ItemStack TOOL = new ItemStack(Main.TOOL_MATERIAL); protected PortalTool(Main plugin, String baseCommand, String subCommand) { super(plugin, baseCommand, subCommand); - super.description("Gives you the portal selector tool"); - super.requiresPlayer(); + super.setDescription("Gives you the portal selector tool"); + super.setRequiresPlayer(true); ItemMeta meta = TOOL.getItemMeta(); + assert meta != null; meta.setDisplayName(ChatColor.AQUA + "Portal Tool"); TOOL.setItemMeta(meta); } @Override - public boolean onCommand(CommandSender sender, String[] args) { + public final boolean onCommand(CommandSender sender, String[] args) { ((Player) sender).getInventory().addItem(TOOL); Messenger.msg(sender, Message.PORTAL_TOOL_GIVEN); return true; diff --git a/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java b/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java index 93e226f..10ac7c9 100644 --- a/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java +++ b/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.UUID; +import edu.whimc.portals.Main; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -29,7 +30,7 @@ public void onHit(PlayerInteractEvent event){ Player player = event.getPlayer(); ItemStack item = player.getInventory().getItemInMainHand(); - if(item == null || item.getType() != Material.WOODEN_SWORD) return; + if(item.getType() != Main.TOOL_MATERIAL) return; UUID uuid = player.getUniqueId(); Location loc = event.getClickedBlock().getLocation(); diff --git a/src/main/java/edu/whimc/portals/utils/Messenger.java b/src/main/java/edu/whimc/portals/utils/Messenger.java index f525502..7f5cb23 100644 --- a/src/main/java/edu/whimc/portals/utils/Messenger.java +++ b/src/main/java/edu/whimc/portals/utils/Messenger.java @@ -113,7 +113,9 @@ public enum Message { LINE_PORTAL_LIST("&m &r &b&lPortals&r &m &r"), LINE_DESTINATION_LIST("&m &r &b&lDestinations&r &m &r"), LINE_COMMAND_LIST("&m &r &7[&b&lPortals&7]&r &m &r"), - LINE("&m &r"); + LINE("&m &r"), + + ERROR("&cAn error occurred."); private String message; From 7e5a21ff3a4dca4108233060949b451c4f69ebdb Mon Sep 17 00:00:00 2001 From: pietelite Date: Tue, 2 Feb 2021 21:35:13 -0600 Subject: [PATCH 2/2] More object formatting, globalizing plugin instance, documentation --- .../java/edu/whimc/portals/Destination.java | 38 +- src/main/java/edu/whimc/portals/Main.java | 35 +- src/main/java/edu/whimc/portals/Portal.java | 142 +++-- .../portals/commands/AbstractRootCommand.java | 2 +- .../portals/commands/AbstractSubCommand.java | 4 +- .../destination/DestinationChange.java | 5 +- .../destination/DestinationClear.java | 5 +- .../destination/DestinationCommand.java | 22 +- .../destination/DestinationCreate.java | 7 +- .../commands/destination/DestinationInfo.java | 5 +- .../commands/destination/DestinationList.java | 5 +- .../destination/DestinationPurge.java | 5 +- .../destination/DestinationRemove.java | 5 +- .../commands/destination/DestinationSet.java | 5 +- .../destination/DestinationSetHere.java | 7 +- .../destination/DestinationTeleport.java | 5 +- .../commands/portal/PortalCommand.java | 26 +- .../portals/commands/portal/PortalCreate.java | 8 +- .../portals/commands/portal/PortalDebug.java | 5 +- .../portals/commands/portal/PortalInfo.java | 5 +- .../portals/commands/portal/PortalList.java | 5 +- .../commands/portal/PortalPermission.java | 5 +- .../portals/commands/portal/PortalPurge.java | 5 +- .../portals/commands/portal/PortalRefill.java | 5 +- .../portals/commands/portal/PortalRemove.java | 5 +- .../commands/portal/PortalReshape.java | 12 +- .../commands/portal/PortalSetFiller.java | 5 +- .../commands/portal/PortalTeleport.java | 5 +- .../portals/commands/portal/PortalTool.java | 4 +- .../listeners/PortalBlockChangeListener.java | 8 +- .../listeners/PortalDamageListener.java | 8 +- .../listeners/PortalEnterListener.java | 37 +- .../portals/listeners/ToolSelectListener.java | 157 +++--- .../whimc/portals/utils/LocationSaver.java | 30 +- .../edu/whimc/portals/utils/Messenger.java | 13 +- .../edu/whimc/portals/utils/MyConfig.java | 236 +++++---- .../whimc/portals/utils/MyConfigManager.java | 495 +++++++++--------- src/main/resources/plugin.yml | 4 +- 38 files changed, 750 insertions(+), 630 deletions(-) diff --git a/src/main/java/edu/whimc/portals/Destination.java b/src/main/java/edu/whimc/portals/Destination.java index e7236ec..efde723 100644 --- a/src/main/java/edu/whimc/portals/Destination.java +++ b/src/main/java/edu/whimc/portals/Destination.java @@ -11,8 +11,6 @@ public class Destination { public static final String NONE = "none"; - private Main plugin; - private static List destinations = new ArrayList<>(); private String name; @@ -21,16 +19,23 @@ public class Destination { private boolean isValid = true; - public static Destination createDestination(Main plugin, String name, Location location) { - return new Destination(plugin, name, location, location.getWorld().getName(), true); + public static Destination createDestination(String name, Location location) { + if (location.getWorld() == null) { + Main.getInstance().getLogger().severe("Could not find world within location when creating a Destination"); + return null; + } + Destination destination = new Destination(name, location, location.getWorld().getName(), true); + destination.register(); + return destination; } - public static Destination loadDestination(Main plugin, String name, Location location, String worldName) { - return new Destination(plugin, name, location, worldName, false); + public static Destination loadDestination(String name, Location location, String worldName) { + Destination destination = new Destination(name, location, worldName, false); + destination.register(); + return destination; } - private Destination(Main plugin, String name, Location location, String worldName, boolean isNew) { - this.plugin = plugin; + private Destination(String name, Location location, String worldName, boolean isNew) { this.name = name; this.location = location; this.worldName = worldName; @@ -40,11 +45,12 @@ private Destination(Main plugin, String name, Location location, String worldNam } if (isNew) { - plugin.getLocationSaver().saveLocation(location, "Destinations." + name); + Main.getInstance().getLocationSaver().saveLocation(location, "Destinations." + name); } + } + private void register() { destinations.add(this); - } public static List getDestinations() { @@ -88,10 +94,14 @@ public Location getLocation() { } public void setLocation(Location location) { + if (location.getWorld() == null) { + Main.getInstance().getLogger().severe("Could not find world within location when setting location of destination"); + return; + } this.location = location; this.worldName = location.getWorld().getName(); this.isValid = true; - plugin.getLocationSaver().saveLocation(location, "Destinations." + name); + Main.getInstance().getLocationSaver().saveLocation(location, "Destinations." + name); } public boolean isValid() { @@ -109,9 +119,9 @@ public void remove() { } destinations.remove(this); - plugin.getPortalData().removeKey("Destinations." + this.name); - plugin.getPortalData().saveConfig(); - plugin.getPortalData().reloadConfig(); + Main.getInstance().getPortalData().removeKey("Destinations." + this.name); + Main.getInstance().getPortalData().saveConfig(); + Main.getInstance().getPortalData().reloadConfig(); } public String getWorldName() { diff --git a/src/main/java/edu/whimc/portals/Main.java b/src/main/java/edu/whimc/portals/Main.java index ccc837a..39c6f3d 100644 --- a/src/main/java/edu/whimc/portals/Main.java +++ b/src/main/java/edu/whimc/portals/Main.java @@ -3,7 +3,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; +import org.bukkit.command.PluginCommand; import org.bukkit.permissions.Permission; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -24,13 +24,16 @@ public class Main extends JavaPlugin { public static final String PERM_PREFIX = "whimc-portals"; public static final Material TOOL_MATERIAL = Material.WOODEN_SWORD; - private MyConfigManager manager; private static MyConfig portalData; private LocationSaver locationSaver; + public static Main getInstance() { + return Main.getPlugin(Main.class); + } + @Override public void onEnable() { - manager = new MyConfigManager(this); + MyConfigManager manager = new MyConfigManager(this); portalData = manager.getNewConfig("portalData.yml"); locationSaver = new LocationSaver(this); @@ -60,13 +63,23 @@ private void registerStuff() { pm.registerEvents(new PortalBlockChangeListener(), this); pm.registerEvents(new PortalDamageListener(), this); - PortalCommand pc = new PortalCommand(this); - getCommand("portal").setExecutor(pc); - getCommand("portal").setTabCompleter(pc); + PortalCommand pc = new PortalCommand(); + PluginCommand ppc = getCommand("portal"); + if (ppc == null) { + getLogger().severe("The portal command was not properly registered."); + } else { + ppc.setExecutor(pc); + ppc.setTabCompleter(pc); + } - DestinationCommand dc = new DestinationCommand(this); - getCommand("destination").setExecutor(dc); - getCommand("destination").setTabCompleter(dc); + DestinationCommand dc = new DestinationCommand(); + PluginCommand dpc = getCommand("destination"); + if (dpc == null) { + getLogger().severe("The destination command was not properly registered"); + } else { + dpc.setExecutor(dc); + dpc.setTabCompleter(dc); + } } private void initializeConfig() { @@ -80,7 +93,7 @@ private void initializeConfig() { path = "Destinations." + key + ".world"; destWorldName = portalData.getString(path); - Destination.loadDestination(this, key, destLoc, destWorldName); + Destination.loadDestination(key, destLoc, destWorldName); } } @@ -105,7 +118,7 @@ private void initializeConfig() { String fillerName = portalData.getString("Portals." + key + ".filler", ""); Material filler = Material.matchMaterial(fillerName); - Portal.loadPortal(this, key, permission, portalWorldName, pos1, pos2, dest, filler); + Portal.loadPortal(key, permission, portalWorldName, pos1, pos2, dest, filler); } } } diff --git a/src/main/java/edu/whimc/portals/Portal.java b/src/main/java/edu/whimc/portals/Portal.java index 84f0849..3c6ae18 100644 --- a/src/main/java/edu/whimc/portals/Portal.java +++ b/src/main/java/edu/whimc/portals/Portal.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -23,6 +24,10 @@ import org.bukkit.permissions.Permission; import org.bukkit.util.Vector; +/** + * A teleportation tool for players to move in game and also + * a managing class for all active portals and their behavior. + */ public class Portal { private static List portals = new ArrayList<>(); @@ -35,7 +40,6 @@ public class Portal { Material.COBWEB, Material.END_GATEWAY)); - private Main plugin; private String name; private String worldName; private Permission permission; @@ -46,16 +50,41 @@ public class Portal { private boolean valid = true; - public static Portal createPortal(Main plugin, String name, String permission, World world, Vector pos1, Vector pos2) { - return new Portal(plugin, name, permission, world.getName(), pos1, pos2, null, defaultFiller, true); - } - - public static Portal loadPortal(Main plugin, String name, String permission, String worldName, Vector pos1, Vector pos2, Destination destination, Material filler) { - return new Portal(plugin, name, permission, worldName, pos1, pos2, destination, filler, false); - } - - private Portal(Main plugin, String name, String permission, String worldName, Vector pos1, Vector pos2, Destination destination, Material filler, boolean isNew){ - this.plugin = plugin; + /** + * Instantiate a new Portal and save it. Adds filler to the portal. + * + * @param name the portal name + * @param permission the permission level required to teleport through + * @param world the portal's containing world + * @param pos1 the first defining position of the world + * @param pos2 the second defining position of the world + * @return the new instance + */ + public static Portal createPortal(String name, String permission, World world, Vector pos1, Vector pos2) { + Portal portal = new Portal(name, permission, world.getName(), pos1, pos2, null, defaultFiller, true); + portal.register(); + return portal; + } + + /** + * Instantiate a new Portal and save it. Does not add filler to the portal. + * + * @param name the portal name + * @param permission the permission level required to teleport through + * @param worldName the portal's containing world + * @param pos1 the first defining position of the world + * @param pos2 the second defining position of the world + * @param destination the second defining position of the world + * @param filler the filler material comprising the inside of the portal + * @return the new instance + */ + public static Portal loadPortal(String name, String permission, String worldName, Vector pos1, Vector pos2, Destination destination, Material filler) { + Portal portal = new Portal(name, permission, worldName, pos1, pos2, destination, filler, false); + portal.register(); + return portal; + } + + private Portal(String name, String permission, String worldName, Vector pos1, Vector pos2, Destination destination, Material filler, boolean isNew) { this.name = name; this.worldName = worldName; setPermission(permission); @@ -68,36 +97,39 @@ private Portal(Main plugin, String name, String permission, String worldName, Ve this.filler = filler; } - if(isNew){ + if (isNew) { setConfig("world", worldName); - plugin.getLocationSaver().saveVector(pos1, "Portals." + name + ".pos1"); - plugin.getLocationSaver().saveVector(pos2, "Portals." + name + ".pos2"); + Main.getInstance().getLocationSaver().saveVector(pos1, "Portals." + name + ".pos1"); + Main.getInstance().getLocationSaver().saveVector(pos2, "Portals." + name + ".pos2"); if (this.filler != defaultFiller) setConfig("filler", this.filler.toString()); setConfig("permission", permission); setConfig("destination", destination == null ? Destination.NONE : name); saveConfig(); } + + if (isNew) { + addFiller(); + } + } + + private void register() { portals.add(this); - World world = Bukkit.getWorld(worldName); + World world = Bukkit.getWorld(this.worldName); if (world == null) { - Bukkit.getLogger().info("Error loading portal - world does not exist!"); + Main.getInstance().getLogger().info("Error loading portal - world does not exist!"); this.valid = false; return; } - portalForEach(block -> { + this.portalForEach(block -> { portalData.put(getBlockDataString(block), this); }); - - if (isNew) { - addFiller(); - } } - public static List getPortals(){ + public static List getPortals() { return portals; } @@ -113,7 +145,7 @@ public static List getTabCompletedPermissions(String hint) { return Portal.getPortals() .stream() .map(Portal::getPermission) - .filter(v -> v != null) + .filter(Objects::nonNull) .distinct() .map(Portal::getRawPermission) .filter(v -> v.toLowerCase().startsWith(hint.toLowerCase())) @@ -167,8 +199,8 @@ public void reshape(World newWorld, Vector newPos1, Vector newPos2) { }); setConfig("world", this.worldName); - plugin.getLocationSaver().saveVector(newPos1, "Portals." + name + ".pos1"); - plugin.getLocationSaver().saveVector(newPos2, "Portals." + name + ".pos2"); + Main.getInstance().getLocationSaver().saveVector(newPos1, "Portals." + name + ".pos1"); + Main.getInstance().getLocationSaver().saveVector(newPos2, "Portals." + name + ".pos2"); saveConfig(); } @@ -176,7 +208,7 @@ public Material getFiller() { return this.filler; } - public void addFiller(){ + public void addFiller() { if (!this.valid) return; portalForEach(block -> { @@ -221,9 +253,9 @@ private Block portalForEach(Function task) { Vector max = Vector.getMaximum(pos1, pos2); Vector min = Vector.getMinimum(pos1, pos2); World world = Bukkit.getWorld(this.worldName); - for (int x = min.getBlockX(); x <= max.getBlockX();x++) { + for (int x = min.getBlockX(); x <= max.getBlockX(); x++) { for (int y = min.getBlockY(); y <= max.getBlockY(); y++) { - for (int z = min.getBlockZ(); z <= max.getBlockZ();z++) { + for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) { Block block = world.getBlockAt(x, y, z); if (task.apply(block)) { return block; @@ -234,7 +266,7 @@ private Block portalForEach(Function task) { return null; } - public void remove(){ + public void remove() { if (this.valid) { removeFiller(); } @@ -242,7 +274,7 @@ public void remove(){ removePermission(); portals.remove(this); portalData.values().removeIf(v -> v == this); - plugin.getPortalData().removeKey("Portals." + this.name); + Main.getInstance().getPortalData().removeKey("Portals." + this.name); saveConfig(); } @@ -263,43 +295,43 @@ public static String getBlockDataString(Block block) { return block.getWorld().getName() + "|" + block.getX() + "|" + block.getY() + "|" + block.getZ(); } - public boolean hasDestination(){ + public boolean hasDestination() { return destination != null; } - public String getName(){ + public String getName() { return name; } - public void setName(String name){ + public void setName(String name) { this.name = name; } - public World getWorld(){ + public World getWorld() { return Bukkit.getWorld(this.worldName); } - public String getWorldName(){ + public String getWorldName() { return worldName; } - public Vector getPos1(){ + public Vector getPos1() { return pos1; } - public void setPos1(Vector pos1){ + public void setPos1(Vector pos1) { this.pos1 = pos1; } - public Vector getPos2(){ + public Vector getPos2() { return pos2; } - public void setPos2(Vector pos2){ + public void setPos2(Vector pos2) { this.pos2 = pos2; } - public Destination getDestination(){ + public Destination getDestination() { return destination; } @@ -307,7 +339,7 @@ public boolean isValid() { return this.valid; } - public void setDestination(Destination destination){ + public void setDestination(Destination destination) { this.destination = destination; setConfig("destination", destination == null ? Destination.NONE : destination.getName()); @@ -375,55 +407,55 @@ public void setPermission(String permStr) { this.permission = registerOrGetPermission(formatPermission(permStr)); } - private int getMinX(){ + private int getMinX() { if (!this.valid) return 0; return Math.min(pos1.getBlockX(), pos2.getBlockX()); } - private int getMinY(){ + private int getMinY() { if (!this.valid) return 0; return Math.min(pos1.getBlockY(), pos2.getBlockY()); } - private int getMinZ(){ + private int getMinZ() { if (!this.valid) return 0; return Math.min(pos1.getBlockZ(), pos2.getBlockZ()); } - private int getMaxX(){ + private int getMaxX() { if (!this.valid) return 0; return Math.max(pos1.getBlockX(), pos2.getBlockX()); } - private int getMaxY(){ + private int getMaxY() { if (!this.valid) return 0; return Math.max(pos1.getBlockY(), pos2.getBlockY()); } - private int getMaxZ(){ + private int getMaxZ() { if (!this.valid) return 0; return Math.max(pos1.getBlockZ(), pos2.getBlockZ()); } - public boolean inPortal(Location location){ + public boolean inPortal(Location location) { if (!this.valid) return false; - if(!location.getWorld().getName().equals(this.worldName)) return false; + if (!location.getWorld().getName().equals(this.worldName)) return false; int x = location.getBlockX(); int y = location.getBlockY(); int z = location.getBlockZ(); - if(x < getMinX() || x > getMaxX()) return false; - if(y < getMinY() || y > getMaxY()) return false; - if(z < getMinZ() || z > getMaxZ()) return false; + if (x < getMinX() || x > getMaxX()) return false; + if (y < getMinY() || y > getMaxY()) return false; + if (z < getMinZ() || z > getMaxZ()) return false; return true; } private void setConfig(String key, Object value) { - plugin.getPortalData().set("Portals." + this.name + "." + key, value); + Main.getInstance().getPortalData().set("Portals." + this.name + "." + key, value); } private void saveConfig() { - plugin.getPortalData().saveConfig(); - plugin.getPortalData().reloadConfig(); + Main.getInstance().getPortalData().saveConfig(); + Main.getInstance().getPortalData().reloadConfig(); } @Override diff --git a/src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java b/src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java index e77c75a..b70a2f1 100644 --- a/src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java +++ b/src/main/java/edu/whimc/portals/commands/AbstractRootCommand.java @@ -30,7 +30,7 @@ public abstract class AbstractRootCommand implements CommandExecutor, TabComplet * @param subCommand a sub command */ protected final void addSubCommand(final AbstractSubCommand subCommand) { - this.subCommands.put(subCommand.getCommand(), subCommand); + this.subCommands.put(subCommand.getSubCommand(), subCommand); } /** diff --git a/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java b/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java index 09c11db..26db4de 100644 --- a/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java +++ b/src/main/java/edu/whimc/portals/commands/AbstractSubCommand.java @@ -30,7 +30,6 @@ public abstract class AbstractSubCommand { private static final String SEPARATOR = "&8"; private static final String TEXT = "&f"; - protected Main plugin; private String baseCommand; private String subCommand; private String permission; @@ -39,8 +38,7 @@ public abstract class AbstractSubCommand { private String[] arguments = {}; private boolean requiresPlayer = false; - public AbstractSubCommand(Main plugin, String baseCommand, String subCommand) { - this.plugin = plugin; + public AbstractSubCommand(String baseCommand, String subCommand) { this.baseCommand = baseCommand; this.subCommand = subCommand; diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java index e348309..80c35b0 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationChange.java @@ -6,7 +6,6 @@ import org.bukkit.entity.Player; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; @@ -19,8 +18,8 @@ */ public final class DestinationChange extends AbstractSubCommand { - public DestinationChange(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationChange(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Sets the location of a destination to your current position"); super.provideArguments("destination"); super.setRequiresPlayer(true); diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java index 6ecfaad..f640ce5 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationClear.java @@ -4,7 +4,6 @@ import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -17,8 +16,8 @@ */ public final class DestinationClear extends AbstractSubCommand { - public DestinationClear(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationClear(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Removes the destination of a portal"); super.provideArguments("portal"); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java index 0c74763..4955857 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java @@ -14,21 +14,21 @@ */ public final class DestinationCommand extends AbstractRootCommand { - public DestinationCommand(Main plugin) { + public DestinationCommand() { Permission perm = new Permission(Main.PERM_PREFIX + ".destination.*"); perm.addParent(Main.PERM_PREFIX + ".*", true); Bukkit.getPluginManager().addPermission(perm); - addSubCommand(new DestinationChange(plugin, "destination", "change")); - addSubCommand(new DestinationClear(plugin, "destination", "clear")); - addSubCommand(new DestinationCreate(plugin, "destination", "create")); - addSubCommand(new DestinationInfo(plugin, "destination", "info")); - addSubCommand(new DestinationList(plugin, "destination", "list")); - addSubCommand(new DestinationPurge(plugin, "destination", "purge")); - addSubCommand(new DestinationRemove(plugin, "destination", "remove")); - addSubCommand(new DestinationSet(plugin, "destination", "set")); - addSubCommand(new DestinationSetHere(plugin, "destination", "sethere")); - addSubCommand(new DestinationTeleport(plugin, "destination", "teleport")); + addSubCommand(new DestinationChange("destination", "change")); + addSubCommand(new DestinationClear("destination", "clear")); + addSubCommand(new DestinationCreate("destination", "create")); + addSubCommand(new DestinationInfo("destination", "info")); + addSubCommand(new DestinationList("destination", "list")); + addSubCommand(new DestinationPurge("destination", "purge")); + addSubCommand(new DestinationRemove("destination", "remove")); + addSubCommand(new DestinationSet("destination", "set")); + addSubCommand(new DestinationSetHere("destination", "sethere")); + addSubCommand(new DestinationTeleport("destination", "teleport")); } } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java index 25d4026..8057020 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationCreate.java @@ -4,7 +4,6 @@ import org.bukkit.entity.Player; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; @@ -19,8 +18,8 @@ */ public final class DestinationCreate extends AbstractSubCommand { - public DestinationCreate(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationCreate(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Creates a new destination at your current location"); super.provideArguments("name"); super.setRequiresPlayer(true); @@ -39,7 +38,7 @@ protected final boolean onCommand(CommandSender sender, String[] args) { return true; } - Destination.createDestination(plugin, args[0], ((Player) sender).getLocation()); + Destination.createDestination(args[0], ((Player) sender).getLocation()); Messenger.msg(sender, ReplaceMessage.DESTINATION_CREATE_SUCCESS, args[0]); return true; } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java index 0a1ef94..1acbf6f 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationInfo.java @@ -5,7 +5,6 @@ import org.bukkit.command.CommandSender; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; @@ -17,8 +16,8 @@ */ public final class DestinationInfo extends AbstractSubCommand { - public DestinationInfo(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationInfo(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Gives information about a destination"); super.provideArguments("destination"); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java index 5ab4e71..7a754d4 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationList.java @@ -4,7 +4,6 @@ import org.bukkit.command.CommandSender; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; @@ -16,8 +15,8 @@ */ public final class DestinationList extends AbstractSubCommand { - public DestinationList(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationList(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Lists all destinations"); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java index 57125ce..9981ed1 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java @@ -7,7 +7,6 @@ import org.bukkit.command.CommandSender; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; @@ -20,8 +19,8 @@ */ public final class DestinationPurge extends AbstractSubCommand { - public DestinationPurge(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationPurge(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Purge unused destinations"); super.provideArguments("'invalid'|'no-portals'|'both'"); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java index 2c0f7fb..c1c5910 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationRemove.java @@ -5,7 +5,6 @@ import org.bukkit.command.CommandSender; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; @@ -17,8 +16,8 @@ */ public final class DestinationRemove extends AbstractSubCommand { - public DestinationRemove(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationRemove(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Removes a destination"); super.provideArguments("destination"); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java index 80bed56..1465a2b 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java @@ -5,7 +5,6 @@ import org.bukkit.command.CommandSender; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -18,8 +17,8 @@ */ public final class DestinationSet extends AbstractSubCommand { - public DestinationSet(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationSet(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Sets the destination of a portal"); super.provideArguments("portal destination"); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java index 3074d41..9762194 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationSetHere.java @@ -6,7 +6,6 @@ import org.bukkit.entity.Player; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -21,8 +20,8 @@ */ public final class DestinationSetHere extends AbstractSubCommand { - public DestinationSetHere(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationSetHere(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Sets the destination of a portal to your current location using the name of the portal"); super.provideArguments("portal"); super.setRequiresPlayer(true); @@ -41,7 +40,7 @@ protected final boolean onCommand(CommandSender sender, String[] args) { Destination dest = Destination.getDestination(destName); if (dest == null) { - dest = Destination.createDestination(plugin, destName, player.getLocation()); + dest = Destination.createDestination(destName, player.getLocation()); } else { dest.setLocation(player.getLocation()); } diff --git a/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java index 668b05f..c4be67e 100644 --- a/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java +++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationTeleport.java @@ -6,7 +6,6 @@ import org.bukkit.entity.Player; import edu.whimc.portals.Destination; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.ReplaceMessage; @@ -18,8 +17,8 @@ */ public final class DestinationTeleport extends AbstractSubCommand { - public DestinationTeleport(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public DestinationTeleport(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Teleports you to the given destination"); super.provideArguments("destination"); super.setRequiresPlayer(true); diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java b/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java index 39a8c17..8f396ca 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalCommand.java @@ -14,23 +14,23 @@ */ public final class PortalCommand extends AbstractRootCommand { - public PortalCommand(Main plugin) { + public PortalCommand() { Permission perm = new Permission(Main.PERM_PREFIX + ".portal.*"); perm.addParent(Main.PERM_PREFIX + ".*", true); Bukkit.getPluginManager().addPermission(perm); - addSubCommand(new PortalCreate(plugin, "portal", "create")); - addSubCommand(new PortalDebug(plugin, "portal", "debug")); - addSubCommand(new PortalInfo(plugin, "portal", "info")); - addSubCommand(new PortalList(plugin, "portal", "list")); - addSubCommand(new PortalPermission(plugin, "portal", "permission")); - addSubCommand(new PortalPurge(plugin, "portal", "purge")); - addSubCommand(new PortalRefill(plugin, "portal", "refill")); - addSubCommand(new PortalRemove(plugin, "portal", "remove")); - addSubCommand(new PortalReshape(plugin, "portal", "reshape")); - addSubCommand(new PortalSetFiller(plugin, "portal", "setfiller")); - addSubCommand(new PortalTeleport(plugin, "portal", "teleport")); - addSubCommand(new PortalTool(plugin, "portal", "tool")); + addSubCommand(new PortalCreate("portal", "create")); + addSubCommand(new PortalDebug("portal", "debug")); + addSubCommand(new PortalInfo("portal", "info")); + addSubCommand(new PortalList("portal", "list")); + addSubCommand(new PortalPermission("portal", "permission")); + addSubCommand(new PortalPurge("portal", "purge")); + addSubCommand(new PortalRefill("portal", "refill")); + addSubCommand(new PortalRemove("portal", "remove")); + addSubCommand(new PortalReshape("portal", "reshape")); + addSubCommand(new PortalSetFiller("portal", "setfiller")); + addSubCommand(new PortalTeleport("portal", "teleport")); + addSubCommand(new PortalTool("portal", "tool")); } } \ No newline at end of file diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java b/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java index dc5d44c..eda15e5 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalCreate.java @@ -20,8 +20,8 @@ */ public final class PortalCreate extends AbstractSubCommand { - public PortalCreate(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalCreate(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Creates a permission-less portal using the selected location"); super.provideArguments("name"); super.setRequiresPlayer(true); @@ -39,7 +39,7 @@ protected final boolean onCommand(CommandSender sender, String[] args) { } if (pos1.getWorld() == null || pos2.getWorld() == null) { - plugin.getLogger().warning("Creating a portal gave a null world on one position"); + Main.getInstance().getLogger().warning("Creating a portal gave a null world on one position"); Messenger.msg(sender, Message.ERROR); return true; } @@ -56,7 +56,7 @@ protected final boolean onCommand(CommandSender sender, String[] args) { return false; } - Portal.createPortal(plugin, name, null, player.getWorld(), pos1.toVector(), pos2.toVector()); + Portal.createPortal(name, null, player.getWorld(), pos1.toVector(), pos2.toVector()); Messenger.msg(sender, ReplaceMessage.PORTAL_CREATE_SUCCESS, name); return true; diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java b/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java index 9f80090..e8fe696 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalDebug.java @@ -3,7 +3,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import edu.whimc.portals.Main; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.listeners.PortalEnterListener; import edu.whimc.portals.utils.Messenger; @@ -19,8 +18,8 @@ */ public final class PortalDebug extends AbstractSubCommand { - public PortalDebug(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalDebug(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Gives information about the portal you're entering instead of teleporting"); super.setRequiresPlayer(true); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java b/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java index eeab86b..5b6309d 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalInfo.java @@ -4,7 +4,6 @@ import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -17,8 +16,8 @@ */ public final class PortalInfo extends AbstractSubCommand { - public PortalInfo(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalInfo(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Gives information about a portal"); super.provideArguments("portal"); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalList.java b/src/main/java/edu/whimc/portals/commands/portal/PortalList.java index e0ff12f..88ce815 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalList.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalList.java @@ -3,7 +3,6 @@ import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -16,8 +15,8 @@ */ public final class PortalList extends AbstractSubCommand { - public PortalList(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalList(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Lists all portals"); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java b/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java index 5b8fbc3..6611eb9 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalPermission.java @@ -4,7 +4,6 @@ import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -19,8 +18,8 @@ public final class PortalPermission extends AbstractSubCommand { private static final String PERMISSION_NONE = "none"; - public PortalPermission(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalPermission(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Sets or removes portal permissions"); super.provideArguments("portal permission|'" + PERMISSION_NONE + "'"); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java b/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java index 72abdbf..b6ce73d 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java @@ -6,7 +6,6 @@ import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -19,8 +18,8 @@ */ public final class PortalPurge extends AbstractSubCommand { - public PortalPurge(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalPurge(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Purge unused portals"); super.provideArguments("'invalid'|'no-destination'|'both'"); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java b/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java index 1366e27..f80ef2c 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalRefill.java @@ -4,7 +4,6 @@ import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -18,8 +17,8 @@ */ public final class PortalRefill extends AbstractSubCommand { - public PortalRefill(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalRefill(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Regenerates the filler of a portal"); super.provideArguments("portal"); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java b/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java index 0c54787..4a8d549 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalRemove.java @@ -4,7 +4,6 @@ import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -17,8 +16,8 @@ */ public final class PortalRemove extends AbstractSubCommand { - public PortalRemove(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalRemove(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Removes a portal"); super.provideArguments("portal"); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java b/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java index 9bd22c6..d9bd9e3 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java @@ -2,11 +2,11 @@ import java.util.List; +import edu.whimc.portals.Main; import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.listeners.ToolSelectListener; @@ -23,8 +23,8 @@ */ public final class PortalReshape extends AbstractSubCommand { - public PortalReshape(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalReshape(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Reshape a portal to your current selection"); super.provideArguments("portal"); super.setRequiresPlayer(true); @@ -47,6 +47,12 @@ protected final boolean onCommand(CommandSender sender, String[] args) { return true; } + if (pos1.getWorld() == null || pos2.getWorld() == null) { + Main.getInstance().getLogger().severe("Portal selection positions do not have valid locations"); + Messenger.msg(sender, Message.ERROR); + return false; + } + if (!pos1.getWorld().getName().equals(pos2.getWorld().getName())){ Messenger.msg(sender, Message.POS_IN_DIFF_WORLDS); return false; diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java b/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java index 890e954..48de999 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalSetFiller.java @@ -6,7 +6,6 @@ import org.bukkit.Material; import org.bukkit.command.CommandSender; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.utils.Messenger; @@ -20,8 +19,8 @@ */ public final class PortalSetFiller extends AbstractSubCommand { - public PortalSetFiller(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalSetFiller(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Sets the filler of a portal"); super.provideArguments("portal block"); } diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java b/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java index 7381eb2..863eba1 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalTeleport.java @@ -6,7 +6,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import edu.whimc.portals.Main; import edu.whimc.portals.Portal; import edu.whimc.portals.commands.AbstractSubCommand; import edu.whimc.portals.listeners.PortalEnterListener; @@ -21,8 +20,8 @@ */ public final class PortalTeleport extends AbstractSubCommand { - public PortalTeleport(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + public PortalTeleport(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Teleports you to a portal"); super.provideArguments("portal"); super.setRequiresPlayer(true); diff --git a/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java b/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java index 8e9b07f..0c75e70 100644 --- a/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java +++ b/src/main/java/edu/whimc/portals/commands/portal/PortalTool.java @@ -22,8 +22,8 @@ public final class PortalTool extends AbstractSubCommand { private static final ItemStack TOOL = new ItemStack(Main.TOOL_MATERIAL); - protected PortalTool(Main plugin, String baseCommand, String subCommand) { - super(plugin, baseCommand, subCommand); + protected PortalTool(String baseCommand, String subCommand) { + super(baseCommand, subCommand); super.setDescription("Gives you the portal selector tool"); super.setRequiresPlayer(true); diff --git a/src/main/java/edu/whimc/portals/listeners/PortalBlockChangeListener.java b/src/main/java/edu/whimc/portals/listeners/PortalBlockChangeListener.java index 798cafe..da0a417 100644 --- a/src/main/java/edu/whimc/portals/listeners/PortalBlockChangeListener.java +++ b/src/main/java/edu/whimc/portals/listeners/PortalBlockChangeListener.java @@ -10,10 +10,14 @@ import edu.whimc.portals.Portal; -public class PortalBlockChangeListener implements Listener{ +/** + * Container class for Bukkit event handlers to ensure + * proper usage of {@link Portal}s in game for events related to block changes. + */ +public final class PortalBlockChangeListener implements Listener { @EventHandler(priority = EventPriority.HIGH) - public void onWaterMove(BlockFromToEvent event){ + public void onWaterMove(BlockFromToEvent event) { Portal portal = Portal.getPortal(event.getBlock()); if (portal != null) event.setCancelled(true); } diff --git a/src/main/java/edu/whimc/portals/listeners/PortalDamageListener.java b/src/main/java/edu/whimc/portals/listeners/PortalDamageListener.java index fefcfb7..8ea98e0 100644 --- a/src/main/java/edu/whimc/portals/listeners/PortalDamageListener.java +++ b/src/main/java/edu/whimc/portals/listeners/PortalDamageListener.java @@ -9,7 +9,11 @@ import edu.whimc.portals.Portal; -public class PortalDamageListener implements Listener { +/** + * Container class for Bukkit event handlers to ensure + * proper usage of {@link Portal}s in game for events related to damage. + */ +public final class PortalDamageListener implements Listener { @EventHandler public void onCombust(EntityCombustByBlockEvent event) { @@ -24,7 +28,7 @@ public void onDamage(EntityDamageByBlockEvent event) { if (near != null) event.setCancelled(true); } - private Portal getNearPortal(Block start, int radius){ + private Portal getNearPortal(Block start, int radius) { if (radius < 0) { return null; } diff --git a/src/main/java/edu/whimc/portals/listeners/PortalEnterListener.java b/src/main/java/edu/whimc/portals/listeners/PortalEnterListener.java index c7f49dd..2c7c874 100644 --- a/src/main/java/edu/whimc/portals/listeners/PortalEnterListener.java +++ b/src/main/java/edu/whimc/portals/listeners/PortalEnterListener.java @@ -4,6 +4,7 @@ import java.util.Set; import java.util.UUID; +import edu.whimc.portals.Main; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Particle; @@ -19,30 +20,43 @@ import edu.whimc.portals.utils.Messenger; import edu.whimc.portals.utils.Messenger.Message; -public class PortalEnterListener implements Listener{ +/** + * Manager for Bukkit event handlers to ensure + * proper usage of {@link Portal}s in game for events related to entering portals. + */ +public class PortalEnterListener implements Listener { private static Set debugPlayers = new HashSet<>(); - public static void addDebugPlayer(Player player) { + public static void addDebugPlayer(final Player player) { debugPlayers.add(player.getUniqueId()); } - public static void removeDebugPlayer(Player player) { + public static void removeDebugPlayer(final Player player) { debugPlayers.remove(player.getUniqueId()); } - public static boolean playerIsDebug(Player player) { + public static boolean playerIsDebug(final Player player) { return debugPlayers.contains(player.getUniqueId()); } @EventHandler(priority = EventPriority.HIGHEST) - public void onMove(PlayerMoveEvent event){ + public void onMove(PlayerMoveEvent event) { Location locTo = event.getTo(); Location locFrom = event.getFrom(); - if (locFrom.getBlockX() == locTo.getBlockX() && locFrom.getBlockZ() == locTo.getBlockZ() && locFrom.getBlockY() == locTo.getBlockY()) return; + if (locTo == null) { + Main.getInstance().getLogger().severe("Could not get the destination of a PlayerMoveEvent"); + return; + } + + if (locFrom.getBlockX() == locTo.getBlockX() + && locFrom.getBlockZ() == locTo.getBlockZ() + && locFrom.getBlockY() == locTo.getBlockY()) { + return; + } Portal portal = Portal.getPortal(locTo); - if(portal == null) return; + if (portal == null) return; Player player = event.getPlayer(); @@ -57,7 +71,7 @@ public void onMove(PlayerMoveEvent event){ return; } - if(!portal.hasDestination()){ + if (!portal.hasDestination()) { Messenger.msg(player, Message.PORTAL_NO_DESTINATION); return; } @@ -79,9 +93,10 @@ public void onMove(PlayerMoveEvent event){ player.playSound(portal.getDestination().getLocation(), Sound.BLOCK_NOTE_BLOCK_CHIME, 0.5f, 1f); } - private void makeCircleEffect(Player player, int points, double size, double yOffSet){ - for (int i = 0; i < 360; i += 360/points) { - double angle = i * Math.PI / 180; + private void makeCircleEffect(Player player, int points, double size, double yOffSet) { + double piOver180 = Math.PI / 180; + for (int i = 0; i < 360; i += 360 / points) { + double angle = i * piOver180; double x = size * Math.cos(angle); double z = size * Math.sin(angle); Location loc = player.getLocation().add(0, yOffSet, 0); diff --git a/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java b/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java index 10ac7c9..9001a3b 100644 --- a/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java +++ b/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java @@ -5,8 +5,8 @@ import java.util.UUID; import edu.whimc.portals.Main; +import edu.whimc.portals.Portal; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -16,77 +16,86 @@ import edu.whimc.portals.utils.Messenger; -public class ToolSelectListener implements Listener{ - - public static Map leftClicks = new HashMap(); - public static Map rightClicks = new HashMap(); - - @EventHandler - public void onHit(PlayerInteractEvent event){ - if(!event.getPlayer().hasPermission("portals.admin")) return; - - Action action = event.getAction(); - if (action != Action.LEFT_CLICK_BLOCK && action != Action.RIGHT_CLICK_BLOCK) return; - - Player player = event.getPlayer(); - ItemStack item = player.getInventory().getItemInMainHand(); - if(item.getType() != Main.TOOL_MATERIAL) return; - - UUID uuid = player.getUniqueId(); - Location loc = event.getClickedBlock().getLocation(); - - if(action == Action.LEFT_CLICK_BLOCK){ - if(leftClicks.containsKey(uuid) && isSamePosition(leftClicks.get(uuid), loc)) return; - leftClicks.put(uuid, loc); - if(!rightClicks.containsKey(uuid)) rightClicks.put(uuid, null); - } - if(action == Action.RIGHT_CLICK_BLOCK){ - if(rightClicks.containsKey(uuid) && isSamePosition(rightClicks.get(uuid), loc)) return; - rightClicks.put(uuid, loc); - if(!leftClicks.containsKey(uuid)) leftClicks.put(uuid, null); - } - - sendClickMessage(player, action, loc); - } - - private void sendClickMessage(Player player, Action action, Location loc) { - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - - String message = Messenger.prefix + "&aPosition "; - if (action == Action.LEFT_CLICK_BLOCK) { - message += "1"; - } - if (action == Action.RIGHT_CLICK_BLOCK) { - message += "2"; - } - message += "&r &f&oselected at &a" + x + "&f, &a" + y + "&f, &a" + z; - if (hasBothPositions(player)) { - message += " &7(" + getVolume(leftClicks.get(player.getUniqueId()), rightClicks.get(player.getUniqueId())) + ")"; - } - - Messenger.msg(player, message); - } - - private boolean isSamePosition(Location loc1, Location loc2){ - if(loc1 == null || loc2 == null) return false; - if(loc1.getBlockX() != loc2.getBlockX()) return false; - if(loc1.getBlockY() != loc2.getBlockY()) return false; - if(loc1.getBlockZ() != loc2.getBlockZ()) return false; - return true; - } - - private boolean hasBothPositions(Player player) { - UUID uuid = player.getUniqueId(); - return leftClicks.get(uuid) != null && rightClicks.get(uuid) != null; - } - - private int getVolume(Location loc1, Location loc2) { - int x = Math.abs(loc1.getBlockX() - loc2.getBlockX()) + 1; - int y = Math.abs(loc1.getBlockY() - loc2.getBlockY()) + 1; - int z = Math.abs(loc1.getBlockZ() - loc2.getBlockZ()) + 1; - - return Math.abs(x * y * z); - } +/** + * Manager for Bukkit event handlers to ensure + * proper usage of {@link Portal}s in game for events related to selecting + * portal locations. + */ +public class ToolSelectListener implements Listener { + + public static Map leftClicks = new HashMap<>(); + public static Map rightClicks = new HashMap<>(); + + @EventHandler + public void onHit(PlayerInteractEvent event) { + if (!event.getPlayer().hasPermission("portals.admin")) return; + + Action action = event.getAction(); + if (action != Action.LEFT_CLICK_BLOCK && action != Action.RIGHT_CLICK_BLOCK) return; + + Player player = event.getPlayer(); + ItemStack item = player.getInventory().getItemInMainHand(); + if (item.getType() != Main.TOOL_MATERIAL) return; + + UUID uuid = player.getUniqueId(); + if (event.getClickedBlock() == null) { + Main.getInstance().getLogger().severe("Could not find the clicked block in a PlayerInteractEvent"); + return; + } + Location loc = event.getClickedBlock().getLocation(); + + if (action == Action.LEFT_CLICK_BLOCK) { + if (leftClicks.containsKey(uuid) && isSamePosition(leftClicks.get(uuid), loc)) return; + leftClicks.put(uuid, loc); + if (!rightClicks.containsKey(uuid)) rightClicks.put(uuid, null); + } + if (action == Action.RIGHT_CLICK_BLOCK) { + if (rightClicks.containsKey(uuid) && isSamePosition(rightClicks.get(uuid), loc)) return; + rightClicks.put(uuid, loc); + if (!leftClicks.containsKey(uuid)) leftClicks.put(uuid, null); + } + + sendClickMessage(player, action, loc); + } + + private void sendClickMessage(Player player, Action action, Location loc) { + int x = loc.getBlockX(); + int y = loc.getBlockY(); + int z = loc.getBlockZ(); + + String message = Messenger.prefix + "&aPosition "; + if (action == Action.LEFT_CLICK_BLOCK) { + message += "1"; + } + if (action == Action.RIGHT_CLICK_BLOCK) { + message += "2"; + } + message += "&r &f&oselected at &a" + x + "&f, &a" + y + "&f, &a" + z; + if (hasBothPositions(player)) { + message += " &7(" + getVolume(leftClicks.get(player.getUniqueId()), rightClicks.get(player.getUniqueId())) + ")"; + } + + Messenger.msg(player, message); + } + + private boolean isSamePosition(Location loc1, Location loc2) { + if (loc1 == null || loc2 == null) return false; + if (loc1.getBlockX() != loc2.getBlockX()) return false; + if (loc1.getBlockY() != loc2.getBlockY()) return false; + if (loc1.getBlockZ() != loc2.getBlockZ()) return false; + return true; + } + + private boolean hasBothPositions(Player player) { + UUID uuid = player.getUniqueId(); + return leftClicks.get(uuid) != null && rightClicks.get(uuid) != null; + } + + private int getVolume(Location loc1, Location loc2) { + int x = Math.abs(loc1.getBlockX() - loc2.getBlockX()) + 1; + int y = Math.abs(loc1.getBlockY() - loc2.getBlockY()) + 1; + int z = Math.abs(loc1.getBlockZ() - loc2.getBlockZ()) + 1; + + return Math.abs(x * y * z); + } } diff --git a/src/main/java/edu/whimc/portals/utils/LocationSaver.java b/src/main/java/edu/whimc/portals/utils/LocationSaver.java index 271d0ba..ef46ef0 100644 --- a/src/main/java/edu/whimc/portals/utils/LocationSaver.java +++ b/src/main/java/edu/whimc/portals/utils/LocationSaver.java @@ -7,7 +7,7 @@ import edu.whimc.portals.Main; -public class LocationSaver { +public final class LocationSaver { private MyConfig portalData; @@ -15,16 +15,22 @@ public LocationSaver(Main plugin) { this.portalData = plugin.getPortalData(); } - public void saveLocation(Location loc, String path){ - if(loc == null){ + public void saveLocation(Location loc, String path) { + + if (loc == null) { portalData.removeKey(path); portalData.saveConfig(); portalData.reloadConfig(); return; } + if (loc.getWorld() == null) { + Main.getInstance().getLogger().severe("When saving a location, the world could not be found"); + return; + } + String world; - double x,y,z; - float yaw,pitch; + double x, y, z; + float yaw, pitch; world = loc.getWorld().getName(); x = loc.getX(); y = loc.getY(); @@ -41,8 +47,8 @@ public void saveLocation(Location loc, String path){ portalData.reloadConfig(); } - public void saveVector(Vector vector, String path){ - int x,y,z; + public void saveVector(Vector vector, String path) { + int x, y, z; x = vector.getBlockX(); y = vector.getBlockY(); z = vector.getBlockZ(); @@ -53,18 +59,18 @@ public void saveVector(Vector vector, String path){ portalData.reloadConfig(); } - public Location getLocation(String path){ + public Location getLocation(String path) { String worldName; - double x,y,z; - float yaw,pitch; - try{ + double x, y, z; + float yaw, pitch; + try { worldName = portalData.getString(path + ".world"); x = portalData.getDouble(path + ".x"); y = portalData.getDouble(path + ".y"); z = portalData.getDouble(path + ".z"); yaw = portalData.getFloat(path + ".yaw"); pitch = portalData.getFloat(path + ".pitch"); - }catch(Exception e){ + } catch (Exception e) { return null; } World world = Bukkit.getWorld(worldName); diff --git a/src/main/java/edu/whimc/portals/utils/Messenger.java b/src/main/java/edu/whimc/portals/utils/Messenger.java index 7f5cb23..f54b0c6 100644 --- a/src/main/java/edu/whimc/portals/utils/Messenger.java +++ b/src/main/java/edu/whimc/portals/utils/Messenger.java @@ -9,7 +9,16 @@ import edu.whimc.portals.Destination; import edu.whimc.portals.Portal; -public class Messenger { +/** + * Utility class for all common messaging actions. + */ +public final class Messenger { + + /** + * Private constructor to deter instantiation. + */ + private Messenger() { + } public static final String prefix = "&7[&b&lPortals&7]&r "; @@ -85,7 +94,7 @@ public static void sendDestinationInfo(CommandSender sender, Destination dest) { String list = ""; for (int ind = 0; ind < portals.size(); ind++) { list += portals.get(ind).toString(); - if (ind != portals.size() -1) { + if (ind != portals.size() - 1) { list += "&8,&r "; } } diff --git a/src/main/java/edu/whimc/portals/utils/MyConfig.java b/src/main/java/edu/whimc/portals/utils/MyConfig.java index d895feb..55f1f98 100644 --- a/src/main/java/edu/whimc/portals/utils/MyConfig.java +++ b/src/main/java/edu/whimc/portals/utils/MyConfig.java @@ -5,109 +5,151 @@ import java.util.List; import java.util.Set; +import edu.whimc.portals.Main; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPlugin; -public class MyConfig{ +public class MyConfig { - private int comments; - private MyConfigManager manager; + private int comments; + private MyConfigManager manager; - private File file; - private FileConfiguration config; + private File file; + private FileConfiguration config; - public MyConfig(/*InputStream configStream, */File configFile, int comments, JavaPlugin plugin) { - this.comments = comments; - this.manager = new MyConfigManager(plugin); - this.file = configFile; - this.config = YamlConfiguration.loadConfiguration(configFile); - } - - public Object get(String path) {return this.config.get(path);} - - public Object get(String path, Object def) {return this.config.get(path, def);} - - public String getString(String path) {return this.config.getString(path);} - - public String getString(String path, String def) {return this.config.getString(path, def);} - - public int getInt(String path) {return this.config.getInt(path);} - - public int getInt(String path, int def) {return this.config.getInt(path, def);} - - public long getLong(String path) {return this.config.getLong(path);} - - public boolean getBoolean(String path) {return this.config.getBoolean(path);} - - public boolean getBoolean(String path, boolean def) {return this.config.getBoolean(path, def);} - - public void createSection(String path) {this.config.createSection(path);} - - public ConfigurationSection getConfigurationSection(String path) {return this.config.getConfigurationSection(path);} - - public double getDouble(String path) {return this.config.getDouble(path);} - - public double getDouble(String path, double def) {return this.config.getDouble(path, def);} - - public float getFloat(String path) {return Float.valueOf(this.config.getString(path));} - - public List getList(String path) {return this.config.getList(path);} - - public List getList(String path, List def) {return this.config.getList(path, def);} - - public List getStringList(String path) {return this.config.getStringList(path);} - - public boolean contains(String path) {return this.config.contains(path);} - - public void removeKey(String path) {this.config.set(path, null);} - - public Set getKeys() {return this.config.getKeys(false);} - - public void set(String path, Object value) {this.config.set(path, value);} - - public void set(String path, Object value, String comment){ - if(!this.config.contains(path)) { - this.config.set(manager.getPluginName() + "_COMMENT_" + comments, " " + comment); - comments++; - } - this.config.set(path, value); - } - - public void set(String path, Object value, String[] comment) { - for(String comm : comment) { - if(!this.config.contains(path)) - { - this.config.set(manager.getPluginName() + "_COMMENT_" + comments, " " + comm); - comments++; - } - } - this.config.set(path, value); - } - - public void setHeader(String[] header) { - manager.setHeader(this.file, header); - this.comments = header.length + 2; - this.reloadConfig(); - } - - public void reloadConfig() { - try { - config.save(file); - config.load(file); - } catch (IOException | InvalidConfigurationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - //this.config = YamlConfiguration.loadConfiguration(file); - //this.config = YamlConfiguration.loadConfiguration(manager.getConfigContent(file)); - } - - public void saveConfig() { - String config = this.config.saveToString(); - manager.saveConfig(config, this.file); - } + public MyConfig(/*InputStream configStream, */File configFile, int comments, JavaPlugin plugin) { + this.comments = comments; + this.manager = new MyConfigManager(plugin); + this.file = configFile; + this.config = YamlConfiguration.loadConfiguration(configFile); + } + + public Object get(String path) { + return this.config.get(path); + } + + public Object get(String path, Object def) { + return this.config.get(path, def); + } + + public String getString(String path) { + return this.config.getString(path); + } + + public String getString(String path, String def) { + return this.config.getString(path, def); + } + + public int getInt(String path) { + return this.config.getInt(path); + } + + public int getInt(String path, int def) { + return this.config.getInt(path, def); + } + + public long getLong(String path) { + return this.config.getLong(path); + } + + public boolean getBoolean(String path) { + return this.config.getBoolean(path); + } + + public boolean getBoolean(String path, boolean def) { + return this.config.getBoolean(path, def); + } + + public void createSection(String path) { + this.config.createSection(path); + } + + public ConfigurationSection getConfigurationSection(String path) { + return this.config.getConfigurationSection(path); + } + + public double getDouble(String path) { + return this.config.getDouble(path); + } + + public double getDouble(String path, double def) { + return this.config.getDouble(path, def); + } + + public float getFloat(String path) { + return Float.valueOf(this.config.getString(path)); + } + + public List getList(String path) { + return this.config.getList(path); + } + + public List getList(String path, List def) { + return this.config.getList(path, def); + } + + public List getStringList(String path) { + return this.config.getStringList(path); + } + + public boolean contains(String path) { + return this.config.contains(path); + } + + public void removeKey(String path) { + this.config.set(path, null); + } + + public Set getKeys() { + return this.config.getKeys(false); + } + + public void set(String path, Object value) { + this.config.set(path, value); + } + + public void set(String path, Object value, String comment) { + if (!this.config.contains(path)) { + this.config.set(manager.getPluginName() + "_COMMENT_" + comments, " " + comment); + comments++; + } + this.config.set(path, value); + } + + public void set(String path, Object value, String[] comment) { + for (String comm : comment) { + if (!this.config.contains(path)) { + this.config.set(manager.getPluginName() + "_COMMENT_" + comments, " " + comm); + comments++; + } + } + this.config.set(path, value); + } + + public void setHeader(String[] header) { + manager.setHeader(this.file, header); + this.comments = header.length + 2; + this.reloadConfig(); + } + + public void reloadConfig() { + try { + config.save(file); + config.load(file); + } catch (IOException | InvalidConfigurationException e) { + Main.getInstance().getLogger().severe("Exception when reloading configuration. See stack trace."); + e.printStackTrace(); + } + + //this.config = YamlConfiguration.loadConfiguration(file); + //this.config = YamlConfiguration.loadConfiguration(manager.getConfigContent(file)); + } + + public void saveConfig() { + String config = this.config.saveToString(); + manager.saveConfig(config, this.file); + } } \ No newline at end of file diff --git a/src/main/java/edu/whimc/portals/utils/MyConfigManager.java b/src/main/java/edu/whimc/portals/utils/MyConfigManager.java index af27611..adff868 100644 --- a/src/main/java/edu/whimc/portals/utils/MyConfigManager.java +++ b/src/main/java/edu/whimc/portals/utils/MyConfigManager.java @@ -1,6 +1,6 @@ package edu.whimc.portals.utils; -import java.io.BufferedReader; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.File; @@ -13,277 +13,268 @@ import java.nio.charset.Charset; +import edu.whimc.portals.Main; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class MyConfigManager -{ - private JavaPlugin plugin; +public class MyConfigManager { + private JavaPlugin plugin; - public MyConfigManager(JavaPlugin plugin) - { - this.plugin = plugin; - } + public MyConfigManager(JavaPlugin plugin) { + this.plugin = plugin; + } - public MyConfig getNewConfig(String fileName, String[] header) - { - File file = this.getConfigFile(fileName); + public MyConfig getNewConfig(String fileName, String[] header) { + File file = this.getConfigFile(fileName); - if(!file.exists()) - { - this.prepareFile(fileName); - if(header != null && header.length != 0) - this.setHeader(file, header); - } - - MyConfig config = new MyConfig(/*this.getConfigContent(fileName), */file, this.getCommentsNum(file), plugin); - return config; - } - - public MyConfig getNewConfig(String fileName) - { - return this.getNewConfig(fileName, null); - } - - private File getConfigFile(String file) - { - if(file.isEmpty() || file == null) + if (file == null) { + Main.getInstance().getLogger().severe("Could not retrieve Portals config!"); return null; + } - File configFile; - - if(file.contains("/")) - { - if(file.startsWith("/")) - configFile = new File(plugin.getDataFolder() + file.replace("/", File.separator)); - else configFile = new File(plugin.getDataFolder() + File.separator + file.replace("/", File.separator)); - } - else configFile = new File(plugin.getDataFolder(), file); + if (!file.exists()) { + this.prepareFile(fileName); + if (header != null && header.length != 0) + this.setHeader(file, header); + } - return configFile; - } + return new MyConfig(/*this.getConfigContent(fileName), */file, this.getCommentsNum(file), plugin); + } - public void prepareFile(String filePath, String resource) - { - File file = this.getConfigFile(filePath); + public MyConfig getNewConfig(String fileName) { + return this.getNewConfig(fileName, null); + } - if(file.exists()) - return; + @Nullable + private File getConfigFile(String file) { + if (file == null || file.isEmpty()) + return null; - try - { - file.getParentFile().mkdirs(); - file.createNewFile(); + File configFile; - if(resource != null) - if(!resource.isEmpty()) - this.copyResource(plugin.getResource(resource), file); + if (file.contains("/")) { + if (file.startsWith("/")) + configFile = new File(plugin.getDataFolder() + file.replace("/", File.separator)); + else configFile = new File(plugin.getDataFolder() + File.separator + file.replace("/", File.separator)); + } else configFile = new File(plugin.getDataFolder(), file); - } - catch (IOException e){e.printStackTrace();} - } + return configFile; + } - public void prepareFile(String filePath) - { - this.prepareFile(filePath, null); - } + public void prepareFile(String filePath, String resource) { + File file = this.getConfigFile(filePath); - public void setHeader(File file, String[] header) - { - if(!file.exists()) + if (file == null) { + Main.getInstance().getLogger().severe("Could not retrieve Portals config!"); return; + } - try - { - String currentLine; - StringBuilder config = new StringBuilder(""); - BufferedReader reader = new BufferedReader(new FileReader(file)); - - while((currentLine = reader.readLine()) != null) - config.append(currentLine + "\n"); - - reader.close(); - config.append("# +----------------------------------------------------+ #\n"); - - for(String line : header) - { - if(line.length() > 50) - continue; - - int lenght = (50 - line.length()) / 2; - StringBuilder finalLine = new StringBuilder(line); - - for(int i = 0; i < lenght; i++) - { - finalLine.append(" "); - finalLine.reverse(); - finalLine.append(" "); - finalLine.reverse(); - } - - if(line.length() % 2 != 0) - finalLine.append(" "); + if (file.exists()) + return; - config.append("# < " + finalLine.toString() + " > #\n"); + try { + if (file.getParentFile().mkdirs()) { + Main.getInstance().getLogger().info("Config directories created."); } - config.append("# +----------------------------------------------------+ #"); - - BufferedWriter writer = new BufferedWriter(new FileWriter(file)); - writer.write(this.prepareConfigString(config.toString())); - writer.flush(); - writer.close(); - } - catch (IOException e){e.printStackTrace();} - } - - public InputStream getConfigContent(File file) - { - if(!file.exists()) - return null; - try - { - int commentNum = 0; - - String addLine; - String currentLine; - String pluginName = this.getPluginName(); - - StringBuilder whole = new StringBuilder(""); - BufferedReader reader = new BufferedReader(new FileReader(file)); - - while((currentLine = reader.readLine()) != null) - { - if(currentLine.startsWith("#")) - { - addLine = currentLine.replaceFirst("#", pluginName + "_COMMENT_" + commentNum + ":"); - whole.append(addLine + "\n"); - commentNum++; - } - else whole.append(currentLine + "\n"); + if (file.createNewFile()) { + Main.getInstance().getLogger().info("Config file created."); } - - String config = whole.toString(); - InputStream configStream = new ByteArrayInputStream(config.getBytes(Charset.forName("UTF-8"))); - - reader.close(); - return configStream; - } - catch (IOException e){e.printStackTrace();return null;} - } - - private int getCommentsNum(File file) - { - if(!file.exists()) - return 0; - try - { - int comments = 0; - String currentLine; - - BufferedReader reader = new BufferedReader(new FileReader(file)); - - while((currentLine = reader.readLine()) != null) - if(currentLine.startsWith("#")) - comments++; - - reader.close(); - return comments; - } - catch (IOException e){e.printStackTrace();return 0;} - } - - public InputStream getConfigContent(String filePath) - { - return this.getConfigContent(this.getConfigFile(filePath)); - } - - private String prepareConfigString(String configString) - { - int lastLine = 0; - int headerLine = 0; - - String[] lines = configString.split("\n"); - StringBuilder config = new StringBuilder(""); - - for(String line : lines) - { - if(line.startsWith(this.getPluginName() + "_COMMENT")) - { - String comment = "#" + line.trim().substring(line.indexOf(":") + 1); - - if(comment.startsWith("# +-")) - { - if(headerLine == 0) - { - config.append(comment + "\n"); - lastLine = 0; - headerLine = 1; - } - else if(headerLine == 1) - { - config.append(comment + "\n\n"); - lastLine = 0; - headerLine = 0; - } - } - else - { - String normalComment; - if(comment.startsWith("# ' ")) - normalComment = comment.substring(0, comment.length() - 1).replaceFirst("# ' ", "# "); - else normalComment = comment; - - if(lastLine == 0) - config.append(normalComment + "\n"); - else if(lastLine == 1) - config.append("\n" + normalComment + "\n"); - - lastLine = 0; + if (resource != null && !resource.isEmpty()) { + InputStream resourceStream = plugin.getResource(resource); + if (resourceStream == null) { + Main.getInstance().getLogger().severe("Could not find resource \"" + + resource + + "\" when trying to copy it to the new config file."); + return; } - } - else - { - config.append(line + "\n"); - lastLine = 1; + this.copyResource(resourceStream, file); } - } - return config.toString(); - } - - public void saveConfig(String configString, File file) - { - String configuration = this.prepareConfigString(configString); - - try - { - BufferedWriter writer = new BufferedWriter(new FileWriter(file)); - writer.write(configuration); - writer.flush(); - writer.close(); - - } - catch (IOException e){e.printStackTrace();} - } - - public String getPluginName() - { - return plugin.getDescription().getName(); - } - - private void copyResource(InputStream resource, File file) - { - try - { - OutputStream out = new FileOutputStream(file); - - int length; - byte[] buf = new byte[1024]; - - while((length = resource.read(buf)) > 0) - out.write(buf, 0, length); - - out.close(); - resource.close(); - } - catch (Exception e) {e.printStackTrace();} - } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void prepareFile(String filePath) { + this.prepareFile(filePath, null); + } + + public void setHeader(File file, String[] header) { + if (!file.exists()) + return; + + try { + String currentLine; + StringBuilder config = new StringBuilder(""); + BufferedReader reader = new BufferedReader(new FileReader(file)); + + while ((currentLine = reader.readLine()) != null) + config.append(currentLine).append("\n"); + + reader.close(); + config.append("# +----------------------------------------------------+ #\n"); + + for (String line : header) { + if (line.length() > 50) + continue; + + int lenght = (50 - line.length()) / 2; + StringBuilder finalLine = new StringBuilder(line); + + for (int i = 0; i < lenght; i++) { + finalLine.append(" "); + finalLine.reverse(); + finalLine.append(" "); + finalLine.reverse(); + } + + if (line.length() % 2 != 0) + finalLine.append(" "); + + config.append("# < " + finalLine.toString() + " > #\n"); + } + config.append("# +----------------------------------------------------+ #"); + + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write(this.prepareConfigString(config.toString())); + writer.flush(); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public InputStream getConfigContent(File file) { + if (!file.exists()) + return null; + try { + int commentNum = 0; + + String addLine; + String currentLine; + String pluginName = this.getPluginName(); + + StringBuilder whole = new StringBuilder(""); + BufferedReader reader = new BufferedReader(new FileReader(file)); + + while ((currentLine = reader.readLine()) != null) { + if (currentLine.startsWith("#")) { + addLine = currentLine.replaceFirst("#", pluginName + "_COMMENT_" + commentNum + ":"); + whole.append(addLine + "\n"); + commentNum++; + } else whole.append(currentLine + "\n"); + } + + String config = whole.toString(); + InputStream configStream = new ByteArrayInputStream(config.getBytes(Charset.forName("UTF-8"))); + + reader.close(); + return configStream; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + private int getCommentsNum(File file) { + if (!file.exists()) + return 0; + try { + int comments = 0; + String currentLine; + + BufferedReader reader = new BufferedReader(new FileReader(file)); + + while ((currentLine = reader.readLine()) != null) + if (currentLine.startsWith("#")) + comments++; + + reader.close(); + return comments; + } catch (IOException e) { + e.printStackTrace(); + return 0; + } + } + + public InputStream getConfigContent(String filePath) { + return this.getConfigContent(this.getConfigFile(filePath)); + } + + private String prepareConfigString(String configString) { + int lastLine = 0; + int headerLine = 0; + + String[] lines = configString.split("\n"); + StringBuilder config = new StringBuilder(""); + + for (String line : lines) { + if (line.startsWith(this.getPluginName() + "_COMMENT")) { + String comment = "#" + line.trim().substring(line.indexOf(":") + 1); + + if (comment.startsWith("# +-")) { + if (headerLine == 0) { + config.append(comment + "\n"); + lastLine = 0; + headerLine = 1; + } else if (headerLine == 1) { + config.append(comment + "\n\n"); + lastLine = 0; + headerLine = 0; + } + } else { + String normalComment; + if (comment.startsWith("# ' ")) + normalComment = comment.substring(0, comment.length() - 1).replaceFirst("# ' ", "# "); + else normalComment = comment; + + if (lastLine == 0) + config.append(normalComment + "\n"); + else if (lastLine == 1) + config.append("\n" + normalComment + "\n"); + + lastLine = 0; + } + } else { + config.append(line + "\n"); + lastLine = 1; + } + } + return config.toString(); + } + + public void saveConfig(String configString, File file) { + String configuration = this.prepareConfigString(configString); + + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write(configuration); + writer.flush(); + writer.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + public String getPluginName() { + return plugin.getDescription().getName(); + } + + private void copyResource(@NotNull InputStream resource, File file) { + try { + OutputStream out = new FileOutputStream(file); + + int length; + byte[] buf = new byte[1024]; + + while ((length = resource.read(buf)) > 0) + out.write(buf, 0, length); + + out.close(); + resource.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } } \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a8fcf3e..90b2006 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -8,6 +8,6 @@ load: POSTWORLD softdepend: [Multiverse-Core] commands: portal: - description: Root command for WHIMC Portals + description: Root command for WHIMC portals destination: - description: Root command for WHIMC Portal \ No newline at end of file + description: Root command for WHIMC portal destinations \ No newline at end of file