diff --git a/gradle.properties b/gradle.properties index c928629..c8c5885 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,7 +26,7 @@ emi_version=0.5.0+1.19.3 libgui_version=6.0.0+1.19 inventorytabs_version=inventorytabs-0.9.beta-1.19.x clothconfig_version=7.0.72 -yacl_version=0.1.2 +yacl_version=2.0.0 bedrockify_version=1.5+mc1.19.1-2 # Ok Zoomer and LibZoomer are temporarily disabled for the time being, as we are currently using Reflection at runtime instead in OkZoomerCompat due to there being two major, completely incompatible API versions. diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 97a6905..9d30a4f 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -13,10 +13,7 @@ import com.google.common.collect.ImmutableSet; import dev.lambdaurora.spruceui.widget.AbstractSpruceWidget; import dev.lambdaurora.spruceui.widget.container.SpruceEntryListWidget; import eu.midnightdust.midnightcontrols.MidnightControls; -import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat; -import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat; -import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; -import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat; +import eu.midnightdust.midnightcontrols.client.compat.*; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; @@ -695,6 +692,8 @@ public class MidnightInput { var childFocused = widget.getFocused(); if (childFocused != null) return this.handleAButton(screen, childFocused); + } else if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleAButton(screen, focused)) { + return true; } return false; } @@ -711,6 +710,10 @@ public class MidnightInput { this.actionGuiCooldown = 5; return false; } + if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleLeftRight(screen, right)) { + this.actionGuiCooldown = 5; + return false; + } var focused = screen.getFocused(); if (focused != null) if (this.handleRightLeftElement(focused, right)) diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/compat/YACLCompat.java b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/YACLCompat.java new file mode 100644 index 0000000..671bf1e --- /dev/null +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/compat/YACLCompat.java @@ -0,0 +1,56 @@ +package eu.midnightdust.midnightcontrols.client.compat; + +import dev.isxander.yacl.gui.AbstractWidget; +import dev.isxander.yacl.gui.OptionListWidget; +import dev.isxander.yacl.gui.YACLScreen; +import dev.isxander.yacl.gui.controllers.ControllerWidget; +import dev.isxander.yacl.gui.controllers.slider.SliderControllerElement; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.screen.Screen; +import org.lwjgl.glfw.GLFW; + +public class YACLCompat { + public static boolean handleAButton(Screen screen, Element element) { + if (element instanceof AbstractWidget abstractWidget) { + // imitate ender key press + return abstractWidget.keyPressed(GLFW.GLFW_KEY_ENTER, 0, 0); + } + return false; + } + + public static boolean handleLeftRight(Screen screen, boolean direction) { + if (screen instanceof YACLScreen yaclScreen) { + SliderControllerElement focusedSlider = yaclScreen.optionList.children().stream() + .filter(OptionListWidget.OptionEntry.class::isInstance) + .map(entry -> ((OptionListWidget.OptionEntry) entry).widget) + .filter(ControllerWidget.class::isInstance) + .map(ControllerWidget.class::cast) + .filter(SliderControllerElement.class::isInstance) + .map(SliderControllerElement.class::cast) + .filter(ControllerWidget::isHovered) + .findFirst() + .orElse(null); + + if (focusedSlider == null) + return false; + + focusedSlider.incrementValue(direction ? 1 : -1); + return true; + } + + return false; + } + + public static boolean handleCategories(Screen screen, boolean direction) { + if (screen instanceof YACLScreen yaclScreen) { + int categoryIdx = yaclScreen.getCurrentCategoryIdx(); + if (direction) categoryIdx++; else categoryIdx--; + if (categoryIdx < 0) categoryIdx = yaclScreen.config.categories().size() - 1; + if (categoryIdx >= yaclScreen.config.categories().size()) categoryIdx = 0; + + yaclScreen.changeCategory(categoryIdx); + return true; + } + return false; + } +} diff --git a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java index 7488f47..9b6f7a1 100644 --- a/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java +++ b/src/main/java/eu/midnightdust/midnightcontrols/client/controller/InputHandlers.java @@ -16,6 +16,7 @@ import eu.midnightdust.midnightcontrols.client.MidnightInput; import eu.midnightdust.midnightcontrols.client.compat.InventoryTabsCompat; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.compat.SodiumCompat; +import eu.midnightdust.midnightcontrols.client.compat.YACLCompat; import eu.midnightdust.midnightcontrols.client.gui.RingScreen; import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor; @@ -161,7 +162,10 @@ public class InputHandlers { } return true; } else { - if (FabricLoader.getInstance().isModLoaded("sodium")) SodiumCompat.handleTabs(client.currentScreen, next); + if (FabricLoader.getInstance().isModLoaded("sodium")) + SodiumCompat.handleTabs(client.currentScreen, next); + if (FabricLoader.getInstance().isModLoaded("yet-another-config-lib") && YACLCompat.handleCategories(client.currentScreen, next)) + return true; } if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryTabs(client.currentScreen, next); return false; @@ -198,6 +202,7 @@ public class InputHandlers { } catch (Exception ignored) {} } if (MidnightControlsCompat.isInventoryTabsPresent()) InventoryTabsCompat.handleInventoryPage(client.currentScreen, next); + return false; }; } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2499da3..add1d69 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -53,7 +53,7 @@ "depends": { "fabricloader": ">=0.11.3", "fabric": ">=0.36.0", - "minecraft": ">=1.17", + "minecraft": "~1.19.3", "spruceui": ">=3.2.0", "java": ">=17" },