From 776dadb050b4e7d76de9fa16161d2cda4dd66e5b Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Sun, 3 Sep 2023 16:36:08 -0400
Subject: YACL Config

---
 .../utils/discord/DiscordRPCManager.java           |  3 +-
 .../utils/render/title/TitleContainer.java         | 25 ++++++++--------
 .../render/title/TitleContainerConfigScreen.java   | 35 +++++++++++-----------
 3 files changed, 32 insertions(+), 31 deletions(-)

(limited to 'src/main/java/me/xmrvizzy/skyblocker/utils')

diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java
index 58408944..5360741d 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java
@@ -1,7 +1,6 @@
 package me.xmrvizzy.skyblocker.utils.discord;
 
 
-import me.shedaniel.autoconfig.AutoConfig;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.utils.SkyblockEvents;
 import me.xmrvizzy.skyblocker.utils.Utils;
@@ -41,7 +40,7 @@ public class DiscordRPCManager {
         // If the custom message is empty, discord will keep the last message, this is can serve as a default if the user doesn't want a custom message
         if (SkyblockerConfig.get().richPresence.customMessage.isEmpty()) {
             SkyblockerConfig.get().richPresence.customMessage = "Playing Skyblock";
-            AutoConfig.getConfigHolder(SkyblockerConfig.class).save();
+            SkyblockerConfig.save();
         }
         if (SkyblockerConfig.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3;
         initAndUpdatePresence();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java
index 2555572c..5044b814 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java
@@ -1,5 +1,6 @@
 package me.xmrvizzy.skyblocker.utils.render.title;
 
+import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
@@ -92,8 +93,8 @@ public class TitleContainer {
         float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F);
 
         // Grab direction and alignment values
-        SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
-        SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+        ConfigModel.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
+        ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
         // x/y refer to the starting position for the text
         // y always starts at yPos
         float x = 0;
@@ -105,8 +106,8 @@ public class TitleContainer {
             width += textRenderer.getWidth(title.getText()) * scale + 10;
         }
 
-        if (alignment == SkyblockerConfig.Alignment.MIDDLE) {
-            if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
+        if (alignment == ConfigModel.Alignment.MIDDLE) {
+            if (direction == ConfigModel.Direction.HORIZONTAL) {
                 //If middle aligned horizontally, start the xPosition at half of the width to the left.
                 x = xPos - (width / 2);
             } else {
@@ -114,7 +115,7 @@ public class TitleContainer {
                 x = xPos;
             }
         }
-        if (alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) {
+        if (alignment == ConfigModel.Alignment.LEFT || alignment == ConfigModel.Alignment.RIGHT) {
             //If left or right aligned, start at xPos, we will shift each text later
             x = xPos;
         }
@@ -123,14 +124,14 @@ public class TitleContainer {
 
             //Calculate which x the text should use
             float xToUse;
-            if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
-                xToUse = alignment == SkyblockerConfig.Alignment.RIGHT ?
+            if (direction == ConfigModel.Direction.HORIZONTAL) {
+                xToUse = alignment == ConfigModel.Alignment.RIGHT ?
                         x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side.
                         x;
             } else {
-                xToUse = alignment == SkyblockerConfig.Alignment.MIDDLE ?
+                xToUse = alignment == ConfigModel.Alignment.MIDDLE ?
                         x - (textRenderer.getWidth(title.getText()) * scale) / 2 : //if middle aligned we need the text position to be aligned in the middle.
-                        alignment == SkyblockerConfig.Alignment.RIGHT ?
+                        alignment == ConfigModel.Alignment.RIGHT ?
                                 x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side.
                                 x;
             }
@@ -155,13 +156,13 @@ public class TitleContainer {
             context.getMatrices().pop();
 
             //Calculate the x and y positions for the next title
-            if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
-                if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) {
+            if (direction == ConfigModel.Direction.HORIZONTAL) {
+                if (alignment == ConfigModel.Alignment.MIDDLE || alignment == ConfigModel.Alignment.LEFT) {
                     //Move to the right if middle or left aligned
                     x += textRenderer.getWidth(title.getText()) * scale + 10;
                 }
 
-                if (alignment == SkyblockerConfig.Alignment.RIGHT) {
+                if (alignment == ConfigModel.Alignment.RIGHT) {
                     //Move to the left if right aligned
                     x -= textRenderer.getWidth(title.getText()) * scale + 10;
                 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
index 29f87961..bd5f19f2 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
@@ -1,6 +1,7 @@
 package me.xmrvizzy.skyblocker.utils.render.title;
 
 import me.shedaniel.autoconfig.AutoConfig;
+import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import net.minecraft.client.gui.DrawContext;
@@ -30,8 +31,8 @@ public class TitleContainerConfigScreen extends Screen {
         super.render(context, mouseX, mouseY, delta);
         renderBackground(context, mouseX, mouseY, delta);
         TitleContainer.render(context, Set.of(example1, example2, example3), (int) hudX, (int) hudY, delta);
-        SkyblockerConfig.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
-        SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+        ConfigModel.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
+        ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
         context.drawCenteredTextWithShadow(textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, textRenderer.fontHeight * 2, Color.WHITE.getRGB());
         context.drawCenteredTextWithShadow(textRenderer, "Press R to change Direction: " + direction, width / 2, textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB());
         context.drawCenteredTextWithShadow(textRenderer, "Press +/- to change Scale", width / 2, textRenderer.fontHeight * 4 + 10, Color.WHITE.getRGB());
@@ -50,7 +51,7 @@ public class TitleContainerConfigScreen extends Screen {
     }
 
     private Pair<Vector2f, Vector2f> getSelectionBoundingBox() {
-        SkyblockerConfig.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+    	ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
 
         float midWidth = getSelectionWidth() / 2F;
         float x1 = 0;
@@ -76,14 +77,14 @@ public class TitleContainerConfigScreen extends Screen {
 
     private float getSelectionHeight() {
         float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F));
-        return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ?
+        return SkyblockerConfig.get().general.titleContainer.direction == ConfigModel.Direction.HORIZONTAL ?
                 (textRenderer.fontHeight * scale) :
                 (textRenderer.fontHeight + 10F) * 3F * scale;
     }
 
     private float getSelectionWidth() {
         float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F));
-        return SkyblockerConfig.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ?
+        return SkyblockerConfig.get().general.titleContainer.direction == ConfigModel.Direction.HORIZONTAL ?
                 (textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale :
                 textRenderer.getWidth("Testing1234") * scale;
     }
@@ -123,26 +124,26 @@ public class TitleContainerConfigScreen extends Screen {
     @Override
     public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
         if (keyCode == GLFW.GLFW_KEY_Q) {
-            SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
+        	ConfigModel.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
             SkyblockerConfig.get().general.titleContainer.alignment = switch (current) {
-                case LEFT -> SkyblockerConfig.Alignment.MIDDLE;
-                case MIDDLE -> SkyblockerConfig.Alignment.RIGHT;
-                case RIGHT -> SkyblockerConfig.Alignment.LEFT;
+                case LEFT -> ConfigModel.Alignment.MIDDLE;
+                case MIDDLE -> ConfigModel.Alignment.RIGHT;
+                case RIGHT -> ConfigModel.Alignment.LEFT;
             };
         }
         if (keyCode == GLFW.GLFW_KEY_E) {
-            SkyblockerConfig.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
+        	ConfigModel.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
             SkyblockerConfig.get().general.titleContainer.alignment = switch (current) {
-                case LEFT -> SkyblockerConfig.Alignment.RIGHT;
-                case MIDDLE -> SkyblockerConfig.Alignment.LEFT;
-                case RIGHT -> SkyblockerConfig.Alignment.MIDDLE;
+                case LEFT -> ConfigModel.Alignment.RIGHT;
+                case MIDDLE -> ConfigModel.Alignment.LEFT;
+                case RIGHT -> ConfigModel.Alignment.MIDDLE;
             };
         }
         if (keyCode == GLFW.GLFW_KEY_R) {
-            SkyblockerConfig.Direction current = SkyblockerConfig.get().general.titleContainer.direction;
+        	ConfigModel.Direction current = SkyblockerConfig.get().general.titleContainer.direction;
             SkyblockerConfig.get().general.titleContainer.direction = switch (current) {
-                case HORIZONTAL -> SkyblockerConfig.Direction.VERTICAL;
-                case VERTICAL -> SkyblockerConfig.Direction.HORIZONTAL;
+                case HORIZONTAL -> ConfigModel.Direction.VERTICAL;
+                case VERTICAL -> ConfigModel.Direction.HORIZONTAL;
             };
         }
         if (keyCode == GLFW.GLFW_KEY_EQUAL) {
@@ -158,7 +159,7 @@ public class TitleContainerConfigScreen extends Screen {
     public void close() {
         SkyblockerConfig.get().general.titleContainer.x = (int) hudX;
         SkyblockerConfig.get().general.titleContainer.y = (int) hudY;
-        AutoConfig.getConfigHolder(SkyblockerConfig.class).save();
+        SkyblockerConfig.save();
         super.close();
     }
 }
-- 
cgit 


From 04f97400a0216d7fdd1154b8c8fa64ac65df63cb Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Tue, 26 Sep 2023 12:49:48 -0400
Subject: Functionality Tweaks

---
 .../skyblocker/config/categories/GeneralCategory.java       |  6 ++++++
 .../skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java | 10 +---------
 .../skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java |  9 +--------
 .../skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java |  4 +---
 .../utils/render/title/TitleContainerConfigScreen.java      | 13 +++++++++----
 src/main/resources/assets/skyblocker/lang/en_us.json        |  1 +
 6 files changed, 19 insertions(+), 24 deletions(-)

(limited to 'src/main/java/me/xmrvizzy/skyblocker/utils')

diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
index aecf9374..1019703c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
@@ -12,6 +12,7 @@ import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder;
 import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.ConfigUtils;
 import me.xmrvizzy.skyblocker.skyblock.shortcut.ShortcutsConfigScreen;
+import me.xmrvizzy.skyblocker.utils.render.title.TitleContainerConfigScreen;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.text.Text;
 
@@ -424,6 +425,11 @@ public class GeneralCategory {
 										newValue -> config.general.titleContainer.alignment = newValue)
 								.controller(ConfigUtils::createCyclingListController4Enum)
 								.build())
+						.option(ButtonOption.createBuilder()
+								.name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.config"))
+								.text(Text.translatable("text.skyblocker.open"))
+								.action((screen, opt) -> MinecraftClient.getInstance().setScreen(new TitleContainerConfigScreen(screen)))
+								.build())
 						.build())
 				
 				//Teleport Overlays
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java
index 9f4cc6b7..88a9070e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java
@@ -1,6 +1,5 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.shedaniel.autoconfig.AutoConfig;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import net.minecraft.client.gui.DrawContext;
@@ -58,13 +57,6 @@ public class DungeonMapConfigScreen extends Screen {
 		SkyblockerConfig.get().locations.dungeons.mapX = hudX;
 		SkyblockerConfig.get().locations.dungeons.mapY = hudY;
 		SkyblockerConfig.save();
-		
-		if (parent != null) {
-			this.client.setScreen(parent);
-			
-			return;
-		}
-		
-		super.close();
+		this.client.setScreen(parent);
 	}
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
index e8684540..ee7c71a2 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
@@ -63,13 +63,6 @@ public class DwarvenHudConfigScreen extends Screen {
         SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x = hudX;
         SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y = hudY;
         SkyblockerConfig.save();
-        
-        if (parent != null) {
-            this.client.setScreen(parent);
-        	
-            return;
-        }
-        
-        super.close();
+        client.setScreen(parent);
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java
index 043582c4..d9fe850b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/ShortcutsConfigScreen.java
@@ -95,15 +95,13 @@ public class ShortcutsConfigScreen extends Screen {
         if (client != null && shortcutsConfigListWidget.hasChanges()) {
             client.setScreen(new ConfirmScreen(confirmedAction -> {
                 if (confirmedAction) {
-                	this.client.setScreen(parent);
-                    if (parent == null) super.close();
+                    this.client.setScreen(parent);
                 } else {
                     client.setScreen(this);
                 }
             }, Text.translatable("text.skyblocker.quit_config"), Text.translatable("text.skyblocker.quit_config_sure"), Text.translatable("text.skyblocker.quit_discard"), ScreenTexts.CANCEL));
         } else {
             this.client.setScreen(parent);
-            if (parent == null) super.close();
         }
     }
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
index bd5f19f2..d8e3b43c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
@@ -1,6 +1,5 @@
 package me.xmrvizzy.skyblocker.utils.render.title;
 
-import me.shedaniel.autoconfig.AutoConfig;
 import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
@@ -21,9 +20,15 @@ public class TitleContainerConfigScreen extends Screen {
     private final Title example3 = new Title(Text.literal("Testing1234").formatted(Formatting.DARK_GREEN));
     private float hudX = SkyblockerConfig.get().general.titleContainer.x;
     private float hudY = SkyblockerConfig.get().general.titleContainer.y;
-
+    private final Screen parent;
+    
     protected TitleContainerConfigScreen() {
-        super(Text.of("Title Container HUD Config"));
+    	this(null);
+    }
+
+    public TitleContainerConfigScreen(Screen parent) {
+		super(Text.of("Title Container HUD Config"));
+		this.parent = parent;
     }
 
     @Override
@@ -160,6 +165,6 @@ public class TitleContainerConfigScreen extends Screen {
         SkyblockerConfig.get().general.titleContainer.x = (int) hudX;
         SkyblockerConfig.get().general.titleContainer.y = (int) hudY;
         SkyblockerConfig.save();
-        super.close();
+        this.client.setScreen(parent);
     }
 }
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 7156bc62..fe246fe6 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -91,6 +91,7 @@
   "text.autoconfig.skyblocker.option.general.titleContainer.y": "Title Container Y Position",
   "text.autoconfig.skyblocker.option.general.titleContainer.direction": "Title Container Orientation",
   "text.autoconfig.skyblocker.option.general.titleContainer.alignment": "Title Container Horizontal Alignment",
+  "text.autoconfig.skyblocker.option.general.titleContainer.config": "Title Container Placement Config...",
   "text.autoconfig.skyblocker.option.general.teleportOverlay": "Teleport Overlay",
   "text.autoconfig.skyblocker.option.general.teleportOverlay.enableTeleportOverlays": "Enable Teleport Overlays",
   "text.autoconfig.skyblocker.option.general.teleportOverlay.enableWeirdTransmission": "Enable Weird Transmission Overlay",
-- 
cgit 


From 84aedfe464bc648cbb18b4f2a7eaeb695091b2b5 Mon Sep 17 00:00:00 2001
From: Aaron <51387595+AzureAaron@users.noreply.github.com>
Date: Tue, 26 Sep 2023 12:58:40 -0400
Subject: Rename Config Files

---
 .../java/me/xmrvizzy/skyblocker/SkyblockerMod.java |   4 +-
 .../compatibility/modmenu/ModMenuEntry.java        |   4 +-
 .../me/xmrvizzy/skyblocker/config/ConfigModel.java | 809 -------------------
 .../skyblocker/config/SkyblockerConfig.java        | 859 +++++++++++++++++++--
 .../skyblocker/config/SkyblockerConfigManager.java |  88 +++
 .../config/categories/DiscordRPCCategory.java      |   6 +-
 .../config/categories/DungeonsCategory.java        |   6 +-
 .../config/categories/DwarvenMinesCategory.java    |   6 +-
 .../config/categories/GeneralCategory.java         |  20 +-
 .../config/categories/LocationsCategory.java       |   4 +-
 .../config/categories/MessageFilterCategory.java   |   4 +-
 .../config/categories/QuickNavigationCategory.java |   4 +-
 .../config/categories/SlayersCategory.java         |   4 +-
 .../mixin/AbstractInventoryScreenMixin.java        |   4 +-
 .../xmrvizzy/skyblocker/mixin/ArmorTrimMixin.java  |   4 +-
 .../skyblocker/mixin/DrawContextMixin.java         |   6 +-
 .../skyblocker/mixin/DyeableItemMixin.java         |   4 +-
 .../skyblocker/mixin/FarmlandBlockMixin.java       |   4 +-
 .../skyblocker/mixin/HandledScreenMixin.java       |   8 +-
 .../xmrvizzy/skyblocker/mixin/InGameHudMixin.java  |  10 +-
 .../skyblocker/mixin/InventoryScreenMixin.java     |   4 +-
 .../xmrvizzy/skyblocker/mixin/ItemStackMixin.java  |   4 +-
 .../skyblocker/mixin/PlayerListHudMixin.java       |   6 +-
 .../skyblocker/mixin/WorldRendererMixin.java       |   4 +-
 .../xmrvizzy/skyblocker/skyblock/FairySouls.java   |   4 +-
 .../skyblocker/skyblock/FancyStatusBars.java       |  12 +-
 .../skyblocker/skyblock/FishingHelper.java         |   4 +-
 .../skyblocker/skyblock/HotbarSlotLock.java        |   8 +-
 .../skyblocker/skyblock/QuiverWarning.java         |   8 +-
 .../skyblocker/skyblock/StatusBarTracker.java      |   6 +-
 .../skyblocker/skyblock/TeleportOverlay.java       |  18 +-
 .../skyblocker/skyblock/barn/HungryHiker.java      |   4 +-
 .../skyblocker/skyblock/barn/TreasureHunter.java   |   4 +-
 .../skyblocker/skyblock/dungeon/CroesusHelper.java |   4 +-
 .../skyblocker/skyblock/dungeon/DungeonBlaze.java  |   4 +-
 .../skyblock/dungeon/DungeonChestProfit.java       |  10 +-
 .../skyblocker/skyblock/dungeon/DungeonMap.java    |  10 +-
 .../skyblock/dungeon/DungeonMapConfigScreen.java   |  14 +-
 .../skyblocker/skyblock/dungeon/LividColor.java    |  10 +-
 .../skyblocker/skyblock/dungeon/OldLever.java      |   4 +-
 .../skyblocker/skyblock/dungeon/Reparty.java       |   4 +-
 .../skyblocker/skyblock/dungeon/ThreeWeirdos.java  |   4 +-
 .../skyblocker/skyblock/dungeon/TicTacToe.java     |   4 +-
 .../skyblocker/skyblock/dungeon/Trivia.java        |   4 +-
 .../skyblock/dungeon/secrets/DungeonSecrets.java   |  10 +-
 .../skyblock/dungeon/secrets/SecretWaypoint.java   |   8 +-
 .../skyblock/dungeon/terminal/ColorTerminal.java   |   4 +-
 .../skyblock/dungeon/terminal/OrderTerminal.java   |   4 +-
 .../dungeon/terminal/StartsWithTerminal.java       |   4 +-
 .../skyblocker/skyblock/dwarven/DwarvenHud.java    |  20 +-
 .../skyblock/dwarven/DwarvenHudConfigScreen.java   |  12 +-
 .../skyblocker/skyblock/dwarven/Fetchur.java       |   4 +-
 .../skyblocker/skyblock/dwarven/Puzzler.java       |   4 +-
 .../skyblock/experiment/ChronomatronSolver.java    |   4 +-
 .../skyblock/experiment/ExperimentSolver.java      |   6 +-
 .../skyblock/experiment/SuperpairsSolver.java      |   4 +-
 .../skyblock/experiment/UltrasequencerSolver.java  |   4 +-
 .../skyblocker/skyblock/filters/AbilityFilter.java |   4 +-
 .../skyblocker/skyblock/filters/AdFilter.java      |   4 +-
 .../skyblocker/skyblock/filters/AoteFilter.java    |   4 +-
 .../skyblocker/skyblock/filters/AutopetFilter.java |   8 +-
 .../skyblocker/skyblock/filters/ComboFilter.java   |   4 +-
 .../skyblocker/skyblock/filters/HealFilter.java    |   4 +-
 .../skyblock/filters/ImplosionFilter.java          |   4 +-
 .../skyblock/filters/MoltenWaveFilter.java         |   4 +-
 .../skyblocker/skyblock/filters/ShowOffFilter.java |   4 +-
 .../skyblock/filters/TeleportPadFilter.java        |   4 +-
 .../skyblock/item/CustomArmorDyeColors.java        |   8 +-
 .../skyblocker/skyblock/item/CustomArmorTrims.java |   8 +-
 .../skyblocker/skyblock/item/CustomItemNames.java  |   8 +-
 .../skyblocker/skyblock/item/PriceInfoTooltip.java |  42 +-
 .../skyblocker/skyblock/quicknav/QuickNav.java     |  10 +-
 .../skyblocker/skyblock/rift/EffigyWaypoints.java  |   8 +-
 .../skyblock/rift/HealingMelonIndicator.java       |   6 +-
 .../skyblocker/skyblock/rift/ManiaIndicator.java   |   4 +-
 .../skyblock/rift/MirrorverseWaypoints.java        |   4 +-
 .../skyblocker/skyblock/rift/StakeIndicator.java   |   4 +-
 .../xmrvizzy/skyblocker/skyblock/rift/TheRift.java |  10 +-
 .../skyblock/rift/TwinClawsIndicator.java          |   6 +-
 .../skyblocker/skyblock/shortcut/Shortcuts.java    |  12 +-
 .../skyblock/special/SpecialEffects.java           |   4 +-
 .../skyblocker/skyblock/spidersden/Relics.java     |   4 +-
 .../skyblock/tabhud/util/ScreenConst.java          |   4 +-
 .../skyblock/tabhud/widget/PlayerListWidget.java   |   4 +-
 .../skyblocker/skyblock/tabhud/widget/Widget.java  |   4 +-
 .../tabhud/widget/component/PlayerComponent.java   |   4 +-
 .../utils/discord/DiscordRPCManager.java           |  30 +-
 .../utils/render/title/TitleContainer.java         |  30 +-
 .../render/title/TitleContainerConfigScreen.java   |  60 +-
 .../skyblock/dungeon/DungeonChestProfitTest.java   |   4 +-
 90 files changed, 1213 insertions(+), 1213 deletions(-)
 delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/config/ConfigModel.java
 create mode 100644 src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfigManager.java

(limited to 'src/main/java/me/xmrvizzy/skyblocker/utils')

diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index b28ad3d4..1c2e112e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -2,7 +2,7 @@ package me.xmrvizzy.skyblocker;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.*;
 import me.xmrvizzy.skyblocker.skyblock.dungeon.*;
 import me.xmrvizzy.skyblocker.skyblock.dungeon.secrets.DungeonSecrets;
@@ -69,7 +69,7 @@ public class SkyblockerMod implements ClientModInitializer {
         ClientTickEvents.END_CLIENT_TICK.register(this::tick);
         Utils.init();
         HotbarSlotLock.init();
-        SkyblockerConfig.init();
+        SkyblockerConfigManager.init();
         PriceInfoTooltip.init();
         WikiLookup.init();
         ItemRegistry.init();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java b/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java
index 7fd188bf..65287cc9 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/compatibility/modmenu/ModMenuEntry.java
@@ -2,7 +2,7 @@ package me.xmrvizzy.skyblocker.compatibility.modmenu;
 
 import com.terraformersmc.modmenu.api.ConfigScreenFactory;
 import com.terraformersmc.modmenu.api.ModMenuApi;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 
@@ -10,6 +10,6 @@ import net.fabricmc.api.Environment;
 public class ModMenuEntry implements ModMenuApi {
     @Override
     public ConfigScreenFactory<?> getModConfigScreenFactory() {
-        return parent -> SkyblockerConfig.createGUI(parent);
+        return parent -> SkyblockerConfigManager.createGUI(parent);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigModel.java b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigModel.java
deleted file mode 100644
index a8f27a35..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigModel.java
+++ /dev/null
@@ -1,809 +0,0 @@
-package me.xmrvizzy.skyblocker.config;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
-import dev.isxander.yacl3.config.ConfigEntry;
-import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
-import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
-import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims;
-import net.minecraft.client.resource.language.I18n;
-import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
-
-@SuppressWarnings("deprecation")
-public class ConfigModel {
-	@ConfigEntry
-	public int version = 1;
-	
-	@ConfigEntry
-	public General general = new General();
-
-	@ConfigEntry
-	public Locations locations = new Locations();
-
-	@ConfigEntry
-	public Slayer slayer = new Slayer();
-
-	@ConfigEntry
-	public QuickNav quickNav = new QuickNav();
-
-	@ConfigEntry
-	public Messages messages = new Messages();
-
-	@ConfigEntry
-	public RichPresence richPresence = new RichPresence();
-
-	public static class QuickNav {
-		@ConfigEntry
-		public boolean enableQuickNav = true;
-
-		@ConfigEntry
-		public QuickNavItem button1 = new QuickNavItem(true, new ItemData("diamond_sword"), "Your Skills", "/skills");
-
-		@ConfigEntry
-		public QuickNavItem button2 = new QuickNavItem(true, new ItemData("painting"), "Collections", "/collection");
-
-		/* REGEX Explanation
-		 * "Pets" : simple match on letters
-         * "(?: \\(\\d+\\/\\d+\\))?" : optional match on the non-capturing group for the page in the format " ($number/$number)"
-         */
-		@ConfigEntry
-		public QuickNavItem button3 = new QuickNavItem(true, new ItemData("bone"), "Pets(:? \\(\\d+\\/\\d+\\))?", "/pets");
-
-		/* REGEX Explanation
-		 * "Wardrobe" : simple match on letters
-		 * " \\([12]\\/2\\)" : match on the page either " (1/2)" or " (2/2)"
-		 */
-		@ConfigEntry
-		public QuickNavItem button4 = new QuickNavItem(true,
-				new ItemData("leather_chestplate", 1, "tag:{display:{color:8991416}}"), "Wardrobe \\([12]/2\\)",
-				"/wardrobe");
-
-		@ConfigEntry
-		public QuickNavItem button5 = new QuickNavItem(true, new ItemData("player_head", 1,
-				"tag:{SkullOwner:{Id:[I;-2081424676,-57521078,-2073572414,158072763],Properties:{textures:[{Value:\"ewogICJ0aW1lc3RhbXAiIDogMTU5MTMxMDU4NTYwOSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODBhMDc3ZTI0OGQxNDI3NzJlYTgwMDg2NGY4YzU3OGI5ZDM2ODg1YjI5ZGFmODM2YjY0YTcwNjg4MmI2ZWMxMCIKICAgIH0KICB9Cn0=\"}]}}}"),
-				"Sack of Sacks", "/sacks");
-
-		/* REGEX Explanation
-		 * "(?:Rift )?" : optional match on the non-capturing group "Rift "
-		 * "Storage" : simple match on letters
-		 * "(?: \\([12]\\/2\\))?" : optional match on the non-capturing group " (1/2)" or " (2/2)"
-		 */
-		@ConfigEntry
-		public QuickNavItem button6 = new QuickNavItem(true, new ItemData("ender_chest"),
-				"(?:Rift )?Storage(?: \\(1/2\\))?", "/storage");
-
-		@ConfigEntry
-		public QuickNavItem button7 = new QuickNavItem(true, new ItemData("player_head", 1,
-				"tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}"),
-				"none", "/hub");
-
-		@ConfigEntry
-		public QuickNavItem button8 = new QuickNavItem(true, new ItemData("player_head", 1,
-				"tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}"),
-				"none", "/warp dungeon_hub");
-
-		@ConfigEntry
-		public QuickNavItem button9 = new QuickNavItem(true, new ItemData("player_head", 1,
-				"tag:{SkullOwner:{Id:[I;-562285948,532499670,-1705302742,775653035],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjVkZjU1NTkyNjQzMGQ1ZDc1YWRlZDIxZGQ5NjE5Yjc2YzViN2NhMmM3ZjU0MDE0NDA1MjNkNTNhOGJjZmFhYiJ9fX0=\"}]}}}"),
-				"Visit prtl", "/visit prtl");
-
-		@ConfigEntry
-		public QuickNavItem button10 = new QuickNavItem(true, new ItemData("enchanting_table"), "Enchant Item",
-				"/etable");
-
-		@ConfigEntry
-		public QuickNavItem button11 = new QuickNavItem(true, new ItemData("anvil"), "Anvil", "/anvil");
-
-		@ConfigEntry
-		public QuickNavItem button12 = new QuickNavItem(true, new ItemData("crafting_table"), "Craft Item", "/craft");
-	}
-
-	public static class QuickNavItem {
-		public QuickNavItem(Boolean render, ItemData itemData, String uiTitle, String clickEvent) {
-			this.render = render;
-			this.item = itemData;
-			this.clickEvent = clickEvent;
-			this.uiTitle = uiTitle;
-		}
-
-		@ConfigEntry
-		public Boolean render;
-
-		@ConfigEntry
-		public ItemData item;
-
-		@ConfigEntry
-		public String uiTitle;
-		
-		@ConfigEntry
-		public String clickEvent;
-	}
-
-	public static class ItemData {
-		public ItemData(String itemName, int count, String nbt) {
-			this.itemName = itemName;
-			this.count = count;
-			this.nbt = nbt;
-		}
-
-		public ItemData(String itemName) {
-			this.itemName = itemName;
-			this.count = 1;
-			this.nbt = "";
-		}
-
-		@ConfigEntry
-		public String itemName;
-		
-		@ConfigEntry
-		public int count;
-		
-		@ConfigEntry
-		public String nbt;
-	}
-
-	public static class General {
-		@ConfigEntry
-		public boolean acceptReparty = true;
-		
-		@ConfigEntry
-		public boolean backpackPreviewWithoutShift = false;
-		
-		@ConfigEntry
-		public boolean compactorDeletorPreview = true;
-		
-		@ConfigEntry
-		public boolean hideEmptyTooltips = true;
-		
-		@ConfigEntry
-		public boolean hideStatusEffectOverlay = false;
-
-		@ConfigEntry
-		public TabHudConf tabHud = new TabHudConf();
-
-		@ConfigEntry
-		public Bars bars = new Bars();
-
-		@ConfigEntry
-		public Experiments experiments = new Experiments();
-
-		@ConfigEntry
-		public Fishing fishing = new Fishing();
-
-		@ConfigEntry
-		public FairySouls fairySouls = new FairySouls();
-
-		@ConfigEntry
-		public Shortcuts shortcuts = new Shortcuts();
-		
-		@ConfigEntry
-		public QuiverWarning quiverWarning = new QuiverWarning();
-
-		@ConfigEntry
-		public ItemList itemList = new ItemList();
-
-		@ConfigEntry
-		public ItemTooltip itemTooltip = new ItemTooltip();
-
-		@ConfigEntry
-		public ItemInfoDisplay itemInfoDisplay = new ItemInfoDisplay();
-		
-		@ConfigEntry
-		public SpecialEffects specialEffects = new SpecialEffects();
-
-		@ConfigEntry
-		public Hitbox hitbox = new Hitbox();
-
-		@ConfigEntry
-		public TitleContainer titleContainer = new TitleContainer();
-
-		@ConfigEntry
-		public TeleportOverlay teleportOverlay = new TeleportOverlay();
-
-		@ConfigEntry
-		public List<Integer> lockedSlots = new ArrayList<>();
-
-		@ConfigEntry
-		public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>();
-
-		@ConfigEntry
-		public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>();
-
-		@ConfigEntry
-		public Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customArmorTrims = new Object2ObjectOpenHashMap<>();
-	}
-
-	public static class TabHudConf {
-		@ConfigEntry
-		public boolean tabHudEnabled = true;
-
-		@ConfigEntry
-		public int tabHudScale = 100;
-		
-		@ConfigEntry
-		public boolean plainPlayerNames = false;
-		
-		@ConfigEntry
-		public NameSorting nameSorting = NameSorting.DEFAULT;
-	}
-
-	public enum NameSorting {
-		DEFAULT, ALPHABETICAL;
-
-		@Override
-		public String toString() {
-			return switch (this) {
-			case DEFAULT -> "Default";
-			case ALPHABETICAL -> "Alphabetical";
-			};
-		}
-	}
-
-	public static class Bars {
-		@ConfigEntry
-		public boolean enableBars = true;
-
-		@ConfigEntry
-		public BarPositions barpositions = new BarPositions();
-	}
-
-	public static class BarPositions {
-		@ConfigEntry
-		public BarPosition healthBarPosition = BarPosition.LAYER1;
-		
-		@ConfigEntry
-		public BarPosition manaBarPosition = BarPosition.LAYER1;
-		
-		@ConfigEntry
-		public BarPosition defenceBarPosition = BarPosition.LAYER1;
-		
-		@ConfigEntry
-		public BarPosition experienceBarPosition = BarPosition.LAYER1;
-
-	}
-
-	public enum BarPosition {
-		LAYER1, LAYER2, RIGHT, NONE;
-
-		@Override
-		public String toString() {
-			return I18n.translate("text.autoconfig.skyblocker.option.general.bars.barpositions." + name());
-		}
-
-		public int toInt() {
-			return switch (this) {
-			case LAYER1 -> 0;
-			case LAYER2 -> 1;
-			case RIGHT -> 2;
-			case NONE -> -1;
-			};
-		}
-	}
-
-	public static class Experiments {
-		@ConfigEntry
-		public boolean enableChronomatronSolver = true;
-		
-		@ConfigEntry
-		public boolean enableSuperpairsSolver = true;
-		
-		@ConfigEntry
-		public boolean enableUltrasequencerSolver = true;
-	}
-
-	public static class Fishing {
-		@ConfigEntry
-		public boolean enableFishingHelper = true;
-	}
-
-	public static class FairySouls {
-		@ConfigEntry
-		public boolean enableFairySoulsHelper = false;
-		
-		@ConfigEntry
-		public boolean highlightFoundSouls = true;
-		
-		@ConfigEntry
-		public boolean highlightOnlyNearbySouls = false;
-	}
-
-	public static class Shortcuts {
-		@ConfigEntry
-		public boolean enableShortcuts = true;
-		
-		@ConfigEntry
-		public boolean enableCommandShortcuts = true;
-		
-		@ConfigEntry
-		public boolean enableCommandArgShortcuts = true;
-	}
-	
-    public static class QuiverWarning {
-    	@ConfigEntry
-        public boolean enableQuiverWarning = true;
-    	
-    	@ConfigEntry
-        public boolean enableQuiverWarningInDungeons = true;
-    	
-    	@ConfigEntry
-        public boolean enableQuiverWarningAfterDungeon = true;
-    }
-
-	public static class Hitbox {
-		@ConfigEntry
-		public boolean oldFarmlandHitbox = true;
-		
-		@ConfigEntry
-		public boolean oldLeverHitbox = false;
-	}
-
-	public static class TitleContainer {
-		@ConfigEntry
-		public float titleContainerScale = 100;
-		
-		@ConfigEntry
-		public int x = 540;
-		
-		@ConfigEntry
-		public int y = 10;
-		
-		@ConfigEntry
-		public Direction direction = Direction.HORIZONTAL;
-		
-		@ConfigEntry
-		public Alignment alignment = Alignment.MIDDLE;
-	}
-
-	public static class TeleportOverlay {
-		@ConfigEntry
-		public boolean enableTeleportOverlays = true;
-		
-		@ConfigEntry
-		public boolean enableWeirdTransmission = true;
-		
-		@ConfigEntry
-		public boolean enableInstantTransmission = true;
-		
-		@ConfigEntry
-		public boolean enableEtherTransmission = true;
-		
-		@ConfigEntry
-		public boolean enableSinrecallTransmission = true;
-		
-		@ConfigEntry
-		public boolean enableWitherImpact = true;
-	}
-
-	public enum Direction {
-		HORIZONTAL, VERTICAL;
-
-		@Override
-		public String toString() {
-			return switch (this) {
-			case HORIZONTAL -> "Horizontal";
-			case VERTICAL -> "Vertical";
-			};
-		}
-	}
-
-	public enum Alignment {
-		LEFT, RIGHT, MIDDLE;
-
-		@Override
-		public String toString() {
-			return switch (this) {
-			case LEFT -> "Left";
-			case RIGHT -> "Right";
-			case MIDDLE -> "Middle";
-			};
-		}
-	}
-
-	public static class RichPresence {
-		@ConfigEntry
-		public boolean enableRichPresence = false;
-
-		@ConfigEntry
-		public Info info = Info.LOCATION;
-		
-		@ConfigEntry
-		public boolean cycleMode = false;
-		
-		@ConfigEntry
-		public String customMessage = "Playing Skyblock";
-	}
-
-	public static class ItemList {
-		@ConfigEntry
-		public boolean enableItemList = true;
-	}
-
-	public enum Average {
-		ONE_DAY, THREE_DAY, BOTH;
-
-		@Override
-		public String toString() {
-			return I18n.translate("text.autoconfig.skyblocker.option.general.itemTooltip.avg." + name());
-		}
-	}
-
-	public static class ItemTooltip {
-		@ConfigEntry
-		public boolean enableNPCPrice = true;
-		
-		@ConfigEntry
-		public boolean enableMotesPrice = true;
-		
-		@ConfigEntry
-		public boolean enableAvgBIN = true;
-		
-		@ConfigEntry
-		public Average avg = Average.THREE_DAY;
-		
-		@ConfigEntry
-		public boolean enableLowestBIN = true;
-		
-		@ConfigEntry
-		public boolean enableBazaarPrice = true;
-		
-		@ConfigEntry
-		public boolean enableMuseumDate = true;
-	}
-
-	public static class ItemInfoDisplay {
-		@ConfigEntry
-		public boolean attributeShardInfo = true;
-	}
-	
-	public static class SpecialEffects {
-		@ConfigEntry
-		public boolean rareDungeonDropEffects = true;
-	}
-
-	public static class Locations {
-		@ConfigEntry
-		public Barn barn = new Barn();
-
-		@ConfigEntry
-		public Dungeons dungeons = new Dungeons();
-
-		@ConfigEntry
-		public DwarvenMines dwarvenMines = new DwarvenMines();
-
-		@ConfigEntry
-		public Rift rift = new Rift();
-		
-		@ConfigEntry
-		public SpidersDen spidersDen = new SpidersDen();
-	}
-
-	public static class Dungeons {
-		@ConfigEntry
-		public SecretWaypoints secretWaypoints = new SecretWaypoints();
-		
-		@ConfigEntry
-		public DungeonChestProfit dungeonChestProfit = new DungeonChestProfit();
-		
-		@ConfigEntry
-		public boolean croesusHelper = true;
-		
-		@ConfigEntry
-		public boolean enableMap = true;
-		
-		@ConfigEntry
-		public float mapScaling = 1f;
-		
-		@ConfigEntry
-		public int mapX = 2;
-		
-		@ConfigEntry
-		public int mapY = 2;
-		
-		@ConfigEntry
-		public boolean starredMobGlow = true;
-		
-		@ConfigEntry
-		public boolean solveThreeWeirdos = true;
-		
-		@ConfigEntry
-		public boolean blazesolver = true;
-		
-		@ConfigEntry
-		public boolean solveTrivia = true;
-		
-		@ConfigEntry
-		public boolean solveTicTacToe = true;
-		
-		@ConfigEntry
-		public LividColor lividColor = new LividColor();
-		
-		@ConfigEntry
-		public Terminals terminals = new Terminals();
-	}
-
-	public static class SecretWaypoints {
-		@ConfigEntry
-		public boolean enableSecretWaypoints = true;
-		
-		@ConfigEntry
-		public boolean noInitSecretWaypoints = false;
-		
-		@ConfigEntry
-		public boolean enableEntranceWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableSuperboomWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableChestWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableItemWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableBatWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableWitherWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableLeverWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableFairySoulWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableStonkWaypoints = true;
-		
-		@ConfigEntry
-		public boolean enableDefaultWaypoints = true;
-	}
-	
-	public static class DungeonChestProfit {
-		@ConfigEntry
-		public boolean enableProfitCalculator = true;
-		
-		@ConfigEntry
-		public boolean includeKismet = false;
-		
-		@ConfigEntry
-		public boolean includeEssence = true;
-		
-		@ConfigEntry
-		public int neutralThreshold = 1000;
-		
-		@ConfigEntry
-		public FormattingOption neutralColor = FormattingOption.DARK_GRAY;
-		
-		@ConfigEntry
-		public FormattingOption profitColor = FormattingOption.DARK_GREEN;
-		
-		@ConfigEntry
-		public FormattingOption lossColor = FormattingOption.RED;
-		
-		@ConfigEntry
-		public FormattingOption incompleteColor = FormattingOption.BLUE;
-		
-	}
-	
-	public enum FormattingOption {
-		BLACK(Formatting.BLACK),
-		DARK_BLUE(Formatting.DARK_BLUE),
-		DARK_GREEN(Formatting.DARK_GREEN),
-		DARK_AQUA(Formatting.DARK_AQUA),
-		DARK_RED(Formatting.DARK_RED),
-		DARK_PURPLE(Formatting.DARK_PURPLE),
-		GOLD(Formatting.GOLD),
-		GRAY(Formatting.GRAY),
-		DARK_GRAY(Formatting.DARK_GRAY),
-		BLUE(Formatting.BLUE),
-		GREEN(Formatting.GREEN),
-		AQUA(Formatting.AQUA),
-		RED(Formatting.RED),
-		LIGHT_PURPLE(Formatting.LIGHT_PURPLE),
-		YELLOW(Formatting.YELLOW),
-		WHITE(Formatting.WHITE),
-		OBFUSCATED(Formatting.OBFUSCATED),
-		BOLD(Formatting.BOLD),
-		STRIKETHROUGH(Formatting.STRIKETHROUGH),
-		UNDERLINE(Formatting.UNDERLINE),
-		ITALIC(Formatting.ITALIC),
-		RESET(Formatting.RESET);
-		
-		public final Formatting formatting;
-		
-		
-		FormattingOption(Formatting formatting) {
-			this.formatting = formatting;
-		}
-		
-		@Override
-		public String toString() {
-			return StringUtils.capitalize(formatting.getName().replaceAll("_", " "));
-		}
-	}
-
-	public static class LividColor {
-		@ConfigEntry
-		public boolean enableLividColor = true;
-		
-		@ConfigEntry
-		public String lividColorText = "The livid color is [color]";
-	}
-
-	public static class Terminals {
-		@ConfigEntry
-		public boolean solveColor = true;
-		
-		@ConfigEntry
-		public boolean solveOrder = true;
-		
-		@ConfigEntry
-		public boolean solveStartsWith = true;
-	}
-
-	public static class DwarvenMines {
-		@ConfigEntry
-		public boolean enableDrillFuel = true;
-		
-		@ConfigEntry
-		public boolean solveFetchur = true;
-		
-		@ConfigEntry
-		public boolean solvePuzzler = true;
-		
-		@ConfigEntry
-		public DwarvenHud dwarvenHud = new DwarvenHud();
-	}
-
-	public static class DwarvenHud {
-		@ConfigEntry
-		public boolean enabled = true;
-		
-		@ConfigEntry
-		public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE;
-		
-		@ConfigEntry
-		public boolean enableBackground = true;
-		
-		@ConfigEntry
-		public int x = 10;
-		
-		@ConfigEntry
-		public int y = 10;
-	}
-
-	public enum DwarvenHudStyle {
-		SIMPLE, FANCY, CLASSIC;
-
-		@Override
-		public String toString() {
-			return switch (this) {
-			case SIMPLE -> "Simple";
-			case FANCY -> "Fancy";
-			case CLASSIC -> "Classic";
-			};
-		}
-	}
-
-	public static class Barn {
-		@ConfigEntry
-		public boolean solveHungryHiker = true;
-		
-		@ConfigEntry
-		public boolean solveTreasureHunter = true;
-	}
-
-	public static class Rift {
-		@ConfigEntry
-		public boolean mirrorverseWaypoints = true;
-		
-		@ConfigEntry
-		public int mcGrubberStacks = 0;
-	}
-	
-	public static class SpidersDen {
-		@ConfigEntry
-		public Relics relics = new Relics();
-	}
-	
-	public static class Relics {
-		@ConfigEntry
-		public boolean enableRelicsHelper = false;
-		
-		@ConfigEntry
-		public boolean highlightFoundRelics = true;
-	}
-
-	public static class Slayer {
-		@ConfigEntry
-		public VampireSlayer vampireSlayer = new VampireSlayer();
-	}
-
-	public static class VampireSlayer {
-		@ConfigEntry
-		public boolean enableEffigyWaypoints = true;
-		
-		@ConfigEntry
-		public boolean compactEffigyWaypoints;
-		
-		@ConfigEntry
-		public int effigyUpdateFrequency = 5;
-		
-		@ConfigEntry
-		public boolean enableHolyIceIndicator = true;
-		
-		@ConfigEntry
-		public int holyIceIndicatorTickDelay = 10;
-
-		@ConfigEntry
-		public int holyIceUpdateFrequency = 5;
-		
-		@ConfigEntry
-		public boolean enableHealingMelonIndicator = true;
-		
-		@ConfigEntry
-		public float healingMelonHealthThreshold = 4f;
-		
-		@ConfigEntry
-		public boolean enableSteakStakeIndicator = true;
-
-		@ConfigEntry
-		public int steakStakeUpdateFrequency = 5;
-		
-		@ConfigEntry
-		public boolean enableManiaIndicator = true;
-
-		@ConfigEntry
-		public int maniaUpdateFrequency = 5;
-	}
-
-	public static class Messages {
-		@ConfigEntry
-		public ChatFilterResult hideAbility = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideHeal = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideAOTE = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideImplosion = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideAds = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideCombo = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideAutopet = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public ChatFilterResult hideShowOff = ChatFilterResult.PASS;
-		
-		@ConfigEntry
-		public boolean hideMana = false;
-	}
-
-	public enum Info {
-		PURSE, BITS, LOCATION;
-
-		@Override
-		public String toString() {
-			return I18n.translate("text.autoconfig.skyblocker.option.richPresence.info." + name());
-		}
-	}
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
index 9020d7a0..4207b495 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -1,88 +1,809 @@
 package me.xmrvizzy.skyblocker.config;
 
-import java.lang.StackWalker.Option;
-import java.nio.file.Path;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-
-import dev.isxander.yacl3.api.YetAnotherConfigLib;
-import dev.isxander.yacl3.config.GsonConfigInstance;
-import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.categories.DiscordRPCCategory;
-import me.xmrvizzy.skyblocker.config.categories.DungeonsCategory;
-import me.xmrvizzy.skyblocker.config.categories.DwarvenMinesCategory;
-import me.xmrvizzy.skyblocker.config.categories.GeneralCategory;
-import me.xmrvizzy.skyblocker.config.categories.MessageFilterCategory;
-import me.xmrvizzy.skyblocker.config.categories.LocationsCategory;
-import me.xmrvizzy.skyblocker.config.categories.QuickNavigationCategory;
-import me.xmrvizzy.skyblocker.config.categories.SlayersCategory;
-import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
-import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
-import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
-import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
-import net.fabricmc.loader.api.FabricLoader;
-import net.minecraft.client.gui.screen.Screen;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import dev.isxander.yacl3.config.ConfigEntry;
+import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
+import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims;
+import net.minecraft.client.resource.language.I18n;
 import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
 
 @SuppressWarnings("deprecation")
 public class SkyblockerConfig {
-	private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("skyblocker.json");
-	private static final GsonConfigInstance<ConfigModel> INSTANCE = GsonConfigInstance.createBuilder(ConfigModel.class)
-			.setPath(PATH)
-			.overrideGsonBuilder(ConfigSerializer.INSTANCE)
-			.build();
-	/*private static final ConfigClassHandler<ConfigModel> HANDLER = ConfigClassHandler.createBuilder(ConfigModel.class)
-			.serializer(config -> GsonConfigSerializerBuilder.create(config)
-					.setPath(PATH)
-					.setJson5(false)
-					.overrideGsonBuilder(ConfigSerializer.INSTANCE)
-					.build())
-			.build();*/
+	@ConfigEntry
+	public int version = 1;
 	
-	public static ConfigModel get() {
-		return INSTANCE.getConfig();
+	@ConfigEntry
+	public General general = new General();
+
+	@ConfigEntry
+	public Locations locations = new Locations();
+
+	@ConfigEntry
+	public Slayer slayer = new Slayer();
+
+	@ConfigEntry
+	public QuickNav quickNav = new QuickNav();
+
+	@ConfigEntry
+	public Messages messages = new Messages();
+
+	@ConfigEntry
+	public RichPresence richPresence = new RichPresence();
+
+	public static class QuickNav {
+		@ConfigEntry
+		public boolean enableQuickNav = true;
+
+		@ConfigEntry
+		public QuickNavItem button1 = new QuickNavItem(true, new ItemData("diamond_sword"), "Your Skills", "/skills");
+
+		@ConfigEntry
+		public QuickNavItem button2 = new QuickNavItem(true, new ItemData("painting"), "Collections", "/collection");
+
+		/* REGEX Explanation
+		 * "Pets" : simple match on letters
+         * "(?: \\(\\d+\\/\\d+\\))?" : optional match on the non-capturing group for the page in the format " ($number/$number)"
+         */
+		@ConfigEntry
+		public QuickNavItem button3 = new QuickNavItem(true, new ItemData("bone"), "Pets(:? \\(\\d+\\/\\d+\\))?", "/pets");
+
+		/* REGEX Explanation
+		 * "Wardrobe" : simple match on letters
+		 * " \\([12]\\/2\\)" : match on the page either " (1/2)" or " (2/2)"
+		 */
+		@ConfigEntry
+		public QuickNavItem button4 = new QuickNavItem(true,
+				new ItemData("leather_chestplate", 1, "tag:{display:{color:8991416}}"), "Wardrobe \\([12]/2\\)",
+				"/wardrobe");
+
+		@ConfigEntry
+		public QuickNavItem button5 = new QuickNavItem(true, new ItemData("player_head", 1,
+				"tag:{SkullOwner:{Id:[I;-2081424676,-57521078,-2073572414,158072763],Properties:{textures:[{Value:\"ewogICJ0aW1lc3RhbXAiIDogMTU5MTMxMDU4NTYwOSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODBhMDc3ZTI0OGQxNDI3NzJlYTgwMDg2NGY4YzU3OGI5ZDM2ODg1YjI5ZGFmODM2YjY0YTcwNjg4MmI2ZWMxMCIKICAgIH0KICB9Cn0=\"}]}}}"),
+				"Sack of Sacks", "/sacks");
+
+		/* REGEX Explanation
+		 * "(?:Rift )?" : optional match on the non-capturing group "Rift "
+		 * "Storage" : simple match on letters
+		 * "(?: \\([12]\\/2\\))?" : optional match on the non-capturing group " (1/2)" or " (2/2)"
+		 */
+		@ConfigEntry
+		public QuickNavItem button6 = new QuickNavItem(true, new ItemData("ender_chest"),
+				"(?:Rift )?Storage(?: \\(1/2\\))?", "/storage");
+
+		@ConfigEntry
+		public QuickNavItem button7 = new QuickNavItem(true, new ItemData("player_head", 1,
+				"tag:{SkullOwner:{Id:[I;-300151517,-631415889,-1193921967,-1821784279],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYzY2ODc0MjNkMDU3MGQ1NTZhYzUzZTA2NzZjYjU2M2JiZGQ5NzE3Y2Q4MjY5YmRlYmVkNmY2ZDRlN2JmOCJ9fX0=\"}]}}}"),
+				"none", "/hub");
+
+		@ConfigEntry
+		public QuickNavItem button8 = new QuickNavItem(true, new ItemData("player_head", 1,
+				"tag:{SkullOwner:{Id:[I;1605800870,415127827,-1236127084,15358548],Properties:{textures:[{Value:\"e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg5MWQ1YjI3M2ZmMGJjNTBjOTYwYjJjZDg2ZWVmMWM0MGExYjk0MDMyYWU3MWU3NTQ3NWE1NjhhODI1NzQyMSJ9fX0=\"}]}}}"),
+				"none", "/warp dungeon_hub");
+
+		@ConfigEntry
+		public QuickNavItem button9 = new QuickNavItem(true, new ItemData("player_head", 1,
+				"tag:{SkullOwner:{Id:[I;-562285948,532499670,-1705302742,775653035],Properties:{textures:[{Value:\"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjVkZjU1NTkyNjQzMGQ1ZDc1YWRlZDIxZGQ5NjE5Yjc2YzViN2NhMmM3ZjU0MDE0NDA1MjNkNTNhOGJjZmFhYiJ9fX0=\"}]}}}"),
+				"Visit prtl", "/visit prtl");
+
+		@ConfigEntry
+		public QuickNavItem button10 = new QuickNavItem(true, new ItemData("enchanting_table"), "Enchant Item",
+				"/etable");
+
+		@ConfigEntry
+		public QuickNavItem button11 = new QuickNavItem(true, new ItemData("anvil"), "Anvil", "/anvil");
+
+		@ConfigEntry
+		public QuickNavItem button12 = new QuickNavItem(true, new ItemData("crafting_table"), "Craft Item", "/craft");
+	}
+
+	public static class QuickNavItem {
+		public QuickNavItem(Boolean render, ItemData itemData, String uiTitle, String clickEvent) {
+			this.render = render;
+			this.item = itemData;
+			this.clickEvent = clickEvent;
+			this.uiTitle = uiTitle;
+		}
+
+		@ConfigEntry
+		public Boolean render;
+
+		@ConfigEntry
+		public ItemData item;
+
+		@ConfigEntry
+		public String uiTitle;
+		
+		@ConfigEntry
+		public String clickEvent;
+	}
+
+	public static class ItemData {
+		public ItemData(String itemName, int count, String nbt) {
+			this.itemName = itemName;
+			this.count = count;
+			this.nbt = nbt;
+		}
+
+		public ItemData(String itemName) {
+			this.itemName = itemName;
+			this.count = 1;
+			this.nbt = "";
+		}
+
+		@ConfigEntry
+		public String itemName;
+		
+		@ConfigEntry
+		public int count;
+		
+		@ConfigEntry
+		public String nbt;
+	}
+
+	public static class General {
+		@ConfigEntry
+		public boolean acceptReparty = true;
+		
+		@ConfigEntry
+		public boolean backpackPreviewWithoutShift = false;
+		
+		@ConfigEntry
+		public boolean compactorDeletorPreview = true;
+		
+		@ConfigEntry
+		public boolean hideEmptyTooltips = true;
+		
+		@ConfigEntry
+		public boolean hideStatusEffectOverlay = false;
+
+		@ConfigEntry
+		public TabHudConf tabHud = new TabHudConf();
+
+		@ConfigEntry
+		public Bars bars = new Bars();
+
+		@ConfigEntry
+		public Experiments experiments = new Experiments();
+
+		@ConfigEntry
+		public Fishing fishing = new Fishing();
+
+		@ConfigEntry
+		public FairySouls fairySouls = new FairySouls();
+
+		@ConfigEntry
+		public Shortcuts shortcuts = new Shortcuts();
+		
+		@ConfigEntry
+		public QuiverWarning quiverWarning = new QuiverWarning();
+
+		@ConfigEntry
+		public ItemList itemList = new ItemList();
+
+		@ConfigEntry
+		public ItemTooltip itemTooltip = new ItemTooltip();
+
+		@ConfigEntry
+		public ItemInfoDisplay itemInfoDisplay = new ItemInfoDisplay();
+		
+		@ConfigEntry
+		public SpecialEffects specialEffects = new SpecialEffects();
+
+		@ConfigEntry
+		public Hitbox hitbox = new Hitbox();
+
+		@ConfigEntry
+		public TitleContainer titleContainer = new TitleContainer();
+
+		@ConfigEntry
+		public TeleportOverlay teleportOverlay = new TeleportOverlay();
+
+		@ConfigEntry
+		public List<Integer> lockedSlots = new ArrayList<>();
+
+		@ConfigEntry
+		public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>();
+
+		@ConfigEntry
+		public Object2IntOpenHashMap<String> customDyeColors = new Object2IntOpenHashMap<>();
+
+		@ConfigEntry
+		public Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customArmorTrims = new Object2ObjectOpenHashMap<>();
+	}
+
+	public static class TabHudConf {
+		@ConfigEntry
+		public boolean tabHudEnabled = true;
+
+		@ConfigEntry
+		public int tabHudScale = 100;
+		
+		@ConfigEntry
+		public boolean plainPlayerNames = false;
+		
+		@ConfigEntry
+		public NameSorting nameSorting = NameSorting.DEFAULT;
+	}
+
+	public enum NameSorting {
+		DEFAULT, ALPHABETICAL;
+
+		@Override
+		public String toString() {
+			return switch (this) {
+			case DEFAULT -> "Default";
+			case ALPHABETICAL -> "Alphabetical";
+			};
+		}
+	}
+
+	public static class Bars {
+		@ConfigEntry
+		public boolean enableBars = true;
+
+		@ConfigEntry
+		public BarPositions barpositions = new BarPositions();
+	}
+
+	public static class BarPositions {
+		@ConfigEntry
+		public BarPosition healthBarPosition = BarPosition.LAYER1;
+		
+		@ConfigEntry
+		public BarPosition manaBarPosition = BarPosition.LAYER1;
+		
+		@ConfigEntry
+		public BarPosition defenceBarPosition = BarPosition.LAYER1;
+		
+		@ConfigEntry
+		public BarPosition experienceBarPosition = BarPosition.LAYER1;
+
+	}
+
+	public enum BarPosition {
+		LAYER1, LAYER2, RIGHT, NONE;
+
+		@Override
+		public String toString() {
+			return I18n.translate("text.autoconfig.skyblocker.option.general.bars.barpositions." + name());
+		}
+
+		public int toInt() {
+			return switch (this) {
+			case LAYER1 -> 0;
+			case LAYER2 -> 1;
+			case RIGHT -> 2;
+			case NONE -> -1;
+			};
+		}
+	}
+
+	public static class Experiments {
+		@ConfigEntry
+		public boolean enableChronomatronSolver = true;
+		
+		@ConfigEntry
+		public boolean enableSuperpairsSolver = true;
+		
+		@ConfigEntry
+		public boolean enableUltrasequencerSolver = true;
+	}
+
+	public static class Fishing {
+		@ConfigEntry
+		public boolean enableFishingHelper = true;
+	}
+
+	public static class FairySouls {
+		@ConfigEntry
+		public boolean enableFairySoulsHelper = false;
+		
+		@ConfigEntry
+		public boolean highlightFoundSouls = true;
+		
+		@ConfigEntry
+		public boolean highlightOnlyNearbySouls = false;
+	}
+
+	public static class Shortcuts {
+		@ConfigEntry
+		public boolean enableShortcuts = true;
+		
+		@ConfigEntry
+		public boolean enableCommandShortcuts = true;
+		
+		@ConfigEntry
+		public boolean enableCommandArgShortcuts = true;
 	}
 	
-	/**
-	 * This method is caller sensitive and can only be called by the mod initializer,
-	 * this is enforced.
-	 */
-	public static void init() {
-		if (StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).getCallerClass() != SkyblockerMod.class) {
-			throw new RuntimeException("Skyblocker: Called config init from an illegal place!");
+    public static class QuiverWarning {
+    	@ConfigEntry
+        public boolean enableQuiverWarning = true;
+    	
+    	@ConfigEntry
+        public boolean enableQuiverWarningInDungeons = true;
+    	
+    	@ConfigEntry
+        public boolean enableQuiverWarningAfterDungeon = true;
+    }
+
+	public static class Hitbox {
+		@ConfigEntry
+		public boolean oldFarmlandHitbox = true;
+		
+		@ConfigEntry
+		public boolean oldLeverHitbox = false;
+	}
+
+	public static class TitleContainer {
+		@ConfigEntry
+		public float titleContainerScale = 100;
+		
+		@ConfigEntry
+		public int x = 540;
+		
+		@ConfigEntry
+		public int y = 10;
+		
+		@ConfigEntry
+		public Direction direction = Direction.HORIZONTAL;
+		
+		@ConfigEntry
+		public Alignment alignment = Alignment.MIDDLE;
+	}
+
+	public static class TeleportOverlay {
+		@ConfigEntry
+		public boolean enableTeleportOverlays = true;
+		
+		@ConfigEntry
+		public boolean enableWeirdTransmission = true;
+		
+		@ConfigEntry
+		public boolean enableInstantTransmission = true;
+		
+		@ConfigEntry
+		public boolean enableEtherTransmission = true;
+		
+		@ConfigEntry
+		public boolean enableSinrecallTransmission = true;
+		
+		@ConfigEntry
+		public boolean enableWitherImpact = true;
+	}
+
+	public enum Direction {
+		HORIZONTAL, VERTICAL;
+
+		@Override
+		public String toString() {
+			return switch (this) {
+			case HORIZONTAL -> "Horizontal";
+			case VERTICAL -> "Vertical";
+			};
+		}
+	}
+
+	public enum Alignment {
+		LEFT, RIGHT, MIDDLE;
+
+		@Override
+		public String toString() {
+			return switch (this) {
+			case LEFT -> "Left";
+			case RIGHT -> "Right";
+			case MIDDLE -> "Middle";
+			};
 		}
+	}
+
+	public static class RichPresence {
+		@ConfigEntry
+		public boolean enableRichPresence = false;
+
+		@ConfigEntry
+		public Info info = Info.LOCATION;
+		
+		@ConfigEntry
+		public boolean cycleMode = false;
 		
-		INSTANCE.load();
-		ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options")))));
+		@ConfigEntry
+		public String customMessage = "Playing Skyblock";
+	}
+
+	public static class ItemList {
+		@ConfigEntry
+		public boolean enableItemList = true;
+	}
+
+	public enum Average {
+		ONE_DAY, THREE_DAY, BOTH;
+
+		@Override
+		public String toString() {
+			return I18n.translate("text.autoconfig.skyblocker.option.general.itemTooltip.avg." + name());
+		}
+	}
+
+	public static class ItemTooltip {
+		@ConfigEntry
+		public boolean enableNPCPrice = true;
+		
+		@ConfigEntry
+		public boolean enableMotesPrice = true;
+		
+		@ConfigEntry
+		public boolean enableAvgBIN = true;
+		
+		@ConfigEntry
+		public Average avg = Average.THREE_DAY;
+		
+		@ConfigEntry
+		public boolean enableLowestBIN = true;
+		
+		@ConfigEntry
+		public boolean enableBazaarPrice = true;
+		
+		@ConfigEntry
+		public boolean enableMuseumDate = true;
+	}
+
+	public static class ItemInfoDisplay {
+		@ConfigEntry
+		public boolean attributeShardInfo = true;
 	}
 	
-	public static void save() {
-		INSTANCE.save();
+	public static class SpecialEffects {
+		@ConfigEntry
+		public boolean rareDungeonDropEffects = true;
+	}
+
+	public static class Locations {
+		@ConfigEntry
+		public Barn barn = new Barn();
+
+		@ConfigEntry
+		public Dungeons dungeons = new Dungeons();
+
+		@ConfigEntry
+		public DwarvenMines dwarvenMines = new DwarvenMines();
+
+		@ConfigEntry
+		public Rift rift = new Rift();
+		
+		@ConfigEntry
+		public SpidersDen spidersDen = new SpidersDen();
+	}
+
+	public static class Dungeons {
+		@ConfigEntry
+		public SecretWaypoints secretWaypoints = new SecretWaypoints();
+		
+		@ConfigEntry
+		public DungeonChestProfit dungeonChestProfit = new DungeonChestProfit();
+		
+		@ConfigEntry
+		public boolean croesusHelper = true;
+		
+		@ConfigEntry
+		public boolean enableMap = true;
+		
+		@ConfigEntry
+		public float mapScaling = 1f;
+		
+		@ConfigEntry
+		public int mapX = 2;
+		
+		@ConfigEntry
+		public int mapY = 2;
+		
+		@ConfigEntry
+		public boolean starredMobGlow = true;
+		
+		@ConfigEntry
+		public boolean solveThreeWeirdos = true;
+		
+		@ConfigEntry
+		public boolean blazesolver = true;
+		
+		@ConfigEntry
+		public boolean solveTrivia = true;
+		
+		@ConfigEntry
+		public boolean solveTicTacToe = true;
+		
+		@ConfigEntry
+		public LividColor lividColor = new LividColor();
+		
+		@ConfigEntry
+		public Terminals terminals = new Terminals();
+	}
+
+	public static class SecretWaypoints {
+		@ConfigEntry
+		public boolean enableSecretWaypoints = true;
+		
+		@ConfigEntry
+		public boolean noInitSecretWaypoints = false;
+		
+		@ConfigEntry
+		public boolean enableEntranceWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableSuperboomWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableChestWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableItemWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableBatWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableWitherWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableLeverWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableFairySoulWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableStonkWaypoints = true;
+		
+		@ConfigEntry
+		public boolean enableDefaultWaypoints = true;
 	}
 	
-	public static Screen createGUI(Screen parent) {
-		return YetAnotherConfigLib.create(INSTANCE, (defaults, config, builder) -> {
-			return builder
-					.title(Text.literal("Skyblocker"))
-					.category(GeneralCategory.create(defaults, config))
-					.category(DungeonsCategory.create(defaults, config))
-					.category(DwarvenMinesCategory.create(defaults, config))
-					.category(LocationsCategory.create(defaults, config))
-					.category(SlayersCategory.create(defaults, config))
-					.category(QuickNavigationCategory.create(defaults, config))
-					.category(MessageFilterCategory.create(defaults, config))
-					.category(DiscordRPCCategory.create(defaults, config));
-					
-		}).generateScreen(parent);
+	public static class DungeonChestProfit {
+		@ConfigEntry
+		public boolean enableProfitCalculator = true;
+		
+		@ConfigEntry
+		public boolean includeKismet = false;
+		
+		@ConfigEntry
+		public boolean includeEssence = true;
+		
+		@ConfigEntry
+		public int neutralThreshold = 1000;
+		
+		@ConfigEntry
+		public FormattingOption neutralColor = FormattingOption.DARK_GRAY;
+		
+		@ConfigEntry
+		public FormattingOption profitColor = FormattingOption.DARK_GREEN;
+		
+		@ConfigEntry
+		public FormattingOption lossColor = FormattingOption.RED;
+		
+		@ConfigEntry
+		public FormattingOption incompleteColor = FormattingOption.BLUE;
+		
 	}
 	
-	/**
-	 * Registers an options command with the given name. Used for registering both options and config as valid commands.
-	 *
-	 * @param name the name of the command node
-	 * @return the command builder
-	 */
-	private static LiteralArgumentBuilder<FabricClientCommandSource> optionsLiteral(String name) {
-		// Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed
-		return ClientCommandManager.literal(name).executes(Scheduler.queueOpenScreenCommand(() -> createGUI(null)));
+	public enum FormattingOption {
+		BLACK(Formatting.BLACK),
+		DARK_BLUE(Formatting.DARK_BLUE),
+		DARK_GREEN(Formatting.DARK_GREEN),
+		DARK_AQUA(Formatting.DARK_AQUA),
+		DARK_RED(Formatting.DARK_RED),
+		DARK_PURPLE(Formatting.DARK_PURPLE),
+		GOLD(Formatting.GOLD),
+		GRAY(Formatting.GRAY),
+		DARK_GRAY(Formatting.DARK_GRAY),
+		BLUE(Formatting.BLUE),
+		GREEN(Formatting.GREEN),
+		AQUA(Formatting.AQUA),
+		RED(Formatting.RED),
+		LIGHT_PURPLE(Formatting.LIGHT_PURPLE),
+		YELLOW(Formatting.YELLOW),
+		WHITE(Formatting.WHITE),
+		OBFUSCATED(Formatting.OBFUSCATED),
+		BOLD(Formatting.BOLD),
+		STRIKETHROUGH(Formatting.STRIKETHROUGH),
+		UNDERLINE(Formatting.UNDERLINE),
+		ITALIC(Formatting.ITALIC),
+		RESET(Formatting.RESET);
+		
+		public final Formatting formatting;
+		
+		
+		FormattingOption(Formatting formatting) {
+			this.formatting = formatting;
+		}
+		
+		@Override
+		public String toString() {
+			return StringUtils.capitalize(formatting.getName().replaceAll("_", " "));
+		}
+	}
+
+	public static class LividColor {
+		@ConfigEntry
+		public boolean enableLividColor = true;
+		
+		@ConfigEntry
+		public String lividColorText = "The livid color is [color]";
+	}
+
+	public static class Terminals {
+		@ConfigEntry
+		public boolean solveColor = true;
+		
+		@ConfigEntry
+		public boolean solveOrder = true;
+		
+		@ConfigEntry
+		public boolean solveStartsWith = true;
+	}
+
+	public static class DwarvenMines {
+		@ConfigEntry
+		public boolean enableDrillFuel = true;
+		
+		@ConfigEntry
+		public boolean solveFetchur = true;
+		
+		@ConfigEntry
+		public boolean solvePuzzler = true;
+		
+		@ConfigEntry
+		public DwarvenHud dwarvenHud = new DwarvenHud();
+	}
+
+	public static class DwarvenHud {
+		@ConfigEntry
+		public boolean enabled = true;
+		
+		@ConfigEntry
+		public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE;
+		
+		@ConfigEntry
+		public boolean enableBackground = true;
+		
+		@ConfigEntry
+		public int x = 10;
+		
+		@ConfigEntry
+		public int y = 10;
+	}
+
+	public enum DwarvenHudStyle {
+		SIMPLE, FANCY, CLASSIC;
+
+		@Override
+		public String toString() {
+			return switch (this) {
+			case SIMPLE -> "Simple";
+			case FANCY -> "Fancy";
+			case CLASSIC -> "Classic";
+			};
+		}
+	}
+
+	public static class Barn {
+		@ConfigEntry
+		public boolean solveHungryHiker = true;
+		
+		@ConfigEntry
+		public boolean solveTreasureHunter = true;
+	}
+
+	public static class Rift {
+		@ConfigEntry
+		public boolean mirrorverseWaypoints = true;
+		
+		@ConfigEntry
+		public int mcGrubberStacks = 0;
+	}
+	
+	public static class SpidersDen {
+		@ConfigEntry
+		public Relics relics = new Relics();
+	}
+	
+	public static class Relics {
+		@ConfigEntry
+		public boolean enableRelicsHelper = false;
+		
+		@ConfigEntry
+		public boolean highlightFoundRelics = true;
+	}
+
+	public static class Slayer {
+		@ConfigEntry
+		public VampireSlayer vampireSlayer = new VampireSlayer();
+	}
+
+	public static class VampireSlayer {
+		@ConfigEntry
+		public boolean enableEffigyWaypoints = true;
+		
+		@ConfigEntry
+		public boolean compactEffigyWaypoints;
+		
+		@ConfigEntry
+		public int effigyUpdateFrequency = 5;
+		
+		@ConfigEntry
+		public boolean enableHolyIceIndicator = true;
+		
+		@ConfigEntry
+		public int holyIceIndicatorTickDelay = 10;
+
+		@ConfigEntry
+		public int holyIceUpdateFrequency = 5;
+		
+		@ConfigEntry
+		public boolean enableHealingMelonIndicator = true;
+		
+		@ConfigEntry
+		public float healingMelonHealthThreshold = 4f;
+		
+		@ConfigEntry
+		public boolean enableSteakStakeIndicator = true;
+
+		@ConfigEntry
+		public int steakStakeUpdateFrequency = 5;
+		
+		@ConfigEntry
+		public boolean enableManiaIndicator = true;
+
+		@ConfigEntry
+		public int maniaUpdateFrequency = 5;
+	}
+
+	public static class Messages {
+		@ConfigEntry
+		public ChatFilterResult hideAbility = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideHeal = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideAOTE = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideImplosion = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideAds = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideCombo = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideAutopet = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public ChatFilterResult hideShowOff = ChatFilterResult.PASS;
+		
+		@ConfigEntry
+		public boolean hideMana = false;
+	}
+
+	public enum Info {
+		PURSE, BITS, LOCATION;
+
+		@Override
+		public String toString() {
+			return I18n.translate("text.autoconfig.skyblocker.option.richPresence.info." + name());
+		}
 	}
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfigManager.java
new file mode 100644
index 00000000..534dde6d
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfigManager.java
@@ -0,0 +1,88 @@
+package me.xmrvizzy.skyblocker.config;
+
+import java.lang.StackWalker.Option;
+import java.nio.file.Path;
+import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+
+import dev.isxander.yacl3.api.YetAnotherConfigLib;
+import dev.isxander.yacl3.config.GsonConfigInstance;
+import me.xmrvizzy.skyblocker.SkyblockerMod;
+import me.xmrvizzy.skyblocker.config.categories.DiscordRPCCategory;
+import me.xmrvizzy.skyblocker.config.categories.DungeonsCategory;
+import me.xmrvizzy.skyblocker.config.categories.DwarvenMinesCategory;
+import me.xmrvizzy.skyblocker.config.categories.GeneralCategory;
+import me.xmrvizzy.skyblocker.config.categories.MessageFilterCategory;
+import me.xmrvizzy.skyblocker.config.categories.LocationsCategory;
+import me.xmrvizzy.skyblocker.config.categories.QuickNavigationCategory;
+import me.xmrvizzy.skyblocker.config.categories.SlayersCategory;
+import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
+import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
+import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
+import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
+import net.fabricmc.loader.api.FabricLoader;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.text.Text;
+
+@SuppressWarnings("deprecation")
+public class SkyblockerConfigManager {
+	private static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve("skyblocker.json");
+	private static final GsonConfigInstance<SkyblockerConfig> INSTANCE = GsonConfigInstance.createBuilder(SkyblockerConfig.class)
+			.setPath(PATH)
+			.overrideGsonBuilder(ConfigSerializer.INSTANCE)
+			.build();
+	/*private static final ConfigClassHandler<ConfigModel> HANDLER = ConfigClassHandler.createBuilder(ConfigModel.class)
+			.serializer(config -> GsonConfigSerializerBuilder.create(config)
+					.setPath(PATH)
+					.setJson5(false)
+					.overrideGsonBuilder(ConfigSerializer.INSTANCE)
+					.build())
+			.build();*/
+	
+	public static SkyblockerConfig get() {
+		return INSTANCE.getConfig();
+	}
+	
+	/**
+	 * This method is caller sensitive and can only be called by the mod initializer,
+	 * this is enforced.
+	 */
+	public static void init() {
+		if (StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE).getCallerClass() != SkyblockerMod.class) {
+			throw new RuntimeException("Skyblocker: Called config init from an illegal place!");
+		}
+		
+		INSTANCE.load();
+		ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE).then(optionsLiteral("config")).then(optionsLiteral("options")))));
+	}
+	
+	public static void save() {
+		INSTANCE.save();
+	}
+	
+	public static Screen createGUI(Screen parent) {
+		return YetAnotherConfigLib.create(INSTANCE, (defaults, config, builder) -> {
+			return builder
+					.title(Text.literal("Skyblocker"))
+					.category(GeneralCategory.create(defaults, config))
+					.category(DungeonsCategory.create(defaults, config))
+					.category(DwarvenMinesCategory.create(defaults, config))
+					.category(LocationsCategory.create(defaults, config))
+					.category(SlayersCategory.create(defaults, config))
+					.category(QuickNavigationCategory.create(defaults, config))
+					.category(MessageFilterCategory.create(defaults, config))
+					.category(DiscordRPCCategory.create(defaults, config));
+					
+		}).generateScreen(parent);
+	}
+	
+	/**
+	 * Registers an options command with the given name. Used for registering both options and config as valid commands.
+	 *
+	 * @param name the name of the command node
+	 * @return the command builder
+	 */
+	private static LiteralArgumentBuilder<FabricClientCommandSource> optionsLiteral(String name) {
+		// Don't immediately open the next screen as it will be closed by ChatScreen right after this command is executed
+		return ClientCommandManager.literal(name).executes(Scheduler.queueOpenScreenCommand(() -> createGUI(null)));
+	}
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java
index 9f7d066b..4357c29c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DiscordRPCCategory.java
@@ -5,13 +5,13 @@ import dev.isxander.yacl3.api.Option;
 import dev.isxander.yacl3.api.OptionDescription;
 import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import dev.isxander.yacl3.api.controller.StringControllerBuilder;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.config.ConfigUtils;
 import net.minecraft.text.Text;
 
 public class DiscordRPCCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.category.richPresence"))
 				
@@ -23,7 +23,7 @@ public class DiscordRPCCategory {
 								newValue -> config.richPresence.enableRichPresence = newValue)
 						.controller(BooleanControllerBuilder::create)
 						.build())
-				.option(Option.<ConfigModel.Info>createBuilder()
+				.option(Option.<SkyblockerConfig.Info>createBuilder()
 						.name(Text.translatable("text.autoconfig.skyblocker.option.richPresence.info"))
 						.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.richPresence.info.@Tooltip")))
 						.binding(defaults.richPresence.info,
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
index e26bbae6..0f6b1208 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
@@ -10,8 +10,8 @@ import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
 import dev.isxander.yacl3.api.controller.StringControllerBuilder;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
-import me.xmrvizzy.skyblocker.config.ConfigModel.FormattingOption;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig.FormattingOption;
 import me.xmrvizzy.skyblocker.config.ConfigUtils;
 import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMapConfigScreen;
 import net.minecraft.client.MinecraftClient;
@@ -19,7 +19,7 @@ import net.minecraft.text.Text;
 
 public class DungeonsCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons"))
 				
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java
index 540a04e4..c6b8b8bc 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DwarvenMinesCategory.java
@@ -7,7 +7,7 @@ import dev.isxander.yacl3.api.OptionDescription;
 import dev.isxander.yacl3.api.OptionGroup;
 import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.config.ConfigUtils;
 import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHudConfigScreen;
 import net.minecraft.client.MinecraftClient;
@@ -15,7 +15,7 @@ import net.minecraft.text.Text;
 
 public class DwarvenMinesCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines"))
 				
@@ -53,7 +53,7 @@ public class DwarvenMinesCategory {
 										newValue -> config.locations.dwarvenMines.dwarvenHud.enabled = newValue)
 								.controller(BooleanControllerBuilder::create)
 								.build())
-						.option(Option.<ConfigModel.DwarvenHudStyle>createBuilder()
+						.option(Option.<SkyblockerConfig.DwarvenHudStyle>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style"))
 								.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[0]", 
 										Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.style.@Tooltip[1]"),
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
index 1019703c..e75dc331 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
@@ -9,7 +9,7 @@ import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.config.ConfigUtils;
 import me.xmrvizzy.skyblocker.skyblock.shortcut.ShortcutsConfigScreen;
 import me.xmrvizzy.skyblocker.utils.render.title.TitleContainerConfigScreen;
@@ -18,7 +18,7 @@ import net.minecraft.text.Text;
 
 public class GeneralCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {		
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {		
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.category.general"))
 				
@@ -86,7 +86,7 @@ public class GeneralCategory {
 										newValue -> config.general.tabHud.plainPlayerNames = newValue)
 								.controller(BooleanControllerBuilder::create)
 								.build())
-						.option(Option.<ConfigModel.NameSorting>createBuilder()
+						.option(Option.<SkyblockerConfig.NameSorting>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.nameSorting"))
 								.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.nameSorting.@Tooltip")))
 								.binding(defaults.general.tabHud.nameSorting,
@@ -107,28 +107,28 @@ public class GeneralCategory {
 										newValue -> config.general.bars.enableBars = newValue)
 								.controller(BooleanControllerBuilder::create)
 								.build())
-						.option(Option.<ConfigModel.BarPosition>createBuilder()
+						.option(Option.<SkyblockerConfig.BarPosition>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.healthBarPosition"))
 								.binding(defaults.general.bars.barpositions.healthBarPosition,
 										() -> config.general.bars.barpositions.healthBarPosition,
 										newValue -> config.general.bars.barpositions.healthBarPosition = newValue)
 								.controller(ConfigUtils::createCyclingListController4Enum)
 								.build())
-						.option(Option.<ConfigModel.BarPosition>createBuilder()
+						.option(Option.<SkyblockerConfig.BarPosition>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.manaBarPosition"))
 								.binding(defaults.general.bars.barpositions.manaBarPosition,
 										() -> config.general.bars.barpositions.manaBarPosition,
 										newValue -> config.general.bars.barpositions.manaBarPosition = newValue)
 								.controller(ConfigUtils::createCyclingListController4Enum)
 								.build())
-						.option(Option.<ConfigModel.BarPosition>createBuilder()
+						.option(Option.<SkyblockerConfig.BarPosition>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.defenceBarPosition"))
 								.binding(defaults.general.bars.barpositions.defenceBarPosition,
 										() -> config.general.bars.barpositions.defenceBarPosition,
 										newValue -> config.general.bars.barpositions.defenceBarPosition = newValue)
 								.controller(ConfigUtils::createCyclingListController4Enum)
 								.build())
-						.option(Option.<ConfigModel.BarPosition>createBuilder()
+						.option(Option.<SkyblockerConfig.BarPosition>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.bars.barpositions.experienceBarPosition"))
 								.binding(defaults.general.bars.barpositions.experienceBarPosition,
 										() -> config.general.bars.barpositions.experienceBarPosition,
@@ -306,7 +306,7 @@ public class GeneralCategory {
 										newValue -> config.general.itemTooltip.enableAvgBIN = newValue)
 								.controller(BooleanControllerBuilder::create)
 								.build())
-						.option(Option.<ConfigModel.Average>createBuilder()
+						.option(Option.<SkyblockerConfig.Average>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.avg"))
 								.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip.avg.@Tooltip")))
 								.binding(defaults.general.itemTooltip.avg,
@@ -411,14 +411,14 @@ public class GeneralCategory {
 										newValue -> config.general.titleContainer.y = newValue)
 								.controller(IntegerFieldControllerBuilder::create)
 								.build())
-						.option(Option.<ConfigModel.Direction>createBuilder()
+						.option(Option.<SkyblockerConfig.Direction>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.direction"))
 								.binding(defaults.general.titleContainer.direction,
 										() -> config.general.titleContainer.direction,
 										newValue -> config.general.titleContainer.direction = newValue)
 								.controller(ConfigUtils::createCyclingListController4Enum)
 								.build())
-						.option(Option.<ConfigModel.Alignment>createBuilder()
+						.option(Option.<SkyblockerConfig.Alignment>createBuilder()
 								.name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer.alignment"))
 								.binding(defaults.general.titleContainer.alignment,
 										() -> config.general.titleContainer.alignment,
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/LocationsCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/LocationsCategory.java
index 640bc5e6..8c3189ee 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/LocationsCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/LocationsCategory.java
@@ -6,12 +6,12 @@ import dev.isxander.yacl3.api.OptionDescription;
 import dev.isxander.yacl3.api.OptionGroup;
 import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import net.minecraft.text.Text;
 
 public class LocationsCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.category.locations"))
 				
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java
index d73a38ba..5fc5a808 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/MessageFilterCategory.java
@@ -5,13 +5,13 @@ import dev.isxander.yacl3.api.Option;
 import dev.isxander.yacl3.api.OptionDescription;
 import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import me.xmrvizzy.skyblocker.config.ConfigUtils;
 import net.minecraft.text.Text;
 
 public class MessageFilterCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.category.messages"))
 				
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java
index 831efa07..4ca38375 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/QuickNavigationCategory.java
@@ -6,12 +6,12 @@ import dev.isxander.yacl3.api.OptionGroup;
 import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
 import dev.isxander.yacl3.api.controller.StringControllerBuilder;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import net.minecraft.text.Text;
 
 public class QuickNavigationCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.category.quickNav"))
 				
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/SlayersCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/SlayersCategory.java
index f7f1886b..bfb3c6ad 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/SlayersCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/SlayersCategory.java
@@ -8,12 +8,12 @@ import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
 import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
 import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import net.minecraft.text.Text;
 
 public class SlayersCategory {
 
-	public static ConfigCategory create(ConfigModel defaults, ConfigModel config) {
+	public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
 		return ConfigCategory.createBuilder()
 				.name(Text.translatable("text.autoconfig.skyblocker.category.slayer"))
 				
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/AbstractInventoryScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/AbstractInventoryScreenMixin.java
index db517411..df71396e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/AbstractInventoryScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/AbstractInventoryScreenMixin.java
@@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen;
 
@@ -14,6 +14,6 @@ public class AbstractInventoryScreenMixin {
 
 	@Inject(method = "drawStatusEffects", at = @At("HEAD"), cancellable = true)
 	private void skyblocker$dontDrawStatusEffects(CallbackInfo ci) {
-		if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.hideStatusEffectOverlay) ci.cancel();
+		if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
 	}
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ArmorTrimMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ArmorTrimMixin.java
index a90cf4d4..1076332f 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ArmorTrimMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ArmorTrimMixin.java
@@ -3,7 +3,7 @@ package me.xmrvizzy.skyblocker.mixin;
 import com.llamalad7.mixinextras.injector.ModifyReturnValue;
 import com.llamalad7.mixinextras.sugar.Local;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.minecraft.item.ItemStack;
@@ -22,7 +22,7 @@ public class ArmorTrimMixin {
 		NbtCompound nbt = stack.getNbt();
 
 		if (Utils.isOnSkyblock() && nbt != null && nbt.contains("ExtraAttributes")) {
-			Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customTrims = SkyblockerConfig.get().general.customArmorTrims;
+			Object2ObjectOpenHashMap<String, CustomArmorTrims.ArmorTrimId> customTrims = SkyblockerConfigManager.get().general.customArmorTrims;
 			NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes");
 			String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java
index cfe979d0..356095ab 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DrawContextMixin.java
@@ -6,7 +6,7 @@ import com.mojang.blaze3d.systems.RenderSystem;
 
 import dev.cbyrne.betterinject.annotations.Arg;
 import dev.cbyrne.betterinject.annotations.Inject;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.item.AttributeShards;
 import me.xmrvizzy.skyblocker.utils.ItemUtils;
 import me.xmrvizzy.skyblocker.utils.Utils;
@@ -42,7 +42,7 @@ public abstract class DrawContextMixin {
 
     @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD"))
     public void skyblocker$renderItemBar(@Arg ItemStack stack, @Arg(ordinal = 0) int x, @Arg(ordinal = 1) int y) {
-        if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().locations.dwarvenMines.enableDrillFuel || stack.isEmpty()) {
+        if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().locations.dwarvenMines.enableDrillFuel || stack.isEmpty()) {
             return;
         }
 
@@ -99,7 +99,7 @@ public abstract class DrawContextMixin {
 
     @Inject(method = "drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", at = @At("HEAD"))
     private void skyblocker$renderAttributeShardDisplay(@Arg TextRenderer textRenderer, @Arg ItemStack stack, @Arg(ordinal = 0) int x, @Arg(ordinal = 1) int y, @Local(argsOnly = true) LocalRef<String> countOverride) {
-    	if (!SkyblockerConfig.get().general.itemInfoDisplay.attributeShardInfo) return;
+    	if (!SkyblockerConfigManager.get().general.itemInfoDisplay.attributeShardInfo) return;
 
     	NbtCompound nbt = stack.getNbt();
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java
index f04c4cdd..bbe31472 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/DyeableItemMixin.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.mixin;
 
 import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.minecraft.item.DyeableItem;
 import net.minecraft.item.ItemStack;
@@ -19,7 +19,7 @@ public interface DyeableItemMixin {
 			NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes");
 			String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
 
-			return SkyblockerConfig.get().general.customDyeColors.getOrDefault(itemUuid, originalColor);
+			return SkyblockerConfigManager.get().general.customDyeColors.getOrDefault(itemUuid, originalColor);
 		}
 
 		return originalColor;
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java
index b07390b7..94053381 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/FarmlandBlockMixin.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.mixin;
 
 import com.llamalad7.mixinextras.injector.ModifyReturnValue;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockState;
@@ -27,7 +27,7 @@ public abstract class FarmlandBlockMixin extends Block {
 
     @ModifyReturnValue(method = "getOutlineShape", at = @At("RETURN"))
     private VoxelShape skyblocker$replaceOutlineShape(VoxelShape original) {
-        return Utils.isOnSkyblock() && SkyblockerConfig.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original;
+        return Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hitbox.oldFarmlandHitbox ? VoxelShapes.fullCube() : original;
     }
 
     @SuppressWarnings("deprecation")
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
index 33532788..17497ded 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.mixin;
 
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.experiment.ChronomatronSolver;
 import me.xmrvizzy.skyblocker.skyblock.experiment.ExperimentSolver;
 import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver;
@@ -59,18 +59,18 @@ public abstract class HandledScreenMixin extends Screen {
         if (!Utils.isOnSkyblock()) return;
 
         // Hide Empty Tooltips
-        if (SkyblockerConfig.get().general.hideEmptyTooltips && focusedSlot.getStack().getName().getString().equals(" ")) {
+        if (SkyblockerConfigManager.get().general.hideEmptyTooltips && focusedSlot.getStack().getName().getString().equals(" ")) {
             ci.cancel();
         }
 
         // Backpack Preview
-        boolean shiftDown = SkyblockerConfig.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown();
+        boolean shiftDown = SkyblockerConfigManager.get().general.backpackPreviewWithoutShift ^ Screen.hasShiftDown();
         if (shiftDown && getTitle().getString().equals("Storage") && focusedSlot.inventory != client.player.getInventory() && BackpackPreview.renderPreview(context, focusedSlot.getIndex(), x, y)) {
             ci.cancel();
         }
 
         // Compactor Preview
-        if (SkyblockerConfig.get().general.compactorDeletorPreview) {
+        if (SkyblockerConfigManager.get().general.compactorDeletorPreview) {
             ItemStack stack = focusedSlot.getStack();
             Matcher matcher = CompactorDeletorPreview.NAME.matcher(ItemRegistry.getInternalName(stack));
             if (matcher.matches() && CompactorDeletorPreview.drawPreview(context, stack, matcher.group("type"), matcher.group("size"), x, y)) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
index 752b102a..c73ca2aa 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
@@ -2,7 +2,7 @@ package me.xmrvizzy.skyblocker.mixin;
 
 import com.llamalad7.mixinextras.sugar.Local;
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars;
 import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock;
 import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap;
@@ -41,7 +41,7 @@ public abstract class InGameHudMixin {
 
     @Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true)
     private void skyblocker$renderExperienceBar(CallbackInfo ci) {
-        if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.isInTheRift())
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.bars.enableBars && !Utils.isInTheRift())
             ci.cancel();
     }
 
@@ -52,18 +52,18 @@ public abstract class InGameHudMixin {
         if (statusBars.render(context, scaledWidth, scaledHeight))
             ci.cancel();
 
-        if (Utils.isInDungeons() && SkyblockerConfig.get().locations.dungeons.enableMap)
+        if (Utils.isInDungeons() && SkyblockerConfigManager.get().locations.dungeons.enableMap)
             DungeonMap.render(context.getMatrices());
     }
 
     @Inject(method = "renderMountHealth", at = @At("HEAD"), cancellable = true)
     private void skyblocker$renderMountHealth(CallbackInfo ci) {
-        if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.bars.enableBars && !Utils.isInTheRift())
+        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() && SkyblockerConfig.get().general.hideStatusEffectOverlay) ci.cancel();
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.hideStatusEffectOverlay) ci.cancel();
     }
 }
\ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java
index 729124fd..596fa1f9 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InventoryScreenMixin.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.mixin;
 
 import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemListWidget;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.minecraft.client.gui.screen.ingame.InventoryScreen;
@@ -13,6 +13,6 @@ import org.spongepowered.asm.mixin.injection.At;
 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 SkyblockerConfig.get().general.itemList.enableItemList && Utils.isOnSkyblock() ? new ItemListWidget() : original;
+        return SkyblockerConfigManager.get().general.itemList.enableItemList && Utils.isOnSkyblock() ? new ItemListWidget() : original;
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java
index 63dc6624..063c048e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ItemStackMixin.java
@@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.At;
 
 import com.llamalad7.mixinextras.injector.ModifyReturnValue;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.NbtCompound;
@@ -25,7 +25,7 @@ public abstract class ItemStackMixin {
 			NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes");
 			String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
 
-			return SkyblockerConfig.get().general.customItemNames.getOrDefault(itemUuid, original);
+			return SkyblockerConfigManager.get().general.customItemNames.getOrDefault(itemUuid, original);
 		}
 
 		return original;
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java
index ec7b6ddd..903e8ee0 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/PlayerListHudMixin.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.mixin;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr;
@@ -28,7 +28,7 @@ public class PlayerListHudMixin {
 
     @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/gui/DrawContext;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V", cancellable = true)
     public void skyblocker$renderTabHud(@Arg DrawContext context, @Arg int w, CallbackInfo info) {
-        if (!Utils.isOnSkyblock() || !SkyblockerConfig.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) {
+        if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().general.tabHud.tabHudEnabled || TabHud.defaultTgl.isPressed()) {
             return;
         }
 
@@ -38,7 +38,7 @@ public class PlayerListHudMixin {
         }
 
         int h = MinecraftClient.getInstance().getWindow().getScaledHeight();
-        float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f;
+        float scale = SkyblockerConfigManager.get().general.tabHud.tabHudScale / 100f;
         w = (int) (w / scale);
         h = (int) (h / scale);
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/WorldRendererMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/WorldRendererMixin.java
index 53dd57a7..8cf94c69 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/WorldRendererMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/WorldRendererMixin.java
@@ -9,7 +9,7 @@ import com.llamalad7.mixinextras.sugar.Local;
 import com.llamalad7.mixinextras.sugar.Share;
 import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.dungeon.StarredMobGlow;
 import net.minecraft.client.render.WorldRenderer;
 import net.minecraft.entity.Entity;
@@ -19,7 +19,7 @@ public class WorldRendererMixin {
 
 	@ModifyExpressionValue(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;hasOutline(Lnet/minecraft/entity/Entity;)Z"))
 	private boolean skyblocker$shouldStarredMobGlow(boolean original, @Local Entity entity, @Share("isGlowingStarredMob") LocalBooleanRef isGlowingStarredMob) {
-		boolean isAStarredMobThatShouldGlow = SkyblockerConfig.get().locations.dungeons.starredMobGlow && StarredMobGlow.shouldMobGlow(entity);
+		boolean isAStarredMobThatShouldGlow = SkyblockerConfigManager.get().locations.dungeons.starredMobGlow && StarredMobGlow.shouldMobGlow(entity);
 
 		isGlowingStarredMob.set(isAStarredMobThatShouldGlow);
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java
index 1933184a..46454fb3 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FairySouls.java
@@ -7,8 +7,8 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.mojang.brigadier.CommandDispatcher;
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.NEURepo;
 import me.xmrvizzy.skyblocker.utils.PosUtils;
 import me.xmrvizzy.skyblocker.utils.Utils;
@@ -142,7 +142,7 @@ public class FairySouls {
     }
 
     private static void render(WorldRenderContext context) {
-        ConfigModel.FairySouls fairySoulsConfig = SkyblockerConfig.get().general.fairySouls;
+        SkyblockerConfig.FairySouls fairySoulsConfig = SkyblockerConfigManager.get().general.fairySouls;
 
         if (fairySoulsConfig.enableFairySoulsHelper && fairySoulsLoaded.isDone() && fairySouls.containsKey(Utils.getLocationRaw())) {
             for (BlockPos fairySoulPos : fairySouls.get(Utils.getLocationRaw())) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java
index 1a460f5b..56b6c7fe 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FancyStatusBars.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock;
 
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
@@ -40,7 +40,7 @@ public class FancyStatusBars {
 
     public boolean render(DrawContext context, int scaledWidth, int scaledHeight) {
         var player = client.player;
-        if (!SkyblockerConfig.get().general.bars.enableBars || player == null || Utils.isInTheRift())
+        if (!SkyblockerConfigManager.get().general.bars.enableBars || player == null || Utils.isInTheRift())
             return false;
         anchorsX[0] = scaledWidth / 2 - 91;
         anchorsY[0] = scaledHeight - 33;
@@ -60,10 +60,10 @@ public class FancyStatusBars {
         // Update positions of bars from config
         for (int i = 0; i < 4; i++) {
             int configAnchorNum = switch (i) {
-                case 0 -> SkyblockerConfig.get().general.bars.barpositions.healthBarPosition.toInt();
-                case 1 -> SkyblockerConfig.get().general.bars.barpositions.manaBarPosition.toInt();
-                case 2 -> SkyblockerConfig.get().general.bars.barpositions.defenceBarPosition.toInt();
-                case 3 -> SkyblockerConfig.get().general.bars.barpositions.experienceBarPosition.toInt();
+                case 0 -> SkyblockerConfigManager.get().general.bars.barpositions.healthBarPosition.toInt();
+                case 1 -> SkyblockerConfigManager.get().general.bars.barpositions.manaBarPosition.toInt();
+                case 2 -> SkyblockerConfigManager.get().general.bars.barpositions.defenceBarPosition.toInt();
+                case 3 -> SkyblockerConfigManager.get().general.bars.barpositions.experienceBarPosition.toInt();
                 default -> 0;
             };
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java
index f039a79d..dca3f30b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/FishingHelper.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import me.xmrvizzy.skyblocker.utils.render.title.Title;
 import net.fabricmc.fabric.api.event.player.UseItemCallback;
@@ -46,7 +46,7 @@ public class FishingHelper {
 
     public static void onSound(PlaySoundS2CPacket packet) {
         String path = packet.getSound().value().getId().getPath();
-        if (SkyblockerConfig.get().general.fishing.enableFishingHelper && startTime != 0 && System.currentTimeMillis() >= startTime + 2000 && ("entity.generic.splash".equals(path) || "entity.player.splash".equals(path))) {
+        if (SkyblockerConfigManager.get().general.fishing.enableFishingHelper && startTime != 0 && System.currentTimeMillis() >= startTime + 2000 && ("entity.generic.splash".equals(path) || "entity.player.splash".equals(path))) {
             ClientPlayerEntity player = MinecraftClient.getInstance().player;
             if (player != null && player.fishHook != null) {
                 Vec3d soundToFishHook = player.fishHook.getPos().subtract(packet.getX(), 0, packet.getZ());
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java
index 9f38fe35..ab8ea882 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/HotbarSlotLock.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock;
 
 import me.shedaniel.autoconfig.AutoConfig;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
 import net.minecraft.client.network.ClientPlayerEntity;
 import net.minecraft.client.option.KeyBinding;
@@ -22,7 +22,7 @@ public class HotbarSlotLock {
     }
 
     public static boolean isLocked(int slot) {
-        return SkyblockerConfig.get().general.lockedSlots.contains(slot);
+        return SkyblockerConfigManager.get().general.lockedSlots.contains(slot);
     }
 
     public static void handleDropSelectedItem(int slot, CallbackInfoReturnable<Boolean> cir) {
@@ -31,11 +31,11 @@ public class HotbarSlotLock {
 
     public static void handleInputEvents(ClientPlayerEntity player) {
         while (hotbarSlotLock.wasPressed()) {
-            List<Integer> lockedSlots = SkyblockerConfig.get().general.lockedSlots;
+            List<Integer> lockedSlots = SkyblockerConfigManager.get().general.lockedSlots;
             int selected = player.getInventory().selectedSlot;
             if (!isLocked(player.getInventory().selectedSlot)) lockedSlots.add(selected);
             else lockedSlots.remove(Integer.valueOf(selected));
-            SkyblockerConfig.save();
+            SkyblockerConfigManager.save();
         }
     }
 }
\ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java
index 381bf94c..2d0715e4 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/QuiverWarning.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -21,7 +21,7 @@ public class QuiverWarning {
 
     public static boolean onChatMessage(Text text, boolean overlay) {
         String message = text.getString();
-        if (SkyblockerConfig.get().general.quiverWarning.enableQuiverWarning && message.endsWith("left in your Quiver!")) {
+        if (SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarning && message.endsWith("left in your Quiver!")) {
             MinecraftClient.getInstance().inGameHud.setDefaultTitleFade();
             if (message.startsWith("You only have 50")) {
                 onChatMessage(Type.FIFTY_LEFT);
@@ -37,14 +37,14 @@ public class QuiverWarning {
     private static void onChatMessage(Type warning) {
         if (!Utils.isInDungeons()) {
             MinecraftClient.getInstance().inGameHud.setTitle(Text.translatable(warning.key).formatted(Formatting.RED));
-        } else if (SkyblockerConfig.get().general.quiverWarning.enableQuiverWarningInDungeons) {
+        } else if (SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarningInDungeons) {
             MinecraftClient.getInstance().inGameHud.setTitle(Text.translatable(warning.key).formatted(Formatting.RED));
             QuiverWarning.warning = warning;
         }
     }
 
     public static void update() {
-        if (warning != null && SkyblockerConfig.get().general.quiverWarning.enableQuiverWarning && SkyblockerConfig.get().general.quiverWarning.enableQuiverWarningAfterDungeon && !Utils.isInDungeons()) {
+        if (warning != null && SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarning && SkyblockerConfigManager.get().general.quiverWarning.enableQuiverWarningAfterDungeon && !Utils.isInDungeons()) {
             InGameHud inGameHud = MinecraftClient.getInstance().inGameHud;
             inGameHud.setDefaultTitleFade();
             inGameHud.setTitle(Text.translatable(warning.key).formatted(Formatting.RED));
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java
index aeee9978..ae5aff0b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/StatusBarTracker.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
 import net.minecraft.client.MinecraftClient;
@@ -66,10 +66,10 @@ public class StatusBarTracker {
     }
 
     private Text onOverlayMessage(Text text, boolean overlay) {
-        if (!overlay || !Utils.isOnSkyblock() || !SkyblockerConfig.get().general.bars.enableBars || Utils.isInTheRift()) {
+        if (!overlay || !Utils.isOnSkyblock() || !SkyblockerConfigManager.get().general.bars.enableBars || Utils.isInTheRift()) {
             return text;
         }
-        return Text.of(update(text.getString(), SkyblockerConfig.get().messages.hideMana));
+        return Text.of(update(text.getString(), SkyblockerConfigManager.get().messages.hideMana));
     }
 
     public String update(String actionBar, boolean filterManaUse) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java
index c7ab926e..1aeeb6d3 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/TeleportOverlay.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock;
 
 import com.mojang.blaze3d.systems.RenderSystem;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
@@ -24,7 +24,7 @@ public class TeleportOverlay {
     }
 
     private static void render(WorldRenderContext wrc) {
-        if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) {
+        if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.teleportOverlay.enableTeleportOverlays && client.player != null && client.world != null) {
             ItemStack heldItem = client.player.getMainHandStack();
             String itemId = PriceInfoTooltip.getInternalNameFromNBT(heldItem, true);
             NbtCompound nbt = heldItem.getNbt();
@@ -32,34 +32,34 @@ public class TeleportOverlay {
             if (itemId != null) {
                 switch (itemId) {
                     case "ASPECT_OF_THE_LEECH_1" -> {
-                        if (SkyblockerConfig.get().general.teleportOverlay.enableWeirdTransmission) {
+                        if (SkyblockerConfigManager.get().general.teleportOverlay.enableWeirdTransmission) {
                             render(wrc, 3);
                         }
                     }
                     case "ASPECT_OF_THE_LEECH_2" -> {
-                        if (SkyblockerConfig.get().general.teleportOverlay.enableWeirdTransmission) {
+                        if (SkyblockerConfigManager.get().general.teleportOverlay.enableWeirdTransmission) {
                             render(wrc, 4);
                         }
                     }
                     case "ASPECT_OF_THE_END", "ASPECT_OF_THE_VOID" -> {
-                        if (SkyblockerConfig.get().general.teleportOverlay.enableEtherTransmission && client.options.sneakKey.isPressed() && nbt != null && nbt.getCompound("ExtraAttributes").getInt("ethermerge") == 1) {
+                        if (SkyblockerConfigManager.get().general.teleportOverlay.enableEtherTransmission && client.options.sneakKey.isPressed() && nbt != null && nbt.getCompound("ExtraAttributes").getInt("ethermerge") == 1) {
                             render(wrc, nbt, 57);
-                        } else if (SkyblockerConfig.get().general.teleportOverlay.enableInstantTransmission) {
+                        } else if (SkyblockerConfigManager.get().general.teleportOverlay.enableInstantTransmission) {
                             render(wrc, nbt, 8);
                         }
                     }
                     case "ETHERWARP_CONDUIT" -> {
-                        if (SkyblockerConfig.get().general.teleportOverlay.enableEtherTransmission) {
+                        if (SkyblockerConfigManager.get().general.teleportOverlay.enableEtherTransmission) {
                             render(wrc, nbt, 57);
                         }
                     }
                     case "SINSEEKER_SCYTHE" -> {
-                        if (SkyblockerConfig.get().general.teleportOverlay.enableSinrecallTransmission) {
+                        if (SkyblockerConfigManager.get().general.teleportOverlay.enableSinrecallTransmission) {
                             render(wrc, nbt, 4);
                         }
                     }
                     case "NECRON_BLADE", "ASTRAEA", "HYPERION", "SCYLLA", "VALKYRIE" -> {
-                        if (SkyblockerConfig.get().general.teleportOverlay.enableWitherImpact) {
+                        if (SkyblockerConfigManager.get().general.teleportOverlay.enableWitherImpact) {
                             render(wrc, 10);
                         }
                     }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java
index a5d02d93..91862622 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/HungryHiker.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.barn;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
 import net.minecraft.client.MinecraftClient;
@@ -18,7 +18,7 @@ public class HungryHiker extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-    return SkyblockerConfig.get().locations.barn.solveHungryHiker ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
+    return SkyblockerConfigManager.get().locations.barn.solveHungryHiker ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java
index ba42d2ba..385dc20b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/barn/TreasureHunter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.barn;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
 import net.minecraft.client.MinecraftClient;
@@ -18,7 +18,7 @@ public class TreasureHunter extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().locations.barn.solveTreasureHunter ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
+        return SkyblockerConfigManager.get().locations.barn.solveTreasureHunter ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java
index bf3cc36d..67e6d7f4 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/CroesusHelper.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight;
 import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver;
 import net.minecraft.item.ItemStack;
@@ -17,7 +17,7 @@ public class CroesusHelper extends ContainerSolver {
 
     @Override
     protected boolean isEnabled() {
-        return SkyblockerConfig.get().locations.dungeons.croesusHelper;
+        return SkyblockerConfigManager.get().locations.dungeons.croesusHelper;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java
index 8d676d0b..f39684eb 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonBlaze.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
 import it.unimi.dsi.fastutil.objects.ObjectIntPair;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
@@ -106,7 +106,7 @@ public class DungeonBlaze {
      */
     public static void blazeRenderer(WorldRenderContext wrc) {
         try {
-            if (highestBlaze != null && lowestBlaze != null && highestBlaze.isAlive() && lowestBlaze.isAlive() && SkyblockerConfig.get().locations.dungeons.blazesolver) {
+            if (highestBlaze != null && lowestBlaze != null && highestBlaze.isAlive() && lowestBlaze.isAlive() && SkyblockerConfigManager.get().locations.dungeons.blazesolver) {
                 if (highestBlaze.getY() < 69) {
                     renderBlazeOutline(highestBlaze, nextHighestBlaze, wrc);
                 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
index f6fd5909..91be5248 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
@@ -2,8 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
 import com.google.gson.JsonObject;
 import it.unimi.dsi.fastutil.ints.IntBooleanPair;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.mixin.accessor.ScreenAccessor;
 import me.xmrvizzy.skyblocker.skyblock.item.PriceInfoTooltip;
 import me.xmrvizzy.skyblocker.utils.Utils;
@@ -41,7 +41,7 @@ public class DungeonChestProfit {
 
 	public static Text getChestProfit(GenericContainerScreenHandler handler, Text title, MinecraftClient client) {
 		try {
-			if (SkyblockerConfig.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator && isDungeonChest(title.getString())) {
+			if (SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator && isDungeonChest(title.getString())) {
 				int profit = 0;
 				boolean hasIncompleteData = false, usedKismet = false;
 				List<Slot> slots = handler.slots.subList(0, handler.getRows() * 9);
@@ -69,7 +69,7 @@ public class DungeonChestProfit {
 						}
 
 						//Essence price
-						if (name.contains("Essence") && SkyblockerConfig.get().locations.dungeons.dungeonChestProfit.includeEssence) {
+						if (name.contains("Essence") && SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.includeEssence) {
 							Matcher matcher = ESSENCE_PATTERN.matcher(name);
 
 							if (matcher.matches()) {
@@ -106,7 +106,7 @@ public class DungeonChestProfit {
 					}
 				}
 
-				if (SkyblockerConfig.get().locations.dungeons.dungeonChestProfit.includeKismet && usedKismet) {
+				if (SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.includeKismet && usedKismet) {
 					IntBooleanPair kismetPriceData = getItemPrice("KISMET_FEATHER");
 
 					if (!kismetPriceData.rightBoolean()) hasIncompleteData = true;
@@ -159,7 +159,7 @@ public class DungeonChestProfit {
 	}
 
 	private static Text getProfitText(int profit, boolean hasIncompleteData) {
-		ConfigModel.DungeonChestProfit config = SkyblockerConfig.get().locations.dungeons.dungeonChestProfit;
+		SkyblockerConfig.DungeonChestProfit config = SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit;
 		return getProfitText(profit, hasIncompleteData, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting);
 	}
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java
index a70dd501..53cc4fac 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMap.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -32,9 +32,9 @@ public class DungeonMap {
             VertexConsumerProvider.Immediate vertices = client.getBufferBuilders().getEffectVertexConsumers();
             MapRenderer map = client.gameRenderer.getMapRenderer();
             MapState state = FilledMapItem.getMapState(mapid, client.world);
-            float scaling = SkyblockerConfig.get().locations.dungeons.mapScaling;
-            int x = SkyblockerConfig.get().locations.dungeons.mapX;
-            int y = SkyblockerConfig.get().locations.dungeons.mapY;
+            float scaling = SkyblockerConfigManager.get().locations.dungeons.mapScaling;
+            int x = SkyblockerConfigManager.get().locations.dungeons.mapX;
+            int y = SkyblockerConfigManager.get().locations.dungeons.mapY;
 
             if (state == null) return;
             matrices.push();
@@ -47,7 +47,7 @@ public class DungeonMap {
     }
 
     public static void renderHUDMap(DrawContext context, int x, int y) {
-        float scaling = SkyblockerConfig.get().locations.dungeons.mapScaling;
+        float scaling = SkyblockerConfigManager.get().locations.dungeons.mapScaling;
         int size = (int) (128 * scaling);
         context.drawTexture(MAP_BACKGROUND, x, y, 0, 0, size, size, size, size);
     }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java
index 88a9070e..94b05e86 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonMapConfigScreen.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import net.minecraft.client.gui.DrawContext;
 import net.minecraft.client.gui.screen.Screen;
@@ -10,8 +10,8 @@ import java.awt.*;
 
 public class DungeonMapConfigScreen extends Screen {
 
-	private int hudX = SkyblockerConfig.get().locations.dungeons.mapX;
-	private int hudY = SkyblockerConfig.get().locations.dungeons.mapY;
+	private int hudX = SkyblockerConfigManager.get().locations.dungeons.mapX;
+	private int hudY = SkyblockerConfigManager.get().locations.dungeons.mapY;
 	private final Screen parent;
 	
 	protected DungeonMapConfigScreen() {
@@ -33,7 +33,7 @@ public class DungeonMapConfigScreen extends Screen {
 
 	@Override
 	public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
-		float scaling = SkyblockerConfig.get().locations.dungeons.mapScaling;
+		float scaling = SkyblockerConfigManager.get().locations.dungeons.mapScaling;
 		int size = (int) (128 * scaling);
 		if (RenderHelper.pointIsInArea(mouseX, mouseY, hudX, hudY, hudX + size, hudY + size) && button == 0) {
 			hudX = (int) Math.max(Math.min(mouseX - (size >> 1), this.width - size), 0);
@@ -54,9 +54,9 @@ public class DungeonMapConfigScreen extends Screen {
 
 	@Override
 	public void close() {
-		SkyblockerConfig.get().locations.dungeons.mapX = hudX;
-		SkyblockerConfig.get().locations.dungeons.mapY = hudY;
-		SkyblockerConfig.save();
+		SkyblockerConfigManager.get().locations.dungeons.mapX = hudX;
+		SkyblockerConfigManager.get().locations.dungeons.mapY = hudY;
+		SkyblockerConfigManager.save();
 		this.client.setScreen(parent);
 	}
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java
index e5d8a720..2df8192d 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/LividColor.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.scheduler.MessageScheduler;
 import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -12,7 +12,7 @@ public class LividColor {
 
     public static void init() {
         ClientReceiveMessageEvents.GAME.register((message, overlay) -> {
-            if (SkyblockerConfig.get().locations.dungeons.lividColor.enableLividColor && message.getString().equals("[BOSS] Livid: I respect you for making it to here, but I'll be your undoing.")) {
+            if (SkyblockerConfigManager.get().locations.dungeons.lividColor.enableLividColor && message.getString().equals("[BOSS] Livid: I respect you for making it to here, but I'll be your undoing.")) {
                 tenTicks = 8;
             }
         });
@@ -21,15 +21,15 @@ public class LividColor {
     public static void update() {
         MinecraftClient client = MinecraftClient.getInstance();
         if (tenTicks != 0) {
-            if (SkyblockerConfig.get().locations.dungeons.lividColor.enableLividColor && Utils.isInDungeons() && client.world != null) {
+            if (SkyblockerConfigManager.get().locations.dungeons.lividColor.enableLividColor && Utils.isInDungeons() && client.world != null) {
                 if (tenTicks == 1) {
-                    MessageScheduler.INSTANCE.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColor.lividColorText.replace("[color]", "red"));
+                    MessageScheduler.INSTANCE.sendMessageAfterCooldown(SkyblockerConfigManager.get().locations.dungeons.lividColor.lividColorText.replace("[color]", "red"));
                     tenTicks = 0;
                     return;
                 }
                 String key = client.world.getBlockState(new BlockPos(5, 110, 42)).getBlock().getTranslationKey();
                 if (key.startsWith("block.minecraft.") && key.endsWith("wool") && !key.endsWith("red_wool")) {
-                    MessageScheduler.INSTANCE.sendMessageAfterCooldown(SkyblockerConfig.get().locations.dungeons.lividColor.lividColorText.replace("[color]", key.substring(16, key.length() - 5)));
+                    MessageScheduler.INSTANCE.sendMessageAfterCooldown(SkyblockerConfigManager.get().locations.dungeons.lividColor.lividColorText.replace("[color]", key.substring(16, key.length() - 5)));
                     tenTicks = 0;
                     return;
                 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java
index 91de7a1d..b9fba7be 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/OldLever.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import net.minecraft.block.Block;
 import net.minecraft.block.enums.BlockFace;
 import net.minecraft.util.math.Direction;
@@ -14,7 +14,7 @@ public class OldLever {
     protected static final VoxelShape WEST_SHAPE = Block.createCuboidShape(10.0D, 3.0D, 5.0D, 16.0D, 13.0D, 11.0D);
 
     public static VoxelShape getShape(BlockFace face, Direction direction) {
-        if (!SkyblockerConfig.get().general.hitbox.oldLeverHitbox)
+        if (!SkyblockerConfigManager.get().general.hitbox.oldLeverHitbox)
             return null;
 
         if (face == BlockFace.FLOOR) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
index 8d8a840a..288a8b5a 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
@@ -43,7 +43,7 @@ public class Reparty extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-        return (SkyblockerConfig.get().general.acceptReparty || this.repartying) ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
+        return (SkyblockerConfigManager.get().general.acceptReparty || this.repartying) ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java
index 9f522942..05ed4d94 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
 import net.minecraft.client.MinecraftClient;
@@ -17,7 +17,7 @@ public class ThreeWeirdos extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().locations.dungeons.solveThreeWeirdos ? null : ChatFilterResult.PASS;
+        return SkyblockerConfigManager.get().locations.dungeons.solveThreeWeirdos ? null : ChatFilterResult.PASS;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TicTacToe.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TicTacToe.java
index a97b6752..21493da7 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TicTacToe.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/TicTacToe.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import me.xmrvizzy.skyblocker.utils.tictactoe.TicTacToeUtils;
@@ -126,7 +126,7 @@ public class TicTacToe {
 
 	private static void solutionRenderer(WorldRenderContext context) {
 		try {
-			if (SkyblockerConfig.get().locations.dungeons.solveTicTacToe && nextBestMoveToMake != null) {
+			if (SkyblockerConfigManager.get().locations.dungeons.solveTicTacToe && nextBestMoveToMake != null) {
 				RenderHelper.renderOutline(context, nextBestMoveToMake, RED_COLOR_COMPONENTS, 5);
 			}
 		} catch (Exception e) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java
index 8497041b..b1e51aa6 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
 import me.xmrvizzy.skyblocker.skyblock.FairySouls;
@@ -24,7 +24,7 @@ public class Trivia extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().locations.dungeons.solveTrivia ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
+        return SkyblockerConfigManager.get().locations.dungeons.solveTrivia ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java
index ac389d34..4e4e9565 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java
@@ -11,7 +11,7 @@ import it.unimi.dsi.fastutil.objects.Object2ByteMap;
 import it.unimi.dsi.fastutil.objects.Object2ByteOpenHashMap;
 import it.unimi.dsi.fastutil.objects.ObjectIntPair;
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -133,7 +133,7 @@ public class DungeonSecrets {
      * Use {@link #isRoomsLoaded()} to check for completion of loading.
      */
     public static void init() {
-        if (SkyblockerConfig.get().locations.dungeons.secretWaypoints.noInitSecretWaypoints) {
+        if (SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.noInitSecretWaypoints) {
             return;
         }
         // Execute with MinecraftClient as executor since we need to wait for MinecraftClient#resourceManager to be set
@@ -248,7 +248,7 @@ public class DungeonSecrets {
      */
     @SuppressWarnings("JavadocReference")
     private static void update() {
-        if (!SkyblockerConfig.get().locations.dungeons.secretWaypoints.enableSecretWaypoints) {
+        if (!SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableSecretWaypoints) {
             return;
         }
         if (!Utils.isInDungeons()) {
@@ -430,12 +430,12 @@ public class DungeonSecrets {
     }
 
     /**
-     * Checks if the player is in a dungeon and {@link me.xmrvizzy.skyblocker.config.SkyblockerConfig.Dungeons#secretWaypoints Secret Waypoints} is enabled.
+     * Checks if the player is in a dungeon and {@link me.xmrvizzy.skyblocker.config.SkyblockerConfigManager.Dungeons#secretWaypoints Secret Waypoints} is enabled.
      *
      * @return whether dungeon secrets should be processed
      */
     private static boolean shouldProcess() {
-        return SkyblockerConfig.get().locations.dungeons.secretWaypoints.enableSecretWaypoints && Utils.isInDungeons();
+        return SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableSecretWaypoints && Utils.isInDungeons();
     }
 
     /**
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
index 13ea400a..73ac1883 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
@@ -2,8 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.dungeon.secrets;
 
 import com.google.gson.JsonObject;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
 import net.minecraft.client.MinecraftClient;
@@ -93,10 +93,10 @@ public class SecretWaypoint {
         FAIRYSOUL(secretWaypoints -> secretWaypoints.enableFairySoulWaypoints, 255, 85, 255),
         STONK(secretWaypoints -> secretWaypoints.enableStonkWaypoints, 146, 52, 235),
         DEFAULT(secretWaypoints -> secretWaypoints.enableDefaultWaypoints, 190, 255, 252);
-        private final Predicate<ConfigModel.SecretWaypoints> enabledPredicate;
+        private final Predicate<SkyblockerConfig.SecretWaypoints> enabledPredicate;
         private final float[] colorComponents;
 
-        Category(Predicate<ConfigModel.SecretWaypoints> enabledPredicate, int... intColorComponents) {
+        Category(Predicate<SkyblockerConfig.SecretWaypoints> enabledPredicate, int... intColorComponents) {
             this.enabledPredicate = enabledPredicate;
             colorComponents = new float[intColorComponents.length];
             for (int i = 0; i < intColorComponents.length; i++) {
@@ -136,7 +136,7 @@ public class SecretWaypoint {
         }
 
         boolean isEnabled() {
-            return enabledPredicate.test(SkyblockerConfig.get().locations.dungeons.secretWaypoints);
+            return enabledPredicate.test(SkyblockerConfigManager.get().locations.dungeons.secretWaypoints);
         }
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
index 7aac04b5..787d696e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/ColorTerminal.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight;
 import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver;
 import net.minecraft.item.Item;
@@ -28,7 +28,7 @@ public class ColorTerminal extends ContainerSolver {
     @Override
     protected boolean isEnabled() {
         targetColor = null;
-        return SkyblockerConfig.get().locations.dungeons.terminals.solveColor;
+        return SkyblockerConfigManager.get().locations.dungeons.terminals.solveColor;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
index 01437919..afb07b4b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/OrderTerminal.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight;
 import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver;
 import net.minecraft.item.ItemStack;
@@ -24,7 +24,7 @@ public class OrderTerminal extends ContainerSolver {
     protected boolean isEnabled() {
         orderedSlots = null;
         currentNum = 0;
-        return SkyblockerConfig.get().locations.dungeons.terminals.solveOrder;
+        return SkyblockerConfigManager.get().locations.dungeons.terminals.solveOrder;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java
index 988b570e..fa9fa324 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/terminal/StartsWithTerminal.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon.terminal;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight;
 import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver;
 import net.minecraft.item.ItemStack;
@@ -16,7 +16,7 @@ public class StartsWithTerminal extends ContainerSolver {
 
     @Override
     protected boolean isEnabled() {
-        return SkyblockerConfig.get().locations.dungeons.terminals.solveStartsWith;
+        return SkyblockerConfigManager.get().locations.dungeons.terminals.solveStartsWith;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java
index 3563741c..3d8292a5 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHud.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock.dwarven;
 
 import it.unimi.dsi.fastutil.ints.IntIntPair;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
@@ -46,19 +46,19 @@ public class DwarvenHud {
                                 .executes(Scheduler.queueOpenScreenCommand(DwarvenHudConfigScreen::new))))));
 
         HudRenderCallback.EVENT.register((context, tickDelta) -> {
-            if (!SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled
+            if (!SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabled
                     || client.options.playerListKey.isPressed()
                     || client.player == null
                     || commissionList.isEmpty()) {
                 return;
             }
-            render(HudCommsWidget.INSTANCE, context, SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x,
-                    SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y, commissionList);
+            render(HudCommsWidget.INSTANCE, context, SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.x,
+                    SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.y, commissionList);
         });
     }
 
     public static IntIntPair getDimForConfig(List<Commission> commissions) {
-        return switch (SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.style) {
+        return switch (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.style) {
             case SIMPLE -> {
                 HudCommsWidget.INSTANCE_CFG.updateData(commissions, false);
                 yield IntIntPair.of(
@@ -77,7 +77,7 @@ public class DwarvenHud {
 
     public static void render(HudCommsWidget hcw, DrawContext context, int hudX, int hudY, List<Commission> commissions) {
 
-        switch (SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.style) {
+        switch (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.style) {
             case SIMPLE -> renderSimple(hcw, context, hudX, hudY, commissions);
             case FANCY -> renderFancy(hcw, context, hudX, hudY, commissions);
             case CLASSIC -> renderClassic(context, hudX, hudY, commissions);
@@ -85,7 +85,7 @@ public class DwarvenHud {
     }
 
     public static void renderClassic(DrawContext context, int hudX, int hudY, List<Commission> commissions) {
-        if (SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground) {
+        if (SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enableBackground) {
             context.fill(hudX, hudY, hudX + 200, hudY + (20 * commissions.size()), 0x64000000);
         }
 
@@ -108,7 +108,7 @@ public class DwarvenHud {
         hcw.setX(hudX);
         hcw.setY(hudY);
         hcw.render(context,
-                SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground);
+                SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enableBackground);
     }
 
     public static void renderFancy(HudCommsWidget hcw, DrawContext context, int hudX, int hudY, List<Commission> commissions) {
@@ -117,12 +117,12 @@ public class DwarvenHud {
         hcw.setX(hudX);
         hcw.setY(hudY);
         hcw.render(context,
-                SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enableBackground);
+                SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enableBackground);
     }
 
     public static void update() {
         commissionList = new ArrayList<>();
-        if (client.player == null || client.getNetworkHandler() == null || !SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.enabled)
+        if (client.player == null || client.getNetworkHandler() == null || !SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.enabled)
             return;
 
         client.getNetworkHandler().getPlayerList().forEach(playerListEntry -> {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
index ee7c71a2..6e5784e3 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/DwarvenHudConfigScreen.java
@@ -2,7 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock.dwarven;
 
 import it.unimi.dsi.fastutil.ints.IntIntPair;
 import me.shedaniel.autoconfig.AutoConfig;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.dwarven.DwarvenHud.Commission;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.hud.HudCommsWidget;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
@@ -17,8 +17,8 @@ public class DwarvenHudConfigScreen extends Screen {
 
     private static final List<Commission> CFG_COMMS = List.of(new DwarvenHud.Commission("Test Commission 1", "1%"), new DwarvenHud.Commission("Test Commission 2", "2%"));
 
-    private int hudX = SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x;
-    private int hudY = SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y;
+    private int hudX = SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.x;
+    private int hudY = SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.y;
     private final Screen parent;
 
     protected DwarvenHudConfigScreen() {
@@ -60,9 +60,9 @@ public class DwarvenHudConfigScreen extends Screen {
 
     @Override
     public void close() {
-        SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.x = hudX;
-        SkyblockerConfig.get().locations.dwarvenMines.dwarvenHud.y = hudY;
-        SkyblockerConfig.save();
+        SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.x = hudX;
+        SkyblockerConfigManager.get().locations.dwarvenMines.dwarvenHud.y = hudY;
+        SkyblockerConfigManager.save();
         client.setScreen(parent);
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
index 5e284452..d5c18545 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dwarven;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
 import net.minecraft.client.MinecraftClient;
@@ -19,7 +19,7 @@ public class Fetchur extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().locations.dwarvenMines.solveFetchur ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
+        return SkyblockerConfigManager.get().locations.dwarvenMines.solveFetchur ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
index 96ccdaf2..90a0e30f 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.dwarven;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
 import net.minecraft.block.Blocks;
@@ -18,7 +18,7 @@ public class Puzzler extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().locations.dwarvenMines.solvePuzzler ? null : ChatFilterResult.PASS;
+        return SkyblockerConfigManager.get().locations.dwarvenMines.solvePuzzler ? null : ChatFilterResult.PASS;
     }
 
     @Override
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java
index 84ef5698..1eef9722 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ChronomatronSolver.java
@@ -2,8 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.experiment;
 
 import com.google.common.collect.ImmutableMap;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
@@ -53,7 +53,7 @@ public class ChronomatronSolver extends ExperimentSolver {
     }
 
     @Override
-    protected boolean isEnabled(ConfigModel.Experiments experimentsConfig) {
+    protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) {
         return experimentsConfig.enableChronomatronSolver;
     }
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java
index aaf25577..9e25fa2a 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/ExperimentSolver.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock.experiment;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver;
 import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
 import net.minecraft.client.gui.screen.Screen;
@@ -37,10 +37,10 @@ public abstract class ExperimentSolver extends ContainerSolver {
 
     @Override
     protected final boolean isEnabled() {
-        return isEnabled(SkyblockerConfig.get().general.experiments);
+        return isEnabled(SkyblockerConfigManager.get().general.experiments);
     }
 
-    protected abstract boolean isEnabled(ConfigModel.Experiments experimentsConfig);
+    protected abstract boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig);
 
     @Override
     protected void start(GenericContainerScreen screen) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java
index 0ac15dfc..40f1ab1b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/SuperpairsSolver.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock.experiment;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
@@ -28,7 +28,7 @@ public class SuperpairsSolver extends ExperimentSolver {
     }
 
     @Override
-    protected boolean isEnabled(ConfigModel.Experiments experimentsConfig) {
+    protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) {
         return experimentsConfig.enableSuperpairsSolver;
     }
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java
index 6527231f..166fb8a9 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/experiment/UltrasequencerSolver.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock.experiment;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.gui.ColorHighlight;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
@@ -28,7 +28,7 @@ public class UltrasequencerSolver extends ExperimentSolver {
     }
 
     @Override
-    protected boolean isEnabled(ConfigModel.Experiments experimentsConfig) {
+    protected boolean isEnabled(SkyblockerConfig.Experiments experimentsConfig) {
         return experimentsConfig.enableUltrasequencerSolver;
     }
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java
index 97e5e8dd..addb1b05 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AbilityFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 
 public class AbilityFilter extends SimpleChatFilter {
@@ -10,6 +10,6 @@ public class AbilityFilter extends SimpleChatFilter {
 
     @Override
     protected ChatFilterResult state() {
-        return SkyblockerConfig.get().messages.hideAbility;
+        return SkyblockerConfigManager.get().messages.hideAbility;
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java
index 23caa180..e0493389 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AdFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Constants;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
@@ -34,6 +34,6 @@ public class AdFilter extends ChatPatternListener {
 
 	@Override
 	protected ChatFilterResult state() {
-		return SkyblockerConfig.get().messages.hideAds;
+		return SkyblockerConfigManager.get().messages.hideAds;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java
index 15c1ce6a..02e8867c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AoteFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 
 public class AoteFilter extends SimpleChatFilter {
@@ -10,6 +10,6 @@ public class AoteFilter extends SimpleChatFilter {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().messages.hideAOTE;
+        return SkyblockerConfigManager.get().messages.hideAOTE;
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java
index 8c9ce9f6..65811a8a 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/AutopetFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 import me.xmrvizzy.skyblocker.utils.chat.ChatPatternListener;
 import net.minecraft.client.MinecraftClient;
@@ -16,7 +16,7 @@ public class AutopetFilter extends ChatPatternListener {
 
     @Override
     public boolean onMatch(Text _message, Matcher matcher) {
-        if (SkyblockerConfig.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) {
+        if (SkyblockerConfigManager.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR) {
             Objects.requireNonNull(MinecraftClient.getInstance().player).sendMessage(
                     Text.literal(
                             _message.getString().replace("§a§lVIEW RULE", "")
@@ -27,9 +27,9 @@ public class AutopetFilter extends ChatPatternListener {
 
     @Override
     public ChatFilterResult state() {
-        if (SkyblockerConfig.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR)
+        if (SkyblockerConfigManager.get().messages.hideAutopet == ChatFilterResult.ACTION_BAR)
             return ChatFilterResult.FILTER;
         else
-            return SkyblockerConfig.get().messages.hideAutopet;
+            return SkyblockerConfigManager.get().messages.hideAutopet;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java
index 4a714e6d..d884bf37 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ComboFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 
 public class ComboFilter extends SimpleChatFilter {
@@ -11,6 +11,6 @@ public class ComboFilter extends SimpleChatFilter {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().messages.hideCombo;
+        return SkyblockerConfigManager.get().messages.hideCombo;
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java
index 652d47c7..938b1aaa 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/HealFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 
 public class HealFilter extends SimpleChatFilter {
@@ -10,6 +10,6 @@ public class HealFilter extends SimpleChatFilter {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().messages.hideHeal;
+        return SkyblockerConfigManager.get().messages.hideHeal;
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java
index d7748313..2cc89185 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ImplosionFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 
 public class ImplosionFilter extends SimpleChatFilter {
@@ -10,6 +10,6 @@ public class ImplosionFilter extends SimpleChatFilter {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().messages.hideImplosion;
+        return SkyblockerConfigManager.get().messages.hideImplosion;
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java
index 9f6138f0..9627dc13 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/MoltenWaveFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 
 public class MoltenWaveFilter extends SimpleChatFilter {
@@ -10,6 +10,6 @@ public class MoltenWaveFilter extends SimpleChatFilter {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().messages.hideMoltenWave;
+        return SkyblockerConfigManager.get().messages.hideMoltenWave;
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java
index 85be9e2a..418e0f27 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/ShowOffFilter.java
@@ -2,7 +2,7 @@ package me.xmrvizzy.skyblocker.skyblock.filters;
 
 import me.xmrvizzy.skyblocker.utils.Constants;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 
 public class ShowOffFilter extends SimpleChatFilter {
 	private static final String[] SHOW_TYPES = { "is holding", "is wearing", "is friends with a", "has" };
@@ -13,6 +13,6 @@ public class ShowOffFilter extends SimpleChatFilter {
 
 	@Override
 	protected ChatFilterResult state() {
-		return SkyblockerConfig.get().messages.hideShowOff;
+		return SkyblockerConfigManager.get().messages.hideShowOff;
 	}
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java
index 1961d78a..2035facb 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/filters/TeleportPadFilter.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.filters;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
 
 public class TeleportPadFilter extends SimpleChatFilter {
@@ -11,6 +11,6 @@ public class TeleportPadFilter extends SimpleChatFilter {
 
     @Override
     public ChatFilterResult state() {
-        return SkyblockerConfig.get().messages.hideTeleportPad;
+        return SkyblockerConfigManager.get().messages.hideTeleportPad;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java
index 7c4ed423..88df1b40 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorDyeColors.java
@@ -4,7 +4,7 @@ import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
 import com.mojang.brigadier.arguments.StringArgumentType;
 import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -46,19 +46,19 @@ public class CustomArmorDyeColors {
 					String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
 
 					if (itemUuid != null) {
-						Object2IntOpenHashMap<String> customDyeColors = SkyblockerConfig.get().general.customDyeColors;
+						Object2IntOpenHashMap<String> customDyeColors = SkyblockerConfigManager.get().general.customDyeColors;
 
 						if (hex == null) {
 							if (customDyeColors.containsKey(itemUuid)) {
 								customDyeColors.removeInt(itemUuid);
-								SkyblockerConfig.save();
+								SkyblockerConfigManager.save();
 								source.sendFeedback(Text.translatable("skyblocker.customDyeColors.removed"));
 							} else {
 								source.sendFeedback(Text.translatable("skyblocker.customDyeColors.neverHad"));
 							}
 						} else {
 							customDyeColors.put(itemUuid, Integer.decode("0x" + hex.replace("#", "")).intValue());
-							SkyblockerConfig.save();
+							SkyblockerConfigManager.save();
 							source.sendFeedback(Text.translatable("skyblocker.customDyeColors.added"));
 						}
 					} else {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java
index 443ad509..c7de9320 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomArmorTrims.java
@@ -7,7 +7,7 @@ import com.mojang.brigadier.suggestion.SuggestionProvider;
 import dev.isxander.yacl3.config.ConfigEntry;
 import it.unimi.dsi.fastutil.Pair;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.SkyblockEvents;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
@@ -102,12 +102,12 @@ public class CustomArmorTrims {
 					String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
 
 					if (itemUuid != null) {
-						Object2ObjectOpenHashMap<String, ArmorTrimId> customArmorTrims = SkyblockerConfig.get().general.customArmorTrims;
+						Object2ObjectOpenHashMap<String, ArmorTrimId> customArmorTrims = SkyblockerConfigManager.get().general.customArmorTrims;
 
 						if (material == null && pattern == null) {
 							if (customArmorTrims.containsKey(itemUuid)) {
 								customArmorTrims.remove(itemUuid);
-								SkyblockerConfig.save();
+								SkyblockerConfigManager.save();
 								source.sendFeedback(Text.translatable("skyblocker.customArmorTrims.removed"));
 							} else {
 								source.sendFeedback(Text.translatable("skyblocker.customArmorTrims.neverHad"));
@@ -122,7 +122,7 @@ public class CustomArmorTrims {
 							}
 
 							customArmorTrims.put(itemUuid, trimId);
-							SkyblockerConfig.save();
+							SkyblockerConfigManager.save();
 							source.sendFeedback(Text.translatable("skyblocker.customArmorTrims.added"));
 						}
 					} else {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java
index 8c160456..76312461 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/CustomItemNames.java
@@ -3,7 +3,7 @@ package me.xmrvizzy.skyblocker.skyblock.item;
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -40,13 +40,13 @@ public class CustomItemNames {
 			String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
 
 			if (itemUuid != null) {
-				Object2ObjectOpenHashMap<String, Text> customItemNames = SkyblockerConfig.get().general.customItemNames;
+				Object2ObjectOpenHashMap<String, Text> customItemNames = SkyblockerConfigManager.get().general.customItemNames;
 
 				if (text == null) {
 					if (customItemNames.containsKey(itemUuid)) {
 						//Remove custom item name when the text argument isn't passed
 						customItemNames.remove(itemUuid);
-						SkyblockerConfig.save();
+						SkyblockerConfigManager.save();
 						source.sendFeedback(Text.translatable("skyblocker.customItemNames.removed"));
 					} else {
 						source.sendFeedback(Text.translatable("skyblocker.customItemNames.neverHad"));
@@ -59,7 +59,7 @@ public class CustomItemNames {
 					((MutableText) text).setStyle(currentStyle.withItalic((currentStyle.isItalic() ? true : false)));
 
 					customItemNames.put(itemUuid, text);
-					SkyblockerConfig.save();
+					SkyblockerConfigManager.save();
 					source.sendFeedback(Text.translatable("skyblocker.customItemNames.added"));
 				}
 			} else {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
index f04e7029..16a4c596 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/PriceInfoTooltip.java
@@ -3,8 +3,8 @@ package me.xmrvizzy.skyblocker.skyblock.item;
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Http;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
@@ -63,7 +63,7 @@ public class PriceInfoTooltip {
         int count = stack.getCount();
         boolean bazaarOpened = lines.stream().anyMatch(each -> each.getString().contains("Buy price:") || each.getString().contains("Sell price:"));
 
-        if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice) {
+        if (SkyblockerConfigManager.get().general.itemTooltip.enableNPCPrice) {
             if (npcPricesJson == null) {
                 nullWarning();
             } else if (npcPricesJson.has(internalID)) {
@@ -73,7 +73,7 @@ public class PriceInfoTooltip {
             }
         }
 
-        if (SkyblockerConfig.get().general.itemTooltip.enableMotesPrice && Utils.isInTheRift()) {
+        if (SkyblockerConfigManager.get().general.itemTooltip.enableMotesPrice && Utils.isInTheRift()) {
             if (motesPricesJson == null) {
                 nullWarning();
             } else if (motesPricesJson.has(internalID)) {
@@ -85,7 +85,7 @@ public class PriceInfoTooltip {
 
         boolean bazaarExist = false;
 
-        if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice && !bazaarOpened) {
+        if (SkyblockerConfigManager.get().general.itemTooltip.enableBazaarPrice && !bazaarOpened) {
             if (bazaarPricesJson == null) {
                 nullWarning();
             } else if (bazaarPricesJson.has(name)) {
@@ -106,7 +106,7 @@ public class PriceInfoTooltip {
 
         // bazaarOpened & bazaarExist check for lbin, because Skytils keeps some bazaar item data in lbin api
         boolean lbinExist = false;
-        if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN && !bazaarOpened && !bazaarExist) {
+        if (SkyblockerConfigManager.get().general.itemTooltip.enableLowestBIN && !bazaarOpened && !bazaarExist) {
             if (lowestPricesJson == null) {
                 nullWarning();
             } else if (lowestPricesJson.has(name)) {
@@ -117,7 +117,7 @@ public class PriceInfoTooltip {
             }
         }
 
-        if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN) {
+        if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) {
             if (threeDayAvgPricesJson == null || oneDayAvgPricesJson == null) {
                 nullWarning();
             } else {
@@ -148,10 +148,10 @@ public class PriceInfoTooltip {
                 }
 
                 if (!neuName.isEmpty() && lbinExist) {
-                    ConfigModel.Average type = SkyblockerConfig.get().general.itemTooltip.avg;
+                    SkyblockerConfig.Average type = SkyblockerConfigManager.get().general.itemTooltip.avg;
 
                     // "No data" line because of API not keeping old data, it causes NullPointerException
-                    if (type == ConfigModel.Average.ONE_DAY || type == ConfigModel.Average.BOTH) {
+                    if (type == SkyblockerConfig.Average.ONE_DAY || type == SkyblockerConfig.Average.BOTH) {
                         lines.add(
                                 Text.literal(String.format("%-19s", "1 Day Avg. Price:"))
                                         .formatted(Formatting.GOLD)
@@ -161,7 +161,7 @@ public class PriceInfoTooltip {
                                         )
                         );
                     }
-                    if (type == ConfigModel.Average.THREE_DAY || type == ConfigModel.Average.BOTH) {
+                    if (type == SkyblockerConfig.Average.THREE_DAY || type == SkyblockerConfig.Average.BOTH) {
                         lines.add(
                                 Text.literal(String.format("%-19s", "3 Day Avg. Price:"))
                                         .formatted(Formatting.GOLD)
@@ -175,7 +175,7 @@ public class PriceInfoTooltip {
             }
         }
 
-        if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && !bazaarOpened) {
+        if (SkyblockerConfigManager.get().general.itemTooltip.enableMuseumDate && !bazaarOpened) {
             if (isMuseumJson == null) {
                 nullWarning();
             } else {
@@ -332,7 +332,7 @@ public class PriceInfoTooltip {
     }
 
     private static Text getMotesMessage(int price, int count) {
-        float motesMultiplier = SkyblockerConfig.get().locations.rift.mcGrubberStacks * 0.05f + 1;
+        float motesMultiplier = SkyblockerConfigManager.get().locations.rift.mcGrubberStacks * 0.05f + 1;
 
         // Calculate the total price
         int totalPrice = price * count;
@@ -363,33 +363,33 @@ public class PriceInfoTooltip {
             }
 
             List<CompletableFuture<Void>> futureList = new ArrayList<>();
-            if (SkyblockerConfig.get().general.itemTooltip.enableAvgBIN) {
-            	ConfigModel.Average type = SkyblockerConfig.get().general.itemTooltip.avg;
+            if (SkyblockerConfigManager.get().general.itemTooltip.enableAvgBIN) {
+            	SkyblockerConfig.Average type = SkyblockerConfigManager.get().general.itemTooltip.avg;
 
-                if (type == ConfigModel.Average.BOTH || oneDayAvgPricesJson == null || threeDayAvgPricesJson == null || minute % 5 == 0) {
+                if (type == SkyblockerConfig.Average.BOTH || oneDayAvgPricesJson == null || threeDayAvgPricesJson == null || minute % 5 == 0) {
                     futureList.add(CompletableFuture.runAsync(() -> {
                         oneDayAvgPricesJson = downloadPrices("1 day avg");
                         threeDayAvgPricesJson = downloadPrices("3 day avg");
                     }));
-                } else if (type == ConfigModel.Average.ONE_DAY) {
+                } else if (type == SkyblockerConfig.Average.ONE_DAY) {
                     futureList.add(CompletableFuture.runAsync(() -> oneDayAvgPricesJson = downloadPrices("1 day avg")));
-                } else if (type == ConfigModel.Average.THREE_DAY) {
+                } else if (type == SkyblockerConfig.Average.THREE_DAY) {
                     futureList.add(CompletableFuture.runAsync(() -> threeDayAvgPricesJson = downloadPrices("3 day avg")));
                 }
             }
-            if (SkyblockerConfig.get().general.itemTooltip.enableLowestBIN || SkyblockerConfig.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator)
+            if (SkyblockerConfigManager.get().general.itemTooltip.enableLowestBIN || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator)
                 futureList.add(CompletableFuture.runAsync(() -> lowestPricesJson = downloadPrices("lowest bins")));
 
-            if (SkyblockerConfig.get().general.itemTooltip.enableBazaarPrice || SkyblockerConfig.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator)
+            if (SkyblockerConfigManager.get().general.itemTooltip.enableBazaarPrice || SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit.enableProfitCalculator)
                 futureList.add(CompletableFuture.runAsync(() -> bazaarPricesJson = downloadPrices("bazaar")));
 
-            if (SkyblockerConfig.get().general.itemTooltip.enableNPCPrice && npcPricesJson == null)
+            if (SkyblockerConfigManager.get().general.itemTooltip.enableNPCPrice && npcPricesJson == null)
                 futureList.add(CompletableFuture.runAsync(() -> npcPricesJson = downloadPrices("npc")));
 
-            if (SkyblockerConfig.get().general.itemTooltip.enableMuseumDate && isMuseumJson == null)
+            if (SkyblockerConfigManager.get().general.itemTooltip.enableMuseumDate && isMuseumJson == null)
                 futureList.add(CompletableFuture.runAsync(() -> isMuseumJson = downloadPrices("museum")));
 
-            if (SkyblockerConfig.get().general.itemTooltip.enableMotesPrice && motesPricesJson == null)
+            if (SkyblockerConfigManager.get().general.itemTooltip.enableMotesPrice && motesPricesJson == null)
                 futureList.add(CompletableFuture.runAsync(() -> motesPricesJson = downloadPrices("motes")));
 
             minute++;
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java
index 833a6917..aa933da4 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/quicknav/QuickNav.java
@@ -2,8 +2,8 @@ package me.xmrvizzy.skyblocker.skyblock.quicknav;
 
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
 import net.fabricmc.fabric.api.client.screen.v1.Screens;
@@ -26,7 +26,7 @@ public class QuickNav {
 
     public static void init() {
         ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
-            if (Utils.isOnSkyblock() && SkyblockerConfig.get().quickNav.enableQuickNav && screen instanceof HandledScreen<?> && client.player != null && !client.player.isCreative()) {
+            if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().quickNav.enableQuickNav && screen instanceof HandledScreen<?> && client.player != null && !client.player.isCreative()) {
                 String screenTitle = screen.getTitle().getString().trim();
                 List<QuickNavButton> buttons = QuickNav.init(screenTitle);
                 for (QuickNavButton button : buttons) Screens.getButtons(screen).add(button);
@@ -36,7 +36,7 @@ public class QuickNav {
 
     public static List<QuickNavButton> init(String screenTitle) {
         List<QuickNavButton> buttons = new ArrayList<>();
-        ConfigModel.QuickNav data = SkyblockerConfig.get().quickNav;
+        SkyblockerConfig.QuickNav data = SkyblockerConfigManager.get().quickNav;
         try {
             if (data.button1.render) buttons.add(parseButton(data.button1, screenTitle, 0));
             if (data.button2.render) buttons.add(parseButton(data.button2, screenTitle, 1));
@@ -56,8 +56,8 @@ public class QuickNav {
         return buttons;
     }
 
-    private static QuickNavButton parseButton(ConfigModel.QuickNavItem buttonInfo, String screenTitle, int id) throws CommandSyntaxException {
-    	ConfigModel.ItemData itemData = buttonInfo.item;
+    private static QuickNavButton parseButton(SkyblockerConfig.QuickNavItem buttonInfo, String screenTitle, int id) throws CommandSyntaxException {
+    	SkyblockerConfig.ItemData itemData = buttonInfo.item;
         String nbtString = "{id:\"minecraft:" + itemData.itemName.toLowerCase(Locale.ROOT) + "\",Count:1";
         if (itemData.nbt.length() > 2) nbtString += "," + itemData.nbt;
         nbtString += "}";
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java
index 11f879b9..5548484e 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/EffigyWaypoints.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.rift;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
@@ -34,7 +34,7 @@ public class EffigyWaypoints {
     private static final List<BlockPos> unBrokenEffigies = new ArrayList<>();
 
     protected static void updateEffigies() {
-        if (!SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return;
+        if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableEffigyWaypoints || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return;
 
         unBrokenEffigies.clear();
         try {
@@ -63,10 +63,10 @@ public class EffigyWaypoints {
     }
 
     protected static void render(WorldRenderContext context) {
-        if (SkyblockerConfig.get().slayer.vampireSlayer.enableEffigyWaypoints && Utils.getLocation().contains("Stillgore Château")) {
+        if (SkyblockerConfigManager.get().slayer.vampireSlayer.enableEffigyWaypoints && Utils.getLocation().contains("Stillgore Château")) {
             for (BlockPos effigy : unBrokenEffigies) {
                 float[] colorComponents = DyeColor.RED.getColorComponents();
-                if (SkyblockerConfig.get().slayer.vampireSlayer.compactEffigyWaypoints) {
+                if (SkyblockerConfigManager.get().slayer.vampireSlayer.compactEffigyWaypoints) {
                     RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy.down(6), colorComponents, 0.5F);
                 } else {
                     RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy, colorComponents, 0.5F);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java
index b547ebb5..78fe8f6c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/HealingMelonIndicator.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.rift;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import me.xmrvizzy.skyblocker.utils.render.title.Title;
@@ -13,12 +13,12 @@ public class HealingMelonIndicator {
     private static final Title title = new Title("skyblocker.rift.healNow", Formatting.DARK_RED);
 
     public static void updateHealth() {
-        if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) {
+        if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) {
             TitleContainer.removeTitle(title);
             return;
         }
         ClientPlayerEntity player = MinecraftClient.getInstance().player;
-        if (player != null && player.getHealth() <= SkyblockerConfig.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F) {
+        if (player != null && player.getHealth() <= SkyblockerConfigManager.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F) {
             RenderHelper.displayInTitleContainerAndPlaySound(title);
         } else {
             TitleContainer.removeTitle(title);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java
index 16ab250a..1fca4559 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/ManiaIndicator.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.rift;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.SlayerUtils;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
@@ -17,7 +17,7 @@ public class ManiaIndicator {
     private static final Title title = new Title("skyblocker.rift.mania", Formatting.RED);
 
     protected static void updateMania() {
-        if (!SkyblockerConfig.get().slayer.vampireSlayer.enableManiaIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
+        if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableManiaIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
             TitleContainer.removeTitle(title);
             return;
         }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java
index d59745d8..3063f63c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/MirrorverseWaypoints.java
@@ -4,7 +4,7 @@ import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
@@ -71,7 +71,7 @@ public class MirrorverseWaypoints {
 
 	protected static void render(WorldRenderContext wrc) {
 		//I would also check for the mirrorverse location but the scoreboard stuff is not performant at all...
-		if (Utils.isInTheRift() && SkyblockerConfig.get().locations.rift.mirrorverseWaypoints) {
+		if (Utils.isInTheRift() && SkyblockerConfigManager.get().locations.rift.mirrorverseWaypoints) {
 			for (BlockPos pos : LAVA_PATH_WAYPOINTS) {
 				RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f);
 			}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java
index 1d969514..ff7298a3 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/StakeIndicator.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.rift;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.SlayerUtils;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
@@ -13,7 +13,7 @@ public class StakeIndicator {
     private static final Title title = new Title("skyblocker.rift.stakeNow", Formatting.RED);
 
     protected static void updateStake() {
-        if (!SkyblockerConfig.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) {
+        if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) {
             TitleContainer.removeTitle(title);
             return;
         }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java
index 4b11fcb0..f3a35869 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TheRift.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.rift;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
 
@@ -13,9 +13,9 @@ public class TheRift {
     public static void init() {
         WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render);
         WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render);
-        Scheduler.INSTANCE.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfig.get().slayer.vampireSlayer.effigyUpdateFrequency);
-        Scheduler.INSTANCE.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfig.get().slayer.vampireSlayer.holyIceUpdateFrequency);
-        Scheduler.INSTANCE.scheduleCyclic(ManiaIndicator::updateMania, SkyblockerConfig.get().slayer.vampireSlayer.maniaUpdateFrequency);
-        Scheduler.INSTANCE.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfig.get().slayer.vampireSlayer.steakStakeUpdateFrequency);
+        Scheduler.INSTANCE.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfigManager.get().slayer.vampireSlayer.effigyUpdateFrequency);
+        Scheduler.INSTANCE.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfigManager.get().slayer.vampireSlayer.holyIceUpdateFrequency);
+        Scheduler.INSTANCE.scheduleCyclic(ManiaIndicator::updateMania, SkyblockerConfigManager.get().slayer.vampireSlayer.maniaUpdateFrequency);
+        Scheduler.INSTANCE.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfigManager.get().slayer.vampireSlayer.steakStakeUpdateFrequency);
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java
index 6e6fad2d..2bd84106 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/rift/TwinClawsIndicator.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.rift;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.SlayerUtils;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
@@ -15,7 +15,7 @@ public class TwinClawsIndicator {
     private static boolean scheduled = false;
 
     protected static void updateIce() {
-        if (!SkyblockerConfig.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
+        if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
             TitleContainer.removeTitle(title);
             return;
         }
@@ -32,7 +32,7 @@ public class TwinClawsIndicator {
                     Scheduler.INSTANCE.schedule(() -> {
                         RenderHelper.displayInTitleContainerAndPlaySound(title);
                         scheduled = false;
-                    }, SkyblockerConfig.get().slayer.vampireSlayer.holyIceIndicatorTickDelay);
+                    }, SkyblockerConfigManager.get().slayer.vampireSlayer.holyIceIndicatorTickDelay);
                 }
             }
         }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java
index 14bc1db4..e9309706 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/shortcut/Shortcuts.java
@@ -6,7 +6,7 @@ import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
 import com.mojang.brigadier.arguments.StringArgumentType;
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
 import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
@@ -161,14 +161,14 @@ public class Shortcuts {
         }
         dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("help").executes(context -> {
             FabricClientCommandSource source = context.getSource();
-            String status = SkyblockerConfig.get().general.shortcuts.enableShortcuts && SkyblockerConfig.get().general.shortcuts.enableCommandShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)";
+            String status = SkyblockerConfigManager.get().general.shortcuts.enableShortcuts && SkyblockerConfigManager.get().general.shortcuts.enableCommandShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)";
             source.sendFeedback(Text.of("§e§lSkyblocker §fCommand Shortcuts" + status));
             if (!isShortcutsLoaded()) {
                 source.sendFeedback(Text.translatable("skyblocker.shortcuts.notLoaded"));
             } else for (Map.Entry<String, String> command : commands.entrySet()) {
                 source.sendFeedback(Text.of("§7" + command.getKey() + " §f→ §7" + command.getValue()));
             }
-            status = SkyblockerConfig.get().general.shortcuts.enableShortcuts && SkyblockerConfig.get().general.shortcuts.enableCommandArgShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)";
+            status = SkyblockerConfigManager.get().general.shortcuts.enableShortcuts && SkyblockerConfigManager.get().general.shortcuts.enableCommandArgShortcuts ? "§a§l (Enabled)" : "§c§l (Disabled)";
             source.sendFeedback(Text.of("§e§lSkyblocker §fCommand Argument Shortcuts" + status));
             if (!isShortcutsLoaded()) {
                 source.sendFeedback(Text.translatable("skyblocker.shortcuts.notLoaded"));
@@ -185,16 +185,16 @@ public class Shortcuts {
     }
 
     private static String modifyCommand(String command) {
-        if (SkyblockerConfig.get().general.shortcuts.enableShortcuts) {
+        if (SkyblockerConfigManager.get().general.shortcuts.enableShortcuts) {
             if (!isShortcutsLoaded()) {
                 LOGGER.warn("[Skyblocker] Shortcuts not loaded yet, skipping shortcut for command: {}", command);
                 return command;
             }
             command = '/' + command;
-            if (SkyblockerConfig.get().general.shortcuts.enableCommandShortcuts) {
+            if (SkyblockerConfigManager.get().general.shortcuts.enableCommandShortcuts) {
                 command = commands.getOrDefault(command, command);
             }
-            if (SkyblockerConfig.get().general.shortcuts.enableCommandArgShortcuts) {
+            if (SkyblockerConfigManager.get().general.shortcuts.enableCommandArgShortcuts) {
                 String[] messageArgs = command.split(" ");
                 for (int i = 0; i < messageArgs.length; i++) {
                     messageArgs[i] = commandArgs.getOrDefault(messageArgs[i], messageArgs[i]);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
index a3d7e5c5..84af889c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/special/SpecialEffects.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock.special;
 
 import com.mojang.blaze3d.systems.RenderSystem;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
 import net.minecraft.client.MinecraftClient;
@@ -45,7 +45,7 @@ public class SpecialEffects {
 	private static void displayRareDropEffect(Text message, boolean overlay) {
 		//We don't check if we're in dungeons because that check doesn't work in m7 which defeats the point of this
 		//It might also allow it to work with Croesus
-		if (Utils.isOnSkyblock() && SkyblockerConfig.get().general.specialEffects.rareDungeonDropEffects) {
+		if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.specialEffects.rareDungeonDropEffects) {
 			try {
 				String stringForm = message.getString();
 				Matcher matcher = DROP_PATTERN.matcher(stringForm);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java
index dd420fcf..994317f8 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/spidersden/Relics.java
@@ -6,8 +6,8 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.mojang.brigadier.CommandDispatcher;
 import me.xmrvizzy.skyblocker.SkyblockerMod;
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.PosUtils;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
@@ -116,7 +116,7 @@ public class Relics {
     }
 
     private static void render(WorldRenderContext context) {
-        ConfigModel.Relics config = SkyblockerConfig.get().locations.spidersDen.relics;
+        SkyblockerConfig.Relics config = SkyblockerConfigManager.get().locations.spidersDen.relics;
 
         if (config.enableRelicsHelper && relicsLoaded.isDone() && Utils.getLocationRaw().equals("combat_1")) {
             for (BlockPos fairySoulPos : relics) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java
index 42089e9e..c230548b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/util/ScreenConst.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.tabhud.util;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 
 public class ScreenConst {
     public static final int WIDGET_PAD = 5;
@@ -8,6 +8,6 @@ public class ScreenConst {
     private static final int SCREEN_PAD_BASE = 20;
 
     public static int getScreenPad() {
-        return (int) ((1f/((float)SkyblockerConfig.get().general.tabHud.tabHudScale/100f) * SCREEN_PAD_BASE));
+        return (int) ((1f/((float)SkyblockerConfigManager.get().general.tabHud.tabHudScale/100f) * SCREEN_PAD_BASE));
     }
 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java
index 068c9c5e..241cb2a2 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/PlayerListWidget.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.skyblock.tabhud.widget;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.PlayerComponent;
@@ -51,7 +51,7 @@ public class PlayerListWidget extends Widget {
             list.add(PlayerListMgr.getRaw(i));
         }
 
-        if (SkyblockerConfig.get().general.tabHud.nameSorting == ConfigModel.NameSorting.ALPHABETICAL) {
+        if (SkyblockerConfigManager.get().general.tabHud.nameSorting == SkyblockerConfig.NameSorting.ALPHABETICAL) {
             list.sort(Comparator.comparing(o -> o.getProfile().getName().toLowerCase()));
         }
 
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java
index bca67b70..97d31981 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/Widget.java
@@ -4,7 +4,7 @@ import java.util.ArrayList;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerListMgr;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.Component;
 import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent;
@@ -130,7 +130,7 @@ public abstract class Widget {
         RenderSystem.enableDepthTest();
         ms.push();
 
-        float scale = SkyblockerConfig.get().general.tabHud.tabHudScale / 100f;
+        float scale = SkyblockerConfigManager.get().general.tabHud.tabHudScale / 100f;
         ms.scale(scale, scale, 1);
 
         // move above other UI elements
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java
index 4318a77d..cea8f6f0 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/widget/component/PlayerComponent.java
@@ -1,6 +1,6 @@
 package me.xmrvizzy.skyblocker.skyblock.tabhud.widget.component;
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import net.minecraft.client.gui.DrawContext;
 import net.minecraft.client.gui.PlayerSkinDrawer;
 import net.minecraft.client.network.PlayerListEntry;
@@ -20,7 +20,7 @@ public class PlayerComponent extends Component {
 
     public PlayerComponent(PlayerListEntry ple) {
 
-    	boolean plainNames = SkyblockerConfig.get().general.tabHud.plainPlayerNames;
+    	boolean plainNames = SkyblockerConfigManager.get().general.tabHud.plainPlayerNames;
         Team team = ple.getScoreboardTeam();
         String username = ple.getProfile().getName();
         name = (team != null && !plainNames) ? Text.empty().append(team.getPrefix()).append(Text.literal(username).formatted(team.getColor())).append(team.getSuffix()) : Text.of(username);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java
index 5360741d..39d91bba 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/discord/DiscordRPCManager.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.utils.discord;
 
 
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.SkyblockEvents;
 import me.xmrvizzy.skyblocker.utils.Utils;
 import meteordevelopment.discordipc.DiscordIPC;
@@ -34,15 +34,15 @@ public class DiscordRPCManager {
     }
 
     /**
-     * Checks the {@link SkyblockerConfig.RichPresence#customMessage custom message}, updates {@link #cycleCount} if enabled, and updates rich presence.
+     * Checks the {@link SkyblockerConfigManager.RichPresence#customMessage custom message}, updates {@link #cycleCount} if enabled, and updates rich presence.
      */
     public static void updateDataAndPresence() {
         // If the custom message is empty, discord will keep the last message, this is can serve as a default if the user doesn't want a custom message
-        if (SkyblockerConfig.get().richPresence.customMessage.isEmpty()) {
-            SkyblockerConfig.get().richPresence.customMessage = "Playing Skyblock";
-            SkyblockerConfig.save();
+        if (SkyblockerConfigManager.get().richPresence.customMessage.isEmpty()) {
+            SkyblockerConfigManager.get().richPresence.customMessage = "Playing Skyblock";
+            SkyblockerConfigManager.save();
         }
-        if (SkyblockerConfig.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3;
+        if (SkyblockerConfigManager.get().richPresence.cycleMode) cycleCount = (cycleCount + 1) % 3;
         initAndUpdatePresence();
     }
 
@@ -58,21 +58,21 @@ public class DiscordRPCManager {
      * <p>
      * When the {@link #updateTask previous update} does not exist or {@link CompletableFuture#isDone() has completed}:
      * <p>
-     * Connects to discord if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is enabled},
+     * Connects to discord if {@link SkyblockerConfigManager.RichPresence#enableRichPresence rich presence is enabled},
      * the player {@link Utils#isOnSkyblock() is on Skyblock}, and {@link DiscordIPC#isConnected() discord is not already connected}.
-     * Updates the presence if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is enabled}
+     * Updates the presence if {@link SkyblockerConfigManager.RichPresence#enableRichPresence rich presence is enabled}
      * and the player {@link Utils#isOnSkyblock() is on Skyblock}.
-     * Stops the connection if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is disabled}
+     * Stops the connection if {@link SkyblockerConfigManager.RichPresence#enableRichPresence rich presence is disabled}
      * or the player {@link Utils#isOnSkyblock() is not on Skyblock} and {@link DiscordIPC#isConnected() discord is connected}.
      * Saves the update task in {@link #updateTask}
      *
      * @param initialization whether this is the first time the presence is being updates. If {@code true}, a message will be logged
-     *                       if {@link SkyblockerConfig.RichPresence#enableRichPresence rich presence is disabled}.
+     *                       if {@link SkyblockerConfigManager.RichPresence#enableRichPresence rich presence is disabled}.
      */
     private static void initAndUpdatePresence(boolean initialization) {
         if (updateTask == null || updateTask.isDone()) {
             updateTask = CompletableFuture.runAsync(() -> {
-                if (SkyblockerConfig.get().richPresence.enableRichPresence && Utils.isOnSkyblock()) {
+                if (SkyblockerConfigManager.get().richPresence.enableRichPresence && Utils.isOnSkyblock()) {
                     if (!DiscordIPC.isConnected()) {
                         if (DiscordIPC.start(934607927837356052L, null)) {
                             LOGGER.info("Discord RPC started successfully");
@@ -96,20 +96,20 @@ public class DiscordRPCManager {
         RichPresence presence = new RichPresence();
         presence.setLargeImage("skyblocker-default", null);
         presence.setStart(startTimeStamp);
-        presence.setDetails(SkyblockerConfig.get().richPresence.customMessage);
+        presence.setDetails(SkyblockerConfigManager.get().richPresence.customMessage);
         presence.setState(getInfo());
         return presence;
     }
 
     public static String getInfo() {
         String info = null;
-        if (!SkyblockerConfig.get().richPresence.cycleMode) {
-            switch (SkyblockerConfig.get().richPresence.info) {
+        if (!SkyblockerConfigManager.get().richPresence.cycleMode) {
+            switch (SkyblockerConfigManager.get().richPresence.info) {
                 case BITS -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits());
                 case PURSE -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse());
                 case LOCATION -> info = Utils.getLocation();
             }
-        } else if (SkyblockerConfig.get().richPresence.cycleMode) {
+        } else if (SkyblockerConfigManager.get().richPresence.cycleMode) {
             switch (cycleCount) {
                 case 0 -> info = "Bits: " + DECIMAL_FORMAT.format(Utils.getBits());
                 case 1 -> info = "Purse: " + DECIMAL_FORMAT.format(Utils.getPurse());
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java
index 5044b814..a55965dc 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainer.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.utils.render.title;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
 import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -82,7 +82,7 @@ public class TitleContainer {
     }
 
     private static void render(DrawContext context, float tickDelta) {
-        render(context, titles, SkyblockerConfig.get().general.titleContainer.x, SkyblockerConfig.get().general.titleContainer.y, tickDelta);
+        render(context, titles, SkyblockerConfigManager.get().general.titleContainer.x, SkyblockerConfigManager.get().general.titleContainer.y, tickDelta);
     }
 
     protected static void render(DrawContext context, Set<Title> titles, int xPos, int yPos, float tickDelta) {
@@ -90,11 +90,11 @@ public class TitleContainer {
         TextRenderer textRenderer = client.textRenderer;
 
         // Calculate Scale to use
-        float scale = 3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F);
+        float scale = 3F * (SkyblockerConfigManager.get().general.titleContainer.titleContainerScale / 100F);
 
         // Grab direction and alignment values
-        ConfigModel.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
-        ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+        SkyblockerConfig.Direction direction = SkyblockerConfigManager.get().general.titleContainer.direction;
+        SkyblockerConfig.Alignment alignment = SkyblockerConfigManager.get().general.titleContainer.alignment;
         // x/y refer to the starting position for the text
         // y always starts at yPos
         float x = 0;
@@ -106,8 +106,8 @@ public class TitleContainer {
             width += textRenderer.getWidth(title.getText()) * scale + 10;
         }
 
-        if (alignment == ConfigModel.Alignment.MIDDLE) {
-            if (direction == ConfigModel.Direction.HORIZONTAL) {
+        if (alignment == SkyblockerConfig.Alignment.MIDDLE) {
+            if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
                 //If middle aligned horizontally, start the xPosition at half of the width to the left.
                 x = xPos - (width / 2);
             } else {
@@ -115,7 +115,7 @@ public class TitleContainer {
                 x = xPos;
             }
         }
-        if (alignment == ConfigModel.Alignment.LEFT || alignment == ConfigModel.Alignment.RIGHT) {
+        if (alignment == SkyblockerConfig.Alignment.LEFT || alignment == SkyblockerConfig.Alignment.RIGHT) {
             //If left or right aligned, start at xPos, we will shift each text later
             x = xPos;
         }
@@ -124,14 +124,14 @@ public class TitleContainer {
 
             //Calculate which x the text should use
             float xToUse;
-            if (direction == ConfigModel.Direction.HORIZONTAL) {
-                xToUse = alignment == ConfigModel.Alignment.RIGHT ?
+            if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
+                xToUse = alignment == SkyblockerConfig.Alignment.RIGHT ?
                         x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side.
                         x;
             } else {
-                xToUse = alignment == ConfigModel.Alignment.MIDDLE ?
+                xToUse = alignment == SkyblockerConfig.Alignment.MIDDLE ?
                         x - (textRenderer.getWidth(title.getText()) * scale) / 2 : //if middle aligned we need the text position to be aligned in the middle.
-                        alignment == ConfigModel.Alignment.RIGHT ?
+                        alignment == SkyblockerConfig.Alignment.RIGHT ?
                                 x - (textRenderer.getWidth(title.getText()) * scale) : //if right aligned we need the text position to be aligned on the right side.
                                 x;
             }
@@ -156,13 +156,13 @@ public class TitleContainer {
             context.getMatrices().pop();
 
             //Calculate the x and y positions for the next title
-            if (direction == ConfigModel.Direction.HORIZONTAL) {
-                if (alignment == ConfigModel.Alignment.MIDDLE || alignment == ConfigModel.Alignment.LEFT) {
+            if (direction == SkyblockerConfig.Direction.HORIZONTAL) {
+                if (alignment == SkyblockerConfig.Alignment.MIDDLE || alignment == SkyblockerConfig.Alignment.LEFT) {
                     //Move to the right if middle or left aligned
                     x += textRenderer.getWidth(title.getText()) * scale + 10;
                 }
 
-                if (alignment == ConfigModel.Alignment.RIGHT) {
+                if (alignment == SkyblockerConfig.Alignment.RIGHT) {
                     //Move to the left if right aligned
                     x -= textRenderer.getWidth(title.getText()) * scale + 10;
                 }
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
index d8e3b43c..caf9fbf0 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/render/title/TitleContainerConfigScreen.java
@@ -1,7 +1,7 @@
 package me.xmrvizzy.skyblocker.utils.render.title;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
 import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
 import me.xmrvizzy.skyblocker.utils.render.RenderHelper;
 import net.minecraft.client.gui.DrawContext;
 import net.minecraft.client.gui.screen.Screen;
@@ -18,8 +18,8 @@ public class TitleContainerConfigScreen extends Screen {
     private final Title example1 = new Title(Text.literal("Test1").formatted(Formatting.RED));
     private final Title example2 = new Title(Text.literal("Test23").formatted(Formatting.AQUA));
     private final Title example3 = new Title(Text.literal("Testing1234").formatted(Formatting.DARK_GREEN));
-    private float hudX = SkyblockerConfig.get().general.titleContainer.x;
-    private float hudY = SkyblockerConfig.get().general.titleContainer.y;
+    private float hudX = SkyblockerConfigManager.get().general.titleContainer.x;
+    private float hudY = SkyblockerConfigManager.get().general.titleContainer.y;
     private final Screen parent;
     
     protected TitleContainerConfigScreen() {
@@ -36,8 +36,8 @@ public class TitleContainerConfigScreen extends Screen {
         super.render(context, mouseX, mouseY, delta);
         renderBackground(context, mouseX, mouseY, delta);
         TitleContainer.render(context, Set.of(example1, example2, example3), (int) hudX, (int) hudY, delta);
-        ConfigModel.Direction direction = SkyblockerConfig.get().general.titleContainer.direction;
-        ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+        SkyblockerConfig.Direction direction = SkyblockerConfigManager.get().general.titleContainer.direction;
+        SkyblockerConfig.Alignment alignment = SkyblockerConfigManager.get().general.titleContainer.alignment;
         context.drawCenteredTextWithShadow(textRenderer, "Press Q/E to change Alignment: " + alignment, width / 2, textRenderer.fontHeight * 2, Color.WHITE.getRGB());
         context.drawCenteredTextWithShadow(textRenderer, "Press R to change Direction: " + direction, width / 2, textRenderer.fontHeight * 3 + 5, Color.WHITE.getRGB());
         context.drawCenteredTextWithShadow(textRenderer, "Press +/- to change Scale", width / 2, textRenderer.fontHeight * 4 + 10, Color.WHITE.getRGB());
@@ -56,7 +56,7 @@ public class TitleContainerConfigScreen extends Screen {
     }
 
     private Pair<Vector2f, Vector2f> getSelectionBoundingBox() {
-    	ConfigModel.Alignment alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+    	SkyblockerConfig.Alignment alignment = SkyblockerConfigManager.get().general.titleContainer.alignment;
 
         float midWidth = getSelectionWidth() / 2F;
         float x1 = 0;
@@ -81,15 +81,15 @@ public class TitleContainerConfigScreen extends Screen {
     }
 
     private float getSelectionHeight() {
-        float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F));
-        return SkyblockerConfig.get().general.titleContainer.direction == ConfigModel.Direction.HORIZONTAL ?
+        float scale = (3F * (SkyblockerConfigManager.get().general.titleContainer.titleContainerScale / 100F));
+        return SkyblockerConfigManager.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ?
                 (textRenderer.fontHeight * scale) :
                 (textRenderer.fontHeight + 10F) * 3F * scale;
     }
 
     private float getSelectionWidth() {
-        float scale = (3F * (SkyblockerConfig.get().general.titleContainer.titleContainerScale / 100F));
-        return SkyblockerConfig.get().general.titleContainer.direction == ConfigModel.Direction.HORIZONTAL ?
+        float scale = (3F * (SkyblockerConfigManager.get().general.titleContainer.titleContainerScale / 100F));
+        return SkyblockerConfigManager.get().general.titleContainer.direction == SkyblockerConfig.Direction.HORIZONTAL ?
                 (textRenderer.getWidth("Test1") + 10 + textRenderer.getWidth("Test23") + 10 + textRenderer.getWidth("Testing1234")) * scale :
                 textRenderer.getWidth("Testing1234") * scale;
     }
@@ -98,7 +98,7 @@ public class TitleContainerConfigScreen extends Screen {
     public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
         float midWidth = getSelectionWidth() / 2;
         float midHeight = getSelectionHeight() / 2;
-        var alignment = SkyblockerConfig.get().general.titleContainer.alignment;
+        var alignment = SkyblockerConfigManager.get().general.titleContainer.alignment;
 
         Pair<Vector2f, Vector2f> boundingBox = getSelectionBoundingBox();
         float x1 = boundingBox.getLeft().getX();
@@ -129,42 +129,42 @@ public class TitleContainerConfigScreen extends Screen {
     @Override
     public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
         if (keyCode == GLFW.GLFW_KEY_Q) {
-        	ConfigModel.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
-            SkyblockerConfig.get().general.titleContainer.alignment = switch (current) {
-                case LEFT -> ConfigModel.Alignment.MIDDLE;
-                case MIDDLE -> ConfigModel.Alignment.RIGHT;
-                case RIGHT -> ConfigModel.Alignment.LEFT;
+        	SkyblockerConfig.Alignment current = SkyblockerConfigManager.get().general.titleContainer.alignment;
+            SkyblockerConfigManager.get().general.titleContainer.alignment = switch (current) {
+                case LEFT -> SkyblockerConfig.Alignment.MIDDLE;
+                case MIDDLE -> SkyblockerConfig.Alignment.RIGHT;
+                case RIGHT -> SkyblockerConfig.Alignment.LEFT;
             };
         }
         if (keyCode == GLFW.GLFW_KEY_E) {
-        	ConfigModel.Alignment current = SkyblockerConfig.get().general.titleContainer.alignment;
-            SkyblockerConfig.get().general.titleContainer.alignment = switch (current) {
-                case LEFT -> ConfigModel.Alignment.RIGHT;
-                case MIDDLE -> ConfigModel.Alignment.LEFT;
-                case RIGHT -> ConfigModel.Alignment.MIDDLE;
+        	SkyblockerConfig.Alignment current = SkyblockerConfigManager.get().general.titleContainer.alignment;
+            SkyblockerConfigManager.get().general.titleContainer.alignment = switch (current) {
+                case LEFT -> SkyblockerConfig.Alignment.RIGHT;
+                case MIDDLE -> SkyblockerConfig.Alignment.LEFT;
+                case RIGHT -> SkyblockerConfig.Alignment.MIDDLE;
             };
         }
         if (keyCode == GLFW.GLFW_KEY_R) {
-        	ConfigModel.Direction current = SkyblockerConfig.get().general.titleContainer.direction;
-            SkyblockerConfig.get().general.titleContainer.direction = switch (current) {
-                case HORIZONTAL -> ConfigModel.Direction.VERTICAL;
-                case VERTICAL -> ConfigModel.Direction.HORIZONTAL;
+        	SkyblockerConfig.Direction current = SkyblockerConfigManager.get().general.titleContainer.direction;
+            SkyblockerConfigManager.get().general.titleContainer.direction = switch (current) {
+                case HORIZONTAL -> SkyblockerConfig.Direction.VERTICAL;
+                case VERTICAL -> SkyblockerConfig.Direction.HORIZONTAL;
             };
         }
         if (keyCode == GLFW.GLFW_KEY_EQUAL) {
-            SkyblockerConfig.get().general.titleContainer.titleContainerScale += 10;
+            SkyblockerConfigManager.get().general.titleContainer.titleContainerScale += 10;
         }
         if (keyCode == GLFW.GLFW_KEY_MINUS) {
-            SkyblockerConfig.get().general.titleContainer.titleContainerScale -= 10;
+            SkyblockerConfigManager.get().general.titleContainer.titleContainerScale -= 10;
         }
         return super.keyPressed(keyCode, scanCode, modifiers);
     }
 
     @Override
     public void close() {
-        SkyblockerConfig.get().general.titleContainer.x = (int) hudX;
-        SkyblockerConfig.get().general.titleContainer.y = (int) hudY;
-        SkyblockerConfig.save();
+        SkyblockerConfigManager.get().general.titleContainer.x = (int) hudX;
+        SkyblockerConfigManager.get().general.titleContainer.y = (int) hudY;
+        SkyblockerConfigManager.save();
         this.client.setScreen(parent);
     }
 }
diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java
index e375d3a0..b0e09481 100644
--- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java
+++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java
@@ -1,13 +1,13 @@
 package me.xmrvizzy.skyblocker.skyblock.dungeon;
 
-import me.xmrvizzy.skyblocker.config.ConfigModel;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 public class DungeonChestProfitTest {
     @Test
     void testProfitText() {
-    	ConfigModel.DungeonChestProfit config = new ConfigModel.DungeonChestProfit();
+    	SkyblockerConfig.DungeonChestProfit config = new SkyblockerConfig.DungeonChestProfit();
         Assertions.assertEquals("literal{ 0}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(0, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
         Assertions.assertEquals("literal{ 0}[style={color=blue}]", DungeonChestProfit.getProfitText(0, true, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
         Assertions.assertEquals("literal{ +10}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(10, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
-- 
cgit