From 922b2e445e0d2062abf678a525cf589986ff60fa Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 21 Jul 2024 14:02:06 +0200 Subject: [PATCH] Update JumpAndRun and Leaderboard --- src/de/steamwar/lobby/LobbySystem.properties | 2 +- .../steamwar/lobby/jumpandrun/JumpAndRun.java | 4 +- src/de/steamwar/lobby/util/Leaderboard.java | 95 ++++++++++++++++--- 3 files changed, 85 insertions(+), 16 deletions(-) diff --git a/src/de/steamwar/lobby/LobbySystem.properties b/src/de/steamwar/lobby/LobbySystem.properties index 16521b7..df25424 100644 --- a/src/de/steamwar/lobby/LobbySystem.properties +++ b/src/de/steamwar/lobby/LobbySystem.properties @@ -130,7 +130,7 @@ PARTICLE_EGG_HUNT_HALF = §fThe hunt is on JUMP_AND_RUN_PROGRESS = §e{0}§8/§f{1} §c{2} §7{3} JUMP_AND_RUN_CANCEL = {0} -JUMP_AND_RUN_TIME = mm:ss SSS +JUMP_AND_RUN_TIME = mm:ss,SSS JUMP_AND_RUN_FINISHED = §aFinished in {0} with {1} fails JUMP_AND_RUN_PERSONAL_BEST = §aNice! You beat your personal best by {0} JUMP_AND_RUN_PERSONAL_BEST_TIME = §aPersonal best in {0} diff --git a/src/de/steamwar/lobby/jumpandrun/JumpAndRun.java b/src/de/steamwar/lobby/jumpandrun/JumpAndRun.java index 079dbd9..f8ce333 100644 --- a/src/de/steamwar/lobby/jumpandrun/JumpAndRun.java +++ b/src/de/steamwar/lobby/jumpandrun/JumpAndRun.java @@ -77,7 +77,7 @@ public class JumpAndRun extends BasicListener { long time = System.currentTimeMillis() - START.get(player); SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", player), Locale.ROOT); String parsed = format.format(new Date(time)); - LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PROGRESS", player, ChatMessageType.ACTION_BAR, index + 1, points.size(), FAILS.get(player), parsed.substring(0, parsed.length() - 2)); + LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_PROGRESS", player, ChatMessageType.ACTION_BAR, index + 1, points.size(), FAILS.get(player), parsed); } }); toReset.forEach(player -> { @@ -127,7 +127,7 @@ public class JumpAndRun extends BasicListener { long time = System.currentTimeMillis() - START.get(event.getPlayer()); SimpleDateFormat format = new SimpleDateFormat(LobbySystem.getMessage().parse("JUMP_AND_RUN_TIME", event.getPlayer()), Locale.ROOT); String parsed = format.format(new Date(time)); - LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_FINISHED", event.getPlayer(), parsed.substring(0, parsed.length() - 2), FAILS.get(event.getPlayer())); + LobbySystem.getMessage().sendPrefixless("JUMP_AND_RUN_FINISHED", event.getPlayer(), parsed, FAILS.get(event.getPlayer())); updateJumpAndRunTime(event.getPlayer(), time); reset(event.getPlayer()); } diff --git a/src/de/steamwar/lobby/util/Leaderboard.java b/src/de/steamwar/lobby/util/Leaderboard.java index 0b7e5cc..0ff5849 100644 --- a/src/de/steamwar/lobby/util/Leaderboard.java +++ b/src/de/steamwar/lobby/util/Leaderboard.java @@ -3,57 +3,100 @@ package de.steamwar.lobby.util; import de.steamwar.entity.RArmorStand; import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; -import de.steamwar.lobby.LobbySystem; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.internal.Statement; import lombok.AllArgsConstructor; +import org.bukkit.Bukkit; import org.bukkit.Location; +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.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -public class Leaderboard { +public class Leaderboard implements Listener { private static final Statement LEADERBOARD = new Statement("SELECT User, CAST(Value as integer) AS Time from UserConfig WHERE Config = ? ORDER BY CAST(Value as integer) LIMIT ?"); + private static final Statement PLAYER_TIME = new Statement("SELECT CAST(Value as integer) AS Time FROM UserConfig WHERE Config = ? AND User = ?"); + private static final Statement PLAYER_PLACEMENT = new Statement("SELECT COUNT(*) AS Placement FROM UserConfig WHERE Config = ? AND CAST(Value as integer) < (SELECT CAST(Value as integer) AS Time FROM UserConfig WHERE Config = ? AND User = ?)"); private final REntityServer server; private final String configKey; private final Location location; private final int best; - private final List entities; + private long bestTime; + private final Map playerPlacements = new HashMap<>(); public Leaderboard(REntityServer server, String configKey, Location location, int best) { this.server = server; this.configKey = configKey; this.location = location; this.best = best; - entities = new ArrayList<>(best + 2); update(); } public void update() { - entities.forEach(REntity::die); - entities.clear(); + server.getEntities().forEach(REntity::die); List leaderboard = getLeaderboard(); if (leaderboard.isEmpty()) return; - long bestTime = leaderboard.get(0).time; + bestTime = leaderboard.get(0).time; for (int i = 0; i <= best; i++) { if (best - i >= leaderboard.size()) continue; LeaderboardEntry entry = leaderboard.get(best - i); RArmorStand entity = new RArmorStand(server, location.clone().add(0, i * 0.32, 0), RArmorStand.Size.MARKER); SteamwarUser user = SteamwarUser.get(entry.user); + String color = "§f"; if (i == best) { - entity.setDisplayName("§6§l" + user.getUserName() + " §8• §6§l" + renderTime(entry.time)); - } else if (i <= best - 1 && i > best - 3) { - entity.setDisplayName("§e" + user.getUserName() + " §8• §e" + renderTime(entry.time) + " §8• §e+" + renderShortTime(entry.time - bestTime)); - } else { - entity.setDisplayName("§7" + user.getUserName() + " §8• §7" + renderTime(entry.time) + " §8• §7+" + renderShortTime(entry.time - bestTime)); + color = "§6§l"; + } else if (i <= best - 1 && i > best- 3) { + color = "§e"; } + entity.setDisplayName(calcName(user, color, i + 1, entry.time)); entity.setInvisible(true); - entities.add(entity); } + Bukkit.getOnlinePlayers().forEach(player -> { + updatePlayerPlacement(SteamwarUser.get(player.getUniqueId())); + }); + } + + private void updatePlayerPlacement(SteamwarUser steamwarUser) { + if (server.getEntities().isEmpty()) return; + int placement = getPlayerPlacement(steamwarUser); + if (placement < 5) { + REntityServer entityServer = playerPlacements.remove(steamwarUser.getId()); + if (entityServer == null) return; + entityServer.getEntities().forEach(rEntity -> rEntity.hide(true)); + return; + } + REntityServer entityServer = playerPlacements.computeIfAbsent(steamwarUser.getId(), ignore -> new REntityServer()); + List entities = entityServer.getEntities(); + RArmorStand entity; + if (entities.isEmpty()) { + entity = new RArmorStand(server, location.clone().add(0, -2 * 0.32, 0), RArmorStand.Size.MARKER); + entity.setInvisible(true); + } else { + entity = (RArmorStand) entities.get(0); + entity.hide(false); + } + long time = getPlayerTime(steamwarUser); + entity.setDisplayName(calcName(steamwarUser, "§7", placement, time)); + } + + private String calcName(SteamwarUser user, String color, int placement, long time) { + StringBuilder st = new StringBuilder(); + st.append(color); + st.append(placement).append(". ").append(user.getUserName()); + st.append(" §8• "); + st.append(color).append(renderTime(time)); + if (time != bestTime) { + st.append(" §8• "); + st.append(color).append("+").append(renderShortTime(time - bestTime)); + } + return st.toString(); } private List getLeaderboard() { @@ -66,6 +109,18 @@ public class Leaderboard { }, configKey, best); } + private long getPlayerTime(SteamwarUser user) { + return PLAYER_TIME.select(resultSet -> { + return resultSet.getLong("Time"); + }, configKey, user.getId()); + } + + private int getPlayerPlacement(SteamwarUser user) { + return PLAYER_PLACEMENT.select(resultSet -> { + return resultSet.getInt("Placement"); + }, configKey, configKey, user.getId()); + } + public static String renderTime(long time) { return String.format( "%d:%02d.%03d", @@ -87,4 +142,18 @@ public class Leaderboard { private final int user; private final long time; } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + SteamwarUser steamwarUser = SteamwarUser.get(event.getPlayer().getUniqueId()); + updatePlayerPlacement(steamwarUser); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + SteamwarUser steamwarUser = SteamwarUser.get(event.getPlayer().getUniqueId()); + REntityServer entityServer = playerPlacements.remove(steamwarUser.getId()); + if (entityServer == null) return; + entityServer.close(); + } }