Adds a visualizer as described in #2
This commit is contained in:
@@ -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.config - Gives access to the `/sgc config` command
|
||||||
stargate.command.dial - Gives access to the `/sgc dial` command
|
stargate.command.dial - Gives access to the `/sgc dial` command
|
||||||
|
stargate.command.visualizer- Gives access to the `/sgc visualizer` command
|
||||||
```
|
```
|
||||||
|
|
||||||
# Changes
|
# Changes
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ public class CommandDial implements CommandExecutor {
|
|||||||
commandSender.sendMessage("This command can only be used by players");
|
commandSender.sendMessage("This command can only be used by players");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (!player.hasPermission("stargate.command.dial")) {
|
||||||
|
player.sendMessage("Permission Denied");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (args.length < 2) {
|
if (args.length < 2) {
|
||||||
player.sendMessage("You need to provide a network name and a portal name to dial");
|
player.sendMessage("You need to provide a network name and a portal name to dial");
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ public class CommandStarGateCommand implements CommandExecutor {
|
|||||||
commandSender, command, s, subArgs);
|
commandSender, command, s, subArgs);
|
||||||
} else if (args[0].equalsIgnoreCase("dial")) {
|
} else if (args[0].equalsIgnoreCase("dial")) {
|
||||||
return new CommandDial(stargateAPI).onCommand(commandSender, command, s, subArgs);
|
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;
|
return false;
|
||||||
|
|||||||
@@ -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 <p>A reference to the registry API</p>
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -11,8 +11,10 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
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 {
|
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 <p>The values to filter</p>
|
|
||||||
* @param typedText <p>The text the player has started typing</p>
|
|
||||||
* @return <p>The given string values which start with the player's typed text</p>
|
|
||||||
*/
|
|
||||||
private List<String> filterMatching(List<String> values, String typedText) {
|
|
||||||
List<String> 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
|
* Get possible values for the selected option
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ import java.util.LinkedList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static net.knarcraft.stargatecommand.util.TabCompleterHelper.filterMatching;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A tab completer for the /sgc dial command
|
* A tab completer for the /sgc dial command
|
||||||
*/
|
*/
|
||||||
@@ -56,12 +58,12 @@ public class DialTabCompleter implements TabCompleter {
|
|||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
Network network = registryAPI.getNetwork(args[0], false);
|
Network network = registryAPI.getNetwork(args[0], false);
|
||||||
if (network != null && availablePortals.containsKey(network)) {
|
if (network != null && availablePortals.containsKey(network)) {
|
||||||
return availablePortals.get(network);
|
return filterMatching(availablePortals.get(network), args[1]);
|
||||||
} else {
|
} else {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return availableNetworks;
|
return filterMatching(availableNetworks, args[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ public class StargateCommandTabCompleter implements TabCompleter {
|
|||||||
return new ConfigTabCompleter(bannedConfigOptions).onTabComplete(commandSender, command, s, subArgs);
|
return new ConfigTabCompleter(bannedConfigOptions).onTabComplete(commandSender, command, s, subArgs);
|
||||||
} else if (args[0].equalsIgnoreCase("dial")) {
|
} else if (args[0].equalsIgnoreCase("dial")) {
|
||||||
return new DialTabCompleter(stargateAPI).onTabComplete(commandSender, command, s, subArgs);
|
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<>();
|
return new ArrayList<>();
|
||||||
@@ -71,6 +73,9 @@ public class StargateCommandTabCompleter implements TabCompleter {
|
|||||||
if (commandSender instanceof Player player && player.hasPermission("stargate.command.dial")) {
|
if (commandSender instanceof Player player && player.hasPermission("stargate.command.dial")) {
|
||||||
commands.add("dial");
|
commands.add("dial");
|
||||||
}
|
}
|
||||||
|
if (commandSender instanceof Player player && player.hasPermission("stargate.command.visualizer")) {
|
||||||
|
commands.add("visualizer");
|
||||||
|
}
|
||||||
return commands;
|
return commands;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 <p>A reference to the registry API</p>
|
||||||
|
*/
|
||||||
|
public VisualizerTabCompleter(RegistryAPI registryAPI) {
|
||||||
|
this.registryAPI = registryAPI;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
|
||||||
|
@NotNull String[] args) {
|
||||||
|
if (args.length < 2) {
|
||||||
|
List<String> networkNames = new ArrayList<>();
|
||||||
|
registryAPI.getNetworkMap().values().forEach(item -> networkNames.add(item.getName()));
|
||||||
|
return filterMatching(networkNames, args[0]);
|
||||||
|
} else {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -10,7 +10,11 @@ import org.bukkit.util.Vector;
|
|||||||
/**
|
/**
|
||||||
* A helper class for helping with finding portals in the world
|
* 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
|
* Find the portal a living entity is looking at using a single traced ray
|
||||||
|
|||||||
@@ -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 <p>The values to filter</p>
|
||||||
|
* @param typedText <p>The text the player has started typing</p>
|
||||||
|
* @return <p>The given string values which start with the player's typed text</p>
|
||||||
|
*/
|
||||||
|
public static List<String> filterMatching(List<String> values, String typedText) {
|
||||||
|
List<String> configValues = new ArrayList<>();
|
||||||
|
for (String value : values) {
|
||||||
|
if (value.toLowerCase().startsWith(typedText.toLowerCase())) {
|
||||||
|
configValues.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return configValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -14,6 +14,7 @@ commands:
|
|||||||
/<command> <config/dial>
|
/<command> <config/dial>
|
||||||
/<command> config <config option> <new value>
|
/<command> config <config option> <new value>
|
||||||
/<command> dial <network name> <portal name>
|
/<command> dial <network name> <portal name>
|
||||||
|
/<command> visualizer <network name>
|
||||||
permissions:
|
permissions:
|
||||||
stargate.command.config:
|
stargate.command.config:
|
||||||
description: Allows the use of /sgc config
|
description: Allows the use of /sgc config
|
||||||
@@ -21,3 +22,6 @@ permissions:
|
|||||||
stargate.command.dial:
|
stargate.command.dial:
|
||||||
description: Allows the use of /sgc dial
|
description: Allows the use of /sgc dial
|
||||||
default: op
|
default: op
|
||||||
|
stargate.command.visualizer:
|
||||||
|
description: Allows the use of /sgc visualizer
|
||||||
|
default: op
|
||||||
Reference in New Issue
Block a user