From cb6a665d28e704f4e6f1949750b82947d0c2e932 Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Sun, 30 Jun 2024 14:13:34 +0200
Subject: fixes #378

The click behavior of the Quicknavbutton has been changed so that it is more like a button click. The button is therefore pressed for 2.5 seconds. This has the advantage that the button can be pressed again if an error occurs. Otherwise, everything is the same, i.e. if the container name is recognized, it remains pressed and cannot be pressed again.
A fade animation has also been added.
---
 .../skyblock/quicknav/QuickNavButton.java          | 42 ++++++++++++++++++----
 1 file changed, 36 insertions(+), 6 deletions(-)

(limited to 'src/main/java/de')

diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
index f7f33d0f..21574fd8 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
@@ -18,10 +18,16 @@ import net.minecraft.util.Identifier;
 @Environment(value = EnvType.CLIENT)
 public class QuickNavButton extends ClickableWidget {
     private final int index;
-    private boolean toggled;
+    private final boolean toggled;
+    private boolean temporaryToggled = false;
     private final String command;
     private final ItemStack icon;
 
+    private static final long TOGGLE_DURATION = 250;
+    private long toggleTime;
+
+    private float alpha = 1.0f;
+
     /**
      * Checks if the current tab is a top tab based on its index.
      *
@@ -32,7 +38,7 @@ public class QuickNavButton extends ClickableWidget {
     }
 
     public boolean toggled() {
-        return toggled;
+        return toggled || temporaryToggled;
     }
 
     /**
@@ -49,6 +55,7 @@ public class QuickNavButton extends ClickableWidget {
         this.toggled = toggled;
         this.command = command;
         this.icon = icon;
+        this.toggleTime = 0;
     }
 
     private void updateCoordinates() {
@@ -71,10 +78,12 @@ public class QuickNavButton extends ClickableWidget {
      */
     @Override
     public void onClick(double mouseX, double mouseY) {
-        if (!this.toggled) {
-            this.toggled = true;
+        if (!this.temporaryToggled) {
+            this.temporaryToggled = true;
+            this.toggleTime = System.currentTimeMillis();
             MessageScheduler.INSTANCE.sendMessageAfterCooldown(command);
             // TODO : add null check with log error
+            this.alpha = 0.5f;
         }
     }
 
@@ -93,17 +102,38 @@ public class QuickNavButton extends ClickableWidget {
         this.updateCoordinates();
         RenderSystem.disableDepthTest();
 
+        if (this.temporaryToggled && System.currentTimeMillis() - this.toggleTime >= TOGGLE_DURATION) {
+            this.temporaryToggled = false; // Reset toggled state
+        }
+        //"animation"
+        if (this.alpha < 1.0f) {
+            this.alpha += 0.05f;
+            if (this.alpha > 1.0f) {
+                this.alpha = 1.0f;
+            }
+        }
+
+        //"animation"
+        RenderSystem.enableBlend();
+        RenderSystem.defaultBlendFunc();
+        RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, this.alpha);
+
         // Construct the texture identifier based on the index and toggled state
-        Identifier tabTexture = Identifier.ofVanilla("container/creative_inventory/tab_" + (isTopTab() ? "top" : "bottom") + "_" + (toggled ? "selected" : "unselected") + "_" + (index % 7 + 1));
+        Identifier tabTexture = Identifier.ofVanilla("container/creative_inventory/tab_" + (isTopTab() ? "top" : "bottom") + "_" + (toggled() ? "selected" : "unselected") + "_" + (index % 7 + 1));
 
         // Render the button texture
         context.drawGuiTexture(tabTexture, this.getX(), this.getY(), this.width, this.height);
         // Render the button icon
         int yOffset = this.index < 7 ? 1 : -1;
         context.drawItem(this.icon, this.getX() + 5, this.getY() + 8 + yOffset);
+        //prevent "fading animation" on not quicknav stuff
+        RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
+        RenderSystem.disableBlend();
+
         RenderSystem.enableDepthTest();
     }
 
     @Override
-    protected void appendClickableNarrations(NarrationMessageBuilder builder) {}
+    protected void appendClickableNarrations(NarrationMessageBuilder builder) {
+    }
 }
-- 
cgit 


From 28d82396b363ddd82e138614727dd8c71a28bbb4 Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Sun, 30 Jun 2024 14:25:40 +0200
Subject: fixes #539 #538

The logic of the livid code has been changed.
The system checks whether the current color is the same as the last found livid color. The initial color is detected after the first blindness effect + 2 seconds.
I also added the bounding box option for livid to make it easier to recognize the correct enemy. I changed default mob glow option to false by and bounding box option to true.
---
 .../java/de/hysky/skyblocker/SkyblockerMod.java    |  1 -
 .../config/categories/DungeonsCategory.java        |  8 +++
 .../skyblocker/config/configs/DungeonsConfig.java  |  5 +-
 .../skyblocker/skyblock/dungeon/LividColor.java    | 77 ++++++++++++++--------
 .../skyblock/entity/MobBoundingBoxes.java          |  2 +
 .../resources/assets/skyblocker/lang/en_us.json    |  2 +
 6 files changed, 67 insertions(+), 28 deletions(-)

(limited to 'src/main/java/de')

diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 9d5f2b0f..ad7d4350 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -203,7 +203,6 @@ public class SkyblockerMod implements ClientModInitializer {
 
         Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20);
         Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 200);
