From 268f0a320937a6d28d75c3d7665065ded179ed1d Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Tue, 31 May 2022 14:38:24 +0200 Subject: [PATCH] Adds a visualizer as described in #2 --- README.md | 1 + .../stargatecommand/command/CommandDial.java | 4 + .../command/CommandStarGateCommand.java | 2 + .../command/CommandVisualizer.java | 86 +++++++++++++++++++ .../command/ConfigTabCompleter.java | 21 +---- .../command/DialTabCompleter.java | 6 +- .../command/StargateCommandTabCompleter.java | 5 ++ .../command/VisualizerTabCompleter.java | 44 ++++++++++ .../util/PortalFinderHelper.java | 6 +- .../util/TabCompleterHelper.java | 32 +++++++ src/main/resources/plugin.yml | 4 + 11 files changed, 190 insertions(+), 21 deletions(-) create mode 100644 src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java create mode 100644 src/main/java/net/knarcraft/stargatecommand/command/VisualizerTabCompleter.java create mode 100644 src/main/java/net/knarcraft/stargatecommand/util/TabCompleterHelper.java diff --git a/README.md b/README.md index bf502d0..2316d3d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Stargate-Command is an addon for Stargate which adds additional useful commands ``` stargate.command.config - Gives access to the `/sgc config` command stargate.command.dial - Gives access to the `/sgc dial` command +stargate.command.visualizer- Gives access to the `/sgc visualizer` command ``` # Changes diff --git a/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java b/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java index 0fddd51..09220a2 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java @@ -37,6 +37,10 @@ public class CommandDial implements CommandExecutor { commandSender.sendMessage("This command can only be used by players"); return true; } + if (!player.hasPermission("stargate.command.dial")) { + player.sendMessage("Permission Denied"); + return true; + } if (args.length < 2) { player.sendMessage("You need to provide a network name and a portal name to dial"); diff --git a/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java b/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java index 6ff7066..718ff8d 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java @@ -39,6 +39,8 @@ public class CommandStarGateCommand implements CommandExecutor { commandSender, command, s, subArgs); } else if (args[0].equalsIgnoreCase("dial")) { return new CommandDial(stargateAPI).onCommand(commandSender, command, s, subArgs); + } else if (args[0].equalsIgnoreCase("visualizer")) { + return new CommandVisualizer(stargateAPI.getRegistry()).onCommand(commandSender, command, s, subArgs); } } return false; diff --git a/src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java b/src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java new file mode 100644 index 0000000..f062b29 --- /dev/null +++ b/src/main/java/net/knarcraft/stargatecommand/command/CommandVisualizer.java @@ -0,0 +1,86 @@ +package net.knarcraft.stargatecommand.command; + +import net.TheDgtl.Stargate.network.Network; +import net.TheDgtl.Stargate.network.RegistryAPI; +import net.TheDgtl.Stargate.network.portal.FixedPortal; +import net.TheDgtl.Stargate.network.portal.Portal; +import net.TheDgtl.Stargate.network.portal.PortalFlag; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +/** + * This command represents the command for visualizing a Stargate network + */ +public class CommandVisualizer implements CommandExecutor { + + private final RegistryAPI registryAPI; + + /** + * Instantiates a visualizer command + * + * @param registryAPI

A reference to the registry API

