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/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 c073766..39c6f3d 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.command.PluginCommand;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
@@ -21,14 +22,18 @@
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);
@@ -58,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() {
@@ -78,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);
}
}
@@ -103,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
new file mode 100644
index 0000000..b70a2f1
--- /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.getSubCommand(), 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..26db4de 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";
@@ -24,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;
@@ -33,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;
@@ -44,17 +48,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 +77,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 +110,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..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,22 +6,27 @@
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;
-public 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();
+/**
+ * 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(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);
}
@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 +39,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..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,22 +4,26 @@
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;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public 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");
+/**
+ * Allows a user to remove a {@link edu.whimc.portals.Destination}.
+ *
+ * @see DestinationCommand
+ */
+public final class DestinationClear extends AbstractSubCommand {
+
+ public DestinationClear(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +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/destination/DestinationCommand.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationCommand.java
index cb8ea5c..4955857 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) {
+ public DestinationCommand() {
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("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 d2aad8a..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,23 +4,29 @@
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;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public 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();
+/**
+ * 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(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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;
@@ -32,7 +38,7 @@ protected 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 7141d15..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,23 +5,27 @@
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;
-public 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");
+/**
+ * Provide a user with information about a {@link Destination}.
+ *
+ * @see DestinationCommand
+ */
+public final class DestinationInfo extends AbstractSubCommand {
+
+ public DestinationInfo(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +35,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..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,20 +4,24 @@
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;
-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");
+ public DestinationList(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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..9981ed1 100644
--- a/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java
+++ b/src/main/java/edu/whimc/portals/commands/destination/DestinationPurge.java
@@ -1,27 +1,32 @@
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;
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;
-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'");
+ public DestinationPurge(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +50,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..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,21 +5,25 @@
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;
-public class DestinationRemove extends AbstractSubCommand {
-
- public DestinationRemove(Main plugin, String baseCommand, String subCommand) {
- super(plugin, baseCommand, subCommand);
- super.description("Removes a destination");
- super.arguments("destination");
+/**
+ * Allow a user to remove a specific {@link Destination} by name.
+ *
+ * @see DestinationCommand
+ */
+public final class DestinationRemove extends AbstractSubCommand {
+
+ public DestinationRemove(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +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/DestinationSet.java b/src/main/java/edu/whimc/portals/commands/destination/DestinationSet.java
index 32379c4..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,22 +5,26 @@
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;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public 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");
+/**
+ * Allow a user to set the {@link Destination} of a {@link Portal}.
+ *
+ * @see DestinationCommand
+ */
+public final class DestinationSet extends AbstractSubCommand {
+
+ public DestinationSet(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +43,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..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,23 +6,29 @@
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;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public 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();
+/**
+ * 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(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);
}
@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]);
@@ -34,7 +40,7 @@ protected 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());
}
@@ -46,7 +52,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..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,22 +6,26 @@
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;
-public 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();
+/**
+ * Allow a player to teleport directly to a {@link Destination}.
+ *
+ * @see DestinationCommand
+ */
+public final class DestinationTeleport extends AbstractSubCommand {
+
+ public DestinationTeleport(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +43,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..8f396ca 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) {
+ public PortalCommand() {
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("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 d2a70ba..eda15e5 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();
+ 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);
}
@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) {
+ Main.getInstance().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;
@@ -44,7 +56,7 @@ protected 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 138092c..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,22 +3,29 @@
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;
import edu.whimc.portals.utils.Messenger.Message;
-public 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();
+/**
+ * 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(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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..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,22 +4,26 @@
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;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public 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");
+/**
+ * Give a user information about a {@link Portal}
+ *
+ * @see PortalCommand
+ */
+public final class PortalInfo extends AbstractSubCommand {
+
+ public PortalInfo(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +35,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..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,21 +3,25 @@
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;
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");
+ public PortalList(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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..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,24 +4,28 @@
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;
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 + "'");
+ public PortalPermission(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +45,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..b6ce73d 100644
--- a/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java
+++ b/src/main/java/edu/whimc/portals/commands/portal/PortalPurge.java
@@ -1,27 +1,31 @@
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;
-import edu.whimc.portals.Main;
import edu.whimc.portals.Portal;
import edu.whimc.portals.commands.AbstractSubCommand;
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'");
+ public PortalPurge(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +49,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..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,22 +4,27 @@
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;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public 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");
+/**
+ * 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(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +43,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..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,24 +4,28 @@
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;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public class PortalRemove extends AbstractSubCommand {
-
- public PortalRemove(Main plugin, String baseCommand, String subCommand) {
- super(plugin, baseCommand, subCommand);
- super.description("Removes a portal");
- super.arguments("portal");
+/**
+ * Allow a user to remove a {@link Portal}.
+ *
+ * @see PortalCommand
+ */
+public final class PortalRemove extends AbstractSubCommand {
+
+ public PortalRemove(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +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/PortalReshape.java b/src/main/java/edu/whimc/portals/commands/portal/PortalReshape.java
index 3744d70..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;
@@ -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();
+ public PortalReshape(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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]);
@@ -40,6 +47,12 @@ protected 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;
@@ -51,7 +64,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..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,22 +6,27 @@
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;
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");
+ public PortalSetFiller(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +41,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 +56,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..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,24 +6,29 @@
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;
import edu.whimc.portals.utils.Messenger;
import edu.whimc.portals.utils.Messenger.ReplaceMessage;
-public 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();
+/**
+ * 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(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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 +56,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..0c75e70 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();
+ protected PortalTool(String baseCommand, String subCommand) {
+ super(baseCommand, subCommand);
+ 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/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 93e226f..9001a3b 100644
--- a/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java
+++ b/src/main/java/edu/whimc/portals/listeners/ToolSelectListener.java
@@ -4,8 +4,9 @@
import java.util.Map;
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;
@@ -15,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 == null || item.getType() != Material.WOODEN_SWORD) 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 f525502..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 ";
}
}
@@ -113,7 +122,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;
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