From d24bac4d728d8ea9264e08934fb863771bcca5e2 Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Fri, 26 Apr 2024 20:00:18 -0400
Subject: Pluralize the mixin and accessor packages

---
 .../skyblocker/config/SkyblockerConfigManager.java |   2 +-
 .../mixin/AbstractInventoryScreenMixin.java        |  19 --
 .../de/hysky/skyblocker/mixin/BatEntityMixin.java  |  21 --
 .../mixin/ClientPlayNetworkHandlerMixin.java       | 106 ---------
 .../skyblocker/mixin/ClientPlayerEntityMixin.java  |  82 -------
 .../mixin/CommandTreeS2CPacketMixin.java           |  21 --
 .../skyblocker/mixin/ComponentHolderMixin.java     |  39 ----
 .../hysky/skyblocker/mixin/DataTrackerMixin.java   |  51 ----
 .../hysky/skyblocker/mixin/DrawContextMixin.java   |  71 ------
 .../skyblocker/mixin/DyedColorComponentMixin.java  |  34 ---
 .../mixin/EntityRenderDispatcherMixin.java         |  18 --
 .../hysky/skyblocker/mixin/FarmlandBlockMixin.java |  37 ---
 .../mixin/GenericContainerScreenHandlerMixin.java  |  38 ---
 .../hysky/skyblocker/mixin/HandledScreenMixin.java | 258 ---------------------
 .../mixin/HandledScreenProviderMixin.java          | 101 --------
 .../de/hysky/skyblocker/mixin/InGameHudMixin.java  | 144 ------------
 .../mixin/InGameOverlayRendererMixin.java          |  22 --
 .../skyblocker/mixin/InventoryScreenMixin.java     |  18 --
 .../de/hysky/skyblocker/mixin/ItemStackMixin.java  |  98 --------
 .../de/hysky/skyblocker/mixin/LeverBlockMixin.java |  29 ---
 .../mixin/LivingEntityRendererMixin.java           |  18 --
 .../skyblocker/mixin/MinecraftClientMixin.java     |  60 -----
 .../java/de/hysky/skyblocker/mixin/MouseMixin.java |  19 --
 .../skyblocker/mixin/PlayerInventoryMixin.java     |  21 --
 .../hysky/skyblocker/mixin/PlayerListHudMixin.java |  57 -----
 .../skyblocker/mixin/PlayerSkinProviderMixin.java  |  18 --
 .../skyblocker/mixin/PlayerSkinTextureMixin.java   |  40 ----
 .../de/hysky/skyblocker/mixin/RenderFishMixin.java |  26 ---
 .../de/hysky/skyblocker/mixin/ScoreboardMixin.java |  16 --
 .../SocialInteractionsPlayerListWidgetMixin.java   |  24 --
 .../de/hysky/skyblocker/mixin/WindowMixin.java     |  16 --
 .../hysky/skyblocker/mixin/WorldRendererMixin.java |  48 ----
 .../YggdrasilMinecraftSessionServiceMixin.java     |  20 --
 .../mixin/YggdrasilServicesKeyInfoMixin.java       |  60 -----
 .../accessor/BeaconBlockEntityRendererInvoker.java |  16 --
 .../mixin/accessor/DrawContextInvoker.java         |  21 --
 .../mixin/accessor/EndermanEntityAccessor.java     |  17 --
 .../skyblocker/mixin/accessor/FrustumInvoker.java  |  14 --
 .../mixin/accessor/HandledScreenAccessor.java      |  26 ---
 .../mixin/accessor/MessageHandlerAccessor.java     |  14 --
 .../mixin/accessor/PlayerListHudAccessor.java      |  16 --
 .../mixin/accessor/RecipeBookWidgetAccessor.java   |  15 --
 .../skyblocker/mixin/accessor/ScreenAccessor.java  |  14 --
 .../mixin/accessor/SkullBlockEntityAccessor.java   |  18 --
 .../skyblocker/mixin/accessor/SlotAccessor.java    |  17 --
 .../mixin/accessor/WorldRendererAccessor.java      |  13 --
 .../mixin/discordipc/ConnectionMixin.java          |  20 --
 .../mixins/AbstractInventoryScreenMixin.java       |  19 ++
 .../de/hysky/skyblocker/mixins/BatEntityMixin.java |  21 ++
 .../mixins/ClientPlayNetworkHandlerMixin.java      | 106 +++++++++
 .../skyblocker/mixins/ClientPlayerEntityMixin.java |  82 +++++++
 .../mixins/CommandTreeS2CPacketMixin.java          |  21 ++
 .../skyblocker/mixins/ComponentHolderMixin.java    |  39 ++++
 .../hysky/skyblocker/mixins/DataTrackerMixin.java  |  51 ++++
 .../hysky/skyblocker/mixins/DrawContextMixin.java  |  71 ++++++
 .../skyblocker/mixins/DyedColorComponentMixin.java |  34 +++
 .../mixins/EntityRenderDispatcherMixin.java        |  18 ++
 .../skyblocker/mixins/FarmlandBlockMixin.java      |  37 +++
 .../mixins/GenericContainerScreenHandlerMixin.java |  38 +++
 .../skyblocker/mixins/HandledScreenMixin.java      | 258 +++++++++++++++++++++
 .../mixins/HandledScreenProviderMixin.java         | 101 ++++++++
 .../de/hysky/skyblocker/mixins/InGameHudMixin.java | 144 ++++++++++++
 .../mixins/InGameOverlayRendererMixin.java         |  22 ++
 .../skyblocker/mixins/InventoryScreenMixin.java    |  18 ++
 .../de/hysky/skyblocker/mixins/ItemStackMixin.java |  98 ++++++++
 .../hysky/skyblocker/mixins/LeverBlockMixin.java   |  29 +++
 .../mixins/LivingEntityRendererMixin.java          |  18 ++
 .../skyblocker/mixins/MinecraftClientMixin.java    |  60 +++++
 .../de/hysky/skyblocker/mixins/MouseMixin.java     |  19 ++
 .../skyblocker/mixins/PlayerInventoryMixin.java    |  21 ++
 .../skyblocker/mixins/PlayerListHudMixin.java      |  57 +++++
 .../skyblocker/mixins/PlayerSkinProviderMixin.java |  18 ++
 .../skyblocker/mixins/PlayerSkinTextureMixin.java  |  40 ++++
 .../hysky/skyblocker/mixins/RenderFishMixin.java   |  26 +++
 .../hysky/skyblocker/mixins/ScoreboardMixin.java   |  16 ++
 .../SocialInteractionsPlayerListWidgetMixin.java   |  24 ++
 .../de/hysky/skyblocker/mixins/WindowMixin.java    |  16 ++
 .../skyblocker/mixins/WorldRendererMixin.java      |  48 ++++
 .../YggdrasilMinecraftSessionServiceMixin.java     |  20 ++
 .../mixins/YggdrasilServicesKeyInfoMixin.java      |  60 +++++
 .../BeaconBlockEntityRendererInvoker.java          |  16 ++
 .../mixins/accessors/DrawContextInvoker.java       |  21 ++
 .../mixins/accessors/EndermanEntityAccessor.java   |  17 ++
 .../mixins/accessors/FrustumInvoker.java           |  14 ++
 .../mixins/accessors/HandledScreenAccessor.java    |  26 +++
 .../mixins/accessors/MessageHandlerAccessor.java   |  14 ++
 .../mixins/accessors/PlayerListHudAccessor.java    |  16 ++
 .../mixins/accessors/RecipeBookWidgetAccessor.java |  15 ++
 .../mixins/accessors/ScreenAccessor.java           |  14 ++
 .../mixins/accessors/SkullBlockEntityAccessor.java |  18 ++
 .../skyblocker/mixins/accessors/SlotAccessor.java  |  17 ++
 .../mixins/accessors/WorldRendererAccessor.java    |  13 ++
 .../mixins/discordipc/ConnectionMixin.java         |  20 ++
 .../de/hysky/skyblocker/skyblock/ChestValue.java   |   4 +-
 .../skyblocker/skyblock/WarpAutocomplete.java      |   2 +-
 .../auction/AuctionHouseScreenHandler.java         |   2 +-
 .../skyblocker/skyblock/chat/ChatRulesHandler.java |   2 +-
 .../skyblock/dungeon/partyfinder/PartyEntry.java   |   2 +-
 .../item/tooltip/CompactorDeletorPreview.java      |   2 +-
 .../skyblock/itemlist/ItemListWidget.java          |   3 +-
 .../skyblock/quicknav/QuickNavButton.java          |   2 +-
 .../skyblock/tabhud/util/PlayerListMgr.java        |   2 +-
 .../skyblocker/utils/render/FrustumUtils.java      |   4 +-
 .../skyblocker/utils/render/RenderHelper.java      |   4 +-
 .../utils/render/gui/AbstractCustomHypixelGUI.java |   2 +-
 .../utils/render/gui/ContainerSolverManager.java   |   3 +-
 src/main/resources/skyblocker.mixins.json          |  26 +--
 107 files changed, 1903 insertions(+), 1901 deletions(-)
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java
 delete mode 100644 src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java
 create mode 100644 src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java

(limited to 'src/main')

diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
index 70578822..31f1357d 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
@@ -4,7 +4,7 @@ import com.google.gson.FieldNamingPolicy;
 import com.mojang.brigadier.builder.LiteralArgumentBuilder;
 import de.hysky.skyblocker.SkyblockerMod;
 import de.hysky.skyblocker.config.categories.*;
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
 import de.hysky.skyblocker.utils.scheduler.Scheduler;
 import dev.isxander.yacl3.api.YetAnotherConfigLib;
 import dev.isxander.yacl3.config.v2.api.ConfigClassHandler;
