diff --git a/src/main/java/de/fanta/challenges/Challenges.java b/src/main/java/de/fanta/challenges/Challenges.java index 4e7729d..4796446 100644 --- a/src/main/java/de/fanta/challenges/Challenges.java +++ b/src/main/java/de/fanta/challenges/Challenges.java @@ -16,7 +16,6 @@ import de.fanta.challenges.listeners.EventRegistration; import de.fanta.challenges.schedular.BukkitScheduler; import de.fanta.challenges.schedular.CancellableTask; -import de.fanta.challenges.schedular.FoliaScheduler; import de.fanta.challenges.schedular.Scheduler; import de.fanta.challenges.scoreboard.BukkitScoreBoardManager; import de.fanta.challenges.scoreboard.FoliaScoreBoardManager; @@ -48,6 +47,7 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -117,6 +117,9 @@ private ColorUtils colorUtils; + private Path challengeSavePath = new File("/home/storagebox/Challenge-saves").toPath(); + private Path adventureSavePath = new File("/home/storagebox/Adventure-saves/").toPath(); + public static Challenges getPlugin() { return plugin; } @@ -193,7 +196,7 @@ resetwithseed = Config.getBoolean("resetwithseed"); - if (Config.getBoolean("World_Reset")) { + if (Config.getBoolean("World_Reset") && (serverType == ServerType.CHALLENGE || serverType == ServerType.CHALLENGE_EVENT)) { if (!Config.getBoolean("firsttimerstart")) { timer.setTime(0); } @@ -320,8 +323,8 @@ Bukkit.getBanList(BanList.Type.NAME).getBanEntries().forEach(b -> Bukkit.getBanList(BanList.Type.NAME).pardon(b.getTarget())); if (!getConfig().getBoolean("World_Reset")) { this.backpack.saveInventoryToConfig(); - getConfig().set("backpack_size", backpack.getSize() / 9); - } else { + Config.setValue("backpack_size", backpack.getSize() / 9); + } else if (serverType == ServerType.CHALLENGE || serverType == ServerType.CHALLENGE_EVENT) { this.backpack.clearConfig(); } try { @@ -330,7 +333,7 @@ } catch (IOException e) { e.printStackTrace(); } - getConfig().set("timertime", timer.getTime()); + Config.setValue("timertime", timer.getTime()); if (getConfig().getBoolean("event.enabled")) { Config.setValue("event.enabled", false); Bukkit.getPluginManager().callEvent(new EventStatusChangedEvent(false)); @@ -388,7 +391,7 @@ private void createAllItemsConfig() { this.AllItemsConfigFile = new File(getDataFolder(), "allitems.yml"); - if (!AllItemsConfigFile.exists() || (serverType == ServerType.CHALLENGE && Config.getBoolean("World_Reset"))) { + if (!AllItemsConfigFile.exists() || ((serverType == ServerType.CHALLENGE || serverType == ServerType.CHALLENGE_EVENT) && Config.getBoolean("World_Reset"))) { this.getAllItemsConfigFile().getParentFile().mkdirs(); saveResource("allitems.yml", true); } @@ -704,4 +707,12 @@ public ColorUtils getColorUtils() { return colorUtils; } + + public Path getAdventureSavePath() { + return adventureSavePath; + } + + public Path getChallengeSavePath() { + return challengeSavePath; + } } diff --git a/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java b/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java index b87957a..9be69cb 100644 --- a/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java +++ b/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java @@ -1,28 +1,14 @@ package de.fanta.challenges.commands.reset; import de.fanta.challenges.Challenges; -import de.fanta.challenges.SaveSlot; -import de.fanta.challenges.events.ChallengeEventStatusChangedEvent; -import de.fanta.challenges.events.EventStatusChangedEvent; import de.fanta.challenges.utils.ChatUtil; -import de.fanta.challenges.utils.Config; import de.fanta.challenges.utils.SaveWorldUtils; import de.iani.cubesideutils.bukkit.commands.SubCommand; import de.iani.cubesideutils.commands.ArgsParser; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import javax.annotation.Nullable; -import java.io.BufferedReader; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - public class ResetConfirmCommand extends SubCommand { private final Challenges plugin; @@ -34,50 +20,7 @@ @Override public boolean onCommand(CommandSender sender, Command command, String alias, String commandString, ArgsParser args) { if ((sender instanceof Player && plugin.isEditor((Player) sender)) || sender.hasPermission("Challenges.editor.override")) { - plugin.setWaitingForShutdown(true); - - Config.setValue("editsettings", true, false); - - for (Player p : Bukkit.getOnlinePlayers()) { - plugin.portPlayerToLobby(p); - } - - setSeedInServerProperties(args.getNext(null)); - - plugin.getTimer().stopTimer(); - plugin.getTimer().setTime(0); - Bukkit.getPluginManager().callEvent(new EventStatusChangedEvent(false)); - Bukkit.getPluginManager().callEvent(new ChallengeEventStatusChangedEvent(false)); - - - Config.setValue("World_Reset", true); - for (String key : Config.getConfigurationSection("Saved_Locations").getKeys(false)) { - Config.setValue("Saved_Locations." + key, null, false); - } - - plugin.saveConfig(); - plugin.getBackpack().saveInventoryToConfig(); - - if (Config.getBoolean("firsttimerstart")) { - CompletableFuture future = new CompletableFuture<>(); - try { - SaveWorldUtils.saveWorld(plugin.getFirstEditor().getUniqueId().toString(), SaveSlot.SLOT_AUTO); - } finally { - future.complete(null); - } - - plugin.getScheduler().runAsync(() -> { - try { - future.get(); - plugin.getScheduler().runGlobalDelayed(Bukkit::shutdown, 60); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } - }); - - } else { - plugin.getScheduler().runGlobalDelayed(Bukkit::shutdown, 60); - } + SaveWorldUtils.restartServer(args.getNext(null)); } else if (plugin.getCurrentEditor() != null) { ChatUtil.sendErrorMessage(sender, "Du bist kein Editor! Nur " + plugin.getCurrentEditor().getName() + " kann die Map zurücksetzen!"); return true; @@ -88,24 +31,4 @@ } return true; } - - public void setSeedInServerProperties(@Nullable String seed) { - try { - BufferedReader in = new BufferedReader(new FileReader("server.properties")); - Properties props = new Properties(); - props.load(in); - in.close(); - if (seed != null) { - props.setProperty("level-seed", seed); - Config.setValue("resetwithseed", true, false); - } else { - props.setProperty("level-seed", ""); - } - FileOutputStream out = new FileOutputStream("server.properties"); - props.store(out, null); - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } } diff --git a/src/main/java/de/fanta/challenges/guis/TimerGui.java b/src/main/java/de/fanta/challenges/guis/TimerGui.java index d21d441..202ef4e 100644 --- a/src/main/java/de/fanta/challenges/guis/TimerGui.java +++ b/src/main/java/de/fanta/challenges/guis/TimerGui.java @@ -193,7 +193,13 @@ case TIME_HOURS_INDEX -> item = GUIUtils.createGuiItem(Material.GOLD_INGOT, ChatUtil.GREEN + "Stunden", ChatUtil.ORANGE + ">> " + ChatUtil.BLUE + plugin.getTimer().formatTime(), "", ChatUtil.GREEN + "+1 Stunde" + ChatUtil.BLUE + " ‣ Links-Klick", ChatUtil.GREEN + "+10 Stunden" + ChatUtil.BLUE + " ‣ Shift-Links-Klick", ChatUtil.BLUE + "" + ChatColor.STRIKETHROUGH + " ", ChatUtil.GREEN + "-1 Stunde" + ChatUtil.BLUE + " ‣ Links-Klick", ChatUtil.GREEN + "-10 Stunden" + ChatUtil.BLUE + " ‣ Shift-Links-Klick"); case TIME_MINUTES_INDEX -> + { + try { item = GUIUtils.createGuiItem(Material.RAW_GOLD, ChatUtil.GREEN + "Minuten", ChatUtil.ORANGE + ">> " + ChatUtil.BLUE + plugin.getTimer().formatTime(), "", ChatUtil.GREEN + "+1 Minute" + ChatUtil.BLUE + " ‣ Rechts-Klick", ChatUtil.GREEN + "+10 Minuten" + ChatUtil.BLUE + " ‣ Shift-Rechts-Klick", ChatUtil.BLUE + "" + ChatColor.STRIKETHROUGH + " ", ChatUtil.GREEN + "-1 Minute" + ChatUtil.BLUE + " ‣ Links-Klick", ChatUtil.GREEN + "-10 Minuten" + ChatUtil.BLUE + " ‣ Shift-Links-Klick"); + } catch (NoSuchFieldError ex) { + item = GUIUtils.createGuiItem(Material.DANDELION, ChatUtil.GREEN + "Minuten", ChatUtil.ORANGE + ">> " + ChatUtil.BLUE + plugin.getTimer().formatTime(), "", ChatUtil.GREEN + "+1 Minute" + ChatUtil.BLUE + " ‣ Rechts-Klick", ChatUtil.GREEN + "+10 Minuten" + ChatUtil.BLUE + " ‣ Shift-Rechts-Klick", ChatUtil.BLUE + "" + ChatColor.STRIKETHROUGH + " ", ChatUtil.GREEN + "-1 Minute" + ChatUtil.BLUE + " ‣ Links-Klick", ChatUtil.GREEN + "-10 Minuten" + ChatUtil.BLUE + " ‣ Shift-Links-Klick"); + } + } case TIME_SECONDS_INDEX -> item = GUIUtils.createGuiItem(Material.GOLD_NUGGET, ChatUtil.GREEN + "Sekunden", ChatUtil.ORANGE + ">> " + ChatUtil.BLUE + plugin.getTimer().formatTime(), "", ChatUtil.GREEN + "+1 Sekunde" + ChatUtil.BLUE + " ‣ Rechts-Klick", ChatUtil.GREEN + "+10 Sekunden" + ChatUtil.BLUE + " ‣ Shift-Rechts-Klick", ChatUtil.BLUE + "" + ChatColor.STRIKETHROUGH + " ", ChatUtil.GREEN + "-1 Sekunde" + ChatUtil.BLUE + " ‣ Links-Klick", ChatUtil.GREEN + "-10 Sekunden" + ChatUtil.BLUE + " ‣ Shift-Links-Klick"); case CLOSE_INDEX -> item = CustomHeads.RAINBOW_X.getHead(ChatUtil.RED + "Menü verlassen"); diff --git a/src/main/java/de/fanta/challenges/guis/savegui/ChallengeSaveGui.java b/src/main/java/de/fanta/challenges/guis/savegui/ChallengeSaveGui.java index ab66b3d..7d75bfa 100644 --- a/src/main/java/de/fanta/challenges/guis/savegui/ChallengeSaveGui.java +++ b/src/main/java/de/fanta/challenges/guis/savegui/ChallengeSaveGui.java @@ -51,15 +51,15 @@ File save3; File saveAuto; if (plugin.getServerType() != ServerType.ADVENTURE) { - save1 = new File("/home/minecraft/saves/" + savePlayerID + "/1"); - save2 = new File("/home/minecraft/saves/" + savePlayerID + "/2"); - save3 = new File("/home/minecraft/saves/" + savePlayerID + "/3"); - saveAuto = new File("/home/minecraft/saves/" + savePlayerID + "/autosave"); + save1 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/1"); + save2 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/2"); + save3 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/3"); + saveAuto = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/autosave"); } else { - save1 = new File("/home/minecraft/Adventure-saves/" + savePlayerID + "/1"); - save2 = new File("/home/minecraft/Adventure-saves/" + savePlayerID + "/2"); - save3 = new File("/home/minecraft/Adventure-saves/" + savePlayerID + "/3"); - saveAuto = new File("/home/minecraft/Adventure-saves/" + savePlayerID + "/autosave"); + save1 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/1"); + save2 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/2"); + save3 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/3"); + saveAuto = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/autosave"); } for (int i = 0; i < WINDOW_SIZE; i++) { @@ -93,13 +93,13 @@ File save2; File save3; if (plugin.getServerType() != ServerType.ADVENTURE) { - save1 = new File("/home/minecraft/saves/" + savePlayerID + "/1"); - save2 = new File("/home/minecraft/saves/" + savePlayerID + "/2"); - save3 = new File("/home/minecraft/saves/" + savePlayerID + "/3"); + save1 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/1"); + save2 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/2"); + save3 = new File(plugin.getChallengeSavePath().toFile(), savePlayerID + "/3"); } else { - save1 = new File("/home/minecraft/Adventure-saves/" + savePlayerID + "/1"); - save2 = new File("/home/minecraft/Adventure-saves/" + savePlayerID + "/2"); - save3 = new File("/home/minecraft/Adventure-saves/" + savePlayerID + "/3"); + save1 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/1"); + save2 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/2"); + save3 = new File(plugin.getAdventureSavePath().toFile(), savePlayerID + "/3"); } int slot = event.getSlot(); diff --git a/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java b/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java index 3f87e93..a629fd6 100644 --- a/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java +++ b/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java @@ -33,7 +33,7 @@ } if (plugin.texturepacklink != null) { - p.setResourcePack(plugin.texturepacklink, "", true); + p.setResourcePack(plugin.texturepacklink, ""); } if (Config.getBoolean("nether.enabled") && !p.hasPlayedBefore()) { diff --git a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java index ae5879d..8d42948 100644 --- a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java +++ b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java @@ -4,6 +4,9 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.SaveSlot; import de.fanta.challenges.ServerType; +import de.fanta.challenges.events.ChallengeEventStatusChangedEvent; +import de.fanta.challenges.events.EventStatusChangedEvent; +import de.fanta.challenges.events.ServerStatusChangedEvent; import org.apache.commons.io.FileUtils; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -11,33 +14,48 @@ import org.bukkit.entity.Player; import javax.annotation.Nullable; +import java.io.BufferedReader; import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.Properties; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; public class SaveWorldUtils { private static final Challenges plugin = Challenges.getPlugin(); - public static void saveWorld(String saveID, SaveSlot saveSlot) { - saveWorld(null, saveID, saveSlot); + public static boolean isSavingWorld = false; + private static boolean isServerRestartRequested = false; + private static boolean restart = false; + private static String restartSeed = null; + + public static boolean saveWorld(String saveID, SaveSlot saveSlot) { + return saveWorld(null, saveID, saveSlot); } - public static void saveWorld(@Nullable Player player, String saveID, SaveSlot saveSlot) { + public static boolean saveWorld(@Nullable Player player, String saveID, SaveSlot saveSlot) { try { + if (isSavingWorld) { + if (player != null) { + ChatUtil.sendErrorMessage(player, "Diese Welt wird aktuell gespeichert. Bitte warte bis der Vorgang abgeschlossen ist. Dies kann einige Minuten dauern."); + } + return false; + } if (plugin.getServerType() == ServerType.CHALLENGE_EVENT) { if (player != null) { ChatUtil.sendErrorMessage(player, "Challenge Events können nicht gespeichert werden."); } - return; + return false; } - Challenges.getPlugin().getConfig().set("timertime", Challenges.getPlugin().getTimer().getTime()); - Challenges.getPlugin().saveConfig(); - Challenges.getPlugin().getConfig().set("backpack_size", Challenges.getPlugin().getBackpack().getSize() / 9); - Challenges.getPlugin().saveConfig(); + isSavingWorld = true; + Config.setValue("timertime", Challenges.getPlugin().getTimer().getTime()); + Config.setValue("backpack_size", Challenges.getPlugin().getBackpack().getSize() / 9); Challenges.getPlugin().getBackpack().saveInventoryToConfig(); for (Player p : Bukkit.getOnlinePlayers()) { @@ -49,7 +67,7 @@ for (World world : Bukkit.getWorlds()) { nms.getWorldUtils().saveWorldNow(world); } - copyWorld(player, saveID, saveSlot); + return copyWorldAsync(player, saveID, saveSlot); } else { ArrayList> allTasks = new ArrayList<>(); for (World world : Bukkit.getWorlds()) { @@ -74,7 +92,7 @@ try { waitForAll.get(); nms.getWorldUtils().flushChunkSaves(); - copyWorld(player, saveID, saveSlot); + copyWorldAsync(player, saveID, saveSlot); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } @@ -83,13 +101,12 @@ } } catch (Exception ex) { plugin.getLogger().log(Level.SEVERE, "Welt konnte nicht gespeichert werden", ex); - if (player != null) { - ChatUtil.sendErrorMessage(player, "Welt konnte nicht gespeichert werden!"); - } + return false; } + return true; } - private static void copyWorld(Player player, String saveID, SaveSlot saveSlot) { + private static boolean copyWorldAsync(Player player, String saveID, SaveSlot saveSlot) { File dir = new File(saveID); File configs = new File("plugins/Challenges"); File end = new File("world_the_end"); @@ -100,10 +117,11 @@ File saveworld = new File(saveID + "/world"); File saveconfigs = new File(saveID + "/Challenges"); File saveFolder; + AtomicBoolean done = new AtomicBoolean(false); if (plugin.getServerType() != ServerType.ADVENTURE) { - saveFolder = new File("/home/minecraft/saves/" + saveID + "/" + saveSlot.getSlot() + "/"); + saveFolder = new File(plugin.getChallengeSavePath().toFile(), saveID + "/" + saveSlot.getSlot() + "/"); } else { - saveFolder = new File("/home/minecraft/Adventure-saves/" + saveID + "/" + saveSlot.getSlot() + "/"); + saveFolder = new File(plugin.getAdventureSavePath().toFile(), saveID + "/" + saveSlot.getSlot() + "/"); } try { FileUtils.forceMkdir(dir); @@ -111,19 +129,111 @@ FileUtils.copyDirectory(end, saveend); FileUtils.copyDirectory(nether, savenether); FileUtils.copyDirectory(world, saveworld); - if (saveFolder.isDirectory()) { - FileUtils.deleteDirectory(saveFolder); + + if (player != null) { + ChatUtil.sendNormalMessage(player, "Welt wurde erfolgreich kopiert und wird nun gespeichert. Dies kann einige Minuten dauern. Du kannst aber ganz normal weiter spielen."); } - FileUtils.moveDirectory(dir, saveFolder); + + CompletableFuture copyFuture = CompletableFuture.supplyAsync(() -> { + try { + if (saveFolder.isDirectory()) { + FileUtils.deleteDirectory(saveFolder); + } + FileUtils.moveDirectory(dir, saveFolder); + return true; + } catch (IOException ex) { + Bukkit.getLogger().log(Level.SEVERE, "Could not save world ", ex); + return false; + } + }); + + copyFuture.thenAccept(result -> { + if (result) { + done.set(true); + if (player != null) { + ChatUtil.sendNormalMessage(player, "Welt wurde erfolgreich auf Slot " + saveSlot.getSlot() + " gespeichert!"); + } + + if (isServerRestartRequested) { + restartServerInternal(restartSeed); + } else if (restart) { + Config.setValue("World_Reset", true); + Bukkit.shutdown(); + } + } else { + done.set(false); + if (player != null) { + ChatUtil.sendErrorMessage(Bukkit.getPlayer(saveID), "Map konnte nicht richtig gespeichert werden, bitte versuche es noch einmal"); + } + } + }); } catch (IOException ex) { Bukkit.getLogger().log(Level.SEVERE, "Could not save world ", ex); - if (player != null) { - ChatUtil.sendErrorMessage(Bukkit.getPlayer(saveID), "Map konnte nicht richtig gespeichert werden, bitte versuche es noch einmal"); - } - return; } - if (player != null) { - ChatUtil.sendNormalMessage(player, "Welt wurde erfolgreich auf Slot " + saveSlot.getSlot() + " gespeichert!"); + isSavingWorld = false; + return done.get(); + } + + public static void restartServer(@Nullable String seed) { + if (isSavingWorld) { + restartSeed = seed; + isServerRestartRequested = true; + } else { + restartServerInternal(seed); + } + } + + private static void restartServerInternal(@Nullable String seed) { + plugin.setWaitingForShutdown(true); + + Bukkit.getPluginManager().callEvent(new EventStatusChangedEvent(false)); + Bukkit.getPluginManager().callEvent(new ChallengeEventStatusChangedEvent(false)); + Bukkit.getPluginManager().callEvent(new ServerStatusChangedEvent(false)); + + for (Player p : Bukkit.getOnlinePlayers()) { + plugin.portPlayerToLobby(p); + } + + Config.setValue("editsettings", true, false); + + setSeedInServerProperties(seed); + + plugin.getTimer().stopTimer(); + + for (String key : Config.getConfigurationSection("Saved_Locations").getKeys(false)) { + Config.setValue("Saved_Locations." + key, null, false); + } + + plugin.saveConfig(); + plugin.getBackpack().saveInventoryToConfig(); + + if (Config.getBoolean("firsttimerstart") && plugin.getFirstEditor() != null) { + restart = true; + SaveWorldUtils.saveWorld(plugin.getFirstEditor().getUniqueId().toString(), SaveSlot.SLOT_AUTO); + } else { + Bukkit.shutdown(); + } + + + } + + private static void setSeedInServerProperties(@Nullable String seed) { + try { + BufferedReader in = new BufferedReader(new FileReader("server.properties")); + Properties props = new Properties(); + props.load(in); + in.close(); + if (seed != null) { + props.setProperty("level-seed", seed); + Config.setValue("resetwithseed", true, false); + } else { + props.setProperty("level-seed", ""); + } + FileOutputStream out = new FileOutputStream("server.properties"); + props.store(out, null); + out.close(); + } catch (IOException e) { + e.printStackTrace(); } } }