diff --git a/src/main/java/com/lovetropics/extras/mixin/fix/KeyMappingLookupMixin.java b/src/main/java/com/lovetropics/extras/mixin/fix/KeyMappingLookupMixin.java new file mode 100644 index 00000000..84633582 --- /dev/null +++ b/src/main/java/com/lovetropics/extras/mixin/fix/KeyMappingLookupMixin.java @@ -0,0 +1,43 @@ +package com.lovetropics.extras.mixin.fix; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.minecraftforge.client.settings.KeyMappingLookup; +import net.minecraftforge.client.settings.KeyModifier; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.*; + +@Mixin(value = KeyMappingLookup.class, remap = false) +public class KeyMappingLookupMixin { + @Shadow(remap = false) + @Final + private static EnumMap>> map; + + /** + * @author Su5eD + * @reason https://github.com/neoforged/NeoForge/pull/171 + */ + @Overwrite(remap = false) + public List getAll(final InputConstants.Key keyCode) { + final List matchingBindings = new ArrayList<>(); + final KeyModifier activeModifier = KeyModifier.getActiveModifier(); + // Apply active modifier only if the pressed key is not the modifier itself + // Otherwise, look for key bindings without modifiers + if (activeModifier == KeyModifier.NONE || activeModifier.matches(keyCode) || !matchingBindings.addAll(findKeybinds(keyCode, activeModifier))) { + matchingBindings.addAll(findKeybinds(keyCode, KeyModifier.NONE)); + } + return matchingBindings; + } + + private List findKeybinds(final InputConstants.Key keyCode, final KeyModifier modifier) { + final Collection modifierBindings = map.get(modifier).get(keyCode); + if (modifierBindings != null) { + return modifierBindings.stream().filter(binding -> binding.isActiveAndMatches(keyCode)).toList(); + } + return List.of(); + } +} diff --git a/src/main/java/com/lovetropics/extras/mixin/SignableCommandMixin.java b/src/main/java/com/lovetropics/extras/mixin/fix/SignableCommandMixin.java similarity index 97% rename from src/main/java/com/lovetropics/extras/mixin/SignableCommandMixin.java rename to src/main/java/com/lovetropics/extras/mixin/fix/SignableCommandMixin.java index 245384a1..a4990715 100644 --- a/src/main/java/com/lovetropics/extras/mixin/SignableCommandMixin.java +++ b/src/main/java/com/lovetropics/extras/mixin/fix/SignableCommandMixin.java @@ -1,4 +1,4 @@ -package com.lovetropics.extras.mixin; +package com.lovetropics.extras.mixin.fix; import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.context.CommandContextBuilder; diff --git a/src/main/resources/ltextras.mixins.json b/src/main/resources/ltextras.mixins.json index aad58e9e..cb36310d 100644 --- a/src/main/resources/ltextras.mixins.json +++ b/src/main/resources/ltextras.mixins.json @@ -16,13 +16,14 @@ "LivingEntityMixin", "PlayerListMixin", "ScaffoldingBlockMixin", - "SignableCommandMixin", "TeamCommandMixin", "collectible.ItemStackMixin", "collectible.MerchantResultSlotMixin", "collectible.ServerPlayerGameModeMixin", "collectible.SlotMixin", "fix.ComponentArgumentMixin", + "fix.KeyMappingLookupMixin", + "fix.SignableCommandMixin", "perf.BiomeManagerMixin", "perf.ChunkManagerMixin", "tag.MappedRegistryMixin",