From 0c021b5b36a438523ebe2e4ae3c8d17139871b70 Mon Sep 17 00:00:00 2001 From: nahida <3096260017@qq.com> Date: Thu, 15 Oct 2026 08:41:07 +0800 Subject: [PATCH] fix modded key bindings never being registered on neoforge --- .../controlify/neoforge/mixins/OptionsMixin.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/neoforge/java/dev/isxander/controlify/neoforge/mixins/OptionsMixin.java b/src/neoforge/java/dev/isxander/controlify/neoforge/mixins/OptionsMixin.java index f2a1c493d..c968283e3 100644 --- a/src/neoforge/java/dev/isxander/controlify/neoforge/mixins/OptionsMixin.java +++ b/src/neoforge/java/dev/isxander/controlify/neoforge/mixins/OptionsMixin.java @@ -9,6 +9,7 @@ import dev.isxander.controlify.neoforge.platform.VanillaKeyMappingHolder; import net.minecraft.client.KeyMapping; import net.minecraft.client.Options; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -24,7 +25,19 @@ public class OptionsMixin implements VanillaKeyMappingHolder { @Unique private KeyMapping[] controlify$vanillaKeyMappings; - @Inject(method = "", at = @At("RETURN")) + // Capture the vanilla key mappings as soon as the vanilla array is assigned. + // NeoForge appends modded key mappings to this field inside the constructor, + // so capturing at RETURN would make the "vanilla" snapshot include modded keys + // and the modded-key diff in NeoforgePlatformClientImpl would always be empty. + @Inject( + method = "", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;", + opcode = Opcodes.PUTFIELD, + shift = At.Shift.AFTER + ) + ) private void storeVanillaKeybindsBeforeModification(CallbackInfo ci) { this.controlify$vanillaKeyMappings = Arrays.copyOf(keyMappings, keyMappings.length); }