diff --git a/README.md b/README.md index 35e362c..bf502d0 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Stargate-Command is an addon for Stargate which adds additional useful commands #### Features: * The ability to edit the config file through commands, and automated reloading of changed values +* The ability to dial any Stargate accessible to the Player ## Dependencies @@ -18,6 +19,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 ``` # Changes @@ -25,6 +27,7 @@ stargate.command.config - Gives access to the `/sgc config` command [Version 0.1.0] - Full takeover removing old functionality, and, for now, replacing it with config editing +- Adds /sgc dial for dialing any wanted Stargate [Version 0.0.4] - Fix for Bukkit's direction fix [Version 0.0.3] diff --git a/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java b/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java index cd282d4..4598d3a 100644 --- a/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java +++ b/src/main/java/net/knarcraft/stargatecommand/StargateCommand.java @@ -36,7 +36,7 @@ public class StargateCommand extends JavaPlugin { PluginCommand stargateCommand = this.getCommand("stargateCommand"); if (stargateCommand != null) { stargateCommand.setExecutor(new CommandStarGateCommand(stargateAPI, bannedConfigOptions)); - stargateCommand.setTabCompleter(new StargateCommandTabCompleter(bannedConfigOptions)); + stargateCommand.setTabCompleter(new StargateCommandTabCompleter(stargateAPI, bannedConfigOptions)); } } else { throw new IllegalStateException("Unable to hook into Stargate. Make sure the Stargate plugin is installed " + diff --git a/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java b/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java new file mode 100644 index 0000000..6c45172 --- /dev/null +++ b/src/main/java/net/knarcraft/stargatecommand/command/CommandDial.java @@ -0,0 +1,89 @@ +package net.knarcraft.stargatecommand.command; + +import net.TheDgtl.Stargate.api.StargateAPI; +import net.TheDgtl.Stargate.manager.PermissionManager; +import net.TheDgtl.Stargate.network.Network; +import net.TheDgtl.Stargate.network.RegistryAPI; +import net.TheDgtl.Stargate.network.portal.RealPortal; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; + +/** + * This command represents the dial command for dialing any available Stargate + */ +public class CommandDial implements CommandExecutor { + + private final StargateAPI stargateAPI; + private final RegistryAPI registryAPI; + + /** + * Instantiates a new dial command + * + * @param stargateAPI
A reference to the Stargate API
+ */ + public CommandDial(StargateAPI stargateAPI) { + this.stargateAPI = stargateAPI; + this.registryAPI = stargateAPI.getRegistry(); + } + + @Override + public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, + @NotNull String[] args) { + if (!(commandSender instanceof Player player)) { + commandSender.sendMessage("This command can only be used by players"); + return true; + } + + if (args.length < 2) { + player.sendMessage("You need to provide a network name and a portal name to dial"); + return true; + } + + PermissionManager permissionManager = stargateAPI.getPermissionManager(player); + String networkName = args[0]; + String portalName = args[1]; + Network network = registryAPI.getNetwork(networkName, false); + if (network == null) { + commandSender.sendMessage("Invalid network selected"); + return true; + } + + RealPortal targetPortal = (RealPortal) network.getPortal(portalName); + if (targetPortal == null) { + commandSender.sendMessage("Invalid portal selected"); + return true; + } + + if (!permissionManager.hasAccessPermission(targetPortal)) { + commandSender.sendMessage("You don't have access to the selected portal"); + return true; + } + + //Find any Stargate block in the player's line of sight + RealPortal originPortal = null; + Location playerLocation = player.getLocation().add(0, player.getEyeHeight(), 0); + Vector playerDirection = player.getLocation().getDirection(); + for (int i = 0; i < 10; i++) { + playerLocation.add(playerDirection); + originPortal = registryAPI.getPortal(playerLocation); + if (originPortal != null) { + break; + } + } + if (originPortal == null) { + player.sendMessage("You need to look at a portal to dial"); + return true; + } + originPortal.overrideDestination(targetPortal); + originPortal.open(player); + + player.sendMessage("Your Stargate has been prepared"); + return true; + } + +} diff --git a/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java b/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java index a7631dd..6ff7066 100644 --- a/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java +++ b/src/main/java/net/knarcraft/stargatecommand/command/CommandStarGateCommand.java @@ -33,10 +33,12 @@ public class CommandStarGateCommand implements CommandExecutor { public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { if (args.length > 0) { + String[] subArgs = (String[]) ArrayUtils.remove(args, 0); if (args[0].equalsIgnoreCase("config")) { - String[] subArgs = (String[]) ArrayUtils.remove(args, 0); return new CommandConfig(stargateAPI.getConfigurationAPI(), bannedConfigOptions).onCommand( commandSender, command, s, subArgs); + } else if (args[0].equalsIgnoreCase("dial")) { + return new CommandDial(stargateAPI).onCommand(commandSender, command, s, subArgs); } } return false; diff --git a/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java b/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java new file mode 100644 index 0000000..52230aa --- /dev/null +++ b/src/main/java/net/knarcraft/stargatecommand/command/DialTabCompleter.java @@ -0,0 +1,95 @@ +package net.knarcraft.stargatecommand.command; + +import net.TheDgtl.Stargate.api.StargateAPI; +import net.TheDgtl.Stargate.manager.PermissionManager; +import net.TheDgtl.Stargate.network.Network; +import net.TheDgtl.Stargate.network.RegistryAPI; +import net.TheDgtl.Stargate.network.portal.Portal; +import net.TheDgtl.Stargate.network.portal.RealPortal; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * A tab completer for the /sgc dial command + */ +public class DialTabCompleter implements TabCompleter { + + private final StargateAPI stargateAPI; + + /** + * Instantiates a new dial tab completer + * + * @param stargateAPIA reference to the Stargate API
+ */ + public DialTabCompleter(StargateAPI stargateAPI) { + this.stargateAPI = stargateAPI; + } + + @Nullable + @Override + public ListThe permission manager to use to check for availability
+ * @param availableNetworksThe list to store available networks to
+ * @param availablePortalsThe map to store available portals to
+ */ + private void populateNetworksAndPortals(PermissionManager permissionManager, ListA reference to the Stargate API
* @param bannedConfigOptionsA list of config options that shouldn't be available
*/ - public StargateCommandTabCompleter(List