aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md20
-rw-r--r--build.gradle2
-rw-r--r--src/main/java/me/Danker/DankersSkyblockMod.java64
-rw-r--r--src/main/java/me/Danker/commands/BlockSlayerCommand.java7
-rw-r--r--src/main/java/me/Danker/commands/CustomMusicCommand.java70
-rw-r--r--src/main/java/me/Danker/commands/DHelpCommand.java9
-rw-r--r--src/main/java/me/Danker/commands/DankerGuiCommand.java4
-rw-r--r--src/main/java/me/Danker/commands/LootCommand.java4
-rw-r--r--src/main/java/me/Danker/commands/ToggleCommand.java31
-rw-r--r--src/main/java/me/Danker/features/BlockPlacingFlowers.java (renamed from src/main/java/me/Danker/features/puzzlesolvers/BlockPlacingFlowers.java)2
-rw-r--r--src/main/java/me/Danker/features/CustomMusic.java117
-rw-r--r--src/main/java/me/Danker/features/loot/LootDisplay.java8
-rw-r--r--src/main/java/me/Danker/features/loot/LootTracker.java22
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/IceWalkSolver.java287
-rw-r--r--src/main/java/me/Danker/features/puzzlesolvers/SilverfishSolver.java5
-rw-r--r--src/main/java/me/Danker/gui/DankerGui.java38
-rw-r--r--src/main/java/me/Danker/gui/OnlySlayerGui.java33
-rw-r--r--src/main/java/me/Danker/gui/PuzzleSolversGui.java17
-rw-r--r--src/main/java/me/Danker/handlers/ConfigHandler.java6
-rw-r--r--src/main/java/me/Danker/utils/IceWalkUtils.java99
20 files changed, 772 insertions, 73 deletions
diff --git a/README.md b/README.md
index 848251e..6f484d7 100644
--- a/README.md
+++ b/README.md
@@ -36,11 +36,12 @@ Discord Server: https://discord.gg/QsEkNQS
- Fishing, jerry fishing, fishing festival, spooky fishing trackers
- Expertise kills in fishing rod lore
- Catacombs trackers
-- Dungeons puzzle solver (Riddle, trivia, blaze, creeper, water, tic tac toe, boulder, silverfish)
+- Dungeons puzzle solver (Riddle, trivia, blaze, creeper, water, tic tac toe, boulder, silverfish, ice walk)
- Dungeons timer (watcher, boss, deaths, and puzzle fails)
- Watcher ready message
- Catacombs F7 Stage 3 solvers (Starts with letter, select all colour, ignore arrows on sea lanterns)
- Find correct Livid (with graphic display of HP)
+- Use custom music in dungeon boss room
- Experimentation solvers (Ultrasequencer, Chronomatron, Superpairs)
- Hide tooltips in experiment addons
- Hide tooltips in Melody's Harp
@@ -61,7 +62,7 @@ Discord Server: https://discord.gg/QsEkNQS
## Commands
- /dhelp - Returns this message in-game.
- /dsm - Opens the GUI for Danker's Skyblock Mod.
-- /toggle <gparty/coords/golden/slayercount/rngesusalerts/splitfishing/chatmaddox/spiritbearalerts/aotd/lividdagger/flowerweapons/sceptremessages/midasstaffmessages/implosionmessages/healmessages/cooldownmessages/manamessages/killcombomessages/petcolors/dungeontimer/golemalerts/expertiselore/skill50display/outlinetext/caketimer/lowhealthnotify/lividsolver/stopsalvagestarred/notifyslayerslain/autoskilltracker/necronnotifications/bonzotimer/threemanpuzzle/oruopuzzle/blazepuzzle/creeperpuzzle/waterpuzzle/tictactoepuzzle/boulderpuzzle/silverfishpuzzle/watchermessage/startswithterminal/selectallterminal/clickinorderterminal/blockwrongterminalclicks/itemframeonsealanterns/ultrasequencer/chronomatron/superpairs/hidetooltipsinaddons/pickblock/list> - Toggles features. /toggle list returns values of every toggle.
+- /toggle <gparty/coords/golden/slayercount/rngesusalerts/splitfishing/chatmaddox/spiritbearalerts/aotd/lividdagger/flowerweapons/sceptremessages/midasstaffmessages/implosionmessages/healmessages/cooldownmessages/manamessages/killcombomessages/petcolors/dungeontimer/golemalerts/expertiselore/skill50display/outlinetext/caketimer/lowhealthnotify/lividsolver/stopsalvagestarred/notifyslayerslain/autoskilltracker/necronnotifications/bonzotimer/threemanpuzzle/oruopuzzle/blazepuzzle/creeperpuzzle/waterpuzzle/tictactoepuzzle/boulderpuzzle/silverfishpuzzle/icewalkpuzzle/watchermessage/startswithterminal/selectallterminal/clickinorderterminal/blockwrongterminalclicks/itemframeonsealanterns/ultrasequencer/chronomatron/superpairs/hidetooltipsinaddons/pickblock/dungeonbossmusic/list> - Toggles features. /toggle list returns values of every toggle.
- /setkey <key> - Sets API key.
- /getkey - Returns key set with /setkey and copies it to your clipboard.
- /loot <zombie/spider/wolf/fishing/catacombs/mythological/> [winter/festival/spooky/f(1-7)/session] - Returns loot received from slayer quests or fishing stats. /loot fishing winter returns winter sea creatures instead.
@@ -79,15 +80,28 @@ Discord Server: https://discord.gg/QsEkNQS
- /dungeons [player] - Uses API to get dungeon levels of a person. If no name is provided, it checks yours.
- /importfishing - Imports your fishing stats from your latest profile to your fishing tracker using the API.
- /sbplayers - Uses API to find how many players are on each Skyblock island.
-- /onlyslayer <zombie/spider/wolf> <1/2/3/4> - Stops you from starting a slayer quest other than the one specified.
+- /onlyslayer <zombie/spider/wolf> <1/2/3/4/5> - Stops you from starting a slayer quest other than the one specified.
- /skilltracker <start/stop/reset> - Text display for skill xp/hour.
- /reparty - Disbands and reparties all members in the party
- /fairysouls - Check the fairysouls of a player
+- /lobbybank - Uses API to find the average bank total of the lobby, as well the three players with the highest total money in the bank (and purse).
+- /dsmmusic <stop/reload> - Stops or reloads the custom music.
## Keybinds
- Open Maddox menu - M by default.
+- Regular Ability - Numpad 4 by default.
- Start/Stop Skill Tracker - Numpad 5 by default.
+## Custom Music
+- Supported audio formats:
+ - .wav
+ - .mid
+ - .aiff
+ - .au
+ - .rmf
+- For the following custom music, place a supported music file with the given name in the `.minecraft/config/dsmmusic` folder.
+ - Dungeon boss music: `dungeonboss`
+
### Notes
- Slayer tracker for token drops and 20% chance drops uses a 12x12x12 bounding box centered on the player to detect the drops. If you are out of the range of the item drop, it will not count on the tracker.
- API commands may take a while depending on your internet connection. The API may also go down.
diff --git a/build.gradle b/build.gradle
index 82c4787..bc2b7b6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -20,7 +20,7 @@ plugins {
id "net.minecraftforge.gradle.forge" version "2.0.2"
}
*/
-version = "1.8.6-beta2"
+version = "1.8.6-beta3"
group= "me.Danker.DankersSkyblockMod" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "Danker's Skyblock Mod"
diff --git a/src/main/java/me/Danker/DankersSkyblockMod.java b/src/main/java/me/Danker/DankersSkyblockMod.java
index c8fa109..a7c440b 100644
--- a/src/main/java/me/Danker/DankersSkyblockMod.java
+++ b/src/main/java/me/Danker/DankersSkyblockMod.java
@@ -53,13 +53,16 @@ import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToSe
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.IOException;
import java.util.List;
import java.util.Map;
@Mod(modid = DankersSkyblockMod.MODID, version = DankersSkyblockMod.VERSION, clientSideOnly = true)
public class DankersSkyblockMod {
public static final String MODID = "Danker's Skyblock Mod";
- public static final String VERSION = "1.8.6-beta2";
+ public static final String VERSION = "1.8.6-beta3";
public static int titleTimer = -1;
public static boolean showTitle = false;
public static String titleText = "";
@@ -70,6 +73,7 @@ public class DankersSkyblockMod {
static boolean OAMWarning = false;
public static String guiToOpen = null;
public static boolean firstLaunch = false;
+ public static String configDirectory;
public static String MAIN_COLOUR;
public static String SECONDARY_COLOUR;
@@ -98,6 +102,7 @@ public class DankersSkyblockMod {
MinecraftForge.EVENT_BUS.register(new ChronomatronSolver());
MinecraftForge.EVENT_BUS.register(new ClickInOrderSolver());
MinecraftForge.EVENT_BUS.register(new CreeperSolver());
+ MinecraftForge.EVENT_BUS.register(new CustomMusic());
MinecraftForge.EVENT_BUS.register(new DungeonTimer());
MinecraftForge.EVENT_BUS.register(new ExpertiseLore());
MinecraftForge.EVENT_BUS.register(new FasterMaddoxCalling());
@@ -105,6 +110,7 @@ public class DankersSkyblockMod {
MinecraftForge.EVENT_BUS.register(new GolemSpawningAlert());
MinecraftForge.EVENT_BUS.register(new GpartyNotifications());
MinecraftForge.EVENT_BUS.register(new HideTooltipsInExperiments());
+ MinecraftForge.EVENT_BUS.register(new IceWalkSolver());
MinecraftForge.EVENT_BUS.register(new LividSolver());
MinecraftForge.EVENT_BUS.register(new LootDisplay());
MinecraftForge.EVENT_BUS.register(new LootTracker());
@@ -146,32 +152,36 @@ public class DankersSkyblockMod {
}
@EventHandler
- public void preInit(final FMLPreInitializationEvent event) {
- ClientCommandHandler.instance.registerCommand(new ToggleCommand());
- ClientCommandHandler.instance.registerCommand(new SetkeyCommand());
- ClientCommandHandler.instance.registerCommand(new GetkeyCommand());
- ClientCommandHandler.instance.registerCommand(new LootCommand());
- ClientCommandHandler.instance.registerCommand(new ReloadConfigCommand());
- ClientCommandHandler.instance.registerCommand(new DisplayCommand());
- ClientCommandHandler.instance.registerCommand(new MoveCommand());
- ClientCommandHandler.instance.registerCommand(new SlayerCommand());
- ClientCommandHandler.instance.registerCommand(new SkillsCommand());
- ClientCommandHandler.instance.registerCommand(new GuildOfCommand());
- ClientCommandHandler.instance.registerCommand(new DHelpCommand());
- ClientCommandHandler.instance.registerCommand(new PetsCommand());
- ClientCommandHandler.instance.registerCommand(new BankCommand());
- ClientCommandHandler.instance.registerCommand(new ArmourCommand());
- ClientCommandHandler.instance.registerCommand(new ImportFishingCommand());
- ClientCommandHandler.instance.registerCommand(new ResetLootCommand());
- ClientCommandHandler.instance.registerCommand(new ScaleCommand());
- ClientCommandHandler.instance.registerCommand(new SkyblockPlayersCommand());
- ClientCommandHandler.instance.registerCommand(new BlockSlayerCommand());
- ClientCommandHandler.instance.registerCommand(new DungeonsCommand());
- ClientCommandHandler.instance.registerCommand(new LobbySkillsCommand());
- ClientCommandHandler.instance.registerCommand(new DankerGuiCommand());
- ClientCommandHandler.instance.registerCommand(new SkillTrackerCommand());
- ClientCommandHandler.instance.registerCommand(new FairySoulsCommand());
- ClientCommandHandler.instance.registerCommand(new LobbyBankCommand());
+ public void preInit(final FMLPreInitializationEvent event) throws UnsupportedAudioFileException, IOException, LineUnavailableException {
+ ClientCommandHandler.instance.registerCommand(new ArmourCommand());
+ ClientCommandHandler.instance.registerCommand(new BankCommand());
+ ClientCommandHandler.instance.registerCommand(new BlockSlayerCommand());
+ ClientCommandHandler.instance.registerCommand(new CustomMusicCommand());
+ ClientCommandHandler.instance.registerCommand(new DHelpCommand());
+ ClientCommandHandler.instance.registerCommand(new DankerGuiCommand());
+ ClientCommandHandler.instance.registerCommand(new DisplayCommand());
+ ClientCommandHandler.instance.registerCommand(new DungeonsCommand());
+ ClientCommandHandler.instance.registerCommand(new FairySoulsCommand());
+ ClientCommandHandler.instance.registerCommand(new GetkeyCommand());
+ ClientCommandHandler.instance.registerCommand(new GuildOfCommand());
+ ClientCommandHandler.instance.registerCommand(new ImportFishingCommand());
+ ClientCommandHandler.instance.registerCommand(new LobbyBankCommand());
+ ClientCommandHandler.instance.registerCommand(new LobbySkillsCommand());
+ ClientCommandHandler.instance.registerCommand(new LootCommand());
+ ClientCommandHandler.instance.registerCommand(new MoveCommand());
+ ClientCommandHandler.instance.registerCommand(new PetsCommand());
+ ClientCommandHandler.instance.registerCommand(new ReloadConfigCommand());
+ ClientCommandHandler.instance.registerCommand(new ResetLootCommand());
+ ClientCommandHandler.instance.registerCommand(new ScaleCommand());
+ ClientCommandHandler.instance.registerCommand(new SetkeyCommand());
+ ClientCommandHandler.instance.registerCommand(new SkillTrackerCommand());
+ ClientCommandHandler.instance.registerCommand(new SkillsCommand());
+ ClientCommandHandler.instance.registerCommand(new SkyblockPlayersCommand());
+ ClientCommandHandler.instance.registerCommand(new SlayerCommand());
+ ClientCommandHandler.instance.registerCommand(new ToggleCommand());
+
+ configDirectory = event.getModConfigurationDirectory().toString();
+ CustomMusic.init(configDirectory);
}
@EventHandler
diff --git a/src/main/java/me/Danker/commands/BlockSlayerCommand.java b/src/main/java/me/Danker/commands/BlockSlayerCommand.java
index c0beb42..09da5d6 100644
--- a/src/main/java/me/Danker/commands/BlockSlayerCommand.java
+++ b/src/main/java/me/Danker/commands/BlockSlayerCommand.java
@@ -21,7 +21,7 @@ public class BlockSlayerCommand extends CommandBase {
@Override
public String getCommandUsage(ICommandSender arg0) {
- return "/" + getCommandName() + " <zombie/spider/wolf> <1/2/3/4>";
+ return "/" + getCommandName() + " <zombie/spider/wolf> <1/2/3/4/5>";
}
@Override
@@ -34,7 +34,7 @@ public class BlockSlayerCommand extends CommandBase {
if (args.length == 1) {
return getListOfStringsMatchingLastWord(args, "zombie", "spider", "wolf");
} else if (args.length == 2) {
- return getListOfStringsMatchingLastWord(args, "1", "2", "3", "4");
+ return getListOfStringsMatchingLastWord(args, "1", "2", "3", "4", "5");
}
return null;
}
@@ -84,6 +84,9 @@ public class BlockSlayerCommand extends CommandBase {
case 4:
BlockWrongSlayer.onlySlayerNumber = "IV";
break;
+ case 5:
+ BlockWrongSlayer.onlySlayerNumber = "V";
+ break;
default:
BlockWrongSlayer.onlySlayerName = "";
BlockWrongSlayer.onlySlayerNumber = "";
diff --git a/src/main/java/me/Danker/commands/CustomMusicCommand.java b/src/main/java/me/Danker/commands/CustomMusicCommand.java
new file mode 100644
index 0000000..5364930
--- /dev/null
+++ b/src/main/java/me/Danker/commands/CustomMusicCommand.java
@@ -0,0 +1,70 @@
+package me.Danker.commands;
+
+import me.Danker.DankersSkyblockMod;
+import me.Danker.features.CustomMusic;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.IOException;
+import java.util.List;
+
+public class CustomMusicCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "dsmmusic";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return "/" + getCommandName() + " <stop/reload>";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return getListOfStringsMatchingLastWord(args, "stop", "reload");
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer)arg0;
+
+ if (arg1.length == 0) {
+ player.addChatMessage(new ChatComponentText(DankersSkyblockMod.ERROR_COLOUR + "Usage: " + getCommandUsage(arg0)));
+ return;
+ }
+
+ switch (arg1[0].toLowerCase()) {
+ case "stop":
+ if (CustomMusic.dungeonboss != null) CustomMusic.dungeonboss.stop();
+ player.addChatMessage(new ChatComponentText(DankersSkyblockMod.MAIN_COLOUR + "Stopped custom music."));
+ break;
+ case "reload":
+ try {
+ CustomMusic.init(DankersSkyblockMod.configDirectory);
+ player.addChatMessage(new ChatComponentText(DankersSkyblockMod.MAIN_COLOUR + "Reloaded custom music."));
+ } catch (IOException | LineUnavailableException | UnsupportedAudioFileException e) {
+ player.addChatMessage(new ChatComponentText(DankersSkyblockMod.ERROR_COLOUR + "An error occurred while trying to reload music."));
+ e.printStackTrace();
+ }
+ break;
+ default:
+ player.addChatMessage(new ChatComponentText(DankersSkyblockMod.ERROR_COLOUR + "Usage: " + getCommandUsage(arg0)));
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/DHelpCommand.java b/src/main/java/me/Danker/commands/DHelpCommand.java
index 844bb91..34f85f3 100644
--- a/src/main/java/me/Danker/commands/DHelpCommand.java
+++ b/src/main/java/me/Danker/commands/DHelpCommand.java
@@ -34,7 +34,7 @@ public class DHelpCommand extends CommandBase {
EnumChatFormatting.GOLD + " Commands, " + EnumChatFormatting.GREEN + " Keybinds.\n" +
EnumChatFormatting.GOLD + " /dhelp" + EnumChatFormatting.AQUA + " - Returns this message.\n" +
EnumChatFormatting.GOLD + " /dsm" + EnumChatFormatting.AQUA + " - Opens the GUI for Danker's Skyblock Mod.\n" +
- EnumChatFormatting.GOLD + " /toggle <gparty/coords/golden/slayercount/rngesusalerts/splitfishing/chatmaddox/spiritbearalerts/aotd/lividdagger/flowerweapons/sceptremessages/midasstaffmessages/implosionmessages/healmessages/cooldownmessages/manamessages/killcombomessages/petcolors/dungeontimer/golemalerts/expertiselore/skill50display/outlinetext/caketimer/lowhealthnotify/lividsolver/stopsalvagestarred/notifyslayerslain/autoskilltracker/necronnotifications/bonzotimer/threemanpuzzle/oruopuzzle/blazepuzzle/creeperpuzzle/waterpuzzle/tictactoepuzzle/boulderpuzzle/silverfishpuzzle/watchermessage/startswithterminal/selectallterminal/clickinorderterminal/blockwrongterminalclicks/itemframeonsealanterns/ultrasequencer/chronomatron/superpairs/hidetooltipsinaddons/pickblock/list>" + EnumChatFormatting.AQUA + " - Toggles features. /toggle list returns values of every toggle.\n" +
+ EnumChatFormatting.GOLD + " /toggle <gparty/coords/golden/slayercount/rngesusalerts/splitfishing/chatmaddox/spiritbearalerts/aotd/lividdagger/flowerweapons/sceptremessages/midasstaffmessages/implosionmessages/healmessages/cooldownmessages/manamessages/killcombomessages/petcolors/dungeontimer/golemalerts/expertiselore/skill50display/outlinetext/caketimer/lowhealthnotify/lividsolver/stopsalvagestarred/notifyslayerslain/autoskilltracker/necronnotifications/bonzotimer/threemanpuzzle/oruopuzzle/blazepuzzle/creeperpuzzle/waterpuzzle/tictactoepuzzle/boulderpuzzle/silverfishpuzzle/icewalkpuzzle/watchermessage/startswithterminal/selectallterminal/clickinorderterminal/blockwrongterminalclicks/itemframeonsealanterns/ultrasequencer/chronomatron/superpairs/hidetooltipsinaddons/pickblock/dungeonbossmusic/list>" + EnumChatFormatting.AQUA + " - Toggles features. /toggle list returns values of every toggle.\n" +
EnumChatFormatting.GOLD + " /setkey <key>" + EnumChatFormatting.AQUA + " - Sets API key.\n" +
EnumChatFormatting.GOLD + " /getkey" + EnumChatFormatting.AQUA + " - Returns key set with /setkey and copies it to your clipboard.\n" +
EnumChatFormatting.GOLD + " /loot <zombie/spider/wolf/fishing/catacombs/mythological/> [winter/festival/spooky/f(1-7)/session]" + EnumChatFormatting.AQUA + " - Returns loot received from slayer quests or fishing stats. /loot fishing winter returns winter sea creatures instead.\n" +
@@ -52,10 +52,11 @@ public class DHelpCommand extends CommandBase {
EnumChatFormatting.GOLD + " /dungeons [player] " + EnumChatFormatting.AQUA + " - Uses API to get dungeon levels of a person. If no name is provided, it checks yours.\n" +
EnumChatFormatting.GOLD + " /importfishing" + EnumChatFormatting.AQUA + " - Imports your fishing stats from your latest profile to your fishing tracker using the API.\n" +
EnumChatFormatting.GOLD + " /sbplayers" + EnumChatFormatting.AQUA + " - Uses API to find how many players are on each Skyblock island.\n" +
- EnumChatFormatting.GOLD + " /onlyslayer <zombie/spider/wolf> <1/2/3/4>" + EnumChatFormatting.AQUA + " - Stops you from starting a slayer quest other than the one specified.\n" +
+ EnumChatFormatting.GOLD + " /onlyslayer <zombie/spider/wolf> <1/2/3/4/5>" + EnumChatFormatting.AQUA + " - Stops you from starting a slayer quest other than the one specified.\n" +
EnumChatFormatting.GOLD + " /skilltracker <start/stop/reset>" + EnumChatFormatting.AQUA + " - Text display for skill xp/hour.\n" +
- EnumChatFormatting.GOLD + " /reparty " + EnumChatFormatting.AQUA + " - Disbands and reparties all members in the party.\n" +
- EnumChatFormatting.GOLD + " /lobbybank " + EnumChatFormatting.AQUA + " - Uses API to find the average bank total of the lobby, as well the three players with the highest total money in the bank(and purse).\n" +
+ EnumChatFormatting.GOLD + " /lobbybank " + EnumChatFormatting.AQUA + " - Uses API to find the average bank total of the lobby, as well the three players with the highest total money in the bank(and purse).\n" +
+ EnumChatFormatting.GOLD + " /reparty" + EnumChatFormatting.AQUA + " - Disbands and reparties all members in the party.\n" +
+ EnumChatFormatting.GOLD + " /dsmmusic <stop/reload>" + EnumChatFormatting.AQUA + " - Stops or reloads the custom music.\n" +
EnumChatFormatting.GREEN + " Open Maddox Menu" + EnumChatFormatting.AQUA + " - M by default.\n" +
EnumChatFormatting.GREEN + " Start/Stop Skill Tracker" + EnumChatFormatting.AQUA + " - Numpad 5 by default.\n"));
}
diff --git a/src/main/java/me/Danker/commands/DankerGuiCommand.java b/src/main/java/me/Danker/commands/DankerGuiCommand.java
index fdd8196..79ab3e3 100644
--- a/src/main/java/me/Danker/commands/DankerGuiCommand.java
+++ b/src/main/java/me/Danker/commands/DankerGuiCommand.java
@@ -77,6 +77,7 @@ public class DankerGuiCommand extends CommandBase {
debug.append("[tictactoepuzzle][").append(ToggleCommand.ticTacToeToggled).append("]\n");
debug.append("[boulderpuzzle][").append(ToggleCommand.boulderToggled).append("]\n");
debug.append("[silverfishpuzzle][").append(ToggleCommand.silverfishToggled).append("]\n");
+ debug.append("[icewalkpuzzle][").append(ToggleCommand.iceWalkToggled).append("]\n");
debug.append("[watchermessage][").append(ToggleCommand.watcherReadyToggled).append("]\n");
debug.append("[startswithterminal][").append(ToggleCommand.startsWithToggled).append("]\n");
debug.append("[selectallterminal][").append(ToggleCommand.selectAllToggled).append("]\n");
@@ -91,6 +92,7 @@ public class DankerGuiCommand extends CommandBase {
debug.append("[shadowFuryAbility][").append(ToggleCommand.shadowFuryToggled).append("]\n");
debug.append("[specialhoe][").append(ToggleCommand.specialHoeRightClick).append("]\n");
debug.append("[melodyTooltips][").append(ToggleCommand.melodyTooltips).append("]\n");
+ debug.append("[dungeonbossmusic][").append(ToggleCommand.dungeonBossMusic).append("]\n");
debug.append("# Locations\n");
debug.append("[coords][").append(MoveCommand.coordsXY[0]).append(", ").append(MoveCommand.coordsXY[1]).append("]\n");
debug.append("[display][").append(MoveCommand.displayXY[0]).append(", ").append(MoveCommand.displayXY[1]).append("]\n");
@@ -112,7 +114,7 @@ public class DankerGuiCommand extends CommandBase {
debug.append("<None>\n");
} else {
for (ResourcePackRepository.Entry resource : Minecraft.getMinecraft().getResourcePackRepository().getRepositoryEntries()) {
- debug.append("< ").append(StringUtils.stripControlCodes(resource.getResourcePackName())).append(" >\n");
+ debug.append("<").append(StringUtils.stripControlCodes(resource.getResourcePackName())).append(">\n");
}
}
debug.append("```");
diff --git a/src/main/java/me/Danker/commands/LootCommand.java b/src/main/java/me/Danker/commands/LootCommand.java
index 3dba27d..5502068 100644
--- a/src/main/java/me/Danker/commands/LootCommand.java
+++ b/src/main/java/me/Danker/commands/LootCommand.java
@@ -227,6 +227,8 @@ public class LootCommand extends CommandBase {
EnumChatFormatting.RED + " Revenant Catalysts: " + LootTracker.zombieRevCatasSession + "\n" +
EnumChatFormatting.DARK_GREEN + " Snake Runes: " + LootTracker.zombieSnakesSession + "\n" +
EnumChatFormatting.GOLD + " Scythe Blades: " + LootTracker.zombieScythesSession + "\n" +
+ EnumChatFormatting.RED + " Shard of the Shreddeds: " + LootTracker.zombieShardsSession + "\n" +
+ EnumChatFormatting.RED + " Warden Hearts: " + LootTracker.zombieWardenHeartsSession + "\n" +
EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + " -------------------"));
@@ -261,6 +263,8 @@ public class LootCommand extends CommandBase {
EnumChatFormatting.RED + " Revenant Catalysts: " + LootTracker.zombieRevCatas + "\n" +
EnumChatFormatting.DARK_GREEN + " Snake Runes: " + LootTracker.zombieSnakes + "\n" +
EnumChatFormatting.GOLD + " Scythe Blades: " + LootTracker.zombieScythes + "\n" +
+ EnumChatFormatting.RED + " Shard of the Shreddeds: " + LootTracker.zombieShards + "\n" +
+ EnumChatFormatting.RED + " Warden Hearts: " + LootTracker.zombieWardenHearts + "\n" +
EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + " -------------------"));
diff --git a/src/main/java/me/Danker/commands/ToggleCommand.java b/src/main/java/me/Danker/commands/ToggleCommand.java
index c4f3ca4..fc6b4f3 100644
--- a/src/main/java/me/Danker/commands/ToggleCommand.java
+++ b/src/main/java/me/Danker/commands/ToggleCommand.java
@@ -1,6 +1,7 @@
package me.Danker.commands;
import me.Danker.DankersSkyblockMod;
+import me.Danker.features.CustomMusic;
import me.Danker.handlers.ConfigHandler;
import net.minecraft.command.CommandBase;
import net.minecraft.command.CommandException;
@@ -63,6 +64,7 @@ public class ToggleCommand extends CommandBase implements ICommand {
public static boolean ticTacToeToggled;
public static boolean boulderToggled;
public static boolean silverfishToggled;
+ public static boolean iceWalkToggled;
// Terminal Helpers
public static boolean startsWithToggled;
public static boolean selectAllToggled;
@@ -76,6 +78,8 @@ public class ToggleCommand extends CommandBase implements ICommand {
public static boolean hideTooltipsInExperimentAddonsToggled;
public static boolean specialHoeRightClick;
public static boolean melodyTooltips;
+ // Custom Music
+ public static boolean dungeonBossMusic;
@Override
public String getCommandName() {
@@ -90,10 +94,10 @@ public class ToggleCommand extends CommandBase implements ICommand {
"skill50display/outlinetext/midasstaffmessages/implosionmessages/healmessages/cooldownmessages/" +
"manamessages/killcombomessages/caketimer/lowhealthnotify/lividsolver/stopsalvagestarred/" +
"notifyslayerslain/necronnotifications/bonzotimer/threemanpuzzle/oruopuzzle/blazepuzzle/" +
- "creeperpuzzle/waterpuzzle/tictactoepuzzle/boulderpuzzle/silverfishpuzzle/watchermessage/" +
+ "creeperpuzzle/waterpuzzle/tictactoepuzzle/boulderpuzzle/silverfishpuzzle/icewalkpuzzle/watchermessage/" +
"startswithterminal/selectallterminal/clickinorderterminal/blockwrongterminalclicks/" +
"itemframeonsealanterns/ultrasequencer/chronomatron/superpairs/hidetooltipsinaddons/pickblock/ " +
- "/specialhoe/melodytooltips/highlightslayers/highlightArachne/,list>";
+ "/specialhoe/melodytooltips/highlightslayers/highlightArachne/dungeonbossmusic/list>";
}
@Override
@@ -113,10 +117,10 @@ public class ToggleCommand extends CommandBase implements ICommand {
"stopsalvagestarred", "notifyslayerslain", "necronnotifications",
"bonzotimer", "threemanpuzzle", "oruopuzzle", "blazepuzzle",
"creeperpuzzle", "waterpuzzle", "tictactoepuzzle", "boulderpuzzle",
- "silverfishpuzzle", "watchermessage", "startswithterminal",
+ "silverfishpuzzle", "icewalkpuzzle", "watchermessage", "startswithterminal",
"selectallterminal", "clickinorderterminal", "blockwrongterminalclicks",
"itemframeonsealanterns", "ultrasequencer", "chronomatron", "superpairs",
- "hidetooltipsinaddons", "pickblock", "specialhoe", "melodytooltips", "highlightslayers", "list");
+ "hidetooltipsinaddons", "pickblock", "specialhoe", "melodytooltips", "highlightslayers", "dungeonbossmusic", "list");
}
return null;
}
@@ -347,6 +351,11 @@ public class ToggleCommand extends CommandBase implements ICommand {
ConfigHandler.writeBooleanConfig("toggles", "SilverfishPuzzle", silverfishToggled);
player.addChatMessage(new ChatComponentText(DankersSkyblockMod.MAIN_COLOUR + "Silverfish puzzle solver has been set to " + DankersSkyblockMod.SECONDARY_COLOUR + silverfishToggled + DankersSkyblockMod.MAIN_COLOUR + "."));
break;
+ case "icewalkpuzzle":
+ iceWalkToggled = !iceWalkToggled;
+ ConfigHandler.writeBooleanConfig("toggles", "IceWalkPuzzle", iceWalkToggled);
+ player.addChatMessage(new ChatComponentText(DankersSkyblockMod.MAIN_COLOUR + "Ice walk puzzle solver has been set to " + DankersSkyblockMod.SECONDARY_COLOUR + iceWalkToggled + DankersSkyblockMod.MAIN_COLOUR + "."));
+ break;
case "watchermessage":
watcherReadyToggled = !watcherReadyToggled;
ConfigHandler.writeBooleanConfig("toggles", "WatcherReadyMessage", watcherReadyToggled);
@@ -421,6 +430,17 @@ public class ToggleCommand extends CommandBase implements ICommand {
highlightArachne = !highlightArachne;
ConfigHandler.writeBooleanConfig("toggles", "HighlightArachne", highlightArachne);
player.addChatMessage(new ChatComponentText(DankersSkyblockMod.MAIN_COLOUR + "Highlight Arachne " + DankersSkyblockMod.SECONDARY_COLOUR + highlightArachne + DankersSkyblockMod.MAIN_COLOUR + "."));
+ case "dungeonbossmusic":
+ dungeonBossMusic = !dungeonBossMusic;
+ if (CustomMusic.dungeonboss != null) {
+ if (dungeonBossMusic) {
+ CustomMusic.start();
+ } else {
+ CustomMusic.dungeonboss.stop();
+ }
+ }
+ ConfigHandler.writeBooleanConfig("toggles", "DungeonBossMusic", dungeonBossMusic);
+ player.addChatMessage(new ChatComponentText(DankersSkyblockMod.MAIN_COLOUR + "Custom dungeon boss music has been set to " + DankersSkyblockMod.SECONDARY_COLOUR + dungeonBossMusic + DankersSkyblockMod.MAIN_COLOUR + "."));
break;
case "list":
player.addChatMessage(new ChatComponentText(DankersSkyblockMod.TYPE_COLOUR + "Guild party notifications: " + DankersSkyblockMod.VALUE_COLOUR + gpartyToggled + "\n" +
@@ -458,6 +478,7 @@ public class ToggleCommand extends CommandBase implements ICommand {
DankersSkyblockMod.TYPE_COLOUR + " Tic tac toe puzzle solver: " + DankersSkyblockMod.VALUE_COLOUR + ticTacToeToggled + "\n" +
DankersSkyblockMod.TYPE_COLOUR + " Boulder puzzle solver: " + DankersSkyblockMod.VALUE_COLOUR + boulderToggled + "\n" +
DankersSkyblockMod.TYPE_COLOUR + " Silverfish puzzle solver: " + DankersSkyblockMod.VALUE_COLOUR + silverfishToggled + "\n" +
+ DankersSkyblockMod.TYPE_COLOUR + " Ice walk puzzle solver: " + DankersSkyblockMod.VALUE_COLOUR + iceWalkToggled + "\n" +
DankersSkyblockMod.TYPE_COLOUR + " Watcher ready message: " + DankersSkyblockMod.VALUE_COLOUR + watcherReadyToggled + "\n" +
DankersSkyblockMod.TYPE_COLOUR + " Starts with letter terminal solver: " + DankersSkyblockMod.VALUE_COLOUR + startsWithToggled + "\n" +
DankersSkyblockMod.TYPE_COLOUR + " Select all color items terminal solver: " + DankersSkyblockMod.VALUE_COLOUR + selectAllToggled + "\n" +
@@ -471,7 +492,7 @@ public class ToggleCommand extends CommandBase implements ICommand {
DankersSkyblockMod.TYPE_COLOUR + " Hide tooltips in Melody's Harp " + DankersSkyblockMod.VALUE_COLOUR + melodyTooltips + "\n" +
DankersSkyblockMod.TYPE_COLOUR + " Highlight Slayer Bosses " + DankersSkyblockMod.VALUE_COLOUR + highlightSlayers + "\n" +
DankersSkyblockMod.TYPE_COLOUR + " Highlight Arachne Boss " + DankersSkyblockMod.VALUE_COLOUR + highlightArachne
-
+ DankersSkyblockMod.TYPE_COLOUR + " Custom dungeon boss music: " + DankersSkyblockMod.VALUE_COLOUR + dungeonBossMusic
));
break;
default:
diff --git a/src/main/java/me/Danker/features/puzzlesolvers/BlockPlacingFlowers.java b/src/main/java/me/Danker/features/BlockPlacingFlowers.java
index fe89fef..9bfc986 100644
--- a/src/main/java/me/Danker/features/puzzlesolvers/BlockPlacingFlowers.java
+++ b/src/main/java/me/Danker/features/BlockPlacingFlowers.java
@@ -1,4 +1,4 @@
-package me.Danker.features.puzzlesolvers;
+package me.Danker.features;
import me.Danker.commands.ToggleCommand;
import me.Danker.utils.Utils;
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..8617e7b
--- /dev/null
+++ b/src/main/java/me/Danker/features/CustomMusic.java
@@ -0,0 +1,117 @@
+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.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 prevInDungeonBossRoom = false;
+ static boolean inDungeonBossRoom = false;
+ public static Clip dungeonboss;
+
+ @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 != null) {
+ start();
+ }
+ } else {
+ reset();
+ }
+ }
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onChat(ClientChatReceivedEvent event) {
+ if (!Utils.inDungeons) return;
+ String message = StringUtils.stripControlCodes(event.message.getUnformattedText());
+
+ if (message.contains("EXTRA STATS ")) {
+ if (dungeonboss != null) dungeonboss.stop();
+ }
+ }
+
+ @SubscribeEvent
+ public void onSound(PlaySoundEvent event) {
+ if (ToggleCommand.dungeonBossMusic && Utils.inDungeons && inDungeonBossRoom) {
+ if (event.name.startsWith("note.")) event.setCanceled(true);
+ }
+ }
+
+ 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();
+
+ dungeonboss = AudioSystem.getClip();
+ File dungeonBossFile = new File(configDirectory + "\\dsmmusic\\dungeonboss.wav");
+ if (dungeonBossFile.exists()) {
+ AudioInputStream ais = AudioSystem.getAudioInputStream(dungeonBossFile);
+ dungeonboss.open(ais);
+
+ FloatControl volume = (FloatControl) dungeonboss.getControl(FloatControl.Type.MASTER_GAIN);
+ volume.setValue(-20F);
+ }
+ }
+
+ static void reset() {
+ inDungeonBossRoom = false;
+ if (dungeonboss != null) dungeonboss.stop();
+ }
+
+ public static void start() {
+ if (dungeonboss != null && inDungeonBossRoom) {
+ dungeonboss.setMicrosecondPosition(0);
+ dungeonboss.start();
+ dungeonboss.loop(Clip.LOOP_CONTINUOUSLY);
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/features/loot/LootDisplay.java b/src/main/java/me/Danker/features/loot/LootDisplay.java
index e3f43e8..cd34da7 100644
--- a/src/main/java/me/Danker/features/loot/LootDisplay.java
+++ b/src/main/java/me/Danker/features/loot/LootDisplay.java
@@ -221,6 +221,8 @@ public class LootDisplay {
EnumChatFormatting.RED + "Revenant Catalysts:\n" +
EnumChatFormatting.DARK_GREEN + "Snake Runes:\n" +
EnumChatFormatting.GOLD + "Scythe Blades:\n" +
+ EnumChatFormatting.RED + "Shard of Shreddeds:\n" +
+ EnumChatFormatting.RED + "Warden Hearts:\n" +
EnumChatFormatting.AQUA + "Time Since RNG:\n" +
EnumChatFormatting.AQUA + "Bosses Since RNG:";
countText = EnumChatFormatting.GOLD + nf.format(LootTracker.zombieRevs) + "\n" +
@@ -233,6 +235,8 @@ public class LootDisplay {
EnumChatFormatting.RED + LootTracker.zombieRevCatas + "\n" +
EnumChatFormatting.DARK_GREEN + LootTracker.zombieSnakes + "\n" +
EnumChatFormatting.GOLD + LootTracker.zombieScythes + "\n" +
+ EnumChatFormatting.RED + LootTracker.zombieShards + "\n" +
+ EnumChatFormatting.RED + LootTracker.zombieWardenHearts + "\n" +
EnumChatFormatting.AQUA + timeBetween + "\n" +
EnumChatFormatting.AQUA + bossesBetween;
break;
@@ -263,6 +267,8 @@ public class LootDisplay {
EnumChatFormatting.RED + "Revenant Catalysts:\n" +
EnumChatFormatting.DARK_GREEN + "Snake Runes:\n" +
EnumChatFormatting.GOLD + "Scythe Blades:\n" +
+ EnumChatFormatting.RED + "Shard of Shreddeds:\n" +
+ EnumChatFormatting.RED + "Warden Hearts:\n" +
EnumChatFormatting.AQUA + "Time Since RNG:\n" +
EnumChatFormatting.AQUA + "Bosses Since RNG:";
countText = EnumChatFormatting.GOLD + nf.format(LootTracker.zombieRevsSession) + "\n" +
@@ -275,6 +281,8 @@ public class LootDisplay {
EnumChatFormatting.RED + LootTracker.zombieRevCatasSession + "\n" +
EnumChatFormatting.DARK_GREEN + LootTracker.zombieSnakesSession + "\n" +
EnumChatFormatting.GOLD + LootTracker.zombieScythes + "\n" +
+ EnumChatFormatting.RED + LootTracker.zombieShardsSession + "\n" +
+ EnumChatFormatting.RED + LootTracker.zombieWardenHeartsSession + "\n" +
EnumChatFormatting.AQUA + timeBetween + "\n" +
EnumChatFormatting.AQUA + bossesBetween;
break;
diff --git a/src/main/java/me/Danker/features/loot/LootTracker.java b/src/main/java/me/Danker/features/loot/LootTracker.java
index f76725e..4858569 100644
--- a/src/main/java/me/Danker/features/loot/LootTracker.java
+++ b/src/main/java/me/Danker/features/loot/LootTracker.java
@@ -56,6 +56,8 @@ public class LootTracker {
public static int zombieRevCatas;
public static int zombieSnakes;
public static int zombieScythes;
+ public static int zombieShards;
+ public static int zombieWardenHearts;
public static double zombieTime;
public static int zombieBosses;
@@ -225,6 +227,8 @@ public class LootTracker {
public static int zombieRevCatasSession = 0;
public static int zombieSnakesSession = 0;
public static int zombieScythesSession = 0;
+ public static int zombieShardsSession = 0;
+ public static int zombieWardenHeartsSession = 0;
public static double zombieTimeSession = -1;
public static int zombieBossesSession = -1;
@@ -394,7 +398,7 @@ public class LootTracker {
}
// Wolf
- if (message.contains("Talk to Maddox to claim your Wolf Slayer XP!")) {
+ if (message.contains(" Wolf Slayer LVL ")) {
wolfSvens++;
wolfSvensSession++;
if (wolfBosses != -1) {
@@ -437,7 +441,7 @@ public class LootTracker {
wolfFluxesSession++;
ConfigHandler.writeIntConfig("wolf", "flux", wolfFluxes);
if (ToggleCommand.rngesusAlerts) Utils.createTitle(EnumChatFormatting.DARK_PURPLE + "OVERFLUX CAPACITOR!", 5);
- } else if (message.contains("Talk to Maddox to claim your Spider Slayer XP!")) { // Spider
+ } else if (message.contains(" Spider Slayer LVL ")) { // Spider
spiderTarantulas++;
spiderTarantulasSession++;
if (spiderBosses != -1) {
@@ -478,7 +482,7 @@ public class LootTracker {
spiderMosquitosSession++;
ConfigHandler.writeIntConfig("spider", "mosquito", spiderMosquitos);
if (ToggleCommand.rngesusAlerts) Utils.createTitle(EnumChatFormatting.GOLD + "DIGESTED MOSQUITO!", 5);
- } else if (message.contains("Talk to Maddox to claim your Zombie Slayer XP!")) { // Zombie
+ } else if (message.contains(" Zombie Slayer LVL ")) { // Zombie
zombieRevs++;
zombieRevsSession++;
if (zombieBosses != -1) {
@@ -523,6 +527,18 @@ public class LootTracker {
zombieScythesSession++;
ConfigHandler.writeIntConfig("zombie", "scythe", zombieScythes);
if (ToggleCommand.rngesusAlerts) Utils.createTitle(EnumChatFormatting.GOLD + "SCYTHE BLADE!", 5);
+ } else if (message.contains("INSANE DROP! (Shard of the Shredded)")) {
+ zombieRNG = true;
+ zombieShards++;
+ zombieShardsSession++;
+ ConfigHandler.writeIntConfig("zombie", "shard", zombieShards);
+ if (ToggleCommand.rngesusAlerts) Utils.createTitle(EnumChatFormatting.RED + "SHARD OF THE SHREDDED!", 5);
+ } else if (message.contains("INSANE DROP! (Warden Heart)")) {
+ zombieRNG = true;
+ zombieWardenHearts++;
+ zombieWardenHeartsSession++;
+ ConfigHandler.writeIntConfig("zombie", "heart", zombieWardenHearts);
+ if (ToggleCommand.rngesusAlerts) Utils.createTitle(EnumChatFormatting.RED + "WARDEN HEART!", 5);
}
if (wolfRNG) {
diff --git a/src/main/java/me/Danker/features/puzzlesolvers/IceWalkSolver.java b/src/main/java/me/Danker/features/puzzlesolvers/IceWalkSolver.java
new file mode 100644
index 0000000..eaabf6e
--- /dev/null
+++ b/src/main/java/me/Danker/features/puzzlesolvers/IceWalkSolver.java
@@ -0,0 +1,287 @@
+package me.Danker.features.puzzlesolvers;
+
+import me.Danker.DankersSkyblockMod;
+import me.Danker.commands.ToggleCommand;
+import me.Danker.utils.IceWalkUtils;
+import me.Danker.utils.Utils;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+import net.minecraftforge.client.event.RenderWorldLastEvent;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class IceWalkSolver {
+
+ static boolean prevInIceWalkRoom = false;
+ static boolean inIceWalkRoom = false;
+ static BlockPos chest = null;
+ static EnumFacing silverfishRoomDirection = null;
+ static List<IceWalkUtils.Point> threeByThreeRoute = new ArrayList<>();
+ static List<IceWalkUtils.Point> fiveByFiveRoute = new ArrayList<>();
+ static List<IceWalkUtils.Point> sevenBySevenRoute = new ArrayList<>();
+ public static int ICE_WALK_LINE_COLOUR;
+
+ @SubscribeEvent
+ public void onWorldChange(WorldEvent.Load event) {
+ reset();
+ }
+
+ @SubscribeEvent
+ 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 % 20 == 0) {
+ if (ToggleCommand.iceWalkToggled && Utils.inDungeons && world != null && player != null) {
+ // multi thread block checking
+ new Thread(() -> {
+ boolean foundRoom = false;
+ prevInIceWalkRoom = inIceWalkRoom;
+ Iterable<BlockPos> blocks = BlockPos.getAllInBox(new BlockPos(player.posX - 27, 75, player.posZ - 27), new BlockPos(player.posX + 27, 75, player.posZ + 27));
+ for (BlockPos blockPos : blocks) {
+ Block block = world.getBlockState(blockPos).getBlock();
+ if (block == Blocks.chest) {
+ char[][] threeByThreeBoard = new char[4][3];
+ char[][] fiveByFiveBoard = new char[6][5];
+ char[][] sevenBySevenBoard = new char[8][7];
+
+ if (world.getBlockState(blockPos.add(0, 7, 2)).getBlock() == Blocks.iron_bars && world.getBlockState(blockPos.add(0, -3, 2)).getBlock() == Blocks.stone_brick_stairs) {
+ silverfishRoomDirection = EnumFacing.NORTH;
+ } else if (world.getBlockState(blockPos.add(-2, 7, 0)).getBlock() == Blocks.iron_bars && world.getBlockState(blockPos.add(-2, -3, 0)).getBlock() == Blocks.stone_brick_stairs) {
+ silverfishRoomDirection = EnumFacing.EAST;
+ } else if (world.getBlockState(blockPos.add(0, 7, -2)).getBlock() == Blocks.iron_bars && world.getBlockState(blockPos.add(0, -3, -2)).getBlock() == Blocks.stone_brick_stairs) {
+ silverfishRoomDirection = EnumFacing.SOUTH;
+ } else if (world.getBlockState(blockPos.add(2, 7, 0)).getBlock() == Blocks.iron_bars && world.getBlockState(blockPos.add(2, -3, 0)).getBlock() == Blocks.stone_brick_stairs) {
+ silverfishRoomDirection = EnumFacing.WEST;
+ } else {
+ return;
+ }
+
+ foundRoom = true;
+ inIceWalkRoom = true;
+ if (!prevInIceWalkRoom) {
+ chest = blockPos;
+ switch (silverfishRoomDirection) {
+ case NORTH:
+ for (int row = chest.getZ() + 3, xIteration = 0; xIteration < 8; row++, xIteration++) {
+ for (int column = chest.getX() - 3, yIteration = 0; yIteration < 7; column++, yIteration++) {
+ if (world.getBlockState(new BlockPos(column, 72, row)).getBlock() != Blocks.air) {
+ sevenBySevenBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getZ() + 12, xIteration = 0; xIteration < 6; row++, xIteration++) {
+ for (int column = chest.getX() - 2, yIteration = 0; yIteration < 5; column++, yIteration++) {
+ if (world.getBlockState(new BlockPos(column, 71, row)).getBlock() != Blocks.air) {
+ fiveByFiveBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getZ() + 19, xIteration = 0; xIteration < 4; row++, xIteration++) {
+ for (int column = chest.getX() - 1, yIteration = 0; yIteration < 3; column++, yIteration++) {
+ if (world.getBlockState(new BlockPos(column, 70, row)).getBlock() != Blocks.air) {
+ threeByThreeBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ break;
+ case EAST:
+ for (int row = chest.getX() - 3, xIteration = 0; xIteration < 8; row--, xIteration++) {
+ for (int column = chest.getZ() - 3, yIteration = 0; yIteration < 7; column++, yIteration++) {
+ if (world.getBlockState(new BlockPos(row, 72, column)).getBlock() != Blocks.air) {
+ sevenBySevenBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getX() - 12, xIteration = 0; xIteration < 6; row--, xIteration++) {
+ for (int column = chest.getZ() - 2, yIteration = 0; yIteration < 5; column++, yIteration++) {
+ if (world.getBlockState(new BlockPos(row, 71, column)).getBlock() != Blocks.air) {
+ fiveByFiveBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getX() - 19, xIteration = 0; xIteration < 4; row--, xIteration++) {
+ for (int column = chest.getZ() - 1, yIteration = 0; yIteration < 3; column++, yIteration++) {
+ if (world.getBlockState(new BlockPos(row, 70, column)).getBlock() != Blocks.air) {
+ threeByThreeBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ break;
+ case SOUTH:
+ for (int row = chest.getZ() - 3, xIteration = 0; xIteration < 8; row--, xIteration++) {
+ for (int column = chest.getX() + 3, yIteration = 0; yIteration < 7; column--, yIteration++) {
+ if (world.getBlockState(new BlockPos(column, 72, row)).getBlock() != Blocks.air) {
+ sevenBySevenBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getZ() - 12, xIteration = 0; xIteration < 6; row--, xIteration++) {
+ for (int column = chest.getX() + 2, yIteration = 0; yIteration < 5; column--, yIteration++) {
+ if (world.getBlockState(new BlockPos(column, 71, row)).getBlock() != Blocks.air) {
+ fiveByFiveBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getZ() - 19, xIteration = 0; xIteration < 4; row--, xIteration++) {
+ for (int column = chest.getX() + 1, yIteration = 0; yIteration < 3; column--, yIteration++) {
+ if (world.getBlockState(new BlockPos(column, 70, row)).getBlock() != Blocks.air) {
+ threeByThreeBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ break;
+ case WEST:
+ for (int row = chest.getX() + 3, xIteration = 0; xIteration < 8; row++, xIteration++) {
+ for (int column = chest.getZ() + 3, yIteration = 0; yIteration < 7; column--, yIteration++) {
+ if (world.getBlockState(new BlockPos(row, 72, column)).getBlock() != Blocks.air) {
+ sevenBySevenBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getX() + 12, xIteration = 0; xIteration < 6; row++, xIteration++) {
+ for (int column = chest.getZ() + 2, yIteration = 0; yIteration < 5; column--, yIteration++) {
+ if (world.getBlockState(new BlockPos(row, 71, column)).getBlock() != Blocks.air) {
+ fiveByFiveBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ for (int row = chest.getX() + 19, xIteration = 0; xIteration < 4; row++, xIteration++) {
+ for (int column = chest.getZ() + 1, yIteration = 0; yIteration < 3; column--, yIteration++) {
+ if (world.getBlockState(new BlockPos(row, 70, column)).getBlock() != Blocks.air) {
+ threeByThreeBoard[xIteration][yIteration] = 'X';
+ }
+ }
+ }
+ break;
+ }
+ System.out.println(Arrays.deepToString(threeByThreeBoard));
+ System.out.println(Arrays.deepToString(fiveByFiveBoard));
+ System.out.println(Arrays.deepToString(sevenBySevenBoard));
+
+ threeByThreeRoute = IceWalkUtils.solve(threeByThreeBoard);
+ fiveByFiveRoute = IceWalkUtils.solve(fiveByFiveBoard);
+ sevenBySevenRoute = IceWalkUtils.solve(sevenBySevenBoard);
+ }
+ }
+ }
+ if (!foundRoom) {
+ inIceWalkRoom = false;
+ reset();
+ }
+ }).start();
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onWorldRender(RenderWorldLastEvent event) {
+ if (ToggleCommand.iceWalkToggled && Utils.inDungeons && chest != null) {
+ if (threeByThreeRoute != null && threeByThreeRoute.size() > 1) {
+ for (int i = 0; i < threeByThreeRoute.size() - 1; i++) {
+ Vec3 pos1;
+ Vec3 pos2;
+ switch (silverfishRoomDirection) {
+ case NORTH:
+ pos1 = new Vec3(chest.getX() - 0.5 + threeByThreeRoute.get(i).column, 70.5, chest.getZ() + 19.5 + threeByThreeRoute.get(i).row);
+ pos2 = new Vec3(chest.getX() - 0.5 + threeByThreeRoute.get(i + 1).column, 70.5, chest.getZ() + 19.5 + threeByThreeRoute.get(i + 1).row);
+ break;
+ case EAST:
+ pos1 = new Vec3(chest.getX() - 18.5 - threeByThreeRoute.get(i).row, 70.5, chest.getZ() - 0.5 + threeByThreeRoute.get(i).column);
+ pos2 = new Vec3(chest.getX() - 18.5 - threeByThreeRoute.get(i + 1).row, 70.5, chest.getZ() - 0.5 + threeByThreeRoute.get(i + 1).column);
+ break;
+ case SOUTH:
+ pos1 = new Vec3(chest.getX() + 1.5 - threeByThreeRoute.get(i).column, 70.5, chest.getZ() - 18.5 - threeByThreeRoute.get(i).row);
+ pos2 = new Vec3(chest.getX() + 1.5 - threeByThreeRoute.get(i + 1).column, 70.5, chest.getZ() - 18.5 - threeByThreeRoute.get(i + 1).row);
+ break;
+ case WEST:
+ pos1 = new Vec3(chest.getX() + 19.5 + threeByThreeRoute.get(i).row, 70.5, chest.getZ() + 1.5 - threeByThreeRoute.get(i).column);
+ pos2 = new Vec3(chest.getX() + 19.5 + threeByThreeRoute.get(i + 1).row, 70.5, chest.getZ() + 1.5 - threeByThreeRoute.get(i + 1).column);
+ break;
+ default:
+ return;
+ }
+ Utils.draw3DLine(pos1, pos2, ICE_WALK_LINE_COLOUR, 5, true, event.partialTicks);
+ }
+ }
+
+ if (fiveByFiveRoute != null && fiveByFiveRoute.size() > 1) {
+ for (int i = 0; i < fiveByFiveRoute.size() - 1; i++) {
+ Vec3 pos1;
+ Vec3 pos2;
+ switch (silverfishRoomDirection) {
+ case NORTH:
+ pos1 = new Vec3(chest.getX() - 1.5 + fiveByFiveRoute.get(i).column, 71.5, chest.getZ() + 12.5 + fiveByFiveRoute.get(i).row);
+ pos2 = new Vec3(chest.getX() - 1.5 + fiveByFiveRoute.get(i + 1).column, 71.5, chest.getZ() + 12.5 + fiveByFiveRoute.get(i + 1).row);
+ break;
+ case EAST:
+ pos1 = new Vec3(chest.getX() - 11.5 - fiveByFiveRoute.get(i).row, 71.5, chest.getZ() - 1.5 + fiveByFiveRoute.get(i).column);
+ pos2 = new Vec3(chest.getX() - 11.5 - fiveByFiveRoute.get(i + 1).row, 71.5, chest.getZ() - 1.5 + fiveByFiveRoute.get(i + 1).column);
+ break;
+ case SOUTH:
+ pos1 = new Vec3(chest.getX() + 2.5 - fiveByFiveRoute.get(i).column, 71.5, chest.getZ() - 11.5 - fiveByFiveRoute.get(i).row);
+ pos2 = new Vec3(chest.getX() + 2.5 - fiveByFiveRoute.get(i + 1).column, 71.5, chest.getZ() - 11.5 - fiveByFiveRoute.get(i + 1).row);
+ break;
+ case WEST:
+ pos1 = new Vec3(chest.getX() + 12.5 + fiveByFiveRoute.get(i).row, 71.5, chest.getZ() + 2.5 - fiveByFiveRoute.get(i).column);
+ pos2 = new Vec3(chest.getX() + 12.5 + fiveByFiveRoute.get(i + 1).row, 71.5, chest.getZ() + 2.5 - fiveByFiveRoute.get(i + 1).column);
+ break;
+ default:
+ return;
+ }
+ Utils.draw3DLine(pos1, pos2, ICE_WALK_LINE_COLOUR, 5, true, event.partialTicks);
+ }
+ }
+
+ if (sevenBySevenRoute != null && sevenBySevenRoute.size() > 1) {
+ for (int i = 0; i < sevenBySevenRoute.size() - 1; i++) {
+ Vec3 pos1;
+ Vec3 pos2;
+ switch (silverfishRoomDirection) {
+ case NORTH:
+ pos1 = new Vec3(chest.getX() - 2.5 + sevenBySevenRoute.get(i).column, 72.5, chest.getZ() + 3.5 + sevenBySevenRoute.get(i).row);
+ pos2 = new Vec3(chest.getX() - 2.5 + sevenBySevenRoute.get(i + 1).column, 72.5, chest.getZ() + 3.5 + sevenBySevenRoute.get(i + 1).row);
+ break;
+ case EAST:
+ pos1 = new Vec3(chest.getX() - 2.5 - sevenBySevenRoute.get(i).row, 72.5, chest.getZ() - 2.5 + sevenBySevenRoute.get(i).column);
+ pos2 = new Vec3(chest.getX() - 2.5 - sevenBySevenRoute.get(i + 1).row, 72.5, chest.getZ() - 2.5 + sevenBySevenRoute.get(i + 1).column);
+ break;
+ case SOUTH:
+ pos1 = new Vec3(chest.getX() + 3.5 - sevenBySevenRoute.get(i).column, 72.5, chest.getZ() - 2.5 - sevenBySevenRoute.get(i).row);
+ pos2 = new Vec3(chest.getX() + 3.5 - sevenBySevenRoute.get(i + 1).column, 72.5, chest.getZ() - 2.5 - sevenBySevenRoute.get(i + 1).row);
+ break;
+ case WEST:
+ pos1 = new Vec3(chest.getX() + 3.5 + sevenBySevenRoute.get(i).row, 72.5, chest.getZ() + 3.5 - sevenBySevenRoute.get(i).column);
+ pos2 = new Vec3(chest.getX() + 3.5 + sevenBySevenRoute.get(i + 1).row, 72.5, chest.getZ() + 3.5 - sevenBySevenRoute.get(i + 1).column);
+ break;
+ default:
+ return;
+ }
+ Utils.draw3DLine(pos1, pos2, ICE_WALK_LINE_COLOUR, 5, true, event.partialTicks);
+ }
+ }
+ }
+ }
+
+ static void reset() {
+ silverfishRoomDirection = null;
+ chest = null;
+ threeByThreeRoute.clear();
+ fiveByFiveRoute.clear();
+ sevenBySevenRoute.clear();
+ }
+
+}
diff --git a/src/main/java/me/Danker/features/puzzlesolvers/SilverfishSolver.java b/src/main/java/me/Danker/features/puzzlesolvers/SilverfishSolver.java
index c07524d..575dcd3 100644
--- a/src/main/java/me/Danker/features/puzzlesolvers/SilverfishSolver.java
+++ b/src/main/java/me/Danker/features/puzzlesolvers/SilverfishSolver.java
@@ -12,7 +12,10 @@ import net.minecraft.entity.monster.EntitySilverfish;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.*;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.event.world.WorldEvent;
diff --git a/src/main/java/me/Danker/gui/DankerGui.java b/src/main/java/me/Danker/gui/DankerGui.java
index c49f498..ecca047 100644
--- a/src/main/java/me/Danker/gui/DankerGui.java
+++ b/src/main/java/me/Danker/gui/DankerGui.java
@@ -2,6 +2,7 @@ package me.Danker.gui;
import me.Danker.DankersSkyblockMod;
import me.Danker.commands.ToggleCommand;
+import me.Danker.features.CustomMusic;
import me.Danker.handlers.ConfigHandler;
import me.Danker.handlers.TextRenderer;
import me.Danker.utils.Utils;
@@ -50,6 +51,7 @@ public class DankerGui extends GuiScreen {
private GuiButton shadowFury;
private GuiButton specialHoe;
private GuiButton melodyTooltips;
+ private GuiButton dungeonBossMusic;
// Chat Messages
private GuiButton lividDagger;
private GuiButton sceptreMessages;
@@ -59,7 +61,7 @@ public class DankerGui extends GuiScreen {
private GuiButton cooldownMessages;
private GuiButton manaMessages;
private GuiButton killComboMessages;
- //Dungeons
+ // Dungeons
private GuiButton dungeonTimer;
private GuiButton lowHealthNotify;
private GuiButton lividSolver;
@@ -137,18 +139,18 @@ public class DankerGui extends GuiScreen {
stopSalvageStarred = new GuiButton(0, width / 2 - 100, (int) (height * 0.5), "Stop Salvaging Starred Items: " + Utils.getColouredBoolean(ToggleCommand.stopSalvageStarredToggled));
watcherReadyMessage = new GuiButton(0, width / 2 - 100, (int) (height * 0.6), "Display Watcher Ready Message: " + Utils.getColouredBoolean(ToggleCommand.watcherReadyToggled));
flowerWeapons = new GuiButton(0, width / 2 - 100, (int) (height * 0.7), "Prevent Placing FoT/Spirit Sceptre: " + Utils.getColouredBoolean(ToggleCommand.flowerWeaponsToggled));
- //Page 6
+ // Page 6
notifySlayerSlain = new GuiButton(0, width / 2 - 100, (int) (height * 0.1), "Notify when Slayer Slain: " + Utils.getColouredBoolean(ToggleCommand.notifySlayerSlainToggled));
necronNotifications = new GuiButton(0, width / 2 - 100, (int) (height * 0.2), "Necron Phase Notifications: " + Utils.getColouredBoolean(ToggleCommand.necronNotificationsToggled));
bonzoTimer = new GuiButton(0, width / 2 - 100, (int) (height * 0.3), "Bonzo's Mask Timer: " + Utils.getColouredBoolean(ToggleCommand.bonzoTimerToggled));
autoSkillTracker = new GuiButton(0, width / 2 - 100, (int) (height * 0.4), "Auto Start/Stop Skill Tracker: " + Utils.getColouredBoolean(ToggleCommand.autoSkillTrackerToggled));
- shadowFury = new GuiButton(0, width / 2 - 100, (int) (height * 0.5), "Block Shadow Fury ability: " + Utils.getColouredBoolean(ToggleCommand.shadowFuryToggled));
- specialHoe = new GuiButton(0, width / 2 - 100, (int) (height * 0.6), "Block Special Hoe right click: " + Utils.getColouredBoolean(ToggleCommand.specialHoeRightClick));
- melodyTooltips = new GuiButton(0, width / 2 - 100, (int) (height * 0.7), "Hide tooltips in Melody's Harp: " + Utils.getColouredBoolean(ToggleCommand.melodyTooltips));
- //Page 7
- highlightArachne =new GuiButton(0, width / 2 - 100, (int) (height * 0.1), "Highlight Arachne: " + Utils.getColouredBoolean(ToggleCommand.highlightArachne));
-
-
+ dungeonBossMusic = new GuiButton(0, width / 2 - 100, (int) (height * 0.5), "Custom Dungeon Boss Music: " + Utils.getColouredBoolean(ToggleCommand.dungeonBossMusic));
+ shadowFury = new GuiButton(0, width / 2 - 100, (int) (height * 0.6), "Block Shadow Fury ability: " + Utils.getColouredBoolean(ToggleCommand.shadowFuryToggled));
+ specialHoe = new GuiButton(0, width / 2 - 100, (int) (height * 0.7), "Block Special Hoe right click: " + Utils.getColouredBoolean(ToggleCommand.specialHoeRightClick));
+ // Page 7
+ melodyTooltips = new GuiButton(0, width / 2 - 100, (int) (height * 0.1), "Hide tooltips in Melody's Harp: " + Utils.getColouredBoolean(ToggleCommand.melodyTooltips));
+ highlightArachne =new GuiButton(0, width / 2 - 100, (int) (height * 0.2), "Highlight Arachne: " + Utils.getColouredBoolean(ToggleCommand.highlightArachne));
+
switch (page) {
case 1:
this.buttonList.add(changeDisplay);
@@ -207,16 +209,17 @@ public class DankerGui extends GuiScreen {
break;
case 6:
this.buttonList.add(notifySlayerSlain);
- this.buttonList.add(necronNotifications);
+ this.buttonList.add(necronNotifications);
this.buttonList.add(bonzoTimer);
this.buttonList.add(autoSkillTracker);
+ this.buttonList.add(dungeonBossMusic);
this.buttonList.add(shadowFury);
this.buttonList.add(specialHoe);
- this.buttonList.add(melodyTooltips);
- this.buttonList.add(backPage);
this.buttonList.add(nextPage);
+ this.buttonList.add(backPage);
break;
case 7:
+ this.buttonList.add(melodyTooltips);
this.buttonList.add(highlightArachne);
this.buttonList.add(backPage);
break;
@@ -421,6 +424,17 @@ public class DankerGui extends GuiScreen {
ToggleCommand.highlightArachne = !ToggleCommand.highlightArachne;
ConfigHandler.writeBooleanConfig("toggles", "HighlightArachne", ToggleCommand.highlightArachne);
highlightArachne.displayString = "Highlight Arachne: " + Utils.getColouredBoolean(ToggleCommand.highlightArachne);
+ } else if (button == dungeonBossMusic) {
+ ToggleCommand.dungeonBossMusic = !ToggleCommand.dungeonBossMusic;
+ if (CustomMusic.dungeonboss != null) {
+ if (ToggleCommand.dungeonBossMusic) {
+ CustomMusic.start();
+ } else {
+ CustomMusic.dungeonboss.stop();
+ }
+ }
+ ConfigHandler.writeBooleanConfig("toggles", "DungeonBossMusic", ToggleCommand.dungeonBossMusic);
+ dungeonBossMusic.displayString = "Custom Dungeon Boss Music: " + Utils.getColouredBoolean(ToggleCommand.dungeonBossMusic);
}
}
diff --git a/src/main/java/me/Danker/gui/OnlySlayerGui.java b/src/main/java/me/Danker/gui/OnlySlayerGui.java
index ee6f3ec..9df0087 100644
--- a/src/main/java/me/Danker/gui/OnlySlayerGui.java
+++ b/src/main/java/me/Danker/gui/OnlySlayerGui.java
@@ -26,6 +26,8 @@ public class OnlySlayerGui extends GuiScreen {
private GuiButton two;
private GuiButton three;
private GuiButton four;
+ private GuiButton five;
+
private GuiButton highlightSlayers;
@Override
@@ -52,9 +54,14 @@ public class OnlySlayerGui extends GuiScreen {
case "III":
onlyNumberInt = 3;
break;
- default:
+ case "IV":
onlyNumberInt = 4;
break;
+ case "V":
+ onlyNumberInt = 5;
+ break;
+ default:
+ return;
}
goBack = new GuiButton(0, 2, height - 30, 100, 20, "Go Back");
@@ -62,11 +69,12 @@ public class OnlySlayerGui extends GuiScreen {
zombie = new GuiButton(0, width / 2 - 200, (int) (height * 0.4), 120, 20, "Zombie");
spider = new GuiButton(0, width / 2 - 60, (int) (height * 0.4), 120, 20, "Spider");
wolf = new GuiButton(0, width / 2 + 80, (int) (height * 0.4), 120, 20, "Wolf");
- one = new GuiButton(0, width / 2 - 190, (int) (height * 0.6), 85, 20, "I");
- two = new GuiButton(0, width / 2 - 95, (int) (height * 0.6), 85, 20, "II");
- three = new GuiButton(0, width / 2 + 10, (int) (height * 0.6), 85, 20, "III");
- four = new GuiButton(0, width / 2 + 115, (int) (height * 0.6), 85, 20, "IV");
- highlightSlayers = new GuiButton(0, width / 2 - 100, (int) (height * 0.7), "Highlight Slayer Bosses: " + Utils.getColouredBoolean(ToggleCommand.highlightSlayers));
+ one = new GuiButton(0, width / 2 - 190, (int) (height * 0.6), 60, 20, "I");
+ two = new GuiButton(0, width / 2 - 110, (int) (height * 0.6), 60, 20, "II");
+ three = new GuiButton(0, width / 2 - 30, (int) (height * 0.6), 60, 20, "III");
+ four = new GuiButton(0, width / 2 + 50, (int) (height * 0.6), 60, 20, "IV");
+ five = new GuiButton(0, width / 2 + 130, (int) (height * 0.6), 60, 20, "V");
+ highlightSlayers = new GuiButton(0, width / 2 - 100, (int) (height * 0.7), "Highlight Slayer Bosses: " + Utils.getColouredBoolean(ToggleCommand.highlightSlayers));
this.buttonList.add(off);
this.buttonList.add(zombie);
@@ -76,7 +84,8 @@ public class OnlySlayerGui extends GuiScreen {
this.buttonList.add(two);
this.buttonList.add(three);
this.buttonList.add(four);
- this.buttonList.add(highlightSlayers);
+ this.buttonList.add(five);
+ this.buttonList.add(highlightSlayers);
this.buttonList.add(goBack);
}
@@ -121,11 +130,14 @@ public class OnlySlayerGui extends GuiScreen {
onlyNumberInt = 3;
} else if (button == four) {
onlyNumberInt = 4;
+ } else if (button == five) {
+ onlyNumberInt = 5;
} else if (button == highlightSlayers) {
ToggleCommand.highlightSlayers = !ToggleCommand.highlightSlayers;
ConfigHandler.writeBooleanConfig("toggles", "HighlightSlayers", ToggleCommand.highlightSlayers);
highlightSlayers.displayString = "Highlight Slayer Bosses: " + Utils.getColouredBoolean(ToggleCommand.highlightSlayers);
- }
+ return;
+ }
String onlyNumber;
switch (onlyNumberInt) {
@@ -139,6 +151,11 @@ public class OnlySlayerGui extends GuiScreen {
onlyNumber = "III";
break;
case 4:
+ onlyNumber = "IV";
+ break;
+ case 5:
+ onlyNumber = "V";
+ break;
default:
onlyNumber = "IV";
}
diff --git a/src/main/java/me/Danker/gui/PuzzleSolversGui.java b/src/main/java/me/Danker/gui/PuzzleSolversGui.java
index 3864b80..3bb16a0 100644
--- a/src/main/java/me/Danker/gui/PuzzleSolversGui.java
+++ b/src/main/java/me/Danker/gui/PuzzleSolversGui.java
@@ -24,6 +24,7 @@ public class PuzzleSolversGui extends GuiScreen {
private GuiButton ticTacToe;
private GuiButton boulder;
private GuiButton silverfish;
+ private GuiButton iceWalk;
private GuiButton startsWith;
private GuiButton selectAll;
private GuiButton clickOrder;
@@ -61,11 +62,12 @@ public class PuzzleSolversGui extends GuiScreen {
boulder = new GuiButton(0, width / 2 - 100, (int) (height * 0.7), "Boulder Solver: " + Utils.getColouredBoolean(ToggleCommand.boulderToggled));
// Page 2
silverfish = new GuiButton(0, width / 2 - 100, (int) (height * 0.1), "Silverfish Solver: " + Utils.getColouredBoolean(ToggleCommand.silverfishToggled));
- startsWith = new GuiButton(0, width / 2 - 100, (int) (height * 0.2), "Starts With Letter Terminal Solver: " + Utils.getColouredBoolean(ToggleCommand.startsWithToggled));
- selectAll = new GuiButton(0, width / 2 - 100, (int) (height * 0.3), "Select All Color Terminal Solver: " + Utils.getColouredBoolean(ToggleCommand.selectAllToggled));
- clickOrder = new GuiButton(0, width / 2 - 100, (int) (height * 0.4), "Click in Order Terminal Helper: " + Utils.getColouredBoolean(ToggleCommand.clickInOrderToggled));
- blockClicks = new GuiButton(0, width / 2 - 100, (int) (height * 0.5), "Block Wrong Clicks on Terminals: " + Utils.getColouredBoolean(ToggleCommand.blockWrongTerminalClicksToggled));
- itemFrameOnSeaLanterns = new GuiButton(0, width / 2 - 100, (int) (height * 0.6), "Ignore Arrows On Sea Lanterns: " + Utils.getColouredBoolean(ToggleCommand.itemFrameOnSeaLanternsToggled));
+ iceWalk = new GuiButton(0, width / 2 - 100, (int) (height * 0.2), "Ice Walk Solver: " + Utils.getColouredBoolean(ToggleCommand.iceWalkToggled));
+ startsWith = new GuiButton(0, width / 2 - 100, (int) (height * 0.3), "Starts With Letter Terminal Solver: " + Utils.getColouredBoolean(ToggleCommand.startsWithToggled));
+ selectAll = new GuiButton(0, width / 2 - 100, (int) (height * 0.4), "Select All Color Terminal Solver: " + Utils.getColouredBoolean(ToggleCommand.selectAllToggled));
+ clickOrder = new GuiButton(0, width / 2 - 100, (int) (height * 0.5), "Click in Order Terminal Helper: " + Utils.getColouredBoolean(ToggleCommand.clickInOrderToggled));
+ blockClicks = new GuiButton(0, width / 2 - 100, (int) (height * 0.6), "Block Wrong Clicks on Terminals: " + Utils.getColouredBoolean(ToggleCommand.blockWrongTerminalClicksToggled));
+ itemFrameOnSeaLanterns = new GuiButton(0, width / 2 - 100, (int) (height * 0.7), "Ignore Arrows On Sea Lanterns: " + Utils.getColouredBoolean(ToggleCommand.itemFrameOnSeaLanternsToggled));
switch (page) {
case 1:
@@ -80,6 +82,7 @@ public class PuzzleSolversGui extends GuiScreen {
break;
case 2:
this.buttonList.add(silverfish);
+ this.buttonList.add(iceWalk);
this.buttonList.add(startsWith);
this.buttonList.add(selectAll);
this.buttonList.add(clickOrder);
@@ -137,6 +140,10 @@ public class PuzzleSolversGui extends GuiScreen {
ToggleCommand.silverfishToggled = !ToggleCommand.silverfishToggled;
ConfigHandler.writeBooleanConfig("toggles", "SilverfishPuzzle", ToggleCommand.silverfishToggled);
silverfish.displayString = "Silverfish Solver: " + Utils.getColouredBoolean(ToggleCommand.silverfishToggled);
+ } else if (button == iceWalk) {
+ ToggleCommand.iceWalkToggled = !ToggleCommand.iceWalkToggled;
+ ConfigHandler.writeBooleanConfig("toggles", "IceWalkPuzzle", ToggleCommand.iceWalkToggled);
+ iceWalk.displayString = "Ice Walk Solver: " + Utils.getColouredBoolean(ToggleCommand.iceWalkToggled);
} else if (button == startsWith) {
ToggleCommand.startsWithToggled = !ToggleCommand.startsWithToggled;
ConfigHandler.writeBooleanConfig("toggles", "StartsWithTerminal", ToggleCommand.startsWithToggled);
diff --git a/src/main/java/me/Danker/handlers/ConfigHandler.java b/src/main/java/me/Danker/handlers/ConfigHandler.java
index aa35ded..89eed6c 100644
--- a/src/main/java/me/Danker/handlers/ConfigHandler.java
+++ b/src/main/java/me/Danker/handlers/ConfigHandler.java
@@ -261,6 +261,7 @@ public class ConfigHandler {
ToggleCommand.ticTacToeToggled = initBoolean("toggles", "TicTacToePuzzle", false);
ToggleCommand.boulderToggled = initBoolean("toggles", "BoulderPuzzle", false);
ToggleCommand.silverfishToggled = initBoolean("toggles", "SilverfishPuzzle", false);
+ ToggleCommand.iceWalkToggled = initBoolean("toggles", "IceWalkPuzzle", false);
ToggleCommand.startsWithToggled = initBoolean("toggles", "StartsWithTerminal", false);
ToggleCommand.selectAllToggled = initBoolean("toggles", "SelectAllTerminal", false);
ToggleCommand.clickInOrderToggled = initBoolean("toggles", "ClickInOrderTerminal", false);
@@ -271,6 +272,8 @@ public class ConfigHandler {
ToggleCommand.chronomatronToggled = initBoolean("toggles", "Chronomatron", false);
ToggleCommand.superpairsToggled = initBoolean("toggles", "Superpairs", false);
ToggleCommand.hideTooltipsInExperimentAddonsToggled = initBoolean("toggles", "HideTooltipsInExperimentAddons", false);
+ // Custom Music
+ ToggleCommand.dungeonBossMusic = initBoolean("toggles", "DungeonBossMusic", false);
// API
if (!hasKey("api", "APIKey")) writeStringConfig("api", "APIKey", "");
@@ -321,6 +324,8 @@ public class ConfigHandler {
LootTracker.zombieRevCatas = initInt("zombie", "revCatalyst", 0);
LootTracker.zombieSnakes = initInt("zombie", "snake", 0);
LootTracker.zombieScythes = initInt("zombie", "scythe", 0);
+ LootTracker.zombieShards = initInt("zombie", "shard", 0);
+ LootTracker.zombieWardenHearts = initInt("zombie", "heart", 0);
LootTracker.zombieTime = initDouble("zombie", "timeRNG", -1);
LootTracker.zombieBosses = initInt("zombie", "bossRNG", -1);
@@ -530,6 +535,7 @@ public class ConfigHandler {
BoulderSolver.BOULDER_COLOUR = initInt("colors", "boulder", 0x197F19);
BoulderSolver.BOULDER_ARROW_COLOUR = initInt("colors", "boulderArrow", 0x006000);
SilverfishSolver.SILVERFISH_LINE_COLOUR = initInt("colors", "silverfishLine", 0x40FF40);
+ IceWalkSolver.ICE_WALK_LINE_COLOUR = initInt("colors", "iceWalkLine", 0x40FF40);
// Commands
if (!hasKey("commands", "reparty")) writeBooleanConfig("commands", "reparty", false);
diff --git a/src/main/java/me/Danker/utils/IceWalkUtils.java b/src/main/java/me/Danker/utils/IceWalkUtils.java
new file mode 100644
index 0000000..8164fe1
--- /dev/null
+++ b/src/main/java/me/Danker/utils/IceWalkUtils.java
@@ -0,0 +1,99 @@
+package me.Danker.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public class IceWalkUtils {
+
+ public static List<Point> solve(char[][] board) {
+ Point startPos = new Point(board.length - 1, board[0].length / 2);
+ Point endPos = new Point(0, board[0].length / 2);
+ List<Point> route = new ArrayList<>();
+ route.add(startPos);
+ return findSolution(board, startPos, endPos, route);
+ }
+
+ public static List<Point> findSolution(char[][] board, Point startPos, Point endPos, List<Point> route) {
+ for (Direction direction : Direction.values()) {
+ Point nextPoint = move(board, startPos, direction);
+ if (nextPoint == null || route.contains(nextPoint)) continue;
+ List<Point> newRoute = new ArrayList<>(route);
+ newRoute.add(nextPoint);
+ if (nextPoint.equals(endPos) && isComplete(board, newRoute)) return newRoute;
+ List<Point> solution = findSolution(board, nextPoint, endPos, newRoute);
+ if (solution == null) continue;
+ return solution;
+ }
+ return null;
+ }
+
+ public static Point move(char[][] board, Point pos, Direction direction) {
+ switch (direction) {
+ case UP:
+ if (pos.row != 0 && board[pos.row - 1][pos.column] != 'X') {
+ return new Point(pos.row - 1, pos.column);
+ }
+ break;
+ case DOWN:
+ if (pos.row != board.length - 1 && board[pos.row + 1][pos.column] != 'X') {
+ return new Point(pos.row + 1, pos.column);
+ }
+ break;
+ case LEFT:
+ if (pos.column != 0 && board[pos.row][pos.column - 1] != 'X') {
+ return new Point(pos.row, pos.column - 1);
+ }
+ break;
+ case RIGHT:
+ if (pos.column != board[0].length - 1 && board[pos.row][pos.column + 1] != 'X') {
+ return new Point(pos.row, pos.column + 1);
+ }
+ break;
+ }
+ return null;
+ }
+
+ public static boolean isComplete(char[][] board, List<Point> route) {
+ for (int row = 0; row < board.length; row++) {
+ for (int column = 0; column < board[0].length; column++) {
+ if (board[row][column] != 'X' && !route.contains(new Point(row, column))) return false;
+ }
+ }
+ return true;
+ }
+
+ public static class Point {
+
+ public int row;
+ public int column;
+
+ public Point(int row, int column) {
+ this.row = row;
+ this.column = column;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(row, column);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Point) {
+ Point point = (Point) obj;
+ return row == point.row && column == point.column;
+ }
+ return false;
+ }
+
+ }
+
+ enum Direction {
+ UP,
+ DOWN,
+ LEFT,
+ RIGHT
+ }
+
+}