diff --git a/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java b/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java index 4247d07..f59e134 100644 --- a/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java +++ b/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java @@ -1,11 +1,17 @@ package chylex.bettercontrols.input; import net.minecraft.client.options.KeyBinding; import net.minecraft.client.util.InputUtil.Type; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; import org.jetbrains.annotations.Nullable; public class KeyBindingWithModifier extends KeyBinding{ public static final String CATEGORY = "key.categories.bettercontrols"; + public static boolean checkCategoryMatches(final Text text){ + return text instanceof TranslatableText && CATEGORY.equals(((TranslatableText)text).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 new file mode 100644 index 0000000..1a96f93 --- /dev/null +++ b/src/main/java/chylex/bettercontrols/mixin/AccessControlsListCategory.java @@ -0,0 +1,11 @@ +package chylex.bettercontrols.mixin; +import net.minecraft.client.gui.screen.options.ControlsListWidget.CategoryEntry; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(CategoryEntry.class) +public interface AccessControlsListCategory{ + @Accessor + Text getText(); +} diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java b/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java new file mode 100644 index 0000000..1b85585 --- /dev/null +++ b/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java @@ -0,0 +1,11 @@ +package chylex.bettercontrols.mixin; +import net.minecraft.client.gui.screen.options.ControlsListWidget.KeyBindingEntry; +import net.minecraft.client.options.KeyBinding; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(KeyBindingEntry.class) +public interface AccessControlsListKeyBinding{ + @Accessor + KeyBinding getBinding(); +} diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java new file mode 100644 index 0000000..9637e30 --- /dev/null +++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java @@ -0,0 +1,37 @@ +package chylex.bettercontrols.mixin; +import chylex.bettercontrols.BetterControlsMod; +import chylex.bettercontrols.input.KeyBindingWithModifier; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.options.ControlsListWidget; +import net.minecraft.client.gui.screen.options.ControlsListWidget.CategoryEntry; +import net.minecraft.client.gui.screen.options.ControlsListWidget.Entry; +import net.minecraft.client.gui.screen.options.ControlsListWidget.KeyBindingEntry; +import net.minecraft.client.gui.screen.options.ControlsOptionsScreen; +import net.minecraft.client.gui.widget.ElementListWidget; +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; + +@Mixin(ControlsListWidget.class) +public abstract class HookControlsListWidget extends ElementListWidget<Entry>{ + public HookControlsListWidget(final MinecraftClient client, final int width, final int height, final int top, final int bottom, final int itemHeight){ + super(client, width, height, top, bottom, itemHeight); + } + + @Inject(method = "<init>", at = @At("TAIL")) + public void init(final ControlsOptionsScreen parent, final MinecraftClient client, final CallbackInfo ci){ + children().removeIf(it -> { + if (it instanceof CategoryEntry && KeyBindingWithModifier.checkCategoryMatches(((AccessControlsListCategory)it).getText())){ + return true; + } + + if (it instanceof KeyBindingEntry && ArrayUtils.contains(BetterControlsMod.config.getAllKeyBindings(), ((AccessControlsListKeyBinding)it).getBinding())){ + return true; + } + + return false; + }); + } +} diff --git a/src/main/resources/mixins.json b/src/main/resources/mixins.json index 3793e3f..bfbb9ef 100644 --- a/src/main/resources/mixins.json +++ b/src/main/resources/mixins.json @@ -6,10 +6,13 @@ "mixins": [ "AccessCameraFields", "AccessClientPlayerFields", + "AccessControlsListCategory", + "AccessControlsListKeyBinding", "AccessKeyBindingFields", "AccessScreenButtons", "HookClientPlayerInputTick", "HookClientPlayerTick", + "HookControlsListWidget", "HookLoadGameOptions", "HookOpenScreen", "HookStickyKeyBindingState"