diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/TimeChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/TimeChallengeEvent.java new file mode 100644 index 0000000..f922810 --- /dev/null +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/TimeChallengeEvent.java @@ -0,0 +1,85 @@ +package de.fanta.challenges.challenges.ChallengeEvents; + +import de.fanta.challenges.Challenges; +import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.schedular.CancellableTask; +import de.fanta.challenges.utils.Config; +import de.iani.cubesideutils.bukkit.plugin.api.OnlinePlayerData; +import de.iani.cubesideutils.bukkit.plugin.api.UtilsApiBukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashMap; +import java.util.Objects; +import java.util.UUID; + +public class TimeChallengeEvent implements Listener { + + private final Challenges plugin = Challenges.getPlugin(); + private static final HashMap playerPlayTimes = new HashMap<>(); + private static final HashMap playerStartTimes = new HashMap<>(); + private CancellableTask updateTimesTask; + + @EventHandler + public void onActivation(TimerChangedEvent event) { + if (Objects.equals(Config.getString("event.type"), "time")) { + if (event.isRunning()) { + startUpdateTask(); + for (Player player : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + updatePlayTime(player); + } + } else { + stopUpdateTask(); + } + } + } + + private void startUpdateTask() { + updateTimesTask = plugin.getScheduler().runGlobalAtFixedRate(() -> { + System.out.println("Update Times"); + for (Player player : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + updatePlayTime(player); + } + }, 5 * 20L, 5 * 20L); + } + + private void stopUpdateTask() { + if (updateTimesTask != null) { + updateTimesTask.cancel(); + updateTimesTask = null; + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent e) { + if (Objects.equals(Config.getString("event.type"), "time")) { + playerStartTimes.remove(e.getPlayer().getUniqueId()); + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + if (Objects.equals(Config.getString("event.type"), "time")) { + updatePlayTime(e.getPlayer()); + } + } + + private void updatePlayTime(Player player) { + OnlinePlayerData data = UtilsApiBukkit.getInstance().getPlayerData(player); + long currentTime = System.currentTimeMillis(); + if (plugin.getTimer().isRunning() && !data.isGloballyAfk() && data.getLastAction() >= currentTime - (2 * 60 * 1000)) { + long playTime = currentTime - playerStartTimes.getOrDefault(player.getUniqueId(), currentTime); + playerPlayTimes.put(player.getUniqueId(), playTime + playerPlayTimes.getOrDefault(player.getUniqueId(), 0L)); + playerStartTimes.put(player.getUniqueId(), currentTime); + } else { + playerStartTimes.remove(player.getUniqueId()); + } + } + + public static HashMap getPlayerPlayTimes() { + return playerPlayTimes; + } +} diff --git a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java index 0c96921..d5e0664 100644 --- a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java +++ b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java @@ -36,6 +36,7 @@ private static final int SAMMEL_FIEBER_SETTINGS_INDEX = 22; private static final int DIFFERENT_ITEMS_INDEX = 28; + private static final int TIME_EVENT_INDEX = 29; private static final int EVENT_SETTINGS_INDEX = 45; private static final int CLOSE_IDEX = 54; @@ -73,9 +74,9 @@ } case FORCE_ITEM_INDEX -> { if (Objects.equals(Config.getString("event.type"), "forceitem")) { - item = GUIUtils.createGuiItem(Material.REINFORCED_DEEPSLATE, ChatUtil.GREEN + "Force Item Event", true, ChatUtil.GREEN + "Farm so viele Blöcke wie möglich."); + item = GUIUtils.createGuiItem(Material.DIAMOND_PICKAXE, ChatUtil.GREEN + "Force Item Event", true, ChatUtil.GREEN + "Farm so viele Blöcke wie möglich."); } else { - item = GUIUtils.createGuiItem(Material.REINFORCED_DEEPSLATE, ChatUtil.RED + "Force Item Event", ChatUtil.GREEN + "Farm so viele Blöcke wie möglich."); + item = GUIUtils.createGuiItem(Material.DIAMOND_PICKAXE, ChatUtil.RED + "Force Item Event", ChatUtil.GREEN + "Farm so viele Blöcke wie möglich."); } } case SAMMEL_FIEBER_INDEX -> { @@ -134,6 +135,13 @@ item = GUIUtils.createGuiItem(Material.CRAFTING_TABLE, ChatUtil.RED + "DifferentItems", ChatUtil.GREEN + "Sammel so viele verschiedene Items wie möglich."); } } + case TIME_EVENT_INDEX -> { + if (Objects.equals(Config.getString("event.type"), "time")) { + item = GUIUtils.createGuiItem(Material.CLOCK, ChatUtil.GREEN + "Time", true, ChatUtil.GREEN + "Zeigt wie lang ein Spieler mitgespielt hat."); + } else { + item = GUIUtils.createGuiItem(Material.CLOCK, ChatUtil.RED + "Time", ChatUtil.GREEN + "Zeigt wie lang ein Spieler mitgespielt hat."); + } + } case EVENT_SETTINGS_INDEX -> item = GUIUtils.createGuiItem(Material.CHAIN_COMMAND_BLOCK, ChatUtil.BLUE + "Event Settings"); @@ -232,6 +240,14 @@ ChatUtil.sendErrorMessage(p, "Diese Event läuft bereits"); } } + case TIME_EVENT_INDEX -> { + if (!Objects.equals(Config.getString("event.type"), "time")) { + Config.setValue("event.type", "time"); + ChatUtil.sendTitleToAll("Event", "Time", ChatUtil.GREEN); + } else { + ChatUtil.sendErrorMessage(p, "Diese Event läuft bereits"); + } + } } rebuildInventory(); diff --git a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java index f84ba29..4ec12e9 100644 --- a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java +++ b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java @@ -10,6 +10,7 @@ import de.fanta.challenges.challenges.ChallengeEvents.ForceItemChallengeEvent; import de.fanta.challenges.challenges.ChallengeEvents.OreBattleChallengeEvent; import de.fanta.challenges.challenges.ChallengeEvents.SammelFieberChallengeEvent; +import de.fanta.challenges.challenges.ChallengeEvents.TimeChallengeEvent; import de.fanta.challenges.challenges.ChallengeGoals; import de.fanta.challenges.challenges.ClearInventoryByDamageChallenge; import de.fanta.challenges.challenges.CraftingTableChallenge; @@ -30,6 +31,7 @@ import de.fanta.challenges.challenges.TiedTogetherChallenge; import de.fanta.challenges.challenges.WorldBorderLevelChallenge; import de.fanta.challenges.challenges.XPChallenge; +import de.fanta.challenges.events.TimerChangedEvent; import de.fanta.challenges.gravestones.GravestoneListener; import de.fanta.challenges.guis.coordsgui.CoordsDeleteGUI; import de.fanta.challenges.guis.coordsgui.CoordsGUI; @@ -95,6 +97,7 @@ pM.registerEvents(new DifferentItemsChallenge(), plugin); pM.registerEvents(new MLGChallenge(), plugin); pM.registerEvents(new ManHunt(), plugin); + pM.registerEvents(new TimeChallengeEvent(), plugin); //pM.registerEvents(new Troll(plugin), plugin); if (plugin.getProtocolVersion() >= 759) { diff --git a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java index 346f271..b2f3682 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java @@ -2,6 +2,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.challenges.ChallengeEvents.SammelFieberChallengeEvent; +import de.fanta.challenges.challenges.ChallengeEvents.TimeChallengeEvent; import de.fanta.challenges.guis.eventgui.SammelFieberSettingsGui; import de.fanta.challenges.teams.ChallengeTeam; import de.fanta.challenges.teams.TeamUtils; @@ -9,6 +10,7 @@ import de.fanta.challenges.utils.Config; import de.iani.cubesideutils.HastebinUtil; import de.iani.cubesideutils.StringUtil; +import de.iani.playerUUIDCache.CachedPlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scoreboard.Team; @@ -23,6 +25,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.UUID; import java.util.function.IntPredicate; import java.util.logging.Level; import java.util.stream.Collectors; @@ -228,32 +231,41 @@ sb.append("=".repeat(20)).append('\n'); sb.append("Teilnehmer (").append(this.scores.size()).append("):\n"); - if (this.scores.isEmpty()) { - sb.append(" Das Event hatte keine Teilnehmer!\n"); - } else { - if (Config.getBoolean("event.teams")) { - for (ScoreData entry : positions) { - ChallengeTeam challengeTeam = TeamUtils.getTeam(entry.getScorable().getName()); - if (challengeTeam != null) { - Team team = TeamUtils.getScoreboard().getTeam(challengeTeam.getName()); - if (team != null) { - sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" (").append(team.getEntries().toString().replace("[", "").replace("]", "")).append(")").append(" ").append(entry.getScore()).append("\n"); + if (!Objects.equals(Config.getString("event.type"), "time")) { + if (this.scores.isEmpty()) { + sb.append(" Das Event hatte keine Teilnehmer!\n"); + } else { + if (Config.getBoolean("event.teams")) { + for (ScoreData entry : positions) { + ChallengeTeam challengeTeam = TeamUtils.getTeam(entry.getScorable().getName()); + if (challengeTeam != null) { + Team team = TeamUtils.getScoreboard().getTeam(challengeTeam.getName()); + if (team != null) { + sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" (").append(team.getEntries().toString().replace("[", "").replace("]", "")).append(")").append(" ").append(entry.getScore()).append("\n"); + } + } + } + } else { + if (Config.getBoolean("event.tournament")) { + HashMap tournamentScores = getTournamentScores(new ArrayList<>(positions), minScore); + for (ScoreData entry : positions) { + sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" ").append(entry.getScore()).append(" (").append(tournamentScores.getOrDefault(entry.getScorable(), 0)).append(")").append("\n"); + } + } else { + for (ScoreData entry : positions) { + sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" ").append(entry.getScore()).append("\n"); } } } - } else { - if (Config.getBoolean("event.tournament")) { - HashMap tournamentScores = getTournamentScores(new ArrayList<>(positions), minScore); - for (ScoreData entry : positions) { - sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" ").append(entry.getScore()).append(" (").append(tournamentScores.getOrDefault(entry.getScorable(), 0)).append(")").append("\n"); - } - } else { - for (ScoreData entry : positions) { - sb.append(entry.getPostition()).append(". ").append(entry.getScorable().getName()).append(" ").append(entry.getScore()).append("\n"); - } - } + } + } else { + HashMap times = TimeChallengeEvent.getPlayerPlayTimes(); + for (UUID uuid : times.keySet()) { + CachedPlayer cp = plugin.getPlayerUUIDCache().getPlayer(uuid); + sb.append(cp != null ? cp.getName() : uuid.toString()).append(": ").append(formatTime(times.get(uuid))).append("\n"); } } + HastebinUtil.paste(sb.toString(), new HastebinUtil.PasteCompletedListener() { @Override public void onSuccess(String url) { @@ -320,4 +332,12 @@ } return tournamentScores; } + + public String formatTime(long time) { + String formattime = StringUtil.formatTimespan((time / 1000) * 1000, " Tage, ", ":", "", "", "", ":", false, true); + if (formattime.startsWith("1 Tage")) { + return StringUtil.formatTimespan((time / 1000) * 1000, " Tag, ", ":", "", "", "", ":", false, true); + } + return formattime; + } } diff --git a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java index 66a5d77..190e915 100644 --- a/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java +++ b/src/main/java/de/fanta/challenges/utils/SaveWorldUtils.java @@ -37,23 +37,23 @@ private static String restartSeed = null; public static double progress = 0.0; - public static boolean saveWorld(String saveID, SaveSlot saveSlot) { - return saveWorld(null, saveID, saveSlot); + public static void saveWorld(String saveID, SaveSlot saveSlot) { + saveWorld(null, saveID, saveSlot); } - public static boolean saveWorld(@Nullable Player player, String saveID, SaveSlot saveSlot) { + public static void 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; + return; } if (plugin.getServerType() == ServerType.CHALLENGE_EVENT) { if (player != null) { ChatUtil.sendErrorMessage(player, "Challenge Events können nicht gespeichert werden."); } - return false; + return; } isSavingWorld = true; Config.setValue("timertime", Challenges.getPlugin().getTimer().getTime()); @@ -68,16 +68,14 @@ for (World world : Bukkit.getWorlds()) { nms.getWorldUtils().saveWorldNow(world); } - return copyWorldAsync(player, saveID, saveSlot); + copyWorldAsync(player, saveID, saveSlot); } } catch (Exception ex) { plugin.getLogger().log(Level.SEVERE, "Welt konnte nicht gespeichert werden", ex); - return false; } - return true; } - private static boolean copyWorldAsync(Player player, String saveID, SaveSlot saveSlot) { + private static void 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"); @@ -145,12 +143,17 @@ ChatUtil.sendErrorMessage(Bukkit.getPlayer(saveID), "Map konnte nicht richtig gespeichert werden, bitte versuche es noch einmal"); } } + try { + FileUtils.deleteDirectory(dir); + } catch (IOException ex) { + Bukkit.getLogger().log(Level.SEVERE, "Could not delete tempFolder ", ex); + } }); } catch (IOException ex) { Bukkit.getLogger().log(Level.SEVERE, "Could not save world ", ex); } isSavingWorld = false; - return done.get(); + done.get(); } public static void restartServer(@Nullable String seed) { @@ -236,7 +239,7 @@ if (Files.isDirectory(source)) { target.mkdir(); } else { - Files.move(source, target.toPath(), StandardCopyOption.REPLACE_EXISTING); + Files.copy(source, target.toPath(), StandardCopyOption.REPLACE_EXISTING); copiedBytes[0] += source.toFile().length(); progress = (double) copiedBytes[0] / totalBytes[0] * 100; }