aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/dev/isxander/yacl3/mixin
diff options
context:
space:
mode:
authorisxander <xander@isxander.dev>2024-04-11 18:43:06 +0100
committerisxander <xander@isxander.dev>2024-04-11 18:43:06 +0100
commit04fe933f4c24817100f3101f088accf55a621f8a (patch)
treefeff94ca3ab4484160e69a24f4ee38522381950e /src/main/java/dev/isxander/yacl3/mixin
parent831b894fdb7fe3e173d81387c8f6a2402b8ccfa9 (diff)
downloadYetAnotherConfigLib-04fe933f4c24817100f3101f088accf55a621f8a.tar.gz
YetAnotherConfigLib-04fe933f4c24817100f3101f088accf55a621f8a.tar.bz2
YetAnotherConfigLib-04fe933f4c24817100f3101f088accf55a621f8a.zip
Extremely fragile and broken multiversion build with stonecutter
Diffstat (limited to 'src/main/java/dev/isxander/yacl3/mixin')
-rw-r--r--src/main/java/dev/isxander/yacl3/mixin/AbstractSelectionListMixin.java25
-rw-r--r--src/main/java/dev/isxander/yacl3/mixin/ContainerEventHandlerMixin.java37
-rw-r--r--src/main/java/dev/isxander/yacl3/mixin/MinecraftMixin.java16
-rw-r--r--src/main/java/dev/isxander/yacl3/mixin/OptionInstanceAccessor.java13
-rw-r--r--src/main/java/dev/isxander/yacl3/mixin/TabNavigationBarAccessor.java16
5 files changed, 107 insertions, 0 deletions
diff --git a/src/main/java/dev/isxander/yacl3/mixin/AbstractSelectionListMixin.java b/src/main/java/dev/isxander/yacl3/mixin/AbstractSelectionListMixin.java
new file mode 100644
index 0000000..471fa19
--- /dev/null
+++ b/src/main/java/dev/isxander/yacl3/mixin/AbstractSelectionListMixin.java
@@ -0,0 +1,25 @@
+package dev.isxander.yacl3.mixin;
+
+import net.minecraft.client.gui.components.AbstractSelectionList;
+import org.objectweb.asm.Opcodes;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+import java.util.List;
+
+@Mixin(AbstractSelectionList.class)
+public abstract class AbstractSelectionListMixin<E extends AbstractSelectionList.Entry<E>> {
+ @Shadow public abstract List<E> children();
+
+ /**
+ * Mojang use the field access of children to get max index to loop through keyboard navigation to find the next entry.
+ * YACL modifies these children() method to filter out hidden entries, so we need to redirect the field access to the
+ * method, so we don't get ArrayIndexOutOfBoundsException.
+ */
+ @Redirect(method = "nextEntry(Lnet/minecraft/client/gui/navigation/ScreenDirection;Ljava/util/function/Predicate;Lnet/minecraft/client/gui/components/AbstractSelectionList$Entry;)Lnet/minecraft/client/gui/components/AbstractSelectionList$Entry;", at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/components/AbstractSelectionList;children:Ljava/util/List;", opcode = Opcodes.GETFIELD))
+ private List<E> modifyChildrenCall(AbstractSelectionList<E> instance) {
+ return children();
+ }
+}
diff --git a/src/main/java/dev/isxander/yacl3/mixin/ContainerEventHandlerMixin.java b/src/main/java/dev/isxander/yacl3/mixin/ContainerEventHandlerMixin.java
new file mode 100644
index 0000000..bd5ada0
--- /dev/null
+++ b/src/main/java/dev/isxander/yacl3/mixin/ContainerEventHandlerMixin.java
@@ -0,0 +1,37 @@
+/*? if !forge {*/
+package dev.isxander.yacl3.mixin;
+
+import net.minecraft.client.gui.components.events.ContainerEventHandler;
+import net.minecraft.client.gui.components.events.GuiEventListener;
+import net.minecraft.client.gui.components.tabs.TabNavigationBar;
+import net.minecraft.client.gui.navigation.FocusNavigationEvent;
+import net.minecraft.client.gui.navigation.ScreenAxis;
+import net.minecraft.client.gui.navigation.ScreenDirection;
+import net.minecraft.client.gui.navigation.ScreenRectangle;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+import java.util.List;
+
+
+@Mixin(ContainerEventHandler.class)
+public interface ContainerEventHandlerMixin {
+ // This mixin is used to prevent the tab bar from being focused when navigating left or right
+ // through the YACL options screen. This can also apply to vanilla as navigating left or right
+ // should never result in focusing the always-at-the-top tab bar.
+ // Without this, navigating right from the option list focuses the tab bar, not the action buttons/description.
+ @Redirect(method = {"nextFocusPathVaguelyInDirection", "nextFocusPathInDirection"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/events/ContainerEventHandler;children()Ljava/util/List;"))
+ default List<?> modifyFocusCandidates(ContainerEventHandler instance, ScreenRectangle screenArea, ScreenDirection direction, @Nullable GuiEventListener focused, FocusNavigationEvent event) {
+ if (direction.getAxis() == ScreenAxis.HORIZONTAL)
+ return instance.children().stream().filter(child -> !(child instanceof TabNavigationBar)).toList();
+ return instance.children();
+ }
+}
+/*?} else {*//*
+@Mixin(targets = {})
+public class ContainerEventHandlerMixin {
+
+}
+*//*?}*/
diff --git a/src/main/java/dev/isxander/yacl3/mixin/MinecraftMixin.java b/src/main/java/dev/isxander/yacl3/mixin/MinecraftMixin.java
new file mode 100644
index 0000000..45bc314
--- /dev/null
+++ b/src/main/java/dev/isxander/yacl3/mixin/MinecraftMixin.java
@@ -0,0 +1,16 @@
+package dev.isxander.yacl3.mixin;
+
+import dev.isxander.yacl3.gui.image.ImageRendererManager;
+import net.minecraft.client.Minecraft;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(Minecraft.class)
+public class MinecraftMixin {
+ @Inject(method = "destroy", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;close()V", shift = At.Shift.BEFORE))
+ private void closeImages(CallbackInfo ci) {
+ ImageRendererManager.closeAll();
+ }
+}
diff --git a/src/main/java/dev/isxander/yacl3/mixin/OptionInstanceAccessor.java b/src/main/java/dev/isxander/yacl3/mixin/OptionInstanceAccessor.java
new file mode 100644
index 0000000..429e383
--- /dev/null
+++ b/src/main/java/dev/isxander/yacl3/mixin/OptionInstanceAccessor.java
@@ -0,0 +1,13 @@
+package dev.isxander.yacl3.mixin;
+
+import net.minecraft.client.OptionInstance;
+import org.jetbrains.annotations.ApiStatus;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@ApiStatus.Internal
+@Mixin(OptionInstance.class)
+public interface OptionInstanceAccessor<T> {
+ @Accessor
+ T getInitialValue();
+}
diff --git a/src/main/java/dev/isxander/yacl3/mixin/TabNavigationBarAccessor.java b/src/main/java/dev/isxander/yacl3/mixin/TabNavigationBarAccessor.java
new file mode 100644
index 0000000..388407b
--- /dev/null
+++ b/src/main/java/dev/isxander/yacl3/mixin/TabNavigationBarAccessor.java
@@ -0,0 +1,16 @@
+package dev.isxander.yacl3.mixin;
+
+import net.minecraft.client.gui.components.tabs.TabNavigationBar;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(TabNavigationBar.class)
+public interface TabNavigationBarAccessor {
+ /*? if >1.20.4 {*//*
+ @Accessor
+ net.minecraft.client.gui.layouts.LinearLayout getLayout();
+ *//*? } else {*/
+ @Accessor
+ net.minecraft.client.gui.layouts.GridLayout getLayout();
+ /*?}*/
+}