From ecf2d1a19bc5afa01ab3e07c8e677fb0f3f92399 Mon Sep 17 00:00:00 2001 From: OnlyRain233 Date: Fri, 28 Jul 2023 20:31:11 +0800 Subject: [PATCH] Fix ShieldBypass unable to perform criticals and stuck in blocks (#275) Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com> --- .github/workflows/gradle.yml | 4 +- gradle.properties | 4 +- .../mixin/meteor/modules/AutoSignMixin.java | 2 +- .../mixin/meteor/modules/KillAuraMixin.java | 19 ++- .../anticope/rejects/modules/AutoFarm.java | 25 ++-- .../rejects/modules/ShieldBypass.java | 118 ++++++++++-------- 6 files changed, 102 insertions(+), 70 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 7e8e745..3dcf139 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -34,9 +34,9 @@ jobs: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "latest-1.20" + automatic_release_tag: "latest-1.20.1" prerelease: false - title: "1.20 Build" + title: "1.20.1 Build" files: | ./build/libs/*.jar diff --git a/gradle.properties b/gradle.properties index 073b3ca..a759d22 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,8 +2,8 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties -minecraft_version=1.20 -yarn_version=1.20+build.1 +minecraft_version=1.20.1 +yarn_version=1.20.1+build.1 loader_version=0.14.21 # Mod Properties diff --git a/src/main/java/anticope/rejects/mixin/meteor/modules/AutoSignMixin.java b/src/main/java/anticope/rejects/mixin/meteor/modules/AutoSignMixin.java index 1ef5b16..ee82539 100644 --- a/src/main/java/anticope/rejects/mixin/meteor/modules/AutoSignMixin.java +++ b/src/main/java/anticope/rejects/mixin/meteor/modules/AutoSignMixin.java @@ -45,7 +45,7 @@ public class AutoSignMixin extends Module { super(category, name, description); } - @Inject(method = "onOpenScreen",at = @At("HEAD")) + @Inject(method = "onOpenScreen",at = @At(value = "INVOKE", target = "Lmeteordevelopment/meteorclient/mixin/AbstractSignEditScreenAccessor;getSign()Lnet/minecraft/block/entity/SignBlockEntity;")) private void beforeGetSign(OpenScreenEvent event, CallbackInfo info) { if (random.get()) { text = new String[4]; diff --git a/src/main/java/anticope/rejects/mixin/meteor/modules/KillAuraMixin.java b/src/main/java/anticope/rejects/mixin/meteor/modules/KillAuraMixin.java index f1aa7d4..e4c4cbc 100644 --- a/src/main/java/anticope/rejects/mixin/meteor/modules/KillAuraMixin.java +++ b/src/main/java/anticope/rejects/mixin/meteor/modules/KillAuraMixin.java @@ -1,10 +1,13 @@ package anticope.rejects.mixin.meteor.modules; +import anticope.rejects.modules.ShieldBypass; import anticope.rejects.utils.RejectsUtils; +import meteordevelopment.meteorclient.events.Cancellable; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Category; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.systems.modules.combat.KillAura; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Final; @@ -37,9 +40,6 @@ public class KillAuraMixin extends Module { @Shadow @Final private Setting customDelay; - @Shadow - @Final - private Setting hitDelay; private final Random random = new Random(); private Setting fov; @@ -123,6 +123,19 @@ public class KillAuraMixin extends Module { hitTimer -= random.nextInt(randomDelayMax.get()); } + @Inject(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;attackEntity(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/entity/Entity;)V"), cancellable = true) + private void onHit(Entity target, CallbackInfo info) { + ShieldBypass shieldBypass = Modules.get().get(ShieldBypass.class); + if (shieldBypass.isActive()) { + Cancellable dummyEvent = new Cancellable(); + shieldBypass.bypass(target, dummyEvent); + if (dummyEvent.isCancelled()) { + hitTimer = 0; + info.cancel(); + } + } + } + private double randomOffset() { return Math.random() * 4 - 2; } diff --git a/src/main/java/anticope/rejects/modules/AutoFarm.java b/src/main/java/anticope/rejects/modules/AutoFarm.java index 872b1f8..5e86f58 100644 --- a/src/main/java/anticope/rejects/modules/AutoFarm.java +++ b/src/main/java/anticope/rejects/modules/AutoFarm.java @@ -2,6 +2,7 @@ package anticope.rejects.modules; import anticope.rejects.MeteorRejectsAddon; import anticope.rejects.utils.WorldUtils; +import meteordevelopment.meteorclient.events.entity.player.BreakBlockEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Module; @@ -139,6 +140,21 @@ public class AutoFarm extends Module { replantMap.clear(); } + @EventHandler + private void onBreakBlock(BreakBlockEvent event) { + BlockState state = mc.world.getBlockState(event.blockPos); + Block block = state.getBlock(); + if (onlyReplant.get()) { + Item item = null; + if (block == Blocks.WHEAT) item = Items.WHEAT_SEEDS; + else if (block == Blocks.CARROTS) item = Items.CARROT; + else if (block == Blocks.POTATOES) item = Items.POTATO; + else if (block == Blocks.BEETROOTS) item = Items.BEETROOT_SEEDS; + else if (block == Blocks.NETHER_WART) item = Items.NETHER_WART; + if (item != null) replantMap.put(event.blockPos, item); + } + } + @EventHandler private void onTick(TickEvent.Pre event) { actions = 0; @@ -187,15 +203,6 @@ public class AutoFarm extends Module { mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(Utils.vec3d(pos), Direction.UP, pos, false)); else { mc.interactionManager.updateBlockBreakingProgress(pos, Direction.UP); - if (onlyReplant.get()) { - Item item = null; - if (block == Blocks.WHEAT) item = Items.WHEAT_SEEDS; - else if (block == Blocks.CARROTS) item = Items.CARROT; - else if (block == Blocks.POTATOES) item = Items.POTATO; - else if (block == Blocks.BEETROOTS) item = Items.BEETROOT_SEEDS; - else if (block == Blocks.NETHER_WART) item = Items.NETHER_WART; - if (item != null) replantMap.put(pos, item); - } } return true; } diff --git a/src/main/java/anticope/rejects/modules/ShieldBypass.java b/src/main/java/anticope/rejects/modules/ShieldBypass.java index 8f12ebb..36e8f2b 100644 --- a/src/main/java/anticope/rejects/modules/ShieldBypass.java +++ b/src/main/java/anticope/rejects/modules/ShieldBypass.java @@ -1,25 +1,34 @@ package anticope.rejects.modules; import anticope.rejects.MeteorRejectsAddon; -import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent; -import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.events.Cancellable; +import meteordevelopment.meteorclient.events.meteor.MouseButtonEvent; import meteordevelopment.meteorclient.settings.BoolSetting; import meteordevelopment.meteorclient.settings.Setting; import meteordevelopment.meteorclient.settings.SettingGroup; import meteordevelopment.meteorclient.systems.modules.Module; -import meteordevelopment.meteorclient.utils.player.Rotations; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.combat.KillAura; +import meteordevelopment.meteorclient.utils.misc.input.KeyAction; +import meteordevelopment.meteorclient.utils.player.InvUtils; import meteordevelopment.orbit.EventHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.item.AxeItem; +import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; +import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket; +import net.minecraft.util.hit.EntityHitResult; import net.minecraft.util.math.Vec3d; +import static org.lwjgl.glfw.GLFW.GLFW_MOUSE_BUTTON_LEFT; + public class ShieldBypass extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); - private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() - .name("rotate") - .description("Rotate towards enemy.") + private final Setting ignoreAxe = sgGeneral.add(new BoolSetting.Builder() + .name("ignore-axe") + .description("Ignore if you are holding an axe.") .defaultValue(true) .build() ); @@ -28,54 +37,57 @@ public class ShieldBypass extends Module { super(MeteorRejectsAddon.CATEGORY, "shield-bypass", "Attempts to teleport you behind enemies to bypass shields."); } - private Vec3d originalPos; - private Entity target; - - @Override - public void onDeactivate() { - originalPos = null; - target = null; - } - @EventHandler - private void onTick(TickEvent.Post event) { - if (originalPos != null && target != null) { - mc.interactionManager.attackEntity(mc.player, target); - mc.player.setPosition(originalPos); - if (rotate.get()) Rotations.rotate(-mc.player.getYaw(), mc.player.getPitch(), -10); - } - originalPos = null; - target = null; - } - - @EventHandler - private void onAttackEntity(AttackEntityEvent event) { - if (event.entity instanceof LivingEntity e && e.isBlocking()) { - if (originalPos != null) return; - - Vec3d originalPos = mc.player.getPos(); - - // Shield check - Vec3d vec3d3 = originalPos.relativize(e.getPos()).normalize(); - if (new Vec3d(vec3d3.x, 0.0d, vec3d3.z).dotProduct(e.getRotationVec(1.0f)) >= 0.0d) return; - - double range = mc.player.distanceTo(e); - while (range >= 0) { - Vec3d tp = Vec3d.fromPolar(0, mc.player.getYaw()).normalize().multiply(range); - Vec3d newPos = tp.add(e.getPos()); - BlockPos pos = BlockPos.ofFloored(newPos); - for (int i = -2; i <= 2; i++) { - if (mc.player.getWorld().getBlockState(pos.up(i)).isAir() && mc.player.getWorld().getBlockState(pos).isAir()) { - this.originalPos = originalPos; - if (rotate.get()) Rotations.rotate(-mc.player.getYaw(), mc.player.getPitch(), -10); - target = e; - event.cancel(); - mc.player.setPosition(newPos.add(0, i, 0)); - return; - } - } - range--; + private void onMouseButton(MouseButtonEvent event) { + if (Modules.get().isActive(KillAura.class)) return; + if (mc.currentScreen == null && !mc.player.isUsingItem() && event.action == KeyAction.Press && event.button == GLFW_MOUSE_BUTTON_LEFT) { + if (mc.crosshairTarget instanceof EntityHitResult result) { + bypass(result.getEntity(), event); } } } + + private boolean isBlocked(Vec3d pos, LivingEntity target) { + Vec3d vec3d3 = pos.relativize(target.getPos()).normalize(); + return new Vec3d(vec3d3.x, 0.0d, vec3d3.z).dotProduct(target.getRotationVec(1.0f)) >= 0.0d; + } + + public void bypass(Entity target, Cancellable event) { + if (target instanceof LivingEntity e && e.isBlocking()) { + if (ignoreAxe.get() && InvUtils.testInMainHand(i -> i.getItem() instanceof AxeItem)) return; + + // Shield check + if (isBlocked(mc.player.getPos(), e)) return; + + Vec3d offset = Vec3d.fromPolar(0, mc.player.getYaw()).normalize().multiply(2); + Vec3d newPos = e.getPos().add(offset); + + // Move up to prevent tping into blocks + boolean inside = false; + for (float i = 0; i < 4; i += 0.25) { + Vec3d targetPos = newPos.add(0, i, 0); + + boolean collides = !mc.world.isSpaceEmpty(null, e.getBoundingBox().offset(offset).offset(targetPos.subtract(newPos))); + + if (!inside && collides) { + inside = true; + } else if (inside && !collides) { + newPos = targetPos; + break; + } + } + + if (!isBlocked(newPos, e)) return; + + event.cancel(); + + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(newPos.getX(), newPos.getY(), newPos.getZ(), true)); + + mc.getNetworkHandler().sendPacket(PlayerInteractEntityC2SPacket.attack(e, mc.player.isSneaking())); + mc.getNetworkHandler().sendPacket(new HandSwingC2SPacket(mc.player.getActiveHand())); + mc.player.resetLastAttackedTicks(); + + mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(mc.player.getX(), mc.player.getY(), mc.player.getZ(), true)); + } + } }