From 313961ced58891eae0e5471345632159add9f35e Mon Sep 17 00:00:00 2001
From: Rime <81419447+Emirlol@users.noreply.github.com>
Date: Wed, 4 Sep 2024 00:23:33 +0300
Subject: Use ASM compile-time class transformation for class init via an
`@Init` annotation (#924)
* Add annotation processor for init methods and @Init annotation
* Use ASM for @Init
* Separate the annotation processor to its own plugin file inside buildSrc
* Actually implement priority
* Reverse annotation equality check and method check to warn about misuse of annotation
* Add gradle.properties to buildSrc and move asm version into it
* Reformat buildscripts
Less conflicting for other PRs
* Refactor to use a record over strings
* Rebase onto master and add more documentation
* Remove rebasing artifact
* Apply suggestions from code review
Simplifies the `itf`
Co-authored-by: Kevin <92656833+kevinthegreat1@users.noreply.github.com>
* Use Files class' methods for reading and writing to files
* Apply suggestion
* Then sort by name
* Clean up InitProcessor
* Separate classes into java files
* Fix indent
---------
Co-authored-by: Aaron <51387595+AzureAaron@users.noreply.github.com>
Co-authored-by: Kevin <92656833+kevinthegreat1@users.noreply.github.com>
---
.../java/de/hysky/skyblocker/SkyblockerMod.java | 176 ++-------------------
.../java/de/hysky/skyblocker/SkyblockerScreen.java | 2 +
.../de/hysky/skyblocker/UpdateNotifications.java | 5 +-
.../java/de/hysky/skyblocker/annotations/Init.java | 38 +++++
src/main/java/de/hysky/skyblocker/debug/Debug.java | 2 +
.../de/hysky/skyblocker/skyblock/ChestValue.java | 2 +
.../hysky/skyblocker/skyblock/FishingHelper.java | 2 +
.../de/hysky/skyblocker/skyblock/PetCache.java | 2 +
.../hysky/skyblocker/skyblock/QuiverWarning.java | 2 +
.../hysky/skyblocker/skyblock/TeleportOverlay.java | 2 +
.../java/de/hysky/skyblocker/skyblock/Tips.java | 2 +
.../skyblocker/skyblock/WarpAutocomplete.java | 3 +
.../skyblocker/skyblock/bazaar/BazaarHelper.java | 2 +
.../skyblock/calculators/CalculatorCommand.java | 2 +
.../skyblocker/skyblock/chat/ChatRulesHandler.java | 2 +
.../skyblock/chat/SkyblockXpMessages.java | 8 +-
.../skyblock/chocolatefactory/EggFinder.java | 2 +
.../chocolatefactory/TimeTowerReminder.java | 2 +
.../skyblock/crimson/dojo/DojoManager.java | 2 +
.../skyblocker/skyblock/crimson/kuudra/Kuudra.java | 2 +
.../skyblocker/skyblock/dungeon/DungeonMap.java | 2 +
.../skyblocker/skyblock/dungeon/DungeonScore.java | 2 +
.../skyblock/dungeon/DungeonScoreHUD.java | 2 +
.../skyblock/dungeon/DungeonTextures.java | 2 +
.../skyblock/dungeon/FireFreezeStaffTimer.java | 2 +
.../skyblock/dungeon/GuardianHealth.java | 10 +-
.../skyblocker/skyblock/dungeon/LividColor.java | 2 +
.../skyblock/dungeon/device/LightsOn.java | 2 +
.../skyblock/dungeon/device/SimonSays.java | 6 +-
.../dungeon/partyfinder/PartyFinderScreen.java | 2 +
.../skyblock/dungeon/puzzle/CreeperBeams.java | 2 +
.../skyblock/dungeon/puzzle/DungeonBlaze.java | 2 +
.../skyblock/dungeon/puzzle/IceFill.java | 2 +
.../skyblock/dungeon/puzzle/Silverfish.java | 2 +
.../skyblock/dungeon/puzzle/ThreeWeirdos.java | 5 +-
.../skyblock/dungeon/puzzle/TicTacToe.java | 6 +-
.../skyblock/dungeon/puzzle/boulder/Boulder.java | 5 +-
.../dungeon/puzzle/waterboard/Waterboard.java | 2 +
.../skyblock/dungeon/secrets/DungeonManager.java | 2 +
.../skyblock/dungeon/secrets/SecretsTracker.java | 2 +
.../skyblock/dwarven/CommissionLabels.java | 2 +
.../skyblock/dwarven/CrystalsChestHighlighter.java | 2 +
.../skyblocker/skyblock/dwarven/CrystalsHud.java | 2 +
.../skyblock/dwarven/CrystalsLocationsManager.java | 2 +
.../skyblocker/skyblock/dwarven/DwarvenHud.java | 2 +
.../skyblock/dwarven/GlaciteColdOverlay.java | 2 +
.../skyblocker/skyblock/dwarven/MetalDetector.java | 2 +
.../skyblock/dwarven/WishingCompassSolver.java | 3 +-
.../skyblocker/skyblock/end/BeaconHighlighter.java | 2 +
.../hysky/skyblocker/skyblock/end/EnderNodes.java | 2 +
.../de/hysky/skyblocker/skyblock/end/TheEnd.java | 2 +
.../skyblock/entity/MobBoundingBoxes.java | 2 +
.../hysky/skyblocker/skyblock/entity/MobGlow.java | 2 +
.../skyblock/events/EventNotifications.java | 2 +
.../skyblock/fancybars/FancyStatusBars.java | 2 +
.../skyblocker/skyblock/garden/FarmingHud.java | 2 +
.../skyblock/garden/LowerSensitivity.java | 2 +
.../skyblocker/skyblock/garden/VisitorHelper.java | 2 +
.../skyblock/item/CustomArmorAnimatedDyes.java | 2 +
.../skyblock/item/CustomArmorDyeColors.java | 2 +
.../skyblocker/skyblock/item/CustomArmorTrims.java | 3 +-
.../skyblocker/skyblock/item/CustomItemNames.java | 2 +
.../skyblocker/skyblock/item/HotbarSlotLock.java | 2 +
.../skyblocker/skyblock/item/ItemCooldowns.java | 2 +
.../skyblocker/skyblock/item/ItemProtection.java | 2 +
.../skyblock/item/ItemRarityBackgrounds.java | 14 +-
.../skyblocker/skyblock/item/MuseumItemCache.java | 7 +-
.../skyblock/item/SkyblockInventoryScreen.java | 3 +-
.../skyblocker/skyblock/item/SkyblockItemData.java | 10 +-
.../hysky/skyblocker/skyblock/item/WikiLookup.java | 2 +
.../skyblock/item/slottext/SlotTextManager.java | 2 +
.../skyblock/item/tooltip/AccessoriesHelper.java | 2 +
.../skyblock/item/tooltip/BackpackPreview.java | 2 +
.../skyblock/item/tooltip/ItemTooltip.java | 2 +
.../skyblock/item/tooltip/TooltipManager.java | 2 +
.../skyblock/itemlist/ItemRepository.java | 2 +
.../skyblocker/skyblock/mayors/JerryTimer.java | 2 +
.../profileviewer/ProfileViewerScreen.java | 2 +
.../de/hysky/skyblocker/skyblock/rift/TheRift.java | 2 +
.../skyblock/searchoverlay/SearchOverManager.java | 2 +
.../skyblocker/skyblock/shortcut/Shortcuts.java | 2 +
.../skyblock/slayers/SlayerEntitiesGlow.java | 2 +
.../skyblock/special/DungeonsSpecialEffects.java | 15 +-
.../skyblock/special/DyeSpecialEffects.java | 18 +--
.../skyblock/special/SpecialEffects.java | 4 -
.../hysky/skyblocker/skyblock/tabhud/TabHud.java | 2 +
.../tabhud/screenbuilder/ScreenMaster.java | 2 +
.../skyblocker/skyblock/waypoint/FairySouls.java | 2 +
.../skyblock/waypoint/MythologicalRitual.java | 2 +
.../skyblock/waypoint/OrderedWaypoints.java | 2 +
.../hysky/skyblocker/skyblock/waypoint/Relics.java | 2 +
.../skyblocker/skyblock/waypoint/Waypoints.java | 2 +
.../hysky/skyblocker/utils/ApiAuthentication.java | 26 +--
.../java/de/hysky/skyblocker/utils/ApiUtils.java | 2 +
.../de/hysky/skyblocker/utils/NEURepoManager.java | 2 +
.../de/hysky/skyblocker/utils/SkyblockTime.java | 2 +
src/main/java/de/hysky/skyblocker/utils/Utils.java | 2 +
.../skyblocker/utils/chat/ChatMessageListener.java | 2 +
.../utils/container/ContainerSolverManager.java | 2 +
.../utils/discord/DiscordRPCManager.java | 2 +
.../hysky/skyblocker/utils/mayor/MayorUtils.java | 2 +
.../skyblocker/utils/render/RenderHelper.java | 2 +
.../utils/render/culling/OcclusionCulling.java | 3 +
.../utils/render/title/TitleContainer.java | 2 +
.../skyblocker/utils/ws/SkyblockerWebSocket.java | 20 +--
.../hysky/skyblocker/utils/ws/WsStateManager.java | 6 +-
106 files changed, 323 insertions(+), 237 deletions(-)
create mode 100644 src/main/java/de/hysky/skyblocker/annotations/Init.java
(limited to 'src/main/java')
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 47ad0f41..d673aca4 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -2,70 +2,19 @@ package de.hysky.skyblocker;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.ConfigNullFieldsFix;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.datafixer.ConfigDataFixer;
-import de.hysky.skyblocker.debug.Debug;
-import de.hysky.skyblocker.skyblock.*;
-import de.hysky.skyblocker.skyblock.bazaar.BazaarHelper;
-import de.hysky.skyblocker.skyblock.calculators.CalculatorCommand;
-import de.hysky.skyblocker.skyblock.chat.ChatRulesHandler;
-import de.hysky.skyblocker.skyblock.chat.SkyblockXpMessages;
-import de.hysky.skyblocker.skyblock.chocolatefactory.EggFinder;
-import de.hysky.skyblocker.skyblock.chocolatefactory.TimeTowerReminder;
-import de.hysky.skyblocker.skyblock.crimson.dojo.DojoManager;
-import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
-import de.hysky.skyblocker.skyblock.dungeon.*;
-import de.hysky.skyblocker.skyblock.dungeon.device.LightsOn;
-import de.hysky.skyblocker.skyblock.dungeon.device.SimonSays;
-import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
-import de.hysky.skyblocker.skyblock.dungeon.puzzle.*;
-import de.hysky.skyblocker.skyblock.dungeon.puzzle.boulder.Boulder;
-import de.hysky.skyblocker.skyblock.dungeon.puzzle.waterboard.Waterboard;
-import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
-import de.hysky.skyblocker.skyblock.dungeon.secrets.SecretsTracker;
-import de.hysky.skyblocker.skyblock.dwarven.*;
-import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;
-import de.hysky.skyblocker.skyblock.end.EnderNodes;
-import de.hysky.skyblocker.skyblock.end.TheEnd;
-import de.hysky.skyblocker.skyblock.entity.MobBoundingBoxes;
-import de.hysky.skyblocker.skyblock.entity.MobGlow;
-import de.hysky.skyblocker.skyblock.events.EventNotifications;
-import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
-import de.hysky.skyblocker.skyblock.garden.FarmingHud;
-import de.hysky.skyblocker.skyblock.garden.LowerSensitivity;
-import de.hysky.skyblocker.skyblock.garden.VisitorHelper;
-import de.hysky.skyblocker.skyblock.item.*;
-import de.hysky.skyblocker.skyblock.item.slottext.SlotTextManager;
-import de.hysky.skyblocker.skyblock.item.tooltip.AccessoriesHelper;
+import de.hysky.skyblocker.skyblock.StatusBarTracker;
+import de.hysky.skyblocker.skyblock.dwarven.CrystalsHud;
+import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud;
import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
-import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
-import de.hysky.skyblocker.skyblock.item.tooltip.TooltipManager;
-import de.hysky.skyblocker.skyblock.itemlist.ItemRepository;
-import de.hysky.skyblocker.skyblock.mayors.JerryTimer;
-import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerScreen;
-import de.hysky.skyblocker.skyblock.rift.TheRift;
-import de.hysky.skyblocker.skyblock.searchoverlay.SearchOverManager;
-import de.hysky.skyblocker.skyblock.shortcut.Shortcuts;
-import de.hysky.skyblocker.skyblock.slayers.SlayerEntitiesGlow;
-import de.hysky.skyblocker.skyblock.special.SpecialEffects;
-import de.hysky.skyblocker.skyblock.tabhud.TabHud;
-import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
-import de.hysky.skyblocker.skyblock.waypoint.*;
-import de.hysky.skyblocker.utils.*;
-import de.hysky.skyblocker.utils.chat.ChatMessageListener;
+import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.discord.DiscordRPCManager;
-import de.hysky.skyblocker.utils.mayor.MayorUtils;
-import de.hysky.skyblocker.utils.render.RenderHelper;
-import de.hysky.skyblocker.utils.render.culling.OcclusionCulling;
-import de.hysky.skyblocker.utils.container.ContainerSolverManager;
-import de.hysky.skyblocker.utils.render.title.TitleContainer;
import de.hysky.skyblocker.utils.scheduler.MessageScheduler;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
-import de.hysky.skyblocker.utils.ws.SkyblockerWebSocket;
-import de.hysky.skyblocker.utils.ws.WsStateManager;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.loader.api.FabricLoader;
@@ -110,113 +59,12 @@ public class SkyblockerMod implements ClientModInitializer {
public void onInitializeClient() {
ClientTickEvents.END_CLIENT_TICK.register(this::tick);
ConfigDataFixer.apply();
- Utils.init();
SkyblockerConfigManager.init();
ConfigNullFieldsFix.init(); //DO NOT INIT ANY CLASS THAT USES CONFIG FIELDS BEFORE THIS!
- SkyblockerScreen.initClass();
- ProfileViewerScreen.initClass();
- Tips.init();
- UpdateNotifications.init();
- NEURepoManager.init();
- //ImageRepoLoader.init();
- ItemRepository.init();
- SkyblockItemData.init();
- HotbarSlotLock.init();
- ItemTooltip.init();
- AccessoriesHelper.init();
- WikiLookup.init();
- Waypoints.init();
- FairySouls.init();
- Relics.init();
- MythologicalRitual.init();
- EnderNodes.init();
- OrderedWaypoints.init();
- BackpackPreview.init();
- ItemCooldowns.init();
- TabHud.init();
- GlaciteColdOverlay.init();
- DwarvenHud.init();
- CommissionLabels.init();
- CrystalsHud.init();
- FarmingHud.init();
- LowerSensitivity.init();
- CrystalsLocationsManager.init();
- WishingCompassSolver.init();
- CrystalsChestHighlighter.init();
- MetalDetector.init();
- ChatMessageListener.init();
- Shortcuts.init();
- ChatRulesHandler.init();
- SkyblockXpMessages.init();
- CalculatorCommand.init();
- DiscordRPCManager.init();
- LividColor.init();
- FishingHelper.init();
- DungeonMap.init();
- DungeonScoreHUD.init();
- DungeonManager.init();
- DungeonBlaze.init();
- Waterboard.init();
- Silverfish.init();
- IceFill.init();
- DungeonScore.init();
- SimonSays.init();
- LightsOn.init();
- PartyFinderScreen.initClass();
- ChestValue.init();
- FireFreezeStaffTimer.init();
- GuardianHealth.init();
- TheRift.init();
- TheEnd.init();
- SearchOverManager.init();
- TitleContainer.init();
- ScreenMaster.init();
- DungeonTextures.init();
- OcclusionCulling.init();
- TeleportOverlay.init();
- CustomItemNames.init();
- CustomArmorDyeColors.init();
- CustomArmorAnimatedDyes.init();
- CustomArmorTrims.init();
- TicTacToe.init();
- QuiverWarning.init();
- SpecialEffects.init();
- ItemProtection.init();
- CreeperBeams.init();
- Boulder.init();
- ThreeWeirdos.init();
- VisitorHelper.init();
- ItemRarityBackgrounds.init();
- MuseumItemCache.init();
- PetCache.init();
- SecretsTracker.init();
- ApiAuthentication.init();
- ApiUtils.init();
- SkyblockerWebSocket.init();
- WsStateManager.init();
- Debug.init();
- Kuudra.init();
- DojoManager.init();
- RenderHelper.init();
- FancyStatusBars.init();
- SkyblockInventoryScreen.initEquipment();
- EventNotifications.init();
- ContainerSolverManager.init();
+
statusBarTracker.init();
- BeaconHighlighter.init();
- WarpAutocomplete.init();
- MobBoundingBoxes.init();
- EggFinder.init();
- TimeTowerReminder.init();
- SkyblockTime.init();
- JerryTimer.init();
- TooltipManager.init();
- SlotTextManager.init();
- BazaarHelper.init();
- MobGlow.init();
- MayorUtils.init();
- SlayerEntitiesGlow.init();
+ init();
Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20);
Scheduler.INSTANCE.scheduleCyclic(DiscordRPCManager::updateDataAndPresence, 200);
Scheduler.INSTANCE.scheduleCyclic(BackpackPreview::tick, 50);
@@ -235,4 +83,14 @@ public class SkyblockerMod implements ClientModInitializer {
Scheduler.INSTANCE.tick();
MessageScheduler.INSTANCE.tick();
}
+
+ /**
+ * This method is responsible for initializing all classes.
+ * To have your class initialized you must annotate its initializer method with the {@code @Init} annotation.
+ * At compile time, ASM completely overwrites the content of this method, so adding a call here will do nothing.
+ *
+ * @see Init
+ */
+ private static void init() {
+ }
}
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java b/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java
index 9686c6d8..611a7dcd 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.Tips;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
@@ -45,6 +46,7 @@ public class SkyblockerScreen extends Screen {
super(TITLE);
}
+ @Init
public static void initClass() {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE)
diff --git a/src/main/java/de/hysky/skyblocker/UpdateNotifications.java b/src/main/java/de/hysky/skyblocker/UpdateNotifications.java
index 2034de2f..089d59d5 100644
--- a/src/main/java/de/hysky/skyblocker/UpdateNotifications.java
+++ b/src/main/java/de/hysky/skyblocker/UpdateNotifications.java
@@ -20,7 +20,7 @@ import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.JsonOps;
import com.mojang.serialization.codecs.RecordCodecBuilder;
-
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Http;
@@ -53,7 +53,8 @@ public class UpdateNotifications {
public static Config config = Config.DEFAULT;
private static boolean sentUpdateNotification;
- static void init() {
+ @Init
+ public static void init() {
ClientLifecycleEvents.CLIENT_STARTED.register(client -> loadConfig());
ClientLifecycleEvents.CLIENT_STOPPING.register(client -> saveConfig());
SkyblockEvents.JOIN.register(() -> {
diff --git a/src/main/java/de/hysky/skyblocker/annotations/Init.java b/src/main/java/de/hysky/skyblocker/annotations/Init.java
new file mode 100644
index 00000000..50f2adf7
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/annotations/Init.java
@@ -0,0 +1,38 @@
+package de.hysky.skyblocker.annotations;
+
+import de.hysky.skyblocker.SkyblockerMod;
+
+import java.lang.annotation.*;
+
+/**
+ *
+ * Marks a method to be called upon mod initialization, performing any initialization logic for the class.
+ * In order for a method to be considered an initializer method, it must be public & static while having no arguments and a void return type.
+ *
+ * Example usage:
+ *
+ * {@code
+ * @Init
+ * public static void init() {
+ * //do stuff
+ * }
+ * }
+ *
+ *
+ * A call to the method annotated with this annotation will be added to the {@link SkyblockerMod#init} method at compile-time.
+ *
+ *
+ * If your method depends on another initializer method, you can use the {@link #priority()} field to ensure that it is called after the other method.
+ *
+ */
+@Documented
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.CLASS)
+public @interface Init {
+ /**
+ * The priority of the initializer method.
+ * The higher the number, the later the method will be called.
+ * Use this to ensure that your initializer method is called after another initializer method if it depends on it.
+ */
+ int priority() default 0;
+}
diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java
index fff12619..19d06579 100644
--- a/src/main/java/de/hysky/skyblocker/debug/Debug.java
+++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java
@@ -4,6 +4,7 @@ import com.mojang.brigadier.Command;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.serialization.JsonOps;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.ItemUtils;
@@ -46,6 +47,7 @@ public class Debug {
return webSocketDebug;
}
+ @Init
public static void init() {
if (debugEnabled()) {
SnapshotDebug.init();
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
index 0b188a37..754be63d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.DungeonsConfig;
import de.hysky.skyblocker.config.configs.UIAndVisualsConfig;
@@ -46,6 +47,7 @@ public class ChestValue {
private static final Pattern MINION_PATTERN = Pattern.compile("Minion (I|II|III|IV|V|VI|VII|VIII|IX|X|XI|XII)$");
private static final DecimalFormat FORMATTER = new DecimalFormat("#,###");
+ @Init
public static void init() {
ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (Utils.isOnSkyblock() && screen instanceof GenericContainerScreen genericContainerScreen) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java
index 79239825..d6ec6b62 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/FishingHelper.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
@@ -25,6 +26,7 @@ public class FishingHelper {
private static long startTimeFish;
private static Vec3d normalYawVector;
+ @Init
public static void init() {
UseItemCallback.EVENT.register((player, world, hand) -> {
ItemStack stack = player.getStackInHand(hand);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java b/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java
index 59cae058..39516dc2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java
@@ -6,6 +6,7 @@ import com.mojang.serialization.Codec;
import com.mojang.serialization.JsonOps;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
@@ -41,6 +42,7 @@ public class PetCache {
*/
private static boolean shouldLook4Pets;
+ @Init
public static void init() {
load();
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java b/src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java
index a6c45d21..52390045 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/QuiverWarning.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
@@ -14,6 +15,7 @@ public class QuiverWarning {
@Nullable
private static Type warning = null;
+ @Init
public static void init() {
ClientReceiveMessageEvents.ALLOW_GAME.register(QuiverWarning::onChatMessage);
Scheduler.INSTANCE.scheduleCyclic(QuiverWarning::update, 10);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
index 50ad1240..bdd5e60a 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/TeleportOverlay.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Utils;
@@ -19,6 +20,7 @@ public class TeleportOverlay {
private static final float[] COLOR_COMPONENTS = {118f / 255f, 21f / 255f, 148f / 255f};
private static final MinecraftClient client = MinecraftClient.getInstance();
+ @Init
public static void init() {
WorldRenderEvents.AFTER_TRANSLUCENT.register(TeleportOverlay::render);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/Tips.java b/src/main/java/de/hysky/skyblocker/skyblock/Tips.java
index 5d983e20..9b95abb2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/Tips.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/Tips.java
@@ -5,6 +5,7 @@ import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.context.CommandContext;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.Constants;
@@ -76,6 +77,7 @@ public class Tips {
return () -> Text.translatable(key).styled(style -> style.withClickEvent(new ClickEvent(clickAction, value)));
}
+ @Init
public static void init() {
ClientCommandRegistrationCallback.EVENT.register(Tips::registerTipsCommand);
SkyblockEvents.JOIN.register(Tips::sendNextTip);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
index 0fc610a6..cf08fedb 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/WarpAutocomplete.java
@@ -3,6 +3,8 @@ package de.hysky.skyblocker.skyblock;
import com.google.gson.JsonParser;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.tree.LiteralCommandNode;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import com.mojang.serialization.Codec;
import com.mojang.serialization.JsonOps;
@@ -35,6 +37,7 @@ public class WarpAutocomplete {
@Nullable
public static LiteralCommandNode commandNode;
+ @Init
public static void init() {
CompletableFuture.supplyAsync(() -> {
try {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java
index 529443b7..ddbe7620 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.bazaar;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.item.slottext.SimpleSlotTextAdder;
import de.hysky.skyblocker.skyblock.item.slottext.SlotText;
@@ -50,6 +51,7 @@ public class BazaarHelper extends SimpleSlotTextAdder {
super("(?:Co-op|Your) Bazaar Orders");
}
+ @Init
public static void init() {}
@Override
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java b/src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java
index 4267aca9..2aa4ddf9 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java
@@ -4,6 +4,7 @@ import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.StringArgumentType;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.utils.Calculator;
import de.hysky.skyblocker.utils.Constants;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -25,6 +26,7 @@ public class CalculatorCommand {
private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
private static final NumberFormat FORMATTER = NumberFormat.getInstance(Locale.US);
+ @Init
public static void init() {
ClientCommandRegistrationCallback.EVENT.register(CalculatorCommand::calculate);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
index d4cd9ab8..659a71e6 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
@@ -6,6 +6,7 @@ import com.mojang.serialization.Codec;
import com.mojang.serialization.JsonOps;
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.title.Title;
import de.hysky.skyblocker.utils.render.title.TitleContainer;
@@ -58,6 +59,7 @@ public class ChatRulesHandler {
protected static final List chatRuleList = new ArrayList<>();
+ @Init
public static void init() {
CompletableFuture.runAsync(ChatRulesHandler::loadChatRules);
ClientReceiveMessageEvents.ALLOW_GAME.register(ChatRulesHandler::checkMessage);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/SkyblockXpMessages.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/SkyblockXpMessages.java
index 1450b001..2162da77 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chat/SkyblockXpMessages.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/SkyblockXpMessages.java
@@ -1,8 +1,6 @@
package de.hysky.skyblocker.skyblock.chat;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Utils;
@@ -12,11 +10,15 @@ import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
public class SkyblockXpMessages {
private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
private static final Pattern SKYBLOCK_XP_PATTERN = Pattern.compile("§b\\+\\d+ SkyBlock XP §7\\([^()]+§7\\)§b \\(\\d+\\/\\d+\\)");
private static final IntOpenHashSet RECENT_MESSAGES = new IntOpenHashSet();
+ @Init
public static void init() {
ClientReceiveMessageEvents.GAME.register(SkyblockXpMessages::onMessage);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java
index d616d85a..a65e61ff 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.chocolatefactory;
import com.mojang.brigadier.Command;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.*;
@@ -55,6 +56,7 @@ public class EggFinder {
private EggFinder() {}
+ @Init
public static void init() {
ClientPlayConnectionEvents.JOIN.register((ignored, ignored2, ignored3) -> {
isLocationCorrect = false;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/TimeTowerReminder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/TimeTowerReminder.java
index 6ed11676..9b2c7b45 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/TimeTowerReminder.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/TimeTowerReminder.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.chocolatefactory;
import com.mojang.brigadier.Message;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.Constants;
@@ -30,6 +31,7 @@ public class TimeTowerReminder {
private TimeTowerReminder() {
}
+ @Init
public static void init() {
SkyblockEvents.JOIN.register(TimeTowerReminder::checkTempFile);
ClientReceiveMessageEvents.GAME.register(TimeTowerReminder::checkIfTimeTower);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java
index d74ea310..399b4358 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.crimson.dojo;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
@@ -67,6 +68,7 @@ public class DojoManager {
public static boolean inArena = false;
protected static long ping = -1;
+ @Init
public static void init() {
ClientReceiveMessageEvents.GAME.register(DojoManager::onMessage);
WorldRenderEvents.AFTER_TRANSLUCENT.register(DojoManager::render);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
index 626905a5..7265a81a 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.crimson.kuudra;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.utils.Utils;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
@@ -11,6 +12,7 @@ public class Kuudra {
static KuudraPhase phase = KuudraPhase.OTHER;
+ @Init
public static void init() {
KuudraWaypoints.init();
DangerWarning.init();
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
index a46daf52..f7f33bd0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonMap.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -25,6 +26,7 @@ public class DungeonMap {
private static final MapIdComponent DEFAULT_MAP_ID_COMPONENT = new MapIdComponent(1024);
private static MapIdComponent cachedMapIdComponent = null;
+ @Init
public static void init() {
HudRenderEvents.AFTER_MAIN_HUD.register((context, tickCounter) -> render(context));
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
index f470d5ad..33e6e5c4 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.DungeonsConfig;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -62,6 +63,7 @@ public class DungeonScore {
private static int deathCount;
private static int score;
+ @Init
public static void init() {
Scheduler.INSTANCE.scheduleCyclic(DungeonScore::tick, 20);
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> reset());
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
index cd8b9706..1e0bfb98 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScoreHUD.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.utils.Utils;
@@ -13,6 +14,7 @@ public class DungeonScoreHUD {
private DungeonScoreHUD() {
}
+ @Init
public static void init() {
HudRenderEvents.AFTER_MAIN_HUD.register((context, tickCounter) -> render(context));
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonTextures.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonTextures.java
index 502efc6f..d0e88233 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonTextures.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonTextures.java
@@ -1,11 +1,13 @@
package de.hysky.skyblocker.skyblock.dungeon;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
import net.minecraft.util.Identifier;
public class DungeonTextures {
+ @Init
public static void init() {
ResourceManagerHelper.registerBuiltinResourcePack(
Identifier.of(SkyblockerMod.NAMESPACE, "recolored_dungeon_items"),
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
index 3422bc0f..f5edb4dd 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/FireFreezeStaffTimer.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.HudRenderEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -14,6 +15,7 @@ import net.minecraft.util.Formatting;
public class FireFreezeStaffTimer {
private static long fireFreezeTimer;
+ @Init
public static void init() {
HudRenderEvents.BEFORE_CHAT.register(FireFreezeStaffTimer::onDraw);
ClientReceiveMessageEvents.GAME.register(FireFreezeStaffTimer::onChatMessage);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java
index 288f30ee..818cfff2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/GuardianHealth.java
@@ -1,9 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
@@ -19,12 +16,17 @@ import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.Box;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
public class GuardianHealth {
private static final Box bossRoom = new Box(34, 65, -32, -32, 100, 36);
private static final Pattern guardianRegex = Pattern.compile("^(.*?) Guardian (.*?)([A-Za-z])❤$");
private static final Pattern professorRegex = Pattern.compile("^﴾ The Professor (.*?)([A-za-z])❤ ﴿$");
private static boolean inBoss;
+ @Init
public static void init() {
ClientReceiveMessageEvents.GAME.register(GuardianHealth::onChatMessage);
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> GuardianHealth.reset());
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
index b6a035aa..e6dc31c8 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/LividColor.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.DungeonsConfig;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -56,6 +57,7 @@ public class LividColor {
private static final long OFFSET_DURATION = 2000;
private static long toggleTime = 0;
+ @Init
public static void init() {
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> LividColor.reset());
WorldRenderEvents.AFTER_ENTITIES.register(LividColor::update);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/LightsOn.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/LightsOn.java
index 555a8e4b..a2b45ad0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/LightsOn.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/LightsOn.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon.device;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.DungeonBoss;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -27,6 +28,7 @@ public class LightsOn {
private static final BlockPos[] LEVERS = { TOP_LEFT, TOP_RIGHT, MIDDLE_TOP, MIDDLE_BOTTOM, BOTTOM_LEFT, BOTTOM_RIGHT };
private static final float[] RED = ColorUtils.getFloatComponents(DyeColor.RED);
+ @Init
public static void init() {
WorldRenderEvents.AFTER_TRANSLUCENT.register(LightsOn::render);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/SimonSays.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/SimonSays.java
index eeb6608f..e6c71b3d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/SimonSays.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/device/SimonSays.java
@@ -1,7 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon.device;
-import java.util.Objects;
-
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.DungeonBoss;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -31,6 +30,8 @@ import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
+import java.util.Objects;
+
public class SimonSays {
private static final Box BOARD_AREA = Box.enclosing(new BlockPos(111, 123, 92), new BlockPos(111, 120, 95));
private static final Box BUTTONS_AREA = Box.enclosing(new BlockPos(110, 123, 92), new BlockPos(110, 120, 95));
@@ -40,6 +41,7 @@ public class SimonSays {
private static final ObjectSet CLICKED_BUTTONS = new ObjectOpenHashSet<>();
private static final ObjectList SIMON_PATTERN = new ObjectArrayList<>();
+ @Init
public static void init() {
UseBlockCallback.EVENT.register(SimonSays::onBlockInteract);
ClientPlayConnectionEvents.JOIN.register((_handler, _sender, _client) -> reset());
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java
index ad002057..1e637df3 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/partyfinder/PartyFinderScreen.java
@@ -4,6 +4,7 @@ import com.google.gson.JsonObject;
import com.mojang.authlib.properties.PropertyMap;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.utils.ItemUtils;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.minecraft.block.entity.SignBlockEntity;
@@ -104,6 +105,7 @@ public class PartyFinderScreen extends Screen {
public static Map floorIconsNormal = null;
public static Map floorIconsMaster = null;
+ @Init
public static void initClass() {
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
//Checking when this is loaded probably isn't necessary as the maps are always null checked
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/CreeperBeams.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/CreeperBeams.java
index 75dd7708..b8da526a 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/CreeperBeams.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/CreeperBeams.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon.puzzle;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.ColorUtils;
import de.hysky.skyblocker.utils.Utils;
@@ -49,6 +50,7 @@ public class CreeperBeams extends DungeonPuzzle {
super("creeper", "creeper-room");
}
+ @Init
public static void init() {
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonBlaze.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonBlaze.java
index 8ac79f39..3fab876d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonBlaze.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonBlaze.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon.puzzle;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
@@ -38,6 +39,7 @@ public class DungeonBlaze extends DungeonPuzzle {
super("blaze", "blaze-room-1-high", "blaze-room-1-low");
}
+ @Init
public static void init() {
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java
index 883a469a..ab199ff9 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/IceFill.java
@@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.dungeon.puzzle;
import com.google.common.primitives.Booleans;
import com.mojang.brigadier.Command;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -42,6 +43,7 @@ public class IceFill extends DungeonPuzzle {
super("ice-fill", "ice-path");
}
+ @Init
public static void init() {
if (Debug.debugEnabled()) {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("dungeons").then(literal("puzzle").then(literal(INSTANCE.puzzleName)
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Silverfish.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Silverfish.java
index f4376c54..5d58c40c 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Silverfish.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/Silverfish.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon.puzzle;
import com.mojang.brigadier.Command;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -36,6 +37,7 @@ public class Silverfish extends DungeonPuzzle {
super("silverfish", "ice-silverfish-room");
}
+ @Init
public static void init() {
if (Debug.debugEnabled()) {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("dungeons").then(literal("puzzle").then(literal(INSTANCE.puzzleName)
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java
index d703acb6..73f62bb6 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon.puzzle;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
import de.hysky.skyblocker.skyblock.dungeon.secrets.Room;
@@ -22,6 +23,8 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ThreeWeirdos extends DungeonPuzzle {
+ @SuppressWarnings("unused")
+ private static final ThreeWeirdos INSTANCE = new ThreeWeirdos();
protected static final Pattern PATTERN = Pattern.compile("^\\[NPC] ([A-Z][a-z]+): (?:The reward is(?: not in my chest!|n't in any of our chests\\.)|My chest (?:doesn't have the reward\\. We are all telling the truth\\.|has the reward and I'm telling the truth!)|At least one of them is lying, and the reward is not in [A-Z][a-z]+'s chest!|Both of them are telling the truth\\. Also, [A-Z][a-z]+ has the reward in their chest!)$");
private static final float[] GREEN_COLOR_COMPONENTS = new float[]{0, 1, 0};
private static BlockPos pos;
@@ -51,8 +54,8 @@ public class ThreeWeirdos extends DungeonPuzzle {
});
}
+ @Init
public static void init() {
- new ThreeWeirdos();
}
private void checkForNPC(ClientWorld world, Room room, BlockPos relative, String name) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java
index 9e9d20f6..40d25805 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/TicTacToe.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon.puzzle;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
import de.hysky.skyblocker.utils.Utils;
@@ -32,8 +33,9 @@ public class TicTacToe extends DungeonPuzzle {
super("tic-tac-toe", "tic-tac-toe-1");
}
- public static void init() {
- }
+ @Init
+ public static void init() {
+ }
@Override
public void tick(MinecraftClient client) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/boulder/Boulder.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/boulder/Boulder.java
index 2b61940b..1250b763 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/boulder/Boulder.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/boulder/Boulder.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dungeon.puzzle.boulder;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.DungeonPuzzle;
import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -22,7 +23,8 @@ import java.util.Arrays;
import java.util.List;
public class Boulder extends DungeonPuzzle {
- private static final Boulder INSTANCE = new Boulder();
+ @SuppressWarnings("unused")
+ private static final Boulder INSTANCE = new Boulder();
private static final float[] RED_COLOR_COMPONENTS = ColorUtils.getFloatComponents(DyeColor.RED);
private static final float[] ORANGE_COLOR_COMPONENTS = ColorUtils.getFloatComponents(DyeColor.ORANGE);
private static final int BASE_Y = 65;
@@ -33,6 +35,7 @@ public class Boulder extends DungeonPuzzle {
super("boulder", "boxes-room");
}
+ @Init
public static void init() {
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java
index f81fae0c..708a86ee 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/waterboard/Waterboard.java
@@ -5,6 +5,7 @@ import com.google.common.collect.MultimapBuilder;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.DungeonPuzzle;
@@ -91,6 +92,7 @@ public class Waterboard extends DungeonPuzzle {
super("waterboard", "water-puzzle");
}
+ @Init
public static void init() {
UseBlockCallback.EVENT.register(INSTANCE::onUseBlock);
if (Debug.debugEnabled()) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
index 1429e2e0..86ef0828 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java
@@ -13,6 +13,7 @@ import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.serialization.JsonOps;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.DungeonsConfig;
import de.hysky.skyblocker.debug.Debug;
@@ -236,6 +237,7 @@ public class DungeonManager {
* Loads the dungeon secrets asynchronously from {@code /assets/skyblocker/dungeons}.
* Use {@link #isRoomsLoaded()} to check for completion of loading.
*/
+ @Init
public static void init() {
CUSTOM_WAYPOINTS_DIR = SkyblockerMod.CONFIG_DIR.resolve("custom_secret_waypoints.json");
if (!SkyblockerConfigManager.get().dungeons.secretWaypoints.enableRoomMatching) {
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java
index fd960163..43e0dea2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java
@@ -2,6 +2,7 @@ package de.hysky.skyblocker.skyblock.dungeon.secrets;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
import de.hysky.skyblocker.skyblock.tabhud.widget.DungeonPlayerWidget;
@@ -37,6 +38,7 @@ public class SecretsTracker {
private static volatile TrackedRun lastRun = null;
private static volatile long lastRunEnded = 0L;
+ @Init
public static void init() {
ClientReceiveMessageEvents.GAME.register(SecretsTracker::onMessage);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CommissionLabels.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CommissionLabels.java
index a14c71f7..7832c95d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CommissionLabels.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CommissionLabels.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dwarven;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.MiningConfig;
import de.hysky.skyblocker.utils.Utils;
@@ -22,6 +23,7 @@ public class CommissionLabels {
protected static List activeWaypoints = new ArrayList<>();
+ @Init
public static void init() {
WorldRenderEvents.AFTER_TRANSLUCENT.register(CommissionLabels::render);
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java
index bc794d89..39b55827 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dwarven;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.render.RenderHelper;
@@ -37,6 +38,7 @@ public class CrystalsChestHighlighter {
private static int currentLockCount = 0;
private static int neededLockCount = 0;
+ @Init
public static void init() {
ClientReceiveMessageEvents.GAME.register(CrystalsChestHighlighter::extractLocationFromMessage);
WorldRenderEvents.AFTER_TRANSLUCENT.register(CrystalsChestHighlighter::render);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
index 30bf6b03..1fdeae2a 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHud.java
@@ -1,6 +1,7 @@
package de.hysky.skyblocker.skyblock.dwarven;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.HudRenderEvents;
import de.hysky.skyblocker.utils.Utils;
@@ -28,6 +29,7 @@ public class CrystalsHud {
public static boolean visible = false;
+ @Init
public static void init() {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("hud")
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java
index 0a05b771..211fa3c1 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java
@@ -5,6 +5,7 @@ import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.logging.LogUtils;
import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.Constants;
@@ -69,6 +70,7 @@ public class CrystalsLocationsManager {
protected static List verifiedWaypoints = new ArrayList<>();
private static List waypointsSent2Socket = new ArrayList<>();
+ @Init
public static void init() {
// Crystal Hollows Waypoints
Scheduler.INSTANCE.scheduleCyclic(CrystalsLocationsManager::update, 40);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java
index 16c36dde..6d0a13c2 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/DwarvenHud.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dwarven;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.configs.MiningConfig;
import de.hysky.skyblocker.events.HudRenderEvents;
@@ -53,6 +54,7 @@ public class DwarvenHud {
private static final Pattern GEMSTONE_PATTERN = Pattern.compile("Gemstone: [0-9,]+");
private static final Pattern GLACITE_PATTERN = Pattern.compile("Glacite: [0-9,]+");
+ @Init
public static void init() {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("hud")
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/GlaciteColdOverlay.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/GlaciteColdOverlay.java
index f2911f9a..0a90cb87 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/GlaciteColdOverlay.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/GlaciteColdOverlay.java
@@ -1,6 +1,7 @@
package de.hysky.skyblocker.skyblock.dwarven;
import com.mojang.blaze3d.systems.RenderSystem;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
@@ -18,6 +19,7 @@ public class GlaciteColdOverlay {
private static int cold = 0;
private static long resetTime = System.currentTimeMillis();
+ @Init
public static void init() {
Scheduler.INSTANCE.scheduleCyclic(GlaciteColdOverlay::update, 20);
ClientReceiveMessageEvents.GAME.register(GlaciteColdOverlay::coldReset);
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/MetalDetector.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/MetalDetector.java
index ae45ff0b..71accd78 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/MetalDetector.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/MetalDetector.java
@@ -1,5 +1,6 @@
package de.hysky.skyblocker.skyblock.dwarven;
+import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.Utils;
@@ -90,6 +91,7 @@ public class MetalDetector {
private static boolean startedLooking = false;
protected static List possibleBlocks = new ArrayList<>();
+ @Init
p