public class AutoFarm extends Module {
private final StopWatch stopWatchMain = new StopWatch();
private final StopWatch stopWatch = new StopWatch();
private boolean autoRepair, expValid;
@Override
public void toggle() {
super.toggle();
autoRepair = false;
expValid = false;
}
@EventHandler
public void onStopUseItemEvent(StopUseItemEvent e) {
e.setCancelled(mc.player.getFoodStats().needFood());
}
@EventHandler
public void onUpdate(UpdateEvent e) {
List<Item> hoeItems = List.of(Items.NETHERITE_HOE, Items.DIAMOND_HOE);
List<Item> plantsItems = List.of(Items.CARROT, Items.POTATO);
Slot expSlot = InvUtil.getInventorySlot(Items.EXPERIENCE_BOTTLE);
Slot plantSlot = InvUtil.getInventorySlot(plantsItems);
Slot hoeSlot = InvUtil.getInventorySlot(hoeItems);
int expCount = InvUtil.getInventoryCount(Items.EXPERIENCE_BOTTLE);
Item mainHandItem = mc.player.getHeldItemMainhand().getItem();
Item offHandItem = mc.player.getHeldItemOffhand().getItem();
if (hoeSlot == null || MoveUtil.isMoving() || !stopWatchMain.finished(500)) return;
RotationComponent.update(new Rotation(Rotation.cameraYaw(), 90), 360, 360, 0, 5);
float itemStrength = 1 - MathHelper.clamp((float) hoeSlot.getStack().getDamage() / (float) hoeSlot.getStack().getMaxDamage(), 0, 1);
if (itemStrength < 0.05) {
autoRepair = true;
} else if (itemStrength == 1 && autoRepair) {
stopWatchMain.reset();
autoRepair = false;
expValid = false;
return;
}
expValid = expCount >= 320 || expCount != 0 && expValid;
if (mc.player.getFoodStats().needFood()) {
Slot slot = InvUtil.getSlotFoodMaxSaturation();
if (!offHandItem.equals(slot.getStack().getItem())) {
if (mc.currentScreen instanceof ContainerScreen<?>) {
mc.player.closeScreen();
return;
}
InvUtil.clickSlot(slot, 40, ClickType.SWAP, false);
}
mc.playerController.processRightClick(mc.player, mc.world, Hand.OFF_HAND);
} else if (mc.player.inventory.getFirstEmptyStack() == -1) {
if (!plantsItems.contains(offHandItem)) {
InvUtil.clickSlot(plantSlot, 40, ClickType.SWAP, false);
return;
}
if (mc.currentScreen instanceof ContainerScreen<?> screen) {
if (screen.getTitle().getString().equals("● Выберите секцию")) {
InvUtil.clickSlotId(21, 0, ClickType.PICKUP, true);
return;
}
if (screen.getTitle().getString().equals("Скупщик еды")) {
InvUtil.clickSlotId(offHandItem.equals(Items.CARROT) ? 10 : 11, 0, ClickType.PICKUP, true);
return;
}
}
if (stopWatch.finished(1000)) {
mc.player.sendChatMessage("/buyer");
stopWatch.reset();
}
} else if (autoRepair) {
if (expValid) {
if (mc.currentScreen instanceof ContainerScreen<?>) {
mc.player.closeScreen();
stopWatchMain.reset();
return;
}
if (!offHandItem.equals(Items.EXPERIENCE_BOTTLE)) {
InvUtil.clickSlot(expSlot, 40, ClickType.SWAP, false);
}
if (!hoeItems.contains(mainHandItem)) {
InvUtil.clickSlot(hoeSlot, mc.player.inventory.currentItem, ClickType.SWAP, false);
}
mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(Hand.OFF_HAND));
} else if (stopWatch.finished(800)) {
if (mc.currentScreen instanceof ContainerScreen<?> screen) {
if (screen.getTitle().getString().contains("Пузырек опыта")) {
mc.player.openContainer.inventorySlots.stream().filter(s -> s.getStack().getTag() != null && s.slotNumber < 45)
.min(Comparator.comparingInt(s -> AutoBuyUtil.getPrice(s.getStack()) / s.getStack().getCount()))
.ifPresent(s -> InvUtil.clickSlot(s, 0, ClickType.QUICK_MOVE, true));
stopWatch.reset();
return;
} else if (screen.getTitle().getString().contains("Подозрительная цена")) {
InvUtil.clickSlotId(0, 0, ClickType.QUICK_MOVE, true);
stopWatch.reset();
return;
}
}
mc.player.sendChatMessage("/ah search Пузырёк Опыта");
stopWatch.reset();
}
} else {
BlockPos pos = mc.player.getPosition();
if (mc.world.getBlockState(pos).getBlock().equals(Blocks.FARMLAND)) {
if (hoeItems.contains(mainHandItem) && plantsItems.contains(offHandItem)) {
mc.player.connection.sendPacket(new CPlayerTryUseItemOnBlockPacket(Hand.OFF_HAND, new BlockRayTraceResult(mc.player.getPositionVec(), Direction.UP, pos, false)));
IntStream.range(0, 3).forEach(i -> mc.player.connection.sendPacket(new CPlayerTryUseItemOnBlockPacket(Hand.MAIN_HAND, new BlockRayTraceResult(mc.player.getPositionVec(), Direction.UP, pos.up(), false))));
mc.player.connection.sendPacket(new CPlayerDiggingPacket(CPlayerDiggingPacket.Action.START_DESTROY_BLOCK, pos.up(), Direction.UP));
} else {
if (mc.currentScreen instanceof ContainerScreen<?>) {
mc.player.closeScreen();
stopWatchMain.reset();
return;
}
if (!plantsItems.contains(offHandItem)) {
InvUtil.clickSlot(plantSlot, 40, ClickType.SWAP, false);
}
if (!hoeItems.contains(mainHandItem)) {
InvUtil.clickSlot(hoeSlot, mc.player.inventory.currentItem, ClickType.SWAP, false);
}
}
}
}
}
}