aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/Danker/features
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me/Danker/features')
-rw-r--r--src/main/java/me/Danker/features/ArachneESP.java75
-rw-r--r--src/main/java/me/Danker/features/AutoDisplay.java76
-rw-r--r--src/main/java/me/Danker/features/AutoSwapToPickBlock.java51
-rw-r--r--src/main/java/me/Danker/features/BonzoMaskTimer.java86
-rw-r--r--src/main/java/me/Danker/features/CakeTimer.java62
-rw-r--r--src/main/java/me/Danker/features/CustomMusic.java180
-rw-r--r--src/main/java/me/Danker/features/DungeonTimer.java79
-rw-r--r--src/main/java/me/Danker/features/ExpertiseLore.java40
-rw-r--r--src/main/java/me/Danker/features/FasterMaddoxCalling.java64
-rw-r--r--src/main/java/me/Danker/features/GoldenEnchants.java68
-rw-r--r--src/main/java/me/Danker/features/GolemSpawningAlert.java58
-rw-r--r--src/main/java/me/Danker/features/GpartyNotifications.java38
-rw-r--r--src/main/java/me/Danker/features/HideTooltipsInExperiments.java38
-rw-r--r--src/main/java/me/Danker/features/LowHealthNotifications.java36
-rw-r--r--src/main/java/me/Danker/features/NecronNotifications.java78
-rw-r--r--src/main/java/me/Danker/features/NoF3Coords.java33
-rw-r--r--src/main/java/me/Danker/features/NotifySlayerSlain.java88
-rw-r--r--src/main/java/me/Danker/features/PetColours.java69
-rw-r--r--src/main/java/me/Danker/features/Reparty.java143
-rw-r--r--src/main/java/me/Danker/features/Skill50Display.java77
-rw-r--r--src/main/java/me/Danker/features/SkillTracker.java208
-rw-r--r--src/main/java/me/Danker/features/SlayerESP.java119
-rw-r--r--src/main/java/me/Danker/features/SpamHider.java58
-rw-r--r--src/main/java/me/Danker/features/SpiritBearAlert.java24
-rw-r--r--src/main/java/me/Danker/features/StopSalvagingStarredItems.java34
-rw-r--r--src/main/java/me/Danker/features/UpdateChecker.java52
-rw-r--r--src/main/java/me/Danker/features/WatcherReadyAlert.java22
-rw-r--r--src/main/java/me/Danker/features/loot/LootDisplay.java943
-rw-r--r--src/main/java/me/Danker/features/loot/LootTracker.java1163
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/BlazeSolver.java86
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/BoulderSolver.java188
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/ChronomatronSolver.java103
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/ClickInOrderSolver.java107
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/CreeperSolver.java86
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/IceWalkSolver.java287
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/LividSolver.java89
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/SelectAllColourSolver.java59
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/SilverfishSolver.java186
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/StartsWithSolver.java31
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/SuperpairsSolver.java150
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/ThreeManSolver.java75
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/TicTacToeSolver.java135
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/TriviaSolver.java102
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/UltrasequencerSolver.java87
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/WaterSolver.java162
45 files changed, 5995 insertions, 0 deletions
diff --git a/src/main/java/me/Danker/features/ArachneESP.java b/src/main/java/me/Danker/features/ArachneESP.java
new file mode 100644
index 0000000..c78c385
--- /dev/null
+++ b/src/main/java/me/Danker/features/ArachneESP.java
@@ -0,0 +1,75 @@
+package me.Danker.features;
+
+import me.Danker.commands.ToggleCommand;
+import me.Danker.handlers.ScoreboardHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.StringUtils;
+import net.minecraft.world.World;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.client.event.RenderWorldLastEvent;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+import java.util.List;
+
+/**
+ * @author RabbitType99
+ */
+
+public class ArachneESP {
+
+ static Entity arachne = null;
+ static boolean arachneActive = true;
+ public static int ARACHANE_COLOUR;
+
+ @SubscribeEvent
+ public void onWorldChange(WorldEvent.Load event) {
+ arachne = null;
+ }
+
+ public boolean inSpidersDen(List<String> scoreboard) {
+ for (String s : scoreboard) {
+ if (ScoreboardHandler.cleanSB(s).contains("Spiders Den")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @SubscribeEvent
+ public void onChat(ClientChatReceivedEvent event) {
+ if (!Utils.inSkyblock) return;
+ if (!inSpidersDen(ScoreboardHandler.getSidebarLines())) return;
+ String message = StringUtils.stripControlCodes(event.message.getUnformattedText());
+ if (message.contains("Something is awakening")){
+ arachneActive = true;
+ World world = Minecraft.getMinecraft().theWorld;
+ List<Entity> entities = world.getLoadedEntityList();
+ for (Entity e : entities) {
+ if (e.getName().contains("Arachne") && !e.getName().contains("Arachne's Brood")) {
+ arachne = e;
+ }
+ }
+ }
+ if (message.contains("ARACHNE DOWN!")) {
+ arachneActive = false;
+ arachne = null;
+ }
+ }
+
+ @SubscribeEvent
+ public void onWorldRender(RenderWorldLastEvent event) {
+ if (!Utils.inSkyblock) return;
+ if (arachne != null) {
+ if (arachneActive && ToggleCommand.highlightArachne) {
+ AxisAlignedBB aabb = new AxisAlignedBB(arachne.posX - 0.75, arachne.posY - 1, arachne.posZ - 0.75, arachne.posX + 0.75, arachne.posY, arachne.posZ + 0.75);
+ Utils.draw3DBox(aabb, ARACHANE_COLOUR, event.partialTicks);
+ }
+ }
+ }
+
+}
+
diff --git a/src/main/java/me/Danker/features/AutoDisplay.java b/src/main/java/me/Danker/features/AutoDisplay.java
new file mode 100644
index 0000000..182c0b4
--- /dev/null
+++ b/src/main/java/me/Danker/features/AutoDisplay.java
@@ -0,0 +1,76 @@
+package me.Danker.features;
+
+import me.Danker.DankersSkyblockMod;
+import me.Danker.features.loot.LootDisplay;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.handlers.ScoreboardHandler;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import java.util.List;
+
+public class AutoDisplay {
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ClientTickEvent event) {
+ if (event.phase != TickEvent.Phase.START) return;
+
+ Minecraft mc = Minecraft.getMinecraft();
+ World world = mc.theWorld;
+ EntityPlayerSP player = mc.thePlayer;
+ if (DankersSkyblockMod.tickAmount % 20 == 0) {
+ if (LootDisplay.auto && world != null && player != null) {
+ List<String> scoreboard = ScoreboardHandler.getSidebarLines();
+ boolean found = false;
+ for (String s : scoreboard) {
+ String sCleaned = ScoreboardHandler.cleanSB(s);
+ if (sCleaned.contains("Sven Packmaster")) {
+ LootDisplay.display = "wolf";
+ found = true;
+ } else if (sCleaned.contains("Tarantula Broodfather")) {
+ LootDisplay.display = "spider";
+ found = true;
+ } else if (sCleaned.contains("Revenant Horror")) {
+ LootDisplay.display = "zombie";
+ found = true;
+ } else if (sCleaned.contains("The Mist")){
+ LootDisplay.display = "ghost";
+ found = true;
+ } else if (sCleaned.contains("The Catacombs (")) {
+ if (sCleaned.contains("F1")) {
+ LootDisplay.display = "catacombs_floor_one";
+ } else if (sCleaned.contains("F2")) {
+ LootDisplay.display = "catacombs_floor_two";
+ } else if (sCleaned.contains("F3")) {
+ LootDisplay.display = "catacombs_floor_three";
+ } else if (sCleaned.contains("F4")) {
+ LootDisplay.display = "catacombs_floor_four";
+ } else if (sCleaned.contains("F5")) {
+ LootDisplay.display = "catacombs_floor_five";
+ } else if (sCleaned.contains("F6")) {
+ LootDisplay.display = "catacombs_floor_six";
+ } else if (sCleaned.contains("F7")) {
+ LootDisplay.display = "catacombs_floor_seven";
+ }
+ found = true;
+ }
+ }
+ for (int i = 0; i < 8; i++) {
+ ItemStack hotbarItem = player.inventory.getStackInSlot(i);
+ if (hotbarItem == null) continue;
+ if (hotbarItem.getDisplayName().contains("Ancestral Spade")) {
+ LootDisplay.display = "mythological";
+ found = true;
+ }
+ }
+ if (!found) LootDisplay.display = "off";
+ ConfigHandler.writeStringConfig("misc", "display", LootDisplay.display);
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/features/AutoSwapToPickBlock.java b/src/main/java/me/Danker/features/AutoSwapToPickBlock.java
new file mode 100644
index 0000000..ccabbce
--- /dev/null
+++ b/src/main/java/me/Danker/features/AutoSwapToPickBlock.java
@@ -0,0 +1,51 @@
+package me.Danker.features;
+
+import me.Danker.commands.ToggleCommand;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.inventory.GuiChest;
+import net.minecraft.client.settings.GameSettings;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ContainerChest;
+import net.minecraft.inventory.IInventory;
+import net.minecraftforge.client.event.GuiOpenEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class AutoSwapToPickBlock {
+
+ static int pickBlockBind;
+ static boolean pickBlockBindSwapped = false;
+
+ @SubscribeEvent
+ public void onGuiOpen(GuiOpenEvent event) {
+ Minecraft mc = Minecraft.getMinecraft();
+ GameSettings gameSettings = mc.gameSettings;
+ if (event.gui instanceof GuiChest) {
+ Container containerChest = ((GuiChest) event.gui).inventorySlots;
+ if (containerChest instanceof ContainerChest) {
+ IInventory inventory = ((ContainerChest) containerChest).getLowerChestInventory();
+ String inventoryName = inventory.getDisplayName().getUnformattedText();
+
+ if (ToggleCommand.swapToPickBlockToggled) {
+ if (inventoryName.startsWith("Chronomatron (") || inventoryName.startsWith("Superpairs (") || inventoryName.startsWith("Ultrasequencer (") || inventoryName.startsWith("What starts with:") || inventoryName.startsWith("Select all the") || inventoryName.startsWith("Navigate the maze!") || inventoryName.startsWith("Correct all the panes!") || inventoryName.startsWith("Click in order!") || inventoryName.startsWith("Harp -")) {
+ if (!pickBlockBindSwapped) {
+ pickBlockBind = gameSettings.keyBindPickBlock.getKeyCode();
+ gameSettings.keyBindPickBlock.setKeyCode(-100);
+ pickBlockBindSwapped = true;
+ }
+ } else {
+ if (pickBlockBindSwapped) {
+ gameSettings.keyBindPickBlock.setKeyCode(pickBlockBind);
+ pickBlockBindSwapped = false;
+ }
+ }
+ }
+ }
+ } else {
+ if (pickBlockBindSwapped) {
+ gameSettings.keyBindPickBlock.setKeyCode(pickBlockBind);
+ pickBlockBindSwapped = false;
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/features/BonzoMaskTimer.java b/src/main/java/me/Danker/features/BonzoMaskTimer.java
new file mode 100644
index 0000000..e038786
--- /dev/null
+++ b/src/main/java/me/Danker/features/BonzoMaskTimer.java
@@ -0,0 +1,86 @@
+package me.Danker.features;
+
+import me.Danker.commands.MoveCommand;
+import me.Danker.commands.ScaleCommand;
+import me.Danker.commands.ToggleCommand;
+import me.Danker.events.RenderOverlay;
+import me.Danker.handlers.TextRenderer;
+import me.Danker.utils.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StringUtils;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.lwjgl.opengl.GL11;
+
+public class BonzoMaskTimer {
+
+ public static double nextBonzoUse = 0;
+ public static String BONZO_COLOR;
+ public static final ResourceLocation BONZO_ICON = new ResourceLocation("dsm", "icons/bonzo.png");
+
+ @SubscribeEvent
+ public void onWorldChange(WorldEvent.Load event) {
+ nextBonzoUse = 0;
+ }
+
+ @SubscribeEvent
+ public void onChat(ClientChatReceivedEvent event) {
+ String message = StringUtils.stripControlCodes(event.message.getUnformattedText());
+
+ if (!Utils.inDungeons) return;
+
+ if (ToggleCommand.bonzoTimerToggled && message.contains("Bonzo's Mask") && message.contains("saved your life!")) {
+ double usedTime = System.currentTimeMillis() / 1000;
+ Minecraft mc = Minecraft.getMinecraft();
+ EntityPlayerSP player = mc.thePlayer;
+ ItemStack bonzoMask = player.getCurrentArmor(3);
+ if (bonzoMask != null && bonzoMask.getItem() == Items.skull) {
+ int cooldownSeconds = 0;
+ for (String line : Utils.getItemLore(bonzoMask)) {
+ String stripped = StringUtils.stripControlCodes(line);
+ if (stripped.startsWith("Cooldown: "))
+ cooldownSeconds = Integer.parseInt(stripped.replaceAll("[^\\d]", ""));
+ }
+ System.out.println("Parsed Bonzo Mask Cooldown: " + cooldownSeconds);
+ if (cooldownSeconds > 0)
+ nextBonzoUse = usedTime + cooldownSeconds;
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void renderPlayerInfo(RenderOverlay event) {
+ if (ToggleCommand.bonzoTimerToggled && Utils.inDungeons) {
+ Minecraft mc = Minecraft.getMinecraft();
+ ItemStack helmetSlot = mc.thePlayer.getCurrentArmor(3);
+ if ((helmetSlot != null && helmetSlot.getDisplayName().contains("Bonzo's Mask")) || nextBonzoUse > 0) {
+
+ double scale = ScaleCommand.bonzoTimerScale;
+ double scaleReset = Math.pow(scale, -1);
+ GL11.glScaled(scale, scale, scale);
+
+ double timeNow = System.currentTimeMillis() / 1000;
+ mc.getTextureManager().bindTexture(BONZO_ICON);
+ Gui.drawModalRectWithCustomSizedTexture(MoveCommand.bonzoTimerXY[0], MoveCommand.bonzoTimerXY[1], 0, 0, 16, 16, 16, 16);
+
+ String bonzoText;
+ if (nextBonzoUse - timeNow < 0) {
+ bonzoText = EnumChatFormatting.GREEN + "READY";
+ } else {
+ bonzoText = BONZO_COLOR + Utils.getTimeBetween(timeNow, nextBonzoUse);
+ }
+ new TextRenderer(mc, bonzoText, MoveCommand.bonzoTimerXY[0] + 20, MoveCommand.bonzoTimerXY[1] + 5, 1);
+
+ GL11.glScaled(scaleReset, scaleReset, scaleReset);
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/features/CakeTimer.java b/src/main/java/me/Danker/features/CakeTimer.java
new file mode 100644
index 0000000..ba6eb3d
--- /dev/null
+++ b/src/main/java/me/Danker/features/CakeTimer.java
@@ -0,0 +1,62 @@
+package me.Danker.features;
+
+import me.Danker.commands.MoveCommand;
+import me.Danker.commands.ScaleCommand;
+import me.Danker.commands.ToggleCommand;
+import me.Danker.events.RenderOverlay;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.handlers.TextRenderer;
+import me.Danker.utils.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StringUtils;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.lwjgl.opengl.GL11;
+
+public class CakeTimer {
+
+ public static double cakeTime;
+ public static final ResourceLocation CAKE_ICON = new ResourceLocation("dsm", "icons/cake.png");
+ public static String CAKE_COLOUR;
+
+ @SubscribeEvent
+ public void onChat(ClientChatReceivedEvent event) {
+ String message = StringUtils.stripControlCodes(event.message.getUnformattedText());
+
+ if (!Utils.inSkyblock) return;
+ if (message.contains(":")) return;
+
+ if (message.contains("Yum! You gain +") && message.contains(" for 48 hours!")) {
+ cakeTime = System.currentTimeMillis() / 1000 + 172800; // Add 48 hours
+ ConfigHandler.writeDoubleConfig("misc", "cakeTime", cakeTime);
+ }
+ }
+
+ @SubscribeEvent
+ public void renderPlayerInfo(RenderOverlay event) {
+ if (ToggleCommand.cakeTimerToggled && Utils.inSkyblock) {
+ Minecraft mc = Minecraft.getMinecraft();
+ double scale = ScaleCommand.cakeTimerScale;
+ double scaleReset = Math.pow(scale, -1);
+ GL11.glScaled(scale, scale, scale);
+
+ double timeNow = System.currentTimeMillis() / 1000;
+ mc.getTextureManager().bindTexture(CAKE_ICON);
+ Gui.drawModalRectWithCustomSizedTexture(MoveCommand.cakeTimerXY[0], MoveCommand.cakeTimerXY[1], 0, 0, 16, 16, 16, 16);
+
+ String cakeText;
+ if (cakeTime - timeNow < 0) {
+ cakeText = EnumChatFormatting.RED + "NONE";
+ } else {
+ cakeText = CAKE_COLOUR + Utils.getTimeBetween(timeNow, cakeTime);
+ }
+ new TextRenderer(mc, cakeText, MoveCommand.cakeTimerXY[0] + 20, MoveCommand.cakeTimerXY[1] + 5, 1);
+
+ GL11.glScaled(scaleReset, scaleReset, scaleReset);
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/features/CustomMusic.java b/src/main/java/me/Danker/features/CustomMusic.java
new file mode 100644
index 0000000..4b1f6bb
--- /dev/null
+++ b/src/main/java/me/Danker/features/CustomMusic.java
@@ -0,0 +1,180 @@
+package me.Danker.features;
+
+import me.Danker.DankersSkyblockMod;
+import me.Danker.commands.ToggleCommand;
+import me.Danker.handlers.ScoreboardHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.StringUtils;
+import net.minecraft.world.World;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.client.event.sound.PlaySoundEvent;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fml.common.eventhandler.EventPriority;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import javax.sound.sampled.*;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+public class CustomMusic {
+
+ static boolean cancelNotes;
+ static boolean prevInDungeonBossRoom = false;
+ public static boolean inDungeonBossRoom = false;
+ public static Song dungeonboss;
+ public static int dungeonbossVolume;
+ public static Song bloodroom;
+ public static int bloodroomVolume;
+ public static Song dungeon;
+ public static int dungeonVolume;
+
+ @SubscribeEvent
+ public void onWorldChange(WorldEvent.Load event) {
+ reset();
+ }
+
+ @SubscribeEvent(priority = EventPriority.LOW)
+ public void onTick(TickEvent.ClientTickEvent event) {
+ if (event.phase != TickEvent.Phase.START) return;
+
+ Minecraft mc = Minecraft.getMinecraft();
+ EntityPlayerSP player = mc.thePlayer;
+ World world = mc.theWorld;
+ if (DankersSkyblockMod.tickAmount % 10 == 0) {
+ if (ToggleCommand.dungeonBossMusic && Utils.inDungeons && world != null && player != null) {
+ prevInDungeonBossRoom = inDungeonBossRoom;
+ List<String> scoreboard = ScoreboardHandler.getSidebarLines();
+ if (scoreboard.size() > 2) {
+ String firstLine = ScoreboardHandler.cleanSB(scoreboard.get(scoreboard.size() - 1));
+ String secondLine = ScoreboardHandler.cleanSB(scoreboard.get(scoreboard.size() - 2));
+ if (firstLine.contains("30,30") || // F1
+ firstLine.contains("30,125") || // F2
+ firstLine.contains("30,225") || // F3
+ secondLine.contains("- Healthy") || // F3
+ firstLine.contains("30,344") || // F4
+ firstLine.contains("livid") || // F5
+ firstLine.contains("sadan") || // F6
+ firstLine.contains("necron")) { // F7
+
+ inDungeonBossRoom = true;
+ if (!prevInDungeonBossRoom) {
+ dungeonboss.start();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @SubscribeEvent(receiveCanceled = true)
+ public void onChat(ClientChatReceivedEvent event) {
+ String message = StringUtils.stripControlCodes(event.message.getUnformattedText());
+
+ if (ToggleCommand.dungeonMusic && Utils.inDungeons) {
+ if (message.contains("[NPC] Mort: Here, I found this map when I first entered the dungeon.")) {
+ dungeon.start();
+ }
+ }
+
+ if (message.contains(":")) return;
+
+ if (Utils.inDungeons) {
+ if (message.contains("EXTRA STATS ")) {
+ dungeonboss.stop();
+ bloodroom.stop();
+ dungeon.stop();
+ } else if (ToggleCommand.bloodRoomMusic && message.contains("The BLOOD DOOR has been opened!")) {
+ bloodroom.start();
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onSound(PlaySoundEvent event) {
+ if (cancelNotes && event.name.startsWith("note.")) {
+ event.result = null;
+ }
+ }
+
+ public static void init(String configDirectory) throws IOException, LineUnavailableException, UnsupportedAudioFileException {
+ if (configDirectory == null) return;
+ File directory = new File(configDirectory + "/dsmmusic");
+ if (!directory.exists()) directory.mkdir();
+
+ reset();
+
+ File dungeonBossFile = new File(directory + "/dungeonboss.wav");
+ System.out.println("dungeonboss.wav exists?: " + dungeonBossFile.exists());
+ dungeonboss = new Song(dungeonBossFile, dungeonbossVolume);
+
+ File bloodRoomFile = new File(directory + "/bloodroom.wav");
+ System.out.println("bloodroom.wav exists?: " + bloodRoomFile.exists());
+ bloodroom = new Song(bloodRoomFile, bloodroomVolume);
+
+ File dungeonFile = new File(directory + "/dungeon.wav");
+ System.out.println("dungeon.wav exists?: " + dungeonFile.exists());
+ dungeon = new Song(dungeonFile, dungeonVolume);
+ }
+
+ public static void reset() {
+ if (dungeonboss != null) dungeonboss.stop();
+ if (bloodroom != null) bloodroom.stop();
+ if (dungeon != null) dungeon.stop();
+ }
+
+ public static class Song {
+
+ public Clip music;
+
+ public Song(File file, int volume) throws IOException, UnsupportedAudioFileException, LineUnavailableException {
+ if (file.exists()) {
+ music = AudioSystem.getClip();
+ AudioInputStream ais = AudioSystem.getAudioInputStream(file);
+ music.open(ais);
+
+ setVolume(volume);
+ }
+ }
+
+ public void start() {
+ reset();
+ if (music != null) {
+ cancelNotes = true;
+ music.setMicrosecondPosition(0);
+ music.start();
+ music.loop(Clip.LOOP_CONTINUOUSLY);
+ }
+ }
+
+ public void stop() {
+ cancelNotes = false;
+ if (music != null) music.stop();
+ }
+
+ public boolean setVolume(int volume) {
+ EntityPlayer player = Minecraft.getMinecraft().thePlayer;
+ if (music == null) return false;
+ if (volume <= 0 || volume > 100) {
+ if (player != null) player.addChatMessage(new ChatComponentText(DankersSkyblockMod.ERROR_COLOUR + "Volume can only be set between 0% and 100%."));
+ return false;
+ }
+
+ float decibels = (float) (20 * Math.log(volume / 100.0));
+ FloatControl control = (FloatControl) music.getControl(FloatControl.Type.MASTER_GAIN);
+ if (decibels <= control.getMinimum() || decibels >= control.getMaximum()) {
+ return false;
+ }
+
+ control.setValue(decibels);
+ return true;
+ }
+
+ }
+
+}
diff --git a/src/main/java/me/Danker/features/DungeonTimer.java b/src/main/java/me/Danker/features/DungeonTimer.java
new file mode 100644
index 0000000..394f2de
--- /dev/null
+++ b/src/main/java/me/Danker/features/DungeonTimer.java
@@ -0,0 +1,79 @@
+package me.Danker.features;
+
+import me.Danker.commands.MoveCommand;
+import me.Danker.commands.ScaleCommand;
+import me.Danker.commands.ToggleCommand;
+import me.Danker.events.RenderOverlay;
+import me.Danker.handlers.TextRenderer;
+import me.Danker.utils.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StringUtils;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class DungeonTimer {
+
+ static double dungeonStartTime = 0;
+ static double bloodOpenTime = 0;
+ static double watcherClearTime = 0;
+ static double bossClearTime = 0;
+ static int witherDoors = 0;
+ static int dungeonDeaths = 0;
+ static int puzzleFails = 0;
+
+ @SubscribeEvent(receiveCanceled = true)
+ public void onChat(ClientChatReceivedEvent event) {
+ String message = StringUtils.stripControlCodes(event.message.getUnformattedText());
+
+ if (!Utils.inDungeons) return;
+
+ if (message.contains("[BOSS] The Watcher: You have proven yourself. You may pass.")) {
+ watcherClearTime = System.currentTimeMillis() / 1000;
+ } else if (message.contains("PUZZLE FAIL! ") || message.contains("chose the wrong answer! I shall never forget this moment")) {
+ puzzleFails++;
+ }
+
+ if (message.contains(":")) return;
+
+ if (message.contains("Dungeon starts in 1 second.")) { // Dungeons Stuff
+ dungeonStartTime = System.currentTimeMillis() / 1000 + 1;
+ bloodOpenTime = dungeonStartTime;
+ watcherClearTime = dungeonStartTime;
+ bossClearTime = dungeonStartTime;
+ witherDoors = 0;
+ dungeonDeaths = 0;
+ puzzleFails = 0;
+ } else if (message.contains("The BLOOD DOOR has been opened!")) {
+ bloodOpenTime = System.currentTimeMillis() / 1000;
+ } else if (message.contains(" opened a WITHER door!")) {
+ witherDoors++;
+ } else if (message.contains(" and became a ghost.")) {
+ dungeonDeaths++;
+ } else if (message.contains(" Defeated ") && message.contains(" in ")) {
+ bossClearTime = System.currentTimeMi