From 537795f9ca594c35ac4db4a70498f98d575f034e Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sun, 28 Feb 2021 11:55:58 +0100 Subject: [PATCH] Backport contextual key bindings to 1.12.2 and below (closes #478) --- .../mixin/Mixin_ContextualKeyBindings.java | 29 ++++++++++++++----- .../com/replaymod/core/versions/Patterns.java | 9 ++++++ .../com/replaymod/replay/ReplayModReplay.java | 4 --- src/main/resources/mixins.core.replaymod.json | 2 +- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/replaymod/core/mixin/Mixin_ContextualKeyBindings.java b/src/main/java/com/replaymod/core/mixin/Mixin_ContextualKeyBindings.java index ad7b8093..6b246c3f 100644 --- a/src/main/java/com/replaymod/core/mixin/Mixin_ContextualKeyBindings.java +++ b/src/main/java/com/replaymod/core/mixin/Mixin_ContextualKeyBindings.java @@ -1,4 +1,3 @@ -//#if MC>=11400 package com.replaymod.core.mixin; import com.replaymod.core.ReplayMod; @@ -13,6 +12,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -24,16 +24,26 @@ import java.util.Set; */ @Mixin(KeyBinding.class) public class Mixin_ContextualKeyBindings { + //#if MC>=11200 @Shadow @Final private static Map keysById; + @Unique private static Collection keyBindings() { return Mixin_ContextualKeyBindings.keysById.values(); } + //#else + //$$ @Shadow @Final private static List KEYBIND_ARRAY; + //$$ @Unique private static Collection keyBindings() { return Mixin_ContextualKeyBindings.KEYBIND_ARRAY; } + //#endif @Unique private static final List temporarilyRemoved = new ArrayList<>(); @Inject(method = "updateKeysByCode", at = @At("HEAD")) private static void preContextualKeyBindings(CallbackInfo ci) { - Set onlyInReplay = ReplayMod.instance.getKeyBindingRegistry().getOnlyInReplay(); + ReplayMod mod = ReplayMod.instance; + if (mod == null) { + return; + } + Set onlyInReplay = mod.getKeyBindingRegistry().getOnlyInReplay(); if (ReplayModReplay.instance.getReplayHandler() != null) { // In replay, remove any conflicting key bindings, so that ours are guaranteed in - Mixin_ContextualKeyBindings.keysById.values().removeIf(keyBinding -> { + keyBindings().removeIf(keyBinding -> { for (KeyBinding exclusiveBinding : onlyInReplay) { if (keyBinding.equals(exclusiveBinding) && keyBinding != exclusiveBinding) { temporarilyRemoved.add(keyBinding); @@ -44,20 +54,25 @@ public class Mixin_ContextualKeyBindings { }); } else { // Not in a replay, remove all replay-exclusive keybindings - for (KeyBinding keyBinding : onlyInReplay) { - if (Mixin_ContextualKeyBindings.keysById.remove(keyBinding.getTranslationKey()) != null) { + keyBindings().removeIf(keyBinding -> { + if (onlyInReplay.contains(keyBinding)) { temporarilyRemoved.add(keyBinding); + return true; } - } + return false; + }); } } @Inject(method = "updateKeysByCode", at = @At("RETURN")) private static void postContextualKeyBindings(CallbackInfo ci) { for (KeyBinding keyBinding : temporarilyRemoved) { + //#if MC>=11200 Mixin_ContextualKeyBindings.keysById.put(keyBinding.getTranslationKey(), keyBinding); + //#else + //$$ keyBindings().add(keyBinding); + //#endif } temporarilyRemoved.clear(); } } -//#endif diff --git a/src/main/java/com/replaymod/core/versions/Patterns.java b/src/main/java/com/replaymod/core/versions/Patterns.java index 65570e88..8c62dd6c 100644 --- a/src/main/java/com/replaymod/core/versions/Patterns.java +++ b/src/main/java/com/replaymod/core/versions/Patterns.java @@ -373,4 +373,13 @@ class Patterns { //$$ return PositionedSoundRecord.createPositionedSoundRecord(sound, pitch); //#endif } + + @Pattern + private static boolean isKeyBindingConflicting(KeyBinding a, KeyBinding b) { + //#if MC>=10900 + return a.equals(b); + //#else + //$$ return (a.getKeyCode() == b.getKeyCode()); + //#endif + } } diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index 8d4e050c..05113411 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -186,18 +186,14 @@ public class ReplayModReplay implements Module { } } replayHandler = new ReplayHandler(replayFile, asyncMode); - //#if MC>=11400 KeyBinding.updateKeysByCode(); // see Mixin_ContextualKeyBindings - //#endif return replayHandler; } public void forcefullyStopReplay() { replayHandler = null; - //#if MC>=11400 KeyBinding.updateKeysByCode(); // see Mixin_ContextualKeyBindings - //#endif } public ReplayMod getCore() { diff --git a/src/main/resources/mixins.core.replaymod.json b/src/main/resources/mixins.core.replaymod.json index c002fc17..c0b0a787 100644 --- a/src/main/resources/mixins.core.replaymod.json +++ b/src/main/resources/mixins.core.replaymod.json @@ -4,9 +4,9 @@ "mixins": [], "server": [], "client": [ + "Mixin_ContextualKeyBindings", //#if MC>=11400 "AbstractButtonWidgetAccessor", - "Mixin_ContextualKeyBindings", "MixinGameRenderer", "Mixin_HideDynamicResourcePacks", "Mixin_RegisterDynamicResourcePacks",