diff --git a/README.md b/README.md index cb3fb7e..ce5a183 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ - `DubCounter` - Count the amount of double chests in render distance. - `NoChestRender` - Disables rendering of chests completely to improve performance. - `Gurkfly` - Fly like in creative mode. Only works on servers without anti-cheat. -- `Robowalk` - Bypasses the anti-human plugin on the Liveoverflow server. +- `Gurkwalk` - Bypasses the anti-human plugin on the LO server. +- `LO Bypasses` - Bypasses the multiple nag/demo-screens on the LO Server. +- `Packet Logger` - A very basic packet logger. +- `WorldGuard Bypass` - Move inside WorldGuard protected areas. ## Commands - `vClip up|down` - Allows you to clip through blocks vertically. diff --git a/src/main/java/de/gurkenwerfer/toolkit/GurkensGadgetry.java b/src/main/java/de/gurkenwerfer/toolkit/GurkensGadgetry.java index b2da403..49c52e9 100644 --- a/src/main/java/de/gurkenwerfer/toolkit/GurkensGadgetry.java +++ b/src/main/java/de/gurkenwerfer/toolkit/GurkensGadgetry.java @@ -1,7 +1,7 @@ package de.gurkenwerfer.toolkit; import com.mojang.logging.LogUtils; -import de.gurkenwerfer.toolkit.Commands.VClip; +import de.gurkenwerfer.toolkit.commands.VClip; import de.gurkenwerfer.toolkit.modules.*; import de.gurkenwerfer.toolkit.modules.BedrockESP.BedrockESP; import meteordevelopment.meteorclient.addons.MeteorAddon; @@ -23,8 +23,11 @@ public void onInitialize() { Modules.get().add(new DubCounter()); Modules.get().add(new AutoItemMove()); Modules.get().add(new BedrockESP()); - Modules.get().add(new Robowalk()); + Modules.get().add(new Gurkwalk()); Modules.get().add(new Gurkfly()); + Modules.get().add(new PacketLogger()); + Modules.get().add(new FakeCreativeBypass()); + Modules.get().add(new WorldGuardBypass()); // Commands Commands.get().add(new VClip()); diff --git a/src/main/java/de/gurkenwerfer/toolkit/Commands/VClip.java b/src/main/java/de/gurkenwerfer/toolkit/commands/VClip.java similarity index 98% rename from src/main/java/de/gurkenwerfer/toolkit/Commands/VClip.java rename to src/main/java/de/gurkenwerfer/toolkit/commands/VClip.java index 32ffab1..e00c7f4 100644 --- a/src/main/java/de/gurkenwerfer/toolkit/Commands/VClip.java +++ b/src/main/java/de/gurkenwerfer/toolkit/commands/VClip.java @@ -1,4 +1,4 @@ -package de.gurkenwerfer.toolkit.Commands; +package de.gurkenwerfer.toolkit.commands; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import meteordevelopment.meteorclient.systems.commands.Command; diff --git a/src/main/java/de/gurkenwerfer/toolkit/mixins/ClientConnectionMixin.java b/src/main/java/de/gurkenwerfer/toolkit/mixins/ClientConnectionMixin.java new file mode 100644 index 0000000..b4a4cd7 --- /dev/null +++ b/src/main/java/de/gurkenwerfer/toolkit/mixins/ClientConnectionMixin.java @@ -0,0 +1,81 @@ +package de.gurkenwerfer.toolkit.mixins; + +import de.gurkenwerfer.toolkit.modules.Gurkwalk; +import net.minecraft.network.ClientConnection; +import org.spongepowered.asm.mixin.Mixin; +import meteordevelopment.meteorclient.mixin.PlayerMoveC2SPacketAccessor; +import meteordevelopment.meteorclient.mixininterface.IPlayerMoveC2SPacket; +import meteordevelopment.meteorclient.systems.modules.Modules; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.vehicle.BoatEntity; +import net.minecraft.network.Packet; +import net.minecraft.network.PacketCallbacks; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.network.packet.c2s.play.VehicleMoveC2SPacket; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientConnection.class) +public abstract class ClientConnectionMixin { + + @Shadow protected abstract void sendImmediately(Packet packet, @Nullable PacketCallbacks callbacks); + + @Inject(method = "send(Lnet/minecraft/network/Packet;Lnet/minecraft/network/PacketCallbacks;)V", at = @At("HEAD"), cancellable = true) + private void onSend(Packet packet, PacketCallbacks callbacks, CallbackInfo info) { + Gurkwalk gw = Modules.get().get(Gurkwalk.class); + MinecraftClient mc = MinecraftClient.getInstance(); + + if (mc != null && mc.player != null) { + if (gw.isActive()) { + if (packet instanceof PlayerMoveC2SPacket.PositionAndOnGround move) { + PlayerMoveC2SPacket.PositionAndOnGround modified = new PlayerMoveC2SPacket.PositionAndOnGround( + gw.round(move.getX(0)), + gw.roundY() ? gw.round(move.getY(0)) : move.getY(0), + gw.round(move.getZ(0)), + + move.isOnGround() + ); + + info.cancel(); + this.sendImmediately(modified, callbacks); + + } else if (packet instanceof PlayerMoveC2SPacket.Full move) { + PlayerMoveC2SPacket.Full modified = new PlayerMoveC2SPacket.Full( + gw.round(move.getX(0)), + gw.roundY() ? gw.round(move.getY(0)) : move.getY(0), + gw.round(move.getZ(0)), + + move.getYaw(mc.player.getYaw()), + move.getPitch(mc.player.getPitch()), + move.isOnGround() + ); + + info.cancel(); + this.sendImmediately(modified, callbacks); + + } else if (packet instanceof VehicleMoveC2SPacket move) { + BoatEntity entity = new BoatEntity(EntityType.BOAT, mc.world); + + entity.setPos( + gw.round(move.getX()), + gw.roundY() ? gw.round(move.getY()) : move.getY(), + gw.round(move.getZ()) + ); + + entity.setYaw(move.getYaw()); + entity.setPitch(move.getPitch()); + + VehicleMoveC2SPacket modified = new VehicleMoveC2SPacket(entity); + + info.cancel(); + this.sendImmediately(modified, callbacks); + } + } + } + } +} diff --git a/src/main/java/de/gurkenwerfer/toolkit/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/gurkenwerfer/toolkit/mixins/ClientPlayNetworkHandlerMixin.java new file mode 100644 index 0000000..9b0cf3e --- /dev/null +++ b/src/main/java/de/gurkenwerfer/toolkit/mixins/ClientPlayNetworkHandlerMixin.java @@ -0,0 +1,25 @@ +package de.gurkenwerfer.toolkit.mixins; + +import de.gurkenwerfer.toolkit.modules.FakeCreativeBypass; +import meteordevelopment.meteorclient.systems.modules.Modules; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.packet.s2c.play.GameStateChangeS2CPacket; +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.callback.CallbackInfo; + +@Mixin(ClientPlayNetworkHandler.class) +public class ClientPlayNetworkHandlerMixin { + @Inject(method = "onGameStateChange", at = @At("HEAD"), cancellable = true) + private void onSend(GameStateChangeS2CPacket packet, CallbackInfo info) { + + FakeCreativeBypass bypass = Modules.get().get(FakeCreativeBypass.class); + + if (bypass.isActive() && packet.getReason() == GameStateChangeS2CPacket.DEMO_MESSAGE_SHOWN && packet.getValue() == 0.0F && bypass.bypassDemo() + || packet.getReason() == GameStateChangeS2CPacket.GAME_WON && bypass.bypassCredits() + || packet.getReason() == GameStateChangeS2CPacket.GAME_MODE_CHANGED && bypass.bypassCreative()) { + info.cancel(); + } + } +} diff --git a/src/main/java/de/gurkenwerfer/toolkit/modules/FakeCreativeBypass.java b/src/main/java/de/gurkenwerfer/toolkit/modules/FakeCreativeBypass.java new file mode 100644 index 0000000..59064d4 --- /dev/null +++ b/src/main/java/de/gurkenwerfer/toolkit/modules/FakeCreativeBypass.java @@ -0,0 +1,49 @@ +package de.gurkenwerfer.toolkit.modules; + +import de.gurkenwerfer.toolkit.GurkensGadgetry; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.systems.modules.Module; + +public class FakeCreativeBypass extends Module{ + public FakeCreativeBypass() { + super(GurkensGadgetry.CATEGORY, "LO-Bypasses", "Bypasses LiveOverflow's Fake Creative Mode/Nag Screens."); + } + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + + private final Setting credits = sgGeneral.add(new BoolSetting.Builder() + .name("Cancel Credits") + .description("Cancel the end screen packet.") + .defaultValue(true) + .build() + ); + + private final Setting demo = sgGeneral.add(new BoolSetting.Builder() + .name("Cancel Demo Mode") + .description("Cancel the demo screen packet.") + .defaultValue(true) + .build() + ); + + private final Setting creative = sgGeneral.add(new BoolSetting.Builder() + .name("Cancel Fake Creative Mode") + .description("Cancel the fake creative mode packet.") + .defaultValue(true) + .build() + ); + + public boolean bypassCredits() { + return this.credits.get(); + } + + public boolean bypassDemo() { + return this.demo.get(); + } + + public boolean bypassCreative() { + return this.creative.get(); + } +} diff --git a/src/main/java/de/gurkenwerfer/toolkit/modules/Gurkfly.java b/src/main/java/de/gurkenwerfer/toolkit/modules/Gurkfly.java index 5ed7bac..10d64c7 100644 --- a/src/main/java/de/gurkenwerfer/toolkit/modules/Gurkfly.java +++ b/src/main/java/de/gurkenwerfer/toolkit/modules/Gurkfly.java @@ -3,6 +3,7 @@ import de.gurkenwerfer.toolkit.GurkensGadgetry; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.DoubleSetting; +import meteordevelopment.meteorclient.settings.IntSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Module; @@ -14,7 +15,7 @@ public class Gurkfly extends Module { private final Setting FLYING_SPEED = sgGeneral.add(new DoubleSetting.Builder() .name("flying-speed") .description("Take a wild guess.") - .defaultValue(1.6) + .defaultValue(2.420) .min(0) .sliderMax(10) .build() @@ -23,9 +24,9 @@ public class Gurkfly extends Module { private final Setting HOVER_SPEED = sgGeneral.add(new DoubleSetting.Builder() .name("hover-speed") .description("How far you ascend per tick when hovering.") - .defaultValue(0.003) + .defaultValue(0.009) .min(0) - .sliderMax(0.01) + .sliderMax(0.02) .build() ); private final Setting BFALL_SPEED = sgGeneral.add(new DoubleSetting.Builder() @@ -54,6 +55,15 @@ public class Gurkfly extends Module { .build() ); + private final Setting ticks = sgGeneral.add(new IntSetting.Builder() + .name("Bypass Fall Ticks") + .description("How many ticks to wait before falling again to bypass the vanilla anti-cheat.") + .defaultValue(20) + .min(1) + .sliderMax(50) + .build() + ); + public Gurkfly() { super(GurkensGadgetry.CATEGORY, "gurkfly", "Fly like in creative mode. Only works on unprotected servers."); } @@ -66,6 +76,8 @@ public void onActivate() { @EventHandler private void onTick(TickEvent.Pre event) { + int tick = 0; + assert mc.player != null; // hover and move if ((!mc.player.isOnGround() && !mc.options.jumpKey.isPressed()) && !mc.options.sneakKey.isPressed()) { @@ -79,25 +91,28 @@ private void onTick(TickEvent.Pre event) { mc.player.setVelocity(mc.player.getRotationVector().rotateY(45).multiply(FLYING_SPEED.get())); } else if (mc.options.rightKey.isPressed()) { mc.player.setVelocity(mc.player.getRotationVector().rotateY(-45).multiply(FLYING_SPEED.get())); + } else { + mc.player.setVelocity(0, mc.player.getVelocity().y, 0); } - // add upwards momentum - mc.player.setVelocity(mc.player.getVelocity().x, HOVER_SPEED.get(), mc.player.getVelocity().z); - //fall down every 35 ticks to bypass vanilla fly detection - if (mc.player.age % 38 == 0) { + if (mc.player.age % ticks.get() == 0) { mc.player.setPosition(mc.player.getX(), mc.player.getY() - BFALL_SPEED.get(), mc.player.getZ()); + + } else { + mc.player.setVelocity(mc.player.getVelocity().x, HOVER_SPEED.get(), mc.player.getVelocity().z); } + } } else if (mc.options.jumpKey.isPressed()) { //gain upward momentum if (mc.player != null) { - - mc.player.setVelocity(mc.player.getVelocity().add(0, ASC_SPEED.get(), 0)); //fall down every 35 ticks to bypass vanilla fly detection - if (mc.player.age % 38 == 0) { + if (mc.player.age % ticks.get() == 0) { mc.player.setPosition(mc.player.getX(), mc.player.getY() - BFALL_SPEED.get(), mc.player.getZ()); + } else { + mc.player.setVelocity(mc.player.getVelocity().add(0, ASC_SPEED.get(), 0)); } } } else if (mc.options.sneakKey.isPressed()) { diff --git a/src/main/java/de/gurkenwerfer/toolkit/modules/Gurkwalk.java b/src/main/java/de/gurkenwerfer/toolkit/modules/Gurkwalk.java new file mode 100644 index 0000000..cc68d10 --- /dev/null +++ b/src/main/java/de/gurkenwerfer/toolkit/modules/Gurkwalk.java @@ -0,0 +1,46 @@ +package de.gurkenwerfer.toolkit.modules; + +import de.gurkenwerfer.toolkit.GurkensGadgetry; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.IntSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.systems.modules.Module; + +public class Gurkwalk extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting digits = sgGeneral.add(new IntSetting.Builder() + .name("digits") + .description("How many digits to remove.") + .defaultValue(2) + .sliderMin(0) + .sliderMax(5) + .noSlider() + .build() + ); + + private final Setting modifyY = sgGeneral.add(new BoolSetting.Builder() + .name("round-y") + .description("Rounds your y coordinate.") + .defaultValue(false) + .build() + ); + + public Gurkwalk() { + super(GurkensGadgetry.CATEGORY, "Gurkwalk", "Rounds your coords to bypass LiveOverflow's anti-human movement check."); + } + + + public boolean roundY() { + return modifyY.get(); + } + + // Utils + + public double round(double value) { + int digit = (int) Math.pow(10, digits.get()); + double round = ((double) (Math.round(value * digit)) / digit); + return Math.nextAfter(round, round + Math.signum(round)); + } +} diff --git a/src/main/java/de/gurkenwerfer/toolkit/modules/PacketLogger.java b/src/main/java/de/gurkenwerfer/toolkit/modules/PacketLogger.java new file mode 100644 index 0000000..c69aa7e --- /dev/null +++ b/src/main/java/de/gurkenwerfer/toolkit/modules/PacketLogger.java @@ -0,0 +1,77 @@ +package de.gurkenwerfer.toolkit.modules; + +import com.mojang.logging.LogUtils; +import de.gurkenwerfer.toolkit.GurkensGadgetry; +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.settings.BoolSetting; +import meteordevelopment.meteorclient.settings.Setting; +import meteordevelopment.meteorclient.settings.SettingGroup; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.List; + +public class PacketLogger extends Module{ + public PacketLogger() { + super(GurkensGadgetry.CATEGORY, "Packet-Logger", "A very basic packet logger."); + } + List ignoredPackets = new ArrayList(); + public SettingGroup sgGeneral = settings.getDefaultGroup(); + private final Setting antispam = sgGeneral.add(new BoolSetting.Builder() + .name("anti-spam") + .description("Filters out unimportant packets.") + .defaultValue(true) + .build() + ); + + @Override + public void onActivate() { + + assert mc.player != null; + mc.player.sendMessage(Text.of("Enabling Packet Logger"), false); + + if (antispam.get()) { + mc.player.sendMessage(Text.of("Filtering Spam!"), false); + ignoredPackets.add("net.minecraft.class_2726"); + ignoredPackets.add("net.minecraft.class_2743"); + ignoredPackets.add("net.minecraft.class_2684"); + ignoredPackets.add("net.minecraft.class_2672"); + ignoredPackets.add("net.minecraft.class_2676"); + ignoredPackets.add("net.minecraft.class_2761"); + ignoredPackets.add("net.minecraft.class_2684"); + ignoredPackets.add("net.minecraft.class_2684.class_2685"); + ignoredPackets.add("net.minecraft.class_2767"); + ignoredPackets.add("net.minecraft.class_2744"); + ignoredPackets.add("net.minecraft.class_2781"); + ignoredPackets.add("net.minecraft.class_2604"); + ignoredPackets.add("net.minecraft.class_2739"); + } + + } + + @EventHandler + private void onSendPacket(PacketEvent.Send event) { + + // log all packets to console and chat + if (!ignoredPackets.contains(event.packet.getClass().getCanonicalName())) { + LogUtils.getLogger().info("Sent Packet: " + event.packet.toString()); + assert mc.player != null; + mc.player.sendMessage(Text.of("Sent Packet: " + event.packet.toString()), false); + } + + } + + @EventHandler + private void onReceivePacket(PacketEvent.Receive event) { + + // log all packets to console and chat + if (!ignoredPackets.contains(event.packet.getClass().getCanonicalName())) { + LogUtils.getLogger().info("Received Packet: " + event.packet.toString()); + assert mc.player != null; + mc.player.sendMessage(Text.of("Received Packet: " + event.packet.toString()), false); + } + + } +} diff --git a/src/main/java/de/gurkenwerfer/toolkit/modules/Robowalk.java b/src/main/java/de/gurkenwerfer/toolkit/modules/Robowalk.java deleted file mode 100644 index 85a4b74..0000000 --- a/src/main/java/de/gurkenwerfer/toolkit/modules/Robowalk.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.gurkenwerfer.toolkit.modules; - -import de.gurkenwerfer.toolkit.GurkensGadgetry; -import meteordevelopment.meteorclient.events.world.TickEvent; -import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.orbit.EventHandler; -import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; - -public class Robowalk extends Module { - - public Robowalk() { - super(GurkensGadgetry.CATEGORY, "robowalk", "Bypasses Liveoverflow's Human-Detection."); - } - - @EventHandler - private void onTick(TickEvent.Post event) { - - assert mc.player != null; - double x = Math.round(mc.player.getX() * 100.0) / 100.0; - double z = Math.round(mc.player.getZ() * 100.0) / 100.0; - - x = Math.nextAfter(x, x + Math.signum(x)); - z = Math.nextAfter(z, z + Math.signum(z)); - - mc.player.networkHandler.sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(x, mc.player.getY(), z, mc.player.isOnGround())); - } -} diff --git a/src/main/java/de/gurkenwerfer/toolkit/modules/WorldGuardBypass.java b/src/main/java/de/gurkenwerfer/toolkit/modules/WorldGuardBypass.java new file mode 100644 index 0000000..fb89ffc --- /dev/null +++ b/src/main/java/de/gurkenwerfer/toolkit/modules/WorldGuardBypass.java @@ -0,0 +1,62 @@ +package de.gurkenwerfer.toolkit.modules; + +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.systems.modules.Module; +import de.gurkenwerfer.toolkit.GurkensGadgetry; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.text.Text; + +public class WorldGuardBypass extends Module{ + + public WorldGuardBypass () { + super(GurkensGadgetry.CATEGORY, "WGBypass", "Bypasses WorldGuards region protection."); + } + + @Override + public void onActivate() { + assert mc.player != null; + mc.player.sendMessage(Text.of("Activated WGBypass"), false); + mc.player.getAbilities().allowFlying = true; + mc.player.getAbilities().flying = true; + } + + @EventHandler + private void onTick (TickEvent.Pre event) { + + if (mc.player != null) { + // tp small distances to avoid firing any movement events + if (mc.options.forwardKey.isPressed()) { + + //send new movement packet + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() + 0.06, mc.player.getY(), mc.player.getZ(), mc.player.isOnGround())); + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() + 420, mc.player.getY(), mc.player.getZ() + 420, mc.player.isOnGround())); + + } else if (mc.options.backKey.isPressed()) { + + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() - 0.06, mc.player.getY(), mc.player.getZ(), mc.player.isOnGround())); + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() + 420, mc.player.getY(), mc.player.getZ() + 420, mc.player.isOnGround())); + + } else if (mc.options.leftKey.isPressed()) { + + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ() + 0.06, mc.player.isOnGround())); + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() + 420, mc.player.getY(), mc.player.getZ() + 420, mc.player.isOnGround())); + + } else if (mc.options.rightKey.isPressed()) { + + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ() - 0.06, mc.player.isOnGround())); + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() + 420, mc.player.getY(), mc.player.getZ() + 420, mc.player.isOnGround())); + + } else if (mc.options.sneakKey.isPressed()) { + + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY() - 0.06, mc.player.getZ(), mc.player.isOnGround())); + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() + 420, mc.player.getY(), mc.player.getZ() + 420, mc.player.isOnGround())); + + } else if (mc.options.jumpKey.isPressed()) { + + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY() + 0.06, mc.player.getZ(), mc.player.isOnGround())); + mc.player.networkHandler.getConnection().send(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX() + 420, mc.player.getY(), mc.player.getZ() + 420, mc.player.isOnGround())); + } + } + } +} diff --git a/src/main/resources/gadgetry.mixins.json b/src/main/resources/gadgetry.mixins.json index 1b05747..b36a225 100644 --- a/src/main/resources/gadgetry.mixins.json +++ b/src/main/resources/gadgetry.mixins.json @@ -1,8 +1,11 @@ { "required": true, - "package": "de.gurkenwerfer.toolkit.mixin", + "package": "de.gurkenwerfer.toolkit.mixins", "compatibilityLevel": "JAVA_17", - "client": [], + "client": [ + "ClientPlayNetworkHandlerMixin", + "ClientConnectionMixin" + ], "injectors": { "defaultRequire": 1 }