diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java index 1e18bfd65d..7da69bbfbd 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/Modules.java @@ -411,6 +411,7 @@ private void initCombat() { } private void initPlayer() { + add(new AntiBreak()); add(new AntiHunger()); add(new AutoEat()); add(new AutoFish()); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiBreak.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiBreak.java new file mode 100644 index 0000000000..3d1fc952f8 --- /dev/null +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AntiBreak.java @@ -0,0 +1,82 @@ +/* + * This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client). + * Copyright (c) Meteor Development. + */ + +package meteordevelopment.meteorclient.systems.modules.player; + +import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent; +import meteordevelopment.meteorclient.events.entity.player.StartBreakingBlockEvent; +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.Categories; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; +import meteordevelopment.meteorclient.systems.modules.world.InfinityMiner; +import meteordevelopment.meteorclient.utils.world.BlockUtils; +import meteordevelopment.orbit.EventHandler; +import meteordevelopment.orbit.EventPriority; +import net.minecraft.block.BlockState; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; + +public class AntiBreak extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + + private final Setting breakDurability = sgGeneral.add(new IntSetting.Builder() + .name("anti-break-percentage") + .description("The durability percentage to stop using a tool.") + .defaultValue(10) + .range(1, 100) + .sliderRange(1, 100) + .build() + ); + + private final Setting preventMine = sgGeneral.add(new BoolSetting.Builder() + .name("prevent-mine") + .description("Prevents mining if the selected tool is low durability.") + .defaultValue(true) + .build() + ); + + private final Setting preventHit = sgGeneral.add(new BoolSetting.Builder() + .name("prevent-hit") + .description("Prevents hitting if the selected tool is low durability.") + .defaultValue(true) + .build() + ); + + public AntiBreak() { + super(Categories.Player, "anti-break", "Prevents you from using items which are about to break."); + } + + public boolean canUse(ItemStack itemStack) { + return !itemStack.isDamageable() || itemStack.getMaxDamage() - itemStack.getDamage() >= itemStack.getMaxDamage() * breakDurability.get() / 100; + } + + @EventHandler(priority = EventPriority.HIGH - 10) //after autotool + private void onStartBreakingBlock(StartBreakingBlockEvent event) { + if (!preventMine.get() || Modules.get().isActive(InfinityMiner.class)) return; + + BlockState state = mc.world.getBlockState(event.blockPos); + if (state.getHardness(mc.world, event.blockPos) == 0) return; //breaks instantly + if (!BlockUtils.canBreak(event.blockPos, state)) return; //can't break + + if (!canUse(mc.player.getMainHandStack())) { + mc.options.attackKey.setPressed(false); + event.cancel(); + } + } + + @EventHandler(priority = EventPriority.HIGH) + private void onAttackEntity(AttackEntityEvent event) { + if (!preventHit.get() || !event.entity.isAttackable() || !(event.entity instanceof LivingEntity)) return; + + if (!canUse(mc.player.getMainHandStack())) { + mc.options.attackKey.setPressed(false); + event.cancel(); + } + } +} diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java index 7410c1f427..76d3fa8654 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/player/AutoTool.java @@ -52,24 +52,7 @@ public class AutoTool extends Module { .defaultValue(false) .build() ); - - private final Setting antiBreak = sgGeneral.add(new BoolSetting.Builder() - .name("anti-break") - .description("Stops you from breaking your tool.") - .defaultValue(false) - .build() - ); - - private final Setting breakDurability = sgGeneral.add(new IntSetting.Builder() - .name("anti-break-percentage") - .description("The durability percentage to stop using a tool.") - .defaultValue(10) - .range(1, 100) - .sliderRange(1, 100) - .visible(antiBreak::get) - .build() - ); - + private final Setting switchBack = sgGeneral.add(new BoolSetting.Builder() .name("switch-back") .description("Switches your hand to whatever was selected when releasing your attack key.") @@ -152,14 +135,15 @@ private void onStartBreakingBlock(StartBreakingBlockEvent event) { double bestScore = -1; bestSlot = -1; + AntiBreak antiBreak = Modules.get().get(AntiBreak.class); + for (int i = 0; i < 9; i++) { ItemStack itemStack = mc.player.getInventory().getStack(i); if (listMode.get() == ListMode.Whitelist && !whitelist.get().contains(itemStack.getItem())) continue; if (listMode.get() == ListMode.Blacklist && blacklist.get().contains(itemStack.getItem())) continue; - double score = getScore(itemStack, blockState, silkTouchForEnderChest.get(), fortuneForOresCrops.get(), prefer.get(), itemStack2 -> !shouldStopUsing(itemStack2)); - if (score < 0) continue; + double score = getScore(itemStack, blockState, silkTouchForEnderChest.get(), fortuneForOresCrops.get(), prefer.get(), itemStack2 -> antiBreak.isActive() && antiBreak.canUse(itemStack2)); if (score > bestScore) { bestScore = score; @@ -167,24 +151,12 @@ private void onStartBreakingBlock(StartBreakingBlockEvent event) { } } - if ((bestSlot != -1 && (bestScore > getScore(currentStack, blockState, silkTouchForEnderChest.get(), fortuneForOresCrops.get(), prefer.get(), itemStack -> !shouldStopUsing(itemStack))) || shouldStopUsing(currentStack) || !isTool(currentStack))) { + if ((bestSlot != -1 && bestSlot != mc.player.getInventory().selectedSlot || !isTool(currentStack))) { ticks = switchDelay.get(); if (ticks == 0) InvUtils.swap(bestSlot, true); else shouldSwitch = true; } - - // Anti break - currentStack = mc.player.getMainHandStack(); - - if (shouldStopUsing(currentStack) && isTool(currentStack)) { - mc.options.attackKey.setPressed(false); - event.cancel(); - } - } - - private boolean shouldStopUsing(ItemStack itemStack) { - return antiBreak.get() && (itemStack.getMaxDamage() - itemStack.getDamage()) < (itemStack.getMaxDamage() * breakDurability.get() / 100); } public static double getScore(ItemStack itemStack, BlockState state, boolean silkTouchEnderChest, boolean fortuneOre, EnchantPreference enchantPreference, Predicate good) {