diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2025-06-07 21:26:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-07 15:26:55 -0400 |
| commit | bd05937dfb01a2133d06879ad79074b4bf42e603 (patch) | |
| tree | f4e5aa45f77681c91ee61f19c87b9871bd22c97f /src/main/java/de | |
| parent | ba82ac00e9caf1c1571b7e9f255b0dae91476ab8 (diff) | |
| download | Skyblocker-bd05937dfb01a2133d06879ad79074b4bf42e603.tar.gz Skyblocker-bd05937dfb01a2133d06879ad79074b4bf42e603.tar.bz2 Skyblocker-bd05937dfb01a2133d06879ad79074b4bf42e603.zip | |
fix customize button not moving when recipe book is toggled + refactor (#1316)
Diffstat (limited to 'src/main/java/de')
4 files changed, 51 insertions, 15 deletions
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<PlayerScreenHandler> { +public abstract class InventoryScreenMixin extends HandledScreen<PlayerScreenHandler> implements RecipeBookHolder { - @Unique - private GardenPlotsWidget gardenPlotsWidget; + @Unique + private final List<Runnable> 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<PlayerScreenHan } @Inject(method = "onRecipeBookToggled", at = @At("TAIL")) - private void skyblocker$moveGardenPlotsWdiget(CallbackInfo ci) { - if (gardenPlotsWidget != null) { - gardenPlotsWidget.setPosition(x + backgroundWidth + 4, y); - } + private void skyblocker$callRecipeToggleCallbacks(CallbackInfo ci) { + recipeBookToggleCallbacks.forEach(Runnable::run); } - @Inject(method = "init", at = @At("TAIL")) - private void skyblocker$addGardenPlotsWidget(CallbackInfo ci) { - if (Utils.getLocation().equals(Location.GARDEN) && SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget) { - addDrawableChild(gardenPlotsWidget = new GardenPlotsWidget(x + backgroundWidth + 4, y)); - } + @Inject(method = "init", at = @At("HEAD")) + private void skyblocker$clearRecipeToggleCallbacks(CallbackInfo ci) { + recipeBookToggleCallbacks.clear(); } + + @Override + public void registerRecipeBookToggleCallback(Runnable runnable) { + recipeBookToggleCallbacks.add(runnable); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java index 70fe587a..7d2c22b3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/GardenPlotsWidget.java @@ -7,18 +7,23 @@ 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.injected.RecipeBookHolder; +import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListManager; +import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.render.gui.ItemButtonWidget; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import it.unimi.dsi.fastutil.ints.*; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.fabricmc.fabric.api.client.screen.v1.Screens; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; +import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.widget.ContainerWidget; import net.minecraft.client.render.RenderLayer; @@ -102,6 +107,16 @@ public class GardenPlotsWidget extends ContainerWidget { } }); + } else if (screen instanceof InventoryScreen inventoryScreen && Utils.getLocation().equals(Location.GARDEN) && SkyblockerConfigManager.get().farming.garden.gardenPlotsWidget) { + GardenPlotsWidget widget = new GardenPlotsWidget( + ((HandledScreenAccessor) inventoryScreen).getX() + ((HandledScreenAccessor) inventoryScreen).getBackgroundWidth() + 4, + ((HandledScreenAccessor) inventoryScreen).getY()); + Screens.getButtons(inventoryScreen).add(widget); + + ((RecipeBookHolder) inventoryScreen).registerRecipeBookToggleCallback(() -> 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 )); |
