public final class GuiWalk extends Module {
public static final GuiWalk INSTANCE = new GuiWalk();
private final List<Packet<?>> delayedPackets = new ArrayList<>();
private boolean movementLocked = false;
private int tickState = 0;
private GuiWalk() {
}
@EventTarget
private void onUpdate(EventUpdate event) {
if (mc.player == null || mc.world == null) return;
final KeyBinding[] moveKeys = {
mc.options.forwardKey,
mc.options.backKey,
mc.options.leftKey,
mc.options.rightKey,
mc.options.jumpKey,
mc.options.sprintKey
};
if (tickState == 1) {
lockMovement(moveKeys);
tickState = 2;
return;
} else if (tickState == 2) {
sendDelayedPackets();
unlockMovement(moveKeys);
tickState = 0;
return;
}
if (movementLocked) {
for (KeyBinding keyBinding : moveKeys) {
keyBinding.setPressed(false);
}
return;
}
if (mc.currentScreen == null) {
return;
}
if (mc.currentScreen instanceof ChatScreen) {
return;
}
for (KeyBinding keyBinding : moveKeys) {
long windowHandle = mc.getWindow().getHandle();
int keyCode = keyBinding.getDefaultKey().getCode();
boolean isKeyPressed = GLFW.glfwGetKey(windowHandle, keyCode) == GLFW.GLFW_PRESS;
keyBinding.setPressed(isKeyPressed);
}
}
@EventTarget
private void onPacket(EventPacket event) {
if (mc.player == null) return;
if (!event.isSent()) return;
if (!(mc.currentScreen instanceof InventoryScreen)) return;
Packet<?> packet = (Packet<?>) event.getPacket();
if (packet instanceof ClickSlotC2SPacket) {
delayedPackets.add(packet);
event.cancel();
return;
}
if (packet instanceof CloseHandledScreenC2SPacket) {
if (!delayedPackets.isEmpty()) {
delayedPackets.add(packet);
event.cancel();
tickState = 1;
}
}
}
private void lockMovement(KeyBinding[] moveKeys) {
movementLocked = true;
for (KeyBinding keyBinding : moveKeys) {
keyBinding.setPressed(false);
}
}
private void unlockMovement(KeyBinding[] moveKeys) {
movementLocked = false;
for (KeyBinding keyBinding : moveKeys) {
long windowHandle = mc.getWindow().getHandle();
int keyCode = keyBinding.getDefaultKey().getCode();
boolean isKeyPressed = GLFW.glfwGetKey(windowHandle, keyCode) == GLFW.GLFW_PRESS;
keyBinding.setPressed(isKeyPressed);
}
}
private void sendDelayedPackets() {
if (delayedPackets.isEmpty()) return;
if (mc.player != null && mc.player.networkHandler != null) {
for (Packet<?> packet : delayedPackets) {
mc.player.networkHandler.sendPacket(packet);
}
}
delayedPackets.clear();
}
@Override
public void onDisable() {
super.onDisable();
delayedPackets.clear();
movementLocked = false;
tickState = 0;
}
}