From bd05937dfb01a2133d06879ad79074b4bf42e603 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:26:55 +0200 Subject: fix customize button not moving when recipe book is toggled + refactor (#1316) --- .../skyblocker/injected/RecipeBookHolder.java | 12 +++++++++ .../skyblocker/mixins/InventoryScreenMixin.java | 31 ++++++++++++---------- .../skyblock/garden/GardenPlotsWidget.java | 15 +++++++++++ .../item/custom/screen/CustomizeArmorScreen.java | 8 +++++- 4 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/injected/RecipeBookHolder.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/injected/RecipeBookHolder.java b/src/main/java/de/hysky/skyblocker/injected/RecipeBookHolder.java new file mode 100644 index 00000000..78ca1bb0 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/injected/RecipeBookHolder.java @@ -0,0 +1,12 @@ +package de.hysky.skyblocker.injected; + +public interface RecipeBookHolder { + + /** + * Register a callback that gets called when the recipe book button is toggled. + * The callback list is emptied after each init, so this needs to be registered everytime in {@link net.fabricmc.fabric.api.client.screen.v1.ScreenEvents.AfterInit} + * @implNote {@code BEFORE_INIT} may be called before the callback list is emptied. + * @param callback the callback + */ + void registerRecipeBookToggleCallback(Runnable callback); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java index a96d327d..b7455c2e 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.mixins; import com.llamalad7.mixinextras.sugar.Local; +import de.hysky.skyblocker.injected.RecipeBookHolder; import net.minecraft.entity.player.PlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -10,9 +11,7 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.garden.GardenPlotsWidget; import de.hysky.skyblocker.skyblock.itemlist.recipebook.SkyblockRecipeBookWidget; -import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; @@ -26,11 +25,14 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.ArrayList; +import java.util.List; + @Mixin(InventoryScreen.class) -public abstract class InventoryScreenMixin extends HandledScreen { +public abstract class InventoryScreenMixin extends HandledScreen implements RecipeBookHolder { - @Unique - private GardenPlotsWidget gardenPlotsWidget; + @Unique + private final List recipeBookToggleCallbacks = new ArrayList<>(); public InventoryScreenMixin(PlayerScreenHandler handler, PlayerInventory inventory, Text title) { super(handler, inventory, title); @@ -59,16 +61,17 @@ public abstract class InventoryScreenMixin extends HandledScreen widget.setPosition( + ((HandledScreenAccessor) inventoryScreen).getX() + ((HandledScreenAccessor) inventoryScreen).getBackgroundWidth() + 4, + ((HandledScreenAccessor) inventoryScreen).getY() + )); } }); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/custom/screen/CustomizeArmorScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/item/custom/screen/CustomizeArmorScreen.java index 5450f456..0cf79919 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/custom/screen/CustomizeArmorScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/custom/screen/CustomizeArmorScreen.java @@ -5,6 +5,7 @@ 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.injected.RecipeBookHolder; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.item.custom.CustomArmorAnimatedDyes; import de.hysky.skyblocker.skyblock.item.custom.CustomArmorTrims; @@ -71,7 +72,12 @@ public class CustomizeArmorScreen extends Screen { )); ScreenEvents.AFTER_INIT.register((client1, screen, scaledWidth, scaledHeight) -> { if (Utils.isOnSkyblock() && screen instanceof InventoryScreen inventoryScreen) { - Screens.getButtons(inventoryScreen).add(new CustomizeButton( + CustomizeButton button = new CustomizeButton( + ((HandledScreenAccessor) inventoryScreen).getX() + 63, + ((HandledScreenAccessor) inventoryScreen).getY() + 10 + ); + Screens.getButtons(inventoryScreen).add(button); + ((RecipeBookHolder) inventoryScreen).registerRecipeBookToggleCallback(() -> button.setPosition( ((HandledScreenAccessor) inventoryScreen).getX() + 63, ((HandledScreenAccessor) inventoryScreen).getY() + 10 )); -- cgit