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