diff --git a/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java index 4ee9b4eab..66dc8d0af 100644 --- a/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java +++ b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java @@ -13,6 +13,7 @@ import net.swofty.type.bedwarslobby.item.impl.BedWarsMenu; import net.swofty.type.bedwarslobby.item.impl.Collectibles; import net.swofty.type.bedwarslobby.launchpad.BedWarsLaunchPads; +import net.swofty.type.bedwarslobby.parkour.BedWarsLobbyParkour; import net.swofty.type.bedwarslobby.util.BedWarsLobbyMap; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; @@ -27,10 +28,7 @@ import net.swofty.type.generic.tab.TablistModule; import net.swofty.type.bedwarslobby.tab.BedWarsPlayersOnlineModule; import net.swofty.type.lobby.LobbyTypeLoader; -import net.swofty.type.lobby.events.LobbyBlockBreak; -import net.swofty.type.lobby.events.LobbyItemEvents; -import net.swofty.type.lobby.events.LobbyLaunchPadEvents; -import net.swofty.type.lobby.events.LobbyPlayerJoinEvents; +import net.swofty.type.lobby.events.*; import net.swofty.type.lobby.item.LobbyItem; import net.swofty.type.lobby.item.LobbyItemHandler; import net.swofty.type.lobby.item.impl.HidePlayers; @@ -40,6 +38,7 @@ import net.swofty.type.lobby.launchpad.LaunchPad; import net.swofty.type.lobby.launchpad.LaunchPadHandler; import net.swofty.type.lobby.parkour.LobbyParkourManager; +import net.swofty.type.lobby.parkour.Parkour; import org.jetbrains.annotations.Nullable; import org.tinylog.Logger; @@ -50,6 +49,7 @@ public class TypeBedWarsLobbyLoader implements LobbyTypeLoader { public static BedWarsLobbyMap bedWarsLobbyMap = new BedWarsLobbyMap(); + public static LobbyParkourManager parkourManager; @Getter private final LobbyItemHandler itemHandler = new LobbyItemHandler(); @@ -59,6 +59,11 @@ public ServerType getType() { return ServerType.BEDWARS_LOBBY; } + @Override + public Parkour getParkour() { + return new BedWarsLobbyParkour(); + } + @Override public void onInitialize(MinecraftServer server) { } @@ -93,6 +98,8 @@ public void afterInitialize(MinecraftServer server) { MinecraftServer.getSchedulerManager().buildTask(PlayerHolograms::updateExternalHolograms).delay(TaskSchedule.seconds(5)) .repeat(TaskSchedule.seconds(2)) .schedule(); + + parkourManager = new LobbyParkourManager(getParkour()); } @Override @@ -100,6 +107,11 @@ public List getLaunchPads() { return Arrays.asList(BedWarsLaunchPads.values()); } + @Override + public @Nullable LobbyParkourManager getParkourManager() { + return parkourManager; + } + @Override public Map getHotbarItems() { return Map.of( @@ -112,11 +124,6 @@ public Map getHotbarItems() { ); } - @Override - public LobbyParkourManager getParkourManager() { - return null; - } - @Override public List getRequiredServices() { return List.of(ServiceType.ORCHESTRATOR); @@ -153,6 +160,7 @@ public List getTraditionalEvents() { ).toList()); // Add lobby base events events.add(new LobbyItemEvents()); + events.add(new LobbyParkourEvents()); events.add(new LobbyLaunchPadEvents()); events.add(new LobbyPlayerJoinEvents()); events.add(new LobbyBlockBreak()); diff --git a/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/parkour/BedWarsLobbyParkour.java b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/parkour/BedWarsLobbyParkour.java new file mode 100644 index 000000000..fe79a5c01 --- /dev/null +++ b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/parkour/BedWarsLobbyParkour.java @@ -0,0 +1,36 @@ +package net.swofty.type.bedwarslobby.parkour; + +import net.minestom.server.coordinate.BlockVec; +import net.minestom.server.coordinate.Point; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.data.datapoints.DatapointParkourData; +import net.swofty.type.lobby.parkour.Parkour; + +import java.util.List; + +public class BedWarsLobbyParkour implements Parkour { + + @Override + public DatapointParkourData.ParkourType getId() { + return DatapointParkourData.ParkourType.BED_WARS_LOBBY; + } + + @Override + public Pos getStartLocation() { + return new Pos(-32.5, 72, -25.5, 135, 0); + } + + @Override + public List getCheckpoints() { + return List.of( + new BlockVec(-34, 72, -27), + new BlockVec(-36, 97, -113), + new BlockVec(95, 92, -111), + new BlockVec(144, 98, 2), + new BlockVec(88, 99, 106), + new BlockVec(45, 92, 117), + new BlockVec(-70, 75, 118), + new BlockVec(-41, 72, 38) + ); + } +} diff --git a/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointParkourData.java b/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointParkourData.java index 1bf38f137..78e9f5d8d 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointParkourData.java +++ b/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointParkourData.java @@ -26,6 +26,7 @@ public DatapointParkourData(String key) { @Getter public enum ParkourType { PROTOTYPE_LOBBY, - MURDER_MYSTERY_LOBBY + MURDER_MYSTERY_LOBBY, + BED_WARS_LOBBY } } diff --git a/type.lobby/src/main/java/net/swofty/type/lobby/parkour/LobbyParkourManager.java b/type.lobby/src/main/java/net/swofty/type/lobby/parkour/LobbyParkourManager.java index 4aaf85d61..d179112b7 100644 --- a/type.lobby/src/main/java/net/swofty/type/lobby/parkour/LobbyParkourManager.java +++ b/type.lobby/src/main/java/net/swofty/type/lobby/parkour/LobbyParkourManager.java @@ -146,17 +146,34 @@ public void finishedParkour(HypixelPlayer player) { long timeTaken = System.currentTimeMillis() - startTime; DatapointParkourData datapoint = player.getDataHandler().get(HypixelDataHandler.Data.PARKOUR_DATA, DatapointParkourData.class); Map data = datapoint.getValue(); + + long previousTimeTaken = data.getOrDefault(parkour.getId(), 0L); + boolean newRecord = false; if (data.containsKey(parkour.getId())) { - data.replace(parkour.getId(), Math.min(data.getOrDefault(parkour.getId(), Long.MAX_VALUE), timeTaken)); + long previousBest = data.get(parkour.getId()); + if (timeTaken < previousBest) { + data.put(parkour.getId(), timeTaken); + newRecord = true; + } } else { data.put(parkour.getId(), timeTaken); + newRecord = true; } datapoint.setValue(data); String timeString = String.format("%02d:%02d.%03d", (timeTaken / 60000), (timeTaken % 60000) / 1000, (timeTaken % 1000)); - player.sendMessage("§a§lCongratulations! You finished the parkour challenge in §e§l" + timeString + "§a§l!"); + + if (newRecord) { + player.sendMessage("§a§lThat's a new record of §e§l" + timeString + "§a§l! Try again to get an even better record!"); + } else { + String previousTimeString = String.format("%02d:%02d.%03d", + (previousTimeTaken / 60000), + (previousTimeTaken % 60000) / 1000, + (previousTimeTaken % 1000)); + player.sendMessage("§a§lYour time of §e§l" + timeString + "§a§l did not beat your previous record of §e§l" + previousTimeString + "§a§l! Try again to beat your old record!"); + } if (HypixelConst.getTypeLoader() instanceof LobbyTypeLoader lobbyLoader) { player.getInventory().clear(); @@ -182,7 +199,11 @@ public void checkpointPlayer(HypixelPlayer player, int checkpointIndex) { return; } perPlayerStartTime.put(player.getUuid(), new RunData(runData.startTime(), checkpointIndex)); - player.sendMessage("§a§lCheckpoint §e§l#" + checkpointIndex + " §areached!"); + String timeString = String.format("%02d:%02d.%03d", + ((System.currentTimeMillis() - runData.startTime()) / 60000), + ((System.currentTimeMillis() - runData.startTime()) % 60000) / 1000, + ((System.currentTimeMillis() - runData.startTime()) % 1000)); + player.sendMessage("§a§lYou reached §e§lCheckpoint #" + checkpointIndex + " §a§lafter §e§l" + timeString + "§a§l."); } public void cancelParkour(HypixelPlayer player) {