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 net.minecraft.client.Minecraft; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; 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; } }