+ */ + public CommandVisualizer(RegistryAPI registryAPI) { + this.registryAPI = registryAPI; + } + + @Override + public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, + @NotNull String[] args) { + if (!commandSender.hasPermission("stargate.command.visualizer")) { + commandSender.sendMessage("Permission Denied"); + return true; + } + + if (args.length < 1) { + commandSender.sendMessage("A network must be provided"); + return true; + } + + Network network = registryAPI.getNetwork(args[0], false); + if (network == null) { + commandSender.sendMessage("You must provide a valid network to visualize"); + return true; + } + + StringBuilder stringBuilder = new StringBuilder(); + + stringBuilder.append("All portals in network: ").append(network.getName()).append("\n"); + stringBuilder.append("Symbol explanation: ").append("\n"); + stringBuilder.append("# = hidden, ¤ = not hidden").append("\n"); + stringBuilder.append("O = always on, - = not always on").append("\n"); + stringBuilder.append("| = fixed, > = destination choose-able"); + + //Print info about all portals in the network + for (Portal portal : network.getAllPortals()) { + stringBuilder.append("\n"); + if (portal.hasFlag(PortalFlag.HIDDEN)) { + stringBuilder.append('#'); + } else { + stringBuilder.append('¤'); + } + if (portal.hasFlag(PortalFlag.ALWAYS_ON)) { + stringBuilder.append('O'); + } else { + stringBuilder.append('-'); + } + //TODO: Look for the fixed flag instead of FixedPortal once it's fixed + if (portal instanceof FixedPortal) { + stringBuilder.append('|'); + } else { + stringBuilder.append('>'); + } + stringBuilder.append(" ").append(portal.getName()); + if (portal instanceof FixedPortal) { + stringBuilder.append(" -> "); + stringBuilder.append(portal.getDestinationName()); + } + } + + commandSender.sendMessage(stringBuilder.toString()); + return true; + } + +} diff --git a/src/main/java/net/knarcraft/stargatecommand/command/ConfigTabCompleter.java b/src/main/java/net/knarcraft/stargatecommand/command/ConfigTabCompleter.java index 0e94ece..aab2f81 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/ConfigTabCompleter.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/ConfigTabCompleter.java @@ -11,8 +11,10 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import static net.knarcraft.stargatecommand.util.TabCompleterHelper.filterMatching; + /** - * This is the completer for stargates config sub-command (/sg config) + * This is the completer for stargates config sub-command (/sgc config) */ public class ConfigTabCompleter implements TabCompleter { @@ -60,23 +62,6 @@ public class ConfigTabCompleter implements TabCompleter { } } - /** - * Find completable strings which match the text typed by the command's sender - * - * @param values

The values to filter

- * @param typedText

The text the player has started typing

- * @return

The given string values which start with the player's typed text

- */ - private List filterMatching(List values, String typedText) { - List configValues = new ArrayList<>(); - for (String value : values) { - if (value.toLowerCase().startsWith(typedText.toLowerCase())) { - configValues.add(value); - } - } - return configValues; - } - /** * Get possible values for the selected option * diff --git a/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java b/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java index 52230aa..dffb3bd 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java @@ -20,6 +20,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import static net.knarcraft.stargatecommand.util.TabCompleterHelper.filterMatching; + /** * A tab completer for the /sgc dial command */ @@ -56,12 +58,12 @@ public class DialTabCompleter implements TabCompleter { if (args.length > 1) { Network network = registryAPI.getNetwork(args[0], false); if (network != null && availablePortals.containsKey(network)) { - return availablePortals.get(network); + return filterMatching(availablePortals.get(network), args[1]); } else { return new ArrayList<>(); } } else { - return availableNetworks; + return filterMatching(availableNetworks, args[0]); } } diff --git a/src/main/java/net/knarcraft/stargatecommand/command/StargateCommandTabCompleter.java b/src/main/java/net/knarcraft/stargatecommand/command/StargateCommandTabCompleter.java index 6a4f9cb..704f217 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/StargateCommandTabCompleter.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/StargateCommandTabCompleter.java @@ -52,6 +52,8 @@ public class StargateCommandTabCompleter implements TabCompleter { return new ConfigTabCompleter(bannedConfigOptions).onTabComplete(commandSender, command, s, subArgs); } else if (args[0].equalsIgnoreCase("dial")) { return new DialTabCompleter(stargateAPI).onTabComplete(commandSender, command, s, subArgs); + } else if (args[0].equalsIgnoreCase("visualizer")) { + return new VisualizerTabCompleter(stargateAPI.getRegistry()).onTabComplete(commandSender, command, s, subArgs); } } return new ArrayList<>(); @@ -71,6 +73,9 @@ public class StargateCommandTabCompleter implements TabCompleter { if (commandSender instanceof Player player && player.hasPermission("stargate.command.dial")) { commands.add("dial"); } + if (commandSender instanceof Player player && player.hasPermission("stargate.command.visualizer")) { + commands.add("visualizer"); + } return commands; } diff --git a/src/main/java/net/knarcraft/stargatecommand/command/VisualizerTabCompleter.java b/src/main/java/net/knarcraft/stargatecommand/command/VisualizerTabCompleter.java new file mode 100644 index 0000000..ab2d244 --- /dev/null +++ b/src/main/java/net/knarcraft/stargatecommand/command/VisualizerTabCompleter.java @@ -0,0 +1,44 @@ +package net.knarcraft.stargatecommand.command; + +import net.TheDgtl.Stargate.network.RegistryAPI; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +import static net.knarcraft.stargatecommand.util.TabCompleterHelper.filterMatching; + +/** + * A tab completer for the /sgc visualizer command + */ +public class VisualizerTabCompleter implements TabCompleter { + + private final RegistryAPI registryAPI; + + /** + * Instantiates a visualizer tab completer + * + * @param registryAPI

A reference to the registry API

+ */ + public VisualizerTabCompleter(RegistryAPI registryAPI) { + this.registryAPI = registryAPI; + } + + @Nullable + @Override + public List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, + @NotNull String[] args) { + if (args.length < 2) { + List networkNames = new ArrayList<>(); + registryAPI.getNetworkMap().values().forEach(item -> networkNames.add(item.getName())); + return filterMatching(networkNames, args[0]); + } else { + return new ArrayList<>(); + } + } + +} diff --git a/src/main/java/net/knarcraft/stargatecommand/util/PortalFinderHelper.java b/src/main/java/net/knarcraft/stargatecommand/util/PortalFinderHelper.java index 2aa1ffb..9a02325 100644 --- a/src/main/java/net/knarcraft/stargatecommand/util/PortalFinderHelper.java +++ b/src/main/java/net/knarcraft/stargatecommand/util/PortalFinderHelper.java @@ -10,7 +10,11 @@ import org.bukkit.util.Vector; /** * A helper class for helping with finding portals in the world */ -public class PortalFinderHelper { +public final class PortalFinderHelper { + + private PortalFinderHelper() { + + } /** * Find the portal a living entity is looking at using a single traced ray diff --git a/src/main/java/net/knarcraft/stargatecommand/util/TabCompleterHelper.java b/src/main/java/net/knarcraft/stargatecommand/util/TabCompleterHelper.java new file mode 100644 index 0000000..e171975 --- /dev/null +++ b/src/main/java/net/knarcraft/stargatecommand/util/TabCompleterHelper.java @@ -0,0 +1,32 @@ +package net.knarcraft.stargatecommand.util; + +import java.util.ArrayList; +import java.util.List; + +/** + * A helper class for helping with tab completion + */ +public final class TabCompleterHelper { + + private TabCompleterHelper() { + + } + + /** + * Find completable strings which match the text typed by the command's sender + * + * @param values

The values to filter

+ * @param typedText

The text the player has started typing

+ * @return

The given string values which start with the player's typed text

+ */ + public static List filterMatching(List values, String typedText) { + List configValues = new ArrayList<>(); + for (String value : values) { + if (value.toLowerCase().startsWith(typedText.toLowerCase())) { + configValues.add(value); + } + } + return configValues; + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 42ce2fd..c0c0c4d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -14,10 +14,14 @@ commands: / / config / dial + / visualizer permissions: stargate.command.config: description: Allows the use of /sgc config default: false stargate.command.dial: description: Allows the use of /sgc dial + default: op + stargate.command.visualizer: + description: Allows the use of /sgc visualizer default: op \ No newline at end of file