From 739d5b2807f59d36354e9f9bcb99081358783e65 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Fri, 28 Aug 2020 15:58:02 +0200 Subject: [PATCH] Add key hints to buttons which have corresponding keybindings --- .../replaymod/core/KeyBindingRegistry.java | 12 ++++++---- .../com/replaymod/core/versions/MCVer.java | 22 +++++++++++++++++++ .../com/replaymod/extras/HotkeyButtons.java | 22 ++----------------- .../com/replaymod/replay/ReplayModReplay.java | 3 ++- .../replay/gui/overlay/GuiReplayOverlay.java | 10 +++++++-- .../simplepathing/ReplayModSimplePathing.java | 7 ++++-- .../simplepathing/gui/GuiPathing.java | 17 +++++++++----- 7 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/replaymod/core/KeyBindingRegistry.java b/src/main/java/com/replaymod/core/KeyBindingRegistry.java index addb407e..bcffd55a 100644 --- a/src/main/java/com/replaymod/core/KeyBindingRegistry.java +++ b/src/main/java/com/replaymod/core/KeyBindingRegistry.java @@ -51,12 +51,16 @@ public class KeyBindingRegistry extends EventRegistrations { private Multimap repeatedKeyBindingHandlers = ArrayListMultimap.create(); private Multimap rawHandlers = ArrayListMultimap.create(); - public void registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { - keyBindingHandlers.put(registerKeyBinding(name, keyCode, onlyInRepay), whenPressed); + public KeyBinding registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { + KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay); + keyBindingHandlers.put(keyBinding, whenPressed); + return keyBinding; } - public void registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { - repeatedKeyBindingHandlers.put(registerKeyBinding(name, keyCode, onlyInRepay), whenPressed); + public KeyBinding registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { + KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay); + repeatedKeyBindingHandlers.put(keyBinding, whenPressed); + return keyBinding; } private KeyBinding registerKeyBinding(String name, int keyCode, boolean onlyInRepay) { diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index f6295519..5d37a75e 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -7,6 +7,7 @@ import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersi import com.replaymod.replaystudio.us.myles.ViaVersion.packets.State; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.options.KeyBinding; import net.minecraft.client.world.ClientWorld; import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.entity.EntityRenderDispatcher; @@ -748,6 +749,23 @@ public class MCVer { //#endif } + public static String getBoundKey(KeyBinding keyBinding) { + try { + //#if MC>=11600 + return keyBinding.getBoundKeyLocalizedText().asString(); + //#else + //#if MC>=11400 + //$$ return keyBinding.getLocalizedName(); + //#else + //$$ return Keyboard.getKeyName(keyBinding.getKeyCode()); + //#endif + //#endif + } catch (ArrayIndexOutOfBoundsException e) { + // Apparently windows likes to press strange keys, see https://www.replaymod.com/forum/thread/55 + return "Unknown"; + } + } + //#if MC>=11400 private static Boolean hasOptifine; public static boolean hasOptifine() { @@ -893,6 +911,10 @@ public class MCVer { //$$ public static boolean getEventKeyState() { //$$ return org.lwjgl.input.Keyboard.getEventKeyState(); //$$ } + //$$ + //$$ public static String getKeyName(int code) { + //$$ return org.lwjgl.input.Keyboard.getKeyName(code); + //$$ } //#endif } } diff --git a/src/main/java/com/replaymod/extras/HotkeyButtons.java b/src/main/java/com/replaymod/extras/HotkeyButtons.java index 08d37b19..26a56cb9 100644 --- a/src/main/java/com/replaymod/extras/HotkeyButtons.java +++ b/src/main/java/com/replaymod/extras/HotkeyButtons.java @@ -3,6 +3,7 @@ package com.replaymod.extras; import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.ReplayMod; import com.replaymod.core.mixin.KeyBindingAccessor; +import com.replaymod.core.versions.MCVer; import com.replaymod.replay.events.ReplayOpenedCallback; import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import de.johni0702.minecraft.gui.GuiRenderer; @@ -22,11 +23,6 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import net.minecraft.client.resource.language.I18n; -//#if MC>=11400 -//#else -//$$ import org.lwjgl.input.Keyboard; -//#endif - import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -80,21 +76,7 @@ public class HotkeyButtons extends EventRegistrations implements Extra { @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { // There doesn't seem to be an KeyBindingUpdate event, so we'll just update it every time - String keyName = "???"; - try { - //#if MC>=11600 - keyName = keyBinding.getBoundKeyLocalizedText().asString(); - //#else - //#if MC>=11400 - //$$ keyName = keyBinding.getLocalizedName(); - //#else - //$$ keyName = Keyboard.getKeyName(keyBinding.getKeyCode()); - //#endif - //#endif - } catch (ArrayIndexOutOfBoundsException e) { - // Apparently windows likes to press strange keys, see https://www.replaymod.com/forum/thread/55 - } - setLabel(keyName); + setLabel(MCVer.getBoundKey(keyBinding)); super.draw(renderer, size, renderInfo); } }.onClick(() -> { diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index 6bc20a29..868066d9 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -42,6 +42,7 @@ public class ReplayModReplay implements Module { public static ReplayModReplay instance; private ReplayMod core; + public KeyBinding keyPlayPause; private final CameraControllerRegistry cameraControllerRegistry = new CameraControllerRegistry(); @@ -116,7 +117,7 @@ public class ReplayModReplay implements Module { } }, true); - registry.registerKeyBinding("replaymod.input.playpause", Keyboard.KEY_P, new Runnable() { + keyPlayPause = registry.registerKeyBinding("replaymod.input.playpause", Keyboard.KEY_P, new Runnable() { @Override public void run() { if (replayHandler != null) { diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java index 0ef7cec4..a5799aca 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java @@ -3,6 +3,7 @@ package com.replaymod.replay.gui.overlay; import com.replaymod.core.ReplayMod; import com.replaymod.core.versions.MCVer.Keyboard; import com.replaymod.replay.ReplayHandler; +import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplaySender; import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.RenderInfo; @@ -31,9 +32,12 @@ import com.replaymod.core.events.KeyEventCallback; //#endif import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; +import static com.replaymod.core.versions.MCVer.getBoundKey; public class GuiReplayOverlay extends AbstractGuiOverlay { + private final ReplayModReplay mod = ReplayModReplay.instance; + public final GuiPanel topPanel = new GuiPanel(this) .setLayout(new HorizontalLayout(HorizontalLayout.Alignment.LEFT).setSpacing(5)); public final GuiTexturedButton playPauseButton = new GuiTexturedButton() { @@ -41,11 +45,13 @@ public class GuiReplayOverlay extends AbstractGuiOverlay { public GuiElement getTooltip(RenderInfo renderInfo) { GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo); if (tooltip != null) { + String label; if (getTextureNormal().getY() == 0) { // Play button - tooltip.setI18nText("replaymod.gui.ingame.menu.unpause"); + label = "replaymod.gui.ingame.menu.unpause"; } else { // Pause button - tooltip.setI18nText("replaymod.gui.ingame.menu.pause"); + label = "replaymod.gui.ingame.menu.pause"; } + tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyPlayPause) + ")"); } return tooltip; } diff --git a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java index 7674df7c..bb8e8326 100644 --- a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java +++ b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java @@ -21,6 +21,7 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.simplepathing.preview.PathPreview; +import net.minecraft.client.options.KeyBinding; import net.minecraft.util.crash.CrashReport; import net.minecraft.util.crash.CrashException; import org.apache.logging.log4j.LogManager; @@ -39,6 +40,8 @@ public class ReplayModSimplePathing extends EventRegistrations implements Module public static ReplayModSimplePathing instance; private ReplayMod core; + public KeyBinding keyPositionKeyframe; + public KeyBinding keyTimeKeyframe; public static Logger LOGGER = LogManager.getLogger(); @@ -91,13 +94,13 @@ public class ReplayModSimplePathing extends EventRegistrations implements Module core.getKeyBindingRegistry().registerRaw(Keyboard.KEY_DELETE, () -> { if (guiPathing != null) guiPathing.deleteButtonPressed(); }); - core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positionkeyframe", Keyboard.KEY_I, () -> { + keyPositionKeyframe = core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positionkeyframe", Keyboard.KEY_I, () -> { if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.POSITION, false); }, true); core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positiononlykeyframe", 0, () -> { if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.POSITION, true); }, true); - core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.timekeyframe", Keyboard.KEY_O, () -> { + keyTimeKeyframe = core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.timekeyframe", Keyboard.KEY_O, () -> { if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.TIME, false); }, true); core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.bothkeyframes", 0, () -> { diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java index 9318d0ad..968f21f9 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java @@ -49,6 +49,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; +import net.minecraft.client.resource.language.I18n; import net.minecraft.util.crash.CrashReport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -124,19 +125,21 @@ public class GuiPathing { public GuiElement getTooltip(RenderInfo renderInfo) { GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo); if (tooltip != null) { + String label; if (getTextureNormal().getY() == 40) { // Add keyframe if (getTextureNormal().getX() == 0) { // Position - tooltip.setI18nText("replaymod.gui.ingame.menu.addposkeyframe"); + label = "replaymod.gui.ingame.menu.addposkeyframe"; } else { // Spectator - tooltip.setI18nText("replaymod.gui.ingame.menu.addspeckeyframe"); + label = "replaymod.gui.ingame.menu.addspeckeyframe"; } } else { // Remove keyframe if (getTextureNormal().getX() == 0) { // Position - tooltip.setI18nText("replaymod.gui.ingame.menu.removeposkeyframe"); + label = "replaymod.gui.ingame.menu.removeposkeyframe"; } else { // Spectator - tooltip.setI18nText("replaymod.gui.ingame.menu.removespeckeyframe"); + label = "replaymod.gui.ingame.menu.removespeckeyframe"; } } + tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyPositionKeyframe) + ")"); } return tooltip; } @@ -147,11 +150,13 @@ public class GuiPathing { public GuiElement getTooltip(RenderInfo renderInfo) { GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo); if (tooltip != null) { + String label; if (getTextureNormal().getY() == 80) { // Add time keyframe - tooltip.setI18nText("replaymod.gui.ingame.menu.addtimekeyframe"); + label = "replaymod.gui.ingame.menu.addtimekeyframe"; } else { // Remove time keyframe - tooltip.setI18nText("replaymod.gui.ingame.menu.removetimekeyframe"); + label = "replaymod.gui.ingame.menu.removetimekeyframe"; } + tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyTimeKeyframe) + ")"); } return tooltip; }