package com.thatgravyboat.skyblockhud.dungeons; import com.thatgravyboat.skyblockhud.Utils; import com.thatgravyboat.skyblockhud.api.events.SidebarLineUpdateEvent; import com.thatgravyboat.skyblockhud.api.events.SidebarPostEvent; import com.thatgravyboat.skyblockhud.location.LocationHandler; import com.thatgravyboat.skyblockhud.location.Locations; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.minecraft.client.Minecraft; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class DungeonHandler { private static final HashMap dungeonPlayersMap = new HashMap<>(); private static int dungeonTime = 0; private static int dungeonCleared = 0; private static boolean bloodKey = false; private static int witherKeys = 0; private static int maxSecrets = 0; private static int secrets = 0; private static int totalSecrets = 0; private static int deaths = 0; private static int crypts = 0; private static final Pattern DungeonPlayerRegex = Pattern.compile("^\\[([HMBAT])] ([\\w]+) ([0-9]+|DEAD)$"); @SubscribeEvent public void onSidebarLineUpdate(SidebarLineUpdateEvent event) { if (LocationHandler.getCurrentLocation().equals(Locations.CATACOMBS)) { DungeonHandler.checkForDungeonTime(event.formattedLine); DungeonHandler.checkForDungeonCleared(event.formattedLine); DungeonHandler.checkForDungeonKeys(event.formattedLine, event.rawLine); DungeonHandler.checkForDungeonPlayers(event.formattedLine, Minecraft.getMinecraft()); } } @SubscribeEvent public void onSidebarPost(SidebarPostEvent event) { if (!LocationHandler.getCurrentLocation().equals(Locations.CATACOMBS)) { DungeonHandler.clearDungeonStats(); } } public static void checkForDungeonPlayers(String scoreLine, Minecraft mc) { Matcher dungeonMatcher = DungeonPlayerRegex.matcher(scoreLine); if (dungeonMatcher.matches() && DungeonHandler.dungeonTime > 0) { Classes playerClass = Classes.valueOf(dungeonMatcher.group(1)); String displayName = dungeonMatcher.group(2); String health = dungeonMatcher.group(3); if (!mc.thePlayer.getName().toLowerCase().startsWith(displayName.toLowerCase().trim())) { int healthNum = 0; if (!health.equalsIgnoreCase("dead")) { try { healthNum = Integer.parseInt(health); } catch (NumberFormatException ignored) {} } DungeonPlayer player = new DungeonPlayer(playerClass, displayName, healthNum, health.equalsIgnoreCase("dead")); dungeonPlayersMap.put(displayName.toLowerCase(), player); } } } public static void checkForDungeonTime(String scoreLine) { if (scoreLine.toLowerCase().trim().contains("time elapsed:")) { String timeLine = scoreLine.toLowerCase().trim().replace("time elapsed:", ""); String[] times = timeLine.split("m "); int time = 0; try { time += Integer.parseInt(times[0].replace(" ", "").replace("m", "")) * 60; time += Integer.parseInt(times[1].replace(" ", "").replace("s", "")); } catch (NumberFormatException ignored) {} dungeonTime = time; } } public static void checkForDungeonCleared(String scoreline) { if (scoreline.toLowerCase().trim().contains("dungeon cleared:")) { String dungeonClearedText = scoreline.toLowerCase().trim().replace("dungeon cleared:", "").replace(" ", "").replace("%", ""); try { dungeonCleared = Integer.parseInt(dungeonClearedText); } catch (NumberFormatException ignored) {} } } public static void checkForDungeonKeys(String scoreline, String rawString) { if (scoreline.toLowerCase().trim().contains("keys:")) { String dungeonClearedText = scoreline.toLowerCase().trim().replace("keys:", "").replace(" ", "").replace("x", ""); bloodKey = rawString.contains("\u2713"); try { witherKeys = Integer.parseInt(dungeonClearedText); } catch (NumberFormatException ignored) {} } } public static void parseSecrets(String statusBar) { boolean hasSecrets = false; String[] parts = statusBar.split(" {4,}"); for (String part : parts) { if (part.toLowerCase().contains("secrets") && !statusBar.toLowerCase().contains("no secrets")) { hasSecrets = true; try { String secret = Utils.removeColor(part.replace("Secrets", "")).replace(" ", ""); maxSecrets = Integer.parseInt(secret.split("/")[1]); secrets = Integer.parseInt(secret.split("/")[0]); } catch (NumberFormatException ignored) {} } } if (!hasSecrets) { maxSecrets = 0; secrets = 0; } } public static void parseTotalSecrets(String playerName) { if (playerName.toLowerCase().contains("secrets found:")) { String totalSecret = Utils.removeColor(playerName.toLowerCase().replace("secrets found:", "")).replace(" ", ""); try { totalSecrets = Integer.parseInt(totalSecret); } catch (NumberFormatException ignored) {} } } public static void parseDeaths(String playerName) { if (playerName.toLowerCase().contains("deaths:")) { String death = Utils.removeColor(playerName.toLowerCase().replace("deaths:", "")).replace("(", "").replace(")", "").replace(" ", ""); try { deaths = Integer.parseInt(death); } catch (NumberFormatException ignored) {} } } public static void parseCrypts(String playerName) { if (playerName.toLowerCase().contains("crypts:")) { String crypt = Utils.removeColor(playerName.toLowerCase().replace("crypts:", "")).replace(" ", ""); try { crypts = Integer.parseInt(crypt); } catch (NumberFormatException ignored) {} } } public static void clearDungeonStats() { dungeonPlayersMap.clear(); dungeonTime = 0; dungeonCleared = 0; bloodKey = false; witherKeys = 0; maxSecrets = 0; secrets = 0; totalSecrets = 0; deaths = 0; crypts = 0; } public static HashMap getDungeonPlayers() { return dungeonPlayersMap; } public static int getDungeonTime() { return dungeonTime; } public static int getDungeonCleared() { return dungeonCleared; } public static int getWitherKeys() { return witherKeys; } public static boolean hasBloodkey() { return bloodKey; } public static int getMaxSecrets() { return maxSecrets; } public static int getSecrets() { return secrets; } public static int getDeaths() { return deaths; } public static int getTotalSecrets() { return totalSecrets; } public static int getCrypts() { return crypts; } }