From cc26988ba260457438c68b000c38cacc04fc4cdf Mon Sep 17 00:00:00 2001 From: isXander Date: Mon, 26 Jun 2023 17:42:32 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20issues=20with=20mixed=20in?= =?UTF-8?q?put=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../isxander/controlify/ingame/DualInput.java | 32 +++++++++++++++++++ .../controlify/ingame/InGameInputHandler.java | 8 ----- .../core/ClientPacketListenerMixin.java | 13 +++++--- 3 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 src/main/java/dev/isxander/controlify/ingame/DualInput.java diff --git a/src/main/java/dev/isxander/controlify/ingame/DualInput.java b/src/main/java/dev/isxander/controlify/ingame/DualInput.java new file mode 100644 index 0000000..2298112 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/ingame/DualInput.java @@ -0,0 +1,32 @@ +package dev.isxander.controlify.ingame; + +import net.minecraft.client.player.Input; +import net.minecraft.util.Mth; +import org.apache.commons.lang3.Validate; + +public class DualInput extends Input { + private final Input input1, input2; + + public DualInput(Input input1, Input input2) { + Validate.isTrue(!(input1 instanceof DualInput), "Cannot nest DualInputs"); + Validate.isTrue(!(input2 instanceof DualInput), "Cannot nest DualInputs"); + + this.input1 = input1; + this.input2 = input2; + } + + @Override + public void tick(boolean slowDown, float movementMultiplier) { + input1.tick(slowDown, movementMultiplier); + input2.tick(slowDown, movementMultiplier); + + this.left = input1.left || input2.left; + this.right = input1.right || input2.right; + this.up = input1.up || input2.up; + this.down = input1.down || input2.down; + this.jumping = input1.jumping || input2.jumping; + this.shiftKeyDown = input1.shiftKeyDown || input2.shiftKeyDown; + this.leftImpulse = Mth.clamp(input1.leftImpulse + input2.leftImpulse, -1, 1); + this.forwardImpulse = Mth.clamp(input1.forwardImpulse + input2.forwardImpulse, -1, 1); + } +} diff --git a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java index 20d78b0..f8f7b0c 100644 --- a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java +++ b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java @@ -41,14 +41,6 @@ public class InGameInputHandler { this.controller = controller; this.minecraft = Minecraft.getInstance(); this.dropRepeatHelper = new NavigationHelper(20, 1); - - ControlifyEvents.INPUT_MODE_CHANGED.register(mode -> { - if (minecraft.player != null) { - minecraft.player.input = mode.isController() - ? new ControllerPlayerMovement(controller, minecraft.player) - : new KeyboardInput(minecraft.options); - } - }); } public void inputTick() { diff --git a/src/main/java/dev/isxander/controlify/mixins/core/ClientPacketListenerMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/ClientPacketListenerMixin.java index 5b6b2ab..24e727d 100644 --- a/src/main/java/dev/isxander/controlify/mixins/core/ClientPacketListenerMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/ClientPacketListenerMixin.java @@ -1,11 +1,12 @@ package dev.isxander.controlify.mixins.core; import com.llamalad7.mixinextras.sugar.Local; -import dev.isxander.controlify.Controlify; -import dev.isxander.controlify.InputMode; +import dev.isxander.controlify.api.ControlifyApi; import dev.isxander.controlify.ingame.ControllerPlayerMovement; +import dev.isxander.controlify.ingame.DualInput; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.player.KeyboardInput; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.protocol.game.ClientboundLoginPacket; import net.minecraft.network.protocol.game.ClientboundRespawnPacket; @@ -35,7 +36,11 @@ public class ClientPacketListenerMixin { } private void overrideInput(LocalPlayer player) { - if (Controlify.instance().currentInputMode().isController() && player != null) - player.input = new ControllerPlayerMovement(Controlify.instance().currentController(), player); + if (player == null) + return; + + ControlifyApi.get().getCurrentController().ifPresent(controller -> { + player.input = new DualInput(new KeyboardInput(minecraft.options), new ControllerPlayerMovement(controller, player)); + }); } }