diff options
author | Khafra <maitken033380023@gmail.com> | 2023-12-07 14:57:15 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-07 14:57:15 -0500 |
commit | 3ce9d9ad246eaa38b37eb6f11385519528de7630 (patch) | |
tree | 3b866e78de1567810fbd1411ff114248e0dce513 /src/main/java/de/hysky/skyblocker | |
parent | 1b27e97c56f389834a2f2f9b382c92b2bf7065b7 (diff) | |
download | Skyblocker-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')
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(); + } +} + |