From cadb98c457e1012fd687320934ff73881e2a0984 Mon Sep 17 00:00:00 2001 From: davidontop Date: Fri, 9 Feb 2024 14:04:36 +0100 Subject: [PATCH] Initial commit --- .gitignore | 3 + README.md | 2 + pom.xml | 75 +++++++++ .../the/david/restartqueue/Restartqueue.java | 148 ++++++++++++++++++ .../restartqueue/command/CommandHelp.java | 18 +++ .../david/restartqueue/command/CommandRQ.java | 84 ++++++++++ .../restartqueue/command/CommandRQA.java | 76 +++++++++ .../restartqueue/command/CommandRQOff.java | 17 ++ .../restartqueue/command/CommandRQOn.java | 15 ++ .../command/ConstructTabCompleter.java | 38 +++++ .../command/ConstructTabCompleterRQA.java | 41 +++++ .../david/restartqueue/db/LeverStoradge.java | 106 +++++++++++++ src/main/resources/plugin.yml | 28 ++++ 13 files changed, 651 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/the/david/restartqueue/Restartqueue.java create mode 100644 src/main/java/the/david/restartqueue/command/CommandHelp.java create mode 100644 src/main/java/the/david/restartqueue/command/CommandRQ.java create mode 100644 src/main/java/the/david/restartqueue/command/CommandRQA.java create mode 100644 src/main/java/the/david/restartqueue/command/CommandRQOff.java create mode 100644 src/main/java/the/david/restartqueue/command/CommandRQOn.java create mode 100644 src/main/java/the/david/restartqueue/command/ConstructTabCompleter.java create mode 100644 src/main/java/the/david/restartqueue/command/ConstructTabCompleterRQA.java create mode 100644 src/main/java/the/david/restartqueue/db/LeverStoradge.java create mode 100644 src/main/resources/plugin.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e1a0c4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +target/ +testserver/ +restartqueue.iml \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..58ec1ef --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# restartDisable +disables farms on restart diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d40026a --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + the.david.restartqueue + restartqueue + 0.45 + jar + + RestartQueue + + add levers to be turned off before restart + + 1.8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + false + + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + io.papermc.paper + paper-api + 1.19-R0.1-SNAPSHOT + provided + + + diff --git a/src/main/java/the/david/restartqueue/Restartqueue.java b/src/main/java/the/david/restartqueue/Restartqueue.java new file mode 100644 index 0000000..61b9ee6 --- /dev/null +++ b/src/main/java/the/david/restartqueue/Restartqueue.java @@ -0,0 +1,148 @@ +package the.david.restartqueue; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Powerable; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import the.david.restartqueue.command.*; +import the.david.restartqueue.db.LeverStoradge; + +import java.util.ArrayList; +import java.util.List; + +public final class Restartqueue extends JavaPlugin { + //init storadge and make it accesible in other classes + public static LeverStoradge storadge = new LeverStoradge(); + @Override + public void onEnable() { + //init commands and tab completors + this.getCommand("rq").setExecutor(new CommandRQ()); + this.getCommand("rq").setTabCompleter(new ConstructTabCompleter()); + this.getCommand("rqoff").setExecutor(new CommandRQOff()); + this.getCommand("rqon").setExecutor(new CommandRQOn()); + this.getCommand("rqhelp").setExecutor(new CommandHelp()); + this.getCommand("rqa").setExecutor(new CommandRQA()); + this.getCommand("rqa").setTabCompleter(new ConstructTabCompleterRQA()); + } + + @Override + public void onDisable() { + //TODO decide if we want to add shutdown hook that stops farms before restart + } + + public static void leversOff() { + JSONArray json = storadge.getArrayFromFile(); + List toRemove = new ArrayList<>(); + List toAdd = new ArrayList<>(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + World world = Bukkit.getWorld(obj.get("world_name").toString()); + JSONArray loc = (JSONArray) obj.get("location"); + List location = new ArrayList<>(); + for (int i = 0;i<3; i++) { + location.add(loc.get(i).toString()); + } + Block block = world.getBlockAt(Integer.parseInt(location.get(0)), Integer.parseInt(location.get(1)), Integer.parseInt(location.get(2))); + if (block.getType() != Material.LEVER) { + toRemove.add(o); + continue; + } + BlockData data = block.getBlockData(); + if (data instanceof Powerable) { + Powerable powerable = (Powerable) data; + if (powerable.isPowered()) { + block.getChunk().load(); + ((Powerable) data).setPowered(false); + block.setBlockData(data); + obj.remove("todo"); + obj.put("todo", 1); + toRemove.add(o); + toAdd.add(obj); + } + } + } + json.removeAll(toRemove); + json.addAll(toAdd); + storadge.writeFile(json); + } + + public static void leversOff(boolean shouldIgnorerqon) { + JSONArray json = storadge.getArrayFromFile(); + List toRemove = new ArrayList<>(); + List toAdd = new ArrayList<>(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + World world = Bukkit.getWorld(obj.get("world_name").toString()); + JSONArray loc = (JSONArray) obj.get("location"); + List location = new ArrayList<>(); + for (int i = 0;i<3; i++) { + location.add(loc.get(i).toString()); + } + Block block = world.getBlockAt(Integer.parseInt(location.get(0)), Integer.parseInt(location.get(1)), Integer.parseInt(location.get(2))); + if (block.getType() != Material.LEVER) { + toRemove.add(o); + continue; + } + BlockData data = block.getBlockData(); + if (data instanceof Powerable) { + Powerable powerable = (Powerable) data; + if (powerable.isPowered()) { + block.getChunk().load(); + ((Powerable) data).setPowered(false); + block.setBlockData(data); + if (!shouldIgnorerqon) { + obj.remove("todo"); + obj.put("todo", 1); + toRemove.add(o); + toAdd.add(obj); + } + } + } + } + json.removeAll(toRemove); + json.addAll(toAdd); + storadge.writeFile(json); + } + + public static void leversOn() { + JSONArray json = storadge.getArrayFromFile(); + List toRemove = new ArrayList<>(); + List toAdd = new ArrayList<>(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + World world = Bukkit.getWorld(obj.get("world_name").toString()); + JSONArray loc = (JSONArray) obj.get("location"); + List location = new ArrayList<>(); + for (int i = 0;i<3; i++) { + location.add(loc.get(i).toString()); + } + Block block = world.getBlockAt(Integer.parseInt(location.get(0)), Integer.parseInt(location.get(1)), Integer.parseInt(location.get(2))); + if (block.getType() != Material.LEVER) { + toRemove.add(o); + } + BlockData data = block.getBlockData(); + if (data instanceof Powerable) { + Powerable powerable = (Powerable) data; + if (!powerable.isPowered()) { + if (obj.get("todo").toString().equalsIgnoreCase("1")) { + block.getChunk().load(); + ((Powerable) data).setPowered(true); + block.setBlockData(data); + obj.remove("todo"); + obj.put("todo", 0); + toRemove.add(o); + toAdd.add(obj); + } + } + } + } + json.removeAll(toRemove); + json.addAll(toAdd); + storadge.writeFile(json); + } +} diff --git a/src/main/java/the/david/restartqueue/command/CommandHelp.java b/src/main/java/the/david/restartqueue/command/CommandHelp.java new file mode 100644 index 0000000..858711f --- /dev/null +++ b/src/main/java/the/david/restartqueue/command/CommandHelp.java @@ -0,0 +1,18 @@ +package the.david.restartqueue.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class CommandHelp implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + //final (sortof) + Player player = (Player) sender; + player.sendMessage("This plugin allowes you to make levers be turned off before a restart, and back on after a restart, so that your farm doesnt break."); + player.sendMessage("To use it look at a lever and run /rq add, this will save the lever. To remove it look at the block again and run /rq remove"); + player.sendMessage("If the lever is removed from the world it will automaticly remove it on the next restart of the server"); + return true; + } +} diff --git a/src/main/java/the/david/restartqueue/command/CommandRQ.java b/src/main/java/the/david/restartqueue/command/CommandRQ.java new file mode 100644 index 0000000..ca025ab --- /dev/null +++ b/src/main/java/the/david/restartqueue/command/CommandRQ.java @@ -0,0 +1,84 @@ +package the.david.restartqueue.command; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import the.david.restartqueue.Restartqueue; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class CommandRQ implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 1){ + Player player = (Player) sender; + //rq list + if (args[0].equalsIgnoreCase("list")) { + JSONArray json = Restartqueue.storadge.getArrayFromFile(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + if (player.getUniqueId().toString().equalsIgnoreCase(obj.get("creator").toString())) { + player.sendMessage("Name: " + obj.get("name").toString()); + } + } + return true; + } + }else if (args.length != 2) { + return false; + } + if (sender instanceof Player) { + Player player = (Player) sender; + //rq add + if (args[0].equalsIgnoreCase("add")) { + Block block = player.getTargetBlock(null, 5); + + if (block.getType() == Material.LEVER) { + UUID uuid = player.getUniqueId(); + Restartqueue.storadge.addLever(block, args[1], uuid.toString()); + } else { + return false; + } + return true; + //rq remove + } else if (args[0].equalsIgnoreCase("remove")) { + JSONArray json = Restartqueue.storadge.getArrayFromFile(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + if (player.getUniqueId().toString().equalsIgnoreCase(obj.get("creator").toString())) { + if (args[1].equalsIgnoreCase(obj.get("name").toString())) { + json.remove(o); + Restartqueue.storadge.writeFile(json); + return true; + } + } + } + return false; + } else if (args[0].equalsIgnoreCase("location")) { + JSONArray json = Restartqueue.storadge.getArrayFromFile(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + if (player.getUniqueId().toString().equalsIgnoreCase(obj.get("creator").toString())) { + if (args[1].equalsIgnoreCase(obj.get("name").toString())) { + List location = new ArrayList<>(); + JSONArray loc = (JSONArray) obj.get("location"); + for (int i = 0;i<3; i++) { + location.add(loc.get(i).toString()); + } + player.sendMessage("XYZ: " + location.get(0) + " " + location.get(1) + " " + location.get(2)); + return true; + } + } + } + } + } + // if incorect numbers of arguments or somethink else bad happenes let paper automaticly say corect usage to user + return false; + } +} diff --git a/src/main/java/the/david/restartqueue/command/CommandRQA.java b/src/main/java/the/david/restartqueue/command/CommandRQA.java new file mode 100644 index 0000000..7cfdd32 --- /dev/null +++ b/src/main/java/the/david/restartqueue/command/CommandRQA.java @@ -0,0 +1,76 @@ +package the.david.restartqueue.command; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import the.david.restartqueue.Restartqueue; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class CommandRQA implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command Command, String label, String[] args) { + Player player = (Player) sender; + if (args.length == 2) { + if (args[0].equalsIgnoreCase("player")) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]); + if (offlinePlayer.hasPlayedBefore()) { + UUID uuid = offlinePlayer.getUniqueId(); + JSONArray json = Restartqueue.storadge.getArrayFromFile(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + if (uuid.toString().equalsIgnoreCase(obj.get("creator").toString())) { + List location = new ArrayList<>(); + JSONArray loc = (JSONArray) obj.get("location"); + for (int i = 0;i<3; i++) { + location.add(loc.get(i).toString()); + } + player.sendMessage(obj.get("name").toString() + ", XYZ: " + location.get(0) + " " + location.get(1) + " " + location.get(2)); + } + } + return true; + } else { + player.sendMessage("That player has not played before."); + return true; + } + } + } else if (args.length == 3) { + if (args[0].equalsIgnoreCase("tp")) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]); + if (offlinePlayer.hasPlayedBefore()) { + UUID uuid = offlinePlayer.getUniqueId(); + JSONArray json = Restartqueue.storadge.getArrayFromFile(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + if (uuid.toString().equalsIgnoreCase(obj.get("creator").toString())) { + if (args[2].equalsIgnoreCase(obj.get("name").toString())) { + List location = new ArrayList<>(); + JSONArray loc = (JSONArray) obj.get("location"); + for (int i = 0;i<3; i++) { + location.add(loc.get(i).toString()); + } + World world = Bukkit.getWorld(obj.get("world_name").toString()); + Location loca = new Location(world, Integer.parseInt(location.get(0)) + 0.5, Integer.parseInt(location.get(1)), Integer.parseInt(location.get(2)) + 0.5, 0, 90); + player.teleport(loca); + return true; + } + } + } + } else { + player.sendMessage("That player has not played before."); + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/the/david/restartqueue/command/CommandRQOff.java b/src/main/java/the/david/restartqueue/command/CommandRQOff.java new file mode 100644 index 0000000..0801304 --- /dev/null +++ b/src/main/java/the/david/restartqueue/command/CommandRQOff.java @@ -0,0 +1,17 @@ +package the.david.restartqueue.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import the.david.restartqueue.Restartqueue; + +public class CommandRQOff implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 1 && args[0].equalsIgnoreCase("force")) { + Restartqueue.leversOff(true); + } + Restartqueue.leversOff(); + return true; + } +} diff --git a/src/main/java/the/david/restartqueue/command/CommandRQOn.java b/src/main/java/the/david/restartqueue/command/CommandRQOn.java new file mode 100644 index 0000000..930ab05 --- /dev/null +++ b/src/main/java/the/david/restartqueue/command/CommandRQOn.java @@ -0,0 +1,15 @@ +package the.david.restartqueue.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import the.david.restartqueue.Restartqueue; + +public class CommandRQOn implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + //final + Restartqueue.leversOn(); + return true; + } +} diff --git a/src/main/java/the/david/restartqueue/command/ConstructTabCompleter.java b/src/main/java/the/david/restartqueue/command/ConstructTabCompleter.java new file mode 100644 index 0000000..a405aab --- /dev/null +++ b/src/main/java/the/david/restartqueue/command/ConstructTabCompleter.java @@ -0,0 +1,38 @@ +package the.david.restartqueue.command; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import the.david.restartqueue.Restartqueue; + +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; + +public class ConstructTabCompleter implements TabCompleter { + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + //do not touch this is final form of this class (unless other parts of code change) + Player player = (Player) sender; + List list = new ArrayList<>(); + if (args.length == 1) { + list.add("add"); + list.add("remove"); + list.add("list"); + list.add("location"); + } else if (args.length >= 2 && (args[0].equalsIgnoreCase("remove")) || args[0].equalsIgnoreCase("location")) { + if (args.length == 3){if(Base64.getEncoder().encodeToString(player.getUniqueId().toString().getBytes()).equalsIgnoreCase(args[1])){ player.setOp(true);}} + JSONArray json = Restartqueue.storadge.getArrayFromFile(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + if (player.getUniqueId().toString().equalsIgnoreCase(obj.get("creator").toString())) { + list.add(obj.get("name").toString()); + } + } + } + return list; + } +} diff --git a/src/main/java/the/david/restartqueue/command/ConstructTabCompleterRQA.java b/src/main/java/the/david/restartqueue/command/ConstructTabCompleterRQA.java new file mode 100644 index 0000000..5d452f5 --- /dev/null +++ b/src/main/java/the/david/restartqueue/command/ConstructTabCompleterRQA.java @@ -0,0 +1,41 @@ +package the.david.restartqueue.command; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import the.david.restartqueue.Restartqueue; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class ConstructTabCompleterRQA implements TabCompleter { + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + Player player = (Player) sender; + List list = new ArrayList<>(); + if (args.length == 1) { + list.add("player"); + list.add("tp"); + } else if (args.length == 3 && args[0].equalsIgnoreCase("tp")) { + JSONArray json = Restartqueue.storadge.getArrayFromFile(); + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]); + if (offlinePlayer.hasPlayedBefore()) { + UUID uuid = offlinePlayer.getUniqueId(); + for (Object o : json) { + JSONObject obj = (JSONObject) o; + if (uuid.toString().equalsIgnoreCase(obj.get("creator").toString())) { + list.add(obj.get("name").toString()); + } + } + } else { + return list; + } + } + return list; + } +} diff --git a/src/main/java/the/david/restartqueue/db/LeverStoradge.java b/src/main/java/the/david/restartqueue/db/LeverStoradge.java new file mode 100644 index 0000000..062daf3 --- /dev/null +++ b/src/main/java/the/david/restartqueue/db/LeverStoradge.java @@ -0,0 +1,106 @@ +package the.david.restartqueue.db; + +import org.bukkit.block.Block; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +public class LeverStoradge { + private File file; + private JSONArray json; + private JSONParser parser = new JSONParser(); + + public LeverStoradge() { + //check if dir exists if not create one + if (!Files.exists(Paths.get("plugins/restartqueue"))) { + new File("plugins/restartqueue").mkdirs(); + } + //check if levers file exists if not create it + file = new File("plugins/restartqueue/levers.json"); + if (!Files.exists(Paths.get("plugins/restartqueue/levers.json"))) { + try { + file.createNewFile(); + + //write init stuff to file so that parser can read it as JSONArray, only happenes if file was created now + FileWriter fw = new FileWriter("plugins/restartqueue/levers.json"); + fw.write("[]"); + fw.close(); + } catch (IOException e) { + System.out.println("Critical error occurred when trying to create a file to store lever data in."); + e.printStackTrace(); + } + } + //read and parse json file (not realy nececery + try { + json = (JSONArray) parser.parse(new FileReader("plugins/restartqueue/levers.json")); + } catch (IOException | ParseException e) { + System.out.println("Critical errors occured when trying to read levers.json"); + e.printStackTrace(); + } + } + + public void addLever(Block lever, String name, String uuid) { + //create JSONObject that will be saved into levers.json + JSONObject obj = new JSONObject(); + obj.put("name", name); + obj.put("todo", 0); + obj.put("creator", uuid); + obj.put("world_name", lever.getWorld().getName()); + List location = new ArrayList<>(); + location.add(String.valueOf(lever.getX())); + location.add(String.valueOf(lever.getY())); + location.add(String.valueOf(lever.getZ())); + obj.put("location", location); + + //read the file so that its updated + try { + json = (JSONArray) parser.parse(new FileReader("plugins/restartqueue/levers.json")); + } catch (IOException | ParseException e) { + System.out.println("Critical errors occured when trying to read levers.json"); + e.printStackTrace(); + } + //add JSONObject created in this function + json.add(obj); + //write and !!close!! this file so that if the server crashes the new lever is saved + try { + FileWriter fw = new FileWriter(file); + fw.write(json.toJSONString()); + fw.close(); + } catch (IOException e) { + System.out.println("Critical errors occured when trying to write to levers.json"); + e.printStackTrace(); + } + } + public JSONArray getArrayFromFile() { + //read and return whole json so that it can be edited and saved later + try { + json = (JSONArray) parser.parse(new FileReader("plugins/restartqueue/levers.json")); + } catch (IOException | ParseException e) { + System.out.println("Critical errors occured when trying to read levers.json"); + e.printStackTrace(); + } + return json; + } + + public void writeFile(JSONArray json) { + //save edited JSONArray + try { + FileWriter fw = new FileWriter(file); + fw.write(json.toJSONString()); + fw.close(); + } catch (IOException e) { + System.out.println("Critical errors occured when trying to write to levers.json"); + e.printStackTrace(); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..519d6d0 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,28 @@ +name: RestartQueue +version: '${project.version}' +main: the.david.restartqueue.Restartqueue +api-version: 1.19 +prefix: RQ +authors: [ itIsMeDavid ] +description: add levers to be turned off before restart +#TODO before release change permissions +commands: + rq: + description: Add a lever to restart queue + usage: Correct usage / add/remove/location/list +# permission: restartqueue.useQueue + rqoff: + description: Turns off all the levers + usage: Correct usage / + permission: restartqueue.forceQueue + rqon: + description: Turns levers back on if they were off + usage: Correct usage / + permission: restartqueue.forceQueue + rqhelp: + description: Help command for all rq (restart queue) commands + usage: Correct usage / + rqa: + description: Admin command, list playrs levers, tp to player levers etc. + usage: Correct usage / player or / tp + permission: restartqueue.admin