Skip to content

Commit 59b1071

Browse files
committed
InventoryMove with proper keybinds
Sorry beanbag had to redo it as too much broke on rebase
1 parent 10618d6 commit 59b1071

File tree

6 files changed

+67
-35
lines changed

6 files changed

+67
-35
lines changed

src/main/java/com/lambda/mixin/MinecraftClientMixin.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717

1818
package com.lambda.mixin;
1919

20-
import com.lambda.Lambda;
2120
import com.lambda.event.EventFlow;
2221
import com.lambda.event.events.ClientEvent;
2322
import com.lambda.event.events.InventoryEvent;
2423
import com.lambda.event.events.TickEvent;
2524
import com.lambda.gui.DearImGui;
2625
import com.lambda.module.modules.player.Interact;
26+
import com.lambda.module.modules.player.InventoryMove;
2727
import com.lambda.module.modules.player.PacketMine;
2828
import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
2929
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
@@ -33,6 +33,7 @@
3333
import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider;
3434
import net.minecraft.client.network.ClientPlayerEntity;
3535
import net.minecraft.client.network.ClientPlayerInteractionManager;
36+
import net.minecraft.client.option.KeyBinding;
3637
import net.minecraft.client.render.WorldRenderer;
3738
import net.minecraft.client.sound.SoundManager;
3839
import net.minecraft.util.Hand;
@@ -55,6 +56,9 @@ public class MinecraftClientMixin {
5556
@Nullable
5657
public HitResult crosshairTarget;
5758

59+
@Shadow
60+
public int itemUseCooldown;
61+
5862
@Inject(method = "close", at = @At("HEAD"))
5963
void closeImGui(CallbackInfo ci) {
6064
DearImGui.INSTANCE.destroy();
@@ -151,6 +155,19 @@ boolean redirectMultiActon(ClientPlayerInteractionManager instance) {
151155
void injectFastPlace(CallbackInfo ci) {
152156
if (!Interact.INSTANCE.isEnabled()) return;
153157

154-
Lambda.getMc().itemUseCooldown = Interact.getPlaceDelay();
158+
itemUseCooldown = Interact.getPlaceDelay();
159+
}
160+
161+
@Redirect(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/KeyBinding;unpressAll()V"))
162+
private void redirectUnPressAll() {
163+
if (InventoryMove.getShouldMove()) {
164+
KeyBinding.unpressAll();
165+
return;
166+
}
167+
for (KeyBinding bind : KeyBinding.KEYS_BY_ID.values()) {
168+
if (!InventoryMove.isKeyMovementRelated(bind.boundKey.getCode())) {
169+
bind.reset();
170+
}
171+
}
155172
}
156173
}

src/main/java/com/lambda/mixin/input/KeyboardMixin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919

2020
import com.lambda.event.EventFlow;
2121
import com.lambda.event.events.KeyboardEvent;
22+
import com.lambda.module.modules.player.InventoryMove;
2223
import net.minecraft.client.Keyboard;
24+
import net.minecraft.client.option.KeyBinding;
25+
import net.minecraft.client.util.InputUtil;
2326
import org.spongepowered.asm.mixin.Mixin;
2427
import org.spongepowered.asm.mixin.injection.At;
2528
import org.spongepowered.asm.mixin.injection.Inject;
@@ -40,4 +43,11 @@ private void onChar(long window, int codePoint, int modifiers, CallbackInfo ci)
4043
EventFlow.post(new KeyboardEvent.Char(c));
4144
}
4245
}
46+
47+
@Inject(method = "onKey", at = @At("RETURN"))
48+
private void onKeyTail(long window, int key, int scancode, int action, int modifiers, CallbackInfo ci) {
49+
if (!InventoryMove.getShouldMove() || !InventoryMove.isKeyMovementRelated(key)) return;
50+
InputUtil.Key fromCode = InputUtil.fromKeyCode(key, scancode);
51+
KeyBinding.setKeyPressed(fromCode, action != 0);
52+
}
4353
}

