From 6a686d11f3abfbab2de01316915e1b63fc636d5d Mon Sep 17 00:00:00 2001 From: Brady Date: Wed, 1 Aug 2018 18:25:23 -0700 Subject: [PATCH] Fix issue with InputOverrideHandler that could cause while loop holdups --- .../java/baritone/bot/GameEventHandler.java | 22 ++++++++++++-- .../baritone/bot/InputOverrideHandler.java | 4 +-- .../bot/event/IGameEventListener.java | 7 ++++- .../launch/mixins/MixinKeyBinding.java | 29 ------------------- .../launch/mixins/MixinMinecraft.java | 8 +++++ 5 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/main/java/baritone/bot/GameEventHandler.java b/src/main/java/baritone/bot/GameEventHandler.java index 021d148c..a705e9d9 100755 --- a/src/main/java/baritone/bot/GameEventHandler.java +++ b/src/main/java/baritone/bot/GameEventHandler.java @@ -1,7 +1,8 @@ package baritone.bot; import baritone.bot.event.IGameEventListener; -import baritone.Baritone; +import net.minecraft.client.settings.KeyBinding; +import org.lwjgl.input.Keyboard; /** * @author Brady @@ -13,6 +14,23 @@ public final class GameEventHandler implements IGameEventListener { @Override public final void onTick() { - Baritone.onTick(); + baritone.Baritone.onTick(); + } + + @Override + public void onProcessKeyBinds() { + InputOverrideHandler inputHandler = Baritone.INSTANCE.getInputOverrideHandler(); + + // Simulate the key being held down this tick + for (InputOverrideHandler.Input input : InputOverrideHandler.Input.values()) { + KeyBinding keyBinding = input.getKeyBinding(); + + if (inputHandler.isInputForcedDown(keyBinding) && !keyBinding.isKeyDown()) { + int keyCode = keyBinding.getKeyCode(); + + if (keyCode < Keyboard.KEYBOARD_SIZE) + KeyBinding.onTick(keyCode < 0 ? keyCode + 100 : keyCode); + } + } } } diff --git a/src/main/java/baritone/bot/InputOverrideHandler.java b/src/main/java/baritone/bot/InputOverrideHandler.java index e4924b4d..8b81831f 100755 --- a/src/main/java/baritone/bot/InputOverrideHandler.java +++ b/src/main/java/baritone/bot/InputOverrideHandler.java @@ -25,7 +25,7 @@ public final class InputOverrideHandler implements Helper { private final Map inputForceStateMap = new HashMap<>(); /** - * Maps keycodes to whether or not we are forcing their state down + * Maps keycodes to whether or not we are forcing their state down. */ private final Map keyCodeForceStateMap = new HashMap<>(); @@ -52,7 +52,7 @@ public final class InputOverrideHandler implements Helper { /** * A redirection in multiple places of {@link Keyboard#isKeyDown}. * - * @return Whether or not the specified key is down or overriden. + * @return Whether or not the specified key is down or overridden. */ public boolean isKeyDown(int keyCode) { return Keyboard.isKeyDown(keyCode) || keyCodeForceStateMap.computeIfAbsent(keyCode, k -> false); diff --git a/src/main/java/baritone/bot/event/IGameEventListener.java b/src/main/java/baritone/bot/event/IGameEventListener.java index 9bfd6107..3b1e7680 100755 --- a/src/main/java/baritone/bot/event/IGameEventListener.java +++ b/src/main/java/baritone/bot/event/IGameEventListener.java @@ -9,7 +9,12 @@ import net.minecraft.client.Minecraft; public interface IGameEventListener { /** - * Run once per game tick from {@link Minecraft#runTick}. + * Run once per game tick from {@link Minecraft#runTick()} */ void onTick(); + + /** + * Run once per game tick from {@link Minecraft#processKeyBinds()} + */ + void onProcessKeyBinds(); } diff --git a/src/main/java/baritone/launch/mixins/MixinKeyBinding.java b/src/main/java/baritone/launch/mixins/MixinKeyBinding.java index 74dfb6cf..1dfeaf83 100755 --- a/src/main/java/baritone/launch/mixins/MixinKeyBinding.java +++ b/src/main/java/baritone/launch/mixins/MixinKeyBinding.java @@ -2,11 +2,9 @@ package baritone.launch.mixins; import baritone.bot.Baritone; import net.minecraft.client.settings.KeyBinding; -import net.minecraft.util.IntHashMap; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; /** @@ -16,33 +14,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(KeyBinding.class) public abstract class MixinKeyBinding { - @Redirect( - method = "onTick", - at = @At( - value = "INVOKE", - target = "net/minecraft/util/IntHashMap.lookup(I)Ljava/lang/Object;" - ) - ) - private static Object lookup(IntHashMap HASH, int keyCode) { - KeyBinding keyBinding = HASH.lookup(keyCode); - - // If we're overriding the key state, we don't want to be incrementing the pressTime - if (keyBinding != null && Baritone.INSTANCE.getInputOverrideHandler().isInputForcedDown(keyBinding)) - return null; - - return keyBinding; - } - - @Inject( - method = "isPressed", - at = @At("HEAD"), - cancellable = true - ) - private void isPressed(CallbackInfoReturnable cir) { - if (Baritone.INSTANCE.getInputOverrideHandler().isInputForcedDown((KeyBinding) (Object) this)) - cir.setReturnValue(true); - } - @Inject( method = "isKeyDown", at = @At("HEAD"), diff --git a/src/main/java/baritone/launch/mixins/MixinMinecraft.java b/src/main/java/baritone/launch/mixins/MixinMinecraft.java index 354d3f82..0f6948eb 100755 --- a/src/main/java/baritone/launch/mixins/MixinMinecraft.java +++ b/src/main/java/baritone/launch/mixins/MixinMinecraft.java @@ -57,6 +57,14 @@ public class MixinMinecraft { return Baritone.INSTANCE.getInputOverrideHandler().isKeyDown(keyCode); } + @Inject( + method = "processKeyBinds", + at = @At("HEAD") + ) + private void runTickKeyboard(CallbackInfo ci) { + Baritone.INSTANCE.getGameEventHandler().onProcessKeyBinds(); + } + @Redirect( method = { "setIngameFocus",