From 111e2ced1b8d60a44cd2c65186abce59037587cb Mon Sep 17 00:00:00 2001 From: Scribble Date: Sun, 4 Feb 2024 16:57:36 +0100 Subject: [PATCH] [VirtualInput] Fixed multiple issues copyFrom - Fixed unnecessary subtick generation when ignoreFirstUpdate was false - Fixed unnecessary subtick generation by not clearing the charlist of the next keyboard Characters - Fixed chat adding too many characters on a key press - Added support for repeat events Markers - Fixed logger failing in tests --- .../minecrafttas/mctcommon/Configuration.java | 1 - .../mctcommon/LanguageManager.java | 4 +- .../com/minecrafttas/tasmod/TASmodClient.java | 2 +- .../com/minecrafttas/tasmod/gui/InfoHud.java | 1 - .../tasmod/virtual/VirtualInput2.java | 47 +++++++++++++------ .../tasmod/virtual/VirtualKeyboard2.java | 32 ++++++++----- .../tasmod/virtual/VirtualPeripheral.java | 5 ++ .../java/tasmod/virtual/VirtualInputTest.java | 12 +++-- .../tasmod/virtual/VirtualKeyboardTest.java | 2 +- 9 files changed, 70 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/minecrafttas/mctcommon/Configuration.java b/src/main/java/com/minecrafttas/mctcommon/Configuration.java index 8969a073..5d461f89 100644 --- a/src/main/java/com/minecrafttas/mctcommon/Configuration.java +++ b/src/main/java/com/minecrafttas/mctcommon/Configuration.java @@ -10,7 +10,6 @@ import java.util.Map; import java.util.Properties; -import org.apache.commons.io.FileUtils; /** * A very simple configuration class diff --git a/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java b/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java index 0cc90dfd..da3a4bce 100644 --- a/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java +++ b/src/main/java/com/minecrafttas/mctcommon/LanguageManager.java @@ -88,7 +88,9 @@ private static HashMap loadJson(InputStream inputStream) { } Gson gson = new Gson(); HashMap template = new HashMap<>(); - HashMap out = (HashMap) gson.fromJson(new InputStreamReader(inputStream), template.getClass()); + + @SuppressWarnings("unchecked") + HashMap out = (HashMap) gson.fromJson(new InputStreamReader(inputStream), template.getClass()); out.forEach((key, value) -> { value = PATTERN.matcher(value).replaceAll("%$1s"); }); diff --git a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java index ea92d474..279b608b 100644 --- a/src/main/java/com/minecrafttas/tasmod/TASmodClient.java +++ b/src/main/java/com/minecrafttas/tasmod/TASmodClient.java @@ -126,7 +126,7 @@ public void onInitializeClient() { } else { config.reset(ConfigOptions.FileToOpen); } - virtual=new VirtualInput2(); //TODO Move fileOnStart to PlaybackController + virtual=new VirtualInput2(LOGGER); //TODO Move fileOnStart to PlaybackController // Initialize InfoHud hud = new InfoHud(); diff --git a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java index f948bf5b..ae30b176 100644 --- a/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java +++ b/src/main/java/com/minecrafttas/tasmod/gui/InfoHud.java @@ -11,7 +11,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.Display; import org.lwjgl.opengl.GL11; import com.minecrafttas.mctcommon.events.EventClient.EventClientTick; diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput2.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput2.java index 62994df7..9ed658ac 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput2.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualInput2.java @@ -1,17 +1,19 @@ package com.minecrafttas.tasmod.virtual; -import com.minecrafttas.tasmod.TASmod; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + import com.minecrafttas.tasmod.mixin.playbackhooks.MixinMinecraft; import com.minecrafttas.tasmod.util.Ducks; import com.minecrafttas.tasmod.util.LoggerMarkers; import com.minecrafttas.tasmod.util.PointerNormalizer; -import net.minecraft.client.gui.GuiScreen; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; +import net.minecraft.client.gui.GuiScreen; /** * Main component for redirecting inputs.
@@ -21,12 +23,13 @@ *
*/ public class VirtualInput2 { + private final Logger LOGGER; public final VirtualKeyboardInput KEYBOARD; public final VirtualMouseInput MOUSE; public final VirtualCameraAngleInput CAMERA_ANGLE; - public VirtualInput2() { - this(new VirtualKeyboard2(), new VirtualMouse2(), new VirtualCameraAngle2()); + public VirtualInput2(Logger logger) { + this(logger, new VirtualKeyboard2(), new VirtualMouse2(), new VirtualCameraAngle2()); } /** @@ -36,7 +39,8 @@ public VirtualInput2() { * @param preloadedMouse * @param preloadedCamera */ - public VirtualInput2(VirtualKeyboard2 preloadedKeyboard, VirtualMouse2 preloadedMouse, VirtualCameraAngle2 preloadedCamera) { + public VirtualInput2(Logger logger, VirtualKeyboard2 preloadedKeyboard, VirtualMouse2 preloadedMouse, VirtualCameraAngle2 preloadedCamera) { + this.LOGGER = logger; KEYBOARD = new VirtualKeyboardInput(preloadedKeyboard); MOUSE = new VirtualMouseInput(preloadedMouse); CAMERA_ANGLE = new VirtualCameraAngleInput(preloadedCamera); @@ -54,7 +58,7 @@ public VirtualInput2(VirtualKeyboard2 preloadedKeyboard, VirtualMouse2 preloaded */ public void update(GuiScreen currentScreen) { while (Keyboard.next()) { - KEYBOARD.updateNextKeyboard(Keyboard.getEventKey(), Keyboard.getEventKeyState(), Keyboard.getEventCharacter()); + KEYBOARD.updateNextKeyboard(Keyboard.getEventKey(), Keyboard.getEventKeyState(), Keyboard.getEventCharacter(), Keyboard.areRepeatEventsEnabled()); } while (Mouse.next()) { if (currentScreen == null) { @@ -194,10 +198,23 @@ public VirtualKeyboardInput(VirtualKeyboard2 preloadedKeyboard) { * @param character The character of this event */ public void updateNextKeyboard(int keycode, boolean keystate, char character) { - TASmod.LOGGER.debug(LoggerMarkers.Keyboard,"Update: {}, {}, {}, {}", keycode, keystate, character, Keyboard.areRepeatEventsEnabled()); - nextKeyboard.update(keycode, keystate, character); + updateNextKeyboard(keycode, keystate, character, false); } - + + /** + * Updates the next keyboard + * + * @see VirtualInput2#update(GuiScreen) + * @param keycode The keycode of this event + * @param keystate The keystate of this event + * @param character The character of this event + * @param repeatEventsEnabled If repeat events are enabled + */ + public void updateNextKeyboard(int keycode, boolean keystate, char character, boolean repeatEventsEnabled) { + LOGGER.debug(LoggerMarkers.Keyboard, "Update: {}, {}, {}, {}", keycode, keystate, character, repeatEventsEnabled); + nextKeyboard.update(keycode, keystate, character, repeatEventsEnabled); + } + /** * Runs when the next keyboard tick is about to occur.
* Used to load {@link #nextKeyboard} into {@link #currentKeyboard}, creating @@ -316,7 +333,7 @@ public VirtualMouseInput(VirtualMouse2 preloadedMouse) { public void updateNextMouse(int keycode, boolean keystate, int scrollwheel, Integer cursorX, Integer cursorY) { keycode-=100; - TASmod.LOGGER.debug(LoggerMarkers.Mouse,"Update: {} ({}), {}, {}", keycode, VirtualKey2.getName(keycode), keystate, scrollwheel, cursorX, cursorY); + LOGGER.debug(LoggerMarkers.Mouse,"Update: {} ({}), {}, {}", keycode, VirtualKey2.getName(keycode), keystate, scrollwheel, cursorX, cursorY); nextMouse.update(keycode, keystate, scrollwheel, cursorX, cursorY); } diff --git a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard2.java b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard2.java index f14f9091..c58734f2 100644 --- a/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard2.java +++ b/src/main/java/com/minecrafttas/tasmod/virtual/VirtualKeyboard2.java @@ -3,6 +3,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Queue; import java.util.Set; @@ -84,7 +85,7 @@ public class VirtualKeyboard2 extends VirtualPeripheral implem * Creates an empty parent keyboard with all keys unpressed */ public VirtualKeyboard2() { - this(new HashSet<>(), new ArrayList<>(), new ArrayList<>(), true); + this(new LinkedHashSet<>(), new ArrayList<>(), new ArrayList<>(), true); } /** @@ -123,15 +124,19 @@ public VirtualKeyboard2(Set pressedKeys, List charList, List * @param keystate The keystate of this key, true for pressed * @param keycharacter The character that is associated with that key. Can change between keyboards or whenever shift is held in combination. */ - public void update(int keycode, boolean keystate, char keycharacter) { + public void update(int keycode, boolean keystate, char keycharacter, boolean repeatEventsEnabled) { if(isParent() && !ignoreFirstUpdate()) { addSubtick(clone()); } charList.clear(); - addChar(keycharacter); + addChar(keycharacter, repeatEventsEnabled); setPressed(keycode, keystate); } + public void update(int keycode, boolean keystate, char keycharacter) { + update(keycode, keystate, keycharacter, false); + } + @Override public void setPressed(int keycode, boolean keystate) { if (keycode >= 0) { // Keyboard keys always have a keycode larger or equal than 0 @@ -149,7 +154,6 @@ public void setPressed(int keycode, boolean keystate) { * @param reference The queue to fill. Passed in by reference. */ public void getDifference(VirtualKeyboard2 nextKeyboard, Queue reference) { - charQueue.addAll(nextKeyboard.charList); /* Calculate symmetric difference of keycodes */ @@ -161,11 +165,11 @@ public void getDifference(VirtualKeyboard2 nextKeyboard, Queue { + for(int key : pressedKeys) { if (!nextKeyboard.getPressedKeys().contains(key)) { reference.add(new VirtualKeyboardEvent(key, false, Character.MIN_VALUE)); } - }); + } /* Calculate pressed keys @@ -174,11 +178,13 @@ public void getDifference(VirtualKeyboard2 nextKeyboard, Queue { + int lastKey = 0; + for(int key : nextKeyboard.getPressedKeys()) { + lastKey = key; if (!this.pressedKeys.contains(key)) { reference.add(new VirtualKeyboardEvent(key, true, getOrMinChar(charQueue.poll()))); } - }); + } /* Add the rest of the characters as keyboard events. @@ -191,7 +197,7 @@ public void getDifference(VirtualKeyboard2 nextKeyboard, Queue