src/main/kotlin/com/lambda/config/AbstractSetting.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ abstract class AbstractSetting<T : Any>(
158158
groups.add(path.toList())
159159
}
160160

161+
fun group(path: NamedEnum?) = apply {
162+
if (path != null) {
163+
groups.add(listOf(path))
164+
}
165+
}
166+
161167
fun reset(silent: Boolean = false) {
162168
if (!silent && value == defaultValue) {
163169
ConfigCommand.info(notChangedMessage())

src/main/kotlin/com/lambda/config/groups/RotationSettings.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import kotlin.random.Random
3030

3131
class RotationSettings(
3232
c: Configurable,
33-
baseGroup: NamedEnum,
33+
baseGroup: NamedEnum? = null,
3434
vis: () -> Boolean = { true }
3535
) : RotationConfig {
3636
override var rotationMode by c.setting("Mode", RotationMode.Sync, "How the player is being rotated on interaction", vis).group(baseGroup)

src/main/kotlin/com/lambda/module/modules/player/InventoryMove.kt

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717

1818
package com.lambda.module.modules.player
1919

20-
import com.lambda.event.events.MovementEvent
20+
import com.lambda.Lambda.mc
21+
import com.lambda.config.groups.RotationSettings
2122
import com.lambda.event.events.UpdateManagerEvent
2223
import com.lambda.event.listener.SafeListener.Companion.listen
2324
import com.lambda.gui.LambdaScreen
@@ -28,68 +29,49 @@ import com.lambda.interaction.request.rotating.visibilty.lookAt
2829
import com.lambda.module.Module
2930
import com.lambda.module.tag.ModuleTag
3031
import com.lambda.util.KeyboardUtils.isKeyPressed
31-
import com.lambda.util.math.MathUtils.toDouble
32+
import com.lambda.util.NamedEnum
3233
import com.lambda.util.math.MathUtils.toFloatSign
33-
import com.lambda.util.player.MovementUtils.update
3434
import net.minecraft.client.gui.screen.ChatScreen
3535
import net.minecraft.client.gui.screen.Screen
36+
import net.minecraft.client.gui.screen.ingame.AbstractCommandBlockScreen
37+
import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen
3638
import net.minecraft.client.gui.screen.ingame.AnvilScreen
37-
import net.minecraft.client.gui.screen.ingame.CommandBlockScreen
38-
import net.minecraft.client.gui.screen.ingame.SignEditScreen
39-
import org.lwjgl.glfw.GLFW.GLFW_KEY_A
40-
import org.lwjgl.glfw.GLFW.GLFW_KEY_D
4139
import org.lwjgl.glfw.GLFW.GLFW_KEY_DOWN
4240
import org.lwjgl.glfw.GLFW.GLFW_KEY_KP_2
4341
import org.lwjgl.glfw.GLFW.GLFW_KEY_KP_4
4442
import org.lwjgl.glfw.GLFW.GLFW_KEY_KP_6
4543
import org.lwjgl.glfw.GLFW.GLFW_KEY_KP_8
4644
import org.lwjgl.glfw.GLFW.GLFW_KEY_LEFT
47-
import org.lwjgl.glfw.GLFW.GLFW_KEY_LEFT_CONTROL
48-
import org.lwjgl.glfw.GLFW.GLFW_KEY_LEFT_SHIFT
4945
import org.lwjgl.glfw.GLFW.GLFW_KEY_RIGHT
50-
import org.lwjgl.glfw.GLFW.GLFW_KEY_S
51-
import org.lwjgl.glfw.GLFW.GLFW_KEY_SPACE
5246
import org.lwjgl.glfw.GLFW.GLFW_KEY_UP
53-
import org.lwjgl.glfw.GLFW.GLFW_KEY_W
5447

5548
object InventoryMove : Module(
5649
name = "InventoryMove",
5750
description = "Allows you to move with GUIs opened",
5851
tag = ModuleTag.PLAYER,
5952
) {
60-
private val speed by setting("Rotation Speed", 5, 1..20, 1, unit = "°/tick")
53+
private val arrowKeys by setting("Arrow Keys", false, "Allows rotating the players camera using the arrow keys")
54+
private val speed by setting("Rotation Speed", 5, 1..20, 1, unit = "°/tick") { arrowKeys }
6155
private val rotationConfig = RotationConfig.Instant(RotationMode.Lock)
6256

57+
@JvmStatic
58+
val shouldMove get() = isEnabled && !mc.currentScreen.hasInputOrNull
59+
6360
/**
6461
* Whether the current screen has text inputs or is null
6562
*/
63+
@JvmStatic
6664
val Screen?.hasInputOrNull: Boolean
6765
get() = this is ChatScreen ||
68-
this is SignEditScreen ||
66+
this is AbstractSignEditScreen ||
6967
this is AnvilScreen ||
70-
this is CommandBlockScreen ||
68+
this is AbstractCommandBlockScreen ||
7169
this is LambdaScreen ||
7270
this == null
7371

7472
init {
75-
listen<MovementEvent.InputUpdate>(20250415) { event ->
76-
if (mc.currentScreen.hasInputOrNull) return@listen
77-
78-
val forward = isKeyPressed(GLFW_KEY_W).toDouble() -
79-
isKeyPressed(GLFW_KEY_S).toDouble()
80-
81-
val strafe = isKeyPressed(GLFW_KEY_A).toDouble() -
82-
isKeyPressed(GLFW_KEY_D).toDouble()
83-
84-
val jump = isKeyPressed(GLFW_KEY_SPACE)
85-
val sneak = isKeyPressed(GLFW_KEY_LEFT_SHIFT)
86-
val sprint = isKeyPressed(GLFW_KEY_LEFT_CONTROL)
87-
88-
event.input.update(forward, strafe, jump, sneak, sprint)
89-
}
90-
9173
listen<UpdateManagerEvent.Rotation> {
92-
if (mc.currentScreen.hasInputOrNull) return@listen
74+
if (!arrowKeys || mc.currentScreen.hasInputOrNull) return@listen
9375

9476
val pitch = (isKeyPressed(GLFW_KEY_DOWN, GLFW_KEY_KP_2).toFloatSign() -
9577
isKeyPressed(GLFW_KEY_UP, GLFW_KEY_KP_8).toFloatSign()) * speed
@@ -101,4 +83,19 @@ object InventoryMove : Module(
10183
).requestBy(rotationConfig)
10284
}
10385
}
86+
87+
@JvmStatic
88+
fun isKeyMovementRelated(key: Int): Boolean {
89+
val options = mc.options
90+
return when (key) {
91+
options.forwardKey.boundKey.code,
92+
options.backKey.boundKey.code,
93+
options.leftKey.boundKey.code,
94+
options.rightKey.boundKey.code,
95+
options.jumpKey.boundKey.code,
96+
options.sprintKey.boundKey.code,
97+
options.sneakKey.boundKey.code -> true
98+
else -> false
99+
}
100+
}
104101
}

src/main/resources/lambda.accesswidener

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ transitive-accessible field net/minecraft/client/input/Input movementVector Lnet
99
transitive-accessible field net/minecraft/client/MinecraftClient renderTaskQueue Ljava/util/Queue;
1010
transitive-accessible field net/minecraft/client/option/KeyBinding boundKey Lnet/minecraft/client/util/InputUtil$Key;
1111
transitive-accessible method net/minecraft/client/MinecraftClient getWindowTitle ()Ljava/lang/String;
12+
transitive-accessible field net/minecraft/client/option/KeyBinding KEYS_BY_ID Ljava/util/Map;
13+
transitive-accessible method net/minecraft/client/option/KeyBinding reset ()V
1214

1315
# World
1416
transitive-accessible field net/minecraft/client/world/ClientWorld entityManager Lnet/minecraft/world/entity/ClientEntityManager;

0 commit comments

Comments
 (0)