diff --git a/src/main/java/chylex/bettercontrols/gui/ScreenPatcher.java b/src/main/java/chylex/bettercontrols/gui/ScreenPatcher.java deleted file mode 100644 index 36e6be1..0000000 --- a/src/main/java/chylex/bettercontrols/gui/ScreenPatcher.java +++ /dev/null @@ -1,61 +0,0 @@ -package chylex.bettercontrols.gui; -import chylex.bettercontrols.mixin.AccessCycleButtonFields; -import chylex.bettercontrols.mixin.AccessOptionFields; -import chylex.bettercontrols.mixin.AccessScreenButtons; -import net.minecraft.client.Minecraft; -import net.minecraft.client.Option; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.CycleButton; -import net.minecraft.client.gui.components.events.ContainerEventHandler; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.screens.AccessibilityOptionsScreen; -import net.minecraft.client.gui.screens.controls.ControlsScreen; -import java.util.List; -import java.util.Optional; -import java.util.function.Consumer; - -public final class ScreenPatcher { - private ScreenPatcher() {} - - public static void onControlsScreenOpened(final ControlsScreen screen) { - final AccessScreenButtons accessor = (AccessScreenButtons)screen; - final List<? extends GuiEventListener> children = screen.children(); - - final CycleButton<?> autoJump = children.stream().flatMap(it -> getOptionButton(it, Option.AUTO_JUMP).stream()).findAny().orElse(null); - - if (autoJump != null) { - final Button widget = new Button(autoJump.x, autoJump.y, autoJump.getWidth(), autoJump.getHeight(), BetterControlsScreen.TITLE.plainCopy().append("..."), btn -> { - Minecraft.getInstance().setScreen(new BetterControlsScreen(screen)); - }); - - accessor.callRemoveWidget(autoJump); - accessor.callAddRenderableWidget(widget); - } - } - - public static void onAccessibilityScreenOpened(final AccessibilityOptionsScreen screen) { - walkChildren(screen.children(), it -> { - getOptionButton(it, Option.TOGGLE_SPRINT).ifPresent(button -> button.active = false); - getOptionButton(it, Option.TOGGLE_CROUCH).ifPresent(button -> button.active = false); - }); - } - - private static void walkChildren(final List<? extends GuiEventListener> elements, final Consumer<GuiEventListener> callback) { - for (final GuiEventListener element : elements) { - callback.accept(element); - - if (element instanceof final ContainerEventHandler container) { - walkChildren(container.children(), callback); - } - } - } - - private static Optional<CycleButton<?>> getOptionButton(final GuiEventListener element, final Option option) { - if (element instanceof final CycleButton<?> button && ((AccessOptionFields)option).getCaption().equals(((AccessCycleButtonFields)button).getName())) { - return Optional.of(button); - } - else { - return Optional.empty(); - } - } -} diff --git a/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java b/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java index 870ff9e..2cbc1f2 100644 --- a/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java +++ b/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java @@ -1,17 +1,11 @@ package chylex.bettercontrols.input; import com.mojang.blaze3d.platform.InputConstants.Type; import net.minecraft.client.KeyMapping; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; import org.jetbrains.annotations.Nullable; public class KeyBindingWithModifier extends KeyMapping { public static final String CATEGORY = "key.categories.bettercontrols"; - public static boolean checkCategoryMatches(final Component text) { - return text instanceof final TranslatableComponent t && CATEGORY.equals(t.getKey()); - } - @Nullable private ModifierKey modifier = null; diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListCategory.java b/src/main/java/chylex/bettercontrols/mixin/AccessControlsListCategory.java deleted file mode 100644 index aab2dfd..0000000 --- a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListCategory.java +++ /dev/null @@ -1,11 +0,0 @@ -package chylex.bettercontrols.mixin; -import net.minecraft.client.gui.screens.controls.ControlList.CategoryEntry; -import net.minecraft.network.chat.Component; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(CategoryEntry.class) -public interface AccessControlsListCategory { - @Accessor - Component getName(); -} diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java b/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java deleted file mode 100644 index c641ec6..0000000 --- a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java +++ /dev/null @@ -1,11 +0,0 @@ -package chylex.bettercontrols.mixin; -import net.minecraft.client.KeyMapping; -import net.minecraft.client.gui.screens.controls.ControlList.KeyEntry; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(KeyEntry.class) -public interface AccessControlsListKeyBinding { - @Accessor - KeyMapping getKey(); -} diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessCycleButtonFields.java b/src/main/java/chylex/bettercontrols/mixin/AccessCycleButtonFields.java deleted file mode 100644 index b06df98..0000000 --- a/src/main/java/chylex/bettercontrols/mixin/AccessCycleButtonFields.java +++ /dev/null @@ -1,12 +0,0 @@ -package chylex.bettercontrols.mixin; - -import net.minecraft.client.gui.components.CycleButton; -import net.minecraft.network.chat.Component; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(CycleButton.class) -public interface AccessCycleButtonFields { - @Accessor - Component getName(); -} diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessOptionFields.java b/src/main/java/chylex/bettercontrols/mixin/AccessOptionFields.java deleted file mode 100644 index a0056f7..0000000 --- a/src/main/java/chylex/bettercontrols/mixin/AccessOptionFields.java +++ /dev/null @@ -1,12 +0,0 @@ -package chylex.bettercontrols.mixin; - -import net.minecraft.client.Option; -import net.minecraft.network.chat.Component; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(Option.class) -public interface AccessOptionFields { - @Accessor - Component getCaption(); -} diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessScreenButtons.java b/src/main/java/chylex/bettercontrols/mixin/AccessScreenButtons.java deleted file mode 100644 index 24f3543..0000000 --- a/src/main/java/chylex/bettercontrols/mixin/AccessScreenButtons.java +++ /dev/null @@ -1,17 +0,0 @@ -package chylex.bettercontrols.mixin; -import net.minecraft.client.gui.components.Widget; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.narration.NarratableEntry; -import net.minecraft.client.gui.screens.Screen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@SuppressWarnings("UnusedReturnValue") -@Mixin(Screen.class) -public interface AccessScreenButtons { - @Invoker - <T extends GuiEventListener & Widget & NarratableEntry> T callAddRenderableWidget(T widget); - - @Invoker - void callRemoveWidget(GuiEventListener widget); -} diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java index 4dc61c1..1b06c7b 100644 --- a/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java +++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java @@ -1,18 +1,15 @@ package chylex.bettercontrols.mixin; import chylex.bettercontrols.BetterControlsCommon; -import chylex.bettercontrols.input.KeyBindingWithModifier; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.screens.controls.ControlList; -import net.minecraft.client.gui.screens.controls.ControlList.CategoryEntry; import net.minecraft.client.gui.screens.controls.ControlList.Entry; -import net.minecraft.client.gui.screens.controls.ControlList.KeyEntry; -import net.minecraft.client.gui.screens.controls.ControlsScreen; import org.apache.commons.lang3.ArrayUtils; 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; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(ControlList.class) public abstract class HookControlsListWidget extends ContainerObjectSelectionList<Entry> { @@ -20,18 +17,8 @@ public abstract class HookControlsListWidget extends ContainerObjectSelectionLis super(client, width, height, top, bottom, itemHeight); } - @Inject(method = "<init>", at = @At("TAIL")) - public void init(final ControlsScreen parent, final Minecraft client, final CallbackInfo ci) { - children().removeIf(it -> { - if (it instanceof final CategoryEntry entry && KeyBindingWithModifier.checkCategoryMatches(((AccessControlsListCategory)entry).getName())) { - return true; - } - - if (it instanceof final KeyEntry entry && ArrayUtils.contains(BetterControlsCommon.getConfig().getAllKeyBindings(), ((AccessControlsListKeyBinding)entry).getKey())) { - return true; - } - - return false; - }); + @Redirect(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;")) + private KeyMapping[] excludeOwnKeyBindings(final Options options) { + return ArrayUtils.removeElements(options.keyMappings, BetterControlsCommon.getConfig().getAllKeyBindings()); } } diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java new file mode 100644 index 0000000..0e17282 --- /dev/null +++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java @@ -0,0 +1,28 @@ +package chylex.bettercontrols.mixin; + +import chylex.bettercontrols.gui.BetterControlsScreen; +import net.minecraft.client.CycleOption; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Option; +import net.minecraft.client.Options; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.controls.ControlsScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ControlsScreen.class) +public abstract class HookControlsScreen { + @Redirect(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/CycleOption;createButton(Lnet/minecraft/client/Options;III)Lnet/minecraft/client/gui/components/AbstractWidget;")) + private AbstractWidget replaceAutoJumpButton(final CycleOption<?> option, final Options options, final int x, final int y, final int width) { + if (option == Option.AUTO_JUMP && !Screen.hasAltDown()) { + @SuppressWarnings("ConstantConditions") + final ControlsScreen screen = (ControlsScreen)(Object)this; + return new Button(x, y, width, 20, BetterControlsScreen.TITLE.plainCopy().append("..."), btn -> Minecraft.getInstance().setScreen(new BetterControlsScreen(screen))); + } + + return option.createButton(options, x, y, width); + } +} diff --git a/src/main/java/chylex/bettercontrols/mixin/HookOpenScreen.java b/src/main/java/chylex/bettercontrols/mixin/HookOpenScreen.java deleted file mode 100644 index 7a12845..0000000 --- a/src/main/java/chylex/bettercontrols/mixin/HookOpenScreen.java +++ /dev/null @@ -1,27 +0,0 @@ -package chylex.bettercontrols.mixin; -import chylex.bettercontrols.gui.ScreenPatcher; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.AccessibilityOptionsScreen; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.controls.ControlsScreen; -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(value = Minecraft.class, priority = 100) -public abstract class HookOpenScreen { - @Inject(method = "setScreen", at = @At("TAIL")) - private void openScreen(final Screen ignore, final CallbackInfo ci) { - final Screen screen = Minecraft.getInstance().screen; - - if (screen != null && !Screen.hasAltDown()) { - if (screen.getClass() == ControlsScreen.class) { - ScreenPatcher.onControlsScreenOpened((ControlsScreen)screen); - } - else if (screen.getClass() == AccessibilityOptionsScreen.class) { - ScreenPatcher.onAccessibilityScreenOpened((AccessibilityOptionsScreen)screen); - } - } - } -} diff --git a/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java new file mode 100644 index 0000000..ee18a4c --- /dev/null +++ b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java @@ -0,0 +1,23 @@ +package chylex.bettercontrols.mixin; + +import net.minecraft.client.CycleOption; +import net.minecraft.client.Option; +import net.minecraft.client.Options; +import net.minecraft.client.gui.components.AbstractWidget; +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.CallbackInfoReturnable; + +@Mixin(CycleOption.class) +public abstract class HookToggleOptionButtons { + @Inject(method = "createButton", at = @At("RETURN")) + private void disableToggleOptions(final Options options, final int x, final int y, final int width, final CallbackInfoReturnable<AbstractWidget> ci) { + @SuppressWarnings("ConstantConditions") + final CycleOption<?> me = (CycleOption<?>)(Object)this; + + if (me == Option.TOGGLE_CROUCH || me == Option.TOGGLE_SPRINT) { + ci.getReturnValue().active = false; + } + } +} diff --git a/src/main/resources/bettercontrols.mixins.json b/src/main/resources/bettercontrols.mixins.json index 466efa4..b429c51 100644 --- a/src/main/resources/bettercontrols.mixins.json +++ b/src/main/resources/bettercontrols.mixins.json @@ -6,22 +6,18 @@ "client": [ "AccessCameraFields", "AccessClientPlayerFields", - "AccessControlsListCategory", - "AccessControlsListKeyBinding", - "AccessCycleButtonFields", "AccessKeyBindingFields", - "AccessOptionFields", "AccessPlayerFields", - "AccessScreenButtons", "AccessStickyKeyBindingStateGetter", "HookClientPlayerFOV", "HookClientPlayerInputTick", "HookClientPlayerTick", "HookControlsListWidget", + "HookControlsScreen", "HookLoadGameOptions", - "HookOpenScreen", "HookPlayerFlightSpeed", - "HookStickyKeyBindingState" + "HookStickyKeyBindingState", + "HookToggleOptionButtons" ], "injectors": { "defaultRequire": 1