From 2fd40d7f90ab7ee462a83d45074713b6aec7fab6 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Fri, 15 Aug 2025 19:21:17 +0000 Subject: [PATCH] Dateien nach "src/main/java/net/licks92/wirelessredstone/commands" hochladen --- .../wirelessredstone/commands/Activate.java | 68 ++++++ .../commands/CommandInfo.java | 20 ++ .../commands/CommandManager.java | 211 ++++++++++++++++++ .../wirelessredstone/commands/Create.java | 106 +++++++++ .../wirelessredstone/commands/Help.java | 70 ++++++ .../wirelessredstone/commands/Info.java | 114 ++++++++++ .../wirelessredstone/commands/Lock.java | 37 +++ .../wirelessredstone/commands/Remove.java | 38 ++++ .../wirelessredstone/commands/Teleport.java | 107 +++++++++ .../wirelessredstone/commands/Version.java | 16 ++ .../commands/WirelessCommand.java | 15 ++ .../WirelessCommandTabCompletion.java | 5 + 12 files changed, 807 insertions(+) create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Activate.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/CommandInfo.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/CommandManager.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Create.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Help.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Info.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Lock.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Remove.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Teleport.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/Version.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/WirelessCommand.java create mode 100644 src/main/java/net/licks92/wirelessredstone/commands/WirelessCommandTabCompletion.java diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Activate.java b/src/main/java/net/licks92/wirelessredstone/commands/Activate.java new file mode 100644 index 0000000..bbd997d --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Activate.java @@ -0,0 +1,68 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.ConfigManager; +import net.licks92.wirelessredstone.signs.WirelessChannel; +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.command.CommandSender; + +@CommandInfo(description = "Activate a channel (for a certain amount of ms)", usage = " [time] [-s]", aliases = {"activate", "a"}, + tabCompletion = {WirelessCommandTabCompletion.CHANNEL}, + permission = "activate", canUseInConsole = true, canUseInCommandBlock = true) +public class Activate extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { + if (args.length == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandTooFewArguments, sender, true); + return; + } + + WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(args[0]); + if (channel == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().channelNotFound, sender, true); + return; + } + + if (!hasAccessToChannel(sender, args[0])) { + Utils.sendFeedback(WirelessRedstone.getStrings().permissionChannelAccess, sender, true); + return; + } + + boolean silence = false; + Integer time = ConfigManager.getConfig().getInteractTransmitterTime(); + + if (args.length >= 2) { + int timeIndex = 1; + for (String arg : args) { + if (arg.equalsIgnoreCase("-s")) { + silence = true; + timeIndex++; + break; + } + } + + try { + time = Integer.parseInt(args[timeIndex]); + } catch (NumberFormatException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandNoNumber, sender, true); + return; + } + } + + if (time < 50 && time > 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandActivationMin, sender, true); + return; + } + + if (time < 0) { + time = 0; + } + + channel.turnOn(time); + + if (!silence) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandActivated, sender, false, true); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/licks92/wirelessredstone/commands/CommandInfo.java b/src/main/java/net/licks92/wirelessredstone/commands/CommandInfo.java new file mode 100644 index 0000000..4033a01 --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/CommandInfo.java @@ -0,0 +1,20 @@ +package net.licks92.wirelessredstone.commands; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface CommandInfo { + + String description(); + String usage(); + String[] aliases(); + WirelessCommandTabCompletion[] tabCompletion() default {}; + String permission(); + + boolean canUseInConsole(); + boolean canUseInCommandBlock(); +} \ No newline at end of file diff --git a/src/main/java/net/licks92/wirelessredstone/commands/CommandManager.java b/src/main/java/net/licks92/wirelessredstone/commands/CommandManager.java new file mode 100644 index 0000000..b64d4a4 --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/CommandManager.java @@ -0,0 +1,211 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.signs.SignType; +import net.licks92.wirelessredstone.storage.StorageType; +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandException; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Vector; +import java.util.logging.Level; +import java.util.stream.Collectors; + +public class CommandManager implements CommandExecutor, TabCompleter { + + private final ArrayList cmds; + + public CommandManager() { + cmds = new ArrayList<>(); + cmds.add(new Help()); + cmds.add(new Version()); + cmds.add(new Create()); + cmds.add(new Remove()); + cmds.add(new Info()); + cmds.add(new Activate()); + cmds.add(new Teleport()); + cmds.add(new Lock()); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { + if (cmd.getName().equalsIgnoreCase("wr") || cmd.getName().equalsIgnoreCase("wredstone") + || cmd.getName().equalsIgnoreCase("wifi") || cmd.getName().equalsIgnoreCase("wirelessredstone")) { + if (args.length == 0) { + int timer = 0; + for (WirelessCommand gcmd : cmds) { + if (timer == 0) + Utils.sendFeedback(ChatColor.WHITE + "WirelessRedstone help menu", sender, false); //TODO: Add this string to the stringloader + if (timer >= 8) { + Utils.sendFeedback("Use /wr help 2 for the next page.", sender, false); //TODO: Add this string to the stringloader + break; + } + + CommandInfo info = gcmd.getClass().getAnnotation(CommandInfo.class); + if (sender.hasPermission("wirelessredstone.commands." + info.permission())) { + Utils.sendCommandFeedback(ChatColor.GRAY + "- " + ChatColor.GREEN + "/wr " + + String.join("|", info.aliases()) + getCommandUsage(info) + ChatColor.WHITE + " - " + + ChatColor.GRAY + info.description(), sender, false); + timer++; + } + } + if (timer == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().permissionGeneral, sender, true, true); + } + + return true; + } + + WirelessCommand wanted = null; + + for (WirelessCommand gcmd : cmds) { + CommandInfo info = gcmd.getClass().getAnnotation(CommandInfo.class); + for (String alias : info.aliases()) { + if (alias.equals(args[0])) { + wanted = gcmd; + break; + } + } + } + + if (wanted == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandNotFound, sender, true, true); + return true; + } + + if (!sender.hasPermission("wirelessredstone.commands." + wanted.getClass().getAnnotation(CommandInfo.class).permission())) { + Utils.sendFeedback(WirelessRedstone.getStrings().permissionGeneral, sender, true, true); + return true; + } + + if (!wanted.getClass().getAnnotation(CommandInfo.class).canUseInCommandBlock() && !(sender instanceof Player || sender instanceof ConsoleCommandSender)) { + WirelessRedstone.getWRLogger().info("Commandblocks are not allowed to run command: /wr " + args[0]); + return true; + } + + if (!wanted.getClass().getAnnotation(CommandInfo.class).canUseInConsole() && sender instanceof ConsoleCommandSender) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandOnlyInGame, sender, true); + return true; + } + + Vector a = new Vector(Arrays.asList(args)); + a.remove(0); + args = a.toArray(new String[0]); + + try { + wanted.onCommand(sender, args); + } catch (RuntimeException ex) { + sender.sendMessage(ChatColor.RED + "An internal error occurred while attempting to perform this command"); + + CommandException commandException = new CommandException(ex.getMessage(), ex); + WirelessRedstone.getInstance().getLogger().log(Level.SEVERE, "An exception was raised", commandException); + } + } + + return true; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + if (sender.isOp() || sender.hasPermission("wirelessredstone.Admin.isAdmin") || + sender.hasPermission("wirelessredstone.commands." + args[0])) { + List completions = new ArrayList<>(); + + if (args.length == 1) { + String partialCommand = args[0]; + List commands = new ArrayList<>(); + + for (WirelessCommand cmd : cmds) { + commands.add(cmd.getClass().getAnnotation(CommandInfo.class).aliases()[0]); + } + + StringUtil.copyPartialMatches(partialCommand, commands, completions); + } + + if (args.length >= 2) { + WirelessCommand wanted = null; + + for (WirelessCommand gcmd : cmds) { + CommandInfo info = gcmd.getClass().getAnnotation(CommandInfo.class); + for (String alias : info.aliases()) { + if (alias.equals(args[0])) { + wanted = gcmd; + break; + } + } + } + + if (wanted != null) { + if (args.length == 2) { + String partial = args[1]; + List availableCompletions = getPossibleTabCompletions(wanted, 0); + StringUtil.copyPartialMatches(partial, availableCompletions, completions); + } else if (args.length == 3) { + String partial = args[2]; + List availableCompletions = getPossibleTabCompletions(wanted, 1); + StringUtil.copyPartialMatches(partial, availableCompletions, completions); + } + } + } + + Collections.sort(completions); + + return completions; + } + + return null; + } + + public List getCommands() { + return cmds; + } + + private String getCommandUsage(CommandInfo info) { + if (info.usage().equalsIgnoreCase("")) + return ""; + else + return " " + info.usage(); + } + + private List getPossibleTabCompletions(WirelessCommand command, int index) { + List availableCompletions = new ArrayList<>(); + + WirelessCommandTabCompletion[] tabCompletion = command.getClass().getAnnotation(CommandInfo.class).tabCompletion(); + if (tabCompletion.length >= index + 1) { + if (tabCompletion[index] == WirelessCommandTabCompletion.BOOL) { + availableCompletions.add(Boolean.TRUE.toString()); + availableCompletions.add(Boolean.FALSE.toString()); + } else if (tabCompletion[index] == WirelessCommandTabCompletion.PLAYER) { + availableCompletions.addAll(Bukkit.getOnlinePlayers().stream() + .map(HumanEntity::getName) + .collect(Collectors.toList())); + } else if (tabCompletion[index] == WirelessCommandTabCompletion.CHANNEL) { + WirelessRedstone.getStorageManager().getChannels() + .forEach(c -> availableCompletions.add(c.getName())); + } else if (tabCompletion[index] == WirelessCommandTabCompletion.SIGNTYPE) { + for (SignType type : SignType.values()) { + availableCompletions.add(type.name()); + } + } else if (tabCompletion[index] == WirelessCommandTabCompletion.STORAGETYPE) { + for (StorageType type : StorageType.values()) { + availableCompletions.add(type.name()); + } + } + } + + return availableCompletions; + } +} diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Create.java b/src/main/java/net/licks92/wirelessredstone/commands/Create.java new file mode 100644 index 0000000..1e6b03e --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Create.java @@ -0,0 +1,106 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.signs.SignType; +import net.licks92.wirelessredstone.signs.WirelessChannel; +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Collections; + +@CommandInfo(description = "Create a WirelessPoint", usage = " [sign details]", aliases = {"create", "c"}, + tabCompletion = {WirelessCommandTabCompletion.CHANNEL, WirelessCommandTabCompletion.SIGNTYPE}, + permission = "create", canUseInConsole = false, canUseInCommandBlock = false) +public class Create extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { + if (args.length < 2) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandTooFewArguments, sender, true); + return; + } + + if (Utils.getType(args[1]) == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandIncorrectSignType, sender, true); + return; + } + + String cname = args[0]; + SignType type = Utils.getType(args[1]); + + if (type == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandIncorrectSignType, sender, true); + return; + } + + if (type == SignType.RECEIVER_CLOCK || type == SignType.RECEIVER_DELAYER) { + if (args.length < 3) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandTooFewArguments, sender, true); + return; + } + + } + + WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(cname); + if (channel != null) { + if (!hasAccessToChannel(sender, cname)) { + Utils.sendFeedback(WirelessRedstone.getStrings().permissionChannelAccess, sender, true); + return; + } + } + + Player player = (Player) sender; + Location location = player.getLocation(); + + if (location.getBlock().getType() != Material.AIR) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidSignLocation, sender, true); + return; + } + + int extraData = 0; + + if (type == SignType.RECEIVER_DELAYER) { + try { + extraData = Integer.parseInt(args[2]); + } catch (NumberFormatException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().delayNumberOnly, sender, true); + location.getBlock().setType(Material.AIR); + return; + } + } else if (type == SignType.RECEIVER_CLOCK) { + try { + extraData = Integer.parseInt(args[2]); + } catch (NumberFormatException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().intervalNumberOnly, sender, true); + location.getBlock().setType(Material.AIR); + return; + } + } + + if (!WirelessRedstone.getSignManager().placeSign(cname, location, type, extraData)) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidSignLocation, sender, true); + return; + } + + //TODO: #registerSign Implement error message if failed + int result = WirelessRedstone.getSignManager().registerSign( + cname, location.getBlock(), type, Utils.yawToFace(location.getYaw()), + Collections.singletonList(player.getUniqueId().toString()), extraData + ); + + if (result == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().channelExtended, sender, false); + } else if (result == 1) { + Utils.sendFeedback(WirelessRedstone.getStrings().channelCreated, sender, false); + } else if (result == -1) { + location.getBlock().setType(Material.AIR); + Utils.sendFeedback(WirelessRedstone.getStrings().commandDelayMin, sender, true); + } else if (result == -2) { + location.getBlock().setType(Material.AIR); + Utils.sendFeedback(WirelessRedstone.getStrings().commandIntervalMin, sender, true); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Help.java b/src/main/java/net/licks92/wirelessredstone/commands/Help.java new file mode 100644 index 0000000..0a4a088 --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Help.java @@ -0,0 +1,70 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; + +@CommandInfo(aliases = {"help", "h"}, description = "Show all available commands", + permission = "help", usage = "[page]", canUseInConsole = true, canUseInCommandBlock = true) +public class Help extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { //TODO: Add all these strings to the stringloader + int page = 1; + if (args.length > 0) { + try { + page = Integer.parseInt(args[0]); + } catch (NumberFormatException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInferiorZero, sender, true); + return; + } + } + + ArrayList commandList = new ArrayList<>(); + for (WirelessCommand gcmd : WirelessRedstone.getCommandManager().getCommands()) { + CommandInfo info = gcmd.getClass().getAnnotation(CommandInfo.class); + commandList.add(ChatColor.GRAY + "- " + ChatColor.GREEN + "/wr " + + String.join(":", info.aliases()) + " " + + info.usage() + ChatColor.WHITE + " - " + + ChatColor.GRAY + info.description()); + } + + int commandListLength = WirelessRedstone.getCommandManager().getCommands().size(); + int maxItemsPerPage = 8; + int totalPages = 1; + + for (int i = 0; i < commandListLength / maxItemsPerPage; i++) { + totalPages++; + } + + if (commandListLength % maxItemsPerPage == 0) { + totalPages--; + } + + if (page > totalPages) { + if (totalPages > 1) + Utils.sendFeedback("There are only " + totalPages + " pages.", sender, true); + else + Utils.sendFeedback("There is only 1 page.", sender, true); + return; + } + + int currentItem = ((page * maxItemsPerPage) - maxItemsPerPage); + // 2*3 = 6 ; 6 - 3 = 3 + + Utils.sendFeedback(ChatColor.WHITE + "WirelessRedstone help menu", sender, false); + Utils.sendFeedback(ChatColor.WHITE + "Page " + page + " of " + totalPages, sender, false); + + if (totalPages == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandNoData, sender, true); + } else { + for (int i = currentItem; i < (currentItem + maxItemsPerPage); i++) { + if (!(i >= commandListLength)) + Utils.sendCommandFeedback(commandList.get(i), sender, false); + } + } + } +} diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Info.java b/src/main/java/net/licks92/wirelessredstone/commands/Info.java new file mode 100644 index 0000000..4a880a7 --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Info.java @@ -0,0 +1,114 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.signs.SignType; +import net.licks92.wirelessredstone.signs.WirelessChannel; +import net.licks92.wirelessredstone.signs.WirelessReceiver; +import net.licks92.wirelessredstone.signs.WirelessScreen; +import net.licks92.wirelessredstone.signs.WirelessTransmitter; +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandInfo(description = "Shows WirelessChannel information", usage = " [signtype]", aliases = {"info", "i"}, + tabCompletion = {WirelessCommandTabCompletion.CHANNEL, WirelessCommandTabCompletion.SIGNTYPE}, + permission = "info", canUseInConsole = true, canUseInCommandBlock = true) +public class Info extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { + if (args.length == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandTooFewArguments, sender, true); + return; + } + + WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(args[0]); + if (channel == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().channelNotFound, sender, true); + return; + } + + SignType signType = null; + + if (args.length >= 2) + signType = Utils.getType(args[1]); + + if (signType == null) { + Utils.sendFeedback(ChatColor.GRAY + "---- " + ChatColor.GREEN + "WirelessChannel " + channel.getName() + ChatColor.GRAY + " ----", + sender, false); + Utils.sendFeedback(ChatColor.GRAY + "Is active: " + + ((channel.isActive()) ? ChatColor.GREEN + "Yes" : ChatColor.RED + "No"), sender, false); + Utils.sendFeedback(ChatColor.GRAY + "Is locked: " + + ((channel.isLocked()) ? ChatColor.GREEN + "Yes" : ChatColor.RED + "No"), sender, false); + Utils.sendFeedback(ChatColor.GRAY + "Sign Types:", sender, false); + Utils.sendFeedback(ChatColor.GRAY.toString() + channel.getTransmitters().size() + ChatColor.GREEN + " transmitters, " + + ChatColor.GRAY + channel.getReceivers().size() + ChatColor.GREEN + " receivers, " + + ChatColor.GRAY + channel.getScreens().size() + ChatColor.GREEN + " screens", sender, false); + } else { + if (!(sender instanceof Player)) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandOnlyInGame, sender, true); + return; + } + + int index; + switch (signType) { + case TRANSMITTER: + if (channel.getTransmitters().size() == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandSignNotFound, sender, true); + return; + } + + index = 0; + for (WirelessTransmitter transmitter : channel.getTransmitters()) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), Utils.getTeleportString(sender.getName()) + .replaceAll("%%HOVERTEXT", "Click me to teleport to the sign location!") + .replaceAll("%%NAME", channel.getName()).replaceAll("%%TYPE", "transmitter") + .replaceAll("%%WORLD", transmitter.getWorld()).replaceAll("%%XCOORD", transmitter.getX() + "") + .replaceAll("%%YCOORD", transmitter.getY() + "").replaceAll("%%ZCOORD", transmitter.getZ() + "") + .replaceAll("%%COMMAND", "/wr tp " + channel.getName() + " transmitter " + index)); + index++; + } + break; + case RECEIVER: + if (channel.getReceivers().size() == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandSignNotFound, sender, true); + return; + } + + index = 0; + for (WirelessReceiver receiver : channel.getReceivers()) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), Utils.getTeleportString(sender.getName()) + .replaceAll("%%HOVERTEXT", "Click me to teleport to the sign location!") + .replaceAll("%%NAME", channel.getName()).replaceAll("%%TYPE", "receiver") + .replaceAll("%%WORLD", receiver.getWorld()).replaceAll("%%XCOORD", receiver.getX() + "") + .replaceAll("%%YCOORD", receiver.getY() + "").replaceAll("%%ZCOORD", receiver.getZ() + "") + .replaceAll("%%COMMAND", "/wr tp " + channel.getName() + " receiver " + index)); + index++; + } + break; + case SCREEN: + if (channel.getScreens().size() == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandSignNotFound, sender, true); + return; + } + + index = 0; + for (WirelessScreen screen : channel.getScreens()) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), Utils.getTeleportString(sender.getName()) + .replaceAll("%%HOVERTEXT", "Click me to teleport to the sign location!") + .replaceAll("%%NAME", channel.getName()).replaceAll("%%TYPE", "screen") + .replaceAll("%%WORLD", screen.getWorld()).replaceAll("%%XCOORD", screen.getX() + "") + .replaceAll("%%YCOORD", screen.getY() + "").replaceAll("%%ZCOORD", screen.getZ() + "") + .replaceAll("%%COMMAND", "/wr tp " + channel.getName() + " screen " + index)); + index++; + } + break; + default: + Utils.sendFeedback(WirelessRedstone.getStrings().commandSignNotFound, sender, true); + break; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Lock.java b/src/main/java/net/licks92/wirelessredstone/commands/Lock.java new file mode 100644 index 0000000..75b98c2 --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Lock.java @@ -0,0 +1,37 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.signs.WirelessChannel; +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.command.CommandSender; + +@CommandInfo(description = "Toggle/set locked state for WirelessChannel", usage = " [state]", aliases = {"lock"}, + tabCompletion = {WirelessCommandTabCompletion.CHANNEL, WirelessCommandTabCompletion.BOOL}, + permission = "lock", canUseInConsole = true, canUseInCommandBlock = true) +public class Lock extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { + if (args.length == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandTooFewArguments, sender, true); + return; + } + + String cname = args[0]; + WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(cname); + if (channel == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().channelNotFound, sender, true); + return; + } + + boolean newState = !channel.isLocked(); + if (args.length >= 2) { + if (args[1].equalsIgnoreCase("true") || args[1].equalsIgnoreCase("false")) + newState = args[1].equalsIgnoreCase("true"); + } + + channel.setLocked(newState); + WirelessRedstone.getStorage().updateChannel(args[0], channel); + Utils.sendFeedback(newState ? WirelessRedstone.getStrings().channelLocked : WirelessRedstone.getStrings().channelUnlocked, sender, false); + } +} \ No newline at end of file diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Remove.java b/src/main/java/net/licks92/wirelessredstone/commands/Remove.java new file mode 100644 index 0000000..261fa4d --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Remove.java @@ -0,0 +1,38 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.command.CommandSender; + +@CommandInfo(description = "Remove WirelessChannel", usage = " [remove signs]", aliases = {"remove"}, + tabCompletion = {WirelessCommandTabCompletion.CHANNEL, WirelessCommandTabCompletion.BOOL}, + permission = "remove", canUseInConsole = true, canUseInCommandBlock = false) +public class Remove extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { + if (args.length == 0) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandTooFewArguments, sender, true); + return; + } + + if (WirelessRedstone.getStorageManager().getChannel(args[0]) == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().channelNotFound, sender, true); + return; + } + + if (!hasAccessToChannel(sender, args[0])) { + Utils.sendFeedback(WirelessRedstone.getStrings().permissionChannelAccess, sender, true); + return; + } + + boolean removeSigns = false; + if (args.length >= 2) { + if (args[1].equalsIgnoreCase("true") || args[1].equalsIgnoreCase("false")) + removeSigns = args[1].equalsIgnoreCase("true"); + } + + WirelessRedstone.getStorage().removeChannel(args[0], removeSigns); + Utils.sendFeedback(WirelessRedstone.getStrings().channelRemoved, sender, false); + } +} \ No newline at end of file diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Teleport.java b/src/main/java/net/licks92/wirelessredstone/commands/Teleport.java new file mode 100644 index 0000000..3a5a340 --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Teleport.java @@ -0,0 +1,107 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import net.licks92.wirelessredstone.signs.WirelessChannel; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandInfo(description = "Teleport to specific sign", usage = " ", aliases = {"teleport", "tp"}, + tabCompletion = {WirelessCommandTabCompletion.CHANNEL, WirelessCommandTabCompletion.SIGNTYPE}, + permission = "teleport", canUseInConsole = false, canUseInCommandBlock = false) +public class Teleport extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { + if (args.length < 3) { + //TODO: Add this to stringloader + Utils.sendFeedback("This command is for advanced users only. Use /wr info for more user-friendly version.", sender, true); + return; + } + + WirelessChannel channel = WirelessRedstone.getStorageManager().getChannel(args[0]); + if (channel == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().channelNotFound, sender, true); + return; + } + + if (!hasAccessToChannel(sender, args[0])) { + Utils.sendFeedback(WirelessRedstone.getStrings().permissionChannelAccess, sender, true); + return; + } + + int index; + try { + index = Integer.parseInt(args[2]); + } catch (NumberFormatException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandNoNumber, sender, true); + return; + } + + Player player = (Player) sender; + + switch (args[1].toUpperCase()) { + case "TRANSMITTER": + case "TRANSMITTERS": + case "T": + try { + if (channel.getTransmitters().get(index).getWorld() == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidLocation, player, true); + return; + } + + Location locTransmitter = channel.getTransmitters().get(index).getLocation().add(0.5, 0, 0.5); + + locTransmitter.setYaw(player.getLocation().getYaw()); + locTransmitter.setPitch(player.getLocation().getPitch()); + player.teleport(locTransmitter); + } catch (IndexOutOfBoundsException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandSignNotFound, player, true); + } catch (IllegalArgumentException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidLocation, player, true); + } + break; + case "RECEIVER": + case "RECEIVERS": + case "R": + try { + if (channel.getReceivers().get(index).getWorld() == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidLocation, player, true); + return; + } + + Location locReceiver = channel.getReceivers().get(index).getLocation().add(0.5, 0, 0.5); + + locReceiver.setYaw(player.getLocation().getYaw()); + locReceiver.setPitch(player.getLocation().getPitch()); + player.teleport(locReceiver); + } catch (IndexOutOfBoundsException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandSignNotFound, player, true); + } catch (IllegalArgumentException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidLocation, player, true); + } + break; + case "SCREEN": + case "SCREENS": + case "S": + try { + if (channel.getScreens().get(index).getWorld() == null) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidLocation, player, true); + return; + } + + Location locScreen = channel.getScreens().get(index).getLocation().add(0.5, 0, 0.5); + + locScreen.setYaw(player.getLocation().getYaw()); + locScreen.setPitch(player.getLocation().getPitch()); + player.teleport(locScreen); + } catch (IndexOutOfBoundsException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandSignNotFound, player, true); + } catch (IllegalArgumentException ex) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandInvalidLocation, player, true); + } + break; + } + } +} diff --git a/src/main/java/net/licks92/wirelessredstone/commands/Version.java b/src/main/java/net/licks92/wirelessredstone/commands/Version.java new file mode 100644 index 0000000..42dc626 --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/Version.java @@ -0,0 +1,16 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.Utils; +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.command.CommandSender; + +@CommandInfo(description = "Get WirelessRedstone version", usage = "", aliases = {"version", "v"}, + permission = "version", canUseInConsole = true, canUseInCommandBlock = true) +public class Version extends WirelessCommand { + + @Override + public void onCommand(CommandSender sender, String[] args) { + Utils.sendFeedback(WirelessRedstone.getStrings().commandVersion.replaceAll("%%VERSION", WirelessRedstone.getInstance().getDescription().getVersion()), + sender, false); + } +} \ No newline at end of file diff --git a/src/main/java/net/licks92/wirelessredstone/commands/WirelessCommand.java b/src/main/java/net/licks92/wirelessredstone/commands/WirelessCommand.java new file mode 100644 index 0000000..357f2ca --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/WirelessCommand.java @@ -0,0 +1,15 @@ +package net.licks92.wirelessredstone.commands; + +import net.licks92.wirelessredstone.WirelessRedstone; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public abstract class WirelessCommand { + + public abstract void onCommand(CommandSender sender, String[] args); + + public boolean hasAccessToChannel(CommandSender sender, String channelName) { + return !(sender instanceof Player) || WirelessRedstone.getSignManager().hasAccessToChannel((Player) sender, channelName); //If it's console or commandBlock, it has access to channel. + } + +} diff --git a/src/main/java/net/licks92/wirelessredstone/commands/WirelessCommandTabCompletion.java b/src/main/java/net/licks92/wirelessredstone/commands/WirelessCommandTabCompletion.java new file mode 100644 index 0000000..4b3c18e --- /dev/null +++ b/src/main/java/net/licks92/wirelessredstone/commands/WirelessCommandTabCompletion.java @@ -0,0 +1,5 @@ +package net.licks92.wirelessredstone.commands; + +public enum WirelessCommandTabCompletion { + BOOL, PLAYER, CHANNEL, SIGNTYPE, STORAGETYPE +}