-        Scheduler.INSTANCE.scheduleCyclic(LividColor::update, 10);
         Scheduler.INSTANCE.scheduleCyclic(BackpackPreview::tick, 50);
         Scheduler.INSTANCE.scheduleCyclic(DwarvenHud::update, 40);
         Scheduler.INSTANCE.scheduleCyclic(CrystalsHud::update, 40);
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 017e9186..20e3860c 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -209,6 +209,14 @@ public class DungeonsCategory {
                                         newValue -> config.dungeons.livid.enableLividColorGlow = newValue)
                                 .controller(ConfigUtils::createBooleanController)
                                 .build())
+                        .option(Option.<Boolean>createBuilder()
+                                .name(Text.translatable("skyblocker.config.dungeons.livid.enableLividColorBoundingBox"))
+                                .description(OptionDescription.of(Text.translatable("skyblocker.config.dungeons.livid.enableLividColorBoundingBox.@Tooltip")))
+                                .binding(defaults.dungeons.livid.enableLividColorBoundingBox,
+                                        () -> config.dungeons.livid.enableLividColorBoundingBox,
+                                        newValue -> config.dungeons.livid.enableLividColorBoundingBox = newValue)
+                                .controller(ConfigUtils::createBooleanController)
+                                .build())
                         .option(Option.<Boolean>createBuilder()
                                 .name(Text.translatable("skyblocker.config.dungeons.livid.enableLividColorText"))
                                 .description(OptionDescription.of(Text.translatable("skyblocker.config.dungeons.livid.enableLividColorText.@Tooltip")))
diff --git a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
index 1a0cad9d..6b46be32 100644
--- a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
@@ -112,7 +112,10 @@ public class DungeonsConfig {
 
     public static class Livid {
         @SerialEntry
-        public boolean enableLividColorGlow = true;
+        public boolean enableLividColorGlow = false;
+
+        @SerialEntry
+        public boolean enableLividColorBoundingBox = true;
 
         @SerialEntry
         public boolean enableLividColorText = true;
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 42810b60..1032baf4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -1,6 +1,5 @@
 package de.hysky.skyblocker.skyblock.dungeon;
 
-import de.hysky.skyblocker.config.SkyblockerConfig;
 import de.hysky.skyblocker.config.SkyblockerConfigManager;
 import de.hysky.skyblocker.config.configs.DungeonsConfig;
 import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -8,11 +7,16 @@ 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;
+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.block.Block;
 import net.minecraft.block.Blocks;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.effect.StatusEffects;
 import net.minecraft.registry.Registries;
 import net.minecraft.text.MutableText;
+import net.minecraft.text.Text;
 import net.minecraft.util.Formatting;
 import net.minecraft.util.math.BlockPos;
 
@@ -44,37 +48,39 @@ public class LividColor {
     );
     public static final Set<String> LIVID_NAMES = Set.copyOf(LIVID_TO_FORMATTING.keySet());
     public static final DungeonsConfig.Livid CONFIG = SkyblockerConfigManager.get().dungeons.livid;
-    private static int tenTicks = 0;
     private static Formatting color;
+    private static Block lastColor = Blocks.AIR;
+    private static boolean inBoss = false;
+
+    private static boolean isInitialized = false;
+    private static final long OFFSET_DURATION = 2000;
+    private static long toggleTime = 0;
 
     public static void init() {
-        ClientReceiveMessageEvents.GAME.register((message, overlay) -> {
-            DungeonsConfig.Livid config = SkyblockerConfigManager.get().dungeons.livid;
-            if ((config.enableLividColorText || config.enableLividColorTitle || config.enableLividColorGlow) && message.getString().equals("[BOSS] Livid: I respect you for making it to here, but I'll be your undoing.")) {
-                tenTicks = 8;
-            }
-        });
+        ClientReceiveMessageEvents.GAME.register(LividColor::onChatMessage);
+        ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> LividColor.reset());
+        WorldRenderEvents.AFTER_ENTITIES.register(LividColor::update);
     }
 
-    public static void update() {
+    private static void update(WorldRenderContext context) {
+        DungeonsConfig.Livid config = SkyblockerConfigManager.get().dungeons.livid;
+        if (!(config.enableLividColorText || config.enableLividColorTitle || config.enableLividColorGlow || config.enableLividColorBoundingBox)) return;
+
         MinecraftClient client = MinecraftClient.getInstance();
-        if (tenTicks != 0) {
-            DungeonsConfig.Livid config = SkyblockerConfigManager.get().dungeons.livid;
-            if ((config.enableLividColorText || config.enableLividColorTitle || config.enableLividColorGlow) && Utils.isInDungeons() && client.world != null) {
-                if (tenTicks == 1) {
-                    onLividColorFound(client, Blocks.RED_WOOL);
-                    return;
-                }
-                Block color = client.world.getBlockState(new BlockPos(5, 110, 42)).getBlock();
-                if (WOOL_TO_FORMATTING.containsKey(color) && !color.equals(Blocks.RED_WOOL)) {
-                    onLividColorFound(client, color);
-                    return;
-                }
-                tenTicks--;
-            } else {
-                tenTicks = 0;
-            }
+
+        if (!(Utils.isInDungeons() && inBoss && client.player != null && client.world != null)) return;
+
+        Block currentColor = client.world.getBlockState(new BlockPos(5, 110, 42)).getBlock();
+        if (!(WOOL_TO_FORMATTING.containsKey(currentColor) && !currentColor.equals(lastColor))) return;
+
+        if (!isInitialized && client.player.hasStatusEffect(StatusEffects.BLINDNESS)) {
+            toggleTime = System.currentTimeMillis();
+            isInitialized = true;
+        } else if (isInitialized && System.currentTimeMillis() - toggleTime >= OFFSET_DURATION) {
+            onLividColorFound(client, currentColor);
+            lastColor = currentColor;
         }
+
     }
 
     private static void onLividColorFound(MinecraftClient client, Block color) {
@@ -91,7 +97,6 @@ public class LividColor {
             client.inGameHud.setDefaultTitleFade();
             client.inGameHud.setTitle(message);
         }
-        tenTicks = 0;
     }
 
     public static boolean allowGlow() {
@@ -102,8 +107,28 @@ public class LividColor {
         return SkyblockerConfigManager.get().dungeons.livid.enableLividColorGlow && color == LIVID_TO_FORMATTING.get(name);
     }
 
+    public static boolean shouldDrawBoundingBox(String name) {
+        return SkyblockerConfigManager.get().dungeons.livid.enableLividColorBoundingBox && color == LIVID_TO_FORMATTING.get(name);
+    }
+
     @SuppressWarnings("DataFlowIssue")
     public static int getGlowColor(String name) {
         return LIVID_TO_FORMATTING.containsKey(name) ? LIVID_TO_FORMATTING.get(name).getColorValue() : Formatting.WHITE.getColorValue();
     }
+
+    private static void reset() {
+        inBoss = false;
+        lastColor = Blocks.AIR;
+        toggleTime = 0;
+        isInitialized = false;
+    }
+
+    private static void onChatMessage(Text text, boolean overlay) {
+        DungeonsConfig.Livid config = SkyblockerConfigManager.get().dungeons.livid;
+        if (Utils.isInDungeons() && (config.enableLividColorText || config.enableLividColorTitle || config.enableLividColorGlow || config.enableLividColorBoundingBox) && !inBoss) {
+            String unformatted = Formatting.strip(text.getString());
+
+            inBoss = unformatted.equals("[BOSS] Livid: Welcome, you've arrived right on time. I am Livid, the Master of Shadows.");
+        }
+    }
 }
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
index 095c5d10..da6e0226 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
@@ -1,6 +1,7 @@
 package de.hysky.skyblocker.skyblock.entity;
 
 import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.dungeon.LividColor;
 import de.hysky.skyblocker.utils.Utils;
 import de.hysky.skyblocker.utils.render.FrustumUtils;
 import de.hysky.skyblocker.utils.render.RenderHelper;
@@ -31,6 +32,7 @@ public class MobBoundingBoxes {
 
 			return switch (entity) {
 				case PlayerEntity _p when name.equals("Lost Adventurer") || name.equals("Shadow Assassin") || name.equals("Diamond Guy") -> SkyblockerConfigManager.get().dungeons.starredMobBoundingBoxes;
+				case PlayerEntity p when LividColor.LIVID_NAMES.contains(name) -> LividColor.shouldDrawBoundingBox(name);
 				case ArmorStandEntity _armorStand -> false;
 
 				// Regular Mobs
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 984ef321..b57e4801 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -113,6 +113,8 @@
   "skyblocker.config.dungeons.livid": "Livid (F5/M5)",
   "skyblocker.config.dungeons.livid.enableLividColorGlow": "Enable Livid Color Glow",
   "skyblocker.config.dungeons.livid.enableLividColorGlow.@Tooltip": "Applies the glowing effect to the correct Livid in F5/M5.",
+  "skyblocker.config.dungeons.livid.enableLividColorBoundingBox": "Enable Livid Color Bounding Box",
+  "skyblocker.config.dungeons.livid.enableLividColorBoundingBox.@Tooltip": "Applies a bounding box to the correct Livid in F5/M5.",
   "skyblocker.config.dungeons.livid.enableLividColorText": "Enable Livid Color Text",
   "skyblocker.config.dungeons.livid.enableLividColorText.@Tooltip": "Send the livid color in the chat during the Livid boss fight.",
   "skyblocker.config.dungeons.livid.enableLividColorTitle": "Enable Livid Color Title",
-- 
cgit 


From ba87c7ab14633102861a1d88838820635a3e9b4c Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Sun, 30 Jun 2024 17:27:03 +0200
Subject: Update QuickNavButton.java

---
 .../java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java   | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

(limited to 'src/main/java/de')

diff --git a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
index 21574fd8..75c25e58 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
@@ -23,7 +23,7 @@ public class QuickNavButton extends ClickableWidget {
     private final String command;
     private final ItemStack icon;
 
-    private static final long TOGGLE_DURATION = 250;
+    private static final long TOGGLE_DURATION = 1000;
     private long toggleTime;
 
     private float alpha = 1.0f;
@@ -134,6 +134,5 @@ public class QuickNavButton extends ClickableWidget {
     }
 
     @Override
-    protected void appendClickableNarrations(NarrationMessageBuilder builder) {
-    }
+    protected void appendClickableNarrations(NarrationMessageBuilder builder) {}
 }
-- 
cgit 


From 1763cae9785d001a64672511fab5f63026ca8048 Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Sun, 30 Jun 2024 17:27:11 +0200
Subject: Update LividColor.java

---
 .../de/hysky/skyblocker/skyblock/dungeon/LividColor.java | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

(limited to 'src/main/java/de')

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 1032baf4..5b8e6347 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -6,7 +6,6 @@ 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 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;
@@ -16,7 +15,6 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.entity.effect.StatusEffects;
 import net.minecraft.registry.Registries;
 import net.minecraft.text.MutableText;
-import net.minecraft.text.Text;
 import net.minecraft.util.Formatting;
 import net.minecraft.util.math.BlockPos;
 
@@ -50,14 +48,12 @@ public class LividColor {
     public static final DungeonsConfig.Livid CONFIG = SkyblockerConfigManager.get().dungeons.livid;
     private static Formatting color;
     private static Block lastColor = Blocks.AIR;
-    private static boolean inBoss = false;
 
     private static boolean isInitialized = false;
     private static final long OFFSET_DURATION = 2000;
     private static long toggleTime = 0;
 
     public static void init() {
-        ClientReceiveMessageEvents.GAME.register(LividColor::onChatMessage);
         ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> LividColor.reset());
         WorldRenderEvents.AFTER_ENTITIES.register(LividColor::update);
     }
@@ -68,7 +64,7 @@ public class LividColor {
 
         MinecraftClient client = MinecraftClient.getInstance();
 
-        if (!(Utils.isInDungeons() && inBoss && client.player != null && client.world != null)) return;
+        if (!(Utils.isInDungeons() && DungeonManager.isInBoss() && client.player != null && client.world != null)) return;
 
         Block currentColor = client.world.getBlockState(new BlockPos(5, 110, 42)).getBlock();
         if (!(WOOL_TO_FORMATTING.containsKey(currentColor) && !currentColor.equals(lastColor))) return;
@@ -117,18 +113,8 @@ public class LividColor {
     }
 
     private static void reset() {
-        inBoss = false;
         lastColor = Blocks.AIR;
         toggleTime = 0;
         isInitialized = false;
     }
-
-    private static void onChatMessage(Text text, boolean overlay) {
-        DungeonsConfig.Livid config = SkyblockerConfigManager.get().dungeons.livid;
-        if (Utils.isInDungeons() && (config.enableLividColorText || config.enableLividColorTitle || config.enableLividColorGlow || config.enableLividColorBoundingBox) && !inBoss) {
-            String unformatted = Formatting.strip(text.getString());
-
-            inBoss = unformatted.equals("[BOSS] Livid: Welcome, you've arrived right on time. I am Livid, the Master of Shadows.");
-        }
-    }
 }
-- 
cgit 


From 17639832d16a6de342c8ba2129cb5e7070643763 Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Wed, 3 Jul 2024 23:15:08 +0200
Subject: solid color option for livid

I didnt get working the hovertext for quicknav because of the z height. stupid z height. I will look into that after my im back from my trip.
---
 .../de/hysky/skyblocker/config/categories/DungeonsCategory.java   | 8 ++++++++
 .../java/de/hysky/skyblocker/config/configs/DungeonsConfig.java   | 3 +++
 .../java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java     | 4 +++-
 src/main/resources/assets/skyblocker/lang/en_us.json              | 2 ++
 4 files changed, 16 insertions(+), 1 deletion(-)

(limited to 'src/main/java/de')

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 20e3860c..3365cf4e 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -201,6 +201,14 @@ public class DungeonsCategory {
                 .group(OptionGroup.createBuilder()
                         .name(Text.translatable("skyblocker.config.dungeons.livid"))
                         .collapsed(true)
+                        .option(Option.<Boolean>createBuilder()
+                                .name(Text.translatable("skyblocker.config.dungeons.livid.enableSolidColor"))
+                                .description(OptionDescription.of(Text.translatable("skyblocker.config.dungeons.livid.enableSolidColor.@Tooltip")))
+                                .binding(defaults.dungeons.livid.enableSolidColor,
+                                        () -> config.dungeons.livid.enableSolidColor,
+                                        newValue -> config.dungeons.livid.enableSolidColor = newValue)
+                                .controller(ConfigUtils::createBooleanController)
+                                .build())
                         .option(Option.<Boolean>createBuilder()
                                 .name(Text.translatable("skyblocker.config.dungeons.livid.enableLividColorGlow"))
                                 .description(OptionDescription.of(Text.translatable("skyblocker.config.dungeons.livid.enableLividColorGlow.@Tooltip")))
diff --git a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
index 6b46be32..6a622ae6 100644
--- a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java
@@ -111,6 +111,9 @@ public class DungeonsConfig {
     }
 
     public static class Livid {
+        @SerialEntry
+        public boolean enableSolidColor = false;
+
         @SerialEntry
         public boolean enableLividColorGlow = 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 5b8e6347..15d0d6dd 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -109,7 +109,9 @@ public class LividColor {
 
     @SuppressWarnings("DataFlowIssue")
     public static int getGlowColor(String name) {
-        return LIVID_TO_FORMATTING.containsKey(name) ? LIVID_TO_FORMATTING.get(name).getColorValue() : Formatting.WHITE.getColorValue();
+        if (SkyblockerConfigManager.get().dungeons.livid.enableSolidColor) return Formatting.RED.getColorValue();
+        if (LIVID_TO_FORMATTING.containsKey(name)) return LIVID_TO_FORMATTING.get(name).getColorValue();
+        return Formatting.WHITE.getColorValue();
     }
 
     private static void reset() {
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index b57e4801..8d3cdcf8 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -111,6 +111,8 @@
   "skyblocker.config.dungeons.hideSoulweaverSkulls.@Tooltip": "Hides the Haunted Skulls spawned that are spawned as a result of using Soulweaver Gloves.",
 
   "skyblocker.config.dungeons.livid": "Livid (F5/M5)",
+  "skyblocker.config.dungeons.livid.enableSolidColor": "Enable Glow and/or Bounding use same color",
+  "skyblocker.config.dungeons.livid.enableSolidColor.@Tooltip": "Instead of Livid color an Red color is Shown",
   "skyblocker.config.dungeons.livid.enableLividColorGlow": "Enable Livid Color Glow",
   "skyblocker.config.dungeons.livid.enableLividColorGlow.@Tooltip": "Applies the glowing effect to the correct Livid in F5/M5.",
   "skyblocker.config.dungeons.livid.enableLividColorBoundingBox": "Enable Livid Color Bounding Box",
-- 
cgit 


From 7918e2102865bc804b25a20aa8caafd4765b54ad Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Tue, 23 Jul 2024 00:02:36 +0200
Subject: fix skyblock recipe
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

thx to nea and vic we have our recipes back

Co-Authored-By: viciscat <51047087+viciscat@users.noreply.github.com>
Co-Authored-By: Linnea Gräf <nea@nea.moe>
---
 gradle.properties                                        |  2 +-
 .../compatibility/emi/SkyblockerEMIPlugin.java           |  2 +-
 .../java/de/hysky/skyblocker/utils/NEURepoManager.java   | 16 ++++++++++++++++
 3 files changed, 18 insertions(+), 2 deletions(-)

(limited to 'src/main/java/de')

diff --git a/gradle.properties b/gradle.properties
index e97585c9..0e359e1d 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -21,7 +21,7 @@ mod_menu_version = 11.0.0-beta.1
 ## REI (https://modrinth.com/mod/rei/versions?l=fabric)
 rei_version = 13.0.666
 ## EMI (https://modrinth.com/mod/emi/versions)
-emi_version = 1.0.22+1.20.2
+emi_version = 1.1.10+1.21
 
 # Minecraft and Related Libraries
 ## McDev Annotations (https://central.sonatype.com/artifact/com.demonwav.mcdev/annotations)
diff --git a/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java
index c02300ec..9d5a2a46 100644
--- a/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java
+++ b/src/main/java/de/hysky/skyblocker/compatibility/emi/SkyblockerEMIPlugin.java
@@ -24,7 +24,7 @@ public class SkyblockerEMIPlugin implements EmiPlugin {
     public void register(EmiRegistry registry) {
         ItemRepository.getItemsStream().map(EmiStack::of).forEach(emiStack -> {
             registry.addEmiStack(emiStack);
-            registry.setDefaultComparison(emiStack, Comparison.compareNbt());
+            registry.setDefaultComparison(emiStack, Comparison.compareComponents());
         });
         registry.addCategory(SKYBLOCK);
         registry.addWorkstation(SKYBLOCK, EmiStack.of(Items.CRAFTING_TABLE));
diff --git a/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java b/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java
index f8716ca4..a86adc2b 100644
--- a/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java
+++ b/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.utils;
 
 import com.mojang.brigadier.Command;
 import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.events.SkyblockEvents;
 import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
 import de.hysky.skyblocker.utils.scheduler.Scheduler;
 import io.github.moulberry.repo.NEURepository;
@@ -9,6 +10,7 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.network.packet.s2c.play.SynchronizeRecipesS2CPacket;
 import net.minecraft.text.Text;
 import org.apache.commons.lang3.function.Consumers;
 import org.eclipse.jgit.api.Git;
@@ -49,6 +51,20 @@ public class NEURepoManager {
                         }))
                 )
         );
+        SkyblockEvents.JOIN.register(NEURepoManager::load);
+    }
+
+    private static void load() {
+        MinecraftClient client = MinecraftClient.getInstance();
+        if (client.world != null && client.getNetworkHandler() != null) {
+            SynchronizeRecipesS2CPacket packet = new SynchronizeRecipesS2CPacket(List.of());
+
+            try {
+                client.getNetworkHandler().onSynchronizeRecipes(packet);
+            } catch (Exception e) {
+                LOGGER.info("[Skyblocker] recipe sync error" , e);
+            }
+        }
     }
 
     public static boolean isLoading() {
-- 
cgit 


From a26143be386e78094d9a32e0d2c70439afd56369 Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Tue, 23 Jul 2024 00:04:02 +0200
Subject: nukekubi head fix

---
 src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

(limited to 'src/main/java/de')

diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
index 81e328ca..d1a7b83c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
@@ -123,14 +123,15 @@ public class MobGlow {
 	}
 
 	private static boolean isNukekubiHead(ArmorStandEntity entity) {
+		boolean armorfound = false;
 		for (ItemStack armorItem : entity.getArmorItems()) {
 			// eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3 is texture id for the nukekubi head,
 			// compare against it to exclusively find armorstands that are nukekubi heads
 			// get the texture of the nukekubi head item itself and compare it
 			String texture = ItemUtils.getHeadTexture(armorItem);
 
-			return texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=");
+			armorfound |= texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=");
 		}
-		return false;
+		return armorfound;
 	}
 }
-- 
cgit 


From 646eaeee8a30b4edf82b2b401e930adf6627f65e Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Tue, 23 Jul 2024 00:04:37 +0200
Subject: livid fix

now it will only highlight the correct livid also after the "change"
---
 .../skyblocker/skyblock/dungeon/LividColor.java    | 23 +++++++++++++++++++++-
 .../skyblock/entity/MobBoundingBoxes.java          |  2 +-
 .../hysky/skyblocker/skyblock/entity/MobGlow.java  |  7 +++----
 3 files changed, 26 insertions(+), 6 deletions(-)

(limited to 'src/main/java/de')

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 15d0d6dd..d360ae2e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -46,10 +46,12 @@ public class LividColor {
     );
     public static final Set<String> LIVID_NAMES = Set.copyOf(LIVID_TO_FORMATTING.keySet());
     public static final DungeonsConfig.Livid CONFIG = SkyblockerConfigManager.get().dungeons.livid;
-    private static Formatting color;
+    private static Formatting color = Formatting.AQUA;
     private static Block lastColor = Blocks.AIR;
+    private static int lividID = 0;
 
     private static boolean isInitialized = false;
+    private static boolean originLividFound = false;
     private static final long OFFSET_DURATION = 2000;
     private static long toggleTime = 0;
 
@@ -74,6 +76,18 @@ public class LividColor {
             isInitialized = true;
         } else if (isInitialized && System.currentTimeMillis() - toggleTime >= OFFSET_DURATION) {
             onLividColorFound(client, currentColor);
+            if (!originLividFound) {
+                String lividName = LIVID_TO_FORMATTING.entrySet().stream()
+                        .filter(entry -> entry.getValue() == color)
+                        .map(Map.Entry::getKey)
+                        .findFirst()
+                        .orElse("unknown");
+                client.world.getPlayers().stream()
+                        .filter(entity -> entity.getName().getString().equals(lividName))
+                        .findFirst()
+                        .ifPresent(entity -> lividID = entity.getId());
+                originLividFound = true;
+            }
             lastColor = currentColor;
         }
 
@@ -114,9 +128,16 @@ public class LividColor {
         return Formatting.WHITE.getColorValue();
     }
 
+    public static int getLividID(){
+        return lividID;
+    }
+
     private static void reset() {
         lastColor = Blocks.AIR;
         toggleTime = 0;
         isInitialized = false;
+        originLividFound = false;
+        lividID = 0;
+        color = Formatting.AQUA;
     }
 }
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
index da6e0226..b7b3e0e0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
@@ -32,7 +32,7 @@ public class MobBoundingBoxes {
 
 			return switch (entity) {
 				case PlayerEntity _p when name.equals("Lost Adventurer") || name.equals("Shadow Assassin") || name.equals("Diamond Guy") -> SkyblockerConfigManager.get().dungeons.starredMobBoundingBoxes;
-				case PlayerEntity p when LividColor.LIVID_NAMES.contains(name) -> LividColor.shouldDrawBoundingBox(name);
+				case PlayerEntity p when entity.getId() == LividColor.getLividID() -> LividColor.shouldDrawBoundingBox(name);
 				case ArmorStandEntity _armorStand -> false;
 
 				// Regular Mobs
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
index d1a7b83c..1322004e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
@@ -36,7 +36,7 @@ public class MobGlow {
 				return switch (entity) {
 					// Minibosses
 					case PlayerEntity p when name.equals("Lost Adventurer") || name.equals("Shadow Assassin") || name.equals("Diamond Guy") -> SkyblockerConfigManager.get().dungeons.starredMobGlow;
-					case PlayerEntity p when LividColor.LIVID_NAMES.contains(name) -> LividColor.shouldGlow(name);
+					case PlayerEntity p when entity.getId() == LividColor.getLividID() -> LividColor.shouldGlow(name);
 
 					// Bats
 					case BatEntity b -> SkyblockerConfigManager.get().dungeons.starredMobGlow || SkyblockerConfigManager.get().dungeons.starredMobBoundingBoxes;
@@ -49,7 +49,6 @@ public class MobGlow {
 				};
 			}
 
-
 			return switch (entity) {
 				// Rift
 				case PlayerEntity p when Utils.isInTheRift() && !entity.isInvisible() && name.equals("Blobbercyst ") -> SkyblockerConfigManager.get().otherLocations.rift.blobbercystGlow;
@@ -111,11 +110,11 @@ public class MobGlow {
 			case PlayerEntity p when name.equals("Lost Adventurer") -> 0xfee15c;
 			case PlayerEntity p when name.equals("Shadow Assassin") -> 0x5b2cb2;
 			case PlayerEntity p when name.equals("Diamond Guy") -> 0x57c2f7;
-			case PlayerEntity p when LividColor.LIVID_NAMES.contains(name) -> LividColor.getGlowColor(name);
+			case PlayerEntity p when entity.getId() == LividColor.getLividID() -> LividColor.getGlowColor(name);
 			case PlayerEntity p when name.equals("Blobbercyst ") -> Formatting.GREEN.getColorValue();
 
 			case EndermanEntity enderman when TheEnd.isSpecialZealot(enderman) -> Formatting.RED.getColorValue();
-			case ArmorStandEntity armorStand when isNukekubiHead(armorStand) -> 0x990099;
+			case ArmorStandEntity armorStand when isNukekubiHead(armorStand) -> Formatting.GREEN.getColorValue();
 			case ZombieEntity zombie when Utils.isInCrimson() && DojoManager.inArena -> DojoManager.getColor();
 
 			default -> 0xf57738;
-- 
cgit 


From 68fb922f878d72178ef1317d88d1807244201fcb Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Tue, 23 Jul 2024 00:05:38 +0200
Subject: Half-Eaten Carrot

add "Half-Eaten Carrot" Collection support
---
 .../hysky/skyblocker/skyblock/item/slottext/adders/CollectionAdder.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/main/java/de')

diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CollectionAdder.java b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CollectionAdder.java
index 66d7f6e1..5b020fd4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CollectionAdder.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/slottext/adders/CollectionAdder.java
@@ -15,7 +15,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 public class CollectionAdder extends SimpleSlotTextAdder {
-    private static final Pattern COLLECTION = Pattern.compile("^[\\w ]+ (?<level>[IVXLCDM]+)$");
+    private static final Pattern COLLECTION = Pattern.compile("^[\\w -]+ (?<level>[IVXLCDM]+)$");
 
     public CollectionAdder() {
         super("^\\w+ Collections");
-- 
cgit 


From 9f7fdb2a5e37907e7e4a5dd2400748b4a8e5f991 Mon Sep 17 00:00:00 2001
From: Yasin <a.piri@hotmail.de>
Date: Tue, 23 Jul 2024 23:30:32 +0200
Subject: Update NEURepoManager.java

im not good at naming methods. like Minato naming jutsus
---
 src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

(limited to 'src/main/java/de')

diff --git a/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java b/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java
index a86adc2b..0ecfe623 100644
--- a/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java
+++ b/src/main/java/de/hysky/skyblocker/utils/NEURepoManager.java
@@ -51,10 +51,13 @@ public class NEURepoManager {
                         }))
                 )
         );
-        SkyblockEvents.JOIN.register(NEURepoManager::load);
+        SkyblockEvents.JOIN.register(NEURepoManager::handleRecipeSynchronization);
     }
 
-    private static void load() {
+    /**
+     * load the recipe manually because Hypixel doesn't send any vanilla recipes to the client
+     */
+    private static void handleRecipeSynchronization() {
         MinecraftClient client = MinecraftClient.getInstance();
         if (client.world != null && client.getNetworkHandler() != null) {
             SynchronizeRecipesS2CPacket packet = new SynchronizeRecipesS2CPacket(List.of());
-- 
cgit 


From 8f27eb76273fe8424d44c2a1e08e45454e76b77c Mon Sep 17 00:00:00 2001
From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Date: Fri, 26 Jul 2024 14:53:46 +0800
Subject: Refactor LividColor and Nukekubi head detection

---
 .../skyblocker/skyblock/dungeon/LividColor.java    | 23 +++++++++++----------
 .../skyblock/entity/MobBoundingBoxes.java          |  2 +-
 .../hysky/skyblocker/skyblock/entity/MobGlow.java  | 24 ++++++++++------------
 3 files changed, 24 insertions(+), 25 deletions(-)

(limited to 'src/main/java/de')

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 d360ae2e..b6a035aa 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -19,7 +19,6 @@ import net.minecraft.util.Formatting;
 import net.minecraft.util.math.BlockPos;
 
 import java.util.Map;
-import java.util.Set;
 
 public class LividColor {
     private static final Map<Block, Formatting> WOOL_TO_FORMATTING = Map.of(
@@ -44,14 +43,16 @@ public class LividColor {
             "Doctor Livid", Formatting.GRAY,
             "Vendetta Livid", Formatting.WHITE
     );
-    public static final Set<String> LIVID_NAMES = Set.copyOf(LIVID_TO_FORMATTING.keySet());
     public static final DungeonsConfig.Livid CONFIG = SkyblockerConfigManager.get().dungeons.livid;
     private static Formatting color = Formatting.AQUA;
     private static Block lastColor = Blocks.AIR;
-    private static int lividID = 0;
 
     private static boolean isInitialized = false;
-    private static boolean originLividFound = false;
+    /**
+     * The correct livid may change color in M5, so we use the entity id to track the correct original livid.
+     */
+    private static boolean correctLividIdFound = false;
+    private static int correctLividId = 0;
     private static final long OFFSET_DURATION = 2000;
     private static long toggleTime = 0;
 
@@ -76,7 +77,7 @@ public class LividColor {
             isInitialized = true;
         } else if (isInitialized && System.currentTimeMillis() - toggleTime >= OFFSET_DURATION) {
             onLividColorFound(client, currentColor);
-            if (!originLividFound) {
+            if (!correctLividIdFound) {
                 String lividName = LIVID_TO_FORMATTING.entrySet().stream()
                         .filter(entry -> entry.getValue() == color)
                         .map(Map.Entry::getKey)
@@ -85,8 +86,8 @@ public class LividColor {
                 client.world.getPlayers().stream()
                         .filter(entity -> entity.getName().getString().equals(lividName))
                         .findFirst()
-                        .ifPresent(entity -> lividID = entity.getId());
-                originLividFound = true;
+                        .ifPresent(entity -> correctLividId = entity.getId());
+                correctLividIdFound = true;
             }
             lastColor = currentColor;
         }
@@ -128,16 +129,16 @@ public class LividColor {
         return Formatting.WHITE.getColorValue();
     }
 
-    public static int getLividID(){
-        return lividID;
+    public static int getCorrectLividId() {
+        return correctLividId;
     }
 
     private static void reset() {
         lastColor = Blocks.AIR;
         toggleTime = 0;
         isInitialized = false;
-        originLividFound = false;
-        lividID = 0;
+        correctLividIdFound = false;
+        correctLividId = 0;
         color = Formatting.AQUA;
     }
 }
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
index b7b3e0e0..f005fc06 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobBoundingBoxes.java
@@ -32,7 +32,7 @@ public class MobBoundingBoxes {
 
 			return switch (entity) {
 				case PlayerEntity _p when name.equals("Lost Adventurer") || name.equals("Shadow Assassin") || name.equals("Diamond Guy") -> SkyblockerConfigManager.get().dungeons.starredMobBoundingBoxes;
-				case PlayerEntity p when entity.getId() == LividColor.getLividID() -> LividColor.shouldDrawBoundingBox(name);
+				case PlayerEntity p when entity.getId() == LividColor.getCorrectLividId() -> LividColor.shouldDrawBoundingBox(name);
 				case ArmorStandEntity _armorStand -> false;
 
 				// Regular Mobs
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
index 1322004e..0438a8ce 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
@@ -1,5 +1,6 @@
 package de.hysky.skyblocker.skyblock.entity;
 
+import com.google.common.collect.Streams;
 import de.hysky.skyblocker.config.SkyblockerConfigManager;
 import de.hysky.skyblocker.skyblock.crimson.dojo.DojoManager;
 import de.hysky.skyblocker.skyblock.dungeon.LividColor;
@@ -14,7 +15,6 @@ import net.minecraft.entity.mob.EndermanEntity;
 import net.minecraft.entity.mob.ZombieEntity;
 import net.minecraft.entity.passive.BatEntity;
 import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.item.ItemStack;
 import net.minecraft.predicate.entity.EntityPredicates;
 import net.minecraft.util.Formatting;
 import net.minecraft.util.math.Box;
@@ -23,6 +23,10 @@ import net.minecraft.world.World;
 import java.util.List;
 
 public class MobGlow {
+	/**
+	 * The Nukekubi head texture id is eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3.
+	 */
+	public static final String NUKEKUBI_HEAD_TEXTURE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=";
 
 	public static boolean shouldMobGlow(Entity entity) {
 		Box box = entity.getBoundingBox();
@@ -36,7 +40,7 @@ public class MobGlow {
 				return switch (entity) {
 					// Minibosses
 					case PlayerEntity p when name.equals("Lost Adventurer") || name.equals("Shadow Assassin") || name.equals("Diamond Guy") -> SkyblockerConfigManager.get().dungeons.starredMobGlow;
-					case PlayerEntity p when entity.getId() == LividColor.getLividID() -> LividColor.shouldGlow(name);
+					case PlayerEntity p when entity.getId() == LividColor.getCorrectLividId() -> LividColor.shouldGlow(name);
 
 					// Bats
 					case BatEntity b -> SkyblockerConfigManager.get().dungeons.starredMobGlow || SkyblockerConfigManager.get().dungeons.starredMobBoundingBoxes;
@@ -110,7 +114,7 @@ public class MobGlow {
 			case PlayerEntity p when name.equals("Lost Adventurer") -> 0xfee15c;
 			case PlayerEntity p when name.equals("Shadow Assassin") -> 0x5b2cb2;
 			case PlayerEntity p when name.equals("Diamond Guy") -> 0x57c2f7;
-			case PlayerEntity p when entity.getId() == LividColor.getLividID() -> LividColor.getGlowColor(name);
+			case PlayerEntity p when entity.getId() == LividColor.getCorrectLividId() -> LividColor.getGlowColor(name);
 			case PlayerEntity p when name.equals("Blobbercyst ") -> Formatting.GREEN.getColorValue();
 
 			case EndermanEntity enderman when TheEnd.isSpecialZealot(enderman) -> Formatting.RED.getColorValue();
@@ -121,16 +125,10 @@ public class MobGlow {
 		};
 	}
 
+	/**
+	 * Compares the armor items of an armor stand to the Nukekubi head texture to determine if it is a Nukekubi head.
+	 */
 	private static boolean isNukekubiHead(ArmorStandEntity entity) {
-		boolean armorfound = false;
-		for (ItemStack armorItem : entity.getArmorItems()) {
-			// eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3 is texture id for the nukekubi head,
-			// compare against it to exclusively find armorstands that are nukekubi heads
-			// get the texture of the nukekubi head item itself and compare it
-			String texture = ItemUtils.getHeadTexture(armorItem);
-
-			armorfound |= texture.contains("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=");
-		}
-		return armorfound;
+		return Streams.stream(entity.getArmorItems()).map(ItemUtils::getHeadTexture).anyMatch(headTexture -> headTexture.contains(NUKEKUBI_HEAD_TEXTURE));
 	}
 }
-- 
cgit