aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker
diff options
context:
space:
mode:
authorKhafra <maitken033380023@gmail.com>2023-12-07 14:57:15 -0500
committerGitHub <noreply@github.com>2023-12-07 14:57:15 -0500
commit3ce9d9ad246eaa38b37eb6f11385519528de7630 (patch)
tree3b866e78de1567810fbd1411ff114248e0dce513 /src/main/java/de/hysky/skyblocker
parent1b27e97c56f389834a2f2f9b382c92b2bf7065b7 (diff)
downloadSkyblocker-3ce9d9ad246eaa38b37eb6f11385519528de7630.tar.gz
Skyblocker-3ce9d9ad246eaa38b37eb6f11385519528de7630.tar.bz2
Skyblocker-3ce9d9ad246eaa38b37eb6f11385519528de7630.zip
F3/M3 Guardian Health Display (#442)
Diffstat (limited to 'src/main/java/de/hysky/skyblocker')
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java1
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java98
4 files changed, 110 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 41ee483f..1473d1de 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -100,6 +100,7 @@ public class SkyblockerMod implements ClientModInitializer {
DungeonBlaze.init();
ChestValue.init();
FireFreezeStaffTimer.init();
+ GuardianHealth.init();
TheRift.init();
TitleContainer.init();
ScreenMaster.init();
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index 4daa96c0..8604913c 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -633,6 +633,9 @@ public class SkyblockerConfig {
public boolean fireFreezeStaffTimer = true;
@SerialEntry
+ public boolean floor3GuardianHealthDisplay = true;
+
+ @SerialEntry
public LividColor lividColor = new LividColor();
@SerialEntry
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 0a68ef5e..246611cc 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -325,6 +325,14 @@ public class DungeonsCategory {
newValue -> config.locations.dungeons.fireFreezeStaffTimer = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.floor3GuardianHealthDisplay"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.floor3GuardianHealthDisplay.@Tooltip")))
+ .binding(defaults.locations.dungeons.floor3GuardianHealthDisplay,
+ () -> config.locations.dungeons.floor3GuardianHealthDisplay,
+ newValue -> config.locations.dungeons.floor3GuardianHealthDisplay = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
//Livid Color
.group(OptionGroup.createBuilder()
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java
new file mode 100644
index 00000000..e17c490d
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java
@@ -0,0 +1,98 @@
+package de.hysky.skyblocker.skyblock.dungeon;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
+import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.EntityType;
+import net.minecraft.entity.decoration.ArmorStandEntity;
+import net.minecraft.entity.mob.GuardianEntity;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import net.minecraft.util.math.Box;
+
+public class GuardianHealth {
+ private static final Box bossRoom = new Box(34, 65, -32, -32, 100, 36);
+ private static final Pattern guardianRegex = Pattern.compile("^(.*?) Guardian (.*?)([A-Za-z])❤$");
+ private static final Pattern professorRegex = Pattern.compile("^﴾ The Professor (.*?)([A-za-z])❤ ﴿$");
+ private static boolean inBoss;
+
+ public static void init() {
+ ClientReceiveMessageEvents.GAME.register(GuardianHealth::onChatMessage);
+ ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> GuardianHealth.reset());
+ WorldRenderEvents.AFTER_ENTITIES.register(GuardianHealth::onWorldRender);
+ }
+
+ private static void onWorldRender(WorldRenderContext context) {
+ if (!SkyblockerConfigManager.get().locations.dungeons.floor3GuardianHealthDisplay) return;
+
+ MinecraftClient client = MinecraftClient.getInstance();
+
+ if (Utils.isInDungeons() && inBoss && client.player != null && client.world != null) {
+ List<GuardianEntity> guardians =
+ client.world.getEntitiesByClass(
+ GuardianEntity.class, bossRoom, guardianEntity -> true);
+
+ for (GuardianEntity guardian : guardians) {
+ List<ArmorStandEntity> armorStands =
+ client.world.getEntitiesByType(
+ EntityType.ARMOR_STAND,
+ guardian.getBoundingBox().expand(0, 1, 0),
+ GuardianHealth::isGuardianName);
+
+ for (ArmorStandEntity armorStand : armorStands) {
+ String display = armorStand.getDisplayName().getString();
+ boolean professor = display.contains("The Professor");
+ Matcher matcher =
+ professor
+ ? professorRegex.matcher(display)
+ : guardianRegex.matcher(display);
+ matcher.matches(); // name is validated in isGuardianName
+
+ String health = matcher.group(professor ? 1 : 2);
+ String quantity = matcher.group(professor ? 2 : 3);
+
+ double distance = context.camera().getPos().distanceTo(guardian.getPos());
+
+ RenderHelper.renderText(
+ context,
+ Text.literal(health + quantity).formatted(Formatting.GREEN),
+ guardian.getPos(),
+ (float) (1 + (distance / 10)),
+ true);
+ }
+ }
+ }
+ }
+
+ private static void reset() {
+ inBoss = false;
+ }
+
+ private static void onChatMessage(Text text, boolean overlay) {
+ if (Utils.isInDungeons() && SkyblockerConfigManager.get().locations.dungeons.floor3GuardianHealthDisplay && !inBoss) {
+ String unformatted = Formatting.strip(text.getString());
+
+ inBoss = unformatted.equals("[BOSS] The Professor: I was burdened with terrible news recently...");
+ }
+ }
+
+ private static boolean isGuardianName(ArmorStandEntity entity) {
+ String display = entity.getDisplayName().getString();
+
+ if (display.contains("The Professor")) {
+ return professorRegex.matcher(display).matches();
+ }
+
+ return !display.equals("Armor Stand") && guardianRegex.matcher(display).matches();
+ }
+}
+