diff --git a/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java
deleted file mode 100644
index d0d4b9f7..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/AbstractInventoryScreenMixin.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen;
-
-@Mixin(AbstractInventoryScreen.class)
-public class AbstractInventoryScreenMixin {
-
-	@Inject(method = "drawStatusEffects", at = @At("HEAD"), cancellable = true)
-	private void skyblocker$dontDrawStatusEffects(CallbackInfo ci) {
-		if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java
deleted file mode 100644
index fa97e546..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/BatEntityMixin.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
-import net.minecraft.entity.EntityType;
-import net.minecraft.entity.mob.AmbientEntity;
-import net.minecraft.entity.passive.BatEntity;
-import net.minecraft.world.World;
-import org.spongepowered.asm.mixin.Mixin;
-
-@Mixin(BatEntity.class)
-public abstract class BatEntityMixin extends AmbientEntity {
-    protected BatEntityMixin(EntityType<? extends AmbientEntity> entityType, World world) {
-        super(entityType, world);
-    }
-
-    @Override
-    public void onRemoved() {
-        super.onRemoved();
-        DungeonManager.onBatRemoved(this);
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
deleted file mode 100644
index b3471972..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-import com.llamalad7.mixinextras.sugar.Local;
-import de.hysky.skyblocker.skyblock.FishingHelper;
-import de.hysky.skyblocker.skyblock.dungeon.DungeonScore;
-import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
-import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;
-import de.hysky.skyblocker.skyblock.end.EnderNodes;
-import de.hysky.skyblocker.skyblock.end.TheEnd;
-import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual;
-import de.hysky.skyblocker.utils.SlayerUtils;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.Blocks;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.client.world.ClientWorld;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityStatuses;
-import net.minecraft.entity.ItemEntity;
-import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket;
-import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket;
-import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
-import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
-import net.minecraft.util.Identifier;
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(ClientPlayNetworkHandler.class)
-public abstract class ClientPlayNetworkHandlerMixin {
-    @Shadow
-    private ClientWorld world;
-
-    @Inject(method = "onBlockUpdate", at = @At("RETURN"))
-    private void skyblocker$onBlockUpdate(BlockUpdateS2CPacket packet, CallbackInfo ci) {
-        if (Utils.isInTheEnd() && SlayerUtils.isInSlayer()) {
-            BeaconHighlighter.beaconPositions.remove(packet.getPos());
-            if (packet.getState().isOf(Blocks.BEACON)) {
-                BeaconHighlighter.beaconPositions.add(packet.getPos());
-            }
-        }
-    }
-
-    @Inject(method = "method_37472", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V"))
-    private void skyblocker$onItemDestroy(int entityId, CallbackInfo ci) {
-        if (world.getEntityById(entityId) instanceof ItemEntity itemEntity) {
-            DungeonManager.onItemPickup(itemEntity);
-        }
-    }
-
-    @ModifyVariable(method = "onItemPickupAnimation", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V", ordinal = 0))
-    private ItemEntity skyblocker$onItemPickup(ItemEntity itemEntity) {
-        DungeonManager.onItemPickup(itemEntity);
-        return itemEntity;
-    }
-
-    @WrapWithCondition(method = "onEntityPassengersSet", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;)V", remap = false))
-    private boolean skyblocker$cancelEntityPassengersWarning(Logger instance, String msg) {
-        return !Utils.isOnHypixel();
-    }
-
-    @WrapWithCondition(method = "onPlayerList", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
-    private boolean skyblocker$cancelPlayerListWarning(Logger instance, String format, Object arg1, Object arg2) {
-        return !Utils.isOnHypixel();
-    }
-
-    @Inject(method = "onPlaySound", at = @At("RETURN"))
-    private void skyblocker$onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) {
-        FishingHelper.onSound(packet);
-    }
-
-    @WrapWithCondition(method = "warnOnUnknownPayload", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
-    private boolean skyblocker$dropBadlionPacketWarnings(Logger instance, String message, Object identifier) {
-        return !(Utils.isOnHypixel() && ((Identifier) identifier).getNamespace().equals("badlion"));
-    }
-
-    @WrapWithCondition(method = { "onScoreboardScoreUpdate", "onScoreboardScoreReset" }, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
-    private boolean skyblocker$cancelUnknownScoreboardObjectiveWarnings(Logger instance, String message, Object objectiveName) {
-        return !Utils.isOnHypixel();
-    }
-
-    @WrapWithCondition(method = "onTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;[Ljava/lang/Object;)V", remap = false))
-    private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object... arg) {
-        return !Utils.isOnHypixel();
-    }
-
-    @Inject(method = "onParticle", at = @At("RETURN"))
-    private void skyblocker$onParticle(ParticleS2CPacket packet, CallbackInfo ci) {
-        MythologicalRitual.onParticle(packet);
-        EnderNodes.onParticle(packet);
-    }
-
-    @ModifyExpressionValue(method = "onEntityStatus", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/EntityStatusS2CPacket;getEntity(Lnet/minecraft/world/World;)Lnet/minecraft/entity/Entity;"))
-    private Entity skyblocker$onEntityDeath(Entity entity, @Local(argsOnly = true) EntityStatusS2CPacket packet) {
-        if (packet.getStatus() == EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES) {
-            DungeonScore.handleEntityDeath(entity);
-            TheEnd.onEntityDeath(entity);
-        }
-        return entity;
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java
deleted file mode 100644
index 8fb2fda4..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayerEntityMixin.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.mojang.authlib.GameProfile;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen;
-import de.hysky.skyblocker.skyblock.auction.EditBidPopup;
-import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
-import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.skyblock.rift.HealingMelonIndicator;
-import de.hysky.skyblocker.skyblock.searchoverlay.OverlayScreen;
-import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.entity.SignBlockEntity;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.network.AbstractClientPlayerEntity;
-import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.client.world.ClientWorld;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-@Mixin(ClientPlayerEntity.class)
-public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
-    @Shadow
-    @Final
-    protected MinecraftClient client;
-
-    public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) {
-        super(world, profile);
-    }
-
-    @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true)
-    public void skyblocker$dropSelectedItem(CallbackInfoReturnable<Boolean> cir) {
-        if (Utils.isOnSkyblock() && (ItemProtection.isItemProtected(this.getInventory().getMainHandStack()) || HotbarSlotLock.isLocked(this.getInventory().selectedSlot))
-                && (!SkyblockerConfigManager.get().locations.dungeons.allowDroppingProtectedItems || !Utils.isInDungeons())) {
-            cir.setReturnValue(false);
-        }
-    }
-
-    @Inject(method = "updateHealth", at = @At("RETURN"))
-    public void skyblocker$updateHealth(CallbackInfo ci) {
-        HealingMelonIndicator.updateHealth();
-    }
-
-    @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true)
-    public void skyblocker$redirectEditSignScreen(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) {
-        // Fancy Party Finder
-        if (!PartyFinderScreen.isInKuudraPartyFinder && client.currentScreen instanceof PartyFinderScreen partyFinderScreen && !partyFinderScreen.isAborted() && sign.getText(front).getMessage(3, false).getString().toLowerCase().contains("level")) {
-            partyFinderScreen.updateSign(sign, front);
-            callbackInfo.cancel();
-            return;
-        }
-
-        if (client.currentScreen instanceof AuctionViewScreen auctionViewScreen) {
-            this.client.setScreen(new EditBidPopup(auctionViewScreen, sign, front, auctionViewScreen.minBid));
-            callbackInfo.cancel();
-        }
-
-        // Search Overlay
-        if (client.currentScreen != null) {
-            if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) {
-                if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) {
-                    SearchOverManager.updateSign(sign, front, true);
-                    client.setScreen(new OverlayScreen(Text.of("")));
-                    callbackInfo.cancel();
-                }
-            } else if (SkyblockerConfigManager.get().general.searchOverlay.enableBazaar && client.currentScreen.getTitle().getString().toLowerCase().contains("bazaar")) {
-                if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) {
-                    SearchOverManager.updateSign(sign, front, false);
-                    client.setScreen(new OverlayScreen(Text.of("")));
-                    callbackInfo.cancel();
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java b/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java
deleted file mode 100644
index 1cc1b8de..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/CommandTreeS2CPacketMixin.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.mojang.brigadier.tree.CommandNode;
-import com.mojang.brigadier.tree.LiteralCommandNode;
-import de.hysky.skyblocker.skyblock.WarpAutocomplete;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.command.CommandSource;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(targets = "net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket$CommandTree")
-public class CommandTreeS2CPacketMixin {
-    @ModifyExpressionValue(method = "getNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/CommandTreeS2CPacket$CommandTree;getNode(I)Lcom/mojang/brigadier/tree/CommandNode;", ordinal = 1))
-    public CommandNode<? extends CommandSource> modifyCommandSuggestions(CommandNode<CommandSource> original) {
-        if (Utils.isOnHypixel() && WarpAutocomplete.commandNode != null && original instanceof LiteralCommandNode<?> literalCommandNode && literalCommandNode.getLiteral().equals("warp")) {
-            return WarpAutocomplete.commandNode;
-        }
-        return original;
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java
deleted file mode 100644
index c8c57d6d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ComponentHolderMixin.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.CustomArmorTrims;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import net.minecraft.component.ComponentHolder;
-import net.minecraft.component.DataComponentType;
-import net.minecraft.component.DataComponentTypes;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.trim.ArmorTrim;
-
-@Mixin(ComponentHolder.class)
-public interface ComponentHolderMixin {
-
-	@SuppressWarnings("unchecked")
-	@ModifyReturnValue(method = "get", at = @At("RETURN"))
-	private <T> T skyblocker$customArmorTrims(T original, DataComponentType<? extends T> dataComponentType) {
-		if (Utils.isOnSkyblock() && ((Object) this) instanceof ItemStack stack) {
-			if (dataComponentType == DataComponentTypes.TRIM) {
-				Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customTrims = SkyblockerConfigManager.get().general.customArmorTrims;
-				String itemUuid = ItemUtils.getItemUuid(stack);
-
-				if (customTrims.containsKey(itemUuid)) {
-					CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid);
-					return (T) CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, (ArmorTrim) original);
-				}
-			}
-		}
-
-		return original;
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
deleted file mode 100644
index a0b5de84..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/DataTrackerMixin.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.sugar.Local;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.mixin.accessor.EndermanEntityAccessor;
-import de.hysky.skyblocker.skyblock.entity.MobGlow;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.BlockState;
-import net.minecraft.block.Blocks;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.data.DataTracked;
-import net.minecraft.entity.data.DataTracker;
-import net.minecraft.sound.SoundEvents;
-import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import java.util.Optional;
-
-@Mixin(DataTracker.class)
-public abstract class DataTrackerMixin {
-    @Shadow
-    @Final
-    private DataTracked trackedEntity;
-
-    @SuppressWarnings("ConstantValue")
-    @Inject(method = "writeUpdatedEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;copyToFrom(Lnet/minecraft/entity/data/DataTracker$Entry;Lnet/minecraft/entity/data/DataTracker$SerializedEntry;)V"))
-    private <T> void skyblocker$onWriteUpdatedEntries(CallbackInfo ci, @Local DataTracker.Entry<T> entry, @Local DataTracker.SerializedEntry<T> serializedEntry) {
-        if (Utils.isInTheEnd() && SkyblockerConfigManager.get().slayer.endermanSlayer.enableYangGlyphsNotification && entry.getData() == EndermanEntityAccessor.getCARRIED_BLOCK() && entry.get() instanceof Optional<?> value && value.isPresent() && value.get() instanceof BlockState state && state.isOf(Blocks.BEACON) && ((Optional<?>) serializedEntry.value()).isEmpty()) {
-            MinecraftClient client = MinecraftClient.getInstance();
-            if (trackedEntity instanceof Entity entity && MobGlow.getArmorStands(entity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) {
-                client.inGameHud.setTitleTicks(5, 20, 10);
-                client.inGameHud.setTitle(Text.literal("Yang Glyph!").formatted(Formatting.RED));
-                client.player.playSound(SoundEvents.BLOCK_NOTE_BLOCK_PLING.value(), 100f, 0.1f);
-            }
-        }
-    }
-
-    @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"})
-    @Inject(method = "copyToFrom", at = @At(value = "NEW", target = "Ljava/lang/IllegalStateException;"), cancellable = true)
-    public void skyblocker$ignoreInvalidDataExceptions(CallbackInfo ci) {
-        //These exceptions cause annoying small lag spikes for some reason
-        if (Utils.isOnHypixel()) ci.cancel();
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java
deleted file mode 100644
index 6654bae6..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/DrawContextMixin.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.llamalad7.mixinextras.sugar.Local;
-import com.llamalad7.mixinextras.sugar.ref.LocalRef;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.AttributeShards;
-import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NbtCompound;
-import net.minecraft.util.Formatting;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(DrawContext.class)
-public abstract class DrawContextMixin {
-    @Shadow
-    @Final
-    private MatrixStack matrices;
-
-    @Shadow
-    public abstract int drawText(TextRenderer textRenderer, @Nullable String text, int x, int y, int color, boolean shadow);
-
-    @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD"))
-    private void skyblocker$renderAttributeShardDisplay(CallbackInfo ci, @Local(argsOnly = true) TextRenderer textRenderer, @Local(argsOnly = true) ItemStack stack, @Local(argsOnly = true, ordinal = 0) int x, @Local(argsOnly = true, ordinal = 1) int y, @Local(argsOnly = true) LocalRef<String> countOverride) {
-        if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return;
-
-        if (Utils.isOnSkyblock()) {
-            NbtCompound customData = ItemUtils.getCustomData(stack);
-
-            if (ItemUtils.getItemId(stack).equals("ATTRIBUTE_SHARD")) {
-                NbtCompound attributesTag = customData.getCompound("attributes");
-                String[] attributes = attributesTag.getKeys().toArray(String[]::new);
-
-                if (attributes.length != 0) {
-                    String attributeId = attributes[0];
-                    int attributeLevel = attributesTag.getInt(attributeId);
-
-                    //Set item count
-                    countOverride.set(Integer.toString(attributeLevel));
-
-                    //Draw the attribute name
-                    this.matrices.push();
-                    this.matrices.translate(0f, 0f, 200f);
-
-                    String attributeInitials = AttributeShards.getShortName(attributeId);
-
-                    this.drawText(textRenderer, attributeInitials, x, y, Formatting.AQUA.getColorValue(), true);
-
-                    this.matrices.pop();
-                }
-            }
-        }
-    }
-
-    @ModifyExpressionValue(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V",
-            at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/ItemCooldownManager;getCooldownProgress(Lnet/minecraft/item/Item;F)F"))
-    private float skyblocker$modifyItemCooldown(float cooldownProgress, @Local(argsOnly = true) ItemStack stack) {
-        return Utils.isOnSkyblock() && ItemCooldowns.isOnCooldown(stack) ? ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent() : cooldownProgress;
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java b/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java
deleted file mode 100644
index 2682fc6d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/DyedColorComponentMixin.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import com.llamalad7.mixinextras.sugar.Local;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.component.type.DyedColorComponent;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.math.ColorHelper;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(DyedColorComponent.class)
-public record DyedColorComponentMixin() {
-
-	@ModifyReturnValue(method = "getColor", at = @At("RETURN"))
-	private static int skyblocker$customDyeColor(int originalColor, @Local(argsOnly = true) ItemStack stack) {
-		if (Utils.isOnSkyblock()) {
-			String itemUuid = ItemUtils.getItemUuid(stack);
-
-			if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) {
-				return ColorHelper.Argb.fullAlpha(CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid)));
-			}
-
-			return ColorHelper.Argb.fullAlpha(SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor));
-		}
-
-		return originalColor;
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
deleted file mode 100644
index 5cf88588..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/EntityRenderDispatcherMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.debug.Debug;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.render.entity.EntityRenderDispatcher;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.decoration.ArmorStandEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(EntityRenderDispatcher.class)
-public class EntityRenderDispatcherMixin {
-    @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isInvisible()Z", ordinal = 1))
-    private <E extends Entity> boolean skyblocker$armorStandHitboxVisible(boolean invisible, E entity) {
-        return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled()) && invisible;
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java
deleted file mode 100644
index 84467c9b..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/FarmlandBlockMixin.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockState;
-import net.minecraft.block.FarmlandBlock;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.shape.VoxelShape;
-import net.minecraft.util.shape.VoxelShapes;
-import net.minecraft.world.BlockView;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(FarmlandBlock.class)
-public abstract class FarmlandBlockMixin extends Block {
-    @Shadow
-    @Final
-    protected static VoxelShape SHAPE;
-
-    protected FarmlandBlockMixin(Settings settings) {
-        super(settings);
-    }
-
-    @ModifyReturnValue(method = "getOutlineShape", at = @At("RETURN"))
-    private VoxelShape skyblocker$replaceOutlineShape(VoxelShape original) {
-        return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original;
-    }
-
-    @Override
-    public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) {
-        return SHAPE;
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java
deleted file mode 100644
index a7843ba2..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/GenericContainerScreenHandlerMixin.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.item.ItemStack;
-import net.minecraft.screen.GenericContainerScreenHandler;
-import net.minecraft.screen.ScreenHandler;
-import net.minecraft.screen.ScreenHandlerType;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Mixin;
-
-import java.util.List;
-
-@Mixin(GenericContainerScreenHandler.class)
-public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler {
-    protected GenericContainerScreenHandlerMixin(@Nullable ScreenHandlerType<?> type, int syncId) {
-        super(type, syncId);
-    }
-
-    @Override
-    public void setStackInSlot(int slot, int revision, ItemStack stack) {
-        super.setStackInSlot(slot, revision, stack);
-        SkyblockerMod.getInstance().containerSolverManager.markDirty();
-        if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) {
-            screen.markDirty();
-        }
-    }
-
-    @Override
-    public void updateSlotStacks(int revision, List<ItemStack> stacks, ItemStack cursorStack) {
-        super.updateSlotStacks(revision, stacks, cursorStack);
-        SkyblockerMod.getInstance().containerSolverManager.markDirty();
-        if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) {
-            screen.markDirty();
-        }
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
deleted file mode 100644
index 4d4dae83..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenMixin.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.sugar.Local;
-import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver;
-import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver;
-import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver;
-import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver;
-import de.hysky.skyblocker.skyblock.garden.VisitorHelper;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
-import de.hysky.skyblocker.skyblock.item.WikiLookup;
-import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
-import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.ingame.HandledScreen;
-import net.minecraft.inventory.SimpleInventory;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
-import net.minecraft.screen.GenericContainerScreenHandler;
-import net.minecraft.screen.ScreenHandler;
-import net.minecraft.screen.slot.Slot;
-import net.minecraft.screen.slot.SlotActionType;
-import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-
-@Mixin(HandledScreen.class)
-public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen {
-    /**
-     * This is the slot id returned for when a click is outside the screen's bounds
-     */
-    @Unique
-    private static final int OUT_OF_BOUNDS_SLOT = -999;
-
-    @Unique
-    private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
-
-    @Unique
-    private static final Set<String> FILLER_ITEMS = Set.of(
-            " ", // Empty menu item
-            "Locked Page",
-            "Quick Crafting Slot",
-            "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax
-            "Locked Backpack Slot 3",
-            "Locked Backpack Slot 4",
-            "Locked Backpack Slot 5",
-            "Locked Backpack Slot 6",
-            "Locked Backpack Slot 7",
-            "Locked Backpack Slot 8",
-            "Locked Backpack Slot 9",
-            "Locked Backpack Slot 10",
-            "Locked Backpack Slot 11",
-            "Locked Backpack Slot 12",
-            "Locked Backpack Slot 13",
-            "Locked Backpack Slot 14",
-            "Locked Backpack Slot 15",
-            "Locked Backpack Slot 16",
-            "Locked Backpack Slot 17",
-            "Locked Backpack Slot 18",
-            "Preparing"
-    );
-
-    @Shadow
-    @Nullable
-    protected Slot focusedSlot;
-
-    @Shadow
-    @Final
-    protected T handler;
-
-    protected HandledScreenMixin(Text title) {
-        super(title);
-    }
-
-    @Inject(at = @At("HEAD"), method = "keyPressed")
-    public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) {
-        if (this.client != null && this.focusedSlot != null && keyCode != 256) {
-            //wiki lookup
-            if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) {
-                WikiLookup.openWiki(this.focusedSlot, client.player);
-            }
-            //item protection
-            if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) {
-                ItemProtection.handleKeyPressed(this.focusedSlot.getStack());
-            }
-        }
-    }
-
-    @Inject(at = @At("HEAD"), method = "mouseClicked")
-    public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
-        if (SkyblockerConfigManager.get().locations.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar")))
-            VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer);
-    }
-
-    @SuppressWarnings("DataFlowIssue")
-    // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method.
-    @Inject(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V"), cancellable = true)
-    public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci, @Local(ordinal = 0) ItemStack stack) {
-        if (!Utils.isOnSkyblock()) return;
-
-        // Hide Empty Tooltips
-        if (SkyblockerConfigManager.get().general.hideEmptyTooltips && stack.getName().getString().equals(" ")) {
-            ci.cancel();
-        }
-
-        // Backpack Preview
-        boolean shiftDown = SkyblockerConfigManager.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown();
-        if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) {
-            ci.cancel();
-        }
-
-        // Compactor Preview
-        if (SkyblockerConfigManager.get().general.compactorDeletorPreview) {
-            Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack));
-            if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) {
-                ci.cancel();
-            }
-        }
-    }
-
-    @ModifyVariable(method = "drawMouseoverTooltip", at = @At(value = "LOAD", ordinal = 0))
-    private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(ItemStack stack) {
-        return skyblocker$experimentSolvers$getStack(focusedSlot, stack);
-    }
-
-    @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0)
-    private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) {
-        return skyblocker$experimentSolvers$getStack(slot, stack);
-    }
-
-    /**
-     * Redirects getStack calls to account for different stacks in experiment solvers.
-     */
-    @Unique
-    private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) {
-        ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver();
-        if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) {
-            ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex());
-            return itemStack == null ? stack : itemStack;
-        }
-        return stack;
-    }
-
-    /**
-     * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks)
-     * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item
-     * 
-     * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)}
-     */
-    @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true)
-    private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) {
-        if (!Utils.isOnSkyblock()) return;
-
-        // Item Protection
-        // When you try and drop the item by picking it up then clicking outside the screen
-        if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) {
-            ci.cancel();
-            return;
-        }
-
-        if (slot == null) return;
-        String title = getTitle().getString();
-        ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack());
-        ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver();
-
-        // Prevent clicks on filler items
-        if (SkyblockerConfigManager.get().general.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) &&
-                // Allow clicks in Ultrasequencer and Superpairs
-                (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().general.experiments.enableUltrasequencerSolver)) {
-            ci.cancel();
-            return;
-        }
-        // Item Protection
-        // When you click your drop key while hovering over an item
-        if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) {
-            ci.cancel();
-            return;
-        }
-        // Prevent salvaging
-        if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) {
-            ci.cancel();
-            return;
-        }
-        if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) {
-            VisitorHelper.onSlotClick(slot, slotId, title);
-
-            // Prevent selling to NPC shops
-            ItemStack sellStack = this.handler.slots.get(49).getStack();
-            if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) {
-                if (slotId != 49 && ItemProtection.isItemProtected(stack)) {
-                    ci.cancel();
-                    return;
-                }
-            }
-        }
-
-        if (currentSolver != null) {
-            SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack);
-        }
-
-        // Experiment Solvers
-        if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) {
-            switch (experimentSolver) {
-                case ChronomatronSolver chronomatronSolver -> {
-                    Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal());
-                    if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) {
-                        chronomatronSolver.setState(ExperimentSolver.State.END);
-                    }
-                }
-
-                case SuperpairsSolver superpairsSolver -> {
-                    superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex());
-                    superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY);
-                }
-
-                case UltrasequencerSolver ultrasequencerSolver when slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot() -> {
-                    int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1;
-                    ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END));
-                }
-
-                default -> { /*Do Nothing*/ }
-            }
-        }
-    }
-
-    @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V"))
-    private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) {
-        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds)
-            ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y);
-        // Item protection
-        if (ItemProtection.isItemProtected(slot.getStack())) {
-            RenderSystem.enableBlend();
-            context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16);
-            RenderSystem.disableBlend();
-        }
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
deleted file mode 100644
index 40534a43..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/HandledScreenProviderMixin.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.auction.AuctionBrowserScreen;
-import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler;
-import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen;
-import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
-import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler;
-import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.ingame.HandledScreens;
-import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.screen.GenericContainerScreenHandler;
-import net.minecraft.screen.ScreenHandler;
-import net.minecraft.screen.ScreenHandlerType;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(HandledScreens.Provider.class)
-public interface HandledScreenProviderMixin<T extends ScreenHandler> {
-
-	@Inject(method = "open", at = @At("HEAD"), cancellable = true)
-	default void skyblocker$open(Text name, ScreenHandlerType<T> type, MinecraftClient client, int id, CallbackInfo ci) {
-		ClientPlayerEntity player = client.player;
-		if (player == null) return;
-		if (!Utils.isOnSkyblock()) return;
-		T screenHandler = type.create(id, player.getInventory());
-		String nameLowercase = name.getString().toLowerCase();
-
-		switch (screenHandler) {
-			// Better party finder
-			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.betterPartyFinder && PartyFinderScreen.possibleInventoryNames.contains(nameLowercase) -> {
-				if (client.currentScreen != null) {
-					String lowerCase = client.currentScreen.getTitle().getString().toLowerCase();
-					if (lowerCase.contains("group builder")) return;
-					if (lowerCase.contains("select tier")) {
-						PartyFinderScreen.isInKuudraPartyFinder = true;
-					} else if (lowerCase.contains("catacombs")) {
-						PartyFinderScreen.isInKuudraPartyFinder = false;
-					}
-				}
-
-				if (PartyFinderScreen.isInKuudraPartyFinder) return;
-				client.player.currentScreenHandler = containerScreenHandler;
-
-				switch (client.currentScreen) {
-					case PartyFinderScreen screen -> screen.updateHandler(containerScreenHandler, name);
-					case null, default -> client.setScreen(new PartyFinderScreen(containerScreenHandler, player.getInventory(), name));
-				}
-
-				ci.cancel();
-			}
-
-			// Fancy AH
-			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("auctions browser") || nameLowercase.contains("auctions: ")) -> {
-				AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, false);
-				client.player.currentScreenHandler = auctionHouseScreenHandler;
-
-				switch (client.currentScreen) {
-					case AuctionBrowserScreen auctionBrowserScreen -> auctionBrowserScreen.changeHandler(auctionHouseScreenHandler);
-					case null, default -> client.setScreen(new AuctionBrowserScreen(auctionHouseScreenHandler, client.player.getInventory()));
-				}
-
-				ci.cancel();
-			}
-
-			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && nameLowercase.contains("auction view") -> {
-				AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, true);
-				client.player.currentScreenHandler = auctionHouseScreenHandler;
-
-				switch (client.currentScreen) {
-					case AuctionViewScreen auctionViewScreen -> auctionViewScreen.changeHandler(auctionHouseScreenHandler);
-					case null, default -> client.setScreen(new AuctionViewScreen(auctionHouseScreenHandler, client.player.getInventory(), name));
-				}
-
-				ci.cancel();
-			}
-
-			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("confirm purchase") || nameLowercase.contains("confirm bid")) && client.currentScreen instanceof AuctionViewScreen auctionViewScreen -> {
-				client.setScreen(auctionViewScreen.getConfirmPurchasePopup(name));
-				client.player.currentScreenHandler = containerScreenHandler;
-				ci.cancel();
-			}
-
-			// Fancy crafting table
-			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyCraftingTable && name.getString().toLowerCase().contains("craft item") -> {
-				SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory());
-				client.player.currentScreenHandler = skyblockCraftingTableScreenHandler;
-				client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item")));
-				ci.cancel();
-			}
-
-			case null, default -> {}
-		}
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
deleted file mode 100644
index 3b419cc5..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.llamalad7.mixinextras.sugar.Local;
-import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
-import de.hysky.skyblocker.events.HudRenderEvents;
-import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
-import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
-import de.hysky.skyblocker.utils.Utils;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.LayeredDrawer;
-import net.minecraft.client.gui.hud.InGameHud;
-import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.item.ItemStack;
-import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
-
-import java.util.function.Supplier;
-import java.util.regex.Pattern;
-
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyArg;
-import org.spongepowered.asm.mixin.injection.Slice;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Environment(EnvType.CLIENT)
-@Mixin(InGameHud.class)
-public abstract class InGameHudMixin {
-    @Unique
-    private static final Supplier<Identifier> SLOT_LOCK_ICON = () -> SkyblockerConfigManager.get().general.itemProtection.slotLockStyle.tex;
-
-    @Unique
-    private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
-    @Unique
-    private static final Pattern DICER_TITLE_BLACKLIST = Pattern.compile(".+? DROP!");
-
-    @Unique
-    private final FancyStatusBars statusBars = new FancyStatusBars();
-
-    @Shadow
-    @Final
-    private MinecraftClient client;
-
-    @Shadow
-    @Final
-    private LayeredDrawer layeredDrawer;
-
-    @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0))
-    public void skyblocker$renderHotbarItemLockOrRarityBg(CallbackInfo ci, @Local(argsOnly = true) DrawContext context, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) {
-        if (Utils.isOnSkyblock()) {
-            // slot lock
-            if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().main.get(index), context, x, y);
-            if (HotbarSlotLock.isLocked(index)) {
-                RenderSystem.enableBlend();
-                context.drawTexture(SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16);
-                RenderSystem.disableBlend();
-            }
-            //item protection
-            if (ItemProtection.isItemProtected(player.getInventory().main.get(index))) {
-                RenderSystem.enableBlend();
-                context.drawTexture(ITEM_PROTECTION, x, y, 0, 0, 16, 16, 16, 16);
-                RenderSystem.disableBlend();
-            }
-        }
-    }
-
-    @Inject(method = { "renderExperienceBar", "renderExperienceLevel" }, at = @At("HEAD"), cancellable = true)
-    private void skyblocker$renderExperienceBar(CallbackInfo ci) {
-        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift())
-            ci.cancel();
-    }
-
-    @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true)
-    private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) {
-        if (!Utils.isOnSkyblock())
-            return;
-        if (statusBars.render(context, context.getScaledWindowWidth(), context.getScaledWindowHeight()))
-            ci.cancel();
-    }
-
-    @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true)
-    private void skyblocker$renderMountHealth(CallbackInfo ci) {
-        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift())
-            ci.cancel();
-    }
-
-    @Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"), cancellable = true)
-    private void skyblocker$dontRenderStatusEffects(CallbackInfo ci) {
-        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
-    }
-
-    @ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getAttackCooldownProgress(F)F"))
-    private float skyblocker$modifyAttackIndicatorCooldown(float cooldownProgress) {
-        if (Utils.isOnSkyblock() && client.player != null) {
-            ItemStack stack = client.player.getMainHandStack();
-            if (ItemCooldowns.isOnCooldown(stack)) {
-                return ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent();
-            }
-        }
-
-        return cooldownProgress;
-    }
-
-    @Inject(method = "setTitle", at = @At("HEAD"), cancellable = true)
-    private void skyblocker$dicerTitlePrevent(Text title, CallbackInfo ci) {
-        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.garden.dicerTitlePrevent && title != null && DICER_TITLE_BLACKLIST.matcher(title.getString()).matches()) {
-            ci.cancel();
-        }
-    }
-
-    @ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 2))
-    private LayeredDrawer.Layer skyblocker$afterMainHud(LayeredDrawer.Layer mainHudLayer) {
-        return (context, tickDelta) -> {
-        	mainHudLayer.render(context, tickDelta);
-        	HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta);
-        };
-    }
-
-    @ModifyArg(method = "<init>", slice = @Slice(from = @At(value = "NEW", target = "Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 1)), at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 5))
-    private LayeredDrawer.Layer skyblocker$beforeChat(LayeredDrawer.Layer beforeChatLayer) {
-        return (context, tickDelta) -> {
-        	HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta);
-        	beforeChatLayer.render(context, tickDelta);
-        };
-    }
-
-    @Inject(method = "<init>", at = @At("TAIL"))
-    private void skyblocker$afterDrawersInitialized(CallbackInfo ci) {
-        this.layeredDrawer.addLayer(HudRenderEvents.LAST.invoker()::onRender);
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
deleted file mode 100644
index 4775ce2d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/InGameOverlayRendererMixin.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import net.minecraft.client.gui.hud.InGameOverlayRenderer;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.ModifyArg;
-
-@Mixin(InGameOverlayRenderer.class)
-public class InGameOverlayRendererMixin {
-
-    @ModifyArg(method = "renderFireOverlay", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/BufferBuilder;vertex(Lorg/joml/Matrix4f;FFF)Lnet/minecraft/client/render/VertexConsumer;"))
-    private static float configureFlameHeight(float y) {
-        return y - (0.5f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameHeight / 200.0f));
-    }
-
-    @ModifyArg(method = "renderFireOverlay", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;color(FFFF)Lnet/minecraft/client/render/VertexConsumer;"))
-    private static float configureFlameOpacity(float opacity) {
-        return opacity - (0.8f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameOpacity / 125.0f));
-    }
-
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java
deleted file mode 100644
index 8e6b9230..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/InventoryScreenMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.gui.screen.ingame.InventoryScreen;
-import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(InventoryScreen.class)
-public abstract class InventoryScreenMixin {
-    @ModifyExpressionValue(method = "<init>", at = @At(value = "NEW", target = "net/minecraft/client/gui/screen/recipebook/RecipeBookWidget"))
-    private RecipeBookWidget skyblocker$replaceRecipeBook(RecipeBookWidget original) {
-        return SkyblockerConfigManager.get().general.itemList.enableItemList && Utils.isOnSkyblock() ? new ItemListWidget() : original;
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
deleted file mode 100644
index 39184852..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ItemStackMixin.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.ItemUtils;
-import de.hysky.skyblocker.utils.Utils;
-import it.unimi.dsi.fastutil.ints.IntIntPair;
-import net.minecraft.item.ItemStack;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(ItemStack.class)
-public abstract class ItemStackMixin {
-
-	@Shadow
-	public abstract int getDamage();
-
-	@Shadow
-	public abstract void setDamage(int damage);
-
-	@Unique
-	private int maxDamage;
-
-	@ModifyReturnValue(method = "getName", at = @At("RETURN"))
-	private Text skyblocker$customItemNames(Text original) {
-		if (Utils.isOnSkyblock()) {
-			return SkyblockerConfigManager.get().general.customItemNames.getOrDefault(ItemUtils.getItemUuid((ItemStack) (Object) this), original);
-		}
-
-		return original;
-	}
-
-	/**
-	 * Updates the durability of this item stack every tick when in the inventory.
-	 */
-	@Inject(method = "inventoryTick", at = @At("TAIL"))
-	private void skyblocker$updateDamage(CallbackInfo ci) {
-		if (!skyblocker$shouldProcess()) {
-			return;
-		}
-		skyblocker$getAndCacheDurability();
-	}
-
-	@ModifyReturnValue(method = "getDamage", at = @At("RETURN"))
-	private int skyblocker$handleDamage(int original) {
-		// If the durability is already calculated, the original value should be the damage
-		if (!skyblocker$shouldProcess() || maxDamage != 0) {
-			return original;
-		}
-		return skyblocker$getAndCacheDurability() ? getDamage() : original;
-	}
-
-	@ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN"))
-	private int skyblocker$handleMaxDamage(int original) {
-		if (!skyblocker$shouldProcess()) {
-			return original;
-		}
-		// If the max damage is already calculated, return it
-		if (maxDamage != 0) {
-			return maxDamage;
-		}
-		return skyblocker$getAndCacheDurability() ? maxDamage : original;
-	}
-
-	@ModifyReturnValue(method = "isDamageable", at = @At("RETURN"))
-	private boolean skyblocker$handleDamageable(boolean original) {
-		return skyblocker$shouldProcess() || original;
-	}
-
-	@ModifyReturnValue(method = "isDamaged", at = @At("RETURN"))
-	private boolean skyblocker$handleDamaged(boolean original) {
-		return skyblocker$shouldProcess() || original;
-	}
-
-	@Unique
-	private boolean skyblocker$shouldProcess() {
-		return Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel && ItemUtils.hasCustomDurability((ItemStack) (Object) this);
-	}
-
-	@Unique
-	private boolean skyblocker$getAndCacheDurability() {
-		// Calculate the durability
-		IntIntPair durability = ItemUtils.getDurability((ItemStack) (Object) this);
-		// Return if calculating the durability failed
-		if (durability == null) {
-			return false;
-		}
-		// Saves the calculated durability
-		maxDamage = durability.rightInt();
-		setDamage(durability.rightInt() - durability.leftInt());
-		return true;
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java
deleted file mode 100644
index a1cfe44b..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/LeverBlockMixin.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.dungeon.OldLever;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.block.BlockState;
-import net.minecraft.block.LeverBlock;
-import net.minecraft.block.WallMountedBlock;
-import net.minecraft.util.shape.VoxelShape;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-import com.llamalad7.mixinextras.sugar.Local;
-
-@Mixin(LeverBlock.class)
-public abstract class LeverBlockMixin extends WallMountedBlock {
-    protected LeverBlockMixin(Settings settings) {
-        super(settings);
-    }
-
-    @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true)
-    public void skyblocker$onGetOutlineShape(CallbackInfoReturnable<VoxelShape> cir, @Local(argsOnly = true) BlockState state) {
-        if (Utils.isOnSkyblock()) {
-            VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING));
-            if (shape != null) cir.setReturnValue(shape);
-        }
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
deleted file mode 100644
index cf927f0c..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/LivingEntityRendererMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.debug.Debug;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.render.entity.LivingEntityRenderer;
-import net.minecraft.entity.LivingEntity;
-import net.minecraft.entity.decoration.ArmorStandEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(LivingEntityRenderer.class)
-public class LivingEntityRendererMixin {
-    @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;isVisible(Lnet/minecraft/entity/LivingEntity;)Z"))
-    private <T extends LivingEntity> boolean skyblocker$armorStandVisible(boolean visible, T entity) {
-        return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() || visible;
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
deleted file mode 100644
index a9f2ae5e..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
-import de.hysky.skyblocker.skyblock.item.ItemProtection;
-import de.hysky.skyblocker.utils.JoinWorldPlaceholderScreen;
-import de.hysky.skyblocker.utils.ReconfiguringPlaceholderScreen;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.DownloadingTerrainScreen;
-import net.minecraft.client.gui.screen.ReconfiguringScreen;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.client.network.ClientPlayerEntity;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyArg;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(MinecraftClient.class)
-public abstract class MinecraftClientMixin {
-
-    @Shadow
-    @Nullable
-    public abstract ClientPlayNetworkHandler getNetworkHandler();
-
-    @Shadow
-    @Nullable
-    public ClientPlayerEntity player;
-
-    @Inject(method = "handleInputEvents", at = @At("HEAD"))
-    public void skyblocker$handleInputEvents(CallbackInfo ci) {
-        if (Utils.isOnSkyblock()) {
-            HotbarSlotLock.handleInputEvents(player);
-            ItemProtection.handleHotbarKeyPressed(player);
-        }
-    }
-
-    //Remove Downloading Terrain Screen and Reconfiguring Screen
-    @ModifyVariable(at = @At("HEAD"), method = "setScreen", ordinal = 0, argsOnly = true)
-    public Screen modifySetScreen(Screen screen) {
-        if (Utils.isOnHypixel()) {
-            return switch (screen) {
-                case DownloadingTerrainScreen _s -> null;
-                case ReconfiguringScreen _s when this.getNetworkHandler() != null -> new ReconfiguringPlaceholderScreen(this.getNetworkHandler().getConnection());
-
-                case null, default -> screen;
-            };
-        }
-        return screen;
-    }
-
-    @ModifyArg(method = "joinWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;reset(Lnet/minecraft/client/gui/screen/Screen;)V"), index = 0)
-    private Screen modifyJoinWorld(Screen screen) {
-        return Utils.isOnSkyblock() ? new JoinWorldPlaceholderScreen() : screen;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java
deleted file mode 100644
index 33c3f487..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/MouseMixin.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import de.hysky.skyblocker.skyblock.garden.LowerSensitivity;
-import net.minecraft.client.Mouse;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(Mouse.class)
-public class MouseMixin {
-
-    @ModifyExpressionValue(method = "updateMouse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", ordinal = 0))
-    public Object skyblocker$gardenMouseLock(Object original) {
-        if (LowerSensitivity.isSensitivityLowered())
-            return -1 / 3d;
-        else return original;
-
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
deleted file mode 100644
index 4795a28b..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import de.hysky.skyblocker.skyblock.crimson.kuudra.ArrowPoisonWarning;
-import net.minecraft.entity.player.PlayerInventory;
-
-@Mixin(PlayerInventory.class)
-public class PlayerInventoryMixin {
-	@Shadow
-	public int selectedSlot;
-
-	@Inject(method = "scrollInHotbar", at = @At("TAIL"))
-	private void skyblocker$onHotbarScroll(CallbackInfo ci) {
-		ArrowPoisonWarning.tryWarn(selectedSlot);
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java
deleted file mode 100644
index 88ca7c67..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerListHudMixin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.tabhud.TabHud;
-import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
-import de.hysky.skyblocker.utils.Utils;
-import net.fabricmc.api.EnvType;
-import net.fabricmc.api.Environment;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.hud.PlayerListHud;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import com.llamalad7.mixinextras.sugar.Local;
-
-@Environment(EnvType.CLIENT)
-@Mixin(PlayerListHud.class)
-public class PlayerListHudMixin {
-    @Shadow
-    private Text footer;
-
-    @Inject(at = @At("HEAD"), method = "render", cancellable = true)
-    public void skyblocker$renderTabHud(CallbackInfo info, @Local(argsOnly = true) DrawContext context, @Local(argsOnly = true) int w) {
-        if (!Utils.isInDungeons() || !SkyblockerConfigManager.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) {
-            return;
-        }
-
-        ClientPlayNetworkHandler nwH = MinecraftClient.getInstance().getNetworkHandler();
-        if (nwH == null) {
-            return;
-        }
-
-        int h = MinecraftClient.getInstance().getWindow().getScaledHeight();
-        float scale = SkyblockerConfigManager.get().general.tabHud.tabHudScale / 100f;
-        w = (int) (w / scale);
-        h = (int) (h / scale);
-
-        PlayerListMgr.updateFooter(footer);
-
-        try {
-            ScreenMaster.render(context, w,h);
-            // Screen screen = Screen.getCorrect(w, h, footer);
-            // screen.render(context);
-            info.cancel();
-        } catch (Exception e) {
-            TabHud.LOGGER.error("[Skyblocker] Encountered unknown exception while drawing default hud", e);
-        }
-    }
-
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java
deleted file mode 100644
index b6c44072..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinProviderMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-
-import de.hysky.skyblocker.utils.Utils;
-
-@Mixin(targets = "net.minecraft.client.texture.PlayerSkinProvider$1")
-public class PlayerSkinProviderMixin {
-
-	@WrapWithCondition(method = "method_54647", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
-	private static boolean skyblocker$dontLogInvalidSignatureWarnings(Logger logger, String message, Object profileId) {
-		return !Utils.isOnHypixel();
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java
deleted file mode 100644
index 44f39d21..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/PlayerSkinTextureMixin.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.skyblock.item.PlayerHeadHashCache;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.texture.NativeImage;
-import net.minecraft.client.texture.PlayerSkinTexture;
-
-@Mixin(PlayerSkinTexture.class)
-public class PlayerSkinTextureMixin {
-	@Shadow
-	@Final
-	private String url;
-
-	@Unique
-	private boolean isSkyblockSkinTexture;
-
-	@Inject(method = "remapTexture", at = @At("HEAD"))
-	private void skyblocker$determineSkinSource(CallbackInfoReturnable<NativeImage> cir) {
-		if (Utils.isOnSkyblock()) {
-			int skinHash = PlayerHeadHashCache.getSkinHash(this.url).hashCode();
-			this.isSkyblockSkinTexture = PlayerHeadHashCache.contains(skinHash);
-		}
-	}
-
-	@WrapWithCondition(method = "remapTexture", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/PlayerSkinTexture;stripAlpha(Lnet/minecraft/client/texture/NativeImage;IIII)V"))
-	private boolean skyblocker$dontStripAlphaValues(NativeImage image, int x1, int y1, int x2, int y2) {
-		return !(SkyblockerConfigManager.get().general.dontStripSkinAlphaValues && this.isSkyblockSkinTexture);
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java b/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java
deleted file mode 100644
index e74bbaea..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/RenderFishMixin.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-
-import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.entity.FishingBobberEntityRenderer;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.entity.projectile.FishingBobberEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(FishingBobberEntityRenderer.class)
-public abstract class RenderFishMixin {
-
-    @Inject(method = "render", at = @At("HEAD"), cancellable = true)
-    private void skyblocker$render(FishingBobberEntity fishingBobberEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) {
-        //if rendered bobber is not the players and option to hide  others is enabled do not render the bobber
-        if (Utils.isOnSkyblock() && fishingBobberEntity.getPlayerOwner() != MinecraftClient.getInstance().player && SkyblockerConfigManager.get().general.fishing.hideOtherPlayersRods) {
-            ci.cancel();
-        }
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java
deleted file mode 100644
index 40b6995a..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/ScoreboardMixin.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.scoreboard.Scoreboard;
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(Scoreboard.class)
-public abstract class ScoreboardMixin {
-    @WrapWithCondition(method = "addTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
-    private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object arg) {
-        return !Utils.isOnHypixel();
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java b/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java
deleted file mode 100644
index cad7cf38..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/SocialInteractionsPlayerListWidgetMixin.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import java.util.Map;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
-import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
-
-import de.hysky.skyblocker.utils.Utils;
-import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListEntry;
-import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListWidget;
-
-@Mixin(SocialInteractionsPlayerListWidget.class)
-public class SocialInteractionsPlayerListWidgetMixin {
-
-	@WrapOperation(method = "setPlayers", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", remap = false))
-	private Object skyblocker$hideInvalidPlayers(Map<Object, Object> map, Object uuid, Object entry, Operation<Object> operation) {
-		if (Utils.isOnSkyblock() && !((SocialInteractionsPlayerListEntry) entry).getName().matches("[A-Za-z0-9_]+")) return null;
-
-		return operation.call(map, uuid, entry);
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java b/src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java
deleted file mode 100644
index 481a70a6..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/WindowMixin.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
-import net.minecraft.client.util.Window;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(Window.class)
-public class WindowMixin {
-    @Inject(method = "setScaleFactor", at = @At("TAIL"))
-    public void skyblocker$onScaleFactorChange(double scaleFactor, CallbackInfo ci) {
-        FancyStatusBars.updatePositions();
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java
deleted file mode 100644
index a24daa80..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/WorldRendererMixin.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import de.hysky.skyblocker.skyblock.dungeon.LividColor;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import com.llamalad7.mixinextras.sugar.Local;
-import com.llamalad7.mixinextras.sugar.Share;
-import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
-
-import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes;
-import de.hysky.skyblocker.skyblock.entity.MobGlow;
-import net.minecraft.client.render.WorldRenderer;
-import net.minecraft.entity.Entity;
-import org.spongepowered.asm.mixin.injection.Slice;
-
-@Mixin(WorldRenderer.class)
-public class WorldRendererMixin {
-
-	@ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"))
-	private boolean skyblocker$shouldMobGlow(boolean original, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) {
-		boolean allowGlow = LividColor.allowGlow();
-		boolean shouldGlow = MobGlow.shouldMobGlow(entity);
-		hasCustomGlow.set(shouldGlow);
-		return allowGlow && original || shouldGlow;
-	}
-
-	@ModifyVariable(method = "render",
-			slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"), to = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;setColor(IIII)V")),
-			at = @At("STORE"), ordinal = 0
-	)
-	private int skyblocker$modifyGlowColor(int color, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) {
-		return hasCustomGlow.get() ? MobGlow.getGlowColor(entity) : color;
-	}
-
-	@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderEntity(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;)V"))
-	private void skyblocker$beforeEntityIsRendered(CallbackInfo ci, @Local Entity entity) {
-		boolean shouldShowBoundingBox = MobBoundingBoxes.shouldDrawMobBoundingBox(entity);
-
-		if (shouldShowBoundingBox) {
-			MobBoundingBoxes.submitBox2BeRendered(entity.getBoundingBox(), MobBoundingBoxes.getBoxColor(entity));
-		}
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java
deleted file mode 100644
index d6863b18..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilMinecraftSessionServiceMixin.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService;
-
-import de.hysky.skyblocker.utils.Utils;
-
-@Mixin(value = YggdrasilMinecraftSessionService.class, remap = false)
-public class YggdrasilMinecraftSessionServiceMixin {
-
-	//TODO perhaps investigate if we could fix this
-	@WrapWithCondition(method = "unpackTextures", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Throwable;)V", ordinal = 0, remap = false))
-	private boolean skyblocker$dontLogIncorrectEndingByteExceptions(Logger logger, String message, Throwable throwable) {
-		return !Utils.isOnHypixel() && throwable instanceof IllegalArgumentException;
-	}
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java b/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java
deleted file mode 100644
index 5df018e4..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/YggdrasilServicesKeyInfoMixin.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package de.hysky.skyblocker.mixin;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
-import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
-import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo;
-
-import it.unimi.dsi.fastutil.ints.IntArrayList;
-import it.unimi.dsi.fastutil.ints.IntList;
-import de.hysky.skyblocker.utils.Utils;
-import org.slf4j.Logger;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-
-import java.util.Base64;
-import java.util.Map;
-
-@Mixin(value = YggdrasilServicesKeyInfo.class, remap = false)
-public class YggdrasilServicesKeyInfoMixin {
-    @Shadow
-    @Final
-    private static Logger LOGGER;
-    @Unique
-    private static final Map<String, String> REPLACEMENT_MAP = Map.of();
-    @Unique
-    private static final IntList ERRONEUS_SIGNATURE_HASHES = new IntArrayList();
-
-    @WrapOperation(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false)
-    private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature, Operation<byte[]> decode) {
-        try {
-            return decode.call(decoder, signature);
-        } catch (IllegalArgumentException e) {
-            try {
-                return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]", ""));
-            } catch (IllegalArgumentException e2) {
-                if (Utils.isOnSkyblock()) {
-                    if (REPLACEMENT_MAP.containsKey(signature)) {
-                        return decode.call(decoder, REPLACEMENT_MAP.get(signature));
-                    }
-                    int signatureHashCode = signature.hashCode();
-                    if (!ERRONEUS_SIGNATURE_HASHES.contains(signatureHashCode)) {
-                    	ERRONEUS_SIGNATURE_HASHES.add(signatureHashCode);
-                        LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode base64 string No.{}: {}", ERRONEUS_SIGNATURE_HASHES.size() - 1, signature);
-                    } else {
-                        LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode the base64 string No.{} again", ERRONEUS_SIGNATURE_HASHES.indexOf(signatureHashCode));
-                    }
-                }
-            }
-            throw e;
-        }
-    }
-
-    @WrapWithCondition(method = "validateProperty", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
-    private boolean skyblocker$dontLogFailedSignatureValidations(Logger logger, String message, Object property, Object exception) {
-        return !Utils.isOnHypixel();
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java
deleted file mode 100644
index e470cdae..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer;
-import net.minecraft.client.util.math.MatrixStack;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-@Mixin(BeaconBlockEntityRenderer.class)
-public interface BeaconBlockEntityRendererInvoker {
-    @SuppressWarnings("unused")
-    @Invoker("renderBeam")
-    static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, float[] color) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java
deleted file mode 100644
index 9c14fdc6..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/DrawContextInvoker.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.tooltip.TooltipComponent;
-import net.minecraft.client.gui.tooltip.TooltipPositioner;
-import net.minecraft.util.Identifier;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-import java.util.List;
-
-@Mixin(DrawContext.class)
-public interface DrawContextInvoker {
-
-    @Invoker
-    void invokeDrawTooltip(TextRenderer textRenderer, List<TooltipComponent> components, int x, int y, TooltipPositioner positioner);
-
-    @Invoker
-    void invokeDrawTexturedQuad(Identifier texture, int x1, int x2, int y1, int y2, int z, float u1, float u2, float v1, float v2, float red, float green, float blue, float alpha);
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java
deleted file mode 100644
index b7bcd95c..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/EndermanEntityAccessor.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.block.BlockState;
-import net.minecraft.entity.data.TrackedData;
-import net.minecraft.entity.mob.EndermanEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-import java.util.Optional;
-
-@Mixin(EndermanEntity.class)
-public interface EndermanEntityAccessor {
-    @Accessor
-    static TrackedData<Optional<BlockState>> getCARRIED_BLOCK() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java
deleted file mode 100644
index dd4f5ef1..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/FrustumInvoker.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.render.Frustum;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-/**
- * Use {@link de.hysky.skyblocker.utils.render.FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations!
- */
-@Mixin(Frustum.class)
-public interface FrustumInvoker {
-    @Invoker
-    boolean invokeIsVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ);
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java
deleted file mode 100644
index 5b84072d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/HandledScreenAccessor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.gui.screen.ingame.HandledScreen;
-import net.minecraft.screen.ScreenHandler;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Mutable;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(HandledScreen.class)
-public interface HandledScreenAccessor {
-    @Accessor("x")
-    int getX();
-
-    @Accessor("y")
-    int getY();
-
-    @Accessor
-    int getBackgroundWidth();
-
-    @Accessor
-    int getBackgroundHeight();
-
-    @Mutable
-    @Accessor("handler")
-    void setHandler(ScreenHandler handler);
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java
deleted file mode 100644
index 6e5793e3..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.network.message.MessageHandler;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-import java.time.Instant;
-
-@Mixin(MessageHandler.class)
-public interface MessageHandlerAccessor {
-    @Invoker
-    void invokeAddToChatLog(Text message, Instant timestamp);
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java
deleted file mode 100644
index c982249a..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.gui.hud.PlayerListHud;
-import net.minecraft.client.network.PlayerListEntry;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-import java.util.Comparator;
-
-@Mixin(PlayerListHud.class)
-public interface PlayerListHudAccessor {
-    @Accessor("ENTRY_ORDERING")
-    static Comparator<PlayerListEntry> getOrdering() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java
deleted file mode 100644
index 30aad00c..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
-import net.minecraft.client.gui.widget.TextFieldWidget;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(RecipeBookWidget.class)
-public interface RecipeBookWidgetAccessor {
-    @Accessor
-    String getSearchText();
-
-    @Accessor
-    TextFieldWidget getSearchField();
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java
deleted file mode 100644
index c0196e5f..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/ScreenAccessor.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Mutable;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(Screen.class)
-public interface ScreenAccessor {
-    @Accessor
-    @Mutable
-    void setTitle(Text title);
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java
deleted file mode 100644
index c445104e..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/SkullBlockEntityAccessor.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import com.mojang.authlib.GameProfile;
-import net.minecraft.block.entity.SkullBlockEntity;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-
-@Mixin(SkullBlockEntity.class)
-public interface SkullBlockEntityAccessor {
-    @Invoker
-    static CompletableFuture<Optional<GameProfile>> invokeFetchProfileByName(String name) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java
deleted file mode 100644
index ef11006c..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/SlotAccessor.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import net.minecraft.screen.slot.Slot;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Mutable;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(Slot.class)
-public interface SlotAccessor {
-    @Mutable
-    @Accessor("x")
-    void setX(int x);
-
-    @Mutable
-    @Accessor("y")
-    void setY(int y);
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java
deleted file mode 100644
index f1b3158d..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/accessor/WorldRendererAccessor.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package de.hysky.skyblocker.mixin.accessor;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-import net.minecraft.client.render.Frustum;
-import net.minecraft.client.render.WorldRenderer;
-
-@Mixin(WorldRenderer.class)
-public interface WorldRendererAccessor {
-    @Accessor
-    Frustum getFrustum();
-}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java b/src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java
deleted file mode 100644
index 47f1cadc..00000000
--- a/src/main/java/de/hysky/skyblocker/mixin/discordipc/ConnectionMixin.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.hysky.skyblocker.mixin.discordipc;
-
-import de.hysky.skyblocker.utils.discord.DiscordRPCManager;
-import meteordevelopment.discordipc.DiscordIPC;
-import meteordevelopment.discordipc.connection.UnixConnection;
-import meteordevelopment.discordipc.connection.WinConnection;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Redirect;
-
-import java.io.IOException;
-
-@Mixin(value = {UnixConnection.class, WinConnection.class}, remap = false)
-public class ConnectionMixin {
-    @Redirect(method = "write", at = @At(value = "INVOKE", target = "Ljava/io/IOException;printStackTrace()V"))
-    private void write(IOException e) {
-        DiscordIPC.stop();
-        DiscordRPCManager.LOGGER.warn("[Skyblocker] Discord RPC failed to update activity, connection lost", e);
-    }
-}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java
new file mode 100644
index 00000000..53151826
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/AbstractInventoryScreenMixin.java
@@ -0,0 +1,19 @@
+package de.hysky.skyblocker.mixins;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen;
+
+@Mixin(AbstractInventoryScreen.class)
+public class AbstractInventoryScreenMixin {
+
+	@Inject(method = "drawStatusEffects", at = @At("HEAD"), cancellable = true)
+	private void skyblocker$dontDrawStatusEffects(CallbackInfo ci) {
+		if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java
new file mode 100644
index 00000000..7ee59be1
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java
@@ -0,0 +1,21 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
+import net.minecraft.entity.EntityType;
+import net.minecraft.entity.mob.AmbientEntity;
+import net.minecraft.entity.passive.BatEntity;
+import net.minecraft.world.World;
+import org.spongepowered.asm.mixin.Mixin;
+
+@Mixin(BatEntity.class)
+public abstract class BatEntityMixin extends AmbientEntity {
+    protected BatEntityMixin(EntityType<? extends AmbientEntity> entityType, World world) {
+        super(entityType, world);
+    }
+
+    @Override
+    public void onRemoved() {
+        super.onRemoved();
+        DungeonManager.onBatRemoved(this);
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java
new file mode 100644
index 00000000..0a5ebc64
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java
@@ -0,0 +1,106 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+import com.llamalad7.mixinextras.sugar.Local;
+import de.hysky.skyblocker.skyblock.FishingHelper;
+import de.hysky.skyblocker.skyblock.dungeon.DungeonScore;
+import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
+import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;
+import de.hysky.skyblocker.skyblock.end.EnderNodes;
+import de.hysky.skyblocker.skyblock.end.TheEnd;
+import de.hysky.skyblocker.skyblock.waypoint.MythologicalRitual;
+import de.hysky.skyblocker.utils.SlayerUtils;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.network.ClientPlayNetworkHandler;
+import net.minecraft.client.world.ClientWorld;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityStatuses;
+import net.minecraft.entity.ItemEntity;
+import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket;
+import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket;
+import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
+import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
+import net.minecraft.util.Identifier;
+import org.slf4j.Logger;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyVariable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(ClientPlayNetworkHandler.class)
+public abstract class ClientPlayNetworkHandlerMixin {
+    @Shadow
+    private ClientWorld world;
+
+    @Inject(method = "onBlockUpdate", at = @At("RETURN"))
+    private void skyblocker$onBlockUpdate(BlockUpdateS2CPacket packet, CallbackInfo ci) {
+        if (Utils.isInTheEnd() && SlayerUtils.isInSlayer()) {
+            BeaconHighlighter.beaconPositions.remove(packet.getPos());
+            if (packet.getState().isOf(Blocks.BEACON)) {
+                BeaconHighlighter.beaconPositions.add(packet.getPos());
+            }
+        }
+    }
+
+    @Inject(method = "method_37472", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V"))
+    private void skyblocker$onItemDestroy(int entityId, CallbackInfo ci) {
+        if (world.getEntityById(entityId) instanceof ItemEntity itemEntity) {
+            DungeonManager.onItemPickup(itemEntity);
+        }
+    }
+
+    @ModifyVariable(method = "onItemPickupAnimation", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientWorld;removeEntity(ILnet/minecraft/entity/Entity$RemovalReason;)V", ordinal = 0))
+    private ItemEntity skyblocker$onItemPickup(ItemEntity itemEntity) {
+        DungeonManager.onItemPickup(itemEntity);
+        return itemEntity;
+    }
+
+    @WrapWithCondition(method = "onEntityPassengersSet", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;)V", remap = false))
+    private boolean skyblocker$cancelEntityPassengersWarning(Logger instance, String msg) {
+        return !Utils.isOnHypixel();
+    }
+
+    @WrapWithCondition(method = "onPlayerList", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
+    private boolean skyblocker$cancelPlayerListWarning(Logger instance, String format, Object arg1, Object arg2) {
+        return !Utils.isOnHypixel();
+    }
+
+    @Inject(method = "onPlaySound", at = @At("RETURN"))
+    private void skyblocker$onPlaySound(PlaySoundS2CPacket packet, CallbackInfo ci) {
+        FishingHelper.onSound(packet);
+    }
+
+    @WrapWithCondition(method = "warnOnUnknownPayload", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
+    private boolean skyblocker$dropBadlionPacketWarnings(Logger instance, String message, Object identifier) {
+        return !(Utils.isOnHypixel() && ((Identifier) identifier).getNamespace().equals("badlion"));
+    }
+
+    @WrapWithCondition(method = { "onScoreboardScoreUpdate", "onScoreboardScoreReset" }, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
+    private boolean skyblocker$cancelUnknownScoreboardObjectiveWarnings(Logger instance, String message, Object objectiveName) {
+        return !Utils.isOnHypixel();
+    }
+
+    @WrapWithCondition(method = "onTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;[Ljava/lang/Object;)V", remap = false))
+    private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object... arg) {
+        return !Utils.isOnHypixel();
+    }
+
+    @Inject(method = "onParticle", at = @At("RETURN"))
+    private void skyblocker$onParticle(ParticleS2CPacket packet, CallbackInfo ci) {
+        MythologicalRitual.onParticle(packet);
+        EnderNodes.onParticle(packet);
+    }
+
+    @ModifyExpressionValue(method = "onEntityStatus", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/EntityStatusS2CPacket;getEntity(Lnet/minecraft/world/World;)Lnet/minecraft/entity/Entity;"))
+    private Entity skyblocker$onEntityDeath(Entity entity, @Local(argsOnly = true) EntityStatusS2CPacket packet) {
+        if (packet.getStatus() == EntityStatuses.PLAY_DEATH_SOUND_OR_ADD_PROJECTILE_HIT_PARTICLES) {
+            DungeonScore.handleEntityDeath(entity);
+            TheEnd.onEntityDeath(entity);
+        }
+        return entity;
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java
new file mode 100644
index 00000000..d4c930d2
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerEntityMixin.java
@@ -0,0 +1,82 @@
+package de.hysky.skyblocker.mixins;
+
+import com.mojang.authlib.GameProfile;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen;
+import de.hysky.skyblocker.skyblock.auction.EditBidPopup;
+import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
+import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
+import de.hysky.skyblocker.skyblock.item.ItemProtection;
+import de.hysky.skyblocker.skyblock.rift.HealingMelonIndicator;
+import de.hysky.skyblocker.skyblock.searchoverlay.OverlayScreen;
+import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.entity.SignBlockEntity;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.network.AbstractClientPlayerEntity;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.world.ClientWorld;
+import net.minecraft.text.Text;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+@Mixin(ClientPlayerEntity.class)
+public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
+    @Shadow
+    @Final
+    protected MinecraftClient client;
+
+    public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) {
+        super(world, profile);
+    }
+
+    @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true)
+    public void skyblocker$dropSelectedItem(CallbackInfoReturnable<Boolean> cir) {
+        if (Utils.isOnSkyblock() && (ItemProtection.isItemProtected(this.getInventory().getMainHandStack()) || HotbarSlotLock.isLocked(this.getInventory().selectedSlot))
+                && (!SkyblockerConfigManager.get().locations.dungeons.allowDroppingProtectedItems || !Utils.isInDungeons())) {
+            cir.setReturnValue(false);
+        }
+    }
+
+    @Inject(method = "updateHealth", at = @At("RETURN"))
+    public void skyblocker$updateHealth(CallbackInfo ci) {
+        HealingMelonIndicator.updateHealth();
+    }
+
+    @Inject(method = "openEditSignScreen", at = @At("HEAD"), cancellable = true)
+    public void skyblocker$redirectEditSignScreen(SignBlockEntity sign, boolean front, CallbackInfo callbackInfo) {
+        // Fancy Party Finder
+        if (!PartyFinderScreen.isInKuudraPartyFinder && client.currentScreen instanceof PartyFinderScreen partyFinderScreen && !partyFinderScreen.isAborted() && sign.getText(front).getMessage(3, false).getString().toLowerCase().contains("level")) {
+            partyFinderScreen.updateSign(sign, front);
+            callbackInfo.cancel();
+            return;
+        }
+
+        if (client.currentScreen instanceof AuctionViewScreen auctionViewScreen) {
+            this.client.setScreen(new EditBidPopup(auctionViewScreen, sign, front, auctionViewScreen.minBid));
+            callbackInfo.cancel();
+        }
+
+        // Search Overlay
+        if (client.currentScreen != null) {
+            if (SkyblockerConfigManager.get().general.searchOverlay.enableAuctionHouse && client.currentScreen.getTitle().getString().toLowerCase().contains("auction")) {
+                if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) {
+                    SearchOverManager.updateSign(sign, front, true);
+                    client.setScreen(new OverlayScreen(Text.of("")));
+                    callbackInfo.cancel();
+                }
+            } else if (SkyblockerConfigManager.get().general.searchOverlay.enableBazaar && client.currentScreen.getTitle().getString().toLowerCase().contains("bazaar")) {
+                if (sign.getText(front).getMessage(3, false).getString().equalsIgnoreCase("enter query")) {
+                    SearchOverManager.updateSign(sign, front, false);
+                    client.setScreen(new OverlayScreen(Text.of("")));
+                    callbackInfo.cancel();
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java b/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java
new file mode 100644
index 00000000..289923c8
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/CommandTreeS2CPacketMixin.java
@@ -0,0 +1,21 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import com.mojang.brigadier.tree.CommandNode;
+import com.mojang.brigadier.tree.LiteralCommandNode;
+import de.hysky.skyblocker.skyblock.WarpAutocomplete;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.command.CommandSource;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(targets = "net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket$CommandTree")
+public class CommandTreeS2CPacketMixin {
+    @ModifyExpressionValue(method = "getNode", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/s2c/play/CommandTreeS2CPacket$CommandTree;getNode(I)Lcom/mojang/brigadier/tree/CommandNode;", ordinal = 1))
+    public CommandNode<? extends CommandSource> modifyCommandSuggestions(CommandNode<CommandSource> original) {
+        if (Utils.isOnHypixel() && WarpAutocomplete.commandNode != null && original instanceof LiteralCommandNode<?> literalCommandNode && literalCommandNode.getLiteral().equals("warp")) {
+            return WarpAutocomplete.commandNode;
+        }
+        return original;
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java
new file mode 100644
index 00000000..8fa03cdc
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/ComponentHolderMixin.java
@@ -0,0 +1,39 @@
+package de.hysky.skyblocker.mixins;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+import com.llamalad7.mixinextras.injector.ModifyReturnValue;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.item.CustomArmorTrims;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+import net.minecraft.component.ComponentHolder;
+import net.minecraft.component.DataComponentType;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.trim.ArmorTrim;
+
+@Mixin(ComponentHolder.class)
+public interface ComponentHolderMixin {
+
+	@SuppressWarnings("unchecked")
+	@ModifyReturnValue(method = "get", at = @At("RETURN"))
+	private <T> T skyblocker$customArmorTrims(T original, DataComponentType<? extends T> dataComponentType) {
+		if (Utils.isOnSkyblock() && ((Object) this) instanceof ItemStack stack) {
+			if (dataComponentType == DataComponentTypes.TRIM) {
+				Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customTrims = SkyblockerConfigManager.get().general.customArmorTrims;
+				String itemUuid = ItemUtils.getItemUuid(stack);
+
+				if (customTrims.containsKey(itemUuid)) {
+					CustomArmorTrims.ArmorTrimId trimKey = customTrims.get(itemUuid);
+					return (T) CustomArmorTrims.TRIMS_CACHE.getOrDefault(trimKey, (ArmorTrim) original);
+				}
+			}
+		}
+
+		return original;
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java
new file mode 100644
index 00000000..dfe6ac4c
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/DataTrackerMixin.java
@@ -0,0 +1,51 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.sugar.Local;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.mixins.accessors.EndermanEntityAccessor;
+import de.hysky.skyblocker.skyblock.entity.MobGlow;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.data.DataTracked;
+import net.minecraft.entity.data.DataTracker;
+import net.minecraft.sound.SoundEvents;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.Optional;
+
+@Mixin(DataTracker.class)
+public abstract class DataTrackerMixin {
+    @Shadow
+    @Final
+    private DataTracked trackedEntity;
+
+    @SuppressWarnings("ConstantValue")
+    @Inject(method = "writeUpdatedEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/data/DataTracker;copyToFrom(Lnet/minecraft/entity/data/DataTracker$Entry;Lnet/minecraft/entity/data/DataTracker$SerializedEntry;)V"))
+    private <T> void skyblocker$onWriteUpdatedEntries(CallbackInfo ci, @Local DataTracker.Entry<T> entry, @Local DataTracker.SerializedEntry<T> serializedEntry) {
+        if (Utils.isInTheEnd() && SkyblockerConfigManager.get().slayer.endermanSlayer.enableYangGlyphsNotification && entry.getData() == EndermanEntityAccessor.getCARRIED_BLOCK() && entry.get() instanceof Optional<?> value && value.isPresent() && value.get() instanceof BlockState state && state.isOf(Blocks.BEACON) && ((Optional<?>) serializedEntry.value()).isEmpty()) {
+            MinecraftClient client = MinecraftClient.getInstance();
+            if (trackedEntity instanceof Entity entity && MobGlow.getArmorStands(entity).stream().anyMatch(armorStand -> armorStand.getName().getString().contains(client.getSession().getUsername()))) {
+                client.inGameHud.setTitleTicks(5, 20, 10);
+                client.inGameHud.setTitle(Text.literal("Yang Glyph!").formatted(Formatting.RED));
+                client.player.playSound(SoundEvents.BLOCK_NOTE_BLOCK_PLING.value(), 100f, 0.1f);
+            }
+        }
+    }
+
+    @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"})
+    @Inject(method = "copyToFrom", at = @At(value = "NEW", target = "Ljava/lang/IllegalStateException;"), cancellable = true)
+    public void skyblocker$ignoreInvalidDataExceptions(CallbackInfo ci) {
+        //These exceptions cause annoying small lag spikes for some reason
+        if (Utils.isOnHypixel()) ci.cancel();
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java
new file mode 100644
index 00000000..7964b114
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/DrawContextMixin.java
@@ -0,0 +1,71 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import com.llamalad7.mixinextras.sugar.Local;
+import com.llamalad7.mixinextras.sugar.ref.LocalRef;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.item.AttributeShards;
+import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.util.Formatting;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(DrawContext.class)
+public abstract class DrawContextMixin {
+    @Shadow
+    @Final
+    private MatrixStack matrices;
+
+    @Shadow
+    public abstract int drawText(TextRenderer textRenderer, @Nullable String text, int x, int y, int color, boolean shadow);
+
+    @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD"))
+    private void skyblocker$renderAttributeShardDisplay(CallbackInfo ci, @Local(argsOnly = true) TextRenderer textRenderer, @Local(argsOnly = true) ItemStack stack, @Local(argsOnly = true, ordinal = 0) int x, @Local(argsOnly = true, ordinal = 1) int y, @Local(argsOnly = true) LocalRef<String> countOverride) {
+        if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return;
+
+        if (Utils.isOnSkyblock()) {
+            NbtCompound customData = ItemUtils.getCustomData(stack);
+
+            if (ItemUtils.getItemId(stack).equals("ATTRIBUTE_SHARD")) {
+                NbtCompound attributesTag = customData.getCompound("attributes");
+                String[] attributes = attributesTag.getKeys().toArray(String[]::new);
+
+                if (attributes.length != 0) {
+                    String attributeId = attributes[0];
+                    int attributeLevel = attributesTag.getInt(attributeId);
+
+                    //Set item count
+                    countOverride.set(Integer.toString(attributeLevel));
+
+                    //Draw the attribute name
+                    this.matrices.push();
+                    this.matrices.translate(0f, 0f, 200f);
+
+                    String attributeInitials = AttributeShards.getShortName(attributeId);
+
+                    this.drawText(textRenderer, attributeInitials, x, y, Formatting.AQUA.getColorValue(), true);
+
+                    this.matrices.pop();
+                }
+            }
+        }
+    }
+
+    @ModifyExpressionValue(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V",
+            at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/ItemCooldownManager;getCooldownProgress(Lnet/minecraft/item/Item;F)F"))
+    private float skyblocker$modifyItemCooldown(float cooldownProgress, @Local(argsOnly = true) ItemStack stack) {
+        return Utils.isOnSkyblock() && ItemCooldowns.isOnCooldown(stack) ? ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent() : cooldownProgress;
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java
new file mode 100644
index 00000000..0fd4f8a0
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/DyedColorComponentMixin.java
@@ -0,0 +1,34 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyReturnValue;
+import com.llamalad7.mixinextras.sugar.Local;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.component.type.DyedColorComponent;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.ColorHelper;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(DyedColorComponent.class)
+public record DyedColorComponentMixin() {
+
+	@ModifyReturnValue(method = "getColor", at = @At("RETURN"))
+	private static int skyblocker$customDyeColor(int originalColor, @Local(argsOnly = true) ItemStack stack) {
+		if (Utils.isOnSkyblock()) {
+			String itemUuid = ItemUtils.getItemUuid(stack);
+
+			if (SkyblockerConfigManager.get().general.customAnimatedDyes.containsKey(itemUuid)) {
+				return ColorHelper.Argb.fullAlpha(CustomArmorAnimatedDyes.animateColorTransition(SkyblockerConfigManager.get().general.customAnimatedDyes.get(itemUuid)));
+			}
+
+			return ColorHelper.Argb.fullAlpha(SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor));
+		}
+
+		return originalColor;
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java
new file mode 100644
index 00000000..05fe9148
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/EntityRenderDispatcherMixin.java
@@ -0,0 +1,18 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import de.hysky.skyblocker.debug.Debug;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.render.entity.EntityRenderDispatcher;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.decoration.ArmorStandEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(EntityRenderDispatcher.class)
+public class EntityRenderDispatcherMixin {
+    @ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isInvisible()Z", ordinal = 1))
+    private <E extends Entity> boolean skyblocker$armorStandHitboxVisible(boolean invisible, E entity) {
+        return (!(entity instanceof ArmorStandEntity) || !Utils.isOnHypixel() || !Debug.debugEnabled()) && invisible;
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java
new file mode 100644
index 00000000..4c981d9a
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/FarmlandBlockMixin.java
@@ -0,0 +1,37 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyReturnValue;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.FarmlandBlock;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.shape.VoxelShape;
+import net.minecraft.util.shape.VoxelShapes;
+import net.minecraft.world.BlockView;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(FarmlandBlock.class)
+public abstract class FarmlandBlockMixin extends Block {
+    @Shadow
+    @Final
+    protected static VoxelShape SHAPE;
+
+    protected FarmlandBlockMixin(Settings settings) {
+        super(settings);
+    }
+
+    @ModifyReturnValue(method = "getOutlineShape", at = @At("RETURN"))
+    private VoxelShape skyblocker$replaceOutlineShape(VoxelShape original) {
+        return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original;
+    }
+
+    @Override
+    public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) {
+        return SHAPE;
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java
new file mode 100644
index 00000000..f75af09a
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java
@@ -0,0 +1,38 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.item.ItemStack;
+import net.minecraft.screen.GenericContainerScreenHandler;
+import net.minecraft.screen.ScreenHandler;
+import net.minecraft.screen.ScreenHandlerType;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Mixin;
+
+import java.util.List;
+
+@Mixin(GenericContainerScreenHandler.class)
+public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler {
+    protected GenericContainerScreenHandlerMixin(@Nullable ScreenHandlerType<?> type, int syncId) {
+        super(type, syncId);
+    }
+
+    @Override
+    public void setStackInSlot(int slot, int revision, ItemStack stack) {
+        super.setStackInSlot(slot, revision, stack);
+        SkyblockerMod.getInstance().containerSolverManager.markDirty();
+        if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) {
+            screen.markDirty();
+        }
+    }
+
+    @Override
+    public void updateSlotStacks(int revision, List<ItemStack> stacks, ItemStack cursorStack) {
+        super.updateSlotStacks(revision, stacks, cursorStack);
+        SkyblockerMod.getInstance().containerSolverManager.markDirty();
+        if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) {
+            screen.markDirty();
+        }
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java
new file mode 100644
index 00000000..cbc29974
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java
@@ -0,0 +1,258 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.sugar.Local;
+import com.mojang.blaze3d.systems.RenderSystem;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.experiment.ChronomatronSolver;
+import de.hysky.skyblocker.skyblock.experiment.ExperimentSolver;
+import de.hysky.skyblocker.skyblock.experiment.SuperpairsSolver;
+import de.hysky.skyblocker.skyblock.experiment.UltrasequencerSolver;
+import de.hysky.skyblocker.skyblock.garden.VisitorHelper;
+import de.hysky.skyblocker.skyblock.item.ItemProtection;
+import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
+import de.hysky.skyblocker.skyblock.item.WikiLookup;
+import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
+import de.hysky.skyblocker.skyblock.item.tooltip.CompactorDeletorPreview;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.gui.ContainerSolver;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.screen.ingame.HandledScreen;
+import net.minecraft.inventory.SimpleInventory;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.screen.GenericContainerScreenHandler;
+import net.minecraft.screen.ScreenHandler;
+import net.minecraft.screen.slot.Slot;
+import net.minecraft.screen.slot.SlotActionType;
+import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyVariable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+
+@Mixin(HandledScreen.class)
+public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen {
+    /**
+     * This is the slot id returned for when a click is outside the screen's bounds
+     */
+    @Unique
+    private static final int OUT_OF_BOUNDS_SLOT = -999;
+
+    @Unique
+    private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
+
+    @Unique
+    private static final Set<String> FILLER_ITEMS = Set.of(
+            " ", // Empty menu item
+            "Locked Page",
+            "Quick Crafting Slot",
+            "Locked Backpack Slot 2", //Regular expressions won't be utilized here since the search by contains is based on plain text rather than regex syntax
+            "Locked Backpack Slot 3",
+            "Locked Backpack Slot 4",
+            "Locked Backpack Slot 5",
+            "Locked Backpack Slot 6",
+            "Locked Backpack Slot 7",
+            "Locked Backpack Slot 8",
+            "Locked Backpack Slot 9",
+            "Locked Backpack Slot 10",
+            "Locked Backpack Slot 11",
+            "Locked Backpack Slot 12",
+            "Locked Backpack Slot 13",
+            "Locked Backpack Slot 14",
+            "Locked Backpack Slot 15",
+            "Locked Backpack Slot 16",
+            "Locked Backpack Slot 17",
+            "Locked Backpack Slot 18",
+            "Preparing"
+    );
+
+    @Shadow
+    @Nullable
+    protected Slot focusedSlot;
+
+    @Shadow
+    @Final
+    protected T handler;
+
+    protected HandledScreenMixin(Text title) {
+        super(title);
+    }
+
+    @Inject(at = @At("HEAD"), method = "keyPressed")
+    public void skyblocker$keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) {
+        if (this.client != null && this.focusedSlot != null && keyCode != 256) {
+            //wiki lookup
+            if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && WikiLookup.wikiLookup.matchesKey(keyCode, scanCode)) {
+                WikiLookup.openWiki(this.focusedSlot, client.player);
+            }
+            //item protection
+            if (!this.client.options.inventoryKey.matchesKey(keyCode, scanCode) && ItemProtection.itemProtection.matchesKey(keyCode, scanCode)) {
+                ItemProtection.handleKeyPressed(this.focusedSlot.getStack());
+            }
+        }
+    }
+
+    @Inject(at = @At("HEAD"), method = "mouseClicked")
+    public void skyblocker$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
+        if (SkyblockerConfigManager.get().locations.garden.visitorHelper && (Utils.getLocationRaw().equals("garden") && !getTitle().getString().contains("Logbook") || getTitle().getString().startsWith("Bazaar")))
+            VisitorHelper.onMouseClicked(mouseX, mouseY, button, this.textRenderer);
+    }
+
+    @SuppressWarnings("DataFlowIssue")
+    // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method.
+    @Inject(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;II)V"), cancellable = true)
+    public void skyblocker$drawMouseOverTooltip(DrawContext context, int x, int y, CallbackInfo ci, @Local(ordinal = 0) ItemStack stack) {
+        if (!Utils.isOnSkyblock()) return;
+
+        // Hide Empty Tooltips
+        if (SkyblockerConfigManager.get().general.hideEmptyTooltips && stack.getName().getString().equals(" ")) {
+            ci.cancel();
+        }
+
+        // Backpack Preview
+        boolean shiftDown = SkyblockerConfigManager.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown();
+        if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, this, focusedSlot.getIndex(), x, y)) {
+            ci.cancel();
+        }
+
+        // Compactor Preview
+        if (SkyblockerConfigManager.get().general.compactorDeletorPreview) {
+            Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemUtils.getItemId(stack));
+            if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) {
+                ci.cancel();
+            }
+        }
+    }
+
+    @ModifyVariable(method = "drawMouseoverTooltip", at = @At(value = "LOAD", ordinal = 0))
+    private ItemStack skyblocker$experimentSolvers$replaceTooltipDisplayStack(ItemStack stack) {
+        return skyblocker$experimentSolvers$getStack(focusedSlot, stack);
+    }
+
+    @ModifyVariable(method = "drawSlot", at = @At(value = "LOAD", ordinal = 3), ordinal = 0)
+    private ItemStack skyblocker$experimentSolvers$replaceDisplayStack(ItemStack stack, DrawContext context, Slot slot) {
+        return skyblocker$experimentSolvers$getStack(slot, stack);
+    }
+
+    /**
+     * Redirects getStack calls to account for different stacks in experiment solvers.
+     */
+    @Unique
+    private ItemStack skyblocker$experimentSolvers$getStack(Slot slot, @NotNull ItemStack stack) {
+        ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver();
+        if ((currentSolver instanceof SuperpairsSolver || currentSolver instanceof UltrasequencerSolver) && ((ExperimentSolver) currentSolver).getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) {
+            ItemStack itemStack = ((ExperimentSolver) currentSolver).getSlots().get(slot.getIndex());
+            return itemStack == null ? stack : itemStack;
+        }
+        return stack;
+    }
+
+    /**
+     * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks)
+     * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item
+     * 
+     * @implNote This runs before {@link ScreenHandler#onSlotClick(int, int, SlotActionType, net.minecraft.entity.player.PlayerEntity)}
+     */
+    @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickSlot(IIILnet/minecraft/screen/slot/SlotActionType;Lnet/minecraft/entity/player/PlayerEntity;)V"), cancellable = true)
+    private void skyblocker$onSlotClick(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) {
+        if (!Utils.isOnSkyblock()) return;
+
+        // Item Protection
+        // When you try and drop the item by picking it up then clicking outside the screen
+        if (slotId == OUT_OF_BOUNDS_SLOT && ItemProtection.isItemProtected(this.handler.getCursorStack())) {
+            ci.cancel();
+            return;
+        }
+
+        if (slot == null) return;
+        String title = getTitle().getString();
+        ItemStack stack = skyblocker$experimentSolvers$getStack(slot, slot.getStack());
+        ContainerSolver currentSolver = SkyblockerMod.getInstance().containerSolverManager.getCurrentSolver();
+
+        // Prevent clicks on filler items
+        if (SkyblockerConfigManager.get().general.hideEmptyTooltips && FILLER_ITEMS.contains(stack.getName().getString()) &&
+                // Allow clicks in Ultrasequencer and Superpairs
+                (!UltrasequencerSolver.INSTANCE.getName().matcher(title).matches() || SkyblockerConfigManager.get().general.experiments.enableUltrasequencerSolver)) {
+            ci.cancel();
+            return;
+        }
+        // Item Protection
+        // When you click your drop key while hovering over an item
+        if (actionType == SlotActionType.THROW && ItemProtection.isItemProtected(stack)) {
+            ci.cancel();
+            return;
+        }
+        // Prevent salvaging
+        if (title.equals("Salvage Items") && ItemProtection.isItemProtected(stack)) {
+            ci.cancel();
+            return;
+        }
+        if (this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) {
+            VisitorHelper.onSlotClick(slot, slotId, title);
+
+            // Prevent selling to NPC shops
+            ItemStack sellStack = this.handler.slots.get(49).getStack();
+            if (sellStack.getName().getString().equals("Sell Item") || ItemUtils.getLoreLineIf(sellStack, text -> text.contains("buyback")) != null) {
+                if (slotId != 49 && ItemProtection.isItemProtected(stack)) {
+                    ci.cancel();
+                    return;
+                }
+            }
+        }
+
+        if (currentSolver != null) {
+            SkyblockerMod.getInstance().containerSolverManager.onSlotClick(slotId, stack);
+        }
+
+        // Experiment Solvers
+        if (currentSolver instanceof ExperimentSolver experimentSolver && experimentSolver.getState() == ExperimentSolver.State.SHOW && slot.inventory instanceof SimpleInventory) {
+            switch (experimentSolver) {
+                case ChronomatronSolver chronomatronSolver -> {
+                    Item item = chronomatronSolver.getChronomatronSlots().get(chronomatronSolver.getChronomatronCurrentOrdinal());
+                    if ((stack.isOf(item) || ChronomatronSolver.TERRACOTTA_TO_GLASS.get(stack.getItem()) == item) && chronomatronSolver.incrementChronomatronCurrentOrdinal() >= chronomatronSolver.getChronomatronSlots().size()) {
+                        chronomatronSolver.setState(ExperimentSolver.State.END);
+                    }
+                }
+
+                case SuperpairsSolver superpairsSolver -> {
+                    superpairsSolver.setSuperpairsPrevClickedSlot(slot.getIndex());
+                    superpairsSolver.setSuperpairsCurrentSlot(ItemStack.EMPTY);
+                }
+
+                case UltrasequencerSolver ultrasequencerSolver when slot.getIndex() == ultrasequencerSolver.getUltrasequencerNextSlot() -> {
+                    int count = ultrasequencerSolver.getSlots().get(ultrasequencerSolver.getUltrasequencerNextSlot()).getCount() + 1;
+                    ultrasequencerSolver.getSlots().entrySet().stream().filter(entry -> entry.getValue().getCount() == count).findAny().map(Map.Entry::getKey).ifPresentOrElse(ultrasequencerSolver::setUltrasequencerNextSlot, () -> ultrasequencerSolver.setState(ExperimentSolver.State.END));
+                }
+
+                default -> { /*Do Nothing*/ }
+            }
+        }
+    }
+
+    @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V"))
+    private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) {
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds)
+            ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y);
+        // Item protection
+        if (ItemProtection.isItemProtected(slot.getStack())) {
+            RenderSystem.enableBlend();
+            context.drawTexture(ITEM_PROTECTION, slot.x, slot.y, 0, 0, 16, 16, 16, 16);
+            RenderSystem.disableBlend();
+        }
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java
new file mode 100644
index 00000000..be1fdf8d
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenProviderMixin.java
@@ -0,0 +1,101 @@
+package de.hysky.skyblocker.mixins;
+
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.auction.AuctionBrowserScreen;
+import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler;
+import de.hysky.skyblocker.skyblock.auction.AuctionViewScreen;
+import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
+import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreenHandler;
+import de.hysky.skyblocker.skyblock.item.SkyblockCraftingTableScreen;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.screen.ingame.HandledScreens;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.screen.GenericContainerScreenHandler;
+import net.minecraft.screen.ScreenHandler;
+import net.minecraft.screen.ScreenHandlerType;
+import net.minecraft.text.Text;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(HandledScreens.Provider.class)
+public interface HandledScreenProviderMixin<T extends ScreenHandler> {
+
+	@Inject(method = "open", at = @At("HEAD"), cancellable = true)
+	default void skyblocker$open(Text name, ScreenHandlerType<T> type, MinecraftClient client, int id, CallbackInfo ci) {
+		ClientPlayerEntity player = client.player;
+		if (player == null) return;
+		if (!Utils.isOnSkyblock()) return;
+		T screenHandler = type.create(id, player.getInventory());
+		String nameLowercase = name.getString().toLowerCase();
+
+		switch (screenHandler) {
+			// Better party finder
+			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.betterPartyFinder && PartyFinderScreen.possibleInventoryNames.contains(nameLowercase) -> {
+				if (client.currentScreen != null) {
+					String lowerCase = client.currentScreen.getTitle().getString().toLowerCase();
+					if (lowerCase.contains("group builder")) return;
+					if (lowerCase.contains("select tier")) {
+						PartyFinderScreen.isInKuudraPartyFinder = true;
+					} else if (lowerCase.contains("catacombs")) {
+						PartyFinderScreen.isInKuudraPartyFinder = false;
+					}
+				}
+
+				if (PartyFinderScreen.isInKuudraPartyFinder) return;
+				client.player.currentScreenHandler = containerScreenHandler;
+
+				switch (client.currentScreen) {
+					case PartyFinderScreen screen -> screen.updateHandler(containerScreenHandler, name);
+					case null, default -> client.setScreen(new PartyFinderScreen(containerScreenHandler, player.getInventory(), name));
+				}
+
+				ci.cancel();
+			}
+
+			// Fancy AH
+			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("auctions browser") || nameLowercase.contains("auctions: ")) -> {
+				AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, false);
+				client.player.currentScreenHandler = auctionHouseScreenHandler;
+
+				switch (client.currentScreen) {
+					case AuctionBrowserScreen auctionBrowserScreen -> auctionBrowserScreen.changeHandler(auctionHouseScreenHandler);
+					case null, default -> client.setScreen(new AuctionBrowserScreen(auctionHouseScreenHandler, client.player.getInventory()));
+				}
+
+				ci.cancel();
+			}
+
+			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && nameLowercase.contains("auction view") -> {
+				AuctionHouseScreenHandler auctionHouseScreenHandler = AuctionHouseScreenHandler.of(containerScreenHandler, true);
+				client.player.currentScreenHandler = auctionHouseScreenHandler;
+
+				switch (client.currentScreen) {
+					case AuctionViewScreen auctionViewScreen -> auctionViewScreen.changeHandler(auctionHouseScreenHandler);
+					case null, default -> client.setScreen(new AuctionViewScreen(auctionHouseScreenHandler, client.player.getInventory(), name));
+				}
+
+				ci.cancel();
+			}
+
+			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyAuctionHouse.enabled && (nameLowercase.contains("confirm purchase") || nameLowercase.contains("confirm bid")) && client.currentScreen instanceof AuctionViewScreen auctionViewScreen -> {
+				client.setScreen(auctionViewScreen.getConfirmPurchasePopup(name));
+				client.player.currentScreenHandler = containerScreenHandler;
+				ci.cancel();
+			}
+
+			// Fancy crafting table
+			case GenericContainerScreenHandler containerScreenHandler when SkyblockerConfigManager.get().general.fancyCraftingTable && name.getString().toLowerCase().contains("craft item") -> {
+				SkyblockCraftingTableScreenHandler skyblockCraftingTableScreenHandler = new SkyblockCraftingTableScreenHandler(containerScreenHandler, player.getInventory());
+				client.player.currentScreenHandler = skyblockCraftingTableScreenHandler;
+				client.setScreen(new SkyblockCraftingTableScreen(skyblockCraftingTableScreenHandler, player.getInventory(), Text.literal("Craft Item")));
+				ci.cancel();
+			}
+
+			case null, default -> {}
+		}
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java
new file mode 100644
index 00000000..897b98b3
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java
@@ -0,0 +1,144 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import com.llamalad7.mixinextras.sugar.Local;
+import com.mojang.blaze3d.systems.RenderSystem;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
+import de.hysky.skyblocker.events.HudRenderEvents;
+import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
+import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
+import de.hysky.skyblocker.skyblock.item.ItemProtection;
+import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds;
+import de.hysky.skyblocker.utils.Utils;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.LayeredDrawer;
+import net.minecraft.client.gui.hud.InGameHud;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
+
+import java.util.function.Supplier;
+import java.util.regex.Pattern;
+
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+import org.spongepowered.asm.mixin.injection.Slice;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Environment(EnvType.CLIENT)
+@Mixin(InGameHud.class)
+public abstract class InGameHudMixin {
+    @Unique
+    private static final Supplier<Identifier> SLOT_LOCK_ICON = () -> SkyblockerConfigManager.get().general.itemProtection.slotLockStyle.tex;
+
+    @Unique
+    private static final Identifier ITEM_PROTECTION = new Identifier(SkyblockerMod.NAMESPACE, "textures/gui/item_protection.png");
+    @Unique
+    private static final Pattern DICER_TITLE_BLACKLIST = Pattern.compile(".+? DROP!");
+
+    @Unique
+    private final FancyStatusBars statusBars = new FancyStatusBars();
+
+    @Shadow
+    @Final
+    private MinecraftClient client;
+
+    @Shadow
+    @Final
+    private LayeredDrawer layeredDrawer;
+
+    @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0))
+    public void skyblocker$renderHotbarItemLockOrRarityBg(CallbackInfo ci, @Local(argsOnly = true) DrawContext context, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) {
+        if (Utils.isOnSkyblock()) {
+            // slot lock
+            if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().main.get(index), context, x, y);
+            if (HotbarSlotLock.isLocked(index)) {
+                RenderSystem.enableBlend();
+                context.drawTexture(SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16);
+                RenderSystem.disableBlend();
+            }
+            //item protection
+            if (ItemProtection.isItemProtected(player.getInventory().main.get(index))) {
+                RenderSystem.enableBlend();
+                context.drawTexture(ITEM_PROTECTION, x, y, 0, 0, 16, 16, 16, 16);
+                RenderSystem.disableBlend();
+            }
+        }
+    }
+
+    @Inject(method = { "renderExperienceBar", "renderExperienceLevel" }, at = @At("HEAD"), cancellable = true)
+    private void skyblocker$renderExperienceBar(CallbackInfo ci) {
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift())
+            ci.cancel();
+    }
+
+    @Inject(method = "renderStatusBars", at = @At("HEAD"), cancellable = true)
+    private void skyblocker$renderStatusBars(DrawContext context, CallbackInfo ci) {
+        if (!Utils.isOnSkyblock())
+            return;
+        if (statusBars.render(context, context.getScaledWindowWidth(), context.getScaledWindowHeight()))
+            ci.cancel();
+    }
+
+    @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true)
+    private void skyblocker$renderMountHealth(CallbackInfo ci) {
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift())
+            ci.cancel();
+    }
+
+    @Inject(method = "renderStatusEffectOverlay", at = @At("HEAD"), cancellable = true)
+    private void skyblocker$dontRenderStatusEffects(CallbackInfo ci) {
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
+    }
+
+    @ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getAttackCooldownProgress(F)F"))
+    private float skyblocker$modifyAttackIndicatorCooldown(float cooldownProgress) {
+        if (Utils.isOnSkyblock() && client.player != null) {
+            ItemStack stack = client.player.getMainHandStack();
+            if (ItemCooldowns.isOnCooldown(stack)) {
+                return ItemCooldowns.getItemCooldownEntry(stack).getRemainingCooldownPercent();
+            }
+        }
+
+        return cooldownProgress;
+    }
+
+    @Inject(method = "setTitle", at = @At("HEAD"), cancellable = true)
+    private void skyblocker$dicerTitlePrevent(Text title, CallbackInfo ci) {
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.garden.dicerTitlePrevent && title != null && DICER_TITLE_BLACKLIST.matcher(title.getString()).matches()) {
+            ci.cancel();
+        }
+    }
+
+    @ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 2))
+    private LayeredDrawer.Layer skyblocker$afterMainHud(LayeredDrawer.Layer mainHudLayer) {
+        return (context, tickDelta) -> {
+        	mainHudLayer.render(context, tickDelta);
+        	HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta);
+        };
+    }
+
+    @ModifyArg(method = "<init>", slice = @Slice(from = @At(value = "NEW", target = "Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 1)), at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/LayeredDrawer;addLayer(Lnet/minecraft/client/gui/LayeredDrawer$Layer;)Lnet/minecraft/client/gui/LayeredDrawer;", ordinal = 5))
+    private LayeredDrawer.Layer skyblocker$beforeChat(LayeredDrawer.Layer beforeChatLayer) {
+        return (context, tickDelta) -> {
+        	HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta);
+        	beforeChatLayer.render(context, tickDelta);
+        };
+    }
+
+    @Inject(method = "<init>", at = @At("TAIL"))
+    private void skyblocker$afterDrawersInitialized(CallbackInfo ci) {
+        this.layeredDrawer.addLayer(HudRenderEvents.LAST.invoker()::onRender);
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java
new file mode 100644
index 00000000..c7704558
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/InGameOverlayRendererMixin.java
@@ -0,0 +1,22 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import net.minecraft.client.gui.hud.InGameOverlayRenderer;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+
+@Mixin(InGameOverlayRenderer.class)
+public class InGameOverlayRendererMixin {
+
+    @ModifyArg(method = "renderFireOverlay", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/BufferBuilder;vertex(Lorg/joml/Matrix4f;FFF)Lnet/minecraft/client/render/VertexConsumer;"))
+    private static float configureFlameHeight(float y) {
+        return y - (0.5f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameHeight / 200.0f));
+    }
+
+    @ModifyArg(method = "renderFireOverlay", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/VertexConsumer;color(FFFF)Lnet/minecraft/client/render/VertexConsumer;"))
+    private static float configureFlameOpacity(float opacity) {
+        return opacity - (0.8f - ((float) SkyblockerConfigManager.get().general.flameOverlay.flameOpacity / 125.0f));
+    }
+
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java
new file mode 100644
index 00000000..0d833c22
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java
@@ -0,0 +1,18 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.itemlist.ItemListWidget;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.gui.screen.ingame.InventoryScreen;
+import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(InventoryScreen.class)
+public abstract class InventoryScreenMixin {
+    @ModifyExpressionValue(method = "<init>", at = @At(value = "NEW", target = "net/minecraft/client/gui/screen/recipebook/RecipeBookWidget"))
+    private RecipeBookWidget skyblocker$replaceRecipeBook(RecipeBookWidget original) {
+        return SkyblockerConfigManager.get().general.itemList.enableItemList && Utils.isOnSkyblock() ? new ItemListWidget() : original;
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java
new file mode 100644
index 00000000..c56a0268
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/ItemStackMixin.java
@@ -0,0 +1,98 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyReturnValue;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
+import it.unimi.dsi.fastutil.ints.IntIntPair;
+import net.minecraft.item.ItemStack;
+import net.minecraft.text.Text;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(ItemStack.class)
+public abstract class ItemStackMixin {
+
+	@Shadow
+	public abstract int getDamage();
+
+	@Shadow
+	public abstract void setDamage(int damage);
+
+	@Unique
+	private int maxDamage;
+
+	@ModifyReturnValue(method = "getName", at = @At("RETURN"))
+	private Text skyblocker$customItemNames(Text original) {
+		if (Utils.isOnSkyblock()) {
+			return SkyblockerConfigManager.get().general.customItemNames.getOrDefault(ItemUtils.getItemUuid((ItemStack) (Object) this), original);
+		}
+
+		return original;
+	}
+
+	/**
+	 * Updates the durability of this item stack every tick when in the inventory.
+	 */
+	@Inject(method = "inventoryTick", at = @At("TAIL"))
+	private void skyblocker$updateDamage(CallbackInfo ci) {
+		if (!skyblocker$shouldProcess()) {
+			return;
+		}
+		skyblocker$getAndCacheDurability();
+	}
+
+	@ModifyReturnValue(method = "getDamage", at = @At("RETURN"))
+	private int skyblocker$handleDamage(int original) {
+		// If the durability is already calculated, the original value should be the damage
+		if (!skyblocker$shouldProcess() || maxDamage != 0) {
+			return original;
+		}
+		return skyblocker$getAndCacheDurability() ? getDamage() : original;
+	}
+
+	@ModifyReturnValue(method = "getMaxDamage", at = @At("RETURN"))
+	private int skyblocker$handleMaxDamage(int original) {
+		if (!skyblocker$shouldProcess()) {
+			return original;
+		}
+		// If the max damage is already calculated, return it
+		if (maxDamage != 0) {
+			return maxDamage;
+		}
+		return skyblocker$getAndCacheDurability() ? maxDamage : original;
+	}
+
+	@ModifyReturnValue(method = "isDamageable", at = @At("RETURN"))
+	private boolean skyblocker$handleDamageable(boolean original) {
+		return skyblocker$shouldProcess() || original;
+	}
+
+	@ModifyReturnValue(method = "isDamaged", at = @At("RETURN"))
+	private boolean skyblocker$handleDamaged(boolean original) {
+		return skyblocker$shouldProcess() || original;
+	}
+
+	@Unique
+	private boolean skyblocker$shouldProcess() {
+		return Utils.isOnSkyblock() && SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel && ItemUtils.hasCustomDurability((ItemStack) (Object) this);
+	}
+
+	@Unique
+	private boolean skyblocker$getAndCacheDurability() {
+		// Calculate the durability
+		IntIntPair durability = ItemUtils.getDurability((ItemStack) (Object) this);
+		// Return if calculating the durability failed
+		if (durability == null) {
+			return false;
+		}
+		// Saves the calculated durability
+		maxDamage = durability.rightInt();
+		setDamage(durability.rightInt() - durability.leftInt());
+		return true;
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java b/src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java
new file mode 100644
index 00000000..eb8c6bf6
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/LeverBlockMixin.java
@@ -0,0 +1,29 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.skyblock.dungeon.OldLever;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.LeverBlock;
+import net.minecraft.block.WallMountedBlock;
+import net.minecraft.util.shape.VoxelShape;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+import com.llamalad7.mixinextras.sugar.Local;
+
+@Mixin(LeverBlock.class)
+public abstract class LeverBlockMixin extends WallMountedBlock {
+    protected LeverBlockMixin(Settings settings) {
+        super(settings);
+    }
+
+    @Inject(method = "getOutlineShape", at = @At("HEAD"), cancellable = true)
+    public void skyblocker$onGetOutlineShape(CallbackInfoReturnable<VoxelShape> cir, @Local(argsOnly = true) BlockState state) {
+        if (Utils.isOnSkyblock()) {
+            VoxelShape shape = OldLever.getShape(state.get(FACE), state.get(FACING));
+            if (shape != null) cir.setReturnValue(shape);
+        }
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java
new file mode 100644
index 00000000..ba3e5067
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/LivingEntityRendererMixin.java
@@ -0,0 +1,18 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import de.hysky.skyblocker.debug.Debug;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.render.entity.LivingEntityRenderer;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.entity.decoration.ArmorStandEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(LivingEntityRenderer.class)
+public class LivingEntityRendererMixin {
+    @ModifyExpressionValue(method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/LivingEntityRenderer;isVisible(Lnet/minecraft/entity/LivingEntity;)Z"))
+    private <T extends LivingEntity> boolean skyblocker$armorStandVisible(boolean visible, T entity) {
+        return entity instanceof ArmorStandEntity && Utils.isOnHypixel() && Debug.debugEnabled() || visible;
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java b/src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java
new file mode 100644
index 00000000..2495fdbf
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/MinecraftClientMixin.java
@@ -0,0 +1,60 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
+import de.hysky.skyblocker.skyblock.item.ItemProtection;
+import de.hysky.skyblocker.utils.JoinWorldPlaceholderScreen;
+import de.hysky.skyblocker.utils.ReconfiguringPlaceholderScreen;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.screen.DownloadingTerrainScreen;
+import net.minecraft.client.gui.screen.ReconfiguringScreen;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.network.ClientPlayNetworkHandler;
+import net.minecraft.client.network.ClientPlayerEntity;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+import org.spongepowered.asm.mixin.injection.ModifyVariable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(MinecraftClient.class)
+public abstract class MinecraftClientMixin {
+
+    @Shadow
+    @Nullable
+    public abstract ClientPlayNetworkHandler getNetworkHandler();
+
+    @Shadow
+    @Nullable
+    public ClientPlayerEntity player;
+
+    @Inject(method = "handleInputEvents", at = @At("HEAD"))
+    public void skyblocker$handleInputEvents(CallbackInfo ci) {
+        if (Utils.isOnSkyblock()) {
+            HotbarSlotLock.handleInputEvents(player);
+            ItemProtection.handleHotbarKeyPressed(player);
+        }
+    }
+
+    //Remove Downloading Terrain Screen and Reconfiguring Screen
+    @ModifyVariable(at = @At("HEAD"), method = "setScreen", ordinal = 0, argsOnly = true)
+    public Screen modifySetScreen(Screen screen) {
+        if (Utils.isOnHypixel()) {
+            return switch (screen) {
+                case DownloadingTerrainScreen _s -> null;
+                case ReconfiguringScreen _s when this.getNetworkHandler() != null -> new ReconfiguringPlaceholderScreen(this.getNetworkHandler().getConnection());
+
+                case null, default -> screen;
+            };
+        }
+        return screen;
+    }
+
+    @ModifyArg(method = "joinWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;reset(Lnet/minecraft/client/gui/screen/Screen;)V"), index = 0)
+    private Screen modifyJoinWorld(Screen screen) {
+        return Utils.isOnSkyblock() ? new JoinWorldPlaceholderScreen() : screen;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java b/src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java
new file mode 100644
index 00000000..fb156af2
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/MouseMixin.java
@@ -0,0 +1,19 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import de.hysky.skyblocker.skyblock.garden.LowerSensitivity;
+import net.minecraft.client.Mouse;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(Mouse.class)
+public class MouseMixin {
+
+    @ModifyExpressionValue(method = "updateMouse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", ordinal = 0))
+    public Object skyblocker$gardenMouseLock(Object original) {
+        if (LowerSensitivity.isSensitivityLowered())
+            return -1 / 3d;
+        else return original;
+
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java
new file mode 100644
index 00000000..35747267
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerInventoryMixin.java
@@ -0,0 +1,21 @@
+package de.hysky.skyblocker.mixins;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import de.hysky.skyblocker.skyblock.crimson.kuudra.ArrowPoisonWarning;
+import net.minecraft.entity.player.PlayerInventory;
+
+@Mixin(PlayerInventory.class)
+public class PlayerInventoryMixin {
+	@Shadow
+	public int selectedSlot;
+
+	@Inject(method = "scrollInHotbar", at = @At("TAIL"))
+	private void skyblocker$onHotbarScroll(CallbackInfo ci) {
+		ArrowPoisonWarning.tryWarn(selectedSlot);
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java
new file mode 100644
index 00000000..a1a9116c
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerListHudMixin.java
@@ -0,0 +1,57 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.tabhud.TabHud;
+import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
+import de.hysky.skyblocker.utils.Utils;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.hud.PlayerListHud;
+import net.minecraft.client.network.ClientPlayNetworkHandler;
+import net.minecraft.text.Text;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import com.llamalad7.mixinextras.sugar.Local;
+
+@Environment(EnvType.CLIENT)
+@Mixin(PlayerListHud.class)
+public class PlayerListHudMixin {
+    @Shadow
+    private Text footer;
+
+    @Inject(at = @At("HEAD"), method = "render", cancellable = true)
+    public void skyblocker$renderTabHud(CallbackInfo info, @Local(argsOnly = true) DrawContext context, @Local(argsOnly = true) int w) {
+        if (!Utils.isInDungeons() || !SkyblockerConfigManager.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) {
+            return;
+        }
+
+        ClientPlayNetworkHandler nwH = MinecraftClient.getInstance().getNetworkHandler();
+        if (nwH == null) {
+            return;
+        }
+
+        int h = MinecraftClient.getInstance().getWindow().getScaledHeight();
+        float scale = SkyblockerConfigManager.get().general.tabHud.tabHudScale / 100f;
+        w = (int) (w / scale);
+        h = (int) (h / scale);
+
+        PlayerListMgr.updateFooter(footer);
+
+        try {
+            ScreenMaster.render(context, w,h);
+            // Screen screen = Screen.getCorrect(w, h, footer);
+            // screen.render(context);
+            info.cancel();
+        } catch (Exception e) {
+            TabHud.LOGGER.error("[Skyblocker] Encountered unknown exception while drawing default hud", e);
+        }
+    }
+
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java
new file mode 100644
index 00000000..9cd2ef14
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinProviderMixin.java
@@ -0,0 +1,18 @@
+package de.hysky.skyblocker.mixins;
+
+import org.slf4j.Logger;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+
+import de.hysky.skyblocker.utils.Utils;
+
+@Mixin(targets = "net.minecraft.client.texture.PlayerSkinProvider$1")
+public class PlayerSkinProviderMixin {
+
+	@WrapWithCondition(method = "method_54647", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
+	private static boolean skyblocker$dontLogInvalidSignatureWarnings(Logger logger, String message, Object profileId) {
+		return !Utils.isOnHypixel();
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java
new file mode 100644
index 00000000..f9e2c8cd
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/PlayerSkinTextureMixin.java
@@ -0,0 +1,40 @@
+package de.hysky.skyblocker.mixins;
+
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.item.PlayerHeadHashCache;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.texture.NativeImage;
+import net.minecraft.client.texture.PlayerSkinTexture;
+
+@Mixin(PlayerSkinTexture.class)
+public class PlayerSkinTextureMixin {
+	@Shadow
+	@Final
+	private String url;
+
+	@Unique
+	private boolean isSkyblockSkinTexture;
+
+	@Inject(method = "remapTexture", at = @At("HEAD"))
+	private void skyblocker$determineSkinSource(CallbackInfoReturnable<NativeImage> cir) {
+		if (Utils.isOnSkyblock()) {
+			int skinHash = PlayerHeadHashCache.getSkinHash(this.url).hashCode();
+			this.isSkyblockSkinTexture = PlayerHeadHashCache.contains(skinHash);
+		}
+	}
+
+	@WrapWithCondition(method = "remapTexture", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/texture/PlayerSkinTexture;stripAlpha(Lnet/minecraft/client/texture/NativeImage;IIII)V"))
+	private boolean skyblocker$dontStripAlphaValues(NativeImage image, int x1, int y1, int x2, int y2) {
+		return !(SkyblockerConfigManager.get().general.dontStripSkinAlphaValues && this.isSkyblockSkinTexture);
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java b/src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java
new file mode 100644
index 00000000..71e7f56f
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/RenderFishMixin.java
@@ -0,0 +1,26 @@
+package de.hysky.skyblocker.mixins;
+
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.VertexConsumerProvider;
+import net.minecraft.client.render.entity.FishingBobberEntityRenderer;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.entity.projectile.FishingBobberEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(FishingBobberEntityRenderer.class)
+public abstract class RenderFishMixin {
+
+    @Inject(method = "render", at = @At("HEAD"), cancellable = true)
+    private void skyblocker$render(FishingBobberEntity fishingBobberEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) {
+        //if rendered bobber is not the players and option to hide  others is enabled do not render the bobber
+        if (Utils.isOnSkyblock() && fishingBobberEntity.getPlayerOwner() != MinecraftClient.getInstance().player && SkyblockerConfigManager.get().general.fishing.hideOtherPlayersRods) {
+            ci.cancel();
+        }
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java
new file mode 100644
index 00000000..94b39c0c
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/ScoreboardMixin.java
@@ -0,0 +1,16 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.scoreboard.Scoreboard;
+import org.slf4j.Logger;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+@Mixin(Scoreboard.class)
+public abstract class ScoreboardMixin {
+    @WrapWithCondition(method = "addTeam", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
+    private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object arg) {
+        return !Utils.isOnHypixel();
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java b/src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java
new file mode 100644
index 00000000..121e3045
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/SocialInteractionsPlayerListWidgetMixin.java
@@ -0,0 +1,24 @@
+package de.hysky.skyblocker.mixins;
+
+import java.util.Map;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
+
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListEntry;
+import net.minecraft.client.gui.screen.multiplayer.SocialInteractionsPlayerListWidget;
+
+@Mixin(SocialInteractionsPlayerListWidget.class)
+public class SocialInteractionsPlayerListWidgetMixin {
+
+	@WrapOperation(method = "setPlayers", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", remap = false))
+	private Object skyblocker$hideInvalidPlayers(Map<Object, Object> map, Object uuid, Object entry, Operation<Object> operation) {
+		if (Utils.isOnSkyblock() && !((SocialInteractionsPlayerListEntry) entry).getName().matches("[A-Za-z0-9_]+")) return null;
+
+		return operation.call(map, uuid, entry);
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java
new file mode 100644
index 00000000..d9df4b74
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/WindowMixin.java
@@ -0,0 +1,16 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
+import net.minecraft.client.util.Window;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(Window.class)
+public class WindowMixin {
+    @Inject(method = "setScaleFactor", at = @At("TAIL"))
+    public void skyblocker$onScaleFactorChange(double scaleFactor, CallbackInfo ci) {
+        FancyStatusBars.updatePositions();
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java
new file mode 100644
index 00000000..2959d4b5
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/WorldRendererMixin.java
@@ -0,0 +1,48 @@
+package de.hysky.skyblocker.mixins;
+
+import de.hysky.skyblocker.skyblock.dungeon.LividColor;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyVariable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
+import com.llamalad7.mixinextras.sugar.Local;
+import com.llamalad7.mixinextras.sugar.Share;
+import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
+
+import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes;
+import de.hysky.skyblocker.skyblock.entity.MobGlow;
+import net.minecraft.client.render.WorldRenderer;
+import net.minecraft.entity.Entity;
+import org.spongepowered.asm.mixin.injection.Slice;
+
+@Mixin(WorldRenderer.class)
+public class WorldRendererMixin {
+
+	@ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"))
+	private boolean skyblocker$shouldMobGlow(boolean original, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) {
+		boolean allowGlow = LividColor.allowGlow();
+		boolean shouldGlow = MobGlow.shouldMobGlow(entity);
+		hasCustomGlow.set(shouldGlow);
+		return allowGlow && original || shouldGlow;
+	}
+
+	@ModifyVariable(method = "render",
+			slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"), to = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;setColor(IIII)V")),
+			at = @At("STORE"), ordinal = 0
+	)
+	private int skyblocker$modifyGlowColor(int color, @Local Entity entity, @Share("hasCustomGlow") LocalBooleanRef hasCustomGlow) {
+		return hasCustomGlow.get() ? MobGlow.getGlowColor(entity) : color;
+	}
+
+	@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderEntity(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;)V"))
+	private void skyblocker$beforeEntityIsRendered(CallbackInfo ci, @Local Entity entity) {
+		boolean shouldShowBoundingBox = MobBoundingBoxes.shouldDrawMobBoundingBox(entity);
+
+		if (shouldShowBoundingBox) {
+			MobBoundingBoxes.submitBox2BeRendered(entity.getBoundingBox(), MobBoundingBoxes.getBoxColor(entity));
+		}
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java
new file mode 100644
index 00000000..17dbbb71
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilMinecraftSessionServiceMixin.java
@@ -0,0 +1,20 @@
+package de.hysky.skyblocker.mixins;
+
+import org.slf4j.Logger;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService;
+
+import de.hysky.skyblocker.utils.Utils;
+
+@Mixin(value = YggdrasilMinecraftSessionService.class, remap = false)
+public class YggdrasilMinecraftSessionServiceMixin {
+
+	//TODO perhaps investigate if we could fix this
+	@WrapWithCondition(method = "unpackTextures", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Throwable;)V", ordinal = 0, remap = false))
+	private boolean skyblocker$dontLogIncorrectEndingByteExceptions(Logger logger, String message, Throwable throwable) {
+		return !Utils.isOnHypixel() && throwable instanceof IllegalArgumentException;
+	}
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java
new file mode 100644
index 00000000..12621894
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/YggdrasilServicesKeyInfoMixin.java
@@ -0,0 +1,60 @@
+package de.hysky.skyblocker.mixins;
+
+import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
+import com.mojang.authlib.yggdrasil.YggdrasilServicesKeyInfo;
+
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
+import de.hysky.skyblocker.utils.Utils;
+import org.slf4j.Logger;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+
+import java.util.Base64;
+import java.util.Map;
+
+@Mixin(value = YggdrasilServicesKeyInfo.class, remap = false)
+public class YggdrasilServicesKeyInfoMixin {
+    @Shadow
+    @Final
+    private static Logger LOGGER;
+    @Unique
+    private static final Map<String, String> REPLACEMENT_MAP = Map.of();
+    @Unique
+    private static final IntList ERRONEUS_SIGNATURE_HASHES = new IntArrayList();
+
+    @WrapOperation(method = "validateProperty", at = @At(value = "INVOKE", target = "Ljava/util/Base64$Decoder;decode(Ljava/lang/String;)[B", remap = false), remap = false)
+    private byte[] skyblocker$replaceKnownWrongBase64(Base64.Decoder decoder, String signature, Operation<byte[]> decode) {
+        try {
+            return decode.call(decoder, signature);
+        } catch (IllegalArgumentException e) {
+            try {
+                return decode.call(decoder, signature.replaceAll("[^A-Za-z0-9+/=]", ""));
+            } catch (IllegalArgumentException e2) {
+                if (Utils.isOnSkyblock()) {
+                    if (REPLACEMENT_MAP.containsKey(signature)) {
+                        return decode.call(decoder, REPLACEMENT_MAP.get(signature));
+                    }
+                    int signatureHashCode = signature.hashCode();
+                    if (!ERRONEUS_SIGNATURE_HASHES.contains(signatureHashCode)) {
+                    	ERRONEUS_SIGNATURE_HASHES.add(signatureHashCode);
+                        LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode base64 string No.{}: {}", ERRONEUS_SIGNATURE_HASHES.size() - 1, signature);
+                    } else {
+                        LOGGER.warn("[Skyblocker Base64 Fixer] Failed to decode the base64 string No.{} again", ERRONEUS_SIGNATURE_HASHES.indexOf(signatureHashCode));
+                    }
+                }
+            }
+            throw e;
+        }
+    }
+
+    @WrapWithCondition(method = "validateProperty", remap = false, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false))
+    private boolean skyblocker$dontLogFailedSignatureValidations(Logger logger, String message, Object property, Object exception) {
+        return !Utils.isOnHypixel();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java
new file mode 100644
index 00000000..833cfc22
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/BeaconBlockEntityRendererInvoker.java
@@ -0,0 +1,16 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.render.VertexConsumerProvider;
+import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer;
+import net.minecraft.client.util.math.MatrixStack;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+@Mixin(BeaconBlockEntityRenderer.class)
+public interface BeaconBlockEntityRendererInvoker {
+    @SuppressWarnings("unused")
+    @Invoker("renderBeam")
+    static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, float[] color) {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java
new file mode 100644
index 00000000..7a04630d
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java
@@ -0,0 +1,21 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.tooltip.TooltipComponent;
+import net.minecraft.client.gui.tooltip.TooltipPositioner;
+import net.minecraft.util.Identifier;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+import java.util.List;
+
+@Mixin(DrawContext.class)
+public interface DrawContextInvoker {
+
+    @Invoker
+    void invokeDrawTooltip(TextRenderer textRenderer, List<TooltipComponent> components, int x, int y, TooltipPositioner positioner);
+
+    @Invoker
+    void invokeDrawTexturedQuad(Identifier texture, int x1, int x2, int y1, int y2, int z, float u1, float u2, float v1, float v2, float red, float green, float blue, float alpha);
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java
new file mode 100644
index 00000000..4dfed6dc
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/EndermanEntityAccessor.java
@@ -0,0 +1,17 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.block.BlockState;
+import net.minecraft.entity.data.TrackedData;
+import net.minecraft.entity.mob.EndermanEntity;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import java.util.Optional;
+
+@Mixin(EndermanEntity.class)
+public interface EndermanEntityAccessor {
+    @Accessor
+    static TrackedData<Optional<BlockState>> getCARRIED_BLOCK() {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java
new file mode 100644
index 00000000..e4d04dde
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/FrustumInvoker.java
@@ -0,0 +1,14 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.render.Frustum;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+/**
+ * Use {@link de.hysky.skyblocker.utils.render.FrustumUtils#isVisible(double, double, double, double, double, double) FrustumUtils#isVisible} which is shorter. For the purpose of avoiding object allocations!
+ */
+@Mixin(Frustum.class)
+public interface FrustumInvoker {
+    @Invoker
+    boolean invokeIsVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ);
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java
new file mode 100644
index 00000000..447031d4
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/HandledScreenAccessor.java
@@ -0,0 +1,26 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.gui.screen.ingame.HandledScreen;
+import net.minecraft.screen.ScreenHandler;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Mutable;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(HandledScreen.class)
+public interface HandledScreenAccessor {
+    @Accessor("x")
+    int getX();
+
+    @Accessor("y")
+    int getY();
+
+    @Accessor
+    int getBackgroundWidth();
+
+    @Accessor
+    int getBackgroundHeight();
+
+    @Mutable
+    @Accessor("handler")
+    void setHandler(ScreenHandler handler);
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java
new file mode 100644
index 00000000..bf4f9bae
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/MessageHandlerAccessor.java
@@ -0,0 +1,14 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.network.message.MessageHandler;
+import net.minecraft.text.Text;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+import java.time.Instant;
+
+@Mixin(MessageHandler.class)
+public interface MessageHandlerAccessor {
+    @Invoker
+    void invokeAddToChatLog(Text message, Instant timestamp);
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java
new file mode 100644
index 00000000..d1fd1c46
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/PlayerListHudAccessor.java
@@ -0,0 +1,16 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.gui.hud.PlayerListHud;
+import net.minecraft.client.network.PlayerListEntry;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import java.util.Comparator;
+
+@Mixin(PlayerListHud.class)
+public interface PlayerListHudAccessor {
+    @Accessor("ENTRY_ORDERING")
+    static Comparator<PlayerListEntry> getOrdering() {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java
new file mode 100644
index 00000000..555a0d8a
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/RecipeBookWidgetAccessor.java
@@ -0,0 +1,15 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget;
+import net.minecraft.client.gui.widget.TextFieldWidget;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(RecipeBookWidget.class)
+public interface RecipeBookWidgetAccessor {
+    @Accessor
+    String getSearchText();
+
+    @Accessor
+    TextFieldWidget getSearchField();
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java
new file mode 100644
index 00000000..c3544302
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/ScreenAccessor.java
@@ -0,0 +1,14 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.text.Text;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Mutable;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(Screen.class)
+public interface ScreenAccessor {
+    @Accessor
+    @Mutable
+    void setTitle(Text title);
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java
new file mode 100644
index 00000000..34c196b3
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/SkullBlockEntityAccessor.java
@@ -0,0 +1,18 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import com.mojang.authlib.GameProfile;
+import net.minecraft.block.entity.SkullBlockEntity;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+@Mixin(SkullBlockEntity.class)
+public interface SkullBlockEntityAccessor {
+    @Invoker
+    static CompletableFuture<Optional<GameProfile>> invokeFetchProfileByName(String name) {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java
new file mode 100644
index 00000000..7c261458
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/SlotAccessor.java
@@ -0,0 +1,17 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import net.minecraft.screen.slot.Slot;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Mutable;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(Slot.class)
+public interface SlotAccessor {
+    @Mutable
+    @Accessor("x")
+    void setX(int x);
+
+    @Mutable
+    @Accessor("y")
+    void setY(int y);
+}
diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java
new file mode 100644
index 00000000..e52b1c85
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/WorldRendererAccessor.java
@@ -0,0 +1,13 @@
+package de.hysky.skyblocker.mixins.accessors;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import net.minecraft.client.render.Frustum;
+import net.minecraft.client.render.WorldRenderer;
+
+@Mixin(WorldRenderer.class)
+public interface WorldRendererAccessor {
+    @Accessor
+    Frustum getFrustum();
+}
\ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java b/src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java
new file mode 100644
index 00000000..79a93e69
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixins/discordipc/ConnectionMixin.java
@@ -0,0 +1,20 @@
+package de.hysky.skyblocker.mixins.discordipc;
+
+import de.hysky.skyblocker.utils.discord.DiscordRPCManager;
+import meteordevelopment.discordipc.DiscordIPC;
+import meteordevelopment.discordipc.connection.UnixConnection;
+import meteordevelopment.discordipc.connection.WinConnection;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+import java.io.IOException;
+
+@Mixin(value = {UnixConnection.class, WinConnection.class}, remap = false)
+public class ConnectionMixin {
+    @Redirect(method = "write", at = @At(value = "INVOKE", target = "Ljava/io/IOException;printStackTrace()V"))
+    private void write(IOException e) {
+        DiscordIPC.stop();
+        DiscordRPCManager.LOGGER.warn("[Skyblocker] Discord RPC failed to update activity, connection lost", e);
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
index c34c853b..e04a30ef 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
@@ -3,8 +3,8 @@ package de.hysky.skyblocker.skyblock;
 import com.google.gson.JsonObject;
 import de.hysky.skyblocker.config.SkyblockerConfig;
 import de.hysky.skyblocker.config.SkyblockerConfigManager;
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
-import de.hysky.skyblocker.mixin.accessor.ScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.ScreenAccessor;
 import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
 import de.hysky.skyblocker.skyblock.item.tooltip.TooltipInfoType;
 import de.hysky.skyblocker.utils.ItemUtils;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
index 8862185f..a44a3102 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
@@ -20,7 +20,7 @@ import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.arg
 import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
 
 /**
- * the mixin {@link de.hysky.skyblocker.mixin.CommandTreeS2CPacketMixin}
+ * the mixin {@link de.hysky.skyblocker.mixins.CommandTreeS2CPacketMixin}
  */
 public class WarpAutocomplete {
     private static final Logger LOGGER = LoggerFactory.getLogger(WarpAutocomplete.class);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
index 28898cdc..4c4e1c0f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionHouseScreenHandler.java
@@ -1,6 +1,6 @@
 package de.hysky.skyblocker.skyblock.auction;
 
-import de.hysky.skyblocker.mixin.accessor.SlotAccessor;
+import de.hysky.skyblocker.mixins.accessors.SlotAccessor;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.inventory.Inventory;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
index d7de2c75..e4fea9ec 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
@@ -6,7 +6,7 @@ import com.google.gson.JsonParser;
 import com.mojang.serialization.Codec;
 import com.mojang.serialization.JsonOps;
 import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.mixin.accessor.MessageHandlerAccessor;
+import de.hysky.skyblocker.mixins.accessors.MessageHandlerAccessor;
 import de.hysky.skyblocker.utils.Http;
 import de.hysky.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java
index 157519b5..a9ffafec 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyEntry.java
@@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon.partyfinder;
 
 import com.mojang.authlib.properties.PropertyMap;
 import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.mixin.accessor.SkullBlockEntityAccessor;
+import de.hysky.skyblocker.mixins.accessors.SkullBlockEntityAccessor;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
index 392ee100..c5279c61 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/CompactorDeletorPreview.java
@@ -1,6 +1,6 @@
 package de.hysky.skyblocker.skyblock.item.tooltip;
 
-import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker;
+import de.hysky.skyblocker.mixins.accessors.DrawContextInvoker;
 import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
 import de.hysky.skyblocker.utils.ItemUtils;
 import it.unimi.dsi.fastutil.ints.IntIntPair;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
index 5570c4f7..6120528c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/ItemListWidget.java
@@ -1,7 +1,8 @@
 package de.hysky.skyblocker.skyblock.itemlist;
 
 import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.mixin.accessor.RecipeBookWidgetAccessor;
+
+import de.hysky.skyblocker.mixins.accessors.RecipeBookWidgetAccessor;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 import net.minecraft.client.MinecraftClient;
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 28ffc930..7db78590 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/quicknav/QuickNavButton.java
@@ -2,7 +2,7 @@ package de.hysky.skyblocker.skyblock.quicknav;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
 import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java
index 3ef968a3..472cf700 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java
@@ -4,7 +4,7 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import de.hysky.skyblocker.mixin.accessor.PlayerListHudAccessor;
+import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor;
 import de.hysky.skyblocker.utils.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java b/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java
index 3fe79e43..d82b4497 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/FrustumUtils.java
@@ -1,7 +1,7 @@
 package de.hysky.skyblocker.utils.render;
 
-import de.hysky.skyblocker.mixin.accessor.FrustumInvoker;
-import de.hysky.skyblocker.mixin.accessor.WorldRendererAccessor;
+import de.hysky.skyblocker.mixins.accessors.FrustumInvoker;
+import de.hysky.skyblocker.mixins.accessors.WorldRendererAccessor;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.render.Frustum;
 import net.minecraft.util.math.Box;
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
index 4d97e733..a6772fb2 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
@@ -3,8 +3,8 @@ package de.hysky.skyblocker.utils.render;
 import com.mojang.blaze3d.systems.RenderSystem;
 import com.mojang.logging.LogUtils;
 import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker;
-import de.hysky.skyblocker.mixin.accessor.DrawContextInvoker;
+import de.hysky.skyblocker.mixins.accessors.BeaconBlockEntityRendererInvoker;
+import de.hysky.skyblocker.mixins.accessors.DrawContextInvoker;
 import de.hysky.skyblocker.utils.render.culling.OcclusionCulling;
 import de.hysky.skyblocker.utils.render.title.Title;
 import de.hysky.skyblocker.utils.render.title.TitleContainer;
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java
index 4f648b8c..ef2e6bf9 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractCustomHypixelGUI.java
@@ -1,6 +1,6 @@
 package de.hysky.skyblocker.utils.render.gui;
 
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
 import de.hysky.skyblocker.skyblock.auction.AuctionHouseScreenHandler;
 import net.minecraft.client.gui.screen.ingame.HandledScreen;
 import net.minecraft.entity.player.PlayerInventory;
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java
index 440809d9..b37c57a4 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/ContainerSolverManager.java
@@ -1,7 +1,8 @@
 package de.hysky.skyblocker.utils.render.gui;
 
 import com.mojang.blaze3d.systems.RenderSystem;
-import de.hysky.skyblocker.mixin.accessor.HandledScreenAccessor;
+
+import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
 import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakeBagHelper;
 import de.hysky.skyblocker.skyblock.accessories.newyearcakes.NewYearCakesHelper;
 import de.hysky.skyblocker.skyblock.dungeon.CroesusHelper;
diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json
index 2d91eb0d..0032a557 100644
--- a/src/main/resources/skyblocker.mixins.json
+++ b/src/main/resources/skyblocker.mixins.json
@@ -1,6 +1,6 @@
 {
   "required": true,
-  "package": "de.hysky.skyblocker.mixin",
+  "package": "de.hysky.skyblocker.mixins",
   "plugin": "de.hysky.skyblocker.compatibility.MixinPlugin",
   "compatibilityLevel": "JAVA_21",
   "client": [
@@ -37,18 +37,18 @@
     "WorldRendererMixin",
     "YggdrasilMinecraftSessionServiceMixin",
     "YggdrasilServicesKeyInfoMixin",
-    "accessor.BeaconBlockEntityRendererInvoker",
-    "accessor.DrawContextInvoker",
-    "accessor.EndermanEntityAccessor",
-    "accessor.FrustumInvoker",
-    "accessor.HandledScreenAccessor",
-    "accessor.MessageHandlerAccessor",
-    "accessor.PlayerListHudAccessor",
-    "accessor.RecipeBookWidgetAccessor",
-    "accessor.ScreenAccessor",
-    "accessor.SkullBlockEntityAccessor",
-    "accessor.SlotAccessor",
-    "accessor.WorldRendererAccessor",
+    "accessors.BeaconBlockEntityRendererInvoker",
+    "accessors.DrawContextInvoker",
+    "accessors.EndermanEntityAccessor",
+    "accessors.FrustumInvoker",
+    "accessors.HandledScreenAccessor",
+    "accessors.MessageHandlerAccessor",
+    "accessors.PlayerListHudAccessor",
+    "accessors.RecipeBookWidgetAccessor",
+    "accessors.ScreenAccessor",
+    "accessors.SkullBlockEntityAccessor",
+    "accessors.SlotAccessor",
+    "accessors.WorldRendererAccessor",
     "discordipc.ConnectionMixin"
   ],
   "injectors": {
-- 
cgit