diff options
Diffstat (limited to 'src/main/java/com/thatgravyboat/skyblockhud/handlers/SlayerHandler.java')
-rw-r--r-- | src/main/java/com/thatgravyboat/skyblockhud/handlers/SlayerHandler.java | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/main/java/com/thatgravyboat/skyblockhud/handlers/SlayerHandler.java b/src/main/java/com/thatgravyboat/skyblockhud/handlers/SlayerHandler.java new file mode 100644 index 000000000..4a1f4e698 --- /dev/null +++ b/src/main/java/com/thatgravyboat/skyblockhud/handlers/SlayerHandler.java @@ -0,0 +1,130 @@ +package com.thatgravyboat.skyblockhud.handlers; + +import com.thatgravyboat.skyblockhud.api.events.SidebarLineUpdateEvent; +import com.thatgravyboat.skyblockhud.api.events.SidebarPostEvent; +import com.thatgravyboat.skyblockhud.api.events.SkyBlockEntityKilled; +import com.thatgravyboat.skyblockhud.utils.Utils; +import java.util.Arrays; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +public class SlayerHandler { + + private static final Pattern KILLS_REGEX = Pattern.compile("(\\d+)/(\\d+) kills?"); + private static final Pattern SLAYER_PATTERN = Pattern.compile("Talk to Maddox to claim your ([A-Za-z]+) Slayer XP!"); + + public enum slayerTypes { + ZOMBIE(34, "Revenant Horror"), + WOLF(42, "Sven Packmaster"), + SPIDER(50, "Tarantula Broodfather"), + VOIDGLOOMSERAPH(58, "Voidgloom Seraph"), + NONE(0, ""); + + private final String displayName; + private final int x; + + slayerTypes(int x, String displayName) { + this.displayName = displayName; + this.x = x; + } + + public String getDisplayName() { + return displayName; + } + + public int getX() { + return x; + } + } + + public static slayerTypes currentSlayer = slayerTypes.NONE; + public static int slayerTier = 0; + public static boolean isDoingSlayer = false; + public static int progress = 0; + public static int maxKills = 0; + public static boolean bossSlain = false; + public static boolean isKillingBoss = false; + + public static void clearSlayer() { + currentSlayer = slayerTypes.NONE; + isDoingSlayer = false; + progress = 0; + maxKills = 0; + bossSlain = false; + isKillingBoss = false; + } + + @SubscribeEvent + public void onSidebarPost(SidebarPostEvent event) { + String arrayString = Arrays.toString(event.arrayScores); + isDoingSlayer = Arrays.toString(event.arrayScores).contains("Slayer Quest"); + if (isDoingSlayer && (currentSlayer.equals(slayerTypes.NONE) || !arrayString.replace(" ", "").contains(currentSlayer.getDisplayName().replace(" ", "") + Utils.intToRomanNumeral(slayerTier)))) { + for (int i = 0; i < event.scores.size(); i++) { + String line = event.scores.get(i); + if (line.contains("Slayer Quest") && event.scores.size() > 3) { + String slayer = event.scores.get(i - 1).toLowerCase(); + SlayerHandler.slayerTypes selectedSlayer = SlayerHandler.slayerTypes.NONE; + for (slayerTypes types : slayerTypes.values()) { + if (slayer.contains(types.displayName.toLowerCase(Locale.ENGLISH))) { + selectedSlayer = types; + break; + } + } + SlayerHandler.currentSlayer = selectedSlayer; + SlayerHandler.slayerTier = Utils.whatRomanNumeral(slayer.replace(selectedSlayer.getDisplayName().toLowerCase(), "").replace(" ", "")); + break; + } + } + } + + if (!isDoingSlayer) { + clearSlayer(); + } + } + + @SubscribeEvent + public void onSidebarLineUpdate(SidebarLineUpdateEvent event) { + if (!isDoingSlayer && event.formattedLine.equals("Slayer Quest")) isDoingSlayer = true; + + if (isDoingSlayer) { + String line = event.formattedLine.toLowerCase(); + Matcher killMatcher = KILLS_REGEX.matcher(line); + + if (killMatcher.find()) { + SlayerHandler.bossSlain = false; + SlayerHandler.isKillingBoss = false; + try { + progress = Integer.parseInt(killMatcher.group(1)); + } catch (Exception ignored) {} + try { + maxKills = Integer.parseInt(killMatcher.group(2)); + } catch (Exception ignored) {} + } else if (line.contains("slay the boss")) { + SlayerHandler.bossSlain = false; + SlayerHandler.isKillingBoss = true; + SlayerHandler.maxKills = 0; + SlayerHandler.progress = 0; + } else if (line.contains("boss slain")) { + SlayerHandler.isKillingBoss = false; + SlayerHandler.maxKills = 0; + SlayerHandler.progress = 0; + SlayerHandler.bossSlain = true; + } + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onChatMessage(ClientChatReceivedEvent event) { + if (event.type != 2) { + Matcher slayerMatcher = SLAYER_PATTERN.matcher(Utils.removeColor(event.message.getUnformattedText())); + if (slayerMatcher.find()) { + MinecraftForge.EVENT_BUS.post(new SkyBlockEntityKilled(slayerMatcher.group(1).toUpperCase(Locale.ENGLISH) + "_SLAYER", null)); + } + } + } +} |