aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java38
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java55
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java11
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java20
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/scheduler/Scheduler.java2
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json5
9 files changed, 143 insertions, 14 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 190bda4f..75dbdcce 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -5,10 +5,7 @@ import com.google.gson.GsonBuilder;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.*;
-import de.hysky.skyblocker.skyblock.dungeon.DungeonMap;
-import de.hysky.skyblocker.skyblock.dungeon.FireFreezeStaffTimer;
-import de.hysky.skyblocker.skyblock.dungeon.GuardianHealth;
-import de.hysky.skyblocker.skyblock.dungeon.LividColor;
+import de.hysky.skyblocker.skyblock.dungeon.*;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.CreeperBeams;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.DungeonBlaze;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.TicTacToe;
@@ -106,6 +103,7 @@ public class SkyblockerMod implements ClientModInitializer {
DungeonManager.init();
DungeonBlaze.init();
Waterboard.init();
+ DungeonScore.init();
ChestValue.init();
FireFreezeStaffTimer.init();
GuardianHealth.init();
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index 5f3063be..6044aef9 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -594,6 +594,9 @@ public class SkyblockerConfig {
public DoorHighlight doorHighlight = new DoorHighlight();
@SerialEntry
+ public DungeonScore dungeonScore = new DungeonScore();
+
+ @SerialEntry
public DungeonChestProfit dungeonChestProfit = new DungeonChestProfit();
@SerialEntry
@@ -718,6 +721,20 @@ public class SkyblockerConfig {
}
}
+ public static class DungeonScore {
+ @SerialEntry
+ public boolean enableDungeonScore270 = true;
+
+ @SerialEntry
+ public String dungeonScore270Message = "270 Score Reached!";
+
+ @SerialEntry
+ public boolean enableDungeonScore300 = true;
+
+ @SerialEntry
+ public String dungeonScore300Message = "300 Score Reached!";
+ }
+
public static class DungeonChestProfit {
@SerialEntry
public boolean enableProfitCalculator = true;
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
index 79e0b00c..b300be36 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -167,6 +167,44 @@ public class DungeonsCategory {
.build())
.build())
+ //Dungeon Score
+ .group(OptionGroup.createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore"))
+ .collapsed(true)
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScore", 270))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScore.@Tooltip", 270)))
+ .binding(defaults.locations.dungeons.dungeonScore.enableDungeonScore270,
+ () -> config.locations.dungeons.dungeonScore.enableDungeonScore270,
+ newValue -> config.locations.dungeons.dungeonScore.enableDungeonScore270 = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<String>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage", 270))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage.@Tooltip", 270, 270)))
+ .binding(defaults.locations.dungeons.dungeonScore.dungeonScore270Message,
+ () -> config.locations.dungeons.dungeonScore.dungeonScore270Message,
+ newValue -> config.locations.dungeons.dungeonScore.dungeonScore270Message = newValue)
+ .controller(StringControllerBuilder::create)
+ .build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScore", 300))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScore.@Tooltip", 300)))
+ .binding(defaults.locations.dungeons.dungeonScore.enableDungeonScore300,
+ () -> config.locations.dungeons.dungeonScore.enableDungeonScore300,
+ newValue -> config.locations.dungeons.dungeonScore.enableDungeonScore300 = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<String>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage", 300))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage.@Tooltip", 300, 300)))
+ .binding(defaults.locations.dungeons.dungeonScore.dungeonScore300Message,
+ () -> config.locations.dungeons.dungeonScore.dungeonScore300Message,
+ newValue -> config.locations.dungeons.dungeonScore.dungeonScore300Message = newValue)
+ .controller(StringControllerBuilder::create)
+ .build())
+ .build())
+
//Dungeon Chest Profit
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit"))
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
new file mode 100644
index 00000000..cef5efa1
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
@@ -0,0 +1,55 @@
+package de.hysky.skyblocker.skyblock.dungeon;
+
+import de.hysky.skyblocker.config.SkyblockerConfig;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
+import de.hysky.skyblocker.utils.Constants;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
+import de.hysky.skyblocker.utils.scheduler.Scheduler;
+import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DungeonScore {
+ private static final SkyblockerConfig.DungeonScore CONFIG = SkyblockerConfigManager.get().locations.dungeons.dungeonScore;
+ private static final Pattern DUNGEON_CLEARED_PATTERN = Pattern.compile("Cleared: (?<cleared>\\d+)% \\((?<score>\\d+)\\)");
+ private static boolean sent270;
+ private static boolean sent300;
+
+ public static void init() {
+ Scheduler.INSTANCE.scheduleCyclic(DungeonScore::tick, 20);
+ ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> reset());
+ }
+
+ public static void tick() {
+ if (!Utils.isInDungeons()) {
+ reset();
+ return;
+ }
+
+ for (String sidebarLine : Utils.STRING_SCOREBOARD) {
+ Matcher dungeonClearedMatcher = DUNGEON_CLEARED_PATTERN.matcher(sidebarLine);
+ if (!dungeonClearedMatcher.matches()) {
+ continue;
+ }
+ int score = Integer.parseInt(dungeonClearedMatcher.group("score"));
+ if (!DungeonManager.isInBoss()) score += 28;
+ if (CONFIG.enableDungeonScore270 && !sent270 && score >= 270 && score < 300) {
+ MessageScheduler.INSTANCE.sendMessageAfterCooldown(Constants.PREFIX.get().getString() + CONFIG.dungeonScore270Message.replaceAll("\\[score]", "270"));
+ sent270 = true;
+ }
+ if (CONFIG.enableDungeonScore300 && !sent300 && score >= 300) {
+ MessageScheduler.INSTANCE.sendMessageAfterCooldown(Constants.PREFIX.get().getString() + CONFIG.dungeonScore300Message.replaceAll("\\[score]", "300"));
+ sent300 = true;
+ }
+ break;
+ }
+ }
+
+ private static void reset() {
+ sent270 = false;
+ sent300 = false;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
index f40b7859..472c9d95 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.config.SkyblockerConfig;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -74,7 +75,7 @@ public class LividColor {
LividColor.color = WOOL_TO_FORMATTING.get(color);
if (SkyblockerConfigManager.get().locations.dungeons.lividColor.enableLividColorText) {
String colorString = Registries.BLOCK.getId(color).getPath();
- MessageScheduler.INSTANCE.sendMessageAfterCooldown(SkyblockerConfigManager.get().locations.dungeons.lividColor.lividColorText.replaceAll("\\[color]", colorString.substring(0, colorString.length() - 5)));
+ MessageScheduler.INSTANCE.sendMessageAfterCooldown(Constants.PREFIX.get().getString() + SkyblockerConfigManager.get().locations.dungeons.lividColor.lividColorText.replaceAll("\\[color]", colorString.substring(0, colorString.length() - 5)));
}
tenTicks = 0;
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
index bd10767f..32f0b7e3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
@@ -147,6 +147,7 @@ public class DungeonManager {
@Nullable
private static Vector2ic physicalEntrancePos;
private static Room currentRoom;
+ private static boolean inBoss;
public static boolean isRoomsLoaded() {
return roomsLoaded != null && roomsLoaded.isDone();
@@ -203,6 +204,10 @@ public class DungeonManager {
return currentRoom;
}
+ public static boolean isInBoss() {
+ return inBoss;
+ }
+
/**
* Loads the dungeon secrets asynchronously from {@code /assets/skyblocker/dungeons}.
* Use {@link #isRoomsLoaded()} to check for completion of loading.
@@ -644,7 +649,10 @@ public class DungeonManager {
if (message.equals("[BOSS] Bonzo: Gratz for making it this far, but I'm basically unbeatable.") || message.equals("[BOSS] Scarf: This is where the journey ends for you, Adventurers.")
|| message.equals("[BOSS] The Professor: I was burdened with terrible news recently...") || message.equals("[BOSS] Thorn: Welcome Adventurers! I am Thorn, the Spirit! And host of the Vegan Trials!")
|| message.equals("[BOSS] Livid: Welcome, you've arrived right on time. I am Livid, the Master of Shadows.") || message.equals("[BOSS] Sadan: So you made it all the way here... Now you wish to defy me? Sadan?!")
- || message.equals("[BOSS] Maxor: WELL! WELL! WELL! LOOK WHO'S HERE!")) reset();
+ || message.equals("[BOSS] Maxor: WELL! WELL! WELL! LOOK WHO'S HERE!")) {
+ reset();
+ inBoss = true;
+ }
}
/**
@@ -763,5 +771,6 @@ public class DungeonManager {
physicalEntrancePos = null;
rooms.clear();
currentRoom = null;
+ inBoss = false;
}
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java b/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java
index a67d8da0..43194938 100644
--- a/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java
+++ b/src/main/java/de/hysky/skyblocker/utils/scheduler/MessageScheduler.java
@@ -1,6 +1,8 @@
package de.hysky.skyblocker.utils.scheduler;
import net.minecraft.client.MinecraftClient;
+import net.minecraft.util.StringHelper;
+import org.apache.commons.lang3.StringUtils;
/**
* A scheduler for sending chat messages or commands. Use the instance in {@link #INSTANCE}. Do not instantiate this class.
@@ -34,13 +36,17 @@ public class MessageScheduler extends Scheduler {
}
private void sendMessage(String message) {
- if (MinecraftClient.getInstance().player != null) {
- if (message.startsWith("/")) {
- MinecraftClient.getInstance().player.networkHandler.sendCommand(message.substring(1));
- } else {
- MinecraftClient.getInstance().inGameHud.getChatHud().addToMessageHistory(message);
- MinecraftClient.getInstance().player.networkHandler.sendChatMessage(message);
- }
+ MinecraftClient client = MinecraftClient.getInstance();
+ if (client.player == null) {
+ Scheduler.LOGGER.error("[Skyblocker Message Scheduler] Tried to send a message while player is null: {}", message);
+ return;
+ }
+ message = StringHelper.truncateChat(StringUtils.normalizeSpace(message.trim()));
+ if (message.startsWith("/")) {
+ client.player.networkHandler.sendCommand(message.substring(1));
+ } else {
+ client.inGameHud.getChatHud().addToMessageHistory(message);
+ client.player.networkHandler.sendChatMessage(message);
}
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/scheduler/Scheduler.java b/src/main/java/de/hysky/skyblocker/utils/scheduler/Scheduler.java
index 139ac05e..2f5375fe 100644
--- a/src/main/java/de/hysky/skyblocker/utils/scheduler/Scheduler.java
+++ b/src/main/java/de/hysky/skyblocker/utils/scheduler/Scheduler.java
@@ -20,7 +20,7 @@ import java.util.function.Supplier;
* A scheduler for running tasks at a later time. Tasks will be run synchronously on the main client thread. Use the instance stored in {@link #INSTANCE}. Do not instantiate this class.
*/
public class Scheduler {
- private static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class);
+ protected static final Logger LOGGER = LoggerFactory.getLogger(Scheduler.class);
public static final Scheduler INSTANCE = new Scheduler();
private int currentTick = 0;
private final AbstractInt2ObjectMap<List<ScheduledTask>> tasks = new Int2ObjectOpenHashMap<>();
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 8fa9c701..a54110ed 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -189,6 +189,11 @@
"text.autoconfig.skyblocker.option.locations.dungeons.doorHighlight.doorHighlightType": "Door Highlight Type",
"text.autoconfig.skyblocker.option.locations.dungeons.doorHighlight.doorHighlightType.@Tooltip": "Highlight: Only displays a highlight.\n\nOutlined Highlight: Displays both a highlight and an outline.\n\nOutline: Only displays an outline.",
"text.autoconfig.skyblocker.option.locations.dungeons.doorHighlight.doorHighlightType.secretWaypointsNote": "\n\n\nNote: Dungeon Secret Waypoints must be enabled for this to work.",
+ "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore": "Dungeon Score",
+ "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScore": "Enable Dungeon Score %d",
+ "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.enableDungeonScore.@Tooltip": "Sends a message in chat when reaching %d score in dungeons.",
+ "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage": "Dungeon Score %d Message",
+ "text.autoconfig.skyblocker.option.locations.dungeons.dungeonScore.dungeonScoreMessage.@Tooltip": "Message which will be sent in the chat when reaching %d score in dungeons. The string \"[score]\" will be replaced with the dungeon score (%d).",
"text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit": "Dungeon Chest Profit Calculator",
"text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.enableProfitCalculator": "Enable Profit Calculator",
"text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.enableProfitCalculator.@Tooltip": "Displays the profit of a dungeon chest in the chest screen's title.\nGreen if there's profit.\nRed if there isn't profit.\nGray if you don't gain or lose anything.\nBlue if calculations were based on incomplete data.",