diff options
author | isxander <xander@isxander.dev> | 2024-04-11 18:43:06 +0100 |
---|---|---|
committer | isxander <xander@isxander.dev> | 2024-04-11 18:43:06 +0100 |
commit | 04fe933f4c24817100f3101f088accf55a621f8a (patch) | |
tree | feff94ca3ab4484160e69a24f4ee38522381950e /src/main/java/dev/isxander/yacl3/mixin | |
parent | 831b894fdb7fe3e173d81387c8f6a2402b8ccfa9 (diff) | |
download | YetAnotherConfigLib-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')
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(); + /*?}*/ +} |