From b75cd8a2e212b387f8adf519302ee1c15d9205f8 Mon Sep 17 00:00:00 2001 From: C10udburst <18114966+C10udburst@users.noreply.github.com> Date: Thu, 17 Mar 2022 17:33:37 +0100 Subject: [PATCH] add chorus exploit --- .../anticope/rejects/MeteorRejectsAddon.java | 2 + .../rejects/events/TeleportParticleEvent.java | 14 + .../rejects/mixin/LivingEntityMixin.java | 27 ++ .../rejects/modules/ChorusExploit.java | 245 ++++++++++++++++++ src/main/resources/meteor-rejects.mixins.json | 1 + 5 files changed, 289 insertions(+) create mode 100644 src/main/java/anticope/rejects/events/TeleportParticleEvent.java create mode 100644 src/main/java/anticope/rejects/mixin/LivingEntityMixin.java create mode 100644 src/main/java/anticope/rejects/modules/ChorusExploit.java diff --git a/src/main/java/anticope/rejects/MeteorRejectsAddon.java b/src/main/java/anticope/rejects/MeteorRejectsAddon.java index 4bfff9d..2678a4b 100644 --- a/src/main/java/anticope/rejects/MeteorRejectsAddon.java +++ b/src/main/java/anticope/rejects/MeteorRejectsAddon.java @@ -15,6 +15,7 @@ import meteordevelopment.meteorclient.systems.commands.Commands; import meteordevelopment.meteorclient.systems.hud.HUD; import meteordevelopment.meteorclient.systems.modules.Category; import meteordevelopment.meteorclient.systems.modules.Modules; + import net.minecraft.item.Items; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,6 +52,7 @@ public class MeteorRejectsAddon extends MeteorAddon { modules.add(new BoatPhase()); modules.add(new Boost()); modules.add(new ChatBot()); + modules.add(new ChorusExploit()); modules.add(new ColorSigns()); modules.add(new Confuse()); modules.add(new CoordLogger()); diff --git a/src/main/java/anticope/rejects/events/TeleportParticleEvent.java b/src/main/java/anticope/rejects/events/TeleportParticleEvent.java new file mode 100644 index 0000000..85084c3 --- /dev/null +++ b/src/main/java/anticope/rejects/events/TeleportParticleEvent.java @@ -0,0 +1,14 @@ +package anticope.rejects.events; + +public class TeleportParticleEvent { + private static final TeleportParticleEvent INSTANCE = new TeleportParticleEvent(); + + public double x, y, z; + + public static TeleportParticleEvent get(double x, double y, double z) { + INSTANCE.x = x; + INSTANCE.y = y; + INSTANCE.z = z; + return INSTANCE; + } +} \ No newline at end of file diff --git a/src/main/java/anticope/rejects/mixin/LivingEntityMixin.java b/src/main/java/anticope/rejects/mixin/LivingEntityMixin.java new file mode 100644 index 0000000..f370892 --- /dev/null +++ b/src/main/java/anticope/rejects/mixin/LivingEntityMixin.java @@ -0,0 +1,27 @@ +package anticope.rejects.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.At; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; + +import anticope.rejects.events.TeleportParticleEvent; +import meteordevelopment.meteorclient.MeteorClient; +import meteordevelopment.meteorclient.utils.Utils; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +@Mixin(LivingEntity.class) +public class LivingEntityMixin { + @Inject(method = "handleStatus", at = @At("HEAD"), cancellable = true) + private void onHandleStatus(byte status, CallbackInfo ci) { + if ((Object) this instanceof Entity thisPlayer) { + if ((Object) thisPlayer == mc.player && status == 46 && Utils.canUpdate()) { + MeteorClient.EVENT_BUS.post(TeleportParticleEvent.get(thisPlayer.getX(), thisPlayer.getY(), thisPlayer.getZ())); + } + } + } +} diff --git a/src/main/java/anticope/rejects/modules/ChorusExploit.java b/src/main/java/anticope/rejects/modules/ChorusExploit.java new file mode 100644 index 0000000..66b68b6 --- /dev/null +++ b/src/main/java/anticope/rejects/modules/ChorusExploit.java @@ -0,0 +1,245 @@ +package anticope.rejects.modules; + +import meteordevelopment.meteorclient.events.entity.player.FinishUsingItemEvent; +import meteordevelopment.meteorclient.events.packets.PacketEvent; +import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.Utils; +import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity; +import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerManager; +import meteordevelopment.meteorclient.utils.misc.Keybind; +import meteordevelopment.meteorclient.utils.render.RenderUtils; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.item.Items; +import net.minecraft.network.packet.c2s.play.TeleportConfirmC2SPacket; +import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; +import net.minecraft.util.math.Vec3d; + +import anticope.rejects.events.TeleportParticleEvent; +import anticope.rejects.MeteorRejectsAddon; + +import java.util.*; + +public class ChorusExploit extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgRender = settings.createGroup("Render"); + + private final Setting positionMode = sgGeneral.add(new EnumSetting.Builder() + .name("position-mode") + .description("How your teleport position is calculated.") + .defaultValue(PositionMode.Particle) + .build() + ); + + private final Setting onItemSwitch = sgGeneral.add(new BoolSetting.Builder() + .name("tp-on-switch") + .description("Teleports you when you switch items.") + .defaultValue(true) + .build() + ); + + private final Setting onDeactivate = sgGeneral.add(new BoolSetting.Builder() + .name("tp-on-deactivate") + .description("Teleports you when the module is deactivated.") + .defaultValue(false) + .build() + ); + + private final Setting onKey = sgGeneral.add(new KeybindSetting.Builder() + .name("on-key") + .description("Teleports when a key is pressed.") + .defaultValue(Keybind.none()) + .action(this::sendPackets) + .build() + ); + + private final Setting autoTeleport = sgGeneral.add(new BoolSetting.Builder() + .name("automatically-teleport") + .description("Automatically teleports you after a fixed number of ticks.") + .defaultValue(false) + .build() + ); + + private final Setting ticksToTeleport = sgGeneral.add(new IntSetting.Builder() + .name("ticks-to-teleport") + .description("The amount of ticks to wait before automatically teleporting.") + .defaultValue(40) + .min(0) + .sliderMax(100) + .visible(autoTeleport::get) + .build() + ); + + //render + private final Setting renderActual = sgRender.add(new BoolSetting.Builder() + .name("set-position") + .description("Sets you clientside to your actual position.") + .defaultValue(true) + .build() + ); + + private final Setting fakeplayerOnDestination = sgRender.add(new BoolSetting.Builder() + .name("fakeplayer-on-destination") + .description("Creates a fakeplayer at the destination.") + .defaultValue(true) + .build() + ); + + private final Setting drawLine = sgRender.add(new BoolSetting.Builder() + .name("draw-line") + .description("Draws a line to where you are going to be.") + .defaultValue(true) + .build() + ); + + private final Setting lineColour = sgRender.add(new ColorSetting.Builder() + .name("line-color") + .description("The lines color.") + .defaultValue(new SettingColor(205, 205, 205, 127)) + .visible(drawLine::get) + .build() + ); + + private int slot; + private int delay = 0; + private boolean ateChorus, sending, fakePlayerSpawned, gotPosition = false; + private double posX, posY, posZ, cposX, cposY, cposZ; + private FakePlayerEntity fakePlayer = null; + private final Queue telePackets = new LinkedList<>(); + + + public ChorusExploit() { + super(MeteorRejectsAddon.CATEGORY, "chorus-exploit", "Delays teleporting with a chorus fruit."); + } + + @Override + public void onActivate() { + ateChorus = false; + delay = 0; + telePackets.clear(); + fakePlayerSpawned = false; + gotPosition = false; + } + + @Override + public void onDeactivate() { + if (Utils.canUpdate() && ateChorus && onDeactivate.get()) { + sendPackets(); + } + telePackets.clear(); + fakePlayerSpawned = false; + gotPosition = false; + } + + @EventHandler + private void onPacketSend(PacketEvent.Send event) { + if (event.packet instanceof TeleportConfirmC2SPacket telepacket && ateChorus && !sending) { + telePackets.add(telepacket); + event.cancel(); + } + } + + @EventHandler + private void onPacketRecieve(PacketEvent.Receive event) { + if (event.packet instanceof PlayerPositionLookS2CPacket posPacket && ateChorus) { + event.setCancelled(true); + if (positionMode.get() == PositionMode.PosLook) { + cposX = posPacket.getX(); + cposY = posPacket.getY(); + cposZ = posPacket.getZ(); + gotPosition = true; + if (fakeplayerOnDestination.get() && renderActual.get() && !fakePlayerSpawned) spawnFakeplayer(cposX, cposY, cposZ); + } + } + } + + @EventHandler + private void onTick(TickEvent.Pre event) { + if (ateChorus) { + delay++; + if (!mc.player.getPos().equals(new Vec3d(posX, posY, posZ)) && renderActual.get()) { + mc.player.setPos(posX, posY, posZ); + } + + if (autoTeleport.get() && delay >= ticksToTeleport.get()) { + sendPackets(); + } + + if (onItemSwitch.get() && slot != mc.player.getInventory().selectedSlot) { + sendPackets(); + } + } + } + + @EventHandler + private void onEat(FinishUsingItemEvent event) { + if (event.itemStack.getItem().equals(Items.CHORUS_FRUIT)) { + posX = mc.player.getX(); + posY = mc.player.getY(); + posZ = mc.player.getZ(); + ateChorus = true; + slot = mc.player.getInventory().selectedSlot; + } + } + + @EventHandler + private void onRender3D(Render3DEvent event) { + if (drawLine.get() && ateChorus && gotPosition) { + event.renderer.line(RenderUtils.center.x, RenderUtils.center.y, RenderUtils.center.z, cposX, cposY + 1, cposZ, lineColour.get()); + } + } + + @EventHandler + private void onTeleportParticle(TeleportParticleEvent event) { + if (ateChorus && positionMode.get() == PositionMode.Particle) { + cposX = event.x; + cposY = event.y; + cposZ = event.z; + gotPosition = true; + if (fakeplayerOnDestination.get() && renderActual.get() && !fakePlayerSpawned) spawnFakeplayer(cposX, cposY, cposZ); + } + } + + private void sendPackets() { + sending = true; + + while (!telePackets.isEmpty()) { + mc.getNetworkHandler().sendPacket(telePackets.poll()); + } + + delay = 0; + ateChorus = false; + sending = false; + gotPosition = false; + + if (fakePlayer != null) { + FakePlayerManager.getPlayers().remove(fakePlayer); + fakePlayer.despawn(); + fakePlayer = null; + fakePlayerSpawned = false; + } + } + + private void spawnFakeplayer(double x, double y, double z) { + fakePlayer = new FakePlayerEntity(mc.player, mc.player.getEntityName(), mc.player.getHealth(), false); + fakePlayer.spawn(); + fakePlayer.setPos(x, y ,z); + FakePlayerManager.getPlayers().add(fakePlayer); + fakePlayerSpawned = true; + } + + @Override + public String getInfoString() { + if (autoTeleport.get() && ateChorus) return String.valueOf(ticksToTeleport.get() - delay); + return null; + } + + public enum PositionMode { + Particle, + PosLook, + None + } +} \ No newline at end of file diff --git a/src/main/resources/meteor-rejects.mixins.json b/src/main/resources/meteor-rejects.mixins.json index a91c28d..0593247 100644 --- a/src/main/resources/meteor-rejects.mixins.json +++ b/src/main/resources/meteor-rejects.mixins.json @@ -13,6 +13,7 @@ "StructureVoidBlockMixin", "ToastManagerMixin", "TitleScreenMixin", + "LivingEntityMixin", "baritone.MineProcessMixin" ], "injectors": {