From 871122fac1b632b1d7412f197aad27fd156464ef Mon Sep 17 00:00:00 2001 From: Osama Date: Fri, 29 Nov 2024 22:21:46 +0600 Subject: [PATCH 01/19] Sorry my autoformat messed up the formatting - cant do nutting bout it --- .../feature/impl/AutoWardrobe.java | 4 + .../farmhelperv2/feature/impl/PestFarmer.java | 5 + .../feature/impl/PestsDestroyer.java | 2805 +++++++++-------- 3 files changed, 1538 insertions(+), 1276 deletions(-) create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java new file mode 100644 index 000000000..e8d8797b5 --- /dev/null +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java @@ -0,0 +1,4 @@ +package com.jelly.farmhelperv2.feature.impl; + +public class AutoWardrobe { +} diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java new file mode 100644 index 000000000..d1e389cff --- /dev/null +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -0,0 +1,5 @@ +package com.jelly.farmhelperv2.feature.impl; + +public class PestFarmer { + +} diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java index def6660e7..21dfbe9a2 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java @@ -48,1377 +48,1630 @@ import java.util.stream.Collectors; public class PestsDestroyer implements IFeature { - private static PestsDestroyer instance; - private final Minecraft mc = Minecraft.getMinecraft(); - private final List> pests = Arrays.asList( - new Tuple<>("Beetle", "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTc4OTkzNCwKICAicHJvZmlsZUlkIiA6ICJlMjc5NjliODYyNWY0NDg1YjkyNmM5NTBhMDljMWMwMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJLRVZJTktFTE9LRSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83MGExZTgzNmJmMTk2OGIyZWFhNDgzNzIyN2ExOTIwNGYxNzI5NWQ4NzBlZTllNzU0YmQ2YjZkNjBkZGJlZDNjIgogICAgfQogIH0KfQ"), - new Tuple<>("Cricket", "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTgxMTI2NCwKICAicHJvZmlsZUlkIiA6ICJjZjc4YzFkZjE3ZTI0Y2Q5YTIxYmU4NWQ0NDk5ZWE4ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNYXR0c0FybW9yU3RhbmRzIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2EyNGM2OWY5NmNlNTU2MjIxZTE5NWM4ZWYyYmZhZDcxZWJmN2Y5NWY1YWU5MTRhNDg0YThkMGVjMjE2NzI2NzQiCiAgICB9CiAgfQp9"), - new Tuple<>("Earthworm", "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ1OTc0NywKICAicHJvZmlsZUlkIiA6ICIyNTBlNzc5MjZkNDM0ZDIyYWM2MTQ4N2EyY2M3YzAwNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJMdW5hMTIxMDUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjQwM2JhNDAyN2EzMzNkOGQyZmQzMmFiNTlkMWNmZGJhYTdkOTA4ZDgwZDIzODFkYjJhNjljYmU2NTQ1MGFkOCIKICAgIH0KICB9Cn0"), - new Tuple<>("Fly", "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTA2MzI4MSwKICAicHJvZmlsZUlkIiA6ICJjN2FmMWNkNjNiNTE0Y2YzOGY4NWQ2ZDUxNzhjYThlNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJtb25zdGVyZ2FtZXIzMTUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWQ5MGU3Nzc4MjZhNTI0NjEzNjhlMjZkMWIyZTE5YmZhMWJhNTgyZDYwMjQ4M2U1NDVmNDEyNGQwZjczMTg0MiIKICAgIH0KICB9Cn0"), - new Tuple<>("Locust", "ewogICJ0aW1lc3RhbXAiIDogMTY5NzU1NzA3NzAzNywKICAicHJvZmlsZUlkIiA6ICI0YjJlMGM1ODliZjU0ZTk1OWM1ZmJlMzg5MjQ1MzQzZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJfTmVvdHJvbl8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGIyNGE0ODJhMzJkYjFlYTc4ZmI5ODA2MGIwYzJmYTRhMzczY2JkMThhNjhlZGRkZWI3NDE5NDU1YTU5Y2RhOSIKICAgIH0KICB9Cn0"), - new Tuple<>("Mite", "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQxOTcyNSwKICAicHJvZmlsZUlkIiA6ICJkYjYzNWE3MWI4N2U0MzQ5YThhYTgwOTMwOWFhODA3NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJFbmdlbHMxNzQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmU2YmFmNjQzMWE5ZGFhMmNhNjA0ZDVhM2MyNmU5YTc2MWQ1OTUyZjA4MTcxNzRhNGZlMGI3NjQ2MTZlMjFmZiIKICAgIH0KICB9Cn0"), - new Tuple<>("Mosquito", "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTAyOTQ2MSwKICAicHJvZmlsZUlkIiA6ICI3NTE0NDQ4MTkxZTY0NTQ2OGM5NzM5YTZlMzk1N2JlYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGFua3NNb2phbmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTJhOWZlMDViYzY2M2VmY2QxMmU1NmEzY2NjNWVjMDM1YmY1NzdiNzg3MDg1NDhiNmY0ZmZjZjFkMzBlY2NmZSIKICAgIH0KICB9Cn0"), - new Tuple<>("Moth", "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQwNTk1NCwKICAicHJvZmlsZUlkIiA6ICJiMTUyZDlhZTE1MTM0OWNmOWM2NmI0Y2RjMTA5NTZjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaXNxdW90aCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82NTQ4NWM0YjM0ZTViNTQ3MGJlOTRkZTEwMGU2MWY3ODE2ZjgxYmM1YTExZGZkZjBlY2NmODkwMTcyZGE1ZDBhIgogICAgfQogIH0KfQ"), - new Tuple<>("Rat", "ewogICJ0aW1lc3RhbXAiIDogMTYxODQxOTcwMTc1MywKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdUlJZXQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYThhYmI0NzFkYjBhYjc4NzAzMDExOTc5ZGM4YjQwNzk4YTk0MWYzYTRkZWMzZWM2MWNiZWVjMmFmOGNmZmU4IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0="), - new Tuple<>("Slug", "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ0MzA4MiwKICAicHJvZmlsZUlkIiA6ICJkOGNkMTNjZGRmNGU0Y2IzODJmYWZiYWIwOGIyNzQ4OSIsCiAgInByb2ZpbGVOYW1lIiA6ICJaYWNoeVphY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E3OWQwZmQ2NzdiNTQ1MzA5NjExMTdlZjg0YWRjMjA2ZTJjYzUwNDVjMTM0NGQ2MWQ3NzZiZjhhYzJmZTFiYSIKICAgIH0KICB9Cn0") - ); - private Optional closestPlot = Optional.empty(); - @Getter - private final ArrayList pestsLocations = new ArrayList<>(); - private final List killedEntities = new ArrayList<>(); - @Getter - private final Clock stuckClock = new Clock(); - @Getter - private final Clock delayClock = new Clock(); - private final Clock delayBetweenBackTaps = new Clock(); - private final Clock delayBetweenFireworks = new Clock(); - @Getter - private Optional currentEntityTarget = Optional.empty(); - private boolean enabled = false; - private boolean preparing = false; - @Setter - @Getter - public int cantReachPest = 0; - @Getter - @Setter - private States state = States.IDLE; - @Getter - private EscapeState escapeState = EscapeState.NONE; - private Optional preTpBlockPos = Optional.empty(); - private long lastFireworkTime = 0; - private int getLocationTries = 0; - private int flyPathfinderTries = 0; - private RotationState rotationState = RotationState.NONE; - private boolean needToUpdatePlots = false; - private final HashMap vacuumRange = new HashMap() {{ - put("Skymart Vacuum", 5F); - put("Turbo Vacuum", 7.5F); - put("Hyper Vacuum", 10F); - put("InfiniVacuum™ Hooverius", 15F); - put("InfiniVacuum", 12.5F); - }}; - @Getter - private float currentVacuumRange = -1; - - private boolean gotRangeOfVacuum = false; - private boolean isPlotObstructed = false; - private long lastKillTimestamp = 0; - private int previousCurrentPlotPestsCount = 0; - - private final List killedPestsFrom = new ArrayList<>(); - - public static PestsDestroyer getInstance() { - if (instance == null) { - instance = new PestsDestroyer(); - } - return instance; - } - - @Override - public String getName() { - return "Pests Destroyer"; - } - - @Override - public boolean isRunning() { - return enabled || preparing; - } - - @Override - public boolean shouldPauseMacroExecution() { - return true; - } - @Override - public boolean shouldStartAtMacroStart() { - return false; + private static PestsDestroyer instance; + private final Minecraft mc = Minecraft.getMinecraft(); + private final List> pests = Arrays.asList( + new Tuple<>("Beetle", + "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTc4OTkzNCwKICAicHJvZmlsZUlkIiA6ICJlMjc5NjliODYyNWY0NDg1YjkyNmM5NTBhMDljMWMwMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJLRVZJTktFTE9LRSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83MGExZTgzNmJmMTk2OGIyZWFhNDgzNzIyN2ExOTIwNGYxNzI5NWQ4NzBlZTllNzU0YmQ2YjZkNjBkZGJlZDNjIgogICAgfQogIH0KfQ"), + new Tuple<>("Cricket", + "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTgxMTI2NCwKICAicHJvZmlsZUlkIiA6ICJjZjc4YzFkZjE3ZTI0Y2Q5YTIxYmU4NWQ0NDk5ZWE4ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNYXR0c0FybW9yU3RhbmRzIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2EyNGM2OWY5NmNlNTU2MjIxZTE5NWM4ZWYyYmZhZDcxZWJmN2Y5NWY1YWU5MTRhNDg0YThkMGVjMjE2NzI2NzQiCiAgICB9CiAgfQp9"), + new Tuple<>("Earthworm", + "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ1OTc0NywKICAicHJvZmlsZUlkIiA6ICIyNTBlNzc5MjZkNDM0ZDIyYWM2MTQ4N2EyY2M3YzAwNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJMdW5hMTIxMDUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjQwM2JhNDAyN2EzMzNkOGQyZmQzMmFiNTlkMWNmZGJhYTdkOTA4ZDgwZDIzODFkYjJhNjljYmU2NTQ1MGFkOCIKICAgIH0KICB9Cn0"), + new Tuple<>("Fly", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTA2MzI4MSwKICAicHJvZmlsZUlkIiA6ICJjN2FmMWNkNjNiNTE0Y2YzOGY4NWQ2ZDUxNzhjYThlNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJtb25zdGVyZ2FtZXIzMTUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWQ5MGU3Nzc4MjZhNTI0NjEzNjhlMjZkMWIyZTE5YmZhMWJhNTgyZDYwMjQ4M2U1NDVmNDEyNGQwZjczMTg0MiIKICAgIH0KICB9Cn0"), + new Tuple<>("Locust", + "ewogICJ0aW1lc3RhbXAiIDogMTY5NzU1NzA3NzAzNywKICAicHJvZmlsZUlkIiA6ICI0YjJlMGM1ODliZjU0ZTk1OWM1ZmJlMzg5MjQ1MzQzZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJfTmVvdHJvbl8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGIyNGE0ODJhMzJkYjFlYTc4ZmI5ODA2MGIwYzJmYTRhMzczY2JkMThhNjhlZGRkZWI3NDE5NDU1YTU5Y2RhOSIKICAgIH0KICB9Cn0"), + new Tuple<>("Mite", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQxOTcyNSwKICAicHJvZmlsZUlkIiA6ICJkYjYzNWE3MWI4N2U0MzQ5YThhYTgwOTMwOWFhODA3NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJFbmdlbHMxNzQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmU2YmFmNjQzMWE5ZGFhMmNhNjA0ZDVhM2MyNmU5YTc2MWQ1OTUyZjA4MTcxNzRhNGZlMGI3NjQ2MTZlMjFmZiIKICAgIH0KICB9Cn0"), + new Tuple<>("Mosquito", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTAyOTQ2MSwKICAicHJvZmlsZUlkIiA6ICI3NTE0NDQ4MTkxZTY0NTQ2OGM5NzM5YTZlMzk1N2JlYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGFua3NNb2phbmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTJhOWZlMDViYzY2M2VmY2QxMmU1NmEzY2NjNWVjMDM1YmY1NzdiNzg3MDg1NDhiNmY0ZmZjZjFkMzBlY2NmZSIKICAgIH0KICB9Cn0"), + new Tuple<>("Moth", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQwNTk1NCwKICAicHJvZmlsZUlkIiA6ICJiMTUyZDlhZTE1MTM0OWNmOWM2NmI0Y2RjMTA5NTZjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaXNxdW90aCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82NTQ4NWM0YjM0ZTViNTQ3MGJlOTRkZTEwMGU2MWY3ODE2ZjgxYmM1YTExZGZkZjBlY2NmODkwMTcyZGE1ZDBhIgogICAgfQogIH0KfQ"), + new Tuple<>("Rat", + "ewogICJ0aW1lc3RhbXAiIDogMTYxODQxOTcwMTc1MywKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdUlJZXQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYThhYmI0NzFkYjBhYjc4NzAzMDExOTc5ZGM4YjQwNzk4YTk0MWYzYTRkZWMzZWM2MWNiZWVjMmFmOGNmZmU4IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0="), + new Tuple<>("Slug", + "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ0MzA4MiwKICAicHJvZmlsZUlkIiA6ICJkOGNkMTNjZGRmNGU0Y2IzODJmYWZiYWIwOGIyNzQ4OSIsCiAgInByb2ZpbGVOYW1lIiA6ICJaYWNoeVphY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E3OWQwZmQ2NzdiNTQ1MzA5NjExMTdlZjg0YWRjMjA2ZTJjYzUwNDVjMTM0NGQ2MWQ3NzZiZjhhYzJmZTFiYSIKICAgIH0KICB9Cn0") + ); + private Optional closestPlot = Optional.empty(); + @Getter + private final ArrayList pestsLocations = new ArrayList<>(); + private final List killedEntities = new ArrayList<>(); + @Getter + private final Clock stuckClock = new Clock(); + @Getter + private final Clock delayClock = new Clock(); + private final Clock delayBetweenBackTaps = new Clock(); + private final Clock delayBetweenFireworks = new Clock(); + @Getter + private Optional currentEntityTarget = Optional.empty(); + private boolean enabled = false; + private boolean preparing = false; + @Setter + @Getter + public int cantReachPest = 0; + @Getter + @Setter + private States state = States.IDLE; + @Getter + private EscapeState escapeState = EscapeState.NONE; + private Optional preTpBlockPos = Optional.empty(); + private long lastFireworkTime = 0; + private int getLocationTries = 0; + private int flyPathfinderTries = 0; + private RotationState rotationState = RotationState.NONE; + private boolean needToUpdatePlots = false; + private final HashMap vacuumRange = new HashMap() {{ + put("Skymart Vacuum", 5F); + put("Turbo Vacuum", 7.5F); + put("Hyper Vacuum", 10F); + put("InfiniVacuum™ Hooverius", 15F); + put("InfiniVacuum", 12.5F); + }}; + @Getter + private float currentVacuumRange = -1; + + private boolean gotRangeOfVacuum = false; + private boolean isPlotObstructed = false; + private long lastKillTimestamp = 0; + private int previousCurrentPlotPestsCount = 0; + private int currentSlot = -1; + private boolean finishing = false; + + private final List killedPestsFrom = new ArrayList<>(); + + public static PestsDestroyer getInstance() { + if (instance == null) { + instance = new PestsDestroyer(); + } + return instance; + } + + @Override + public String getName() { + return "Pests Destroyer"; + } + + @Override + public boolean isRunning() { + return enabled || preparing; + } + + @Override + public boolean shouldPauseMacroExecution() { + return true; + } + + @Override + public boolean shouldStartAtMacroStart() { + return false; + } + + @Override + public void start() { + if (enabled) { + return; + } + gotRangeOfVacuum = false; + isPlotObstructed = false; + preparing = true; + lastKillTimestamp = 0; + if (MacroHandler.getInstance().isMacroToggled()) { + MacroHandler.getInstance().pauseMacro(); + MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); + KeyBindUtils.stopMovement(); + } + escapeState = EscapeState.NONE; + rotationState = RotationState.NONE; + state = States.IDLE; + killedEntities.clear(); + killedPestsFrom.clear(); + Multithreading.schedule(() -> { + if (!preparing) { + return; + } + enabled = true; + preparing = false; + LogUtils.sendWarning("[Pests Destroyer] Starting killing shitters!"); + if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { + LogUtils.webhookLog("[Pests Destroyer]\\nStarting killing shitters!"); + } + }, MacroHandler.getInstance().isMacroToggled() ? (800 + (long) (Math.random() * 500)) : 0, TimeUnit.MILLISECONDS); + IFeature.super.start(); + } + + @Override + public void stop() { + if (enabled || preparing) { + LogUtils.sendWarning("[Pests Destroyer] Stopping!"); + if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { + LogUtils.webhookLog("[Pests Destroyer]\\nStopping!"); + } + if (GameStateHandler.getInstance().getPestsCount() == 0) { + pestsLocations.clear(); + } + } + PlayerUtils.closeScreen(); + currentEntityTarget = Optional.empty(); + resetFireworkInfo(); + preTpBlockPos = Optional.empty(); + delayBetweenBackTaps.reset(); + delayBetweenFireworks.reset(); + delayClock.reset(); + stuckClock.reset(); + preparing = false; + enabled = false; + isPlotObstructed = false; + lastFireworkTime = 0; + getLocationTries = 0; + flyPathfinderTries = 0; + state = States.IDLE; + FlyPathFinderExecutor.getInstance().stop(); + KeyBindUtils.stopMovement(); + finishing = false; + currentSlot = -1; + IFeature.super.stop(); + } + + @Override + public void resetStatesAfterMacroDisabled() { + stop(); + gotRangeOfVacuum = false; + if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + return; + } + FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; + LogUtils.sendWarning("[Pests Destroyer] AFK Mode has been disabled"); + } + + @Override + public boolean isToggled() { + return FarmHelperConfig.enablePestsDestroyer; + } + + @Override + public boolean shouldCheckForFailsafes() { + return escapeState == EscapeState.NONE && + state != States.TELEPORT_TO_PLOT && + state != States.WAIT_FOR_TP && + state != States.CHECKING_PLOT && + state != States.CHECKING_SPAWN && + state != States.GET_LOCATION; + } + + @SubscribeEvent + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + return; + } + if (Keyboard.getEventKeyState() && Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); + stop(); + FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; } + } - @Override - public void start() { - if (enabled) return; - gotRangeOfVacuum = false; - isPlotObstructed = false; - preparing = true; - lastKillTimestamp = 0; - if (MacroHandler.getInstance().isMacroToggled()) { - MacroHandler.getInstance().pauseMacro(); - MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); - KeyBindUtils.stopMovement(); - } - escapeState = EscapeState.NONE; - rotationState = RotationState.NONE; - state = States.IDLE; - killedEntities.clear(); - killedPestsFrom.clear(); - Multithreading.schedule(() -> { - if (!preparing) return; - enabled = true; - preparing = false; - LogUtils.sendWarning("[Pests Destroyer] Starting killing shitters!"); - if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { - LogUtils.webhookLog("[Pests Destroyer]\\nStarting killing shitters!"); - } - }, MacroHandler.getInstance().isMacroToggled() ? (800 + (long) (Math.random() * 500)) : 0, TimeUnit.MILLISECONDS); - IFeature.super.start(); + @SubscribeEvent + public void onTickAFKMode(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + return; + } + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + return; + } + if (MacroHandler.getInstance().isMacroToggled()) { + return; + } + if (!isToggled()) { + return; + } + if (isRunning()) { + return; } - @Override - public void stop() { - if (enabled || preparing) { - LogUtils.sendWarning("[Pests Destroyer] Stopping!"); - if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { - LogUtils.webhookLog("[Pests Destroyer]\\nStopping!"); - } - if (GameStateHandler.getInstance().getPestsCount() == 0) { - pestsLocations.clear(); - } - } - PlayerUtils.closeScreen(); - currentEntityTarget = Optional.empty(); - resetFireworkInfo(); - preTpBlockPos = Optional.empty(); - delayBetweenBackTaps.reset(); - delayBetweenFireworks.reset(); - delayClock.reset(); - stuckClock.reset(); - preparing = false; - enabled = false; - isPlotObstructed = false; - lastFireworkTime = 0; - getLocationTries = 0; - flyPathfinderTries = 0; - state = States.IDLE; - FlyPathFinderExecutor.getInstance().stop(); - KeyBindUtils.stopMovement(); - IFeature.super.stop(); + if (canEnableMacro(true)) { + start(); } + } + + public boolean canEnableMacro() { + return canEnableMacro(false); + } - @Override - public void resetStatesAfterMacroDisabled() { - stop(); - gotRangeOfVacuum = false; - if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) return; + public boolean canEnableMacro(boolean manually) { + if (!isToggled()) { + return false; + } + if (isRunning()) { + return false; + } + if (!GameStateHandler.getInstance().inGarden()) { + return false; + } + if (!MacroHandler.getInstance().isMacroToggled() && !manually) { + return false; + } + if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) { + return false; + } + if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { + return false; + } + if (enabled || preparing) { + return false; + } + if (GameStateHandler.getInstance().getPestsCount() < FarmHelperConfig.startKillingPestsAt && !manually || (manually + && GameStateHandler.getInstance().getPestsCount() == 0)) { + return false; + } + if (!manually && FarmHelperConfig.pausePestsDestroyerDuringJacobsContest && GameStateHandler.getInstance().inJacobContest()) { + LogUtils.sendError("[Pests Destroyer] Pests Destroyer won't activate during Jacob's Contest!"); + return false; + } + if (!mc.thePlayer.capabilities.allowFlying) { + LogUtils.sendError("[Pests Destroyer] You need to be able to fly!"); + if (FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; - LogUtils.sendWarning("[Pests Destroyer] AFK Mode has been disabled"); + } + return false; } + return true; + } - @Override - public boolean isToggled() { - return FarmHelperConfig.enablePestsDestroyer; + @SubscribeEvent + public void onTickExecute(TickEvent.ClientTickEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; } - - @Override - public boolean shouldCheckForFailsafes() { - return escapeState == EscapeState.NONE && - state != States.TELEPORT_TO_PLOT && - state != States.WAIT_FOR_TP && - state != States.CHECKING_PLOT && - state != States.CHECKING_SPAWN && - state != States.GET_LOCATION; + if (mc.currentScreen == null && checkedThisGui) { + checkedThisGui = false; } - - @SubscribeEvent - public void onKeyInput(InputEvent.KeyInputEvent event) { - if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) return; - if (Keyboard.getEventKeyState() && Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { - LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); - stop(); - FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; + if (!gotRangeOfVacuum && (isToggled() || PestsDestroyerOnTheTrack.getInstance().isToggled())) { + Slot vacuumSlot = InventoryUtils.getSlotOfItemInInventory("Vacuum"); + if (vacuumSlot != null) { + ItemStack vacuumItem = vacuumSlot.getStack(); + for (Map.Entry vacuumRange : this.vacuumRange.entrySet()) { + if (vacuumItem.getDisplayName().contains(vacuumRange.getKey())) { + currentVacuumRange = vacuumRange.getValue(); + gotRangeOfVacuum = true; + LogUtils.sendDebug("[Pests Destroyer] Found vacuum range: " + currentVacuumRange); + break; + } } + } + } + if (!isToggled()) { + return; + } + if (event.phase != TickEvent.Phase.END) { + return; + } + if (!GameStateHandler.getInstance().inGarden() && escapeState == EscapeState.NONE) { + return; + } + if (!enabled) { + return; + } + if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) { + return; + } + if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { + stop(); + return; } - @SubscribeEvent - public void onTickAFKMode(TickEvent.ClientTickEvent event) { - if (event.phase == TickEvent.Phase.END) return; - if (mc.thePlayer == null || mc.theWorld == null) return; - if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) return; - if (MacroHandler.getInstance().isMacroToggled()) return; - if (!isToggled()) return; - if (isRunning()) return; + if (stuckClock.isScheduled() && stuckClock.passed()) { + LogUtils.sendWarning( + "[Pests Destroyer] The player is struggling killing pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport."); + LogUtils.sendFailsafeMessage("[Pests Destroyer] Couldn't kill pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport.", true); + escapeState = EscapeState.GO_TO_HUB; + KeyBindUtils.stopMovement(); + delayClock.schedule(300); + stuckClock.reset(); + return; + } - if (canEnableMacro(true)) { - start(); - } + if (delayClock.isScheduled() && !delayClock.passed()) { + return; } - public boolean canEnableMacro() { - return canEnableMacro(false); + LogUtils.sendDebug("[Pests Destroyer] State: " + state); + + if (escapeState != EscapeState.NONE) { + if (stuckClock.isScheduled()) { + stuckClock.reset(); + } + if (RotationHandler.getInstance().isRotating()) { + RotationHandler.getInstance().reset(); + } + KeyBindUtils.stopMovement(); + switch (escapeState) { + case GO_TO_HUB: + if (isInventoryOpen()) { + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { + escapeState = EscapeState.GO_TO_GARDEN; + delayClock.schedule((long) (5_500 + Math.random() * 3_500)); + break; + } + if (GameStateHandler.getInstance().inGarden()) { + mc.thePlayer.sendChatMessage("/hub"); + escapeState = EscapeState.GO_TO_GARDEN; + delayClock.schedule((long) (1_800 + Math.random() * 1_000)); + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { + escapeState = EscapeState.GO_TO_HUB; + mc.thePlayer.sendChatMessage("/skyblock"); + delayClock.schedule((long) (5_000 + Math.random() * 1_500)); + break; + } + break; + case GO_TO_GARDEN: + if (isInventoryOpen()) { + break; + } + if (GameStateHandler.getInstance().inGarden()) { + escapeState = EscapeState.GO_TO_HUB; + delayClock.schedule((long) (2_500 + Math.random() * 1_500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { + escapeState = EscapeState.RESUME_MACRO; + MacroHandler.getInstance().triggerWarpGarden(true, false); + delayClock.schedule((long) (2_500 + Math.random() * 1_500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { + escapeState = EscapeState.GO_TO_HUB; + mc.thePlayer.sendChatMessage("/skyblock"); + delayClock.schedule((long) (5_000 + Math.random() * 1_500)); + break; + } + break; + case RESUME_MACRO: + if (isInventoryOpen()) { + break; + } + if (GameStateHandler.getInstance().inGarden()) { + escapeState = EscapeState.NONE; + state = States.IDLE; + cantReachPest = 0; + delayClock.schedule((long) (1_000 + Math.random() * 500)); + LogUtils.sendDebug("[Pests Destroyer] Came back to Garden!"); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { + escapeState = EscapeState.RESUME_MACRO; + MacroHandler.getInstance().triggerWarpGarden(true, false); + delayClock.schedule((long) (2_500 + Math.random() * 1_500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { + escapeState = EscapeState.GO_TO_HUB; + mc.thePlayer.sendChatMessage("/skyblock"); + delayClock.schedule((long) (5_000 + Math.random() * 1_500)); + break; + } + break; + } + return; } - public boolean canEnableMacro(boolean manually) { - if (!isToggled()) return false; - if (isRunning()) return false; - if (!GameStateHandler.getInstance().inGarden()) return false; - if (!MacroHandler.getInstance().isMacroToggled() && !manually) return false; - if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) return false; - if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) return false; - if (enabled || preparing) return false; - if (GameStateHandler.getInstance().getPestsCount() < FarmHelperConfig.startKillingPestsAt && !manually || (manually && GameStateHandler.getInstance().getPestsCount() == 0)) - return false; - if (!manually && FarmHelperConfig.pausePestsDestroyerDuringJacobsContest && GameStateHandler.getInstance().inJacobContest()) { - LogUtils.sendError("[Pests Destroyer] Pests Destroyer won't activate during Jacob's Contest!"); - return false; + switch (state) { + case IDLE: + ItemStack currentItem = mc.thePlayer.getHeldItem(); + if (GameStateHandler.getInstance().getPestsCount() == 0) { + if (isInventoryOpen()) { + return; + } +// finishMacro(); + state = States.FINISH; + return; + } + if (getVacuum(currentItem)) { + return; + } + state = States.SWAP_ARMOR; + delayClock.schedule((long) (200 + Math.random() * 200)); + break; + case SWAP_ARMOR: + if (FarmHelperConfig.pestSwapArmorBefore) { + currentSlot = FarmHelperConfig.pestArmorSlot0; + if (finishing) { + currentSlot = FarmHelperConfig.pestArmorSlot1; + } + AutoWardrobe.instance.swapTo(currentSlot); } - if (!mc.thePlayer.capabilities.allowFlying) { - LogUtils.sendError("[Pests Destroyer] You need to be able to fly!"); - if (FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { - LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); - FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; + state = States.ARMOR_SWAP_VERIFY; + break; + case ARMOR_SWAP_VERIFY: + if (AutoWardrobe.instance.isRunning()) { + return; + } + if (finishing) { + state = States.FINISH; + } else { + if (needToUpdatePlots || PlotUtils.needToUpdatePlots()) { + state = States.OPEN_DESK; + } else { + if (FarmHelperConfig.dontTeleportToPlots) { + state = States.GET_CLOSEST_PLOT; + } else { + state = States.TELEPORT_TO_PLOT; } - return false; + } } - return true; - } + break; + case OPEN_DESK: + if (isInventoryOpen()) { + break; + } + mc.thePlayer.sendChatMessage("/desk"); + state = States.OPEN_PLOTS; + delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); + break; + case OPEN_PLOTS: + String chestName = InventoryUtils.getInventoryName(); + if (mc.currentScreen == null) { + delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 300 + Math.random() * 300)); + break; + } + if (!InventoryUtils.isInventoryLoaded()) { + break; + } + if (chestName == null || !chestName.equals("Desk")) { + break; + } + Slot configurePlots = InventoryUtils.getSlotOfItemInContainer("Configure Plots"); + if (configurePlots == null) { + break; + } + state = States.WAIT_FOR_INFO; + InventoryUtils.clickContainerSlot(configurePlots.slotNumber, InventoryUtils.ClickType.LEFT, InventoryUtils.ClickMode.PICKUP); + delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); + break; + case WAIT_FOR_INFO: + break; + case TELEPORT_TO_PLOT: + PlotUtils.Plot plot; + if (FarmHelperConfig.dontTeleportToPlots) { + delayClock.schedule(1_000 + Math.random() * 500); + MacroHandler.getInstance().triggerWarpGarden(true, false); + state = States.CHECKING_SPAWN; + return; + } else { + plot = getClosestPlot(); + } + if (plot == null) { + state = States.GO_BACK; + delayClock.schedule((long) (500 + Math.random() * 500)); + return; + } + if (GameStateHandler.getInstance().getCurrentPlot() == plot.number && BlockUtils.canFlyHigher(8)) { + state = States.GET_LOCATION; + break; + } + String plotNumber = plot.name; + preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); + mc.thePlayer.sendChatMessage("/tptoplot " + plotNumber); + state = States.WAIT_FOR_TP; + delayClock.schedule((long) (900 + Math.random() * 500)); + break; + case WAIT_FOR_TP: + if (!preTpBlockPos.isPresent()) { + state = States.IDLE; + break; + } + if (mc.thePlayer.getPosition().equals(preTpBlockPos.get())) { + break; + } + state = States.CHECKING_PLOT; + delayClock.schedule((long) (200 + Math.random() * 200)); + break; + case CHECKING_PLOT: + if (isInventoryOpenDelayed()) { + break; + } + KeyBindUtils.stopMovement(); - @SubscribeEvent - public void onTickExecute(TickEvent.ClientTickEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) return; - if (mc.currentScreen == null && checkedThisGui) { - checkedThisGui = false; - } - if (!gotRangeOfVacuum && (isToggled() || PestsDestroyerOnTheTrack.getInstance().isToggled())) { - Slot vacuumSlot = InventoryUtils.getSlotOfItemInInventory("Vacuum"); - if (vacuumSlot != null) { - ItemStack vacuumItem = vacuumSlot.getStack(); - for (Map.Entry vacuumRange : this.vacuumRange.entrySet()) { - if (vacuumItem.getDisplayName().contains(vacuumRange.getKey())) { - currentVacuumRange = vacuumRange.getValue(); - gotRangeOfVacuum = true; - LogUtils.sendDebug("[Pests Destroyer] Found vacuum range: " + currentVacuumRange); - break; - } - } - } + if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { + LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Going back to spawnpoint."); + delayClock.schedule(1_000 + Math.random() * 500); + MacroHandler.getInstance().triggerWarpGarden(true, false); + isPlotObstructed = true; + state = States.CHECKING_SPAWN; + return; } - if (!isToggled()) return; - if (event.phase != TickEvent.Phase.END) return; - if (!GameStateHandler.getInstance().inGarden() && escapeState == EscapeState.NONE) return; - if (!enabled) return; - if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) return; - if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { - stop(); - return; + state = States.GET_LOCATION; + break; + case CHECKING_SPAWN: + if (MacroHandler.getInstance().isTeleporting()) { + return; } + if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { + LogUtils.sendError( + "[Pests Destroyer] Your spawnpoint is obstructed! Make sure there is no block above your spawnpoint! Disabling Pests Destroyer!"); + stop(); + FarmHelperConfig.enablePestsDestroyer = false; +// finishMacro(); + state = States.FINISH; + } else { + state = States.GET_CLOSEST_PLOT; + LogUtils.sendDebug("[Pests Destroyer] Spawnpoint is not obstructed"); + } + break; + case GET_CLOSEST_PLOT: + if (isInventoryOpenDelayed()) { + break; + } - if (stuckClock.isScheduled() && stuckClock.passed()) { - LogUtils.sendWarning("[Pests Destroyer] The player is struggling killing pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport."); - LogUtils.sendFailsafeMessage("[Pests Destroyer] Couldn't kill pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport.", true); - escapeState = EscapeState.GO_TO_HUB; - KeyBindUtils.stopMovement(); - delayClock.schedule(300); - stuckClock.reset(); - return; + PlotUtils.Plot closestPlot = getClosestPlot(); + + if (closestPlot == null) { + LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); + state = States.GET_LOCATION; + return; } - if (delayClock.isScheduled() && !delayClock.passed()) return; + double distance = Math.sqrt(mc.thePlayer.getDistanceSq(PlotUtils.getPlotCenter(closestPlot.number))); - LogUtils.sendDebug("[Pests Destroyer] State: " + state); + this.closestPlot = Optional.of(closestPlot); - if (escapeState != EscapeState.NONE) { - if (stuckClock.isScheduled()) { - stuckClock.reset(); - } - if (RotationHandler.getInstance().isRotating()) { - RotationHandler.getInstance().reset(); - } - KeyBindUtils.stopMovement(); - switch (escapeState) { - case GO_TO_HUB: - if (isInventoryOpen()) break; - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { - escapeState = EscapeState.GO_TO_GARDEN; - delayClock.schedule((long) (5_500 + Math.random() * 3_500)); - break; - } - if (GameStateHandler.getInstance().inGarden()) { - mc.thePlayer.sendChatMessage("/hub"); - escapeState = EscapeState.GO_TO_GARDEN; - delayClock.schedule((long) (1_800 + Math.random() * 1_000)); - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { - escapeState = EscapeState.GO_TO_HUB; - mc.thePlayer.sendChatMessage("/skyblock"); - delayClock.schedule((long) (5_000 + Math.random() * 1_500)); - break; - } - break; - case GO_TO_GARDEN: - if (isInventoryOpen()) break; - if (GameStateHandler.getInstance().inGarden()) { - escapeState = EscapeState.GO_TO_HUB; - delayClock.schedule((long) (2_500 + Math.random() * 1_500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { - escapeState = EscapeState.RESUME_MACRO; - MacroHandler.getInstance().triggerWarpGarden(true, false); - delayClock.schedule((long) (2_500 + Math.random() * 1_500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { - escapeState = EscapeState.GO_TO_HUB; - mc.thePlayer.sendChatMessage("/skyblock"); - delayClock.schedule((long) (5_000 + Math.random() * 1_500)); - break; - } - break; - case RESUME_MACRO: - if (isInventoryOpen()) break; - if (GameStateHandler.getInstance().inGarden()) { - escapeState = EscapeState.NONE; - state = States.IDLE; - cantReachPest = 0; - delayClock.schedule((long) (1_000 + Math.random() * 500)); - LogUtils.sendDebug("[Pests Destroyer] Came back to Garden!"); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { - escapeState = EscapeState.RESUME_MACRO; - MacroHandler.getInstance().triggerWarpGarden(true, false); - delayClock.schedule((long) (2_500 + Math.random() * 1_500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { - escapeState = EscapeState.GO_TO_HUB; - mc.thePlayer.sendChatMessage("/skyblock"); - delayClock.schedule((long) (5_000 + Math.random() * 1_500)); - break; - } - break; - } - return; + if (FarmHelperConfig.dontTeleportToPlots) { + if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(3)) { + state = States.TELEPORT_TO_PLOT; + LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Forcing going back to spawnpoint."); + } else { + state = States.FLY_TO_THE_CLOSEST_PLOT; + } + break; } - switch (state) { - case IDLE: - ItemStack currentItem = mc.thePlayer.getHeldItem(); - if (GameStateHandler.getInstance().getPestsCount() == 0) { - if (isInventoryOpen()) return; - finishMacro(); - return; - } - if (getVacuum(currentItem)) return; - if (needToUpdatePlots || PlotUtils.needToUpdatePlots()) { - state = States.OPEN_DESK; - } else { - if (FarmHelperConfig.dontTeleportToPlots) { - state = States.GET_CLOSEST_PLOT; - } else { - state = States.TELEPORT_TO_PLOT; - } - } - delayClock.schedule((long) (200 + Math.random() * 200)); - break; - case OPEN_DESK: - if (isInventoryOpen()) break; - mc.thePlayer.sendChatMessage("/desk"); - state = States.OPEN_PLOTS; - delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); - break; - case OPEN_PLOTS: - String chestName = InventoryUtils.getInventoryName(); - if (mc.currentScreen == null) { - delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 300 + Math.random() * 300)); - break; - } - if (!InventoryUtils.isInventoryLoaded()) break; - if (chestName == null || !chestName.equals("Desk")) { - break; - } - Slot configurePlots = InventoryUtils.getSlotOfItemInContainer("Configure Plots"); - if (configurePlots == null) { - break; - } - state = States.WAIT_FOR_INFO; - InventoryUtils.clickContainerSlot(configurePlots.slotNumber, InventoryUtils.ClickType.LEFT, InventoryUtils.ClickMode.PICKUP); - delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); - break; - case WAIT_FOR_INFO: - break; - case TELEPORT_TO_PLOT: - PlotUtils.Plot plot; - if (FarmHelperConfig.dontTeleportToPlots) { - delayClock.schedule(1_000 + Math.random() * 500); - MacroHandler.getInstance().triggerWarpGarden(true, false); - state = States.CHECKING_SPAWN; - return; - } else { - plot = getClosestPlot(); - } - if (plot == null) { - state = States.GO_BACK; - delayClock.schedule((long) (500 + Math.random() * 500)); - return; - } - if (GameStateHandler.getInstance().getCurrentPlot() == plot.number && BlockUtils.canFlyHigher(8)) { - state = States.GET_LOCATION; - break; - } - String plotNumber = plot.name; - preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); - mc.thePlayer.sendChatMessage("/tptoplot " + plotNumber); - state = States.WAIT_FOR_TP; - delayClock.schedule((long) (900 + Math.random() * 500)); - break; - case WAIT_FOR_TP: - if (!preTpBlockPos.isPresent()) { - state = States.IDLE; - break; - } - if (mc.thePlayer.getPosition().equals(preTpBlockPos.get())) { - break; - } - state = States.CHECKING_PLOT; - delayClock.schedule((long) (200 + Math.random() * 200)); - break; - case CHECKING_PLOT: - if (isInventoryOpenDelayed()) break; - KeyBindUtils.stopMovement(); - - if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { - LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Going back to spawnpoint."); - delayClock.schedule(1_000 + Math.random() * 500); - MacroHandler.getInstance().triggerWarpGarden(true, false); - isPlotObstructed = true; - state = States.CHECKING_SPAWN; - return; - } - state = States.GET_LOCATION; - break; - case CHECKING_SPAWN: - if (MacroHandler.getInstance().isTeleporting()) return; - - if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { - LogUtils.sendError("[Pests Destroyer] Your spawnpoint is obstructed! Make sure there is no block above your spawnpoint! Disabling Pests Destroyer!"); - stop(); - FarmHelperConfig.enablePestsDestroyer = false; - finishMacro(); - } else { - state = States.GET_CLOSEST_PLOT; - LogUtils.sendDebug("[Pests Destroyer] Spawnpoint is not obstructed"); - } - break; - case GET_CLOSEST_PLOT: - if (isInventoryOpenDelayed()) break; - - PlotUtils.Plot closestPlot = getClosestPlot(); - - if (closestPlot == null) { - LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); - state = States.GET_LOCATION; - return; - } - - double distance = Math.sqrt(mc.thePlayer.getDistanceSq(PlotUtils.getPlotCenter(closestPlot.number))); - - this.closestPlot = Optional.of(closestPlot); - - if (FarmHelperConfig.dontTeleportToPlots) { - if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(3)) { - state = States.TELEPORT_TO_PLOT; - LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Forcing going back to spawnpoint."); - } else { - state = States.FLY_TO_THE_CLOSEST_PLOT; - } - break; - } - - if (distance > 150 && !isPlotObstructed) { - state = States.TELEPORT_TO_PLOT; - } else { - state = States.FLY_TO_THE_CLOSEST_PLOT; - } - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - case FLY_TO_THE_CLOSEST_PLOT: - if (MacroHandler.getInstance().isTeleporting()) return; - if (isInventoryOpenDelayed()) break; - - if (!this.closestPlot.isPresent()) { - LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); - state = States.GET_LOCATION; - return; - } - - BlockPos plotCenter = PlotUtils.getPlotCenter(this.closestPlot.get().number); - - if (getClosestPest() != null) { - KeyBindUtils.stopMovement(); - state = States.FIND_PEST; - break; - } - - if ((mc.thePlayer.onGround || !flyDelay.passed()) && mc.thePlayer.capabilities.allowFlying && !mc.thePlayer.capabilities.isFlying) { - fly(); - break; - } - - if (mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()) < 15) { - state = States.GET_LOCATION; - KeyBindUtils.stopMovement(); - FlyPathFinderExecutor.getInstance().stop(); - break; - } - - if (!FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().setSprinting(true); - FlyPathFinderExecutor.getInstance().setDontRotate(false); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter.getX(), 80, plotCenter.getZ()), true, true); - } - break; - case GET_LOCATION: - if (GameStateHandler.getInstance().getPestsCount() == 0) { - state = States.GO_BACK; - return; - } - if (isInventoryOpenDelayed()) break; - ItemStack currentItem2 = mc.thePlayer.getHeldItem(); - if (getVacuum(currentItem2)) return; - - if (getClosestPest() != null) { - FlyPathFinderExecutor.getInstance().stop(); - state = States.FIND_PEST; - break; - } - - if (FlyPathFinderExecutor.getInstance().isRunning()) { - return; - } - - if (!mc.thePlayer.capabilities.isFlying) { - fly(); - break; - } - if (hasBlocksAround()) { - KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); - break; - } else { - if (mc.gameSettings.keyBindJump.isKeyDown()) { - KeyBindUtils.stopMovement(); - } - } - - if (getLocationTries > 2) { - PlotUtils.Plot currentPlot = getClosestPlot(); - - if (!isNearPlotCenter()) { - if (currentPlot != null) { - BlockPos plotCenter2 = PlotUtils.getPlotCenter(currentPlot.number); - FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); - FlyPathFinderExecutor.getInstance().setDontRotate(false); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter2.getX(), 80, plotCenter2.getZ()), true, true); - LogUtils.sendDebug("[Pests Destroyer] Flying to plot center"); - } else { - LogUtils.sendWarning("[Pests Destroyer] Couldn't find closest plot!"); - state = States.GO_BACK; - } - break; - } - } - - resetFireworkInfo(); - lastFireworkTime = System.currentTimeMillis(); - MovingObjectPosition mop = mc.objectMouseOver; - if (RotationHandler.getInstance().isRotating()) break; - float yaw = -1; - Vec3 playerPos = mc.thePlayer.getPositionEyes(1); - for (float i = 0; i < 360; i += 10) { - Vec3 testRotation = AngleUtils.getVectorForRotation(0, i); - Vec3 lookVector = playerPos.addVector(testRotation.xCoord * 5, testRotation.yCoord * 5, testRotation.zCoord * 5); - MovingObjectPosition mop2 = mc.theWorld.rayTraceBlocks(playerPos, lookVector, false, true, false); - if (mop2 == null || mop2.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { - yaw = i; - break; - } - } - Rotation upRotation = new Rotation((float) (yaw + (Math.random() * 5 - 2.5)), (float) (-20 + (Math.random() * 6 - 4))); - if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && RotationHandler.getInstance().shouldRotate(upRotation, 10)) { - RotationHandler.getInstance().easeTo(new RotationConfiguration( - upRotation, - FarmHelperConfig.getRandomRotationTime(), - null - ).easeOutBack(true)); - delayClock.schedule(300); - break; - } - state = States.WAIT_FOR_LOCATION; - if (getLocationTries > 4) { - LogUtils.sendWarning("[Pests Destroyer] Couldn't find any firework location. Trying to fix it by sending /pq low."); - mc.thePlayer.sendChatMessage("/pq low"); - getLocationTries = 0; - } - KeyBindUtils.leftClick(); - getLocationTries++; - if (!stuckClock.isScheduled()) - stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); - delayClock.schedule(300); - break; - case WAIT_FOR_LOCATION: - if (isInventoryOpenDelayed()) break; - - if (RotationHandler.getInstance().isRotating()) return; - - if (getClosestPest() != null) { - state = States.FIND_PEST; - break; - } - - if (lastLocation != null && lastFireworkTime + 250 < System.currentTimeMillis()) { - Vec3 firework = calculateWaypoint(); - if (firework == null) { - LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); - state = States.GET_LOCATION; - break; - } - if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { - int y = 150; - Block block = mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord)).getBlock(); - Block[] blocksAround = new Block[]{ - mc.theWorld.getBlockState(new BlockPos(firework.xCoord + 1, y, firework.zCoord)).getBlock(), - mc.theWorld.getBlockState(new BlockPos(firework.xCoord - 1, y, firework.zCoord)).getBlock(), - mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord + 1)).getBlock(), - mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord - 1)).getBlock(), - block - }; - while (y > 90 && Arrays.stream(blocksAround).allMatch(b -> b.equals(Blocks.air))) { - y--; - } - y += 3; - FlyPathFinderExecutor.getInstance().setSprinting(false); - FlyPathFinderExecutor.getInstance().setDontRotate(true); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(firework.xCoord, y, firework.zCoord), true, true); - LogUtils.sendWarning("[Pests Destroyer] Firework is too close to player. Flying to x: " + firework.xCoord + " y: " + y + " z: " + firework.zCoord); - break; - } - RotationHandler.getInstance().reset(); - state = States.FIND_PEST; - delayBetweenFireworks.schedule(3_000); - delayClock.schedule(300); - break; - } - if (System.currentTimeMillis() - lastFireworkTime > 6_000) { - state = States.GET_LOCATION; - break; - } - break; - case FIND_PEST: - if (isInventoryOpenDelayed()) break; - getLocationTries = 0; - if (GameStateHandler.getInstance().getPestsCount() == 0) { - RotationHandler.getInstance().reset(); - state = States.CHECK_ANOTHER_PEST; - return; - } - - Entity closestPest = getClosestPest(); - - if (closestPest == null) { - if (lastLocation == null) { - LogUtils.sendDebug("[Pests Destroyer] No firework location found. Looking for a firework."); - state = States.GET_LOCATION; - break; - } - - if (!FlyPathFinderExecutor.getInstance().isRunning()) { - Vec3 firework = calculateWaypoint(); - if (firework == null) { - LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); - state = States.GET_LOCATION; - break; - } - if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { - state = States.GET_LOCATION; - break; - } - FlyPathFinderExecutor.getInstance().setSprinting(true); - FlyPathFinderExecutor.getInstance().setDontRotate(false); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(firework, true, true); - } - break; - } - if (closestPest instanceof EntityArmorStand) { - Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(closestPest, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); - if (realEntity != null) { - closestPest = realEntity; - } - } - if (FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().stop(); - } - - currentEntityTarget = Optional.of(closestPest); - - state = States.KILL_PEST; - cantReachPest = 0; - KeyBindUtils.stopMovement(); - if (!stuckClock.isScheduled()) - stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); - delayClock.schedule(300); - break; - case KILL_PEST: - if (isInventoryOpenDelayed()) break; - if (mc.thePlayer.posY < 67 && FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().stop(); - RotationHandler.getInstance().reset(); - state = States.GET_LOCATION; - return; - } - if (!currentEntityTarget.isPresent()) { - FlyPathFinderExecutor.getInstance().stop(); - RotationHandler.getInstance().reset(); - state = States.CHECK_ANOTHER_PEST; - return; - } - Entity entity = currentEntityTarget.get(); - if (entity.isDead || killedEntities.contains(entity) || !mc.theWorld.loadedEntityList.contains(entity)) { - RotationHandler.getInstance().reset(); - state = States.CHECK_ANOTHER_PEST; - FlyPathFinderExecutor.getInstance().stop(); - return; - } - - double distance2 = mc.thePlayer.getDistance(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); - double distanceXZ = mc.thePlayer.getDistance(entity.posX, mc.thePlayer.posY, entity.posZ); - - float vacuumMinRange = Math.max(currentVacuumRange - 2, 3); - if (FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking > 0 - && (distanceXZ < 1.5 || distance2 <= Math.max(vacuumMinRange - 2, 10)) - && Math.abs(mc.thePlayer.motionX) < 0.1 - && Math.abs(mc.thePlayer.motionZ) < 0.1 - && !canEntityBeSeenIgnoreNonCollidable(entity)) { - cantReachPest++; - } - - if (cantReachPest >= FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking) { - LogUtils.sendWarning("[Pests Destroyer] Can't reach the pest, will do a quick Garden -> Hub -> Garden teleport."); - escapeState = EscapeState.GO_TO_HUB; - KeyBindUtils.stopMovement(); - delayClock.schedule(300); - return; - } - - if (distance2 < vacuumMinRange) { - float targetVelocity = (float) (Math.abs(entity.motionX) + Math.abs(entity.motionZ)); - if (vacuumMinRange > 8 || targetVelocity < 0.15) { - if (FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().stop(); - LogUtils.sendDebug("[Pests Destroyer] Stopping pathfinder because the pest is close enough"); - float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); - if (playerVelocity > 0.9) - KeyBindUtils.onTick(mc.gameSettings.keyBindBack); - } else { - float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); - if (playerVelocity > 0.15 && distanceXZ < 3) - KeyBindUtils.onTick(mc.gameSettings.keyBindBack); - } - } - if (rotationState != RotationState.CLOSE) { - rotationState = RotationState.CLOSE; - RotationHandler.getInstance().reset(); - } - if (!RotationHandler.getInstance().isRotating()) { - RotationHandler.getInstance().easeTo(new RotationConfiguration( - new Target(entity), - (long) (400 + Math.random() * 200), - null - ).followTarget(true)); - } - FlyPathFinderExecutor.getInstance().setUseAOTV(false); - ItemStack currentItem3 = mc.thePlayer.getHeldItem(); - if (getVacuum(currentItem3)) { - break; - } - KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, true); - } else { - if (rotationState != RotationState.FAR) { - FlyPathFinderExecutor.getInstance().stop(); - rotationState = RotationState.FAR; - RotationHandler.getInstance().reset(); - } - if (!FlyPathFinderExecutor.getInstance().isRunning()) { - double yAddition = Math.max(2.75, Math.min(currentVacuumRange - 5, 10)); - LogUtils.sendDebug("Should pathfind to: " + entity.posX + " " + yAddition + " " + entity.posZ); - FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(entity, true, true, (float) yAddition, true); - } - if (FlyPathFinderExecutor.getInstance().getState() == FlyPathFinderExecutor.State.FAILED - && mc.thePlayer.motionX == 0 && mc.thePlayer.motionZ == 0) { - flyPathfinderTries++; - } else { - flyPathfinderTries = 0; - } - if (flyPathfinderTries > 5) { - LogUtils.sendWarning("[Pests Destroyer] Couldn't pathfind to the pest. Flying from the spawnpoint."); - flyPathfinderTries = 0; - KeyBindUtils.stopMovement(); - delayClock.schedule(1_000 + Math.random() * 500); - MacroHandler.getInstance().triggerWarpGarden(true, false); - state = States.CHECKING_SPAWN; - return; - } - if (!RotationHandler.getInstance().isRotating()) { - RotationHandler.getInstance().easeTo(new RotationConfiguration( - new Target(entity).additionalY(-0.3f), - (long) (400 + Math.random() * 200), - null - )); - } - FlyPathFinderExecutor.getInstance().setUseAOTV(distanceXZ > vacuumMinRange && InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - if (distance2 < currentVacuumRange && getVacuum(mc.thePlayer.getHeldItem())) { - break; - } - KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, distance2 < currentVacuumRange); - } - break; - case CHECK_ANOTHER_PEST: - if (previousCurrentPlotPestsCount == GameStateHandler.getInstance().getCurrentPlotPestsCount() && System.currentTimeMillis() - lastKillTimestamp < 2_000) - return; - - LogUtils.sendDebug(GameStateHandler.getInstance().getPestsCount() + " pest" + (GameStateHandler.getInstance().getPestsCount() == 1 ? "" : "s") + " left"); - if (GameStateHandler.getInstance().getPestsCount() == 0) { - state = States.GO_BACK; - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - System.out.println("Curr plot pests: " + GameStateHandler.getInstance().getCurrentPlotPestsCount()); - isPlotObstructed = false; - Entity closestPest2 = getClosestPest(); - KeyBindUtils.stopMovement(); - if (closestPest2 != null) { - LogUtils.sendDebug("Found another pest"); - state = States.KILL_PEST; - currentEntityTarget = Optional.of(closestPest2); - delayClock.schedule(50 + (long) (Math.random() * 100)); - } else { - PlotUtils.Plot plotOpt = getClosestPlot(); - if (plotOpt != null) { - double distanceToPlot = Math.sqrt(mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plotOpt.number))); - LogUtils.sendDebug("Distance to plot: " + distanceToPlot); - if (distanceToPlot < 150 || FarmHelperConfig.dontTeleportToPlots) { - LogUtils.sendDebug("Going manually to another plot"); - state = States.GET_CLOSEST_PLOT; - delayClock.schedule(100 + (long) (Math.random() * 150)); - break; - } else { - LogUtils.sendDebug("Teleporting to plot"); - state = States.TELEPORT_TO_PLOT; - delayClock.schedule(400 + (long) (Math.random() * 400)); - } - } else { - state = States.GO_BACK; - delayClock.schedule(300 + (long) (Math.random() * 300)); - } - } - break; - case GO_BACK: - finishMacro(); - break; - } - } - - @Nullable - private Entity getClosestPest() { - Entity closestPest = null; - double closestDistance = Double.MAX_VALUE; - for (Entity entity : pestsLocations) { - double distance = mc.thePlayer.getDistanceToEntity(entity); - if (distance < closestDistance) { - closestDistance = distance; - closestPest = entity; - } + if (distance > 150 && !isPlotObstructed) { + state = States.TELEPORT_TO_PLOT; + } else { + state = States.FLY_TO_THE_CLOSEST_PLOT; + } + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + case FLY_TO_THE_CLOSEST_PLOT: + if (MacroHandler.getInstance().isTeleporting()) { + return; + } + if (isInventoryOpenDelayed()) { + break; } - return closestPest; - } - public boolean getVacuum(ItemStack currentItem2) { - if (currentItem2 == null || !currentItem2.getDisplayName().contains("Vacuum")) { - int vacuum = InventoryUtils.getSlotIdOfItemInHotbar("Vacuum"); - if (vacuum == -1) { - LogUtils.sendError("[Pests Destroyer] Failed to find vacuum in hotbar!"); - state = States.GO_BACK; - FarmHelperConfig.enablePestsDestroyer = false; - finishMacro(); - return true; - } - mc.thePlayer.inventory.currentItem = vacuum; - delayClock.schedule((long) (200 + Math.random() * 200)); - return true; + if (!this.closestPlot.isPresent()) { + LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); + state = States.GET_LOCATION; + return; } - return false; - } - private boolean isInventoryOpenDelayed() { - if (mc.currentScreen != null) { - KeyBindUtils.stopMovement(); - delayClock.schedule(300 + (long) (Math.random() * 300)); - Multithreading.schedule(() -> { - if (mc.currentScreen != null) { - PlayerUtils.closeScreen(); - delayClock.schedule(100 + (long) (Math.random() * 200)); - } - }, (long) (200 + Math.random() * 100), TimeUnit.MILLISECONDS); - return true; + BlockPos plotCenter = PlotUtils.getPlotCenter(this.closestPlot.get().number); + + if (getClosestPest() != null) { + KeyBindUtils.stopMovement(); + state = States.FIND_PEST; + break; } - return false; - } - private boolean isInventoryOpen() { - if (mc.currentScreen != null) { - PlayerUtils.closeScreen(); - delayClock.schedule(500 + (long) (Math.random() * 500)); - return true; + if ((mc.thePlayer.onGround || !flyDelay.passed()) && mc.thePlayer.capabilities.allowFlying && !mc.thePlayer.capabilities.isFlying) { + fly(); + break; } - return false; - } + if (mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()) < 15) { + state = States.GET_LOCATION; + KeyBindUtils.stopMovement(); + FlyPathFinderExecutor.getInstance().stop(); + break; + } - private void finishMacro() { - if (isInventoryOpen()) return; - if (FlyPathFinderExecutor.getInstance().isPathing()) { - FlyPathFinderExecutor.getInstance().stop(); + if (!FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().setSprinting(true); + FlyPathFinderExecutor.getInstance().setDontRotate(false); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter.getX(), 80, plotCenter.getZ()), true, true); + } + break; + case GET_LOCATION: + if (GameStateHandler.getInstance().getPestsCount() == 0) { + state = States.GO_BACK; + return; + } + if (isInventoryOpenDelayed()) { + break; + } + ItemStack currentItem2 = mc.thePlayer.getHeldItem(); + if (getVacuum(currentItem2)) { + return; + } + + if (getClosestPest() != null) { + FlyPathFinderExecutor.getInstance().stop(); + state = States.FIND_PEST; + break; } - if (MacroHandler.getInstance().isMacroToggled()) { - stop(); - MacroHandler.getInstance().triggerWarpGarden(true, true, false); - delayClock.schedule(2_000 + Math.random() * 500); + + if (FlyPathFinderExecutor.getInstance().isRunning()) { + return; + } + + if (!mc.thePlayer.capabilities.isFlying) { + fly(); + break; + } + if (hasBlocksAround()) { + KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); + break; } else { - stop(); + if (mc.gameSettings.keyBindJump.isKeyDown()) { + KeyBindUtils.stopMovement(); + } + } + + if (getLocationTries > 2) { + PlotUtils.Plot currentPlot = getClosestPlot(); + + if (!isNearPlotCenter()) { + if (currentPlot != null) { + BlockPos plotCenter2 = PlotUtils.getPlotCenter(currentPlot.number); + FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); + FlyPathFinderExecutor.getInstance().setDontRotate(false); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter2.getX(), 80, plotCenter2.getZ()), true, true); + LogUtils.sendDebug("[Pests Destroyer] Flying to plot center"); + } else { + LogUtils.sendWarning("[Pests Destroyer] Couldn't find closest plot!"); + state = States.GO_BACK; + } + break; + } } - } - private boolean hasBlocksAround() { - Vec3 angle0 = AngleUtils.getVectorForRotation(0, mc.thePlayer.rotationYaw); - Vec3 angle90 = AngleUtils.getVectorForRotation(90, mc.thePlayer.rotationYaw); - Vec3 angle180 = AngleUtils.getVectorForRotation(180, mc.thePlayer.rotationYaw); - Vec3 angle270 = AngleUtils.getVectorForRotation(270, mc.thePlayer.rotationYaw); + resetFireworkInfo(); + lastFireworkTime = System.currentTimeMillis(); + MovingObjectPosition mop = mc.objectMouseOver; + if (RotationHandler.getInstance().isRotating()) { + break; + } + float yaw = -1; Vec3 playerPos = mc.thePlayer.getPositionEyes(1); - if (checkIfBlockExists(angle0, playerPos)) return true; - if (checkIfBlockExists(angle90, playerPos)) return true; - if (checkIfBlockExists(angle180, playerPos)) return true; - return checkIfBlockExists(angle270, playerPos); - } + for (float i = 0; i < 360; i += 10) { + Vec3 testRotation = AngleUtils.getVectorForRotation(0, i); + Vec3 lookVector = playerPos.addVector(testRotation.xCoord * 5, testRotation.yCoord * 5, testRotation.zCoord * 5); + MovingObjectPosition mop2 = mc.theWorld.rayTraceBlocks(playerPos, lookVector, false, true, false); + if (mop2 == null || mop2.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { + yaw = i; + break; + } + } + Rotation upRotation = new Rotation((float) (yaw + (Math.random() * 5 - 2.5)), (float) (-20 + (Math.random() * 6 - 4))); + if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && RotationHandler.getInstance() + .shouldRotate(upRotation, 10)) { + RotationHandler.getInstance().easeTo(new RotationConfiguration( + upRotation, + FarmHelperConfig.getRandomRotationTime(), + null + ).easeOutBack(true)); + delayClock.schedule(300); + break; + } + state = States.WAIT_FOR_LOCATION; + if (getLocationTries > 4) { + LogUtils.sendWarning("[Pests Destroyer] Couldn't find any firework location. Trying to fix it by sending /pq low."); + mc.thePlayer.sendChatMessage("/pq low"); + getLocationTries = 0; + } + KeyBindUtils.leftClick(); + getLocationTries++; + if (!stuckClock.isScheduled()) { + stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); + } + delayClock.schedule(300); + break; + case WAIT_FOR_LOCATION: + if (isInventoryOpenDelayed()) { + break; + } - private boolean checkIfBlockExists(Vec3 angle0, Vec3 playerPos) { - MovingObjectPosition mop0 = mc.theWorld.rayTraceBlocks(playerPos, playerPos.addVector(angle0.xCoord * 1.5, angle0.yCoord * 1.5, angle0.zCoord * 1.5), false, true, false); - return mop0 != null && mop0.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK; - } + if (RotationHandler.getInstance().isRotating()) { + return; + } - @SubscribeEvent(receiveCanceled = true) - public void onChat(ClientChatReceivedEvent event) { - if (event.type != 0 || event.message == null) return; - String message = StringUtils.stripControlCodes(event.message.getUnformattedText().trim()); - if (message.startsWith("You can't fast travel while in combat!") && enabled) { - LogUtils.sendWarning("[Pests Destroyer] Can't fast travel while in combat, will try again to teleport."); - Multithreading.schedule(this::finishMacro, 1_000 + (long) (Math.random() * 1_000), TimeUnit.MILLISECONDS); - return; + if (getClosestPest() != null) { + state = States.FIND_PEST; + break; } - if (message.toLowerCase().startsWith("there are not any pests on your garden right now") && enabled && state != States.GO_BACK) { - LogUtils.sendDebug("[Pests Destroyer] There are not any Pests on your Garden right now! Keep farming!"); - state = States.GO_BACK; - delayClock.schedule((long) (500 + Math.random() * 500)); - return; + + if (lastLocation != null && lastFireworkTime + 250 < System.currentTimeMillis()) { + Vec3 firework = calculateWaypoint(); + if (firework == null) { + LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); + state = States.GET_LOCATION; + break; + } + if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { + int y = 150; + Block block = mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord)).getBlock(); + Block[] blocksAround = new Block[]{ + mc.theWorld.getBlockState(new BlockPos(firework.xCoord + 1, y, firework.zCoord)).getBlock(), + mc.theWorld.getBlockState(new BlockPos(firework.xCoord - 1, y, firework.zCoord)).getBlock(), + mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord + 1)).getBlock(), + mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord - 1)).getBlock(), + block + }; + while (y > 90 && Arrays.stream(blocksAround).allMatch(b -> b.equals(Blocks.air))) { + y--; + } + y += 3; + FlyPathFinderExecutor.getInstance().setSprinting(false); + FlyPathFinderExecutor.getInstance().setDontRotate(true); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(firework.xCoord, y, firework.zCoord), true, true); + LogUtils.sendWarning( + "[Pests Destroyer] Firework is too close to player. Flying to x: " + firework.xCoord + " y: " + y + " z: " + firework.zCoord); + break; + } + RotationHandler.getInstance().reset(); + state = States.FIND_PEST; + delayBetweenFireworks.schedule(3_000); + delayClock.schedule(300); + break; } - if (message.contains("The worm seems to have burrowed")) { - cantReachPest = 0; - return; + if (System.currentTimeMillis() - lastFireworkTime > 6_000) { + state = States.GET_LOCATION; + break; } - if (message.contains("Couldn't find Plot")) { - needToUpdatePlots = true; - delayClock.schedule((long) (500 + Math.random() * 500)); + break; + case FIND_PEST: + if (isInventoryOpenDelayed()) { + break; + } + getLocationTries = 0; + if (GameStateHandler.getInstance().getPestsCount() == 0) { + RotationHandler.getInstance().reset(); + state = States.CHECK_ANOTHER_PEST; + return; } - } - private final Color vacuumRangeColor = new Color(200, 30, 30, 100); - - @SubscribeEvent - public void onRender(RenderWorldLastEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) return; - if (!GameStateHandler.getInstance().inGarden()) return; - - killedEntities.removeIf(e -> !mc.theWorld.loadedEntityList.contains(e)); - - List pests = mc.theWorld.loadedEntityList.stream().filter(entity -> { - if (entity.isDead) return false; - if (entity.posY < 50) return false; - if (entity instanceof EntityArmorStand) { - if (killedEntities.contains(entity)) return false; - ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); - if (itemStack == null || !itemStack.hasTagCompound()) return false; - String displayName = itemStack.getTagCompound().toString(); - if (displayName.contains("display:")) return false; - if (this.pests.stream().noneMatch(pest -> displayName.contains(pest.getSecond()))) return false; - if (killedEntities.contains(entity)) return false; - Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); - Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); - if (realEntity != null && (killedEntities.contains(realEntity) || realEntity.isDead)) { - return false; - } - if (nameEntity != null && (killedEntities.contains(nameEntity))) { - return false; - } - if (killedEntities.stream().noneMatch(ke -> ke.getDistanceToEntity(entity) < 1.5)) { - if (!FarmHelperConfig.streamerMode) - drawESP(entity); - return true; - } - return false; + Entity closestPest = getClosestPest(); + + if (closestPest == null) { + if (lastLocation == null) { + LogUtils.sendDebug("[Pests Destroyer] No firework location found. Looking for a firework."); + state = States.GET_LOCATION; + break; + } + + if (!FlyPathFinderExecutor.getInstance().isRunning()) { + Vec3 firework = calculateWaypoint(); + if (firework == null) { + LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); + state = States.GET_LOCATION; + break; + } + if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { + state = States.GET_LOCATION; + break; } - return false; - }).collect(Collectors.toList()); + FlyPathFinderExecutor.getInstance().setSprinting(true); + FlyPathFinderExecutor.getInstance().setDontRotate(false); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(firework, true, true); + } + break; + } + if (closestPest instanceof EntityArmorStand) { + Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(closestPest, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); + if (realEntity != null) { + closestPest = realEntity; + } + } + if (FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + } - pestsLocations.clear(); - pestsLocations.addAll(pests); + currentEntityTarget = Optional.of(closestPest); - if (!FarmHelperConfig.highlightPlotWithPests) return; + state = States.KILL_PEST; + cantReachPest = 0; + KeyBindUtils.stopMovement(); + if (!stuckClock.isScheduled()) { + stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); + } + delayClock.schedule(300); + break; + case KILL_PEST: + if (isInventoryOpenDelayed()) { + break; + } + if (mc.thePlayer.posY < 67 && FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + RotationHandler.getInstance().reset(); + state = States.GET_LOCATION; + return; + } + if (!currentEntityTarget.isPresent()) { + FlyPathFinderExecutor.getInstance().stop(); + RotationHandler.getInstance().reset(); + state = States.CHECK_ANOTHER_PEST; + return; + } + Entity entity = currentEntityTarget.get(); + if (entity.isDead || killedEntities.contains(entity) || !mc.theWorld.loadedEntityList.contains(entity)) { + RotationHandler.getInstance().reset(); + state = States.CHECK_ANOTHER_PEST; + FlyPathFinderExecutor.getInstance().stop(); + return; + } + + double distance2 = mc.thePlayer.getDistance(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); + double distanceXZ = mc.thePlayer.getDistance(entity.posX, mc.thePlayer.posY, entity.posZ); - double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; - double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; - double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; - for (int plotNumber : GameStateHandler.getInstance().getInfestedPlots()) { - List> chunks = PlotUtils.getPlotChunksBasedOnNumber(plotNumber); - if (chunks.isEmpty()) continue; - AxisAlignedBB boundingBox = new AxisAlignedBB(chunks.get(0).getFirst() * 16, 66, chunks.get(0).getSecond() * 16, chunks.get(chunks.size() - 1).getFirst() * 16 + 16, 80, chunks.get(chunks.size() - 1).getSecond() * 16 + 16); - float centerX = (float) (boundingBox.minX + (boundingBox.maxX - boundingBox.minX) / 2); - float centerZ = (float) (boundingBox.minZ + (boundingBox.maxZ - boundingBox.minZ) / 2); - boundingBox = boundingBox.offset(-d0, -d1, -d2); - RenderUtils.drawBox(boundingBox, FarmHelperConfig.plotHighlightColor.toJavaColor()); - RenderUtils.drawText("Plot " + plotNumber, centerX, 80, centerZ, 1); + float vacuumMinRange = Math.max(currentVacuumRange - 2, 3); + if (FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking > 0 + && (distanceXZ < 1.5 || distance2 <= Math.max(vacuumMinRange - 2, 10)) + && Math.abs(mc.thePlayer.motionX) < 0.1 + && Math.abs(mc.thePlayer.motionZ) < 0.1 + && !canEntityBeSeenIgnoreNonCollidable(entity)) { + cantReachPest++; } - if (!FarmHelperConfig.debugMode) return; + if (cantReachPest >= FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking) { + LogUtils.sendWarning("[Pests Destroyer] Can't reach the pest, will do a quick Garden -> Hub -> Garden teleport."); + escapeState = EscapeState.GO_TO_HUB; + KeyBindUtils.stopMovement(); + delayClock.schedule(300); + return; + } - ItemStack currentItem = mc.thePlayer.getHeldItem(); - if (currentItem == null || !currentItem.getDisplayName().contains("Vacuum")) return; - Vec3 lookVec = mc.thePlayer.getLookVec(); - Vec3 playerPos = new Vec3(0, mc.thePlayer.eyeHeight, 0); - Vec3 vacuumRange = playerPos.addVector(lookVec.xCoord * currentVacuumRange, lookVec.yCoord * currentVacuumRange, lookVec.zCoord * currentVacuumRange); - AxisAlignedBB aabb = new AxisAlignedBB(vacuumRange.xCoord - 0.05, vacuumRange.yCoord - 0.05, vacuumRange.zCoord - 0.05, vacuumRange.xCoord + 0.05, vacuumRange.yCoord + 0.05, vacuumRange.zCoord + 0.05); - RenderUtils.drawBox(aabb, vacuumRangeColor); - } - - private void drawESP(Entity entity) { - AxisAlignedBB boundingBox = new AxisAlignedBB(entity.posX - 0.5, entity.posY + entity.getEyeHeight() - 0.35, entity.posZ - 0.5, entity.posX + 0.5, entity.posY + entity.getEyeHeight() + 0.65, entity.posZ + 0.5); - double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; - double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; - double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; - boundingBox = boundingBox.offset(-d0, -d1, -d2); - if (FarmHelperConfig.pestsESP) { - Color color = FarmHelperConfig.pestsESPColor.toJavaColor(); - Vec3 entityPos = new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); - double distance = mc.thePlayer.getPositionEyes(1).distanceTo(entityPos); - boolean isInVacuumRange = distance < currentVacuumRange; - if (isInVacuumRange) { - color = new Color(color.getRed(), 255, color.getBlue(), Math.min(50, color.getAlpha())); + if (distance2 < vacuumMinRange) { + float targetVelocity = (float) (Math.abs(entity.motionX) + Math.abs(entity.motionZ)); + if (vacuumMinRange > 8 || targetVelocity < 0.15) { + if (FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + LogUtils.sendDebug("[Pests Destroyer] Stopping pathfinder because the pest is close enough"); + float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); + if (playerVelocity > 0.9) { + KeyBindUtils.onTick(mc.gameSettings.keyBindBack); + } + } else { + float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); + if (playerVelocity > 0.15 && distanceXZ < 3) { + KeyBindUtils.onTick(mc.gameSettings.keyBindBack); + } } - if (distance > 5) { - try { - EnumChatFormatting distanceColor = distance > currentVacuumRange ? EnumChatFormatting.RED : EnumChatFormatting.GREEN; - ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); - NBTTagCompound tagCompound = itemStack.getTagCompound(); - String texture = tagCompound.getCompoundTag("SkullOwner").getCompoundTag("Properties").getTagList("textures", 10).getCompoundTagAt(0).getString("Value"); - String pestName = this.pests.stream().filter(pest -> texture.equals(pest.getSecond())).findFirst().get().getFirst(); - RenderUtils.drawText(pestName + String.format(distanceColor + " %.1fm", distance), entity.posX, entity.posY + entity.getEyeHeight() + 0.65 + 0.5, entity.posZ, (float) (1 + Math.min((distance / 20f), 2f))); - } catch (Exception ignored) { - } + } + if (rotationState != RotationState.CLOSE) { + rotationState = RotationState.CLOSE; + RotationHandler.getInstance().reset(); + } + if (!RotationHandler.getInstance().isRotating()) { + RotationHandler.getInstance().easeTo(new RotationConfiguration( + new Target(entity), + (long) (400 + Math.random() * 200), + null + ).followTarget(true)); + } + FlyPathFinderExecutor.getInstance().setUseAOTV(false); + ItemStack currentItem3 = mc.thePlayer.getHeldItem(); + if (getVacuum(currentItem3)) { + break; + } + KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, true); + } else { + if (rotationState != RotationState.FAR) { + FlyPathFinderExecutor.getInstance().stop(); + rotationState = RotationState.FAR; + RotationHandler.getInstance().reset(); + } + if (!FlyPathFinderExecutor.getInstance().isRunning()) { + double yAddition = Math.max(2.75, Math.min(currentVacuumRange - 5, 10)); + LogUtils.sendDebug("Should pathfind to: " + entity.posX + " " + yAddition + " " + entity.posZ); + FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(entity, true, true, (float) yAddition, true); + } + if (FlyPathFinderExecutor.getInstance().getState() == FlyPathFinderExecutor.State.FAILED + && mc.thePlayer.motionX == 0 && mc.thePlayer.motionZ == 0) { + flyPathfinderTries++; + } else { + flyPathfinderTries = 0; + } + if (flyPathfinderTries > 5) { + LogUtils.sendWarning("[Pests Destroyer] Couldn't pathfind to the pest. Flying from the spawnpoint."); + flyPathfinderTries = 0; + KeyBindUtils.stopMovement(); + delayClock.schedule(1_000 + Math.random() * 500); + MacroHandler.getInstance().triggerWarpGarden(true, false); + state = States.CHECKING_SPAWN; + return; + } + if (!RotationHandler.getInstance().isRotating()) { + RotationHandler.getInstance().easeTo(new RotationConfiguration( + new Target(entity).additionalY(-0.3f), + (long) (400 + Math.random() * 200), + null + )); + } + FlyPathFinderExecutor.getInstance() + .setUseAOTV(distanceXZ > vacuumMinRange && InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + if (distance2 < currentVacuumRange && getVacuum(mc.thePlayer.getHeldItem())) { + break; + } + KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, distance2 < currentVacuumRange); + } + break; + case CHECK_ANOTHER_PEST: + if (previousCurrentPlotPestsCount == GameStateHandler.getInstance().getCurrentPlotPestsCount() + && System.currentTimeMillis() - lastKillTimestamp < 2_000) { + return; + } + + LogUtils.sendDebug( + GameStateHandler.getInstance().getPestsCount() + " pest" + (GameStateHandler.getInstance().getPestsCount() == 1 ? "" : "s") + " left"); + if (GameStateHandler.getInstance().getPestsCount() == 0) { + state = States.GO_BACK; + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + System.out.println("Curr plot pests: " + GameStateHandler.getInstance().getCurrentPlotPestsCount()); + isPlotObstructed = false; + Entity closestPest2 = getClosestPest(); + KeyBindUtils.stopMovement(); + if (closestPest2 != null) { + LogUtils.sendDebug("Found another pest"); + state = States.KILL_PEST; + currentEntityTarget = Optional.of(closestPest2); + delayClock.schedule(50 + (long) (Math.random() * 100)); + } else { + PlotUtils.Plot plotOpt = getClosestPlot(); + if (plotOpt != null) { + double distanceToPlot = Math.sqrt(mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plotOpt.number))); + LogUtils.sendDebug("Distance to plot: " + distanceToPlot); + if (distanceToPlot < 150 || FarmHelperConfig.dontTeleportToPlots) { + LogUtils.sendDebug("Going manually to another plot"); + state = States.GET_CLOSEST_PLOT; + delayClock.schedule(100 + (long) (Math.random() * 150)); + break; + } else { + LogUtils.sendDebug("Teleporting to plot"); + state = States.TELEPORT_TO_PLOT; + delayClock.schedule(400 + (long) (Math.random() * 400)); } - RenderUtils.drawBox(boundingBox, color); + } else { + state = States.GO_BACK; + delayClock.schedule(300 + (long) (Math.random() * 300)); + } + } + break; + case GO_BACK: + state = States.FINISH; + break; + case FINISH: + finishing = true; + if (FarmHelperConfig.pestSwapArmorAfter && currentSlot != FarmHelperConfig.pestArmorSlot1) { + state = States.SWAP_ARMOR; + return; } - if (FarmHelperConfig.pestsTracers) { - RenderUtils.drawTracer(new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), FarmHelperConfig.pestsTracersColor.toJavaColor()); + finishMacro(); +// state = States.FINISH; + break; + } + } + + @Nullable + private Entity getClosestPest() { + Entity closestPest = null; + double closestDistance = Double.MAX_VALUE; + for (Entity entity : pestsLocations) { + double distance = mc.thePlayer.getDistanceToEntity(entity); + if (distance < closestDistance) { + closestDistance = distance; + closestPest = entity; + } + } + return closestPest; + } + + public boolean getVacuum(ItemStack currentItem2) { + if (currentItem2 == null || !currentItem2.getDisplayName().contains("Vacuum")) { + int vacuum = InventoryUtils.getSlotIdOfItemInHotbar("Vacuum"); + if (vacuum == -1) { + LogUtils.sendError("[Pests Destroyer] Failed to find vacuum in hotbar!"); + state = States.GO_BACK; + FarmHelperConfig.enablePestsDestroyer = false; +// finishMacro(); + state = States.FINISH; + return true; + } + mc.thePlayer.inventory.currentItem = vacuum; + delayClock.schedule((long) (200 + Math.random() * 200)); + return true; + } + return false; + } + + private boolean isInventoryOpenDelayed() { + if (mc.currentScreen != null) { + KeyBindUtils.stopMovement(); + delayClock.schedule(300 + (long) (Math.random() * 300)); + Multithreading.schedule(() -> { + if (mc.currentScreen != null) { + PlayerUtils.closeScreen(); + delayClock.schedule(100 + (long) (Math.random() * 200)); } + }, (long) (200 + Math.random() * 100), TimeUnit.MILLISECONDS); + return true; } + return false; + } + + private boolean isInventoryOpen() { + if (mc.currentScreen != null) { + PlayerUtils.closeScreen(); + delayClock.schedule(500 + (long) (Math.random() * 500)); + return true; + } + return false; + } + - private boolean canEntityBeSeenIgnoreNonCollidable(Entity entity) { - Vec3 vec3 = new Vec3(entity.posX, entity.posY + entity.getEyeHeight() + 0.5, entity.posZ); - Vec3 vec31 = new Vec3(mc.thePlayer.posX, mc.thePlayer.posY + mc.thePlayer.getEyeHeight(), mc.thePlayer.posZ); - MovingObjectPosition mop = mc.theWorld.rayTraceBlocks(vec31, vec3, false, true, false); - return mop == null || mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && (mc.theWorld.getBlockState(mop.getBlockPos()).getBlock().equals(Blocks.cactus) || !BlockUtils.hasCollision(mop.getBlockPos())); + private void finishMacro() { + if (isInventoryOpen()) { + return; + } + if (FlyPathFinderExecutor.getInstance().isPathing()) { + FlyPathFinderExecutor.getInstance().stop(); + } + if (MacroHandler.getInstance().isMacroToggled()) { + stop(); + MacroHandler.getInstance().triggerWarpGarden(true, true, false); + delayClock.schedule(2_000 + Math.random() * 500); + } else { + stop(); + } + } + + private boolean hasBlocksAround() { + Vec3 angle0 = AngleUtils.getVectorForRotation(0, mc.thePlayer.rotationYaw); + Vec3 angle90 = AngleUtils.getVectorForRotation(90, mc.thePlayer.rotationYaw); + Vec3 angle180 = AngleUtils.getVectorForRotation(180, mc.thePlayer.rotationYaw); + Vec3 angle270 = AngleUtils.getVectorForRotation(270, mc.thePlayer.rotationYaw); + Vec3 playerPos = mc.thePlayer.getPositionEyes(1); + if (checkIfBlockExists(angle0, playerPos)) { + return true; + } + if (checkIfBlockExists(angle90, playerPos)) { + return true; + } + if (checkIfBlockExists(angle180, playerPos)) { + return true; + } + return checkIfBlockExists(angle270, playerPos); + } + + private boolean checkIfBlockExists(Vec3 angle0, Vec3 playerPos) { + MovingObjectPosition mop0 = mc.theWorld.rayTraceBlocks(playerPos, + playerPos.addVector(angle0.xCoord * 1.5, angle0.yCoord * 1.5, angle0.zCoord * 1.5), false, true, false); + return mop0 != null && mop0.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK; + } + + @SubscribeEvent(receiveCanceled = true) + public void onChat(ClientChatReceivedEvent event) { + if (event.type != 0 || event.message == null) { + return; + } + String message = StringUtils.stripControlCodes(event.message.getUnformattedText().trim()); + if (message.startsWith("You can't fast travel while in combat!") && enabled) { + LogUtils.sendWarning("[Pests Destroyer] Can't fast travel while in combat, will try again to teleport."); +// Multithreading.schedule(this::finishMacro, 1_000 + (long) (Math.random() * 1_000), TimeUnit.MILLISECONDS); + state = States.FINISH; + return; } + if (message.toLowerCase().startsWith("there are not any pests on your garden right now") && enabled && state != States.GO_BACK) { + LogUtils.sendDebug("[Pests Destroyer] There are not any Pests on your Garden right now! Keep farming!"); + state = States.GO_BACK; + delayClock.schedule((long) (500 + Math.random() * 500)); + return; + } + if (message.contains("The worm seems to have burrowed")) { + cantReachPest = 0; + return; + } + if (message.contains("Couldn't find Plot")) { + needToUpdatePlots = true; + delayClock.schedule((long) (500 + Math.random() * 500)); + } + } - @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) - public void onEntityDeath(LivingDeathEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) return; - if (!GameStateHandler.getInstance().inGarden()) return; + private final Color vacuumRangeColor = new Color(200, 30, 30, 100); - Entity entity = event.entity; - LogUtils.sendDebug("[Pests Destroyer] Entity died: " + entity.getName() + "(" + entity.getEntityId() + ")" + " at: " + entity.getPosition()); - killedEntities.add(entity); - if (mc.thePlayer.getDistanceToEntity(entity) < 20) { - lastKillTimestamp = System.currentTimeMillis(); - previousCurrentPlotPestsCount = GameStateHandler.getInstance().getCurrentPlotPestsCount(); - state = States.CHECK_ANOTHER_PEST; + @SubscribeEvent + public void onRender(RenderWorldLastEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + + killedEntities.removeIf(e -> !mc.theWorld.loadedEntityList.contains(e)); + + List pests = mc.theWorld.loadedEntityList.stream().filter(entity -> { + if (entity.isDead) { + return false; + } + if (entity.posY < 50) { + return false; + } + if (entity instanceof EntityArmorStand) { + if (killedEntities.contains(entity)) { + return false; } - if (entity instanceof EntityArmorStand) { - Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); - Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); - if (realEntity != null) { - LogUtils.sendDebug("[Pests Destroyer] Found real entity: " + realEntity.getName() + "(" + realEntity.getEntityId() + ")" + " at: " + realEntity.getPosition()); - killedEntities.add(realEntity); - } - if (nameEntity != null) { - LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " + nameEntity.getPosition()); - killedEntities.add(nameEntity); - } + ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); + if (itemStack == null || !itemStack.hasTagCompound()) { + return false; } - if (entity instanceof EntityBat || entity instanceof EntitySilverfish) { - Entity armorStand = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e.getName().contains("Armor Stand")); - Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != armorStand); - if (armorStand != null) { - LogUtils.sendDebug("[Pests Destroyer] Found armor stand: " + armorStand.getName() + "(" + armorStand.getEntityId() + ")" + " at: " + armorStand.getPosition()); - killedEntities.add(armorStand); - } - if (nameEntity != null) { - LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " + nameEntity.getPosition()); - killedEntities.add(nameEntity); - } + String displayName = itemStack.getTagCompound().toString(); + if (displayName.contains("display:")) { + return false; } - if (isRunning()) - FlyPathFinderExecutor.getInstance().stop(); - resetFireworkInfo(); - lastFireworkTime = 0; - currentEntityTarget.ifPresent(e -> { - if (!e.equals(event.entity)) { - return; - } - if (isRunning()) - KeyBindUtils.stopMovement(); - currentEntityTarget = Optional.empty(); - stuckClock.reset(); - }); - PlotUtils.Plot plot = PlotUtils.getPlotNumberBasedOnLocation(entity.getPosition()); - if (plot == null) { - if (isRunning()) - LogUtils.sendDebug("[Pests Destroyer] Failed to get plot for entity: " + entity.getName() + " at: " + entity.getPosition()); - return; + if (this.pests.stream().noneMatch(pest -> displayName.contains(pest.getSecond()))) { + return false; } - LogUtils.sendDebug("[Pests Destroyer] Removed 1 pest from plot number: " + plot.number); - killedPestsFrom.add(plot.number); - } + if (killedEntities.contains(entity)) { + return false; + } + Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); + Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); + if (realEntity != null && (killedEntities.contains(realEntity) || realEntity.isDead)) { + return false; + } + if (nameEntity != null && (killedEntities.contains(nameEntity))) { + return false; + } + if (killedEntities.stream().noneMatch(ke -> ke.getDistanceToEntity(entity) < 1.5)) { + if (!FarmHelperConfig.streamerMode) { + drawESP(entity); + } + return true; + } + return false; + } + return false; + }).collect(Collectors.toList()); - private final List locations = new ArrayList<>(); - private Vec3 firstLocation = null; - private Vec3 lastLocation = null; + pestsLocations.clear(); + pestsLocations.addAll(pests); - @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) - public void onFirework(SpawnParticleEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) return; - if (!GameStateHandler.getInstance().inGarden()) return; - if (!enabled) return; - if (state != States.WAIT_FOR_LOCATION) return; + if (!FarmHelperConfig.highlightPlotWithPests) { + return; + } - EnumParticleTypes type = event.getParticleTypes(); - if (type != EnumParticleTypes.VILLAGER_ANGRY) return; + double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; + double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; + double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; + for (int plotNumber : GameStateHandler.getInstance().getInfestedPlots()) { + List> chunks = PlotUtils.getPlotChunksBasedOnNumber(plotNumber); + if (chunks.isEmpty()) { + continue; + } + AxisAlignedBB boundingBox = new AxisAlignedBB(chunks.get(0).getFirst() * 16, 66, chunks.get(0).getSecond() * 16, + chunks.get(chunks.size() - 1).getFirst() * 16 + 16, 80, chunks.get(chunks.size() - 1).getSecond() * 16 + 16); + float centerX = (float) (boundingBox.minX + (boundingBox.maxX - boundingBox.minX) / 2); + float centerZ = (float) (boundingBox.minZ + (boundingBox.maxZ - boundingBox.minZ) / 2); + boundingBox = boundingBox.offset(-d0, -d1, -d2); + RenderUtils.drawBox(boundingBox, FarmHelperConfig.plotHighlightColor.toJavaColor()); + RenderUtils.drawText("Plot " + plotNumber, centerX, 80, centerZ, 1); + } - lastFireworkTime = System.currentTimeMillis(); - if (firstLocation == null) { - if (mc.thePlayer.getPositionVector().distanceTo(event.getPos()) > 5) return; - firstLocation = event.getPos(); - locations.add(firstLocation); - lastLocation = firstLocation; - return; - } - double dist = lastLocation.distanceTo(event.getPos()); - if (dist > 1.75) { - return; + if (!FarmHelperConfig.debugMode) { + return; + } + + ItemStack currentItem = mc.thePlayer.getHeldItem(); + if (currentItem == null || !currentItem.getDisplayName().contains("Vacuum")) { + return; + } + Vec3 lookVec = mc.thePlayer.getLookVec(); + Vec3 playerPos = new Vec3(0, mc.thePlayer.eyeHeight, 0); + Vec3 vacuumRange = playerPos.addVector(lookVec.xCoord * currentVacuumRange, lookVec.yCoord * currentVacuumRange, + lookVec.zCoord * currentVacuumRange); + AxisAlignedBB aabb = new AxisAlignedBB(vacuumRange.xCoord - 0.05, vacuumRange.yCoord - 0.05, vacuumRange.zCoord - 0.05, vacuumRange.xCoord + 0.05, + vacuumRange.yCoord + 0.05, vacuumRange.zCoord + 0.05); + RenderUtils.drawBox(aabb, vacuumRangeColor); + } + + private void drawESP(Entity entity) { + AxisAlignedBB boundingBox = new AxisAlignedBB(entity.posX - 0.5, entity.posY + entity.getEyeHeight() - 0.35, entity.posZ - 0.5, entity.posX + 0.5, + entity.posY + entity.getEyeHeight() + 0.65, entity.posZ + 0.5); + double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; + double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; + double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; + boundingBox = boundingBox.offset(-d0, -d1, -d2); + if (FarmHelperConfig.pestsESP) { + Color color = FarmHelperConfig.pestsESPColor.toJavaColor(); + Vec3 entityPos = new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); + double distance = mc.thePlayer.getPositionEyes(1).distanceTo(entityPos); + boolean isInVacuumRange = distance < currentVacuumRange; + if (isInVacuumRange) { + color = new Color(color.getRed(), 255, color.getBlue(), Math.min(50, color.getAlpha())); + } + if (distance > 5) { + try { + EnumChatFormatting distanceColor = distance > currentVacuumRange ? EnumChatFormatting.RED : EnumChatFormatting.GREEN; + ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); + NBTTagCompound tagCompound = itemStack.getTagCompound(); + String texture = tagCompound.getCompoundTag("SkullOwner").getCompoundTag("Properties").getTagList("textures", 10).getCompoundTagAt(0) + .getString("Value"); + String pestName = this.pests.stream().filter(pest -> texture.equals(pest.getSecond())).findFirst().get().getFirst(); + RenderUtils.drawText(pestName + String.format(distanceColor + " %.1fm", distance), entity.posX, + entity.posY + entity.getEyeHeight() + 0.65 + 0.5, entity.posZ, (float) (1 + Math.min((distance / 20f), 2f))); + } catch (Exception ignored) { } - locations.add(event.getPos()); - lastLocation = event.getPos(); + } + RenderUtils.drawBox(boundingBox, color); + } + if (FarmHelperConfig.pestsTracers) { + RenderUtils.drawTracer(new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), + FarmHelperConfig.pestsTracersColor.toJavaColor()); + } + } + + private boolean canEntityBeSeenIgnoreNonCollidable(Entity entity) { + Vec3 vec3 = new Vec3(entity.posX, entity.posY + entity.getEyeHeight() + 0.5, entity.posZ); + Vec3 vec31 = new Vec3(mc.thePlayer.posX, mc.thePlayer.posY + mc.thePlayer.getEyeHeight(), mc.thePlayer.posZ); + MovingObjectPosition mop = mc.theWorld.rayTraceBlocks(vec31, vec3, false, true, false); + return mop == null || mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && ( + mc.theWorld.getBlockState(mop.getBlockPos()).getBlock().equals(Blocks.cactus) || !BlockUtils.hasCollision(mop.getBlockPos())); + } + + @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) + public void onEntityDeath(LivingDeathEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; } - private Vec3 calculateWaypoint() { - if (lastLocation == null) return null; - Vec3 direction = lastLocation.subtract(firstLocation).normalize(); - return lastLocation.addVector(direction.xCoord * 10, 0, direction.zCoord * 10); + Entity entity = event.entity; + LogUtils.sendDebug("[Pests Destroyer] Entity died: " + entity.getName() + "(" + entity.getEntityId() + ")" + " at: " + entity.getPosition()); + killedEntities.add(entity); + if (mc.thePlayer.getDistanceToEntity(entity) < 20) { + lastKillTimestamp = System.currentTimeMillis(); + previousCurrentPlotPestsCount = GameStateHandler.getInstance().getCurrentPlotPestsCount(); + state = States.CHECK_ANOTHER_PEST; + } + if (entity instanceof EntityArmorStand) { + Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); + Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); + if (realEntity != null) { + LogUtils.sendDebug("[Pests Destroyer] Found real entity: " + realEntity.getName() + "(" + realEntity.getEntityId() + ")" + " at: " + + realEntity.getPosition()); + killedEntities.add(realEntity); + } + if (nameEntity != null) { + LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " + + nameEntity.getPosition()); + killedEntities.add(nameEntity); + } + } + if (entity instanceof EntityBat || entity instanceof EntitySilverfish) { + Entity armorStand = PlayerUtils.getEntityCuttingOtherEntity(entity, + (e) -> e instanceof EntityArmorStand && e.getName().contains("Armor Stand")); + Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != armorStand); + if (armorStand != null) { + LogUtils.sendDebug("[Pests Destroyer] Found armor stand: " + armorStand.getName() + "(" + armorStand.getEntityId() + ")" + " at: " + + armorStand.getPosition()); + killedEntities.add(armorStand); + } + if (nameEntity != null) { + LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " + + nameEntity.getPosition()); + killedEntities.add(nameEntity); + } + } + if (isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + } + resetFireworkInfo(); + lastFireworkTime = 0; + currentEntityTarget.ifPresent(e -> { + if (!e.equals(event.entity)) { + return; + } + if (isRunning()) { + KeyBindUtils.stopMovement(); + } + currentEntityTarget = Optional.empty(); + stuckClock.reset(); + }); + PlotUtils.Plot plot = PlotUtils.getPlotNumberBasedOnLocation(entity.getPosition()); + if (plot == null) { + if (isRunning()) { + LogUtils.sendDebug("[Pests Destroyer] Failed to get plot for entity: " + entity.getName() + " at: " + entity.getPosition()); + } + return; + } + LogUtils.sendDebug("[Pests Destroyer] Removed 1 pest from plot number: " + plot.number); + killedPestsFrom.add(plot.number); + } + + private final List locations = new ArrayList<>(); + private Vec3 firstLocation = null; + private Vec3 lastLocation = null; + + @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) + public void onFirework(SpawnParticleEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (!enabled) { + return; + } + if (state != States.WAIT_FOR_LOCATION) { + return; } - public void resetFireworkInfo() { - locations.clear(); - firstLocation = null; - lastLocation = null; - lastFireworkTime = 0; + EnumParticleTypes type = event.getParticleTypes(); + if (type != EnumParticleTypes.VILLAGER_ANGRY) { + return; } - @SubscribeEvent - public void onSpawnObject(SpawnObjectEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) return; - if (!GameStateHandler.getInstance().inGarden()) return; - if (event.type != 76) return; - if (!enabled) return; - if (state != States.WAIT_FOR_LOCATION) return; + lastFireworkTime = System.currentTimeMillis(); + if (firstLocation == null) { + if (mc.thePlayer.getPositionVector().distanceTo(event.getPos()) > 5) { + return; + } + firstLocation = event.getPos(); + locations.add(firstLocation); + lastLocation = firstLocation; + return; + } + double dist = lastLocation.distanceTo(event.getPos()); + if (dist > 1.75) { + return; + } + locations.add(event.getPos()); + lastLocation = event.getPos(); + } - double distance = mc.thePlayer.getDistance(event.pos.xCoord, event.pos.yCoord, event.pos.zCoord); - if (distance < 3) { - int y = 130; - Block block = mc.theWorld.getBlockState(new BlockPos(event.pos.xCoord, y, event.pos.zCoord)).getBlock(); - while (y > 90 && block.equals(Blocks.air)) { - y--; - } - y += 3; - FlyPathFinderExecutor.getInstance().setDontRotate(true); - FlyPathFinderExecutor.getInstance().setSprinting(false); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(event.pos.xCoord, y, event.pos.zCoord), true, true); - LogUtils.sendWarning("[Pests Destroyer] Firework is too close to player. Flying to x: " + event.pos.xCoord + " y: " + y + " z: " + event.pos.zCoord); - state = States.GET_LOCATION; - } + private Vec3 calculateWaypoint() { + if (lastLocation == null) { + return null; + } + Vec3 direction = lastLocation.subtract(firstLocation).normalize(); + return lastLocation.addVector(direction.xCoord * 10, 0, direction.zCoord * 10); + } + + public void resetFireworkInfo() { + locations.clear(); + firstLocation = null; + lastLocation = null; + lastFireworkTime = 0; + } + + @SubscribeEvent + public void onSpawnObject(SpawnObjectEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (event.type != 76) { + return; + } + if (!enabled) { + return; + } + if (state != States.WAIT_FOR_LOCATION) { + return; } - private boolean checkedThisGui = false; - - @SubscribeEvent - public void onGuiOpen(DrawScreenAfterEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) return; - if (!GameStateHandler.getInstance().inGarden()) return; - if (checkedThisGui) return; - if (!(event.guiScreen instanceof GuiChest)) return; - String guiName = InventoryUtils.getInventoryName(); - if (guiName == null) return; - if (!delayClock.passed()) return; - ContainerChest guiChest = (ContainerChest) ((GuiChest) event.guiScreen).inventorySlots; - - if (!InventoryUtils.isInventoryLoaded()) return; - - int plotCounter = 0; - if (StringUtils.stripControlCodes(guiName).equals("Configure Plots")) { - for (int i = 0; i < guiChest.inventorySlots.size(); i++) { - Slot slot = guiChest.inventorySlots.get(i); - if (slot == null || !slot.getHasStack()) continue; - if (slot.getStack().getDisplayName().contains("Plot")) { - String displayName = StringUtils.stripControlCodes(slot.getStack().getDisplayName()); - try { - String plotName = displayName.replace("Plot - ", "").trim(); - int plotNumber = PlotUtils.getPLOT_NUMBERS().get(plotCounter); - PlotUtils.setPlot(plotNumber, plotName); - } catch (Exception e) { - LogUtils.sendError("[Pests Destroyer] Failed to parse plot number: " + displayName); - } - plotCounter++; - } else if (StringUtils.stripControlCodes(slot.getStack().getDisplayName()).equals("The Barn")) - plotCounter++; - } + double distance = mc.thePlayer.getDistance(event.pos.xCoord, event.pos.yCoord, event.pos.zCoord); + if (distance < 3) { + int y = 130; + Block block = mc.theWorld.getBlockState(new BlockPos(event.pos.xCoord, y, event.pos.zCoord)).getBlock(); + while (y > 90 && block.equals(Blocks.air)) { + y--; + } + y += 3; + FlyPathFinderExecutor.getInstance().setDontRotate(true); + FlyPathFinderExecutor.getInstance().setSprinting(false); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(event.pos.xCoord, y, event.pos.zCoord), true, true); + LogUtils.sendWarning( + "[Pests Destroyer] Firework is too close to player. Flying to x: " + event.pos.xCoord + " y: " + y + " z: " + event.pos.zCoord); + state = States.GET_LOCATION; + } + } - } else { - return; + private boolean checkedThisGui = false; + + @SubscribeEvent + public void onGuiOpen(DrawScreenAfterEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (checkedThisGui) { + return; + } + if (!(event.guiScreen instanceof GuiChest)) { + return; + } + String guiName = InventoryUtils.getInventoryName(); + if (guiName == null) { + return; + } + if (!delayClock.passed()) { + return; + } + ContainerChest guiChest = (ContainerChest) ((GuiChest) event.guiScreen).inventorySlots; + + if (!InventoryUtils.isInventoryLoaded()) { + return; + } + + int plotCounter = 0; + if (StringUtils.stripControlCodes(guiName).equals("Configure Plots")) { + for (int i = 0; i < guiChest.inventorySlots.size(); i++) { + Slot slot = guiChest.inventorySlots.get(i); + if (slot == null || !slot.getHasStack()) { + continue; } - needToUpdatePlots = false; - checkedThisGui = true; - PlotUtils.savePlots(); - LogUtils.sendDebug("[Pests Destroyer] Updated plots"); - if (state == States.WAIT_FOR_INFO) { - PlayerUtils.closeScreen(); - if (FarmHelperConfig.dontTeleportToPlots) { - state = States.GET_CLOSEST_PLOT; - } else { - state = States.TELEPORT_TO_PLOT; - } - delayClock.schedule(300 + (long) (Math.random() * 250)); + if (slot.getStack().getDisplayName().contains("Plot")) { + String displayName = StringUtils.stripControlCodes(slot.getStack().getDisplayName()); + try { + String plotName = displayName.replace("Plot - ", "").trim(); + int plotNumber = PlotUtils.getPLOT_NUMBERS().get(plotCounter); + PlotUtils.setPlot(plotNumber, plotName); + } catch (Exception e) { + LogUtils.sendError("[Pests Destroyer] Failed to parse plot number: " + displayName); + } + plotCounter++; + } else if (StringUtils.stripControlCodes(slot.getStack().getDisplayName()).equals("The Barn")) { + plotCounter++; } + } + + } else { + return; } + needToUpdatePlots = false; + checkedThisGui = true; + PlotUtils.savePlots(); + LogUtils.sendDebug("[Pests Destroyer] Updated plots"); + if (state == States.WAIT_FOR_INFO) { + PlayerUtils.closeScreen(); + if (FarmHelperConfig.dontTeleportToPlots) { + state = States.GET_CLOSEST_PLOT; + } else { + state = States.TELEPORT_TO_PLOT; + } + delayClock.schedule(300 + (long) (Math.random() * 250)); + } + } - private final Clock flyDelay = new Clock(); + private final Clock flyDelay = new Clock(); - private void fly() { - if (mc.thePlayer.capabilities.isFlying) { - KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); - return; - } - if (mc.thePlayer.motionY < -0.0784000015258789 || BlockUtils.getRelativeBlock(0, 0, 0).getMaterial().isLiquid()) - if (flyDelay.passed()) { - if (!mc.thePlayer.capabilities.isFlying) { - mc.thePlayer.capabilities.isFlying = true; - mc.thePlayer.sendPlayerAbilities(); - } - flyDelay.reset(); - } else if (flyDelay.isScheduled()) { - return; - } - if (mc.thePlayer.onGround) { - mc.thePlayer.jump(); - flyDelay.schedule(80 + (long) (Math.random() * 80)); - } else if (!mc.thePlayer.capabilities.isFlying && !flyDelay.isScheduled()) { - flyDelay.schedule(80 + (long) (Math.random() * 80)); - } - } - - private PlotUtils.Plot getClosestPlot() { - List infestedPlots = GameStateHandler.getInstance().getInfestedPlots(); - if (infestedPlots.isEmpty()) { - LogUtils.sendError("[Pests Destroyer] Couldn't find infested plots on Tablist! Make sure you have it enabled in Tablist Widgets"); - return null; - } - if (GameStateHandler.getInstance().getCurrentPlotPestsCount() == 0) { - infestedPlots.removeIf(killedPestsFrom::contains); - } - PlotUtils.Plot closestPlot = null; - double closestDistance = Double.MAX_VALUE; - for (int plot : infestedPlots) { - double distance = mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plot)); - if (distance < closestDistance) { - closestDistance = distance; - closestPlot = PlotUtils.getPlotBasedOnNumber(plot); - } + private void fly() { + if (mc.thePlayer.capabilities.isFlying) { + KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); + return; + } + if (mc.thePlayer.motionY < -0.0784000015258789 || BlockUtils.getRelativeBlock(0, 0, 0).getMaterial().isLiquid()) { + if (flyDelay.passed()) { + if (!mc.thePlayer.capabilities.isFlying) { + mc.thePlayer.capabilities.isFlying = true; + mc.thePlayer.sendPlayerAbilities(); } - if (closestPlot == null) { - LogUtils.sendDebug("[Pests Destroyer] Failed to get closest plot"); - return null; - } - return closestPlot; - } - - private boolean isNearPlotCenter() { - if (!closestPlot.isPresent()) return false; - BlockPos plotCenter = PlotUtils.getPlotCenter(closestPlot.get().number); - double distance = mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()); - return distance < 15; - } - - public enum States { - IDLE, - OPEN_DESK, - OPEN_PLOTS, - WAIT_FOR_INFO, - TELEPORT_TO_PLOT, - WAIT_FOR_TP, - CHECKING_PLOT, - CHECKING_SPAWN, - GET_CLOSEST_PLOT, - FLY_TO_THE_CLOSEST_PLOT, - GET_LOCATION, - WAIT_FOR_LOCATION, - FIND_PEST, - KILL_PEST, - CHECK_ANOTHER_PEST, - GO_BACK - } - - enum RotationState { - NONE, - CLOSE, - MEDIUM, - FAR - } - - public enum EscapeState { - NONE, - GO_TO_HUB, - GO_TO_GARDEN, - RESUME_MACRO + flyDelay.reset(); + } else if (flyDelay.isScheduled()) { + return; + } + } + if (mc.thePlayer.onGround) { + mc.thePlayer.jump(); + flyDelay.schedule(80 + (long) (Math.random() * 80)); + } else if (!mc.thePlayer.capabilities.isFlying && !flyDelay.isScheduled()) { + flyDelay.schedule(80 + (long) (Math.random() * 80)); + } + } + + private PlotUtils.Plot getClosestPlot() { + List infestedPlots = GameStateHandler.getInstance().getInfestedPlots(); + if (infestedPlots.isEmpty()) { + LogUtils.sendError("[Pests Destroyer] Couldn't find infested plots on Tablist! Make sure you have it enabled in Tablist Widgets"); + return null; + } + if (GameStateHandler.getInstance().getCurrentPlotPestsCount() == 0) { + infestedPlots.removeIf(killedPestsFrom::contains); + } + PlotUtils.Plot closestPlot = null; + double closestDistance = Double.MAX_VALUE; + for (int plot : infestedPlots) { + double distance = mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plot)); + if (distance < closestDistance) { + closestDistance = distance; + closestPlot = PlotUtils.getPlotBasedOnNumber(plot); + } + } + if (closestPlot == null) { + LogUtils.sendDebug("[Pests Destroyer] Failed to get closest plot"); + return null; + } + return closestPlot; + } + + private boolean isNearPlotCenter() { + if (!closestPlot.isPresent()) { + return false; } + BlockPos plotCenter = PlotUtils.getPlotCenter(closestPlot.get().number); + double distance = mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()); + return distance < 15; + } + + public enum States { + IDLE, + SWAP_ARMOR, + ARMOR_SWAP_VERIFY, + OPEN_DESK, + OPEN_PLOTS, + WAIT_FOR_INFO, + TELEPORT_TO_PLOT, + WAIT_FOR_TP, + CHECKING_PLOT, + CHECKING_SPAWN, + GET_CLOSEST_PLOT, + FLY_TO_THE_CLOSEST_PLOT, + GET_LOCATION, + WAIT_FOR_LOCATION, + FIND_PEST, + KILL_PEST, + CHECK_ANOTHER_PEST, + GO_BACK, + FINISH + } + + enum RotationState { + NONE, + CLOSE, + MEDIUM, + FAR + } + + public enum EscapeState { + NONE, + GO_TO_HUB, + GO_TO_GARDEN, + RESUME_MACRO + } } From 9303aa6e922f639536a0d1cb20ce0a72aa0eeb70 Mon Sep 17 00:00:00 2001 From: Osama Date: Sat, 30 Nov 2024 00:11:02 +0600 Subject: [PATCH 02/19] Goat --- gradle.properties | 2 +- .../command/FarmHelperMainCommand.java | 6 +- .../farmhelperv2/config/FarmHelperConfig.java | 74 +++++++ .../farmhelperv2/feature/FeatureManager.java | 4 +- .../feature/impl/AutoWardrobe.java | 198 +++++++++++++++++- .../farmhelperv2/feature/impl/BPSTracker.java | 6 +- .../farmhelperv2/feature/impl/PestFarmer.java | 157 +++++++++++++- .../farmhelperv2/macro/AbstractMacro.java | 5 +- .../mixin/client/MixinMinecraft.java | 10 + 9 files changed, 449 insertions(+), 13 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0323d62c1..8cb0c277a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ baseGroup=com.jelly.farmhelperv2 mcVersion=1.8.9 modid=farmhelperv2 modName=FarmHelper -version=2.8.14 +version=2.9.2 shouldRelease=true diff --git a/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java b/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java index 0fd0b2196..851f3cb43 100644 --- a/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java +++ b/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java @@ -6,6 +6,7 @@ import cc.polyfrost.oneconfig.utils.commands.annotations.SubCommand; import com.jelly.farmhelperv2.FarmHelper; import com.jelly.farmhelperv2.config.FarmHelperConfig; +import com.jelly.farmhelperv2.feature.impl.AutoWardrobe; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.pathfinder.FlyPathFinderExecutor; import com.jelly.farmhelperv2.util.LogUtils; @@ -70,7 +71,8 @@ public void update() { } @SubCommand - public void test(){ - LogUtils.sendSuccess("SprayonatorState: " + GameStateHandler.getInstance().getSprayonatorState()); + public void wd(int slot) { + AutoWardrobe.instance.swapTo(slot); } + } diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index 70a5562ee..40ca9b597 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -51,6 +51,7 @@ public class FarmHelperConfig extends Config { private transient static final String JACOBS_CONTEST = "Jacob's Contest"; private transient static final String VISITORS_MACRO = "Visitors Macro"; private transient static final String PESTS_DESTROYER = "Pests Destroyer"; + private transient static final String PEST_FARMER = "Pest Farmer"; private transient static final String AUTO_PEST_EXCHANGE = "Auto Pest Exchange"; private transient static final String AUTO_GOD_POT = "Auto God Pot"; private transient static final String AUTO_SELL = "Auto Sell"; @@ -1290,7 +1291,32 @@ public static void triggerManuallyPestsDestroyer() { size = 2 ) public static OneKeyBind enablePestsDestroyerKeyBind = new OneKeyBind(Keyboard.KEY_NONE); + // + // + @Switch( + name = "Swap Armor Before Killing", category = PESTS_DESTROYER, subcategory = "Armor Swapper" + ) + public static boolean pestSwapArmorBefore = false; + + @Slider( + name = "Wardrobe Slot To Kill With", category = PESTS_DESTROYER, subcategory = "Armor Swapper", + description = "Wardrobe slot to use before turning on pest destroyer", + min = 1, max = 18 + ) + public static int pestArmorSlot0 = 1; + + @Switch( + name = "Swap Armor After Killing", category = PESTS_DESTROYER, subcategory = "Armor Swapper" + ) + public static boolean pestSwapArmorAfter = false; + + @Slider( + name = "Wardrobe Slot To Farm With", category = PESTS_DESTROYER, subcategory = "Armor Swapper", + description = "Wardrobe slot to equip after turning off pest destroyer", + min = 1, max = 18 + ) + public static int pestArmorSlot1 = 1; // // @@ -1350,6 +1376,51 @@ public static void triggerManuallyPestsDestroyer() { // // + // + @Header( + text = "Read the comments below this page before using pest farmer.", + category = PEST_FARMER, size = 2 + ) + public static boolean ignored1; + + @Switch( + name = "Enable Pest Farming", category = PEST_FARMER, + description = "Enables Pest Farming" + ) + public static boolean pestFarming = false; + + @Slider( + name = "Farming Armor Slot", category = PEST_FARMER, + min = 1, max = 18 + ) + public static int pestFarmingSet0Slot = 1; + + @Slider( + name = "Pest Chance Armor Slot", category = PEST_FARMER, + min = 1, max = 18 + ) + public static int pestFarmingSet1Slot = 1; + + @Slider( + name = "Pest Spawn Timer (In seconds)", category = PEST_FARMER, + description = "The time it should wait after pests spawn to swap slots (should be your pest spawn time - 5/10 seconds)", + min = 30, max = 300 + ) + public static int pestFarmingWaitTime = 255; + + @Info( + text = "Use this Auto-Pet Rule: 1. On Equip Farming Armor -> Farming Pet | 2. On Equip Pest Chance Armor -> Slug Pet | 3. On Enter Combat -> Hedgehog Pet", + type = InfoType.INFO, category = PEST_FARMER + ) + public static boolean ignored2; + + @Info( + text = "Use Armor Swapper in Pest Destroyer. Swap to Farming Armor On Start Just in case Pest Farmer doesn't do that itself.", + type = InfoType.INFO, category = PEST_FARMER + ) + public static boolean ignored3; + + // // // @Switch( @@ -2256,6 +2327,9 @@ public FarmHelperConfig() { this.addDependency("rotationTimeDuringJacob", "customRotationDelaysDuringJacob"); this.addDependency("rotationTimeRandomnessDuringJacob", "customRotationDelaysDuringJacob"); + this.addDependency("pestArmorSlot0", "pestSwapArmorBefore"); + this.addDependency("pestArmorSlot1", "pestSwapArmorAfter"); + this.addDependency("leaveTime", "leaveTimer"); this.hideIf("shownWelcomeGUI", () -> true); diff --git a/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java index 4baef0a3f..e571d82cf 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java @@ -48,7 +48,9 @@ public List fillFeatures() { Scheduler.getInstance(), UngrabMouse.getInstance(), VisitorsMacro.getInstance(), - PiPMode.getInstance() + PiPMode.getInstance(), + AutoWardrobe.instance, + PestFarmer.instance// sue me ); features.addAll(featuresList); return features; diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java index e8d8797b5..3a9cdd601 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java @@ -1,4 +1,200 @@ package com.jelly.farmhelperv2.feature.impl; -public class AutoWardrobe { +import com.jelly.farmhelperv2.config.FarmHelperConfig; +import com.jelly.farmhelperv2.feature.IFeature; +import com.jelly.farmhelperv2.util.InventoryUtils; +import com.jelly.farmhelperv2.util.InventoryUtils.ClickMode; +import com.jelly.farmhelperv2.util.InventoryUtils.ClickType; +import com.jelly.farmhelperv2.util.LogUtils; +import com.jelly.farmhelperv2.util.PlayerUtils; +import com.jelly.farmhelperv2.util.helper.Clock; +import kotlinx.serialization.descriptors.PolymorphicKind.OPEN; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiChest; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; + +public class AutoWardrobe implements IFeature { + + public static AutoWardrobe instance = new AutoWardrobe(); + private static final Minecraft mc = Minecraft.getMinecraft(); + private boolean enabled = false; + private int swapTo = -1; + private State state = State.STARTING; + private Clock timer = new Clock(); + + @Override + public String getName() { + return "AutoWardrobe"; + } + + @Override + public boolean isRunning() { + return enabled; + } + + @Override + public boolean shouldPauseMacroExecution() { + return true; + } + + @Override + public boolean shouldStartAtMacroStart() { + return false; + } + + @Override + public void resetStatesAfterMacroDisabled() { + + } + + @Override + public boolean isToggled() { + return true; + } + + @Override + public boolean shouldCheckForFailsafes() { + return false; + } + + public void swapTo(int slot) { + if (slot < 1 || slot > 18) { + return; + } + + swapTo = slot; + enabled = true; + LogUtils.sendSuccess("[AutoWardrobe] Starting. Swapping to slot " + slot); + } + + @Override + public void stop() { + if (!enabled) { + return; + } + enabled = false; + swapTo = -1; + state = State.STARTING; + timer.reset(); + + LogUtils.sendSuccess("[AutoWardrobe] Stopping."); + } + + public void setState(State state, long time) { + this.state = state; + timer.schedule(time); + if (time == 0) { + timer.reset(); + } + } + + public boolean isTimerRunning() { + return timer.isScheduled() && !timer.passed(); + } + + public boolean hasTimerEnded() { + return !timer.isScheduled() || timer.passed(); + } + + @SubscribeEvent + public void onTick(ClientTickEvent event) { + if (!enabled) { + return; + } + + switch (state) { + case STARTING: + setState(State.OPENING_WD, FarmHelperConfig.getRandomGUIMacroDelay()); + break; + case OPENING_WD: + if (isTimerRunning()) { + return; + } + + mc.thePlayer.sendChatMessage("/wd"); + setState(State.WD_VERIFY, 2000); + break; + case WD_VERIFY: + if (hasTimerEnded()) { + LogUtils.sendError("Could not open wardrobe in under 2 seconds. Stopping"); + setState(State.ENDING, 0); + return; + } + + if (inventoryName().startsWith("Wardrobe")) { + setState(State.NAVIGATING, FarmHelperConfig.getRandomGUIMacroDelay()); + } + break; + case NAVIGATING: + if (isTimerRunning()) { + return; + } + if (swapTo < 9) { + setState(State.CLICKING_SLOT, 0); + return; + } + InventoryUtils.clickContainerSlot(InventoryUtils.getSlotIdOfItemInContainer("Next Page"), ClickType.LEFT, ClickMode.PICKUP); + setState(State.NAVIGATION_VERIFY, 2000); + break; + case NAVIGATION_VERIFY: + if (hasTimerEnded()) { + LogUtils.sendError("Could not switch to next page in under 2 seconds. Stopping"); + setState(State.ENDING, 0); + return; + } + + if (inventoryName().endsWith("2)")) { + setState(State.CLICKING_SLOT, FarmHelperConfig.getRandomGUIMacroDelay()); + } + break; + case CLICKING_SLOT: + if (isTimerRunning()) { + return; + } + int slotId = 35 + (swapTo - 1) % 9 + 1; + Slot slot = InventoryUtils.getSlotOfIdInContainer(slotId); + if (slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + // remove this to make it unequip armor (click the same slot) + if (stack.hasDisplayName() && !stack.getDisplayName().contains("Equipped") && !stack.getDisplayName().contains("Locked")) { + InventoryUtils.clickContainerSlot(35 + (swapTo - 1) % 9 + 1, ClickType.LEFT, ClickMode.PICKUP); + } + } + setState(State.ENDING, FarmHelperConfig.getRandomGUIMacroDelay()); + break; + case ENDING: + if (isTimerRunning()) { + return; + } + PlayerUtils.closeScreen(); + stop(); + break; + } + } + + private String inventoryName() { + try { + if (mc.currentScreen instanceof GuiChest) { + final ContainerChest chest = (ContainerChest) mc.thePlayer.openContainer; + if (chest == null) { + return ""; + } + final IInventory inv = chest.getLowerChestInventory(); + return inv.hasCustomName() ? inv.getName() : ""; + } + return ""; + } catch (Exception e) { + return ""; + } + } + + + enum State { + STARTING, OPENING_WD, WD_VERIFY, NAVIGATING, NAVIGATION_VERIFY, CLICKING_SLOT, ENDING + } } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/BPSTracker.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/BPSTracker.java index 96c836dea..5c32aed2e 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/BPSTracker.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/BPSTracker.java @@ -93,11 +93,7 @@ public void start() { } private boolean checkForBPS(AbstractMacro.State currentState) { - return currentState != AbstractMacro.State.NONE && - currentState != AbstractMacro.State.DROPPING && - currentState != AbstractMacro.State.SWITCHING_SIDE && - currentState != AbstractMacro.State.SWITCHING_LANE && - Minecraft.getMinecraft().currentScreen == null; + return currentState.ordinal() > 3 && Minecraft.getMinecraft().currentScreen == null; } public float elapsedTime = 0; diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index d1e389cff..8e266f107 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -1,5 +1,160 @@ package com.jelly.farmhelperv2.feature.impl; -public class PestFarmer { +import com.jelly.farmhelperv2.config.FarmHelperConfig; +import com.jelly.farmhelperv2.failsafe.FailsafeManager; +import com.jelly.farmhelperv2.feature.FeatureManager; +import com.jelly.farmhelperv2.feature.IFeature; +import com.jelly.farmhelperv2.handler.GameStateHandler; +import com.jelly.farmhelperv2.handler.MacroHandler; +import com.jelly.farmhelperv2.util.LogUtils; +import net.minecraft.client.Minecraft; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +public class PestFarmer implements IFeature { + + public static PestFarmer instance = new PestFarmer(); + private final Minecraft mc = Minecraft.getMinecraft(); + private boolean enabled = false; + private long pestSpawnTime = 0L; + private int swapTo = 1; // 0 = fermento, 1 = biohazard + private State state = State.SWAPPING; + private boolean pestSpawned = false; + + @Override + public String getName() { + return "PestFarmer"; + } + + @Override + public boolean isRunning() { + return enabled; + } + + @Override + public boolean shouldPauseMacroExecution() { + return true; + } + + @Override + public boolean shouldStartAtMacroStart() { + return false; + } + + @Override + public void resetStatesAfterMacroDisabled() { + state = State.SWAPPING; + pestSpawned = false; + swapTo = -1; + } + + @Override + public boolean isToggled() { + return FarmHelperConfig.pestFarming; + } + + @Override + public boolean shouldCheckForFailsafes() { + return false; + } + + @Override + public void start() { + if (enabled) { + return; + } + MacroHandler.getInstance().pauseMacro(); + enabled = true; + } + + @Override + public void stop() { + if (!enabled) { + return; + } + + enabled = false; + state = State.SWAPPING; + if (MacroHandler.getInstance().isMacroToggled()) { + MacroHandler.getInstance().resumeMacro(); + } + } + + @SubscribeEvent + public void onTick(ClientTickEvent event) { + if (event.phase != Phase.START) { + return; + } + if (!this.isToggled() || !MacroHandler.getInstance().isCurrentMacroEnabled() || MacroHandler.getInstance().getCurrentMacro().get().currentState.ordinal() < 4 || enabled) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (GameStateHandler.getInstance().getServerClosingSeconds().isPresent()) { + return; + } + if (!Scheduler.getInstance().isFarming()) { + return; + } + if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { + return; + } + if (FeatureManager.getInstance().isAnyOtherFeatureEnabled(this)) { + return; + } + + if (pestSpawned) { + long timeDiff = System.currentTimeMillis() - pestSpawnTime; + if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L && swapTo != 1) { + swapTo = 1; + start(); + pestSpawned = false; + } else if(swapTo != 0) { + swapTo = 0; + start(); + } + } + } + + @SubscribeEvent + public void onChat(ClientChatReceivedEvent event) { + if (event.type != 0) { + return; + } + String message = event.message.getUnformattedText(); + if (message.startsWith("§6§lYUCK!") || message.startsWith("§6§lEWW!") || message.startsWith("§6§lGROSS!")) { + pestSpawnTime = System.currentTimeMillis(); + pestSpawned = true; + LogUtils.sendDebug("[PestFarmer] Pest Spawned."); + } + } + + @SubscribeEvent + public void onTickSwap(ClientTickEvent event) { + if (!enabled) { + return; + } + + switch (state) { + case SWAPPING: + AutoWardrobe.instance.swapTo(swapTo == 0 ? FarmHelperConfig.pestFarmingSet0Slot : FarmHelperConfig.pestFarmingSet1Slot); + state = State.ENDING; + break; + case ENDING: + if (AutoWardrobe.instance.isRunning()) { + return; + } + stop(); + break; + } + } + + // bleh, its only for the tracker basically + enum State { + SWAPPING, + ENDING + } } diff --git a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java index afda426ab..879dbebde 100644 --- a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java @@ -382,14 +382,15 @@ public void setBreakTime(double time, double timeBefore) { public enum State { // Add default values like NONE and DROPPING + // DO NOT REARRAGE, IT WILL BREAK PEST FARMER IF YOU DO - osama NONE, DROPPING, + SWITCHING_SIDE, + SWITCHING_LANE, LEFT, RIGHT, BACKWARD, FORWARD, - SWITCHING_SIDE, - SWITCHING_LANE, A, D, diff --git a/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java b/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java index 9925d6cde..e54eec0f5 100644 --- a/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java +++ b/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java @@ -16,10 +16,12 @@ import net.minecraft.init.Blocks; import net.minecraft.util.BlockPos; import net.minecraft.util.MovingObjectPosition; +import org.lwjgl.opengl.Display; import org.spongepowered.asm.mixin.Mixin; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = Minecraft.class, priority = Integer.MAX_VALUE) @@ -110,4 +112,12 @@ private void sendClickBlockToController(CallbackInfo ci) { } } + + @Redirect(method = "setIngameFocus", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/Display;isActive()Z")) + public boolean isActive() { + if (MacroHandler.getInstance().isMacroToggled()) { + return true; + } + return Display.isActive(); + } } \ No newline at end of file From 2b9660040ad9ca1cb7a8552aff7ca4e292f89c29 Mon Sep 17 00:00:00 2001 From: Osama Date: Sun, 1 Dec 2024 20:30:09 +0600 Subject: [PATCH 03/19] Pest Farmer --- gradle.properties | 2 +- .../command/FarmHelperMainCommand.java | 8 +--- .../farmhelperv2/config/FarmHelperConfig.java | 46 ++++++++++++++++--- .../feature/impl/AutoWardrobe.java | 22 +++++---- .../farmhelperv2/feature/impl/PestFarmer.java | 29 ++++++++---- .../feature/impl/PestsDestroyer.java | 4 +- .../farmhelperv2/macro/AbstractMacro.java | 13 +++++- .../mixin/client/MixinMinecraft.java | 5 ++ 8 files changed, 97 insertions(+), 32 deletions(-) diff --git a/gradle.properties b/gradle.properties index 8cb0c277a..7af6b265f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ baseGroup=com.jelly.farmhelperv2 mcVersion=1.8.9 modid=farmhelperv2 modName=FarmHelper -version=2.9.2 +version=2.9.0 shouldRelease=true diff --git a/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java b/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java index 851f3cb43..9c1bc20f3 100644 --- a/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java +++ b/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java @@ -69,10 +69,4 @@ public void update() { PlayerUtils.closeScreen(); FarmHelperConfig.checkForUpdate(); } - - @SubCommand - public void wd(int slot) { - AutoWardrobe.instance.swapTo(slot); - } - -} +} \ No newline at end of file diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index 40ca9b597..b69d244b5 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -1197,6 +1197,11 @@ public class FarmHelperConfig extends Config { ) public static int pestAdditionalGUIDelay = 0; + @Switch( + name = "Force Enable Pest Destroyer at X Pests", category = PESTS_DESTROYER, subcategory = "Pests Destroyer" + ) + public static boolean pestForceEnable = false; + @Switch( name = "Sprint while flying", category = PESTS_DESTROYER, subcategory = "Pests Destroyer", description = "Sprints while flying" @@ -1320,7 +1325,6 @@ public static void triggerManuallyPestsDestroyer() { // // - @Switch( name = "Pests ESP", category = PESTS_DESTROYER, subcategory = "Drawings", description = "Draws a box around pests" @@ -1389,6 +1393,12 @@ public static void triggerManuallyPestsDestroyer() { ) public static boolean pestFarming = false; + @Switch( + name = "Hold Daedalus Axe", category = PEST_FARMER, + description = "Farms with daedalus axe while waiting for pests to spawn" + ) + public static boolean pestFarmingHoldDaedalus = false; + @Slider( name = "Farming Armor Slot", category = PEST_FARMER, min = 1, max = 18 @@ -1409,16 +1419,40 @@ public static void triggerManuallyPestsDestroyer() { public static int pestFarmingWaitTime = 255; @Info( - text = "Use this Auto-Pet Rule: 1. On Equip Farming Armor -> Farming Pet | 2. On Equip Pest Chance Armor -> Slug Pet | 3. On Enter Combat -> Hedgehog Pet", - type = InfoType.INFO, category = PEST_FARMER + text = "It's supposed to swap armor before pest spawns, swap back after pest spawns and kill with Pest Destryoer/the other one.", + type = InfoType.INFO, category = PEST_FARMER, size = 2 + ) + public static boolean ignored0; + @Info( + text = "Use this Auto-Pet Rule:", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored2; - @Info( - text = "Use Armor Swapper in Pest Destroyer. Swap to Farming Armor On Start Just in case Pest Farmer doesn't do that itself.", - type = InfoType.INFO, category = PEST_FARMER + text = " 1. On Gain Crop Collection -> Farming Pet, Except if slug is Equipped", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored3; + @Info( + text = " 2. On Equip Farming Armor -> Farming Pet", + type = InfoType.INFO, category = PEST_FARMER, size = 2 + ) + public static boolean ignored4; + @Info( + text = " 3. On Equip Pest Chance Armor -> Slug Pet", + type = InfoType.INFO, category = PEST_FARMER, size = 2 + ) + public static boolean ignored5; + @Info( + text = " 4. On Enter Combat -> Hedgehog Pet", + type = InfoType.INFO, category = PEST_FARMER, size = 2 + ) + public static boolean ignored6; + @Info( + text = "Use Armor Swapper in Pest Destroyer. Swap to Farming Armor On Start Just in case Pest Farmer doesn't do that itself.", + type = InfoType.INFO, category = PEST_FARMER, size = 2 + ) + public static boolean ignored7; // // diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java index 3a9cdd601..803238212 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java @@ -8,7 +8,6 @@ import com.jelly.farmhelperv2.util.LogUtils; import com.jelly.farmhelperv2.util.PlayerUtils; import com.jelly.farmhelperv2.util.helper.Clock; -import kotlinx.serialization.descriptors.PolymorphicKind.OPEN; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiChest; import net.minecraft.inventory.ContainerChest; @@ -21,7 +20,8 @@ public class AutoWardrobe implements IFeature { public static AutoWardrobe instance = new AutoWardrobe(); - private static final Minecraft mc = Minecraft.getMinecraft(); + public static int activeSlot = -1; + private final Minecraft mc = Minecraft.getMinecraft(); private boolean enabled = false; private int swapTo = -1; private State state = State.STARTING; @@ -49,7 +49,7 @@ public boolean shouldStartAtMacroStart() { @Override public void resetStatesAfterMacroDisabled() { - + activeSlot = -1; } @Override @@ -122,7 +122,7 @@ public void onTick(ClientTickEvent event) { case WD_VERIFY: if (hasTimerEnded()) { LogUtils.sendError("Could not open wardrobe in under 2 seconds. Stopping"); - setState(State.ENDING, 0); + setState(State.WAITING, 0); return; } @@ -144,7 +144,7 @@ public void onTick(ClientTickEvent event) { case NAVIGATION_VERIFY: if (hasTimerEnded()) { LogUtils.sendError("Could not switch to next page in under 2 seconds. Stopping"); - setState(State.ENDING, 0); + setState(State.WAITING, 0); return; } @@ -165,13 +165,19 @@ public void onTick(ClientTickEvent event) { InventoryUtils.clickContainerSlot(35 + (swapTo - 1) % 9 + 1, ClickType.LEFT, ClickMode.PICKUP); } } - setState(State.ENDING, FarmHelperConfig.getRandomGUIMacroDelay()); + activeSlot = swapTo; + setState(State.WAITING, FarmHelperConfig.getRandomGUIMacroDelay()); break; - case ENDING: + case WAITING: if (isTimerRunning()) { return; } PlayerUtils.closeScreen(); + setState(State.ENDING, FarmHelperConfig.getRandomGUIMacroDelay()); + break; + // this is just here to give a bit extra pause before it stops + case ENDING: + if (isTimerRunning()) return; stop(); break; } @@ -195,6 +201,6 @@ private String inventoryName() { enum State { - STARTING, OPENING_WD, WD_VERIFY, NAVIGATING, NAVIGATION_VERIFY, CLICKING_SLOT, ENDING + STARTING, OPENING_WD, WD_VERIFY, NAVIGATING, NAVIGATION_VERIFY, CLICKING_SLOT, WAITING, ENDING } } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index 8e266f107..721d897d1 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -1,12 +1,16 @@ package com.jelly.farmhelperv2.feature.impl; +import com.jelly.farmhelperv2.FarmHelper; import com.jelly.farmhelperv2.config.FarmHelperConfig; import com.jelly.farmhelperv2.failsafe.FailsafeManager; import com.jelly.farmhelperv2.feature.FeatureManager; import com.jelly.farmhelperv2.feature.IFeature; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.handler.MacroHandler; +import com.jelly.farmhelperv2.util.InventoryUtils; import com.jelly.farmhelperv2.util.LogUtils; +import java.util.ArrayList; +import java.util.List; import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -16,12 +20,12 @@ public class PestFarmer implements IFeature { public static PestFarmer instance = new PestFarmer(); - private final Minecraft mc = Minecraft.getMinecraft(); private boolean enabled = false; private long pestSpawnTime = 0L; - private int swapTo = 1; // 0 = fermento, 1 = biohazard + private int swapTo = -1; private State state = State.SWAPPING; private boolean pestSpawned = false; + private boolean holdDae = false; @Override public String getName() { @@ -47,6 +51,7 @@ public boolean shouldStartAtMacroStart() { public void resetStatesAfterMacroDisabled() { state = State.SWAPPING; pestSpawned = false; + holdDae = false; swapTo = -1; } @@ -82,6 +87,10 @@ public void stop() { } } + public boolean holdDaedalus() { + return holdDae && FarmHelperConfig.pestFarming && FarmHelperConfig.pestFarmingHoldDaedalus && AutoWardrobe.activeSlot == FarmHelperConfig.pestFarmingSet1Slot && InventoryUtils.holdItem("Daedalus Axe"); + } + @SubscribeEvent public void onTick(ClientTickEvent event) { if (event.phase != Phase.START) { @@ -108,12 +117,16 @@ public void onTick(ClientTickEvent event) { if (pestSpawned) { long timeDiff = System.currentTimeMillis() - pestSpawnTime; - if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L && swapTo != 1) { - swapTo = 1; - start(); + if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L && AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet1Slot) { + LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet1Slot); + swapTo = FarmHelperConfig.pestFarmingSet1Slot; pestSpawned = false; - } else if(swapTo != 0) { - swapTo = 0; + holdDae = true; + start(); + } else if (AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet0Slot) { + LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet0Slot); + swapTo = FarmHelperConfig.pestFarmingSet0Slot; + holdDae = false; start(); } } @@ -140,7 +153,7 @@ public void onTickSwap(ClientTickEvent event) { switch (state) { case SWAPPING: - AutoWardrobe.instance.swapTo(swapTo == 0 ? FarmHelperConfig.pestFarmingSet0Slot : FarmHelperConfig.pestFarmingSet1Slot); + AutoWardrobe.instance.swapTo(swapTo); state = State.ENDING; break; case ENDING: diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java index 21dfbe9a2..962dcf03b 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java @@ -497,7 +497,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { if (finishing) { currentSlot = FarmHelperConfig.pestArmorSlot1; } - AutoWardrobe.instance.swapTo(currentSlot); + if (AutoWardrobe.activeSlot != currentSlot) { + AutoWardrobe.instance.swapTo(currentSlot); + } } state = States.ARMOR_SWAP_VERIFY; break; diff --git a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java index 879dbebde..d03d89cc2 100644 --- a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java @@ -7,6 +7,8 @@ import com.jelly.farmhelperv2.feature.FeatureManager; import com.jelly.farmhelperv2.feature.impl.DesyncChecker; import com.jelly.farmhelperv2.feature.impl.LagDetector; +import com.jelly.farmhelperv2.feature.impl.PestFarmer; +import com.jelly.farmhelperv2.feature.impl.PestsDestroyer; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.handler.MacroHandler; import com.jelly.farmhelperv2.handler.RotationHandler; @@ -147,6 +149,13 @@ public void onTick() { } checkOnSpawnClock.schedule(5000); } + + if (FarmHelperConfig.pestForceEnable && PestsDestroyer.getInstance().canEnableMacro()) { + PestsDestroyer.getInstance().start(); + LogUtils.sendDebug("Activating Pests Destroyer"); + return; + } + if (mc.thePlayer.getPosition().getY() < 0) { LogUtils.sendError("Build a wall between the rewarp point and the void to prevent falling out of the garden! Disabling the macro..."); MacroHandler.getInstance().disableMacro(); @@ -226,7 +235,9 @@ public void onTick() { return; } - PlayerUtils.getTool(); + if (!PestFarmer.instance.holdDaedalus()) { + PlayerUtils.getTool(); + } // Update or invoke state, based on if player is moving or not if (GameStateHandler.getInstance().canChangeDirection()) { diff --git a/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java b/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java index e54eec0f5..7745d10b4 100644 --- a/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java +++ b/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java @@ -4,12 +4,14 @@ import com.jelly.farmhelperv2.feature.impl.BanInfoWS; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.handler.MacroHandler; +import com.jelly.farmhelperv2.util.LogUtils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.multiplayer.PlayerControllerMP; +import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.settings.GameSettings; import net.minecraft.entity.Entity; @@ -51,6 +53,8 @@ public class MixinMinecraft { @Shadow public EntityPlayerSP thePlayer; + @Shadow private ServerData currentServerData; + @Inject(method = "sendClickBlockToController", at = @At("RETURN")) private void sendClickBlockToController(CallbackInfo ci) { if (!FarmHelperConfig.fastBreak || !(MacroHandler.getInstance().getCurrentMacro().isPresent() && MacroHandler.getInstance().isMacroToggled())) { @@ -115,6 +119,7 @@ private void sendClickBlockToController(CallbackInfo ci) { @Redirect(method = "setIngameFocus", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/Display;isActive()Z")) public boolean isActive() { + System.out.println("Trying to set in game focus. Macro Toggled: " + MacroHandler.getInstance().isMacroToggled()); if (MacroHandler.getInstance().isMacroToggled()) { return true; } From 96489440e8d3e4b1cbbdecdd3ae8cfb0bfeb3801 Mon Sep 17 00:00:00 2001 From: Osama Date: Mon, 2 Dec 2024 18:22:42 +0600 Subject: [PATCH 04/19] Fixed Spacing --- .../farmhelperv2/config/FarmHelperConfig.java | 112 +++--- .../feature/impl/AutoWardrobe.java | 324 +++++++++--------- .../farmhelperv2/feature/impl/PestFarmer.java | 262 +++++++------- .../mixin/client/MixinMinecraft.java | 2 - 4 files changed, 352 insertions(+), 348 deletions(-) diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index b69d244b5..04743128f 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -43,6 +43,7 @@ // THIS IS RAT - CatalizCS @SuppressWarnings({"unused", "DefaultAnnotationParam"}) public class FarmHelperConfig extends Config { + private transient static final Minecraft mc = Minecraft.getMinecraft(); private transient static final String GENERAL = "General"; private transient static final String MISCELLANEOUS = "Miscellaneous"; @@ -803,26 +804,26 @@ public class FarmHelperConfig extends Config { ) public static boolean openInventoryOnSchedulerBreaks = true; @Switch( - name = "Disconnect during break", category = SCHEDULER, subcategory = "Scheduler", - description = "Logs out of game and logs back in after break ends" + name = "Disconnect during break", category = SCHEDULER, subcategory = "Scheduler", + description = "Logs out of game and logs back in after break ends" ) public static boolean schedulerDisconnectDuringBreak = false; @Switch( - name = "Wait Until Rewarp Point for break", category = SCHEDULER, subcategory = "Scheduler", - description = "Waits until player is standing on rewarp point to take break" + name = "Wait Until Rewarp Point for break", category = SCHEDULER, subcategory = "Scheduler", + description = "Waits until player is standing on rewarp point to take break" ) public static boolean schedulerWaitUntilRewarp = false; @Switch( - name = "Reset Scheduler on Macro Disabled", category = SCHEDULER, subcategory = "Scheduler", - description = "Resets Scheduler When macro is disabled" + name = "Reset Scheduler on Macro Disabled", category = SCHEDULER, subcategory = "Scheduler", + description = "Resets Scheduler When macro is disabled" ) public static boolean schedulerResetOnDisable = true; @Button( - name = "Reset Scheduler", category = SCHEDULER, subcategory = "Scheduler", - text = "Reset Scheduler", description = "Resets Scheduler (Only works when macro is of)" + name = "Reset Scheduler", category = SCHEDULER, subcategory = "Scheduler", + text = "Reset Scheduler", description = "Resets Scheduler (Only works when macro is of)" ) public Runnable schedulerReset = () -> { - if(!MacroHandler.getInstance().isMacroToggled()){ + if (!MacroHandler.getInstance().isMacroToggled()) { boolean old = FarmHelperConfig.schedulerResetOnDisable; FarmHelperConfig.schedulerResetOnDisable = true; Scheduler.getInstance().stop(); @@ -1198,7 +1199,7 @@ public class FarmHelperConfig extends Config { public static int pestAdditionalGUIDelay = 0; @Switch( - name = "Force Enable Pest Destroyer at X Pests", category = PESTS_DESTROYER, subcategory = "Pests Destroyer" + name = "Force Enable Pest Destroyer at X Pests", category = PESTS_DESTROYER, subcategory = "Pests Destroyer" ) public static boolean pestForceEnable = false; @@ -1300,26 +1301,26 @@ public static void triggerManuallyPestsDestroyer() { // @Switch( - name = "Swap Armor Before Killing", category = PESTS_DESTROYER, subcategory = "Armor Swapper" + name = "Swap Armor Before Killing", category = PESTS_DESTROYER, subcategory = "Armor Swapper" ) public static boolean pestSwapArmorBefore = false; @Slider( - name = "Wardrobe Slot To Kill With", category = PESTS_DESTROYER, subcategory = "Armor Swapper", - description = "Wardrobe slot to use before turning on pest destroyer", - min = 1, max = 18 + name = "Wardrobe Slot To Kill With", category = PESTS_DESTROYER, subcategory = "Armor Swapper", + description = "Wardrobe slot to use before turning on pest destroyer", + min = 1, max = 18 ) public static int pestArmorSlot0 = 1; @Switch( - name = "Swap Armor After Killing", category = PESTS_DESTROYER, subcategory = "Armor Swapper" + name = "Swap Armor After Killing", category = PESTS_DESTROYER, subcategory = "Armor Swapper" ) public static boolean pestSwapArmorAfter = false; @Slider( - name = "Wardrobe Slot To Farm With", category = PESTS_DESTROYER, subcategory = "Armor Swapper", - description = "Wardrobe slot to equip after turning off pest destroyer", - min = 1, max = 18 + name = "Wardrobe Slot To Farm With", category = PESTS_DESTROYER, subcategory = "Armor Swapper", + description = "Wardrobe slot to equip after turning off pest destroyer", + min = 1, max = 18 ) public static int pestArmorSlot1 = 1; // @@ -1382,75 +1383,75 @@ public static void triggerManuallyPestsDestroyer() { // @Header( - text = "Read the comments below this page before using pest farmer.", - category = PEST_FARMER, size = 2 + text = "Read the comments below this page before using pest farmer.", + category = PEST_FARMER, size = 2 ) public static boolean ignored1; @Switch( - name = "Enable Pest Farming", category = PEST_FARMER, - description = "Enables Pest Farming" + name = "Enable Pest Farming", category = PEST_FARMER, + description = "Enables Pest Farming" ) public static boolean pestFarming = false; @Switch( - name = "Hold Daedalus Axe", category = PEST_FARMER, - description = "Farms with daedalus axe while waiting for pests to spawn" + name = "Hold Daedalus Axe", category = PEST_FARMER, + description = "Farms with daedalus axe while waiting for pests to spawn" ) public static boolean pestFarmingHoldDaedalus = false; @Slider( - name = "Farming Armor Slot", category = PEST_FARMER, - min = 1, max = 18 + name = "Farming Armor Slot", category = PEST_FARMER, + min = 1, max = 18 ) public static int pestFarmingSet0Slot = 1; @Slider( - name = "Pest Chance Armor Slot", category = PEST_FARMER, - min = 1, max = 18 + name = "Pest Chance Armor Slot", category = PEST_FARMER, + min = 1, max = 18 ) public static int pestFarmingSet1Slot = 1; @Slider( - name = "Pest Spawn Timer (In seconds)", category = PEST_FARMER, - description = "The time it should wait after pests spawn to swap slots (should be your pest spawn time - 5/10 seconds)", - min = 30, max = 300 + name = "Pest Spawn Timer (In seconds)", category = PEST_FARMER, + description = "The time it should wait after pests spawn to swap slots (should be your pest spawn time - 5/10 seconds)", + min = 30, max = 300 ) public static int pestFarmingWaitTime = 255; @Info( - text = "It's supposed to swap armor before pest spawns, swap back after pest spawns and kill with Pest Destryoer/the other one.", - type = InfoType.INFO, category = PEST_FARMER, size = 2 + text = "It's supposed to swap armor before pest spawns, swap back after pest spawns and kill with Pest Destryoer/the other one.", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored0; @Info( - text = "Use this Auto-Pet Rule:", - type = InfoType.INFO, category = PEST_FARMER, size = 2 + text = "Use this Auto-Pet Rule:", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored2; @Info( - text = " 1. On Gain Crop Collection -> Farming Pet, Except if slug is Equipped", - type = InfoType.INFO, category = PEST_FARMER, size = 2 + text = " 1. On Gain Crop Collection -> Farming Pet, Except if slug is Equipped", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored3; @Info( - text = " 2. On Equip Farming Armor -> Farming Pet", - type = InfoType.INFO, category = PEST_FARMER, size = 2 + text = " 2. On Equip Farming Armor -> Farming Pet", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored4; @Info( - text = " 3. On Equip Pest Chance Armor -> Slug Pet", - type = InfoType.INFO, category = PEST_FARMER, size = 2 + text = " 3. On Equip Pest Chance Armor -> Slug Pet", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored5; @Info( - text = " 4. On Enter Combat -> Hedgehog Pet", - type = InfoType.INFO, category = PEST_FARMER, size = 2 + text = " 4. On Enter Combat -> Hedgehog Pet", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored6; @Info( - text = "Use Armor Swapper in Pest Destroyer. Swap to Farming Armor On Start Just in case Pest Farmer doesn't do that itself.", - type = InfoType.INFO, category = PEST_FARMER, size = 2 + text = "Use Armor Swapper in Pest Destroyer. Swap to Farming Armor On Start Just in case Pest Farmer doesn't do that itself.", + type = InfoType.INFO, category = PEST_FARMER, size = 2 ) public static boolean ignored7; @@ -2078,7 +2079,7 @@ public static void triggerManuallyAutoPestExchange() { name = "Reset stats between disabling", category = HUD, subcategory = "Profit Calculator" ) public static boolean resetStatsBetweenDisabling = false; -// @Button( + // @Button( // name = "Reset Profit Calculator", category = HUD, subcategory = "Profit Calculator", // text = "Reset Now", size = 2 // ) @@ -2113,7 +2114,6 @@ public static void triggerManuallyAutoPestExchange() { ) public static boolean debugMode = false; - // // @@ -2194,7 +2194,6 @@ public static void triggerManuallyAutoPestExchange() { ) public static boolean showDebugLogsAboutPDOTT = false; - // @Number(name = "Config Version", category = EXPERIMENTAL, subcategory = "Experimental", min = 0, max = 1337) @@ -2287,8 +2286,8 @@ public FarmHelperConfig() { this.addDependency("sprintWhileFlying", "enablePestsDestroyer"); this.addDependency("pausePestsDestroyerDuringJacobsContest", "enablePestsDestroyer"); - - this.hideIf("infoCookieBuffRequired", () -> GameStateHandler.getInstance().inGarden() || GameStateHandler.getInstance().getCookieBuffState() == BuffState.NOT_ACTIVE); + this.hideIf("infoCookieBuffRequired", + () -> GameStateHandler.getInstance().inGarden() || GameStateHandler.getInstance().getCookieBuffState() == BuffState.NOT_ACTIVE); this.addDependency("sendLogs", "enableWebHook"); this.addDependency("sendStatusUpdates", "enableWebHook"); @@ -2299,9 +2298,9 @@ public FarmHelperConfig() { this.addDependency("discordRemoteControlAddress", "enableRemoteControl"); this.addDependency("remoteControlPort", "enableRemoteControl"); - this.hideIf("infoRemoteControl", () -> Loader.isModLoaded("farmhelperjdadependency")); - this.hideIf("info2RemoteControl", () -> !Loader.isModLoaded("farmhelperjdadependency") || (Loader.isModLoaded("farmhelperjdadependency") && FarmHelper.isJDAVersionCorrect)); + this.hideIf("info2RemoteControl", () -> !Loader.isModLoaded("farmhelperjdadependency") || (Loader.isModLoaded("farmhelperjdadependency") + && FarmHelper.isJDAVersionCorrect)); this.hideIf("failsafeSoundTimes", () -> true); this.addDependency("debugMode", "Streamer Mode", () -> !streamerMode); @@ -2446,8 +2445,9 @@ public static void removeAllRewarps() { public static void saveRewarpConfig() { try { - if (!configRewarpFile.exists()) + if (!configRewarpFile.exists()) { Files.createFile(configRewarpFile.toPath()); + } Files.write(configRewarpFile.toPath(), FarmHelper.gson.toJson(rewarpList).getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { @@ -2460,8 +2460,9 @@ public static MacroEnum getMacro() { } public static long getRandomTimeBetweenChangingRows() { - if (customRowChangeDelaysDuringJacob && GameStateHandler.getInstance().inJacobContest()) + if (customRowChangeDelaysDuringJacob && GameStateHandler.getInstance().inJacobContest()) { return (long) (timeBetweenChangingRowsDuringJacob + (float) Math.random() * randomTimeBetweenChangingRowsDuringJacob); + } return (long) (timeBetweenChangingRows + (float) Math.random() * randomTimeBetweenChangingRows); } @@ -2470,8 +2471,9 @@ public static long getMaxTimeBetweenChangingRows() { } public static long getRandomRotationTime() { - if (customRotationDelaysDuringJacob && GameStateHandler.getInstance().inJacobContest()) + if (customRotationDelaysDuringJacob && GameStateHandler.getInstance().inJacobContest()) { return (long) (rotationTimeDuringJacob + (float) Math.random() * rotationTimeRandomnessDuringJacob); + } return (long) (rotationTime + (float) Math.random() * rotationTimeRandomness); } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java index 803238212..cdcb7de12 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java @@ -19,188 +19,190 @@ public class AutoWardrobe implements IFeature { - public static AutoWardrobe instance = new AutoWardrobe(); - public static int activeSlot = -1; - private final Minecraft mc = Minecraft.getMinecraft(); - private boolean enabled = false; - private int swapTo = -1; - private State state = State.STARTING; - private Clock timer = new Clock(); - - @Override - public String getName() { - return "AutoWardrobe"; - } - - @Override - public boolean isRunning() { - return enabled; - } - - @Override - public boolean shouldPauseMacroExecution() { - return true; - } - - @Override - public boolean shouldStartAtMacroStart() { - return false; - } - - @Override - public void resetStatesAfterMacroDisabled() { - activeSlot = -1; - } - - @Override - public boolean isToggled() { - return true; - } - - @Override - public boolean shouldCheckForFailsafes() { - return false; - } - - public void swapTo(int slot) { - if (slot < 1 || slot > 18) { - return; + public static AutoWardrobe instance = new AutoWardrobe(); + public static int activeSlot = -1; + private final Minecraft mc = Minecraft.getMinecraft(); + private boolean enabled = false; + private int swapTo = -1; + private State state = State.STARTING; + private Clock timer = new Clock(); + + @Override + public String getName() { + return "AutoWardrobe"; } - swapTo = slot; - enabled = true; - LogUtils.sendSuccess("[AutoWardrobe] Starting. Swapping to slot " + slot); - } + @Override + public boolean isRunning() { + return enabled; + } - @Override - public void stop() { - if (!enabled) { - return; + @Override + public boolean shouldPauseMacroExecution() { + return true; } - enabled = false; - swapTo = -1; - state = State.STARTING; - timer.reset(); - - LogUtils.sendSuccess("[AutoWardrobe] Stopping."); - } - - public void setState(State state, long time) { - this.state = state; - timer.schedule(time); - if (time == 0) { - timer.reset(); + + @Override + public boolean shouldStartAtMacroStart() { + return false; } - } - public boolean isTimerRunning() { - return timer.isScheduled() && !timer.passed(); - } + @Override + public void resetStatesAfterMacroDisabled() { + activeSlot = -1; + } - public boolean hasTimerEnded() { - return !timer.isScheduled() || timer.passed(); - } + @Override + public boolean isToggled() { + return true; + } - @SubscribeEvent - public void onTick(ClientTickEvent event) { - if (!enabled) { - return; + @Override + public boolean shouldCheckForFailsafes() { + return false; } - switch (state) { - case STARTING: - setState(State.OPENING_WD, FarmHelperConfig.getRandomGUIMacroDelay()); - break; - case OPENING_WD: - if (isTimerRunning()) { - return; + public void swapTo(int slot) { + if (slot < 1 || slot > 18) { + return; } - mc.thePlayer.sendChatMessage("/wd"); - setState(State.WD_VERIFY, 2000); - break; - case WD_VERIFY: - if (hasTimerEnded()) { - LogUtils.sendError("Could not open wardrobe in under 2 seconds. Stopping"); - setState(State.WAITING, 0); - return; - } + swapTo = slot; + enabled = true; + LogUtils.sendSuccess("[AutoWardrobe] Starting. Swapping to slot " + slot); + } - if (inventoryName().startsWith("Wardrobe")) { - setState(State.NAVIGATING, FarmHelperConfig.getRandomGUIMacroDelay()); - } - break; - case NAVIGATING: - if (isTimerRunning()) { - return; - } - if (swapTo < 9) { - setState(State.CLICKING_SLOT, 0); - return; - } - InventoryUtils.clickContainerSlot(InventoryUtils.getSlotIdOfItemInContainer("Next Page"), ClickType.LEFT, ClickMode.PICKUP); - setState(State.NAVIGATION_VERIFY, 2000); - break; - case NAVIGATION_VERIFY: - if (hasTimerEnded()) { - LogUtils.sendError("Could not switch to next page in under 2 seconds. Stopping"); - setState(State.WAITING, 0); - return; + @Override + public void stop() { + if (!enabled) { + return; } + enabled = false; + swapTo = -1; + state = State.STARTING; + timer.reset(); - if (inventoryName().endsWith("2)")) { - setState(State.CLICKING_SLOT, FarmHelperConfig.getRandomGUIMacroDelay()); - } - break; - case CLICKING_SLOT: - if (isTimerRunning()) { - return; + LogUtils.sendSuccess("[AutoWardrobe] Stopping."); + } + + public void setState(State state, long time) { + this.state = state; + timer.schedule(time); + if (time == 0) { + timer.reset(); } - int slotId = 35 + (swapTo - 1) % 9 + 1; - Slot slot = InventoryUtils.getSlotOfIdInContainer(slotId); - if (slot != null && slot.getHasStack()) { - ItemStack stack = slot.getStack(); - // remove this to make it unequip armor (click the same slot) - if (stack.hasDisplayName() && !stack.getDisplayName().contains("Equipped") && !stack.getDisplayName().contains("Locked")) { - InventoryUtils.clickContainerSlot(35 + (swapTo - 1) % 9 + 1, ClickType.LEFT, ClickMode.PICKUP); - } + } + + public boolean isTimerRunning() { + return timer.isScheduled() && !timer.passed(); + } + + public boolean hasTimerEnded() { + return !timer.isScheduled() || timer.passed(); + } + + @SubscribeEvent + public void onTick(ClientTickEvent event) { + if (!enabled) { + return; } - activeSlot = swapTo; - setState(State.WAITING, FarmHelperConfig.getRandomGUIMacroDelay()); - break; - case WAITING: - if (isTimerRunning()) { - return; + + switch (state) { + case STARTING: + setState(State.OPENING_WD, FarmHelperConfig.getRandomGUIMacroDelay()); + break; + case OPENING_WD: + if (isTimerRunning()) { + return; + } + + mc.thePlayer.sendChatMessage("/wd"); + setState(State.WD_VERIFY, 2000); + break; + case WD_VERIFY: + if (hasTimerEnded()) { + LogUtils.sendError("Could not open wardrobe in under 2 seconds. Stopping"); + setState(State.WAITING, 0); + return; + } + + if (inventoryName().startsWith("Wardrobe")) { + setState(State.NAVIGATING, FarmHelperConfig.getRandomGUIMacroDelay()); + } + break; + case NAVIGATING: + if (isTimerRunning()) { + return; + } + if (swapTo < 9) { + setState(State.CLICKING_SLOT, 0); + return; + } + InventoryUtils.clickContainerSlot(InventoryUtils.getSlotIdOfItemInContainer("Next Page"), ClickType.LEFT, ClickMode.PICKUP); + setState(State.NAVIGATION_VERIFY, 2000); + break; + case NAVIGATION_VERIFY: + if (hasTimerEnded()) { + LogUtils.sendError("Could not switch to next page in under 2 seconds. Stopping"); + setState(State.WAITING, 0); + return; + } + + if (inventoryName().endsWith("2)")) { + setState(State.CLICKING_SLOT, FarmHelperConfig.getRandomGUIMacroDelay()); + } + break; + case CLICKING_SLOT: + if (isTimerRunning()) { + return; + } + int slotId = 35 + (swapTo - 1) % 9 + 1; + Slot slot = InventoryUtils.getSlotOfIdInContainer(slotId); + if (slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + // remove this to make it unequip armor (click the same slot) + if (stack.hasDisplayName() && !stack.getDisplayName().contains("Equipped") && !stack.getDisplayName().contains("Locked")) { + InventoryUtils.clickContainerSlot(35 + (swapTo - 1) % 9 + 1, ClickType.LEFT, ClickMode.PICKUP); + } + } + activeSlot = swapTo; + setState(State.WAITING, FarmHelperConfig.getRandomGUIMacroDelay()); + break; + case WAITING: + if (isTimerRunning()) { + return; + } + PlayerUtils.closeScreen(); + setState(State.ENDING, FarmHelperConfig.getRandomGUIMacroDelay()); + break; + // this is just here to give a bit extra pause before it stops + case ENDING: + if (isTimerRunning()) { + return; + } + stop(); + break; } - PlayerUtils.closeScreen(); - setState(State.ENDING, FarmHelperConfig.getRandomGUIMacroDelay()); - break; - // this is just here to give a bit extra pause before it stops - case ENDING: - if (isTimerRunning()) return; - stop(); - break; } - } - - private String inventoryName() { - try { - if (mc.currentScreen instanceof GuiChest) { - final ContainerChest chest = (ContainerChest) mc.thePlayer.openContainer; - if (chest == null) { - return ""; + + private String inventoryName() { + try { + if (mc.currentScreen instanceof GuiChest) { + final ContainerChest chest = (ContainerChest) mc.thePlayer.openContainer; + if (chest == null) { + return ""; + } + final IInventory inv = chest.getLowerChestInventory(); + return inv.hasCustomName() ? inv.getName() : ""; + } + return ""; + } catch (Exception e) { + return ""; } - final IInventory inv = chest.getLowerChestInventory(); - return inv.hasCustomName() ? inv.getName() : ""; - } - return ""; - } catch (Exception e) { - return ""; } - } - enum State { - STARTING, OPENING_WD, WD_VERIFY, NAVIGATING, NAVIGATION_VERIFY, CLICKING_SLOT, WAITING, ENDING - } + enum State { + STARTING, OPENING_WD, WD_VERIFY, NAVIGATING, NAVIGATION_VERIFY, CLICKING_SLOT, WAITING, ENDING + } } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index 721d897d1..688a751d3 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -19,155 +19,157 @@ public class PestFarmer implements IFeature { - public static PestFarmer instance = new PestFarmer(); - private boolean enabled = false; - private long pestSpawnTime = 0L; - private int swapTo = -1; - private State state = State.SWAPPING; - private boolean pestSpawned = false; - private boolean holdDae = false; - - @Override - public String getName() { - return "PestFarmer"; - } - - @Override - public boolean isRunning() { - return enabled; - } - - @Override - public boolean shouldPauseMacroExecution() { - return true; - } - - @Override - public boolean shouldStartAtMacroStart() { - return false; - } - - @Override - public void resetStatesAfterMacroDisabled() { - state = State.SWAPPING; - pestSpawned = false; - holdDae = false; - swapTo = -1; - } - - @Override - public boolean isToggled() { - return FarmHelperConfig.pestFarming; - } - - @Override - public boolean shouldCheckForFailsafes() { - return false; - } - - @Override - public void start() { - if (enabled) { - return; - } - MacroHandler.getInstance().pauseMacro(); - enabled = true; - } - - @Override - public void stop() { - if (!enabled) { - return; + public static PestFarmer instance = new PestFarmer(); + private boolean enabled = false; + private long pestSpawnTime = 0L; + private int swapTo = -1; + private State state = State.SWAPPING; + private boolean pestSpawned = false; + private boolean holdDae = false; + + @Override + public String getName() { + return "PestFarmer"; } - enabled = false; - state = State.SWAPPING; - if (MacroHandler.getInstance().isMacroToggled()) { - MacroHandler.getInstance().resumeMacro(); + @Override + public boolean isRunning() { + return enabled; } - } - - public boolean holdDaedalus() { - return holdDae && FarmHelperConfig.pestFarming && FarmHelperConfig.pestFarmingHoldDaedalus && AutoWardrobe.activeSlot == FarmHelperConfig.pestFarmingSet1Slot && InventoryUtils.holdItem("Daedalus Axe"); - } - @SubscribeEvent - public void onTick(ClientTickEvent event) { - if (event.phase != Phase.START) { - return; + @Override + public boolean shouldPauseMacroExecution() { + return true; } - if (!this.isToggled() || !MacroHandler.getInstance().isCurrentMacroEnabled() || MacroHandler.getInstance().getCurrentMacro().get().currentState.ordinal() < 4 || enabled) { - return; - } - if (!GameStateHandler.getInstance().inGarden()) { - return; + + @Override + public boolean shouldStartAtMacroStart() { + return false; } - if (GameStateHandler.getInstance().getServerClosingSeconds().isPresent()) { - return; + + @Override + public void resetStatesAfterMacroDisabled() { + state = State.SWAPPING; + pestSpawned = false; + holdDae = false; + swapTo = -1; } - if (!Scheduler.getInstance().isFarming()) { - return; + + @Override + public boolean isToggled() { + return FarmHelperConfig.pestFarming; } - if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { - return; + + @Override + public boolean shouldCheckForFailsafes() { + return false; } - if (FeatureManager.getInstance().isAnyOtherFeatureEnabled(this)) { - return; + + @Override + public void start() { + if (enabled) { + return; + } + MacroHandler.getInstance().pauseMacro(); + enabled = true; } - if (pestSpawned) { - long timeDiff = System.currentTimeMillis() - pestSpawnTime; - if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L && AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet1Slot) { - LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet1Slot); - swapTo = FarmHelperConfig.pestFarmingSet1Slot; - pestSpawned = false; - holdDae = true; - start(); - } else if (AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet0Slot) { - LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet0Slot); - swapTo = FarmHelperConfig.pestFarmingSet0Slot; - holdDae = false; - start(); - } + @Override + public void stop() { + if (!enabled) { + return; + } + + enabled = false; + state = State.SWAPPING; + if (MacroHandler.getInstance().isMacroToggled()) { + MacroHandler.getInstance().resumeMacro(); + } } - } - @SubscribeEvent - public void onChat(ClientChatReceivedEvent event) { - if (event.type != 0) { - return; + public boolean holdDaedalus() { + return holdDae && FarmHelperConfig.pestFarming && FarmHelperConfig.pestFarmingHoldDaedalus + && AutoWardrobe.activeSlot == FarmHelperConfig.pestFarmingSet1Slot && InventoryUtils.holdItem("Daedalus Axe"); } - String message = event.message.getUnformattedText(); - if (message.startsWith("§6§lYUCK!") || message.startsWith("§6§lEWW!") || message.startsWith("§6§lGROSS!")) { - pestSpawnTime = System.currentTimeMillis(); - pestSpawned = true; - LogUtils.sendDebug("[PestFarmer] Pest Spawned."); + + @SubscribeEvent + public void onTick(ClientTickEvent event) { + if (event.phase != Phase.START) { + return; + } + if (!this.isToggled() || !MacroHandler.getInstance().isCurrentMacroEnabled() + || MacroHandler.getInstance().getCurrentMacro().get().currentState.ordinal() < 4 || enabled) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (GameStateHandler.getInstance().getServerClosingSeconds().isPresent()) { + return; + } + if (!Scheduler.getInstance().isFarming()) { + return; + } + if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { + return; + } + if (FeatureManager.getInstance().isAnyOtherFeatureEnabled(this)) { + return; + } + + if (pestSpawned) { + long timeDiff = System.currentTimeMillis() - pestSpawnTime; + if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L && AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet1Slot) { + LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet1Slot); + swapTo = FarmHelperConfig.pestFarmingSet1Slot; + pestSpawned = false; + holdDae = true; + start(); + } else if (AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet0Slot) { + LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet0Slot); + swapTo = FarmHelperConfig.pestFarmingSet0Slot; + holdDae = false; + start(); + } + } } - } - @SubscribeEvent - public void onTickSwap(ClientTickEvent event) { - if (!enabled) { - return; + @SubscribeEvent + public void onChat(ClientChatReceivedEvent event) { + if (event.type != 0) { + return; + } + String message = event.message.getUnformattedText(); + if (message.startsWith("§6§lYUCK!") || message.startsWith("§6§lEWW!") || message.startsWith("§6§lGROSS!")) { + pestSpawnTime = System.currentTimeMillis(); + pestSpawned = true; + LogUtils.sendDebug("[PestFarmer] Pest Spawned."); + } } - switch (state) { - case SWAPPING: - AutoWardrobe.instance.swapTo(swapTo); - state = State.ENDING; - break; - case ENDING: - if (AutoWardrobe.instance.isRunning()) { - return; + @SubscribeEvent + public void onTickSwap(ClientTickEvent event) { + if (!enabled) { + return; + } + + switch (state) { + case SWAPPING: + AutoWardrobe.instance.swapTo(swapTo); + state = State.ENDING; + break; + case ENDING: + if (AutoWardrobe.instance.isRunning()) { + return; + } + stop(); + break; } - stop(); - break; } - } - // bleh, its only for the tracker basically - enum State { - SWAPPING, - ENDING - } + // bleh, its only for the tracker basically + enum State { + SWAPPING, + ENDING + } } diff --git a/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java b/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java index 7745d10b4..f5a425042 100644 --- a/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java +++ b/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java @@ -53,8 +53,6 @@ public class MixinMinecraft { @Shadow public EntityPlayerSP thePlayer; - @Shadow private ServerData currentServerData; - @Inject(method = "sendClickBlockToController", at = @At("RETURN")) private void sendClickBlockToController(CallbackInfo ci) { if (!FarmHelperConfig.fastBreak || !(MacroHandler.getInstance().getCurrentMacro().isPresent() && MacroHandler.getInstance().isMacroToggled())) { From 1c75b4414b2784a62a54c783ecf97159f4e3438e Mon Sep 17 00:00:00 2001 From: Osama Date: Mon, 2 Dec 2024 18:34:04 +0600 Subject: [PATCH 05/19] Shiz --- .../feature/impl/PestsDestroyer.java | 3050 +++++++++-------- 1 file changed, 1529 insertions(+), 1521 deletions(-) diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java index 962dcf03b..24b4030e7 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java @@ -49,1631 +49,1639 @@ public class PestsDestroyer implements IFeature { - private static PestsDestroyer instance; - private final Minecraft mc = Minecraft.getMinecraft(); - private final List> pests = Arrays.asList( - new Tuple<>("Beetle", - "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTc4OTkzNCwKICAicHJvZmlsZUlkIiA6ICJlMjc5NjliODYyNWY0NDg1YjkyNmM5NTBhMDljMWMwMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJLRVZJTktFTE9LRSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83MGExZTgzNmJmMTk2OGIyZWFhNDgzNzIyN2ExOTIwNGYxNzI5NWQ4NzBlZTllNzU0YmQ2YjZkNjBkZGJlZDNjIgogICAgfQogIH0KfQ"), - new Tuple<>("Cricket", - "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTgxMTI2NCwKICAicHJvZmlsZUlkIiA6ICJjZjc4YzFkZjE3ZTI0Y2Q5YTIxYmU4NWQ0NDk5ZWE4ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNYXR0c0FybW9yU3RhbmRzIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2EyNGM2OWY5NmNlNTU2MjIxZTE5NWM4ZWYyYmZhZDcxZWJmN2Y5NWY1YWU5MTRhNDg0YThkMGVjMjE2NzI2NzQiCiAgICB9CiAgfQp9"), - new Tuple<>("Earthworm", - "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ1OTc0NywKICAicHJvZmlsZUlkIiA6ICIyNTBlNzc5MjZkNDM0ZDIyYWM2MTQ4N2EyY2M3YzAwNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJMdW5hMTIxMDUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjQwM2JhNDAyN2EzMzNkOGQyZmQzMmFiNTlkMWNmZGJhYTdkOTA4ZDgwZDIzODFkYjJhNjljYmU2NTQ1MGFkOCIKICAgIH0KICB9Cn0"), - new Tuple<>("Fly", - "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTA2MzI4MSwKICAicHJvZmlsZUlkIiA6ICJjN2FmMWNkNjNiNTE0Y2YzOGY4NWQ2ZDUxNzhjYThlNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJtb25zdGVyZ2FtZXIzMTUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWQ5MGU3Nzc4MjZhNTI0NjEzNjhlMjZkMWIyZTE5YmZhMWJhNTgyZDYwMjQ4M2U1NDVmNDEyNGQwZjczMTg0MiIKICAgIH0KICB9Cn0"), - new Tuple<>("Locust", - "ewogICJ0aW1lc3RhbXAiIDogMTY5NzU1NzA3NzAzNywKICAicHJvZmlsZUlkIiA6ICI0YjJlMGM1ODliZjU0ZTk1OWM1ZmJlMzg5MjQ1MzQzZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJfTmVvdHJvbl8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGIyNGE0ODJhMzJkYjFlYTc4ZmI5ODA2MGIwYzJmYTRhMzczY2JkMThhNjhlZGRkZWI3NDE5NDU1YTU5Y2RhOSIKICAgIH0KICB9Cn0"), - new Tuple<>("Mite", - "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQxOTcyNSwKICAicHJvZmlsZUlkIiA6ICJkYjYzNWE3MWI4N2U0MzQ5YThhYTgwOTMwOWFhODA3NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJFbmdlbHMxNzQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmU2YmFmNjQzMWE5ZGFhMmNhNjA0ZDVhM2MyNmU5YTc2MWQ1OTUyZjA4MTcxNzRhNGZlMGI3NjQ2MTZlMjFmZiIKICAgIH0KICB9Cn0"), - new Tuple<>("Mosquito", - "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTAyOTQ2MSwKICAicHJvZmlsZUlkIiA6ICI3NTE0NDQ4MTkxZTY0NTQ2OGM5NzM5YTZlMzk1N2JlYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGFua3NNb2phbmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTJhOWZlMDViYzY2M2VmY2QxMmU1NmEzY2NjNWVjMDM1YmY1NzdiNzg3MDg1NDhiNmY0ZmZjZjFkMzBlY2NmZSIKICAgIH0KICB9Cn0"), - new Tuple<>("Moth", - "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQwNTk1NCwKICAicHJvZmlsZUlkIiA6ICJiMTUyZDlhZTE1MTM0OWNmOWM2NmI0Y2RjMTA5NTZjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaXNxdW90aCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82NTQ4NWM0YjM0ZTViNTQ3MGJlOTRkZTEwMGU2MWY3ODE2ZjgxYmM1YTExZGZkZjBlY2NmODkwMTcyZGE1ZDBhIgogICAgfQogIH0KfQ"), - new Tuple<>("Rat", - "ewogICJ0aW1lc3RhbXAiIDogMTYxODQxOTcwMTc1MywKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdUlJZXQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYThhYmI0NzFkYjBhYjc4NzAzMDExOTc5ZGM4YjQwNzk4YTk0MWYzYTRkZWMzZWM2MWNiZWVjMmFmOGNmZmU4IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0="), - new Tuple<>("Slug", - "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ0MzA4MiwKICAicHJvZmlsZUlkIiA6ICJkOGNkMTNjZGRmNGU0Y2IzODJmYWZiYWIwOGIyNzQ4OSIsCiAgInByb2ZpbGVOYW1lIiA6ICJaYWNoeVphY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E3OWQwZmQ2NzdiNTQ1MzA5NjExMTdlZjg0YWRjMjA2ZTJjYzUwNDVjMTM0NGQ2MWQ3NzZiZjhhYzJmZTFiYSIKICAgIH0KICB9Cn0") - ); - private Optional closestPlot = Optional.empty(); - @Getter - private final ArrayList pestsLocations = new ArrayList<>(); - private final List killedEntities = new ArrayList<>(); - @Getter - private final Clock stuckClock = new Clock(); - @Getter - private final Clock delayClock = new Clock(); - private final Clock delayBetweenBackTaps = new Clock(); - private final Clock delayBetweenFireworks = new Clock(); - @Getter - private Optional currentEntityTarget = Optional.empty(); - private boolean enabled = false; - private boolean preparing = false; - @Setter - @Getter - public int cantReachPest = 0; - @Getter - @Setter - private States state = States.IDLE; - @Getter - private EscapeState escapeState = EscapeState.NONE; - private Optional preTpBlockPos = Optional.empty(); - private long lastFireworkTime = 0; - private int getLocationTries = 0; - private int flyPathfinderTries = 0; - private RotationState rotationState = RotationState.NONE; - private boolean needToUpdatePlots = false; - private final HashMap vacuumRange = new HashMap() {{ - put("Skymart Vacuum", 5F); - put("Turbo Vacuum", 7.5F); - put("Hyper Vacuum", 10F); - put("InfiniVacuum™ Hooverius", 15F); - put("InfiniVacuum", 12.5F); - }}; - @Getter - private float currentVacuumRange = -1; - - private boolean gotRangeOfVacuum = false; - private boolean isPlotObstructed = false; - private long lastKillTimestamp = 0; - private int previousCurrentPlotPestsCount = 0; - private int currentSlot = -1; - private boolean finishing = false; - - private final List killedPestsFrom = new ArrayList<>(); - - public static PestsDestroyer getInstance() { - if (instance == null) { - instance = new PestsDestroyer(); - } - return instance; - } - - @Override - public String getName() { - return "Pests Destroyer"; - } - - @Override - public boolean isRunning() { - return enabled || preparing; - } - - @Override - public boolean shouldPauseMacroExecution() { - return true; - } - - @Override - public boolean shouldStartAtMacroStart() { - return false; - } - - @Override - public void start() { - if (enabled) { - return; - } - gotRangeOfVacuum = false; - isPlotObstructed = false; - preparing = true; - lastKillTimestamp = 0; - if (MacroHandler.getInstance().isMacroToggled()) { - MacroHandler.getInstance().pauseMacro(); - MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); - KeyBindUtils.stopMovement(); - } - escapeState = EscapeState.NONE; - rotationState = RotationState.NONE; - state = States.IDLE; - killedEntities.clear(); - killedPestsFrom.clear(); - Multithreading.schedule(() -> { - if (!preparing) { - return; - } - enabled = true; - preparing = false; - LogUtils.sendWarning("[Pests Destroyer] Starting killing shitters!"); - if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { - LogUtils.webhookLog("[Pests Destroyer]\\nStarting killing shitters!"); - } - }, MacroHandler.getInstance().isMacroToggled() ? (800 + (long) (Math.random() * 500)) : 0, TimeUnit.MILLISECONDS); - IFeature.super.start(); - } - - @Override - public void stop() { - if (enabled || preparing) { - LogUtils.sendWarning("[Pests Destroyer] Stopping!"); - if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { - LogUtils.webhookLog("[Pests Destroyer]\\nStopping!"); - } - if (GameStateHandler.getInstance().getPestsCount() == 0) { - pestsLocations.clear(); - } - } - PlayerUtils.closeScreen(); - currentEntityTarget = Optional.empty(); - resetFireworkInfo(); - preTpBlockPos = Optional.empty(); - delayBetweenBackTaps.reset(); - delayBetweenFireworks.reset(); - delayClock.reset(); - stuckClock.reset(); - preparing = false; - enabled = false; - isPlotObstructed = false; - lastFireworkTime = 0; - getLocationTries = 0; - flyPathfinderTries = 0; - state = States.IDLE; - FlyPathFinderExecutor.getInstance().stop(); - KeyBindUtils.stopMovement(); - finishing = false; - currentSlot = -1; - IFeature.super.stop(); - } - - @Override - public void resetStatesAfterMacroDisabled() { - stop(); - gotRangeOfVacuum = false; - if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { - return; - } - FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; - LogUtils.sendWarning("[Pests Destroyer] AFK Mode has been disabled"); - } - - @Override - public boolean isToggled() { - return FarmHelperConfig.enablePestsDestroyer; - } - - @Override - public boolean shouldCheckForFailsafes() { - return escapeState == EscapeState.NONE && - state != States.TELEPORT_TO_PLOT && - state != States.WAIT_FOR_TP && - state != States.CHECKING_PLOT && - state != States.CHECKING_SPAWN && - state != States.GET_LOCATION; - } - - @SubscribeEvent - public void onKeyInput(InputEvent.KeyInputEvent event) { - if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { - return; - } - if (Keyboard.getEventKeyState() && Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { - LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); - stop(); - FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; + private static PestsDestroyer instance; + private final Minecraft mc = Minecraft.getMinecraft(); + private final List> pests = Arrays.asList( + new Tuple<>("Beetle", + "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTc4OTkzNCwKICAicHJvZmlsZUlkIiA6ICJlMjc5NjliODYyNWY0NDg1YjkyNmM5NTBhMDljMWMwMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJLRVZJTktFTE9LRSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83MGExZTgzNmJmMTk2OGIyZWFhNDgzNzIyN2ExOTIwNGYxNzI5NWQ4NzBlZTllNzU0YmQ2YjZkNjBkZGJlZDNjIgogICAgfQogIH0KfQ"), + new Tuple<>("Cricket", + "ewogICJ0aW1lc3RhbXAiIDogMTcyMzE3OTgxMTI2NCwKICAicHJvZmlsZUlkIiA6ICJjZjc4YzFkZjE3ZTI0Y2Q5YTIxYmU4NWQ0NDk5ZWE4ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNYXR0c0FybW9yU3RhbmRzIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2EyNGM2OWY5NmNlNTU2MjIxZTE5NWM4ZWYyYmZhZDcxZWJmN2Y5NWY1YWU5MTRhNDg0YThkMGVjMjE2NzI2NzQiCiAgICB9CiAgfQp9"), + new Tuple<>("Earthworm", + "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ1OTc0NywKICAicHJvZmlsZUlkIiA6ICIyNTBlNzc5MjZkNDM0ZDIyYWM2MTQ4N2EyY2M3YzAwNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJMdW5hMTIxMDUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjQwM2JhNDAyN2EzMzNkOGQyZmQzMmFiNTlkMWNmZGJhYTdkOTA4ZDgwZDIzODFkYjJhNjljYmU2NTQ1MGFkOCIKICAgIH0KICB9Cn0"), + new Tuple<>("Fly", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTA2MzI4MSwKICAicHJvZmlsZUlkIiA6ICJjN2FmMWNkNjNiNTE0Y2YzOGY4NWQ2ZDUxNzhjYThlNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJtb25zdGVyZ2FtZXIzMTUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWQ5MGU3Nzc4MjZhNTI0NjEzNjhlMjZkMWIyZTE5YmZhMWJhNTgyZDYwMjQ4M2U1NDVmNDEyNGQwZjczMTg0MiIKICAgIH0KICB9Cn0"), + new Tuple<>("Locust", + "ewogICJ0aW1lc3RhbXAiIDogMTY5NzU1NzA3NzAzNywKICAicHJvZmlsZUlkIiA6ICI0YjJlMGM1ODliZjU0ZTk1OWM1ZmJlMzg5MjQ1MzQzZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJfTmVvdHJvbl8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGIyNGE0ODJhMzJkYjFlYTc4ZmI5ODA2MGIwYzJmYTRhMzczY2JkMThhNjhlZGRkZWI3NDE5NDU1YTU5Y2RhOSIKICAgIH0KICB9Cn0"), + new Tuple<>("Mite", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQxOTcyNSwKICAicHJvZmlsZUlkIiA6ICJkYjYzNWE3MWI4N2U0MzQ5YThhYTgwOTMwOWFhODA3NyIsCiAgInByb2ZpbGVOYW1lIiA6ICJFbmdlbHMxNzQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmU2YmFmNjQzMWE5ZGFhMmNhNjA0ZDVhM2MyNmU5YTc2MWQ1OTUyZjA4MTcxNzRhNGZlMGI3NjQ2MTZlMjFmZiIKICAgIH0KICB9Cn0"), + new Tuple<>("Mosquito", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njk0NTAyOTQ2MSwKICAicHJvZmlsZUlkIiA6ICI3NTE0NDQ4MTkxZTY0NTQ2OGM5NzM5YTZlMzk1N2JlYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGFua3NNb2phbmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTJhOWZlMDViYzY2M2VmY2QxMmU1NmEzY2NjNWVjMDM1YmY1NzdiNzg3MDg1NDhiNmY0ZmZjZjFkMzBlY2NmZSIKICAgIH0KICB9Cn0"), + new Tuple<>("Moth", + "ewogICJ0aW1lc3RhbXAiIDogMTY5Njg3MDQwNTk1NCwKICAicHJvZmlsZUlkIiA6ICJiMTUyZDlhZTE1MTM0OWNmOWM2NmI0Y2RjMTA5NTZjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaXNxdW90aCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82NTQ4NWM0YjM0ZTViNTQ3MGJlOTRkZTEwMGU2MWY3ODE2ZjgxYmM1YTExZGZkZjBlY2NmODkwMTcyZGE1ZDBhIgogICAgfQogIH0KfQ"), + new Tuple<>("Rat", + "ewogICJ0aW1lc3RhbXAiIDogMTYxODQxOTcwMTc1MywKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJCdUlJZXQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYThhYmI0NzFkYjBhYjc4NzAzMDExOTc5ZGM4YjQwNzk4YTk0MWYzYTRkZWMzZWM2MWNiZWVjMmFmOGNmZmU4IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0="), + new Tuple<>("Slug", + "ewogICJ0aW1lc3RhbXAiIDogMTY5NzQ3MDQ0MzA4MiwKICAicHJvZmlsZUlkIiA6ICJkOGNkMTNjZGRmNGU0Y2IzODJmYWZiYWIwOGIyNzQ4OSIsCiAgInByb2ZpbGVOYW1lIiA6ICJaYWNoeVphY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E3OWQwZmQ2NzdiNTQ1MzA5NjExMTdlZjg0YWRjMjA2ZTJjYzUwNDVjMTM0NGQ2MWQ3NzZiZjhhYzJmZTFiYSIKICAgIH0KICB9Cn0") + ); + private Optional closestPlot = Optional.empty(); + @Getter + private final ArrayList pestsLocations = new ArrayList<>(); + private final List killedEntities = new ArrayList<>(); + @Getter + private final Clock stuckClock = new Clock(); + @Getter + private final Clock delayClock = new Clock(); + private final Clock delayBetweenBackTaps = new Clock(); + private final Clock delayBetweenFireworks = new Clock(); + @Getter + private Optional currentEntityTarget = Optional.empty(); + private boolean enabled = false; + private boolean preparing = false; + @Setter + @Getter + public int cantReachPest = 0; + @Getter + @Setter + private States state = States.IDLE; + @Getter + private EscapeState escapeState = EscapeState.NONE; + private Optional preTpBlockPos = Optional.empty(); + private long lastFireworkTime = 0; + private int getLocationTries = 0; + private int flyPathfinderTries = 0; + private RotationState rotationState = RotationState.NONE; + private boolean needToUpdatePlots = false; + private final HashMap vacuumRange = new HashMap() {{ + put("Skymart Vacuum", 5F); + put("Turbo Vacuum", 7.5F); + put("Hyper Vacuum", 10F); + put("InfiniVacuum™ Hooverius", 15F); + put("InfiniVacuum", 12.5F); + }}; + @Getter + private float currentVacuumRange = -1; + + private boolean gotRangeOfVacuum = false; + private boolean isPlotObstructed = false; + private long lastKillTimestamp = 0; + private int previousCurrentPlotPestsCount = 0; + private int currentSlot = -1; + private boolean finishing = false; + + private final List killedPestsFrom = new ArrayList<>(); + + public static PestsDestroyer getInstance() { + if (instance == null) { + instance = new PestsDestroyer(); + } + return instance; + } + + @Override + public String getName() { + return "Pests Destroyer"; + } + + @Override + public boolean isRunning() { + return enabled || preparing; + } + + @Override + public boolean shouldPauseMacroExecution() { + return true; } - } - @SubscribeEvent - public void onTickAFKMode(TickEvent.ClientTickEvent event) { - if (event.phase == TickEvent.Phase.END) { - return; - } - if (mc.thePlayer == null || mc.theWorld == null) { - return; - } - if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { - return; - } - if (MacroHandler.getInstance().isMacroToggled()) { - return; - } - if (!isToggled()) { - return; - } - if (isRunning()) { - return; + @Override + public boolean shouldStartAtMacroStart() { + return false; } - if (canEnableMacro(true)) { - start(); + @Override + public void start() { + if (enabled) { + return; + } + gotRangeOfVacuum = false; + isPlotObstructed = false; + preparing = true; + lastKillTimestamp = 0; + if (MacroHandler.getInstance().isMacroToggled()) { + MacroHandler.getInstance().pauseMacro(); + MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); + KeyBindUtils.stopMovement(); + } + escapeState = EscapeState.NONE; + rotationState = RotationState.NONE; + state = States.IDLE; + killedEntities.clear(); + killedPestsFrom.clear(); + Multithreading.schedule(() -> { + if (!preparing) { + return; + } + enabled = true; + preparing = false; + LogUtils.sendWarning("[Pests Destroyer] Starting killing shitters!"); + if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { + LogUtils.webhookLog("[Pests Destroyer]\\nStarting killing shitters!"); + } + }, MacroHandler.getInstance().isMacroToggled() ? (800 + (long) (Math.random() * 500)) : 0, TimeUnit.MILLISECONDS); + IFeature.super.start(); } - } - public boolean canEnableMacro() { - return canEnableMacro(false); - } - - public boolean canEnableMacro(boolean manually) { - if (!isToggled()) { - return false; - } - if (isRunning()) { - return false; - } - if (!GameStateHandler.getInstance().inGarden()) { - return false; - } - if (!MacroHandler.getInstance().isMacroToggled() && !manually) { - return false; - } - if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) { - return false; - } - if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { - return false; - } - if (enabled || preparing) { - return false; - } - if (GameStateHandler.getInstance().getPestsCount() < FarmHelperConfig.startKillingPestsAt && !manually || (manually - && GameStateHandler.getInstance().getPestsCount() == 0)) { - return false; - } - if (!manually && FarmHelperConfig.pausePestsDestroyerDuringJacobsContest && GameStateHandler.getInstance().inJacobContest()) { - LogUtils.sendError("[Pests Destroyer] Pests Destroyer won't activate during Jacob's Contest!"); - return false; - } - if (!mc.thePlayer.capabilities.allowFlying) { - LogUtils.sendError("[Pests Destroyer] You need to be able to fly!"); - if (FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { - LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); - FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; - } - return false; + @Override + public void stop() { + if (enabled || preparing) { + LogUtils.sendWarning("[Pests Destroyer] Stopping!"); + if (FarmHelperConfig.sendWebhookLogWhenPestDestroyerStartsStops) { + LogUtils.webhookLog("[Pests Destroyer]\\nStopping!"); + } + if (GameStateHandler.getInstance().getPestsCount() == 0) { + pestsLocations.clear(); + } + } + PlayerUtils.closeScreen(); + currentEntityTarget = Optional.empty(); + resetFireworkInfo(); + preTpBlockPos = Optional.empty(); + delayBetweenBackTaps.reset(); + delayBetweenFireworks.reset(); + delayClock.reset(); + stuckClock.reset(); + preparing = false; + enabled = false; + isPlotObstructed = false; + lastFireworkTime = 0; + getLocationTries = 0; + flyPathfinderTries = 0; + state = States.IDLE; + FlyPathFinderExecutor.getInstance().stop(); + KeyBindUtils.stopMovement(); + finishing = false; + currentSlot = -1; + IFeature.super.stop(); } - return true; - } - @SubscribeEvent - public void onTickExecute(TickEvent.ClientTickEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) { - return; - } - if (mc.currentScreen == null && checkedThisGui) { - checkedThisGui = false; - } - if (!gotRangeOfVacuum && (isToggled() || PestsDestroyerOnTheTrack.getInstance().isToggled())) { - Slot vacuumSlot = InventoryUtils.getSlotOfItemInInventory("Vacuum"); - if (vacuumSlot != null) { - ItemStack vacuumItem = vacuumSlot.getStack(); - for (Map.Entry vacuumRange : this.vacuumRange.entrySet()) { - if (vacuumItem.getDisplayName().contains(vacuumRange.getKey())) { - currentVacuumRange = vacuumRange.getValue(); - gotRangeOfVacuum = true; - LogUtils.sendDebug("[Pests Destroyer] Found vacuum range: " + currentVacuumRange); - break; - } - } - } - } - if (!isToggled()) { - return; - } - if (event.phase != TickEvent.Phase.END) { - return; - } - if (!GameStateHandler.getInstance().inGarden() && escapeState == EscapeState.NONE) { - return; - } - if (!enabled) { - return; - } - if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) { - return; - } - if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { - stop(); - return; + @Override + public void resetStatesAfterMacroDisabled() { + stop(); + gotRangeOfVacuum = false; + if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + return; + } + FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; + LogUtils.sendWarning("[Pests Destroyer] AFK Mode has been disabled"); } - if (stuckClock.isScheduled() && stuckClock.passed()) { - LogUtils.sendWarning( - "[Pests Destroyer] The player is struggling killing pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport."); - LogUtils.sendFailsafeMessage("[Pests Destroyer] Couldn't kill pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport.", true); - escapeState = EscapeState.GO_TO_HUB; - KeyBindUtils.stopMovement(); - delayClock.schedule(300); - stuckClock.reset(); - return; + @Override + public boolean isToggled() { + return FarmHelperConfig.enablePestsDestroyer; } - if (delayClock.isScheduled() && !delayClock.passed()) { - return; + @Override + public boolean shouldCheckForFailsafes() { + return escapeState == EscapeState.NONE && + state != States.TELEPORT_TO_PLOT && + state != States.WAIT_FOR_TP && + state != States.CHECKING_PLOT && + state != States.CHECKING_SPAWN && + state != States.GET_LOCATION; } - LogUtils.sendDebug("[Pests Destroyer] State: " + state); - - if (escapeState != EscapeState.NONE) { - if (stuckClock.isScheduled()) { - stuckClock.reset(); - } - if (RotationHandler.getInstance().isRotating()) { - RotationHandler.getInstance().reset(); - } - KeyBindUtils.stopMovement(); - switch (escapeState) { - case GO_TO_HUB: - if (isInventoryOpen()) { - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { - escapeState = EscapeState.GO_TO_GARDEN; - delayClock.schedule((long) (5_500 + Math.random() * 3_500)); - break; - } - if (GameStateHandler.getInstance().inGarden()) { - mc.thePlayer.sendChatMessage("/hub"); - escapeState = EscapeState.GO_TO_GARDEN; - delayClock.schedule((long) (1_800 + Math.random() * 1_000)); - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { - escapeState = EscapeState.GO_TO_HUB; - mc.thePlayer.sendChatMessage("/skyblock"); - delayClock.schedule((long) (5_000 + Math.random() * 1_500)); - break; - } - break; - case GO_TO_GARDEN: - if (isInventoryOpen()) { - break; - } - if (GameStateHandler.getInstance().inGarden()) { - escapeState = EscapeState.GO_TO_HUB; - delayClock.schedule((long) (2_500 + Math.random() * 1_500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { - escapeState = EscapeState.RESUME_MACRO; - MacroHandler.getInstance().triggerWarpGarden(true, false); - delayClock.schedule((long) (2_500 + Math.random() * 1_500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { - escapeState = EscapeState.GO_TO_HUB; - mc.thePlayer.sendChatMessage("/skyblock"); - delayClock.schedule((long) (5_000 + Math.random() * 1_500)); - break; - } - break; - case RESUME_MACRO: - if (isInventoryOpen()) { - break; - } - if (GameStateHandler.getInstance().inGarden()) { - escapeState = EscapeState.NONE; - state = States.IDLE; - cantReachPest = 0; - delayClock.schedule((long) (1_000 + Math.random() * 500)); - LogUtils.sendDebug("[Pests Destroyer] Came back to Garden!"); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { - escapeState = EscapeState.RESUME_MACRO; - MacroHandler.getInstance().triggerWarpGarden(true, false); - delayClock.schedule((long) (2_500 + Math.random() * 1_500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { - escapeState = EscapeState.GO_TO_HUB; - mc.thePlayer.sendChatMessage("/skyblock"); - delayClock.schedule((long) (5_000 + Math.random() * 1_500)); - break; - } - break; - } - return; + @SubscribeEvent + public void onKeyInput(InputEvent.KeyInputEvent event) { + if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + return; + } + if (Keyboard.getEventKeyState() && Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); + stop(); + FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; + } } - switch (state) { - case IDLE: - ItemStack currentItem = mc.thePlayer.getHeldItem(); - if (GameStateHandler.getInstance().getPestsCount() == 0) { - if (isInventoryOpen()) { + @SubscribeEvent + public void onTickAFKMode(TickEvent.ClientTickEvent event) { + if (event.phase == TickEvent.Phase.END) { return; - } -// finishMacro(); - state = States.FINISH; - return; - } - if (getVacuum(currentItem)) { - return; - } - state = States.SWAP_ARMOR; - delayClock.schedule((long) (200 + Math.random() * 200)); - break; - case SWAP_ARMOR: - if (FarmHelperConfig.pestSwapArmorBefore) { - currentSlot = FarmHelperConfig.pestArmorSlot0; - if (finishing) { - currentSlot = FarmHelperConfig.pestArmorSlot1; - } - if (AutoWardrobe.activeSlot != currentSlot) { - AutoWardrobe.instance.swapTo(currentSlot); - } - } - state = States.ARMOR_SWAP_VERIFY; - break; - case ARMOR_SWAP_VERIFY: - if (AutoWardrobe.instance.isRunning()) { - return; - } - if (finishing) { - state = States.FINISH; - } else { - if (needToUpdatePlots || PlotUtils.needToUpdatePlots()) { - state = States.OPEN_DESK; - } else { - if (FarmHelperConfig.dontTeleportToPlots) { - state = States.GET_CLOSEST_PLOT; - } else { - state = States.TELEPORT_TO_PLOT; - } - } } - break; - case OPEN_DESK: - if (isInventoryOpen()) { - break; - } - mc.thePlayer.sendChatMessage("/desk"); - state = States.OPEN_PLOTS; - delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); - break; - case OPEN_PLOTS: - String chestName = InventoryUtils.getInventoryName(); - if (mc.currentScreen == null) { - delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 300 + Math.random() * 300)); - break; + if (mc.thePlayer == null || mc.theWorld == null) { + return; } - if (!InventoryUtils.isInventoryLoaded()) { - break; - } - if (chestName == null || !chestName.equals("Desk")) { - break; - } - Slot configurePlots = InventoryUtils.getSlotOfItemInContainer("Configure Plots"); - if (configurePlots == null) { - break; - } - state = States.WAIT_FOR_INFO; - InventoryUtils.clickContainerSlot(configurePlots.slotNumber, InventoryUtils.ClickType.LEFT, InventoryUtils.ClickMode.PICKUP); - delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); - break; - case WAIT_FOR_INFO: - break; - case TELEPORT_TO_PLOT: - PlotUtils.Plot plot; - if (FarmHelperConfig.dontTeleportToPlots) { - delayClock.schedule(1_000 + Math.random() * 500); - MacroHandler.getInstance().triggerWarpGarden(true, false); - state = States.CHECKING_SPAWN; - return; - } else { - plot = getClosestPlot(); + if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + return; } - if (plot == null) { - state = States.GO_BACK; - delayClock.schedule((long) (500 + Math.random() * 500)); - return; - } - if (GameStateHandler.getInstance().getCurrentPlot() == plot.number && BlockUtils.canFlyHigher(8)) { - state = States.GET_LOCATION; - break; - } - String plotNumber = plot.name; - preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); - mc.thePlayer.sendChatMessage("/tptoplot " + plotNumber); - state = States.WAIT_FOR_TP; - delayClock.schedule((long) (900 + Math.random() * 500)); - break; - case WAIT_FOR_TP: - if (!preTpBlockPos.isPresent()) { - state = States.IDLE; - break; - } - if (mc.thePlayer.getPosition().equals(preTpBlockPos.get())) { - break; - } - state = States.CHECKING_PLOT; - delayClock.schedule((long) (200 + Math.random() * 200)); - break; - case CHECKING_PLOT: - if (isInventoryOpenDelayed()) { - break; + if (MacroHandler.getInstance().isMacroToggled()) { + return; } - KeyBindUtils.stopMovement(); - - if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { - LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Going back to spawnpoint."); - delayClock.schedule(1_000 + Math.random() * 500); - MacroHandler.getInstance().triggerWarpGarden(true, false); - isPlotObstructed = true; - state = States.CHECKING_SPAWN; - return; - } - state = States.GET_LOCATION; - break; - case CHECKING_SPAWN: - if (MacroHandler.getInstance().isTeleporting()) { - return; - } - - if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { - LogUtils.sendError( - "[Pests Destroyer] Your spawnpoint is obstructed! Make sure there is no block above your spawnpoint! Disabling Pests Destroyer!"); - stop(); - FarmHelperConfig.enablePestsDestroyer = false; -// finishMacro(); - state = States.FINISH; - } else { - state = States.GET_CLOSEST_PLOT; - LogUtils.sendDebug("[Pests Destroyer] Spawnpoint is not obstructed"); + if (!isToggled()) { + return; } - break; - case GET_CLOSEST_PLOT: - if (isInventoryOpenDelayed()) { - break; + if (isRunning()) { + return; } - PlotUtils.Plot closestPlot = getClosestPlot(); - - if (closestPlot == null) { - LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); - state = States.GET_LOCATION; - return; + if (canEnableMacro(true)) { + start(); } + } - double distance = Math.sqrt(mc.thePlayer.getDistanceSq(PlotUtils.getPlotCenter(closestPlot.number))); - - this.closestPlot = Optional.of(closestPlot); - - if (FarmHelperConfig.dontTeleportToPlots) { - if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(3)) { - state = States.TELEPORT_TO_PLOT; - LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Forcing going back to spawnpoint."); - } else { - state = States.FLY_TO_THE_CLOSEST_PLOT; - } - break; - } + public boolean canEnableMacro() { + return canEnableMacro(false); + } - if (distance > 150 && !isPlotObstructed) { - state = States.TELEPORT_TO_PLOT; - } else { - state = States.FLY_TO_THE_CLOSEST_PLOT; - } - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - case FLY_TO_THE_CLOSEST_PLOT: - if (MacroHandler.getInstance().isTeleporting()) { - return; + public boolean canEnableMacro(boolean manually) { + if (!isToggled()) { + return false; } - if (isInventoryOpenDelayed()) { - break; + if (isRunning()) { + return false; } - - if (!this.closestPlot.isPresent()) { - LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); - state = States.GET_LOCATION; - return; + if (!GameStateHandler.getInstance().inGarden()) { + return false; } - - BlockPos plotCenter = PlotUtils.getPlotCenter(this.closestPlot.get().number); - - if (getClosestPest() != null) { - KeyBindUtils.stopMovement(); - state = States.FIND_PEST; - break; + if (!MacroHandler.getInstance().isMacroToggled() && !manually) { + return false; } - - if ((mc.thePlayer.onGround || !flyDelay.passed()) && mc.thePlayer.capabilities.allowFlying && !mc.thePlayer.capabilities.isFlying) { - fly(); - break; + if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) { + return false; } - - if (mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()) < 15) { - state = States.GET_LOCATION; - KeyBindUtils.stopMovement(); - FlyPathFinderExecutor.getInstance().stop(); - break; + if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { + return false; } - - if (!FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().setSprinting(true); - FlyPathFinderExecutor.getInstance().setDontRotate(false); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter.getX(), 80, plotCenter.getZ()), true, true); + if (enabled || preparing) { + return false; } - break; - case GET_LOCATION: - if (GameStateHandler.getInstance().getPestsCount() == 0) { - state = States.GO_BACK; - return; + if (GameStateHandler.getInstance().getPestsCount() < FarmHelperConfig.startKillingPestsAt && !manually || (manually + && GameStateHandler.getInstance().getPestsCount() == 0)) { + return false; } - if (isInventoryOpenDelayed()) { - break; + if (!manually && FarmHelperConfig.pausePestsDestroyerDuringJacobsContest && GameStateHandler.getInstance().inJacobContest()) { + LogUtils.sendError("[Pests Destroyer] Pests Destroyer won't activate during Jacob's Contest!"); + return false; } - ItemStack currentItem2 = mc.thePlayer.getHeldItem(); - if (getVacuum(currentItem2)) { - return; + if (!mc.thePlayer.capabilities.allowFlying) { + LogUtils.sendError("[Pests Destroyer] You need to be able to fly!"); + if (FarmHelperConfig.pestsDestroyerAfkInfiniteMode) { + LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!"); + FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false; + } + return false; } + return true; + } - if (getClosestPest() != null) { - FlyPathFinderExecutor.getInstance().stop(); - state = States.FIND_PEST; - break; + @SubscribeEvent + public void onTickExecute(TickEvent.ClientTickEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; } - - if (FlyPathFinderExecutor.getInstance().isRunning()) { - return; + if (mc.currentScreen == null && checkedThisGui) { + checkedThisGui = false; + } + if (!gotRangeOfVacuum && (isToggled() || PestsDestroyerOnTheTrack.getInstance().isToggled())) { + Slot vacuumSlot = InventoryUtils.getSlotOfItemInInventory("Vacuum"); + if (vacuumSlot != null) { + ItemStack vacuumItem = vacuumSlot.getStack(); + for (Map.Entry vacuumRange : this.vacuumRange.entrySet()) { + if (vacuumItem.getDisplayName().contains(vacuumRange.getKey())) { + currentVacuumRange = vacuumRange.getValue(); + gotRangeOfVacuum = true; + LogUtils.sendDebug("[Pests Destroyer] Found vacuum range: " + currentVacuumRange); + break; + } + } + } } - - if (!mc.thePlayer.capabilities.isFlying) { - fly(); - break; + if (!isToggled()) { + return; } - if (hasBlocksAround()) { - KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); - break; - } else { - if (mc.gameSettings.keyBindJump.isKeyDown()) { - KeyBindUtils.stopMovement(); - } + if (event.phase != TickEvent.Phase.END) { + return; } - - if (getLocationTries > 2) { - PlotUtils.Plot currentPlot = getClosestPlot(); - - if (!isNearPlotCenter()) { - if (currentPlot != null) { - BlockPos plotCenter2 = PlotUtils.getPlotCenter(currentPlot.number); - FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); - FlyPathFinderExecutor.getInstance().setDontRotate(false); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter2.getX(), 80, plotCenter2.getZ()), true, true); - LogUtils.sendDebug("[Pests Destroyer] Flying to plot center"); - } else { - LogUtils.sendWarning("[Pests Destroyer] Couldn't find closest plot!"); - state = States.GO_BACK; - } - break; - } + if (!GameStateHandler.getInstance().inGarden() && escapeState == EscapeState.NONE) { + return; } - - resetFireworkInfo(); - lastFireworkTime = System.currentTimeMillis(); - MovingObjectPosition mop = mc.objectMouseOver; - if (RotationHandler.getInstance().isRotating()) { - break; + if (!enabled) { + return; } - float yaw = -1; - Vec3 playerPos = mc.thePlayer.getPositionEyes(1); - for (float i = 0; i < 360; i += 10) { - Vec3 testRotation = AngleUtils.getVectorForRotation(0, i); - Vec3 lookVector = playerPos.addVector(testRotation.xCoord * 5, testRotation.yCoord * 5, testRotation.zCoord * 5); - MovingObjectPosition mop2 = mc.theWorld.rayTraceBlocks(playerPos, lookVector, false, true, false); - if (mop2 == null || mop2.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { - yaw = i; - break; - } - } - Rotation upRotation = new Rotation((float) (yaw + (Math.random() * 5 - 2.5)), (float) (-20 + (Math.random() * 6 - 4))); - if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && RotationHandler.getInstance() - .shouldRotate(upRotation, 10)) { - RotationHandler.getInstance().easeTo(new RotationConfiguration( - upRotation, - FarmHelperConfig.getRandomRotationTime(), - null - ).easeOutBack(true)); - delayClock.schedule(300); - break; - } - state = States.WAIT_FOR_LOCATION; - if (getLocationTries > 4) { - LogUtils.sendWarning("[Pests Destroyer] Couldn't find any firework location. Trying to fix it by sending /pq low."); - mc.thePlayer.sendChatMessage("/pq low"); - getLocationTries = 0; - } - KeyBindUtils.leftClick(); - getLocationTries++; - if (!stuckClock.isScheduled()) { - stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); - } - delayClock.schedule(300); - break; - case WAIT_FOR_LOCATION: - if (isInventoryOpenDelayed()) { - break; - } - - if (RotationHandler.getInstance().isRotating()) { - return; - } - - if (getClosestPest() != null) { - state = States.FIND_PEST; - break; - } - - if (lastLocation != null && lastFireworkTime + 250 < System.currentTimeMillis()) { - Vec3 firework = calculateWaypoint(); - if (firework == null) { - LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); - state = States.GET_LOCATION; - break; - } - if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { - int y = 150; - Block block = mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord)).getBlock(); - Block[] blocksAround = new Block[]{ - mc.theWorld.getBlockState(new BlockPos(firework.xCoord + 1, y, firework.zCoord)).getBlock(), - mc.theWorld.getBlockState(new BlockPos(firework.xCoord - 1, y, firework.zCoord)).getBlock(), - mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord + 1)).getBlock(), - mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord - 1)).getBlock(), - block - }; - while (y > 90 && Arrays.stream(blocksAround).allMatch(b -> b.equals(Blocks.air))) { - y--; - } - y += 3; - FlyPathFinderExecutor.getInstance().setSprinting(false); - FlyPathFinderExecutor.getInstance().setDontRotate(true); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(firework.xCoord, y, firework.zCoord), true, true); - LogUtils.sendWarning( - "[Pests Destroyer] Firework is too close to player. Flying to x: " + firework.xCoord + " y: " + y + " z: " + firework.zCoord); - break; - } - RotationHandler.getInstance().reset(); - state = States.FIND_PEST; - delayBetweenFireworks.schedule(3_000); - delayClock.schedule(300); - break; - } - if (System.currentTimeMillis() - lastFireworkTime > 6_000) { - state = States.GET_LOCATION; - break; - } - break; - case FIND_PEST: - if (isInventoryOpenDelayed()) { - break; + if (!FailsafeManager.getInstance().getEmergencyQueue().isEmpty()) { + return; } - getLocationTries = 0; - if (GameStateHandler.getInstance().getPestsCount() == 0) { - RotationHandler.getInstance().reset(); - state = States.CHECK_ANOTHER_PEST; - return; + if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) { + stop(); + return; } - Entity closestPest = getClosestPest(); - - if (closestPest == null) { - if (lastLocation == null) { - LogUtils.sendDebug("[Pests Destroyer] No firework location found. Looking for a firework."); - state = States.GET_LOCATION; - break; - } - - if (!FlyPathFinderExecutor.getInstance().isRunning()) { - Vec3 firework = calculateWaypoint(); - if (firework == null) { - LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); - state = States.GET_LOCATION; - break; - } - if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { - state = States.GET_LOCATION; - break; - } - FlyPathFinderExecutor.getInstance().setSprinting(true); - FlyPathFinderExecutor.getInstance().setDontRotate(false); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(firework, true, true); - } - break; - } - if (closestPest instanceof EntityArmorStand) { - Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(closestPest, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); - if (realEntity != null) { - closestPest = realEntity; - } + if (stuckClock.isScheduled() && stuckClock.passed()) { + LogUtils.sendWarning( + "[Pests Destroyer] The player is struggling killing pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport."); + LogUtils.sendFailsafeMessage("[Pests Destroyer] Couldn't kill pest for 5 minutes, will do a quick Garden -> Hub -> Garden teleport.", + true); + escapeState = EscapeState.GO_TO_HUB; + KeyBindUtils.stopMovement(); + delayClock.schedule(300); + stuckClock.reset(); + return; } - if (FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().stop(); + + if (delayClock.isScheduled() && !delayClock.passed()) { + return; } - currentEntityTarget = Optional.of(closestPest); + LogUtils.sendDebug("[Pests Destroyer] State: " + state); - state = States.KILL_PEST; - cantReachPest = 0; - KeyBindUtils.stopMovement(); - if (!stuckClock.isScheduled()) { - stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); - } - delayClock.schedule(300); - break; - case KILL_PEST: - if (isInventoryOpenDelayed()) { - break; - } - if (mc.thePlayer.posY < 67 && FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().stop(); - RotationHandler.getInstance().reset(); - state = States.GET_LOCATION; - return; - } - if (!currentEntityTarget.isPresent()) { - FlyPathFinderExecutor.getInstance().stop(); - RotationHandler.getInstance().reset(); - state = States.CHECK_ANOTHER_PEST; - return; - } - Entity entity = currentEntityTarget.get(); - if (entity.isDead || killedEntities.contains(entity) || !mc.theWorld.loadedEntityList.contains(entity)) { - RotationHandler.getInstance().reset(); - state = States.CHECK_ANOTHER_PEST; - FlyPathFinderExecutor.getInstance().stop(); - return; - } - - double distance2 = mc.thePlayer.getDistance(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); - double distanceXZ = mc.thePlayer.getDistance(entity.posX, mc.thePlayer.posY, entity.posZ); - - float vacuumMinRange = Math.max(currentVacuumRange - 2, 3); - if (FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking > 0 - && (distanceXZ < 1.5 || distance2 <= Math.max(vacuumMinRange - 2, 10)) - && Math.abs(mc.thePlayer.motionX) < 0.1 - && Math.abs(mc.thePlayer.motionZ) < 0.1 - && !canEntityBeSeenIgnoreNonCollidable(entity)) { - cantReachPest++; - } - - if (cantReachPest >= FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking) { - LogUtils.sendWarning("[Pests Destroyer] Can't reach the pest, will do a quick Garden -> Hub -> Garden teleport."); - escapeState = EscapeState.GO_TO_HUB; - KeyBindUtils.stopMovement(); - delayClock.schedule(300); - return; - } - - if (distance2 < vacuumMinRange) { - float targetVelocity = (float) (Math.abs(entity.motionX) + Math.abs(entity.motionZ)); - if (vacuumMinRange > 8 || targetVelocity < 0.15) { - if (FlyPathFinderExecutor.getInstance().isRunning()) { - FlyPathFinderExecutor.getInstance().stop(); - LogUtils.sendDebug("[Pests Destroyer] Stopping pathfinder because the pest is close enough"); - float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); - if (playerVelocity > 0.9) { - KeyBindUtils.onTick(mc.gameSettings.keyBindBack); - } - } else { - float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); - if (playerVelocity > 0.15 && distanceXZ < 3) { - KeyBindUtils.onTick(mc.gameSettings.keyBindBack); - } + if (escapeState != EscapeState.NONE) { + if (stuckClock.isScheduled()) { + stuckClock.reset(); + } + if (RotationHandler.getInstance().isRotating()) { + RotationHandler.getInstance().reset(); } - } - if (rotationState != RotationState.CLOSE) { - rotationState = RotationState.CLOSE; - RotationHandler.getInstance().reset(); - } - if (!RotationHandler.getInstance().isRotating()) { - RotationHandler.getInstance().easeTo(new RotationConfiguration( - new Target(entity), - (long) (400 + Math.random() * 200), - null - ).followTarget(true)); - } - FlyPathFinderExecutor.getInstance().setUseAOTV(false); - ItemStack currentItem3 = mc.thePlayer.getHeldItem(); - if (getVacuum(currentItem3)) { - break; - } - KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, true); - } else { - if (rotationState != RotationState.FAR) { - FlyPathFinderExecutor.getInstance().stop(); - rotationState = RotationState.FAR; - RotationHandler.getInstance().reset(); - } - if (!FlyPathFinderExecutor.getInstance().isRunning()) { - double yAddition = Math.max(2.75, Math.min(currentVacuumRange - 5, 10)); - LogUtils.sendDebug("Should pathfind to: " + entity.posX + " " + yAddition + " " + entity.posZ); - FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); - FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - FlyPathFinderExecutor.getInstance().findPath(entity, true, true, (float) yAddition, true); - } - if (FlyPathFinderExecutor.getInstance().getState() == FlyPathFinderExecutor.State.FAILED - && mc.thePlayer.motionX == 0 && mc.thePlayer.motionZ == 0) { - flyPathfinderTries++; - } else { - flyPathfinderTries = 0; - } - if (flyPathfinderTries > 5) { - LogUtils.sendWarning("[Pests Destroyer] Couldn't pathfind to the pest. Flying from the spawnpoint."); - flyPathfinderTries = 0; KeyBindUtils.stopMovement(); - delayClock.schedule(1_000 + Math.random() * 500); - MacroHandler.getInstance().triggerWarpGarden(true, false); - state = States.CHECKING_SPAWN; - return; - } - if (!RotationHandler.getInstance().isRotating()) { - RotationHandler.getInstance().easeTo(new RotationConfiguration( - new Target(entity).additionalY(-0.3f), - (long) (400 + Math.random() * 200), - null - )); - } - FlyPathFinderExecutor.getInstance() - .setUseAOTV(distanceXZ > vacuumMinRange && InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); - if (distance2 < currentVacuumRange && getVacuum(mc.thePlayer.getHeldItem())) { - break; - } - KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, distance2 < currentVacuumRange); - } - break; - case CHECK_ANOTHER_PEST: - if (previousCurrentPlotPestsCount == GameStateHandler.getInstance().getCurrentPlotPestsCount() - && System.currentTimeMillis() - lastKillTimestamp < 2_000) { - return; - } - - LogUtils.sendDebug( - GameStateHandler.getInstance().getPestsCount() + " pest" + (GameStateHandler.getInstance().getPestsCount() == 1 ? "" : "s") + " left"); - if (GameStateHandler.getInstance().getPestsCount() == 0) { - state = States.GO_BACK; - delayClock.schedule((long) (500 + Math.random() * 500)); - break; - } - System.out.println("Curr plot pests: " + GameStateHandler.getInstance().getCurrentPlotPestsCount()); - isPlotObstructed = false; - Entity closestPest2 = getClosestPest(); - KeyBindUtils.stopMovement(); - if (closestPest2 != null) { - LogUtils.sendDebug("Found another pest"); - state = States.KILL_PEST; - currentEntityTarget = Optional.of(closestPest2); - delayClock.schedule(50 + (long) (Math.random() * 100)); - } else { - PlotUtils.Plot plotOpt = getClosestPlot(); - if (plotOpt != null) { - double distanceToPlot = Math.sqrt(mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plotOpt.number))); - LogUtils.sendDebug("Distance to plot: " + distanceToPlot); - if (distanceToPlot < 150 || FarmHelperConfig.dontTeleportToPlots) { - LogUtils.sendDebug("Going manually to another plot"); - state = States.GET_CLOSEST_PLOT; - delayClock.schedule(100 + (long) (Math.random() * 150)); - break; - } else { - LogUtils.sendDebug("Teleporting to plot"); - state = States.TELEPORT_TO_PLOT; - delayClock.schedule(400 + (long) (Math.random() * 400)); + switch (escapeState) { + case GO_TO_HUB: + if (isInventoryOpen()) { + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { + escapeState = EscapeState.GO_TO_GARDEN; + delayClock.schedule((long) (5_500 + Math.random() * 3_500)); + break; + } + if (GameStateHandler.getInstance().inGarden()) { + mc.thePlayer.sendChatMessage("/hub"); + escapeState = EscapeState.GO_TO_GARDEN; + delayClock.schedule((long) (1_800 + Math.random() * 1_000)); + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { + escapeState = EscapeState.GO_TO_HUB; + mc.thePlayer.sendChatMessage("/skyblock"); + delayClock.schedule((long) (5_000 + Math.random() * 1_500)); + break; + } + break; + case GO_TO_GARDEN: + if (isInventoryOpen()) { + break; + } + if (GameStateHandler.getInstance().inGarden()) { + escapeState = EscapeState.GO_TO_HUB; + delayClock.schedule((long) (2_500 + Math.random() * 1_500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { + escapeState = EscapeState.RESUME_MACRO; + MacroHandler.getInstance().triggerWarpGarden(true, false); + delayClock.schedule((long) (2_500 + Math.random() * 1_500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { + escapeState = EscapeState.GO_TO_HUB; + mc.thePlayer.sendChatMessage("/skyblock"); + delayClock.schedule((long) (5_000 + Math.random() * 1_500)); + break; + } + break; + case RESUME_MACRO: + if (isInventoryOpen()) { + break; + } + if (GameStateHandler.getInstance().inGarden()) { + escapeState = EscapeState.NONE; + state = States.IDLE; + cantReachPest = 0; + delayClock.schedule((long) (1_000 + Math.random() * 500)); + LogUtils.sendDebug("[Pests Destroyer] Came back to Garden!"); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) { + escapeState = EscapeState.RESUME_MACRO; + MacroHandler.getInstance().triggerWarpGarden(true, false); + delayClock.schedule((long) (2_500 + Math.random() * 1_500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.TELEPORTING) { + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.LOBBY) { + escapeState = EscapeState.GO_TO_HUB; + mc.thePlayer.sendChatMessage("/skyblock"); + delayClock.schedule((long) (5_000 + Math.random() * 1_500)); + break; + } + break; } - } else { - state = States.GO_BACK; - delayClock.schedule(300 + (long) (Math.random() * 300)); - } - } - break; - case GO_BACK: - state = States.FINISH; - break; - case FINISH: - finishing = true; - if (FarmHelperConfig.pestSwapArmorAfter && currentSlot != FarmHelperConfig.pestArmorSlot1) { - state = States.SWAP_ARMOR; - return; - } - finishMacro(); + return; + } + + switch (state) { + case IDLE: + ItemStack currentItem = mc.thePlayer.getHeldItem(); + if (GameStateHandler.getInstance().getPestsCount() == 0) { + if (isInventoryOpen()) { + return; + } +// finishMacro(); + state = States.FINISH; + return; + } + if (getVacuum(currentItem)) { + return; + } + state = States.SWAP_ARMOR; + delayClock.schedule((long) (200 + Math.random() * 200)); + break; + case SWAP_ARMOR: + if (FarmHelperConfig.pestSwapArmorBefore) { + currentSlot = FarmHelperConfig.pestArmorSlot0; + if (finishing) { + currentSlot = FarmHelperConfig.pestArmorSlot1; + } + if (AutoWardrobe.activeSlot != currentSlot) { + AutoWardrobe.instance.swapTo(currentSlot); + } + } + state = States.ARMOR_SWAP_VERIFY; + break; + case ARMOR_SWAP_VERIFY: + if (AutoWardrobe.instance.isRunning()) { + return; + } + if (finishing) { + state = States.FINISH; + } else { + if (needToUpdatePlots || PlotUtils.needToUpdatePlots()) { + state = States.OPEN_DESK; + } else { + if (FarmHelperConfig.dontTeleportToPlots) { + state = States.GET_CLOSEST_PLOT; + } else { + state = States.TELEPORT_TO_PLOT; + } + } + } + break; + case OPEN_DESK: + if (isInventoryOpen()) { + break; + } + mc.thePlayer.sendChatMessage("/desk"); + state = States.OPEN_PLOTS; + delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); + break; + case OPEN_PLOTS: + String chestName = InventoryUtils.getInventoryName(); + if (mc.currentScreen == null) { + delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 300 + Math.random() * 300)); + break; + } + if (!InventoryUtils.isInventoryLoaded()) { + break; + } + if (chestName == null || !chestName.equals("Desk")) { + break; + } + Slot configurePlots = InventoryUtils.getSlotOfItemInContainer("Configure Plots"); + if (configurePlots == null) { + break; + } + state = States.WAIT_FOR_INFO; + InventoryUtils.clickContainerSlot(configurePlots.slotNumber, InventoryUtils.ClickType.LEFT, InventoryUtils.ClickMode.PICKUP); + delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); + break; + case WAIT_FOR_INFO: + break; + case TELEPORT_TO_PLOT: + PlotUtils.Plot plot; + if (FarmHelperConfig.dontTeleportToPlots) { + delayClock.schedule(1_000 + Math.random() * 500); + MacroHandler.getInstance().triggerWarpGarden(true, false); + state = States.CHECKING_SPAWN; + return; + } else { + plot = getClosestPlot(); + } + if (plot == null) { + state = States.GO_BACK; + delayClock.schedule((long) (500 + Math.random() * 500)); + return; + } + if (GameStateHandler.getInstance().getCurrentPlot() == plot.number && BlockUtils.canFlyHigher(8)) { + state = States.GET_LOCATION; + break; + } + String plotNumber = plot.name; + preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); + mc.thePlayer.sendChatMessage("/tptoplot " + plotNumber); + state = States.WAIT_FOR_TP; + delayClock.schedule((long) (900 + Math.random() * 500)); + break; + case WAIT_FOR_TP: + if (!preTpBlockPos.isPresent()) { + state = States.IDLE; + break; + } + if (mc.thePlayer.getPosition().equals(preTpBlockPos.get())) { + break; + } + state = States.CHECKING_PLOT; + delayClock.schedule((long) (200 + Math.random() * 200)); + break; + case CHECKING_PLOT: + if (isInventoryOpenDelayed()) { + break; + } + KeyBindUtils.stopMovement(); + + if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { + LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Going back to spawnpoint."); + delayClock.schedule(1_000 + Math.random() * 500); + MacroHandler.getInstance().triggerWarpGarden(true, false); + isPlotObstructed = true; + state = States.CHECKING_SPAWN; + return; + } + state = States.GET_LOCATION; + break; + case CHECKING_SPAWN: + if (MacroHandler.getInstance().isTeleporting()) { + return; + } + + if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { + LogUtils.sendError( + "[Pests Destroyer] Your spawnpoint is obstructed! Make sure there is no block above your spawnpoint! Disabling Pests Destroyer!"); + stop(); + FarmHelperConfig.enablePestsDestroyer = false; +// finishMacro(); + state = States.FINISH; + } else { + state = States.GET_CLOSEST_PLOT; + LogUtils.sendDebug("[Pests Destroyer] Spawnpoint is not obstructed"); + } + break; + case GET_CLOSEST_PLOT: + if (isInventoryOpenDelayed()) { + break; + } + + PlotUtils.Plot closestPlot = getClosestPlot(); + + if (closestPlot == null) { + LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); + state = States.GET_LOCATION; + return; + } + + double distance = Math.sqrt(mc.thePlayer.getDistanceSq(PlotUtils.getPlotCenter(closestPlot.number))); + + this.closestPlot = Optional.of(closestPlot); + + if (FarmHelperConfig.dontTeleportToPlots) { + if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(3)) { + state = States.TELEPORT_TO_PLOT; + LogUtils.sendWarning( + "[Pests Destroyer] The player is suffocating and/or it can't fly higher. Forcing going back to spawnpoint."); + } else { + state = States.FLY_TO_THE_CLOSEST_PLOT; + } + break; + } + + if (distance > 150 && !isPlotObstructed) { + state = States.TELEPORT_TO_PLOT; + } else { + state = States.FLY_TO_THE_CLOSEST_PLOT; + } + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + case FLY_TO_THE_CLOSEST_PLOT: + if (MacroHandler.getInstance().isTeleporting()) { + return; + } + if (isInventoryOpenDelayed()) { + break; + } + + if (!this.closestPlot.isPresent()) { + LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!"); + state = States.GET_LOCATION; + return; + } + + BlockPos plotCenter = PlotUtils.getPlotCenter(this.closestPlot.get().number); + + if (getClosestPest() != null) { + KeyBindUtils.stopMovement(); + state = States.FIND_PEST; + break; + } + + if ((mc.thePlayer.onGround || !flyDelay.passed()) && mc.thePlayer.capabilities.allowFlying && !mc.thePlayer.capabilities.isFlying) { + fly(); + break; + } + + if (mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()) < 15) { + state = States.GET_LOCATION; + KeyBindUtils.stopMovement(); + FlyPathFinderExecutor.getInstance().stop(); + break; + } + + if (!FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().setSprinting(true); + FlyPathFinderExecutor.getInstance().setDontRotate(false); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter.getX(), 80, plotCenter.getZ()), true, true); + } + break; + case GET_LOCATION: + if (GameStateHandler.getInstance().getPestsCount() == 0) { + state = States.GO_BACK; + return; + } + if (isInventoryOpenDelayed()) { + break; + } + ItemStack currentItem2 = mc.thePlayer.getHeldItem(); + if (getVacuum(currentItem2)) { + return; + } + + if (getClosestPest() != null) { + FlyPathFinderExecutor.getInstance().stop(); + state = States.FIND_PEST; + break; + } + + if (FlyPathFinderExecutor.getInstance().isRunning()) { + return; + } + + if (!mc.thePlayer.capabilities.isFlying) { + fly(); + break; + } + if (hasBlocksAround()) { + KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); + break; + } else { + if (mc.gameSettings.keyBindJump.isKeyDown()) { + KeyBindUtils.stopMovement(); + } + } + + if (getLocationTries > 2) { + PlotUtils.Plot currentPlot = getClosestPlot(); + + if (!isNearPlotCenter()) { + if (currentPlot != null) { + BlockPos plotCenter2 = PlotUtils.getPlotCenter(currentPlot.number); + FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); + FlyPathFinderExecutor.getInstance().setDontRotate(false); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(plotCenter2.getX(), 80, plotCenter2.getZ()), true, true); + LogUtils.sendDebug("[Pests Destroyer] Flying to plot center"); + } else { + LogUtils.sendWarning("[Pests Destroyer] Couldn't find closest plot!"); + state = States.GO_BACK; + } + break; + } + } + + resetFireworkInfo(); + lastFireworkTime = System.currentTimeMillis(); + MovingObjectPosition mop = mc.objectMouseOver; + if (RotationHandler.getInstance().isRotating()) { + break; + } + float yaw = -1; + Vec3 playerPos = mc.thePlayer.getPositionEyes(1); + for (float i = 0; i < 360; i += 10) { + Vec3 testRotation = AngleUtils.getVectorForRotation(0, i); + Vec3 lookVector = playerPos.addVector(testRotation.xCoord * 5, testRotation.yCoord * 5, testRotation.zCoord * 5); + MovingObjectPosition mop2 = mc.theWorld.rayTraceBlocks(playerPos, lookVector, false, true, false); + if (mop2 == null || mop2.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) { + yaw = i; + break; + } + } + Rotation upRotation = new Rotation((float) (yaw + (Math.random() * 5 - 2.5)), (float) (-20 + (Math.random() * 6 - 4))); + if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && RotationHandler.getInstance() + .shouldRotate(upRotation, 10)) { + RotationHandler.getInstance().easeTo(new RotationConfiguration( + upRotation, + FarmHelperConfig.getRandomRotationTime(), + null + ).easeOutBack(true)); + delayClock.schedule(300); + break; + } + state = States.WAIT_FOR_LOCATION; + if (getLocationTries > 4) { + LogUtils.sendWarning("[Pests Destroyer] Couldn't find any firework location. Trying to fix it by sending /pq low."); + mc.thePlayer.sendChatMessage("/pq low"); + getLocationTries = 0; + } + KeyBindUtils.leftClick(); + getLocationTries++; + if (!stuckClock.isScheduled()) { + stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); + } + delayClock.schedule(300); + break; + case WAIT_FOR_LOCATION: + if (isInventoryOpenDelayed()) { + break; + } + + if (RotationHandler.getInstance().isRotating()) { + return; + } + + if (getClosestPest() != null) { + state = States.FIND_PEST; + break; + } + + if (lastLocation != null && lastFireworkTime + 250 < System.currentTimeMillis()) { + Vec3 firework = calculateWaypoint(); + if (firework == null) { + LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); + state = States.GET_LOCATION; + break; + } + if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { + int y = 150; + Block block = mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord)).getBlock(); + Block[] blocksAround = new Block[]{ + mc.theWorld.getBlockState(new BlockPos(firework.xCoord + 1, y, firework.zCoord)).getBlock(), + mc.theWorld.getBlockState(new BlockPos(firework.xCoord - 1, y, firework.zCoord)).getBlock(), + mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord + 1)).getBlock(), + mc.theWorld.getBlockState(new BlockPos(firework.xCoord, y, firework.zCoord - 1)).getBlock(), + block + }; + while (y > 90 && Arrays.stream(blocksAround).allMatch(b -> b.equals(Blocks.air))) { + y--; + } + y += 3; + FlyPathFinderExecutor.getInstance().setSprinting(false); + FlyPathFinderExecutor.getInstance().setDontRotate(true); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(firework.xCoord, y, firework.zCoord), true, true); + LogUtils.sendWarning( + "[Pests Destroyer] Firework is too close to player. Flying to x: " + firework.xCoord + " y: " + y + " z: " + + firework.zCoord); + break; + } + RotationHandler.getInstance().reset(); + state = States.FIND_PEST; + delayBetweenFireworks.schedule(3_000); + delayClock.schedule(300); + break; + } + if (System.currentTimeMillis() - lastFireworkTime > 6_000) { + state = States.GET_LOCATION; + break; + } + break; + case FIND_PEST: + if (isInventoryOpenDelayed()) { + break; + } + getLocationTries = 0; + if (GameStateHandler.getInstance().getPestsCount() == 0) { + RotationHandler.getInstance().reset(); + state = States.CHECK_ANOTHER_PEST; + return; + } + + Entity closestPest = getClosestPest(); + + if (closestPest == null) { + if (lastLocation == null) { + LogUtils.sendDebug("[Pests Destroyer] No firework location found. Looking for a firework."); + state = States.GET_LOCATION; + break; + } + + if (!FlyPathFinderExecutor.getInstance().isRunning()) { + Vec3 firework = calculateWaypoint(); + if (firework == null) { + LogUtils.sendDebug("[Pests Destroyer] Couldn't find any firework location. Looking for a firework."); + state = States.GET_LOCATION; + break; + } + if (mc.thePlayer.getDistance(firework.xCoord, firework.yCoord, firework.zCoord) < 2) { + state = States.GET_LOCATION; + break; + } + FlyPathFinderExecutor.getInstance().setSprinting(true); + FlyPathFinderExecutor.getInstance().setDontRotate(false); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(firework, true, true); + } + break; + } + if (closestPest instanceof EntityArmorStand) { + Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(closestPest, + (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); + if (realEntity != null) { + closestPest = realEntity; + } + } + if (FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + } + + currentEntityTarget = Optional.of(closestPest); + + state = States.KILL_PEST; + cantReachPest = 0; + KeyBindUtils.stopMovement(); + if (!stuckClock.isScheduled()) { + stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); + } + delayClock.schedule(300); + break; + case KILL_PEST: + if (isInventoryOpenDelayed()) { + break; + } + if (mc.thePlayer.posY < 67 && FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + RotationHandler.getInstance().reset(); + state = States.GET_LOCATION; + return; + } + if (!currentEntityTarget.isPresent()) { + FlyPathFinderExecutor.getInstance().stop(); + RotationHandler.getInstance().reset(); + state = States.CHECK_ANOTHER_PEST; + return; + } + Entity entity = currentEntityTarget.get(); + if (entity.isDead || killedEntities.contains(entity) || !mc.theWorld.loadedEntityList.contains(entity)) { + RotationHandler.getInstance().reset(); + state = States.CHECK_ANOTHER_PEST; + FlyPathFinderExecutor.getInstance().stop(); + return; + } + + double distance2 = mc.thePlayer.getDistance(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); + double distanceXZ = mc.thePlayer.getDistance(entity.posX, mc.thePlayer.posY, entity.posZ); + + float vacuumMinRange = Math.max(currentVacuumRange - 2, 3); + if (FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking > 0 + && (distanceXZ < 1.5 || distance2 <= Math.max(vacuumMinRange - 2, 10)) + && Math.abs(mc.thePlayer.motionX) < 0.1 + && Math.abs(mc.thePlayer.motionZ) < 0.1 + && !canEntityBeSeenIgnoreNonCollidable(entity)) { + cantReachPest++; + } + + if (cantReachPest >= FarmHelperConfig.pestsKillerTicksOfNotSeeingPestWhileAttacking) { + LogUtils.sendWarning("[Pests Destroyer] Can't reach the pest, will do a quick Garden -> Hub -> Garden teleport."); + escapeState = EscapeState.GO_TO_HUB; + KeyBindUtils.stopMovement(); + delayClock.schedule(300); + return; + } + + if (distance2 < vacuumMinRange) { + float targetVelocity = (float) (Math.abs(entity.motionX) + Math.abs(entity.motionZ)); + if (vacuumMinRange > 8 || targetVelocity < 0.15) { + if (FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + LogUtils.sendDebug("[Pests Destroyer] Stopping pathfinder because the pest is close enough"); + float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); + if (playerVelocity > 0.9) { + KeyBindUtils.onTick(mc.gameSettings.keyBindBack); + } + } else { + float playerVelocity = (float) (Math.abs(mc.thePlayer.motionX) + Math.abs(mc.thePlayer.motionZ)); + if (playerVelocity > 0.15 && distanceXZ < 3) { + KeyBindUtils.onTick(mc.gameSettings.keyBindBack); + } + } + } + if (rotationState != RotationState.CLOSE) { + rotationState = RotationState.CLOSE; + RotationHandler.getInstance().reset(); + } + if (!RotationHandler.getInstance().isRotating()) { + RotationHandler.getInstance().easeTo(new RotationConfiguration( + new Target(entity), + (long) (400 + Math.random() * 200), + null + ).followTarget(true)); + } + FlyPathFinderExecutor.getInstance().setUseAOTV(false); + ItemStack currentItem3 = mc.thePlayer.getHeldItem(); + if (getVacuum(currentItem3)) { + break; + } + KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, true); + } else { + if (rotationState != RotationState.FAR) { + FlyPathFinderExecutor.getInstance().stop(); + rotationState = RotationState.FAR; + RotationHandler.getInstance().reset(); + } + if (!FlyPathFinderExecutor.getInstance().isRunning()) { + double yAddition = Math.max(2.75, Math.min(currentVacuumRange - 5, 10)); + LogUtils.sendDebug("Should pathfind to: " + entity.posX + " " + yAddition + " " + entity.posZ); + FlyPathFinderExecutor.getInstance().setSprinting(FarmHelperConfig.sprintWhileFlying); + FlyPathFinderExecutor.getInstance().setUseAOTV(InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + FlyPathFinderExecutor.getInstance().findPath(entity, true, true, (float) yAddition, true); + } + if (FlyPathFinderExecutor.getInstance().getState() == FlyPathFinderExecutor.State.FAILED + && mc.thePlayer.motionX == 0 && mc.thePlayer.motionZ == 0) { + flyPathfinderTries++; + } else { + flyPathfinderTries = 0; + } + if (flyPathfinderTries > 5) { + LogUtils.sendWarning("[Pests Destroyer] Couldn't pathfind to the pest. Flying from the spawnpoint."); + flyPathfinderTries = 0; + KeyBindUtils.stopMovement(); + delayClock.schedule(1_000 + Math.random() * 500); + MacroHandler.getInstance().triggerWarpGarden(true, false); + state = States.CHECKING_SPAWN; + return; + } + if (!RotationHandler.getInstance().isRotating()) { + RotationHandler.getInstance().easeTo(new RotationConfiguration( + new Target(entity).additionalY(-0.3f), + (long) (400 + Math.random() * 200), + null + )); + } + FlyPathFinderExecutor.getInstance() + .setUseAOTV(distanceXZ > vacuumMinRange && InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End")); + if (distance2 < currentVacuumRange && getVacuum(mc.thePlayer.getHeldItem())) { + break; + } + KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindUseItem, distance2 < currentVacuumRange); + } + break; + case CHECK_ANOTHER_PEST: + if (previousCurrentPlotPestsCount == GameStateHandler.getInstance().getCurrentPlotPestsCount() + && System.currentTimeMillis() - lastKillTimestamp < 2_000) { + return; + } + + LogUtils.sendDebug( + GameStateHandler.getInstance().getPestsCount() + " pest" + (GameStateHandler.getInstance().getPestsCount() == 1 ? "" : "s") + + " left"); + if (GameStateHandler.getInstance().getPestsCount() == 0) { + state = States.GO_BACK; + delayClock.schedule((long) (500 + Math.random() * 500)); + break; + } + System.out.println("Curr plot pests: " + GameStateHandler.getInstance().getCurrentPlotPestsCount()); + isPlotObstructed = false; + Entity closestPest2 = getClosestPest(); + KeyBindUtils.stopMovement(); + if (closestPest2 != null) { + LogUtils.sendDebug("Found another pest"); + state = States.KILL_PEST; + currentEntityTarget = Optional.of(closestPest2); + delayClock.schedule(50 + (long) (Math.random() * 100)); + } else { + PlotUtils.Plot plotOpt = getClosestPlot(); + if (plotOpt != null) { + double distanceToPlot = Math.sqrt(mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plotOpt.number))); + LogUtils.sendDebug("Distance to plot: " + distanceToPlot); + if (distanceToPlot < 150 || FarmHelperConfig.dontTeleportToPlots) { + LogUtils.sendDebug("Going manually to another plot"); + state = States.GET_CLOSEST_PLOT; + delayClock.schedule(100 + (long) (Math.random() * 150)); + break; + } else { + LogUtils.sendDebug("Teleporting to plot"); + state = States.TELEPORT_TO_PLOT; + delayClock.schedule(400 + (long) (Math.random() * 400)); + } + } else { + state = States.GO_BACK; + delayClock.schedule(300 + (long) (Math.random() * 300)); + } + } + break; + case GO_BACK: + state = States.FINISH; + break; + case FINISH: + finishing = true; + if (FarmHelperConfig.pestSwapArmorAfter && currentSlot != FarmHelperConfig.pestArmorSlot1) { + state = States.SWAP_ARMOR; + return; + } + finishMacro(); // state = States.FINISH; - break; + break; + } } - } - - @Nullable - private Entity getClosestPest() { - Entity closestPest = null; - double closestDistance = Double.MAX_VALUE; - for (Entity entity : pestsLocations) { - double distance = mc.thePlayer.getDistanceToEntity(entity); - if (distance < closestDistance) { - closestDistance = distance; - closestPest = entity; - } + + @Nullable + private Entity getClosestPest() { + Entity closestPest = null; + double closestDistance = Double.MAX_VALUE; + for (Entity entity : pestsLocations) { + double distance = mc.thePlayer.getDistanceToEntity(entity); + if (distance < closestDistance) { + closestDistance = distance; + closestPest = entity; + } + } + return closestPest; } - return closestPest; - } - - public boolean getVacuum(ItemStack currentItem2) { - if (currentItem2 == null || !currentItem2.getDisplayName().contains("Vacuum")) { - int vacuum = InventoryUtils.getSlotIdOfItemInHotbar("Vacuum"); - if (vacuum == -1) { - LogUtils.sendError("[Pests Destroyer] Failed to find vacuum in hotbar!"); - state = States.GO_BACK; - FarmHelperConfig.enablePestsDestroyer = false; + + public boolean getVacuum(ItemStack currentItem2) { + if (currentItem2 == null || !currentItem2.getDisplayName().contains("Vacuum")) { + int vacuum = InventoryUtils.getSlotIdOfItemInHotbar("Vacuum"); + if (vacuum == -1) { + LogUtils.sendError("[Pests Destroyer] Failed to find vacuum in hotbar!"); + state = States.GO_BACK; + FarmHelperConfig.enablePestsDestroyer = false; // finishMacro(); - state = States.FINISH; - return true; - } - mc.thePlayer.inventory.currentItem = vacuum; - delayClock.schedule((long) (200 + Math.random() * 200)); - return true; + state = States.FINISH; + return true; + } + mc.thePlayer.inventory.currentItem = vacuum; + delayClock.schedule((long) (200 + Math.random() * 200)); + return true; + } + return false; } - return false; - } - - private boolean isInventoryOpenDelayed() { - if (mc.currentScreen != null) { - KeyBindUtils.stopMovement(); - delayClock.schedule(300 + (long) (Math.random() * 300)); - Multithreading.schedule(() -> { + + private boolean isInventoryOpenDelayed() { if (mc.currentScreen != null) { - PlayerUtils.closeScreen(); - delayClock.schedule(100 + (long) (Math.random() * 200)); + KeyBindUtils.stopMovement(); + delayClock.schedule(300 + (long) (Math.random() * 300)); + Multithreading.schedule(() -> { + if (mc.currentScreen != null) { + PlayerUtils.closeScreen(); + delayClock.schedule(100 + (long) (Math.random() * 200)); + } + }, (long) (200 + Math.random() * 100), TimeUnit.MILLISECONDS); + return true; } - }, (long) (200 + Math.random() * 100), TimeUnit.MILLISECONDS); - return true; - } - return false; - } - - private boolean isInventoryOpen() { - if (mc.currentScreen != null) { - PlayerUtils.closeScreen(); - delayClock.schedule(500 + (long) (Math.random() * 500)); - return true; + return false; } - return false; - } - - private void finishMacro() { - if (isInventoryOpen()) { - return; - } - if (FlyPathFinderExecutor.getInstance().isPathing()) { - FlyPathFinderExecutor.getInstance().stop(); - } - if (MacroHandler.getInstance().isMacroToggled()) { - stop(); - MacroHandler.getInstance().triggerWarpGarden(true, true, false); - delayClock.schedule(2_000 + Math.random() * 500); - } else { - stop(); - } - } - - private boolean hasBlocksAround() { - Vec3 angle0 = AngleUtils.getVectorForRotation(0, mc.thePlayer.rotationYaw); - Vec3 angle90 = AngleUtils.getVectorForRotation(90, mc.thePlayer.rotationYaw); - Vec3 angle180 = AngleUtils.getVectorForRotation(180, mc.thePlayer.rotationYaw); - Vec3 angle270 = AngleUtils.getVectorForRotation(270, mc.thePlayer.rotationYaw); - Vec3 playerPos = mc.thePlayer.getPositionEyes(1); - if (checkIfBlockExists(angle0, playerPos)) { - return true; - } - if (checkIfBlockExists(angle90, playerPos)) { - return true; - } - if (checkIfBlockExists(angle180, playerPos)) { - return true; - } - return checkIfBlockExists(angle270, playerPos); - } - - private boolean checkIfBlockExists(Vec3 angle0, Vec3 playerPos) { - MovingObjectPosition mop0 = mc.theWorld.rayTraceBlocks(playerPos, - playerPos.addVector(angle0.xCoord * 1.5, angle0.yCoord * 1.5, angle0.zCoord * 1.5), false, true, false); - return mop0 != null && mop0.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK; - } - - @SubscribeEvent(receiveCanceled = true) - public void onChat(ClientChatReceivedEvent event) { - if (event.type != 0 || event.message == null) { - return; - } - String message = StringUtils.stripControlCodes(event.message.getUnformattedText().trim()); - if (message.startsWith("You can't fast travel while in combat!") && enabled) { - LogUtils.sendWarning("[Pests Destroyer] Can't fast travel while in combat, will try again to teleport."); -// Multithreading.schedule(this::finishMacro, 1_000 + (long) (Math.random() * 1_000), TimeUnit.MILLISECONDS); - state = States.FINISH; - return; - } - if (message.toLowerCase().startsWith("there are not any pests on your garden right now") && enabled && state != States.GO_BACK) { - LogUtils.sendDebug("[Pests Destroyer] There are not any Pests on your Garden right now! Keep farming!"); - state = States.GO_BACK; - delayClock.schedule((long) (500 + Math.random() * 500)); - return; - } - if (message.contains("The worm seems to have burrowed")) { - cantReachPest = 0; - return; - } - if (message.contains("Couldn't find Plot")) { - needToUpdatePlots = true; - delayClock.schedule((long) (500 + Math.random() * 500)); + private boolean isInventoryOpen() { + if (mc.currentScreen != null) { + PlayerUtils.closeScreen(); + delayClock.schedule(500 + (long) (Math.random() * 500)); + return true; + } + return false; } - } - private final Color vacuumRangeColor = new Color(200, 30, 30, 100); - @SubscribeEvent - public void onRender(RenderWorldLastEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) { - return; + private void finishMacro() { + if (isInventoryOpen()) { + return; + } + if (FlyPathFinderExecutor.getInstance().isPathing()) { + FlyPathFinderExecutor.getInstance().stop(); + } + if (MacroHandler.getInstance().isMacroToggled()) { + stop(); + MacroHandler.getInstance().triggerWarpGarden(true, true, false); + delayClock.schedule(2_000 + Math.random() * 500); + } else { + stop(); + } } - if (!GameStateHandler.getInstance().inGarden()) { - return; + + private boolean hasBlocksAround() { + Vec3 angle0 = AngleUtils.getVectorForRotation(0, mc.thePlayer.rotationYaw); + Vec3 angle90 = AngleUtils.getVectorForRotation(90, mc.thePlayer.rotationYaw); + Vec3 angle180 = AngleUtils.getVectorForRotation(180, mc.thePlayer.rotationYaw); + Vec3 angle270 = AngleUtils.getVectorForRotation(270, mc.thePlayer.rotationYaw); + Vec3 playerPos = mc.thePlayer.getPositionEyes(1); + if (checkIfBlockExists(angle0, playerPos)) { + return true; + } + if (checkIfBlockExists(angle90, playerPos)) { + return true; + } + if (checkIfBlockExists(angle180, playerPos)) { + return true; + } + return checkIfBlockExists(angle270, playerPos); } - killedEntities.removeIf(e -> !mc.theWorld.loadedEntityList.contains(e)); + private boolean checkIfBlockExists(Vec3 angle0, Vec3 playerPos) { + MovingObjectPosition mop0 = mc.theWorld.rayTraceBlocks(playerPos, + playerPos.addVector(angle0.xCoord * 1.5, angle0.yCoord * 1.5, angle0.zCoord * 1.5), false, true, false); + return mop0 != null && mop0.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK; + } - List pests = mc.theWorld.loadedEntityList.stream().filter(entity -> { - if (entity.isDead) { - return false; - } - if (entity.posY < 50) { - return false; - } - if (entity instanceof EntityArmorStand) { - if (killedEntities.contains(entity)) { - return false; + @SubscribeEvent(receiveCanceled = true) + public void onChat(ClientChatReceivedEvent event) { + if (event.type != 0 || event.message == null) { + return; } - ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); - if (itemStack == null || !itemStack.hasTagCompound()) { - return false; + String message = StringUtils.stripControlCodes(event.message.getUnformattedText().trim()); + if (message.startsWith("You can't fast travel while in combat!") && enabled) { + LogUtils.sendWarning("[Pests Destroyer] Can't fast travel while in combat, will try again to teleport."); +// Multithreading.schedule(this::finishMacro, 1_000 + (long) (Math.random() * 1_000), TimeUnit.MILLISECONDS); + state = States.FINISH; + return; } - String displayName = itemStack.getTagCompound().toString(); - if (displayName.contains("display:")) { - return false; + if (message.toLowerCase().startsWith("there are not any pests on your garden right now") && enabled && state != States.GO_BACK) { + LogUtils.sendDebug("[Pests Destroyer] There are not any Pests on your Garden right now! Keep farming!"); + state = States.GO_BACK; + delayClock.schedule((long) (500 + Math.random() * 500)); + return; } - if (this.pests.stream().noneMatch(pest -> displayName.contains(pest.getSecond()))) { - return false; + if (message.contains("The worm seems to have burrowed")) { + cantReachPest = 0; + return; } - if (killedEntities.contains(entity)) { - return false; + if (message.contains("Couldn't find Plot")) { + needToUpdatePlots = true; + delayClock.schedule((long) (500 + Math.random() * 500)); } - Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); - Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); - if (realEntity != null && (killedEntities.contains(realEntity) || realEntity.isDead)) { - return false; + } + + private final Color vacuumRangeColor = new Color(200, 30, 30, 100); + + @SubscribeEvent + public void onRender(RenderWorldLastEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; } - if (nameEntity != null && (killedEntities.contains(nameEntity))) { - return false; + if (!GameStateHandler.getInstance().inGarden()) { + return; } - if (killedEntities.stream().noneMatch(ke -> ke.getDistanceToEntity(entity) < 1.5)) { - if (!FarmHelperConfig.streamerMode) { - drawESP(entity); - } - return true; + + killedEntities.removeIf(e -> !mc.theWorld.loadedEntityList.contains(e)); + + List pests = mc.theWorld.loadedEntityList.stream().filter(entity -> { + if (entity.isDead) { + return false; + } + if (entity.posY < 50) { + return false; + } + if (entity instanceof EntityArmorStand) { + if (killedEntities.contains(entity)) { + return false; + } + ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); + if (itemStack == null || !itemStack.hasTagCompound()) { + return false; + } + String displayName = itemStack.getTagCompound().toString(); + if (displayName.contains("display:")) { + return false; + } + if (this.pests.stream().noneMatch(pest -> displayName.contains(pest.getSecond()))) { + return false; + } + if (killedEntities.contains(entity)) { + return false; + } + Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); + Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); + if (realEntity != null && (killedEntities.contains(realEntity) || realEntity.isDead)) { + return false; + } + if (nameEntity != null && (killedEntities.contains(nameEntity))) { + return false; + } + if (killedEntities.stream().noneMatch(ke -> ke.getDistanceToEntity(entity) < 1.5)) { + if (!FarmHelperConfig.streamerMode) { + drawESP(entity); + } + return true; + } + return false; + } + return false; + }).collect(Collectors.toList()); + + pestsLocations.clear(); + pestsLocations.addAll(pests); + + if (!FarmHelperConfig.highlightPlotWithPests) { + return; } - return false; - } - return false; - }).collect(Collectors.toList()); - pestsLocations.clear(); - pestsLocations.addAll(pests); + double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; + double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; + double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; + for (int plotNumber : GameStateHandler.getInstance().getInfestedPlots()) { + List> chunks = PlotUtils.getPlotChunksBasedOnNumber(plotNumber); + if (chunks.isEmpty()) { + continue; + } + AxisAlignedBB boundingBox = new AxisAlignedBB(chunks.get(0).getFirst() * 16, 66, chunks.get(0).getSecond() * 16, + chunks.get(chunks.size() - 1).getFirst() * 16 + 16, 80, chunks.get(chunks.size() - 1).getSecond() * 16 + 16); + float centerX = (float) (boundingBox.minX + (boundingBox.maxX - boundingBox.minX) / 2); + float centerZ = (float) (boundingBox.minZ + (boundingBox.maxZ - boundingBox.minZ) / 2); + boundingBox = boundingBox.offset(-d0, -d1, -d2); + RenderUtils.drawBox(boundingBox, FarmHelperConfig.plotHighlightColor.toJavaColor()); + RenderUtils.drawText("Plot " + plotNumber, centerX, 80, centerZ, 1); + } - if (!FarmHelperConfig.highlightPlotWithPests) { - return; - } + if (!FarmHelperConfig.debugMode) { + return; + } - double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; - double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; - double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; - for (int plotNumber : GameStateHandler.getInstance().getInfestedPlots()) { - List> chunks = PlotUtils.getPlotChunksBasedOnNumber(plotNumber); - if (chunks.isEmpty()) { - continue; - } - AxisAlignedBB boundingBox = new AxisAlignedBB(chunks.get(0).getFirst() * 16, 66, chunks.get(0).getSecond() * 16, - chunks.get(chunks.size() - 1).getFirst() * 16 + 16, 80, chunks.get(chunks.size() - 1).getSecond() * 16 + 16); - float centerX = (float) (boundingBox.minX + (boundingBox.maxX - boundingBox.minX) / 2); - float centerZ = (float) (boundingBox.minZ + (boundingBox.maxZ - boundingBox.minZ) / 2); - boundingBox = boundingBox.offset(-d0, -d1, -d2); - RenderUtils.drawBox(boundingBox, FarmHelperConfig.plotHighlightColor.toJavaColor()); - RenderUtils.drawText("Plot " + plotNumber, centerX, 80, centerZ, 1); + ItemStack currentItem = mc.thePlayer.getHeldItem(); + if (currentItem == null || !currentItem.getDisplayName().contains("Vacuum")) { + return; + } + Vec3 lookVec = mc.thePlayer.getLookVec(); + Vec3 playerPos = new Vec3(0, mc.thePlayer.eyeHeight, 0); + Vec3 vacuumRange = playerPos.addVector(lookVec.xCoord * currentVacuumRange, lookVec.yCoord * currentVacuumRange, + lookVec.zCoord * currentVacuumRange); + AxisAlignedBB aabb = new AxisAlignedBB(vacuumRange.xCoord - 0.05, vacuumRange.yCoord - 0.05, vacuumRange.zCoord - 0.05, + vacuumRange.xCoord + 0.05, + vacuumRange.yCoord + 0.05, vacuumRange.zCoord + 0.05); + RenderUtils.drawBox(aabb, vacuumRangeColor); + } + + private void drawESP(Entity entity) { + AxisAlignedBB boundingBox = new AxisAlignedBB(entity.posX - 0.5, entity.posY + entity.getEyeHeight() - 0.35, entity.posZ - 0.5, + entity.posX + 0.5, + entity.posY + entity.getEyeHeight() + 0.65, entity.posZ + 0.5); + double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; + double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; + double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; + boundingBox = boundingBox.offset(-d0, -d1, -d2); + if (FarmHelperConfig.pestsESP) { + Color color = FarmHelperConfig.pestsESPColor.toJavaColor(); + Vec3 entityPos = new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); + double distance = mc.thePlayer.getPositionEyes(1).distanceTo(entityPos); + boolean isInVacuumRange = distance < currentVacuumRange; + if (isInVacuumRange) { + color = new Color(color.getRed(), 255, color.getBlue(), Math.min(50, color.getAlpha())); + } + if (distance > 5) { + try { + EnumChatFormatting distanceColor = distance > currentVacuumRange ? EnumChatFormatting.RED : EnumChatFormatting.GREEN; + ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); + NBTTagCompound tagCompound = itemStack.getTagCompound(); + String texture = tagCompound.getCompoundTag("SkullOwner").getCompoundTag("Properties").getTagList("textures", 10) + .getCompoundTagAt(0) + .getString("Value"); + String pestName = this.pests.stream().filter(pest -> texture.equals(pest.getSecond())).findFirst().get().getFirst(); + RenderUtils.drawText(pestName + String.format(distanceColor + " %.1fm", distance), entity.posX, + entity.posY + entity.getEyeHeight() + 0.65 + 0.5, entity.posZ, (float) (1 + Math.min((distance / 20f), 2f))); + } catch (Exception ignored) { + } + } + RenderUtils.drawBox(boundingBox, color); + } + if (FarmHelperConfig.pestsTracers) { + RenderUtils.drawTracer(new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), + FarmHelperConfig.pestsTracersColor.toJavaColor()); + } } - if (!FarmHelperConfig.debugMode) { - return; + private boolean canEntityBeSeenIgnoreNonCollidable(Entity entity) { + Vec3 vec3 = new Vec3(entity.posX, entity.posY + entity.getEyeHeight() + 0.5, entity.posZ); + Vec3 vec31 = new Vec3(mc.thePlayer.posX, mc.thePlayer.posY + mc.thePlayer.getEyeHeight(), mc.thePlayer.posZ); + MovingObjectPosition mop = mc.theWorld.rayTraceBlocks(vec31, vec3, false, true, false); + return mop == null || mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && ( + mc.theWorld.getBlockState(mop.getBlockPos()).getBlock().equals(Blocks.cactus) || !BlockUtils.hasCollision(mop.getBlockPos())); } - ItemStack currentItem = mc.thePlayer.getHeldItem(); - if (currentItem == null || !currentItem.getDisplayName().contains("Vacuum")) { - return; - } - Vec3 lookVec = mc.thePlayer.getLookVec(); - Vec3 playerPos = new Vec3(0, mc.thePlayer.eyeHeight, 0); - Vec3 vacuumRange = playerPos.addVector(lookVec.xCoord * currentVacuumRange, lookVec.yCoord * currentVacuumRange, - lookVec.zCoord * currentVacuumRange); - AxisAlignedBB aabb = new AxisAlignedBB(vacuumRange.xCoord - 0.05, vacuumRange.yCoord - 0.05, vacuumRange.zCoord - 0.05, vacuumRange.xCoord + 0.05, - vacuumRange.yCoord + 0.05, vacuumRange.zCoord + 0.05); - RenderUtils.drawBox(aabb, vacuumRangeColor); - } - - private void drawESP(Entity entity) { - AxisAlignedBB boundingBox = new AxisAlignedBB(entity.posX - 0.5, entity.posY + entity.getEyeHeight() - 0.35, entity.posZ - 0.5, entity.posX + 0.5, - entity.posY + entity.getEyeHeight() + 0.65, entity.posZ + 0.5); - double d0 = Minecraft.getMinecraft().getRenderManager().viewerPosX; - double d1 = Minecraft.getMinecraft().getRenderManager().viewerPosY; - double d2 = Minecraft.getMinecraft().getRenderManager().viewerPosZ; - boundingBox = boundingBox.offset(-d0, -d1, -d2); - if (FarmHelperConfig.pestsESP) { - Color color = FarmHelperConfig.pestsESPColor.toJavaColor(); - Vec3 entityPos = new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ); - double distance = mc.thePlayer.getPositionEyes(1).distanceTo(entityPos); - boolean isInVacuumRange = distance < currentVacuumRange; - if (isInVacuumRange) { - color = new Color(color.getRed(), 255, color.getBlue(), Math.min(50, color.getAlpha())); - } - if (distance > 5) { - try { - EnumChatFormatting distanceColor = distance > currentVacuumRange ? EnumChatFormatting.RED : EnumChatFormatting.GREEN; - ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4); - NBTTagCompound tagCompound = itemStack.getTagCompound(); - String texture = tagCompound.getCompoundTag("SkullOwner").getCompoundTag("Properties").getTagList("textures", 10).getCompoundTagAt(0) - .getString("Value"); - String pestName = this.pests.stream().filter(pest -> texture.equals(pest.getSecond())).findFirst().get().getFirst(); - RenderUtils.drawText(pestName + String.format(distanceColor + " %.1fm", distance), entity.posX, - entity.posY + entity.getEyeHeight() + 0.65 + 0.5, entity.posZ, (float) (1 + Math.min((distance / 20f), 2f))); - } catch (Exception ignored) { - } - } - RenderUtils.drawBox(boundingBox, color); - } - if (FarmHelperConfig.pestsTracers) { - RenderUtils.drawTracer(new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ), - FarmHelperConfig.pestsTracersColor.toJavaColor()); - } - } - - private boolean canEntityBeSeenIgnoreNonCollidable(Entity entity) { - Vec3 vec3 = new Vec3(entity.posX, entity.posY + entity.getEyeHeight() + 0.5, entity.posZ); - Vec3 vec31 = new Vec3(mc.thePlayer.posX, mc.thePlayer.posY + mc.thePlayer.getEyeHeight(), mc.thePlayer.posZ); - MovingObjectPosition mop = mc.theWorld.rayTraceBlocks(vec31, vec3, false, true, false); - return mop == null || mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && ( - mc.theWorld.getBlockState(mop.getBlockPos()).getBlock().equals(Blocks.cactus) || !BlockUtils.hasCollision(mop.getBlockPos())); - } - - @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) - public void onEntityDeath(LivingDeathEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) { - return; - } - if (!GameStateHandler.getInstance().inGarden()) { - return; - } + @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) + public void onEntityDeath(LivingDeathEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } - Entity entity = event.entity; - LogUtils.sendDebug("[Pests Destroyer] Entity died: " + entity.getName() + "(" + entity.getEntityId() + ")" + " at: " + entity.getPosition()); - killedEntities.add(entity); - if (mc.thePlayer.getDistanceToEntity(entity) < 20) { - lastKillTimestamp = System.currentTimeMillis(); - previousCurrentPlotPestsCount = GameStateHandler.getInstance().getCurrentPlotPestsCount(); - state = States.CHECK_ANOTHER_PEST; - } - if (entity instanceof EntityArmorStand) { - Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); - Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); - if (realEntity != null) { - LogUtils.sendDebug("[Pests Destroyer] Found real entity: " + realEntity.getName() + "(" + realEntity.getEntityId() + ")" + " at: " - + realEntity.getPosition()); - killedEntities.add(realEntity); - } - if (nameEntity != null) { - LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " - + nameEntity.getPosition()); - killedEntities.add(nameEntity); - } - } - if (entity instanceof EntityBat || entity instanceof EntitySilverfish) { - Entity armorStand = PlayerUtils.getEntityCuttingOtherEntity(entity, - (e) -> e instanceof EntityArmorStand && e.getName().contains("Armor Stand")); - Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != armorStand); - if (armorStand != null) { - LogUtils.sendDebug("[Pests Destroyer] Found armor stand: " + armorStand.getName() + "(" + armorStand.getEntityId() + ")" + " at: " - + armorStand.getPosition()); - killedEntities.add(armorStand); - } - if (nameEntity != null) { - LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " - + nameEntity.getPosition()); - killedEntities.add(nameEntity); - } - } - if (isRunning()) { - FlyPathFinderExecutor.getInstance().stop(); - } - resetFireworkInfo(); - lastFireworkTime = 0; - currentEntityTarget.ifPresent(e -> { - if (!e.equals(event.entity)) { - return; - } - if (isRunning()) { - KeyBindUtils.stopMovement(); - } - currentEntityTarget = Optional.empty(); - stuckClock.reset(); - }); - PlotUtils.Plot plot = PlotUtils.getPlotNumberBasedOnLocation(entity.getPosition()); - if (plot == null) { - if (isRunning()) { - LogUtils.sendDebug("[Pests Destroyer] Failed to get plot for entity: " + entity.getName() + " at: " + entity.getPosition()); - } - return; - } - LogUtils.sendDebug("[Pests Destroyer] Removed 1 pest from plot number: " + plot.number); - killedPestsFrom.add(plot.number); - } - - private final List locations = new ArrayList<>(); - private Vec3 firstLocation = null; - private Vec3 lastLocation = null; - - @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) - public void onFirework(SpawnParticleEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) { - return; - } - if (!GameStateHandler.getInstance().inGarden()) { - return; - } - if (!enabled) { - return; - } - if (state != States.WAIT_FOR_LOCATION) { - return; + Entity entity = event.entity; + LogUtils.sendDebug("[Pests Destroyer] Entity died: " + entity.getName() + "(" + entity.getEntityId() + ")" + " at: " + entity.getPosition()); + killedEntities.add(entity); + if (mc.thePlayer.getDistanceToEntity(entity) < 20) { + lastKillTimestamp = System.currentTimeMillis(); + previousCurrentPlotPestsCount = GameStateHandler.getInstance().getCurrentPlotPestsCount(); + state = States.CHECK_ANOTHER_PEST; + } + if (entity instanceof EntityArmorStand) { + Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish); + Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != entity); + if (realEntity != null) { + LogUtils.sendDebug("[Pests Destroyer] Found real entity: " + realEntity.getName() + "(" + realEntity.getEntityId() + ")" + " at: " + + realEntity.getPosition()); + killedEntities.add(realEntity); + } + if (nameEntity != null) { + LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " + + nameEntity.getPosition()); + killedEntities.add(nameEntity); + } + } + if (entity instanceof EntityBat || entity instanceof EntitySilverfish) { + Entity armorStand = PlayerUtils.getEntityCuttingOtherEntity(entity, + (e) -> e instanceof EntityArmorStand && e.getName().contains("Armor Stand")); + Entity nameEntity = PlayerUtils.getEntityCuttingOtherEntity(entity, (e) -> e instanceof EntityArmorStand && e != armorStand); + if (armorStand != null) { + LogUtils.sendDebug("[Pests Destroyer] Found armor stand: " + armorStand.getName() + "(" + armorStand.getEntityId() + ")" + " at: " + + armorStand.getPosition()); + killedEntities.add(armorStand); + } + if (nameEntity != null) { + LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: " + + nameEntity.getPosition()); + killedEntities.add(nameEntity); + } + } + if (isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + } + resetFireworkInfo(); + lastFireworkTime = 0; + currentEntityTarget.ifPresent(e -> { + if (!e.equals(event.entity)) { + return; + } + if (isRunning()) { + KeyBindUtils.stopMovement(); + } + currentEntityTarget = Optional.empty(); + stuckClock.reset(); + }); + PlotUtils.Plot plot = PlotUtils.getPlotNumberBasedOnLocation(entity.getPosition()); + if (plot == null) { + if (isRunning()) { + LogUtils.sendDebug("[Pests Destroyer] Failed to get plot for entity: " + entity.getName() + " at: " + entity.getPosition()); + } + return; + } + LogUtils.sendDebug("[Pests Destroyer] Removed 1 pest from plot number: " + plot.number); + killedPestsFrom.add(plot.number); } - EnumParticleTypes type = event.getParticleTypes(); - if (type != EnumParticleTypes.VILLAGER_ANGRY) { - return; - } + private final List locations = new ArrayList<>(); + private Vec3 firstLocation = null; + private Vec3 lastLocation = null; - lastFireworkTime = System.currentTimeMillis(); - if (firstLocation == null) { - if (mc.thePlayer.getPositionVector().distanceTo(event.getPos()) > 5) { - return; - } - firstLocation = event.getPos(); - locations.add(firstLocation); - lastLocation = firstLocation; - return; - } - double dist = lastLocation.distanceTo(event.getPos()); - if (dist > 1.75) { - return; - } - locations.add(event.getPos()); - lastLocation = event.getPos(); - } + @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST) + public void onFirework(SpawnParticleEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (!enabled) { + return; + } + if (state != States.WAIT_FOR_LOCATION) { + return; + } - private Vec3 calculateWaypoint() { - if (lastLocation == null) { - return null; - } - Vec3 direction = lastLocation.subtract(firstLocation).normalize(); - return lastLocation.addVector(direction.xCoord * 10, 0, direction.zCoord * 10); - } - - public void resetFireworkInfo() { - locations.clear(); - firstLocation = null; - lastLocation = null; - lastFireworkTime = 0; - } - - @SubscribeEvent - public void onSpawnObject(SpawnObjectEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) { - return; - } - if (!GameStateHandler.getInstance().inGarden()) { - return; - } - if (event.type != 76) { - return; - } - if (!enabled) { - return; + EnumParticleTypes type = event.getParticleTypes(); + if (type != EnumParticleTypes.VILLAGER_ANGRY) { + return; + } + + lastFireworkTime = System.currentTimeMillis(); + if (firstLocation == null) { + if (mc.thePlayer.getPositionVector().distanceTo(event.getPos()) > 5) { + return; + } + firstLocation = event.getPos(); + locations.add(firstLocation); + lastLocation = firstLocation; + return; + } + double dist = lastLocation.distanceTo(event.getPos()); + if (dist > 1.75) { + return; + } + locations.add(event.getPos()); + lastLocation = event.getPos(); } - if (state != States.WAIT_FOR_LOCATION) { - return; + + private Vec3 calculateWaypoint() { + if (lastLocation == null) { + return null; + } + Vec3 direction = lastLocation.subtract(firstLocation).normalize(); + return lastLocation.addVector(direction.xCoord * 10, 0, direction.zCoord * 10); } - double distance = mc.thePlayer.getDistance(event.pos.xCoord, event.pos.yCoord, event.pos.zCoord); - if (distance < 3) { - int y = 130; - Block block = mc.theWorld.getBlockState(new BlockPos(event.pos.xCoord, y, event.pos.zCoord)).getBlock(); - while (y > 90 && block.equals(Blocks.air)) { - y--; - } - y += 3; - FlyPathFinderExecutor.getInstance().setDontRotate(true); - FlyPathFinderExecutor.getInstance().setSprinting(false); - FlyPathFinderExecutor.getInstance().findPath(new Vec3(event.pos.xCoord, y, event.pos.zCoord), true, true); - LogUtils.sendWarning( - "[Pests Destroyer] Firework is too close to player. Flying to x: " + event.pos.xCoord + " y: " + y + " z: " + event.pos.zCoord); - state = States.GET_LOCATION; + public void resetFireworkInfo() { + locations.clear(); + firstLocation = null; + lastLocation = null; + lastFireworkTime = 0; } - } - private boolean checkedThisGui = false; + @SubscribeEvent + public void onSpawnObject(SpawnObjectEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (event.type != 76) { + return; + } + if (!enabled) { + return; + } + if (state != States.WAIT_FOR_LOCATION) { + return; + } - @SubscribeEvent - public void onGuiOpen(DrawScreenAfterEvent event) { - if (mc.thePlayer == null || mc.theWorld == null) { - return; - } - if (!GameStateHandler.getInstance().inGarden()) { - return; - } - if (checkedThisGui) { - return; - } - if (!(event.guiScreen instanceof GuiChest)) { - return; - } - String guiName = InventoryUtils.getInventoryName(); - if (guiName == null) { - return; - } - if (!delayClock.passed()) { - return; + double distance = mc.thePlayer.getDistance(event.pos.xCoord, event.pos.yCoord, event.pos.zCoord); + if (distance < 3) { + int y = 130; + Block block = mc.theWorld.getBlockState(new BlockPos(event.pos.xCoord, y, event.pos.zCoord)).getBlock(); + while (y > 90 && block.equals(Blocks.air)) { + y--; + } + y += 3; + FlyPathFinderExecutor.getInstance().setDontRotate(true); + FlyPathFinderExecutor.getInstance().setSprinting(false); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(event.pos.xCoord, y, event.pos.zCoord), true, true); + LogUtils.sendWarning( + "[Pests Destroyer] Firework is too close to player. Flying to x: " + event.pos.xCoord + " y: " + y + " z: " + event.pos.zCoord); + state = States.GET_LOCATION; + } } - ContainerChest guiChest = (ContainerChest) ((GuiChest) event.guiScreen).inventorySlots; - if (!InventoryUtils.isInventoryLoaded()) { - return; - } + private boolean checkedThisGui = false; - int plotCounter = 0; - if (StringUtils.stripControlCodes(guiName).equals("Configure Plots")) { - for (int i = 0; i < guiChest.inventorySlots.size(); i++) { - Slot slot = guiChest.inventorySlots.get(i); - if (slot == null || !slot.getHasStack()) { - continue; - } - if (slot.getStack().getDisplayName().contains("Plot")) { - String displayName = StringUtils.stripControlCodes(slot.getStack().getDisplayName()); - try { - String plotName = displayName.replace("Plot - ", "").trim(); - int plotNumber = PlotUtils.getPLOT_NUMBERS().get(plotCounter); - PlotUtils.setPlot(plotNumber, plotName); - } catch (Exception e) { - LogUtils.sendError("[Pests Destroyer] Failed to parse plot number: " + displayName); - } - plotCounter++; - } else if (StringUtils.stripControlCodes(slot.getStack().getDisplayName()).equals("The Barn")) { - plotCounter++; - } - } - - } else { - return; - } - needToUpdatePlots = false; - checkedThisGui = true; - PlotUtils.savePlots(); - LogUtils.sendDebug("[Pests Destroyer] Updated plots"); - if (state == States.WAIT_FOR_INFO) { - PlayerUtils.closeScreen(); - if (FarmHelperConfig.dontTeleportToPlots) { - state = States.GET_CLOSEST_PLOT; - } else { - state = States.TELEPORT_TO_PLOT; - } - delayClock.schedule(300 + (long) (Math.random() * 250)); - } - } + @SubscribeEvent + public void onGuiOpen(DrawScreenAfterEvent event) { + if (mc.thePlayer == null || mc.theWorld == null) { + return; + } + if (!GameStateHandler.getInstance().inGarden()) { + return; + } + if (checkedThisGui) { + return; + } + if (!(event.guiScreen instanceof GuiChest)) { + return; + } + String guiName = InventoryUtils.getInventoryName(); + if (guiName == null) { + return; + } + if (!delayClock.passed()) { + return; + } + ContainerChest guiChest = (ContainerChest) ((GuiChest) event.guiScreen).inventorySlots; - private final Clock flyDelay = new Clock(); + if (!InventoryUtils.isInventoryLoaded()) { + return; + } - private void fly() { - if (mc.thePlayer.capabilities.isFlying) { - KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); - return; - } - if (mc.thePlayer.motionY < -0.0784000015258789 || BlockUtils.getRelativeBlock(0, 0, 0).getMaterial().isLiquid()) { - if (flyDelay.passed()) { - if (!mc.thePlayer.capabilities.isFlying) { - mc.thePlayer.capabilities.isFlying = true; - mc.thePlayer.sendPlayerAbilities(); - } - flyDelay.reset(); - } else if (flyDelay.isScheduled()) { - return; - } - } - if (mc.thePlayer.onGround) { - mc.thePlayer.jump(); - flyDelay.schedule(80 + (long) (Math.random() * 80)); - } else if (!mc.thePlayer.capabilities.isFlying && !flyDelay.isScheduled()) { - flyDelay.schedule(80 + (long) (Math.random() * 80)); - } - } + int plotCounter = 0; + if (StringUtils.stripControlCodes(guiName).equals("Configure Plots")) { + for (int i = 0; i < guiChest.inventorySlots.size(); i++) { + Slot slot = guiChest.inventorySlots.get(i); + if (slot == null || !slot.getHasStack()) { + continue; + } + if (slot.getStack().getDisplayName().contains("Plot")) { + String displayName = StringUtils.stripControlCodes(slot.getStack().getDisplayName()); + try { + String plotName = displayName.replace("Plot - ", "").trim(); + int plotNumber = PlotUtils.getPLOT_NUMBERS().get(plotCounter); + PlotUtils.setPlot(plotNumber, plotName); + } catch (Exception e) { + LogUtils.sendError("[Pests Destroyer] Failed to parse plot number: " + displayName); + } + plotCounter++; + } else if (StringUtils.stripControlCodes(slot.getStack().getDisplayName()).equals("The Barn")) { + plotCounter++; + } + } - private PlotUtils.Plot getClosestPlot() { - List infestedPlots = GameStateHandler.getInstance().getInfestedPlots(); - if (infestedPlots.isEmpty()) { - LogUtils.sendError("[Pests Destroyer] Couldn't find infested plots on Tablist! Make sure you have it enabled in Tablist Widgets"); - return null; - } - if (GameStateHandler.getInstance().getCurrentPlotPestsCount() == 0) { - infestedPlots.removeIf(killedPestsFrom::contains); - } - PlotUtils.Plot closestPlot = null; - double closestDistance = Double.MAX_VALUE; - for (int plot : infestedPlots) { - double distance = mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plot)); - if (distance < closestDistance) { - closestDistance = distance; - closestPlot = PlotUtils.getPlotBasedOnNumber(plot); - } + } else { + return; + } + needToUpdatePlots = false; + checkedThisGui = true; + PlotUtils.savePlots(); + LogUtils.sendDebug("[Pests Destroyer] Updated plots"); + if (state == States.WAIT_FOR_INFO) { + PlayerUtils.closeScreen(); + if (FarmHelperConfig.dontTeleportToPlots) { + state = States.GET_CLOSEST_PLOT; + } else { + state = States.TELEPORT_TO_PLOT; + } + delayClock.schedule(300 + (long) (Math.random() * 250)); + } } - if (closestPlot == null) { - LogUtils.sendDebug("[Pests Destroyer] Failed to get closest plot"); - return null; + + private final Clock flyDelay = new Clock(); + + private void fly() { + if (mc.thePlayer.capabilities.isFlying) { + KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); + return; + } + if (mc.thePlayer.motionY < -0.0784000015258789 || BlockUtils.getRelativeBlock(0, 0, 0).getMaterial().isLiquid()) { + if (flyDelay.passed()) { + if (!mc.thePlayer.capabilities.isFlying) { + mc.thePlayer.capabilities.isFlying = true; + mc.thePlayer.sendPlayerAbilities(); + } + flyDelay.reset(); + } else if (flyDelay.isScheduled()) { + return; + } + } + if (mc.thePlayer.onGround) { + mc.thePlayer.jump(); + flyDelay.schedule(80 + (long) (Math.random() * 80)); + } else if (!mc.thePlayer.capabilities.isFlying && !flyDelay.isScheduled()) { + flyDelay.schedule(80 + (long) (Math.random() * 80)); + } } - return closestPlot; - } - private boolean isNearPlotCenter() { - if (!closestPlot.isPresent()) { - return false; + private PlotUtils.Plot getClosestPlot() { + List infestedPlots = GameStateHandler.getInstance().getInfestedPlots(); + if (infestedPlots.isEmpty()) { + LogUtils.sendError("[Pests Destroyer] Couldn't find infested plots on Tablist! Make sure you have it enabled in Tablist Widgets"); + return null; + } + if (GameStateHandler.getInstance().getCurrentPlotPestsCount() == 0) { + infestedPlots.removeIf(killedPestsFrom::contains); + } + PlotUtils.Plot closestPlot = null; + double closestDistance = Double.MAX_VALUE; + for (int plot : infestedPlots) { + double distance = mc.thePlayer.getDistanceSqToCenter(PlotUtils.getPlotCenter(plot)); + if (distance < closestDistance) { + closestDistance = distance; + closestPlot = PlotUtils.getPlotBasedOnNumber(plot); + } + } + if (closestPlot == null) { + LogUtils.sendDebug("[Pests Destroyer] Failed to get closest plot"); + return null; + } + return closestPlot; + } + + private boolean isNearPlotCenter() { + if (!closestPlot.isPresent()) { + return false; + } + BlockPos plotCenter = PlotUtils.getPlotCenter(closestPlot.get().number); + double distance = mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()); + return distance < 15; + } + + public enum States { + IDLE, + SWAP_ARMOR, + ARMOR_SWAP_VERIFY, + OPEN_DESK, + OPEN_PLOTS, + WAIT_FOR_INFO, + TELEPORT_TO_PLOT, + WAIT_FOR_TP, + CHECKING_PLOT, + CHECKING_SPAWN, + GET_CLOSEST_PLOT, + FLY_TO_THE_CLOSEST_PLOT, + GET_LOCATION, + WAIT_FOR_LOCATION, + FIND_PEST, + KILL_PEST, + CHECK_ANOTHER_PEST, + GO_BACK, + FINISH + } + + enum RotationState { + NONE, + CLOSE, + MEDIUM, + FAR + } + + public enum EscapeState { + NONE, + GO_TO_HUB, + GO_TO_GARDEN, + RESUME_MACRO } - BlockPos plotCenter = PlotUtils.getPlotCenter(closestPlot.get().number); - double distance = mc.thePlayer.getDistance(plotCenter.getX(), mc.thePlayer.posY, plotCenter.getZ()); - return distance < 15; - } - - public enum States { - IDLE, - SWAP_ARMOR, - ARMOR_SWAP_VERIFY, - OPEN_DESK, - OPEN_PLOTS, - WAIT_FOR_INFO, - TELEPORT_TO_PLOT, - WAIT_FOR_TP, - CHECKING_PLOT, - CHECKING_SPAWN, - GET_CLOSEST_PLOT, - FLY_TO_THE_CLOSEST_PLOT, - GET_LOCATION, - WAIT_FOR_LOCATION, - FIND_PEST, - KILL_PEST, - CHECK_ANOTHER_PEST, - GO_BACK, - FINISH - } - - enum RotationState { - NONE, - CLOSE, - MEDIUM, - FAR - } - - public enum EscapeState { - NONE, - GO_TO_HUB, - GO_TO_GARDEN, - RESUME_MACRO - } } From af45e2cafb80158ade90ad01f0609efeb880ebff Mon Sep 17 00:00:00 2001 From: Osama Date: Mon, 24 Feb 2025 18:51:00 +0600 Subject: [PATCH 06/19] A --- gradle.properties | 2 +- .../command/FarmHelperMainCommand.java | 29 +- .../farmhelperv2/config/FarmHelperConfig.java | 96 +++- .../farmhelperv2/feature/FeatureManager.java | 7 +- .../feature/impl/AutoSprayonator.java | 7 +- .../feature/impl/AutoWardrobe.java | 80 +++- .../farmhelperv2/feature/impl/PestFarmer.java | 441 ++++++++++++++++-- .../feature/impl/PestsDestroyer.java | 55 ++- .../feature/impl/VisitorsMacro.java | 5 +- .../farmhelperv2/handler/MacroHandler.java | 1 + .../farmhelperv2/macro/AbstractMacro.java | 6 +- .../pathfinder/FlyPathFinderExecutor.java | 29 +- .../jelly/farmhelperv2/util/PlayerUtils.java | 5 + 13 files changed, 688 insertions(+), 75 deletions(-) diff --git a/gradle.properties b/gradle.properties index 7af6b265f..68e460293 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ baseGroup=com.jelly.farmhelperv2 mcVersion=1.8.9 modid=farmhelperv2 modName=FarmHelper -version=2.9.0 +version=2.9.9 shouldRelease=true diff --git a/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java b/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java index 9c1bc20f3..74f39556b 100644 --- a/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java +++ b/src/main/java/com/jelly/farmhelperv2/command/FarmHelperMainCommand.java @@ -16,6 +16,8 @@ import net.minecraft.util.Vec3; import java.util.Optional; +import java.util.Arrays; +import java.lang.Float; @Command(value = "fh", aliases = {"farmhelper"}, description = "FarmHelper main command") public class FarmHelperMainCommand { @@ -59,6 +61,21 @@ public void pathfind(int x, int y, int z, FlyPathFinderExecutor.getInstance().findPath(new Vec3(x, y, z), follow, smooth); } + @SubCommand(aliases = {"pf"}) + public void pathfind(String x, String y, String z, String threshold, + @Description(value = "Tell the pathfinder, to constantly follow and recalibrate path until arrive", autoCompletesTo = {"true", "false"}) boolean follow, + @Description(value = "Tell the pathfinder, to smooth out the path", autoCompletesTo = {"true", "false"}) boolean smooth, + @Description(value = "Tell to pathfinder, to sprint while flying") boolean sprint) { + try { + FlyPathFinderExecutor.getInstance().setStoppingPositionThreshold(Float.valueOf(threshold)); + FlyPathFinderExecutor.getInstance().setSprinting(sprint); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(Float.valueOf(x), Float.valueOf(y), Float.valueOf(z)), follow, smooth); + } catch (Exception e) { + LogUtils.sendError("Could not. KYS"); + e.printStackTrace(); + } + } + @SubCommand(aliases = {"sp"}) public void stoppath() { FlyPathFinderExecutor.getInstance().stop(); @@ -69,4 +86,14 @@ public void update() { PlayerUtils.closeScreen(); FarmHelperConfig.checkForUpdate(); } -} \ No newline at end of file + + @SubCommand(aliases = {"stp"}) + public void swapToPest() { + AutoWardrobe.instance.swapTo(FarmHelperConfig.pestFarmingSet0Slot, Arrays.asList(FarmHelperConfig.pestFarmingEq0.split("\\|"))); + } + + @SubCommand(aliases = {"stf"}) + public void swapToFarm() { + AutoWardrobe.instance.swapTo(FarmHelperConfig.pestFarmingSet1Slot, Arrays.asList(FarmHelperConfig.pestFarmingEq1.split("\\|"))); + } +} diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index 04743128f..fb10e0d30 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -212,6 +212,27 @@ public class FarmHelperConfig extends Config { ) public static int spawnPosZ = 0; + @Number( + name = "Yaw", category = GENERAL, subcategory = "Spawn Position", + description = "The Yaw of the spawn", + min = -180.0f, max = 180.0f + ) + public static float spawnYaw = 0; + + @Number( + name = "Pitch", category = GENERAL, subcategory = "Spawn Position", + description = "The Pitch of the spawn", + min = -90.0f, max = 90.0f + ) + public static float spawnPitch = 0; + + @Number( + name = "Spawn Plot", category = GENERAL, subcategory = "Spawn Position", + description = "The Plot that the spawn is in", + min = 0, max = 24 + ) + public static int spawnPlot = 0; + @Button( name = "Set SpawnPos", category = GENERAL, subcategory = "Spawn Position", description = "Sets the spawn position to your current position", @@ -268,6 +289,12 @@ public class FarmHelperConfig extends Config { description = "Cancels failsafe and continues macroing", size = 2 ) public static OneKeyBind cancelFailsafeKeybind = new OneKeyBind(Keyboard.KEY_NONE); + + @KeyBind( + name = "Tp To Infested Plot", category = MISCELLANEOUS, subcategory = "Keybinds", + description = "Teleport to a plot with pest for skyhanni haters :D", size = 2 + ) + public static OneKeyBind tpToInfestedPlot = new OneKeyBind(Keyboard.KEY_NONE); // // @@ -1231,7 +1258,7 @@ public class FarmHelperConfig extends Config { @Switch( name = "Pause the Pests Destroyer during Jacob's contests", category = PESTS_DESTROYER, subcategory = "Pests Destroyer", description = "Pauses the Pests Destroyer during Jacob's contests", - size = 2 + size = 1 ) public static boolean pausePestsDestroyerDuringJacobsContest = true; @@ -1323,6 +1350,20 @@ public static void triggerManuallyPestsDestroyer() { min = 1, max = 18 ) public static int pestArmorSlot1 = 1; + + @Switch( + name = "Swap Equipments", category = PESTS_DESTROYER, subcategory = "Armor Swapper", + description = "Swap Equipments or not" + ) + public static boolean pestSwapEquipments = false; + + @Text( + name = "Pest Swap Equipments", category = PESTS_DESTROYER, subcategory = "Armor Swapper", size=2, + description = "Separate Equipment Names With |", placeholder = "Pesthunter's Necklace|Pesthunter's Cloak|Pesthunter's Belt" + ) + public static String pestSwapEq = ""; + + // // @@ -1394,12 +1435,6 @@ public static void triggerManuallyPestsDestroyer() { ) public static boolean pestFarming = false; - @Switch( - name = "Hold Daedalus Axe", category = PEST_FARMER, - description = "Farms with daedalus axe while waiting for pests to spawn" - ) - public static boolean pestFarmingHoldDaedalus = false; - @Slider( name = "Farming Armor Slot", category = PEST_FARMER, min = 1, max = 18 @@ -1419,6 +1454,40 @@ public static void triggerManuallyPestsDestroyer() { ) public static int pestFarmingWaitTime = 255; + @Switch( + name = "Swap Equipments", category = PEST_FARMER + ) + public static boolean pestFarmingSwapEq = false; + + @Text( + name = "Farming Fortune Equipments", category = PEST_FARMER, size=2, + description = "Separate Equipment Names With |", placeholder = "Lotus Necklace|Lotus Cloak|Lotus Belt" + ) + public static String pestFarmingEq0 = ""; + + @Text( + name = "Pest Chance Equipments", category = PEST_FARMER, size=2, + description = "Separate Equipment Names With |", placeholder = "Pesthunter's Necklace|Pesthunter's Cloak|Pesthunter's Belt" + ) + public static String pestFarmingEq1 = ""; + + @Slider( + name = "Equipment Click Delay", category = PEST_FARMER, + min = 50, max = 2000, step = 10 + ) + public static int pestFarmerEquipmentClickDelay = 400; + + @Switch( + name = "Start Pests Destroyer During Farming", category = PEST_FARMER + ) + public static boolean pestFarmerKillPests = false; + + @Slider( + name = "Pest Count to Start Killing At", category = PEST_FARMER, + min = 1, max = 8 + ) + public static int pestFarmerStartKillAt = 1; + @Info( text = "It's supposed to swap armor before pest spawns, swap back after pest spawns and kill with Pest Destryoer/the other one.", type = InfoType.INFO, category = PEST_FARMER, size = 2 @@ -2361,7 +2430,13 @@ public FarmHelperConfig() { this.addDependency("rotationTimeRandomnessDuringJacob", "customRotationDelaysDuringJacob"); this.addDependency("pestArmorSlot0", "pestSwapArmorBefore"); - this.addDependency("pestArmorSlot1", "pestSwapArmorAfter"); + this.addDependency("pestArmorSlot0", "pestSwapArmorBefore"); + this.addDependency("pestFarmingEq0", "pestFarmingSwapEq"); + this.addDependency("pestFarmingEq1", "pestFarmingSwapEq"); + this.addDependency("pestFarmerEquipmentClickDelay", "pestFarmingSwapEq"); + this.addDependency("pestFarmerStartKillAt", "pestFarmerKillPests"); + + this.addDependency("pestSwapEq", "pestSwapEquipments"); this.addDependency("leaveTime", "leaveTimer"); @@ -2386,6 +2461,11 @@ public FarmHelperConfig() { LogUtils.sendWarning("[Failsafe] Emergency has been cancelled!"); } }); + registerKeyBind(tpToInfestedPlot, () -> { + List infestedPlots = GameStateHandler.getInstance().getInfestedPlots(); + if (infestedPlots.isEmpty()) return; + mc.thePlayer.sendChatMessage("/plottp " + infestedPlots.get(0)); + }); // registerKeyBind(debugKeybind2, () -> { // MovingObjectPosition objectMouseOver = Minecraft.getMinecraft().objectMouseOver; // if (objectMouseOver != null && objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { diff --git a/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java index e571d82cf..5ffa1dd35 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java @@ -103,8 +103,8 @@ public boolean shouldIgnoreFalseCheck() { if (AutoReconnect.getInstance().isRunning() && !AutoReconnect.getInstance().shouldCheckForFailsafes()) { return true; } - if (PestsDestroyer.getInstance().isRunning()) { - if (!PestsDestroyer.getInstance().shouldCheckForFailsafes()) return true; + if (PestsDestroyer.getInstance().isRunning() && !PestsDestroyer.getInstance().shouldCheckForFailsafes()) { + return true; } if (PlotCleaningHelper.getInstance().isRunning() && !PlotCleaningHelper.getInstance().shouldCheckForFailsafes()) { return true; @@ -115,6 +115,9 @@ public boolean shouldIgnoreFalseCheck() { if (AutoPestExchange.getInstance().isRunning() && !AutoPestExchange.getInstance().shouldCheckForFailsafes()) { return true; } + if (PestFarmer.instance.isRunning() && !PestFarmer.instance.shouldCheckForFailsafes()) { + return true; + } return false; } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java index b02874164..fd885bc73 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java @@ -140,10 +140,15 @@ public void onTablistUpdate(UpdateTablistEvent event) { return; } if (GameStateHandler.getInstance().getSprayonatorState() != BuffState.NOT_ACTIVE) { + if (this.timer.isScheduled()) this.timer.reset(); return; } - this.start(); + if (!this.timer.isScheduled()) { + this.timer.schedule(5000); + } else if (this.timer.passed()) { + this.start(); + } } @SubscribeEvent diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java index cdcb7de12..47ad62c83 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java @@ -16,6 +16,9 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import java.util.List; +import java.util.ArrayList; public class AutoWardrobe implements IFeature { @@ -24,6 +27,9 @@ public class AutoWardrobe implements IFeature { private final Minecraft mc = Minecraft.getMinecraft(); private boolean enabled = false; private int swapTo = -1; + private int invStart = 54; + private int invEnd = 54; + private List equipmentsToSwapTo = new ArrayList<>(); private State state = State.STARTING; private Clock timer = new Clock(); @@ -49,7 +55,7 @@ public boolean shouldStartAtMacroStart() { @Override public void resetStatesAfterMacroDisabled() { - activeSlot = -1; + // activeSlot = -1; } @Override @@ -72,6 +78,16 @@ public void swapTo(int slot) { LogUtils.sendSuccess("[AutoWardrobe] Starting. Swapping to slot " + slot); } + public void swapTo(int slot, List equipments) { + if (slot< 1 || slot > 18) { + return; + } + swapTo = slot; + equipmentsToSwapTo = new ArrayList(equipments); + enabled = true; + LogUtils.sendSuccess("[AutoWardrobe] Starting. Swapping to slot " + slot + ", and equipments: " + equipments); + } + @Override public void stop() { if (!enabled) { @@ -79,6 +95,9 @@ public void stop() { } enabled = false; swapTo = -1; + invStart = 54; + invEnd = 54; + equipmentsToSwapTo.clear(); state = State.STARTING; timer.reset(); @@ -103,7 +122,7 @@ public boolean hasTimerEnded() { @SubscribeEvent public void onTick(ClientTickEvent event) { - if (!enabled) { + if (!enabled || mc.thePlayer == null || event.phase != Phase.START) { return; } @@ -126,7 +145,7 @@ public void onTick(ClientTickEvent event) { return; } - if (inventoryName().startsWith("Wardrobe")) { + if (inventoryName().startsWith("Wardrobe") && InventoryUtils.isInventoryLoaded()) { setState(State.NAVIGATING, FarmHelperConfig.getRandomGUIMacroDelay()); } break; @@ -168,20 +187,63 @@ public void onTick(ClientTickEvent event) { activeSlot = swapTo; setState(State.WAITING, FarmHelperConfig.getRandomGUIMacroDelay()); break; + // this is just here to give a bit extra pause before it stops case WAITING: if (isTimerRunning()) { return; } - PlayerUtils.closeScreen(); - setState(State.ENDING, FarmHelperConfig.getRandomGUIMacroDelay()); + if (equipmentsToSwapTo.isEmpty()) { + PlayerUtils.closeScreen(); + setState(State.ENDING, FarmHelperConfig.getRandomGUIMacroDelay()); + } else { + setState(State.OPENING_EQ, 0); + } + break; + case OPENING_EQ: + if (isTimerRunning()) { + return; + } + mc.thePlayer.sendChatMessage("/eq"); + setState(State.EQ_VERIFY, 2000); + break; + case EQ_VERIFY: + if (hasTimerEnded()) { + LogUtils.sendError("Could not open eq in under 2 seconds. Stopping"); + setState(State.WAITING, 0); + return; + } + + if (inventoryName().startsWith("Your Equipment") && InventoryUtils.isInventoryLoaded()) { + setState(State.SWAPPING_EQUIPMENT, FarmHelperConfig.getRandomGUIMacroDelay()); + invStart = 54; + invEnd = mc.thePlayer.openContainer.inventorySlots.size(); + } + break; + case SWAPPING_EQUIPMENT: + if (isTimerRunning()) { + return; + } + + for (; invStart < invEnd; invStart++) { + slot = mc.thePlayer.openContainer.getSlot(invStart); + if (slot.getHasStack()) { + ItemStack stack = slot.getStack(); + if (stack.hasDisplayName() && equipmentsToSwapTo.removeIf(it -> stack.getDisplayName().contains(it.trim()))) { + InventoryUtils.clickContainerSlot(invStart, ClickType.LEFT, ClickMode.PICKUP); + timer.schedule(FarmHelperConfig.pestFarmerEquipmentClickDelay); + return; + } + } + } + equipmentsToSwapTo.clear(); + setState(State.WAITING, FarmHelperConfig.getRandomGUIMacroDelay()); break; - // this is just here to give a bit extra pause before it stops case ENDING: if (isTimerRunning()) { return; } - stop(); - break; + stop(); + break; } } @@ -203,6 +265,6 @@ private String inventoryName() { enum State { - STARTING, OPENING_WD, WD_VERIFY, NAVIGATING, NAVIGATION_VERIFY, CLICKING_SLOT, WAITING, ENDING + STARTING, OPENING_WD, WD_VERIFY, NAVIGATING, NAVIGATION_VERIFY, CLICKING_SLOT, WAITING, OPENING_EQ, EQ_VERIFY, SWAPPING_EQUIPMENT, ENDING } } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index 688a751d3..d7c5864bf 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -5,27 +5,49 @@ import com.jelly.farmhelperv2.failsafe.FailsafeManager; import com.jelly.farmhelperv2.feature.FeatureManager; import com.jelly.farmhelperv2.feature.IFeature; +import com.jelly.farmhelperv2.feature.impl.PestsDestroyer; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.handler.MacroHandler; -import com.jelly.farmhelperv2.util.InventoryUtils; -import com.jelly.farmhelperv2.util.LogUtils; +import com.jelly.farmhelperv2.handler.RotationHandler; +import com.jelly.farmhelperv2.pathfinder.FlyPathFinderExecutor; +import com.jelly.farmhelperv2.util.*; +import com.jelly.farmhelperv2.util.helper.*; import java.util.ArrayList; import java.util.List; +import java.util.Arrays; +import java.util.Optional; +import net.minecraft.util.*; import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.common.eventhandler.EventPriority; + +import java.lang.Math; public class PestFarmer implements IFeature { public static PestFarmer instance = new PestFarmer(); + private final Minecraft mc = Minecraft.getMinecraft(); private boolean enabled = false; private long pestSpawnTime = 0L; private int swapTo = -1; + private List equipments = new ArrayList(); + private MainState mainState = MainState.NONE; private State state = State.SWAPPING; + private ReturnState returnState = ReturnState.STARTING; private boolean pestSpawned = false; - private boolean holdDae = false; + private boolean kill = false; + public boolean wasSpawnChanged = false; + private Clock timer = new Clock(); + + // return + private boolean isRewarpObstructed = false; + private Optional preTpBlockPos = Optional.empty(); + private int flyAttempts = 0; + private int mainAttempts = 0; // this isnt needed, like at all, but im adding this because fuck you thats why + private boolean failed = false; @Override public String getName() { @@ -50,9 +72,11 @@ public boolean shouldStartAtMacroStart() { @Override public void resetStatesAfterMacroDisabled() { state = State.SWAPPING; - pestSpawned = false; - holdDae = false; + mainState = MainState.NONE; + returnState = ReturnState.STARTING; swapTo = -1; + equipments.clear(); + enabled = false; } @Override @@ -62,7 +86,7 @@ public boolean isToggled() { @Override public boolean shouldCheckForFailsafes() { - return false; + return (mainState != MainState.RETURN || returnState.ordinal() > 7) && (state != State.WAITING_FOR_WARP); } @Override @@ -72,6 +96,7 @@ public void start() { } MacroHandler.getInstance().pauseMacro(); enabled = true; + IFeature.super.start(); } @Override @@ -81,24 +106,34 @@ public void stop() { } enabled = false; + kill = false; + equipments = new ArrayList<>(); + mainState = MainState.NONE; state = State.SWAPPING; - if (MacroHandler.getInstance().isMacroToggled()) { + returnState = ReturnState.STARTING; + preTpBlockPos = Optional.empty(); + flyAttempts = 0; + mainAttempts = 0; + if (failed) { + MacroHandler.getInstance().disableMacro(); + LogUtils.sendError("Failed, disabling"); + } + if (!failed && MacroHandler.getInstance().isMacroToggled()) { MacroHandler.getInstance().resumeMacro(); } + failed = false; + IFeature.super.stop(); } - public boolean holdDaedalus() { - return holdDae && FarmHelperConfig.pestFarming && FarmHelperConfig.pestFarmingHoldDaedalus - && AutoWardrobe.activeSlot == FarmHelperConfig.pestFarmingSet1Slot && InventoryUtils.holdItem("Daedalus Axe"); - } - - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.HIGHEST) public void onTick(ClientTickEvent event) { if (event.phase != Phase.START) { return; } - if (!this.isToggled() || !MacroHandler.getInstance().isCurrentMacroEnabled() - || MacroHandler.getInstance().getCurrentMacro().get().currentState.ordinal() < 4 || enabled) { + if (!this.isToggled() || !MacroHandler.getInstance().isCurrentMacroEnabled() || MacroHandler.getInstance().getCurrentMacro().get().currentState.ordinal() < 4 || enabled) { + return; + } + if (mc.currentScreen != null) { return; } if (!GameStateHandler.getInstance().inGarden()) { @@ -117,34 +152,70 @@ public void onTick(ClientTickEvent event) { return; } + if (wasSpawnChanged && FarmHelperConfig.pestFarmerKillPests && PlayerUtils.isStandingOnRewarpLocation()) { + mainState = MainState.RETURN; + start(); + return; + } + if (pestSpawned) { long timeDiff = System.currentTimeMillis() - pestSpawnTime; - if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L && AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet1Slot) { - LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet1Slot); - swapTo = FarmHelperConfig.pestFarmingSet1Slot; + if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L) { pestSpawned = false; - holdDae = true; - start(); + if (AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet1Slot) { + LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet1Slot); + swapTo = FarmHelperConfig.pestFarmingSet1Slot; + if (FarmHelperConfig.pestFarmingSwapEq) { + equipments = Arrays.asList(FarmHelperConfig.pestFarmingEq1.split("\\|")); + } + mainState = MainState.SWAP_N_START; + start(); + } } else if (AutoWardrobe.activeSlot != FarmHelperConfig.pestFarmingSet0Slot) { LogUtils.sendDebug("Swapping to " + FarmHelperConfig.pestFarmingSet0Slot); swapTo = FarmHelperConfig.pestFarmingSet0Slot; - holdDae = false; + if (FarmHelperConfig.pestFarmingSwapEq) { + equipments = Arrays.asList(FarmHelperConfig.pestFarmingEq0.split("\\|")); + } + mainState = MainState.SWAP_N_START; start(); } } } - @SubscribeEvent + @SubscribeEvent(priority = EventPriority.HIGHEST) public void onChat(ClientChatReceivedEvent event) { if (event.type != 0) { return; } String message = event.message.getUnformattedText(); - if (message.startsWith("§6§lYUCK!") || message.startsWith("§6§lEWW!") || message.startsWith("§6§lGROSS!")) { + if (message.contains("§6§lYUCK!") || message.startsWith("§6§lEWW!") || message.startsWith("§6§lGROSS!")) { pestSpawnTime = System.currentTimeMillis(); pestSpawned = true; LogUtils.sendDebug("[PestFarmer] Pest Spawned."); } + + if (!enabled || (state != State.WAITING_FOR_SPAWN && returnState != ReturnState.WAITING_FOR_SPAWN && returnState != ReturnState.WAITING_FOR_SPAWN_2)) return; + if (message.contains("Your spawn location has been set!")) { + event.setCanceled(true); + mc.thePlayer.addChatMessage(event.message); + if (mainState == MainState.SWAP_N_START) { + setState(State.TOGGLING_PEST_DESTROYER, 0); + } else { + if (returnState.ordinal() == 1) setState(ReturnState.TP_TO_SPAWN_PLOT, 0); + else { + setState(ReturnState.ENDING, 0); + wasSpawnChanged = false; + } + } + wasSpawnChanged = true; + return; + } + + if (message.contains("You cannot set your spawn here!")) { + LogUtils.sendError("Could not set spawn, returning to farming"); + stop(); + } } @SubscribeEvent @@ -153,23 +224,327 @@ public void onTickSwap(ClientTickEvent event) { return; } - switch (state) { - case SWAPPING: - AutoWardrobe.instance.swapTo(swapTo); - state = State.ENDING; - break; - case ENDING: - if (AutoWardrobe.instance.isRunning()) { - return; + if (event.phase != Phase.START) { + return; + } + + switch (mainState) { + case NONE: + stop(); + break; + case SWAP_N_START: { + switch (state) { + case SWAPPING: + AutoWardrobe.instance.swapTo(swapTo, equipments); + setState(State.WAITING_FOR_SWAP, 0); + break; + case WAITING_FOR_SWAP: + if (AutoWardrobe.instance.isRunning()) { + return; + } + if (pestSpawned && FarmHelperConfig.pestFarmerKillPests && GameStateHandler.getInstance().getPestsCount() >= FarmHelperConfig.pestFarmerStartKillAt) { + setState(State.SETTING_SPAWN, 0); + } else { + stop(); + } + break; + case SETTING_SPAWN: + mc.thePlayer.sendChatMessage("/setspawn"); + setState(State.WAITING_FOR_SPAWN, 5000); + break; + case WAITING_FOR_SPAWN: + if (hasTimerEnded()) { + LogUtils.sendError("Could not verify spawn change under 5 seconds, disabling"); + stop(); + } + break; + case TOGGLING_PEST_DESTROYER: + if (PestsDestroyer.getInstance().canEnableMacro(true)) { + PestsDestroyer.getInstance().start(); + setState(State.WAITING_FOR_PEST_DESTROYER, 0); + break; + } + LogUtils.sendError("Cannot enable PestsDestroyer"); + stop(); + break; + case WAITING_FOR_PEST_DESTROYER: + if (PestsDestroyer.getInstance().isRunning()) { + break; + } + mc.thePlayer.sendChatMessage("/warp garden"); + setState(State.WAITING_FOR_WARP, 5000); + preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); + break; + case WAITING_FOR_WARP: + if (hasTimerEnded() || !preTpBlockPos.isPresent()) { + LogUtils.sendError("Could not tp/pretpblockpos isnt present. pretpblockpos: " + preTpBlockPos.isPresent()); + setState(State.ENDING, 0); + failed = true; + break; + } + + if (preTpBlockPos.get().equals(mc.thePlayer.getPosition())) { + break; + } + + setState(State.ENDING, 0); + break; + case ENDING: + stop(); + break; + } + break; + } + + case RETURN: { + switch (returnState) { + case STARTING: + if (BlockUtils.canFlyHigher(10)) { + mc.thePlayer.sendChatMessage("/setspawn"); + setState(ReturnState.WAITING_FOR_SPAWN, 5000); + return; + } else { + isRewarpObstructed = true; + } + + setState(ReturnState.TP_TO_SPAWN_PLOT, 250); + break; + case WAITING_FOR_SPAWN: + if (hasTimerEnded()) { + LogUtils.sendError("Could not verify spawn change under 5 seconds. Continuing"); + isRewarpObstructed = true; + setState(ReturnState.TP_TO_SPAWN_PLOT, 0); + } + break; + case TP_TO_SPAWN_PLOT: + if (isTimerRunning()) return; + + if (!mc.thePlayer.capabilities.isFlying) { + PestsDestroyer.getInstance().fly(); + return; + } + + mc.thePlayer.sendChatMessage("/plottp " + FarmHelperConfig.spawnPlot); + setState(ReturnState.TP_VERIFY, 5000); + preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); + break; + case TP_VERIFY: + if (hasTimerEnded() || !preTpBlockPos.isPresent()) { + LogUtils.sendError("Could not tp/pretpblockpos isnt present. pretpblockpos: " + preTpBlockPos.isPresent()); + setState(ReturnState.ENDING, 0); + failed = true; + break; + } + + if (preTpBlockPos.get().equals(mc.thePlayer.getPosition())) { + break; + } + + setState(ReturnState.VERIFY_PLOT, 0); + break; + case VERIFY_PLOT: + boolean isSuffocating = PlayerUtils.isPlayerSuffocating(); + if (isTimerRunning() && isSuffocating) return; + + if (isSuffocating) { + if (!timer.isScheduled()) { + KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindJump, true); + timer.schedule(5000); + } else { + setState(ReturnState.ESCAPE_TP, 0); + } + break; + } + + KeyBindUtils.stopMovement(); + setState(ReturnState.FLY_TO_ABOVE_SPAWN, 0); + break; + case ESCAPE_TP: + mc.thePlayer.sendChatMessage("/plottp barn"); + preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); + setState(ReturnState.ESCAPE_TP_VERIFY, 5000); + break; + case ESCAPE_TP_VERIFY: + if (hasTimerEnded() || !preTpBlockPos.isPresent()) { + LogUtils.sendError("Could not tp/pretpblockpos isnt present. pretpblockpos: " + preTpBlockPos.isPresent()); + setState(ReturnState.ENDING, 0); + failed = true; + break; + } + + if (preTpBlockPos.get().equals(mc.thePlayer.getPosition())) { + break; + } + + setState(ReturnState.FLY_TO_ABOVE_SPAWN, 0); + break; + case FLY_TO_ABOVE_SPAWN: + if (FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + break; + } + + if (flyAttempts > 3 || mainAttempts > 3) { + LogUtils.sendError("Tried " + (flyAttempts + mainAttempts * 3) + " times but failed"); + setState(ReturnState.ENDING, 0); + failed = true; + break; + } + + flyAttempts++; + FlyPathFinderExecutor.getInstance().setStoppingPositionThreshold(0.5f); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(FarmHelperConfig.spawnPosX + 0.5f, 85, FarmHelperConfig.spawnPosZ + 0.5f), true, true); + setState(ReturnState.WAITING_FOR_FLIGHT, 0); + break; + case WAITING_FOR_FLIGHT: + if (FlyPathFinderExecutor.getInstance().isRunning()) break; + + if (FlyPathFinderExecutor.getInstance().getState().ordinal() != 2 && Math.abs(Math.floor(mc.thePlayer.posX) - FarmHelperConfig.spawnPosX) < 1 && Math.abs(Math.floor(mc.thePlayer.posZ) - FarmHelperConfig.spawnPosZ) < 1) { + setState(ReturnState.FLY_TO_SPAWN_BLOCK, 0); + flyAttempts = 0; + } else { + setState(ReturnState.FLY_TO_ABOVE_SPAWN, 0); + } + break; + case FLY_TO_SPAWN_BLOCK: + if (FlyPathFinderExecutor.getInstance().isRunning()) { + FlyPathFinderExecutor.getInstance().stop(); + break; + } + + if (flyAttempts > 3 || mainAttempts > 3) { + LogUtils.sendError("Tried " + (flyAttempts + 1 + mainAttempts * 3) + " times but failed"); + setState(ReturnState.ENDING, 0); + failed = true; + break; + } + + flyAttempts++; + FlyPathFinderExecutor.getInstance().setStoppingPositionThreshold(0.2f); + FlyPathFinderExecutor.getInstance().findPath(new Vec3(FarmHelperConfig.spawnPosX + 0.5f, FarmHelperConfig.spawnPosY + 0.15, FarmHelperConfig.spawnPosZ + 0.5f), true, true); + setState(ReturnState.WAITING_FOR_FLIGHT_AND_VERIFYING, 0); + break; + case WAITING_FOR_FLIGHT_AND_VERIFYING: + if (FlyPathFinderExecutor.getInstance().isRunning()) break; + + if (FlyPathFinderExecutor.getInstance().getState().ordinal() == 2) { + LogUtils.sendError("Failed to pathfind to spawn. Stoping"); + FlyPathFinderExecutor.getInstance().stop(); + setState(ReturnState.ENDING, 0); + failed = true; + break; + } + + BlockPos pos = BlockUtils.getRelativeBlockPos(0, 0, 0); + if (pos.getX() == FarmHelperConfig.spawnPosX && pos.getY() == FarmHelperConfig.spawnPosY && pos.getZ() == FarmHelperConfig.spawnPosZ) { + setState(ReturnState.SNEAKING_AND_ROTATING, 0); + flyAttempts = 0; + } else { + setState(ReturnState.FLY_TO_ABOVE_SPAWN, 0); + mainAttempts++; + } + break; + case SNEAKING_AND_ROTATING: + if (mc.thePlayer.capabilities.isFlying) KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindSneak, true); + + RotationHandler.getInstance().easeTo(new RotationConfiguration( + new Rotation(AngleUtils.get360RotationYaw(FarmHelperConfig.spawnYaw), FarmHelperConfig.spawnPitch), + 500, + null + )); + setState(ReturnState.SETTING_SPAWN, 5000); + break; + case SETTING_SPAWN: + if (hasTimerEnded()) { + LogUtils.sendError("Failed to rotate and shift"); + setState(ReturnState.ENDING, 0); + failed = true; + break; + } + + if (RotationHandler.getInstance().isRotating() || !mc.thePlayer.onGround) break; + mc.thePlayer.sendChatMessage("/setspawn"); + setState(ReturnState.WAITING_FOR_SPAWN_2, 5000); + break; + case WAITING_FOR_SPAWN_2: + if (hasTimerEnded()) { + LogUtils.sendError("Failed to set spawn 2"); + setState(ReturnState.ENDING, 0); + failed = true; + break; + } + break; + case ENDING: + KeyBindUtils.stopMovement(); + stop(); + break; + } - stop(); - break; + break; + } } } + public boolean isTimerRunning() { + return timer.isScheduled() && !timer.passed(); + } + + public boolean hasTimerEnded() { + return timer.isScheduled() && timer.passed(); + } + + public void setState(State state, long time) { + this.state = state; + if (time == 0) { + timer.reset(); + return; + } + timer.schedule(time); + } + + public void setState(ReturnState state, long time) { + this.returnState = state; + if (time == 0) { + timer.reset(); + return; + } + timer.schedule(time); + } + + enum MainState { + NONE, + SWAP_N_START, + RETURN + } + // bleh, its only for the tracker basically enum State { SWAPPING, + WAITING_FOR_SWAP, + ANALYZING, // :nerd: + SETTING_SPAWN, + WAITING_FOR_SPAWN, + TOGGLING_PEST_DESTROYER, + WAITING_FOR_PEST_DESTROYER, + WAITING_FOR_WARP, + ENDING + } + + enum ReturnState { + STARTING, + WAITING_FOR_SPAWN, + TP_TO_SPAWN_PLOT, + TP_VERIFY, + VERIFY_PLOT, + ESCAPE_TP, + ESCAPE_TP_VERIFY, + FLY_TO_ABOVE_SPAWN, + WAITING_FOR_FLIGHT, + FLY_TO_SPAWN_BLOCK, + WAITING_FOR_FLIGHT_AND_VERIFYING, + SNEAKING_AND_ROTATING, + SETTING_SPAWN, + WAITING_FOR_SPAWN_2, // definitely could've improved but you dont see me care now do you ENDING } } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java index 24b4030e7..3de7c56ec 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java @@ -83,6 +83,7 @@ public class PestsDestroyer implements IFeature { private final Clock delayClock = new Clock(); private final Clock delayBetweenBackTaps = new Clock(); private final Clock delayBetweenFireworks = new Clock(); + private final Clock suffocateEscapeTimer = new Clock(); @Getter private Optional currentEntityTarget = Optional.empty(); private boolean enabled = false; @@ -199,6 +200,7 @@ public void stop() { delayBetweenFireworks.reset(); delayClock.reset(); stuckClock.reset(); + suffocateEscapeTimer.reset(); preparing = false; enabled = false; isPlotObstructed = false; @@ -477,6 +479,10 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { switch (state) { case IDLE: + if (!mc.thePlayer.capabilities.isFlying) { + fly(); + break; + } ItemStack currentItem = mc.thePlayer.getHeldItem(); if (GameStateHandler.getInstance().getPestsCount() == 0) { if (isInventoryOpen()) { @@ -491,6 +497,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { } state = States.SWAP_ARMOR; delayClock.schedule((long) (200 + Math.random() * 200)); + LogUtils.sendDebug("Delay 2"); break; case SWAP_ARMOR: if (FarmHelperConfig.pestSwapArmorBefore) { @@ -499,7 +506,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { currentSlot = FarmHelperConfig.pestArmorSlot1; } if (AutoWardrobe.activeSlot != currentSlot) { - AutoWardrobe.instance.swapTo(currentSlot); + AutoWardrobe.instance.swapTo(currentSlot, FarmHelperConfig.pestSwapEquipments ? Arrays.asList(FarmHelperConfig.pestSwapEq.split("\\|")) : Collections.emptyList()); } } state = States.ARMOR_SWAP_VERIFY; @@ -529,11 +536,13 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { mc.thePlayer.sendChatMessage("/desk"); state = States.OPEN_PLOTS; delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); + LogUtils.sendDebug("Delay 3"); break; case OPEN_PLOTS: String chestName = InventoryUtils.getInventoryName(); if (mc.currentScreen == null) { delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 300 + Math.random() * 300)); + LogUtils.sendDebug("Delay 4"); break; } if (!InventoryUtils.isInventoryLoaded()) { @@ -549,6 +558,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { state = States.WAIT_FOR_INFO; InventoryUtils.clickContainerSlot(configurePlots.slotNumber, InventoryUtils.ClickType.LEFT, InventoryUtils.ClickMode.PICKUP); delayClock.schedule((long) (FarmHelperConfig.pestAdditionalGUIDelay + 500 + Math.random() * 500)); + LogUtils.sendDebug("Delay 5"); break; case WAIT_FOR_INFO: break; @@ -556,6 +566,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { PlotUtils.Plot plot; if (FarmHelperConfig.dontTeleportToPlots) { delayClock.schedule(1_000 + Math.random() * 500); + LogUtils.sendDebug("Delay 6"); MacroHandler.getInstance().triggerWarpGarden(true, false); state = States.CHECKING_SPAWN; return; @@ -565,6 +576,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { if (plot == null) { state = States.GO_BACK; delayClock.schedule((long) (500 + Math.random() * 500)); + LogUtils.sendDebug("Delay 7"); return; } if (GameStateHandler.getInstance().getCurrentPlot() == plot.number && BlockUtils.canFlyHigher(8)) { @@ -575,7 +587,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { preTpBlockPos = Optional.of(mc.thePlayer.getPosition()); mc.thePlayer.sendChatMessage("/tptoplot " + plotNumber); state = States.WAIT_FOR_TP; + this.closestPlot = Optional.of(plot); delayClock.schedule((long) (900 + Math.random() * 500)); + LogUtils.sendDebug("Delay 8"); break; case WAIT_FOR_TP: if (!preTpBlockPos.isPresent()) { @@ -587,22 +601,37 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { } state = States.CHECKING_PLOT; delayClock.schedule((long) (200 + Math.random() * 200)); + LogUtils.sendDebug("Delay 9"); break; case CHECKING_PLOT: if (isInventoryOpenDelayed()) { break; } - KeyBindUtils.stopMovement(); - if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { + boolean isSuffocating = PlayerUtils.isPlayerSuffocating(); + if (isSuffocating || !BlockUtils.canFlyHigher(5)) { + if (!suffocateEscapeTimer.isScheduled()) { + suffocateEscapeTimer.schedule(5000); + } + if (!suffocateEscapeTimer.passed()) { + if (!mc.gameSettings.keyBindJump.isKeyDown()) KeyBindUtils.setKeyBindState(mc.gameSettings.keyBindJump, true); + break; + } LogUtils.sendWarning("[Pests Destroyer] The player is suffocating and/or it can't fly higher. Going back to spawnpoint."); delayClock.schedule(1_000 + Math.random() * 500); + LogUtils.sendDebug("Delay 10"); MacroHandler.getInstance().triggerWarpGarden(true, false); isPlotObstructed = true; state = States.CHECKING_SPAWN; + KeyBindUtils.stopMovement(); + suffocateEscapeTimer.reset(); return; } - state = States.GET_LOCATION; + if (suffocateEscapeTimer.isScheduled()) { + suffocateEscapeTimer.reset(); + } + KeyBindUtils.stopMovement(); + state = States.FLY_TO_THE_CLOSEST_PLOT; break; case CHECKING_SPAWN: if (MacroHandler.getInstance().isTeleporting()) { @@ -610,8 +639,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { } if (PlayerUtils.isPlayerSuffocating() || !BlockUtils.canFlyHigher(5)) { - LogUtils.sendError( - "[Pests Destroyer] Your spawnpoint is obstructed! Make sure there is no block above your spawnpoint! Disabling Pests Destroyer!"); + LogUtils.sendError("[Pests Destroyer] Your spawnpoint is obstructed! Make sure there is no block above your spawnpoint! Disabling Pests Destroyer!"); stop(); FarmHelperConfig.enablePestsDestroyer = false; // finishMacro(); @@ -654,7 +682,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { } else { state = States.FLY_TO_THE_CLOSEST_PLOT; } - delayClock.schedule((long) (500 + Math.random() * 500)); + // delayClock.schedule((long) (500 + Math.random() * 500)); break; case FLY_TO_THE_CLOSEST_PLOT: if (MacroHandler.getInstance().isTeleporting()) { @@ -778,6 +806,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { null ).easeOutBack(true)); delayClock.schedule(300); + LogUtils.sendDebug("Delay 11"); break; } state = States.WAIT_FOR_LOCATION; @@ -792,6 +821,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); } delayClock.schedule(300); + LogUtils.sendDebug("Delay 12"); break; case WAIT_FOR_LOCATION: if (isInventoryOpenDelayed()) { @@ -840,6 +870,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { state = States.FIND_PEST; delayBetweenFireworks.schedule(3_000); delayClock.schedule(300); + LogUtils.sendDebug("Delay 13"); break; } if (System.currentTimeMillis() - lastFireworkTime > 6_000) { @@ -905,6 +936,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime); } delayClock.schedule(300); + LogUtils.sendDebug("Delay 14"); break; case KILL_PEST: if (isInventoryOpenDelayed()) { @@ -947,6 +979,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { escapeState = EscapeState.GO_TO_HUB; KeyBindUtils.stopMovement(); delayClock.schedule(300); + LogUtils.sendDebug("Delay 15"); return; } @@ -1008,6 +1041,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { flyPathfinderTries = 0; KeyBindUtils.stopMovement(); delayClock.schedule(1_000 + Math.random() * 500); + LogUtils.sendDebug("Delay 16"); MacroHandler.getInstance().triggerWarpGarden(true, false); state = States.CHECKING_SPAWN; return; @@ -1039,6 +1073,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { if (GameStateHandler.getInstance().getPestsCount() == 0) { state = States.GO_BACK; delayClock.schedule((long) (500 + Math.random() * 500)); + LogUtils.sendDebug("Delay 17"); break; } System.out.println("Curr plot pests: " + GameStateHandler.getInstance().getCurrentPlotPestsCount()); @@ -1050,6 +1085,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { state = States.KILL_PEST; currentEntityTarget = Optional.of(closestPest2); delayClock.schedule(50 + (long) (Math.random() * 100)); + LogUtils.sendDebug("Delay 18"); } else { PlotUtils.Plot plotOpt = getClosestPlot(); if (plotOpt != null) { @@ -1059,15 +1095,18 @@ public void onTickExecute(TickEvent.ClientTickEvent event) { LogUtils.sendDebug("Going manually to another plot"); state = States.GET_CLOSEST_PLOT; delayClock.schedule(100 + (long) (Math.random() * 150)); + LogUtils.sendDebug("Delay 19"); break; } else { LogUtils.sendDebug("Teleporting to plot"); state = States.TELEPORT_TO_PLOT; delayClock.schedule(400 + (long) (Math.random() * 400)); + LogUtils.sendDebug("Delay 20"); } } else { state = States.GO_BACK; delayClock.schedule(300 + (long) (Math.random() * 300)); + LogUtils.sendDebug("Delay 21"); } } break; @@ -1591,7 +1630,7 @@ public void onGuiOpen(DrawScreenAfterEvent event) { private final Clock flyDelay = new Clock(); - private void fly() { + public void fly() { if (mc.thePlayer.capabilities.isFlying) { KeyBindUtils.holdThese(mc.gameSettings.keyBindJump); return; diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java index 9174514c0..50b92cd50 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java @@ -239,7 +239,10 @@ public boolean canEnableMacro(boolean manual, boolean withError) { if (isRunning()) return false; if (!GameStateHandler.getInstance().inGarden()) return false; if (mc.thePlayer == null || mc.theWorld == null) return false; - if (FeatureManager.getInstance().isAnyOtherFeatureEnabled()) return false; + if (FeatureManager.getInstance().isAnyOtherFeatureEnabled()) { + LogUtils.sendWarning("here"); + return false; + } if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) return false; if (GameStateHandler.getInstance().getServerClosingSeconds().isPresent()) { diff --git a/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java b/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java index 7f3179b3a..66703e1b9 100644 --- a/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java +++ b/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java @@ -326,6 +326,7 @@ public void onChatMessageReceived(ClientChatReceivedEvent event) { if (!message.contains(":") && GameStateHandler.getInstance().inGarden()) { if (message.equals("Your spawn location has been set!")) { PlayerUtils.setSpawnLocation(); + PestFarmer.instance.wasSpawnChanged = false; for (Rewarp rewarp : FarmHelperConfig.rewarpList) { if (mc.thePlayer.getDistance(rewarp.x, rewarp.y, rewarp.z) < 2) { LogUtils.sendWarning("Spawn location is close to the rewarp location! Removing it from the list..."); diff --git a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java index d03d89cc2..521f4f224 100644 --- a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java @@ -7,7 +7,6 @@ import com.jelly.farmhelperv2.feature.FeatureManager; import com.jelly.farmhelperv2.feature.impl.DesyncChecker; import com.jelly.farmhelperv2.feature.impl.LagDetector; -import com.jelly.farmhelperv2.feature.impl.PestFarmer; import com.jelly.farmhelperv2.feature.impl.PestsDestroyer; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.handler.MacroHandler; @@ -163,7 +162,6 @@ public void onTick() { return; } - if (getRotation().isRotating()) { if (!mc.gameSettings.keyBindSneak.isKeyDown()) KeyBindUtils.stopMovement(); @@ -235,9 +233,7 @@ public void onTick() { return; } - if (!PestFarmer.instance.holdDaedalus()) { - PlayerUtils.getTool(); - } + PlayerUtils.getTool(); // Update or invoke state, based on if player is moving or not if (GameStateHandler.getInstance().canChangeDirection()) { diff --git a/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java b/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java index 549e2d9ff..96b5bdf4c 100644 --- a/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java +++ b/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java @@ -87,6 +87,8 @@ public static FlyPathFinderExecutor getInstance() { private boolean dontRotate = false; private final EvictingQueue lastPositions = EvictingQueue.create(100); private Position lastPosition; + @Setter + private float stoppingPositionThreshold = 0.75f; public void findPath(Vec3 pos, boolean follow, boolean smooth) { @@ -132,9 +134,11 @@ public void findPath(Vec3 pos, boolean follow, boolean smooth) { if (smooth) { finalRoute = smoothPath(finalRoute); } - this.path.clear(); - this.path.addAll(finalRoute.stream().map(vec3 -> vec3.addVector(0.5f, 0.15, 0.5)).collect(Collectors.toCollection(CopyOnWriteArrayList::new))); - state = State.PATHING; + if (!this.isDecelerating()) { + this.path.clear(); + this.path.addAll(finalRoute.stream().map(vec3 -> vec3.addVector(0.5f, 0.15, 0.5)).collect(Collectors.toCollection(CopyOnWriteArrayList::new))); + state = State.PATHING; + } LogUtils.sendDebug("Path smoothing took " + (System.currentTimeMillis() - startTime) + "ms"); if (timeoutTask != null) { timeoutTask.stop(); @@ -287,6 +291,7 @@ public void stop() { stuckBreak.reset(); stuckCheckDelay.reset(); dontRotate = false; + stoppingPositionThreshold = 0.75f; } @SubscribeEvent @@ -337,6 +342,14 @@ public void onTickNeededYaw(TickEvent.ClientTickEvent event) { KeyBindUtils.stopMovement(true); return; } + + if (state == State.DECELERATING) { + if (mc.thePlayer.motionX == 0 && mc.thePlayer.motionZ == 0 && mc.thePlayer.motionY == (mc.thePlayer.onGround ? -0.0784000015258789 : 0)) { + stop(); + } + return; + } + if (stuckBreak.isScheduled() && !stuckBreak.passed()) return; Vec3 current = mc.thePlayer.getPositionVector(); BlockPos currentPos = mc.thePlayer.getPosition(); @@ -392,7 +405,9 @@ public void onTickNeededYaw(TickEvent.ClientTickEvent event) { float distance = (float) mc.thePlayer.getPositionVector().distanceTo(targetPos); float distancePath = (float) mc.thePlayer.getPositionVector().distanceTo(lastElem); if (willArriveAtDestinationAfterStopping(lastElem) && entityVelocity < 0.15) { - stop(); + state = State.DECELERATING; + KeyBindUtils.stopMovement(true); + // stop(); return; } if ((distance < 1 && entityVelocity > 0.15) || (distancePath < 0.5 && entityVelocity < 0.15)) { @@ -400,7 +415,9 @@ public void onTickNeededYaw(TickEvent.ClientTickEvent event) { return; } } else if (willArriveAtDestinationAfterStopping(lastElem) || mc.thePlayer.getDistance(lastElem.xCoord, lastElem.yCoord, lastElem.zCoord) < 0.3) { - stop(); + state = State.DECELERATING; + KeyBindUtils.stopMovement(true); + // stop(); return; } if (!mc.thePlayer.capabilities.allowFlying) { @@ -535,7 +552,7 @@ public boolean isTping() { } private boolean willArriveAtDestinationAfterStopping(Vec3 targetPos) { - return predictStoppingPosition().distanceTo(targetPos) < 0.75; + return predictStoppingPosition().distanceTo(targetPos) < stoppingPositionThreshold; } private Vec3 predictStoppingPosition() { diff --git a/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java b/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java index b923670fb..3f2cc34d4 100644 --- a/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java +++ b/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java @@ -6,6 +6,8 @@ import com.jelly.farmhelperv2.failsafe.FailsafeManager; import com.jelly.farmhelperv2.handler.MacroHandler; import com.jelly.farmhelperv2.util.helper.Clock; +import com.jelly.farmhelperv2.util.AngleUtils; +import com.jelly.farmhelperv2.handler.GameStateHandler; import net.minecraft.block.*; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; @@ -347,6 +349,9 @@ public static void setSpawnLocation() { FarmHelperConfig.spawnPosX = pos.getX(); FarmHelperConfig.spawnPosY = pos.getY(); FarmHelperConfig.spawnPosZ = pos.getZ(); + FarmHelperConfig.spawnYaw = AngleUtils.normalizeAngle(mc.thePlayer.rotationYaw); + FarmHelperConfig.spawnPitch = AngleUtils.normalizeAngle(mc.thePlayer.rotationPitch); + FarmHelperConfig.spawnPlot = GameStateHandler.getInstance().getCurrentPlot(); FarmHelper.config.save(); } From 227a890654887c7d461b5e78d31aed10024bd5b5 Mon Sep 17 00:00:00 2001 From: Osama Date: Tue, 25 Feb 2025 10:44:44 +0600 Subject: [PATCH 07/19] Improvements --- .gradle.properties.swp | Bin 0 -> 12288 bytes gradle.properties | 2 +- .../farmhelperv2/config/FarmHelperConfig.java | 10 ++++++++++ .../feature/impl/AutoSprayonator.java | 2 +- .../feature/impl/PestsDestroyer.java | 6 ++++-- .../feature/impl/ProfitCalculator.java | 9 +++++++++ .../feature/impl/VisitorsMacro.java | 7 ++----- .../jelly/farmhelperv2/macro/AbstractMacro.java | 7 ------- .../pathfinder/FlyPathFinderExecutor.java | 2 +- 9 files changed, 28 insertions(+), 17 deletions(-) create mode 100644 .gradle.properties.swp diff --git a/.gradle.properties.swp b/.gradle.properties.swp new file mode 100644 index 0000000000000000000000000000000000000000..606b0f3cfd7c3d7bcba132479f6e9f2b96c7af32 GIT binary patch literal 12288 zcmeI&Jx;?g7zSXMiHYBpq0qTb6P6Y!6BV>lL4ed!v89chCbH{bCl!c0a0iaS0k{O` z;12K^Dj|l#US3OYV#hyHo-z4GjY0RU+TuQ=w#C>@=OuC7y=}&N>1~tL^~$E6ap!g?1*XV#lUMoopxh4B&-#ZvIxXc`r%uz#P96%c^H zQh~CV)SDaZFz_3-gZ=96PJiiAOh5nv5P$##AOHafKmY=(DNy7U_D-+1Mp>s+7NHv& z1Rwwb2tWV=5P$##AOHafKmYDKI{10O)OfJi=<_CTu@N13YIK>0W36~5q`c=pHfWRZMfrR- bSCL6m>-B@yfcUVLdW literal 0 HcmV?d00001 diff --git a/gradle.properties b/gradle.properties index 93d8e548f..45db43e85 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ baseGroup=com.jelly.farmhelperv2 mcVersion=1.8.9 modid=farmhelperv2 modName=FarmHelper -version=2.9.10 +version=2.9.11.1 shouldRelease=true diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index 71e7beacd..805d44e65 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -1977,6 +1977,12 @@ public static void triggerManuallyAutoPestExchange() { min = 1, max = 64 ) public static int autoSprayonatorAutoBuyAmount = 1; + + @Slider( + name = "Time to wait after entering plot before starting", category = AUTO_SPRAYONATOR, subcategory = "Auto Sprayonator", + min = 0, max = 5000, step = 100 + ) + public static int autoSprayonatorStartDelay = 0; // // @@ -2305,6 +2311,10 @@ public static void triggerManuallyAutoComposter() { name = "Reset stats between disabling", category = HUD, subcategory = "Profit Calculator" ) public static boolean resetStatsBetweenDisabling = false; + @Switch( + name = "Count Pest Drops to Profit Calculator", category = HUD, subcategory = "Profit Calculator" + ) + public static boolean profitCalcCountPestDrop = false; // @Button( // name = "Reset Profit Calculator", category = HUD, subcategory = "Profit Calculator", // text = "Reset Now", size = 2 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java index fd885bc73..2f7b200b5 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoSprayonator.java @@ -145,7 +145,7 @@ public void onTablistUpdate(UpdateTablistEvent event) { } if (!this.timer.isScheduled()) { - this.timer.schedule(5000); + this.timer.schedule(FarmHelperConfig.autoSprayonatorStartDelay); } else if (this.timer.passed()) { this.start(); } diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java index 3de7c56ec..fbe6e9b85 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java @@ -7,6 +7,7 @@ import com.jelly.farmhelperv2.event.SpawnParticleEvent; import com.jelly.farmhelperv2.failsafe.FailsafeManager; import com.jelly.farmhelperv2.feature.IFeature; +import com.jelly.farmhelperv2.feature.impl.PestFarmer; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.handler.MacroHandler; import com.jelly.farmhelperv2.handler.RotationHandler; @@ -159,7 +160,7 @@ public void start() { lastKillTimestamp = 0; if (MacroHandler.getInstance().isMacroToggled()) { MacroHandler.getInstance().pauseMacro(); - MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); +// MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); KeyBindUtils.stopMovement(); } escapeState = EscapeState.NONE; @@ -1189,7 +1190,8 @@ private void finishMacro() { if (FlyPathFinderExecutor.getInstance().isPathing()) { FlyPathFinderExecutor.getInstance().stop(); } - if (MacroHandler.getInstance().isMacroToggled()) { + // bad macro design - loser + if (!PestFarmer.instance.isRunning() && MacroHandler.getInstance().isMacroToggled()) { stop(); MacroHandler.getInstance().triggerWarpGarden(true, true, false); delayClock.schedule(2_000 + Math.random() * 500); diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java index 4f2fccf94..e02fee195 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java @@ -70,6 +70,7 @@ public class ProfitCalculator implements IFeature { @Getter private final Clock updateBazaarClock = new Clock(); private final Pattern regex = Pattern.compile("Dicer dropped (\\d+)x ([\\w\\s]+)!"); + private final Pattern pestPattern = Pattern.compile("You received (\\d+)x Enchanted (.+?) for killing a (\\w+)!"); public double realProfit = 0; public double realHourlyProfit = 0; @Getter @@ -374,6 +375,14 @@ public void onReceivedChat(ClientChatReceivedEvent event) { } addDroppedItem(itemDropped, amountDropped); } + + // + if (FarmHelperConfig.profitCalcCountPestDrop && message.matches("You received \\d+x Enchanted (\\w+\\s?)+!")) { + Matcher matcher = pestPattern.matcher(message); + if (matcher.find()) { + addDroppedItem(matcher.group(2), Integer.parseInt(matcher.group(1))); + } + } } private void addDroppedItem(String name, int amount) { diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java index 50b92cd50..1134827a4 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/VisitorsMacro.java @@ -158,7 +158,7 @@ public void start() { } if (MacroHandler.getInstance().isMacroToggled()) { MacroHandler.getInstance().pauseMacro(); - MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); + // MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); } ignoredNPCs.clear(); profitNpc = false; @@ -239,10 +239,7 @@ public boolean canEnableMacro(boolean manual, boolean withError) { if (isRunning()) return false; if (!GameStateHandler.getInstance().inGarden()) return false; if (mc.thePlayer == null || mc.theWorld == null) return false; - if (FeatureManager.getInstance().isAnyOtherFeatureEnabled()) { - LogUtils.sendWarning("here"); - return false; - } + if (FeatureManager.getInstance().isAnyOtherFeatureEnabled()) return false; if (FailsafeManager.getInstance().triggeredFailsafe.isPresent()) return false; if (GameStateHandler.getInstance().getServerClosingSeconds().isPresent()) { diff --git a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java index 521f4f224..7728cdd25 100644 --- a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java @@ -7,7 +7,6 @@ import com.jelly.farmhelperv2.feature.FeatureManager; import com.jelly.farmhelperv2.feature.impl.DesyncChecker; import com.jelly.farmhelperv2.feature.impl.LagDetector; -import com.jelly.farmhelperv2.feature.impl.PestsDestroyer; import com.jelly.farmhelperv2.handler.GameStateHandler; import com.jelly.farmhelperv2.handler.MacroHandler; import com.jelly.farmhelperv2.handler.RotationHandler; @@ -149,12 +148,6 @@ public void onTick() { checkOnSpawnClock.schedule(5000); } - if (FarmHelperConfig.pestForceEnable && PestsDestroyer.getInstance().canEnableMacro()) { - PestsDestroyer.getInstance().start(); - LogUtils.sendDebug("Activating Pests Destroyer"); - return; - } - if (mc.thePlayer.getPosition().getY() < 0) { LogUtils.sendError("Build a wall between the rewarp point and the void to prevent falling out of the garden! Disabling the macro..."); MacroHandler.getInstance().disableMacro(); diff --git a/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java b/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java index 96b5bdf4c..8f16d11b4 100644 --- a/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java +++ b/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java @@ -344,7 +344,7 @@ public void onTickNeededYaw(TickEvent.ClientTickEvent event) { } if (state == State.DECELERATING) { - if (mc.thePlayer.motionX == 0 && mc.thePlayer.motionZ == 0 && mc.thePlayer.motionY == (mc.thePlayer.onGround ? -0.0784000015258789 : 0)) { + if (Math.abs(mc.thePlayer.motionX) <= 0.05 && Math.abs(mc.thePlayer.motionZ) <= 0.05 && mc.thePlayer.motionY == (mc.thePlayer.onGround ? -0.0784000015258789 : 0)) { stop(); } return; From 4a1359f419c1abdc03fa0548a44faad2591a99aa Mon Sep 17 00:00:00 2001 From: Osama Date: Tue, 25 Feb 2025 11:06:57 +0600 Subject: [PATCH 08/19] Fixed ProfitCalc Dicer Bug & Added Pest Drops to Profit Calc --- .gradle.properties.swp | Bin 12288 -> 0 bytes .../feature/impl/.ProfitCalculator.java.swp | Bin 0 -> 36864 bytes .../feature/impl/ProfitCalculator.java | 48 +++++++++--------- 3 files changed, 24 insertions(+), 24 deletions(-) delete mode 100644 .gradle.properties.swp create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/.ProfitCalculator.java.swp diff --git a/.gradle.properties.swp b/.gradle.properties.swp deleted file mode 100644 index 606b0f3cfd7c3d7bcba132479f6e9f2b96c7af32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&Jx;?g7zSXMiHYBpq0qTb6P6Y!6BV>lL4ed!v89chCbH{bCl!c0a0iaS0k{O` z;12K^Dj|l#US3OYV#hyHo-z4GjY0RU+TuQ=w#C>@=OuC7y=}&N>1~tL^~$E6ap!g?1*XV#lUMoopxh4B&-#ZvIxXc`r%uz#P96%c^H zQh~CV)SDaZFz_3-gZ=96PJiiAOh5nv5P$##AOHafKmY=(DNy7U_D-+1Mp>s+7NHv& z1Rwwb2tWV=5P$##AOHafKmYDKI{10O)OfJi=<_CTu@N13YIK>0W36~5q`c=pHfWRZMfrR- bSCL6m>-B@yfcUVLdW diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.ProfitCalculator.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.ProfitCalculator.java.swp new file mode 100644 index 0000000000000000000000000000000000000000..e1e4aebe85b17d463ae1d67acd62589788fbbb5e GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java index e02fee195..f28634939 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/ProfitCalculator.java @@ -329,22 +329,25 @@ public void onReceivedChat(ClientChatReceivedEvent event) { if (event.type != 0 || event.message == null) return; String message = StringUtils.stripControlCodes(event.message.getUnformattedText()); - if (message.contains(":") || !message.contains("coins")) return; - if (((message.startsWith("[Bazaar] Claimed ") || message.startsWith("You collected ")) && message.contains("coins from selling")) || message.startsWith("[Bazaar] Sold ")) { - Matcher matcher = coinsPattern.matcher(message); - if (matcher.find()) { - String coinsFound = matcher.group(1); - try { - double coins = Double.parseDouble(coinsFound.replace(",", "")); - realProfit -= coins; - } catch (NumberFormatException e) { - LogUtils.sendDebug("Failed to parse coins from message: " + e.getMessage()); + if (message.contains(":")) return; + if (message.contains("coins")) { + if (((message.startsWith("[Bazaar] Claimed ") || message.startsWith("You collected ")) && message.contains("coins from selling")) || message.startsWith("[Bazaar] Sold ")) { + Matcher matcher = coinsPattern.matcher(message); + if (matcher.find()) { + String coinsFound = matcher.group(1); + try { + double coins = Double.parseDouble(coinsFound.replace(",", "")); + realProfit -= coins; + } catch (NumberFormatException e) { + LogUtils.sendDebug("Failed to parse coins from message: " + e.getMessage()); + } + LogUtils.sendWarning("Selling crops in bazaar or auction house may break the profit calculator! Pause the macro before taking any action!"); } - LogUtils.sendWarning("Selling crops in bazaar or auction house may break the profit calculator! Pause the macro before taking any action!"); } - } - if (message.contains("Sold") || message.contains("[Auction]")) return; + // if (message.contains("Sold") || message.contains("[Auction]")) return; + return; + } Optional optional = rngToCountList.stream().filter(message::contains).findFirst(); if (optional.isPresent()) { @@ -357,15 +360,12 @@ public void onReceivedChat(ClientChatReceivedEvent event) { String itemDropped; int amountDropped; Matcher matcher = regex.matcher(message); - if (matcher.find()) { - amountDropped = Integer.parseInt(matcher.group(1)); - if (matcher.group(2).contains("Melon")) { - itemDropped = "Melon"; - } else if (matcher.group(2).contains("Pumpkin")) { - itemDropped = "Pumpkin"; - } else { - return; - } + if (!matcher.find()) return; + amountDropped = Integer.parseInt(matcher.group(1)); + if (matcher.group(2).contains("Melon")) { + itemDropped = "Melon"; + } else if (matcher.group(2).contains("Pumpkin")) { + itemDropped = "Pumpkin"; } else { return; } @@ -376,11 +376,11 @@ public void onReceivedChat(ClientChatReceivedEvent event) { addDroppedItem(itemDropped, amountDropped); } - // if (FarmHelperConfig.profitCalcCountPestDrop && message.matches("You received \\d+x Enchanted (\\w+\\s?)+!")) { Matcher matcher = pestPattern.matcher(message); if (matcher.find()) { - addDroppedItem(matcher.group(2), Integer.parseInt(matcher.group(1))); + addDroppedItem(matcher.group(2), Integer.parseInt(matcher.group(1)) * 160); + LogUtils.sendDebug("Added " + matcher.group(2) + ", killed " + matcher.group(3)); } } } From 6bbfa235e51617a1b0e3b76626f954b9d5a71190 Mon Sep 17 00:00:00 2001 From: Osama Date: Tue, 25 Feb 2025 11:20:09 +0600 Subject: [PATCH 09/19] Stopped pausing timer while killing pest if pest drop is being counted --- .../feature/impl/.PestsDestroyer.java.swp | Bin 0 -> 98304 bytes .../feature/impl/.ProfitCalculator.java.swp | Bin 36864 -> 0 bytes .../feature/impl/PestsDestroyer.java | 6 ++++++ 3 files changed, 6 insertions(+) create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/.PestsDestroyer.java.swp delete mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/.ProfitCalculator.java.swp diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestsDestroyer.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestsDestroyer.java.swp new file mode 100644 index 0000000000000000000000000000000000000000..57deea9b925bb011ac7fe3fca647c4609fa2bb9c GIT binary patch literal 98304 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
9@9c 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 V9EJhk(CtXm*{|XEtuoIT{~yedz0Uvu literal 0 HcmV?d00001 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.ProfitCalculator.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.ProfitCalculator.java.swp deleted file mode 100644 index e1e4aebe85b17d463ae1d67acd62589788fbbb5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java index fbe6e9b85..917df84b0 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestsDestroyer.java @@ -162,6 +162,9 @@ public void start() { MacroHandler.getInstance().pauseMacro(); // MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty())); KeyBindUtils.stopMovement(); + if (FarmHelperConfig.profitCalcCountPestDrop) { + MacroHandler.getInstance().getMacroingTimer().resume(); + } } escapeState = EscapeState.NONE; rotationState = RotationState.NONE; @@ -1195,6 +1198,9 @@ private void finishMacro() { stop(); MacroHandler.getInstance().triggerWarpGarden(true, true, false); delayClock.schedule(2_000 + Math.random() * 500); + if (FarmHelperConfig.profitCalcCountPestDrop) { + MacroHandler.getInstance().getMacroingTimer().pause(); + } } else { stop(); } From 42a4dacbac854d42890894be4b98120f490d8149 Mon Sep 17 00:00:00 2001 From: Osama Date: Tue, 25 Feb 2025 11:23:24 +0600 Subject: [PATCH 10/19] Sorry .swp file --- .../feature/impl/.PestsDestroyer.java.swp | Bin 98304 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/.PestsDestroyer.java.swp diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestsDestroyer.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestsDestroyer.java.swp deleted file mode 100644 index 57deea9b925bb011ac7fe3fca647c4609fa2bb9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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
9@9c 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 V9EJhk(CtXm*{|XEtuoIT{~yedz0Uvu From 0d4cb9d5d4114b16b89c8c0382267a08f84dfb71 Mon Sep 17 00:00:00 2001 From: Indignified <87389247+Indignified@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:14:34 -0400 Subject: [PATCH 11/19] Update gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 45db43e85..731bcb136 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ baseGroup=com.jelly.farmhelperv2 mcVersion=1.8.9 modid=farmhelperv2 modName=FarmHelper -version=2.9.11.1 +version=2.9.11.2 shouldRelease=true From 8c5f55459660d7e92a4956de7d81821b46cc0794 Mon Sep 17 00:00:00 2001 From: Indignified <87389247+Indignified@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:17:06 -0400 Subject: [PATCH 12/19] Update AbstractMacro.java --- .../java/com/jelly/farmhelperv2/macro/AbstractMacro.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java index 7728cdd25..b5b5ac2f1 100644 --- a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java @@ -5,6 +5,7 @@ import com.jelly.farmhelperv2.event.ReceivePacketEvent; import com.jelly.farmhelperv2.failsafe.FailsafeManager; import com.jelly.farmhelperv2.feature.FeatureManager; +import com.jelly.farmhelperv2.failsafe.impl.RotationFailsafe; import com.jelly.farmhelperv2.feature.impl.DesyncChecker; import com.jelly.farmhelperv2.feature.impl.LagDetector; import com.jelly.farmhelperv2.handler.GameStateHandler; @@ -149,9 +150,9 @@ public void onTick() { } if (mc.thePlayer.getPosition().getY() < 0) { - LogUtils.sendError("Build a wall between the rewarp point and the void to prevent falling out of the garden! Disabling the macro..."); - MacroHandler.getInstance().disableMacro(); + LogUtils.sendError("Build a wall between the rewarp point and the void to prevent falling out of the garden! If it's there already, then you've been macro checked, good luck."); MacroHandler.getInstance().triggerWarpGarden(true, false); + FailsafeManager.getInstance().possibleDetection(RotationFailsafe.getInstance()); return; } From 161eec211eaf9cb2c0245e0a4210074bb2c765a6 Mon Sep 17 00:00:00 2001 From: Osama Date: Sun, 4 May 2025 14:02:58 +0600 Subject: [PATCH 13/19] Merge --- build.gradle.kts | 2 +- gradle.properties | 2 +- .../farmhelperv2/config/FarmHelperConfig.java | 85 ++++++++++++- .../feature/.FeatureManager.java.swp | Bin 0 -> 16384 bytes .../farmhelperv2/feature/FeatureManager.java | 1 + .../feature/impl/AutoPestExchange.java | 6 +- .../farmhelperv2/feature/impl/BanInfoWS.java | 23 +++- .../feature/impl/RancherSpeedSetter.java | 107 ++++++++++++++++ .../feature/impl/UsageStatsTracker.java | 119 ++++++++++++++++++ .../handler/GameStateHandler.java | 5 +- .../farmhelperv2/handler/MacroHandler.java | 14 +++ .../jelly/farmhelperv2/hud/UsageStatsHUD.java | 54 ++++++++ .../farmhelperv2/macro/AbstractMacro.java | 1 + .../jelly/farmhelperv2/util/PlayerUtils.java | 2 +- 14 files changed, 412 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/.FeatureManager.java.swp create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/RancherSpeedSetter.java create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/UsageStatsTracker.java create mode 100644 src/main/java/com/jelly/farmhelperv2/hud/UsageStatsHUD.java diff --git a/build.gradle.kts b/build.gradle.kts index efacb7645..d326be609 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { idea java - id("cc.polyfrost.loom") version "0.10.0.+" + id("cc.polyfrost.loom") version "0.10.0.5" id("dev.architectury.architectury-pack200") version "0.1.3" id("com.github.johnrengelman.shadow") version "8.1.1" // id("io.freefair.lombok") version "8.6" diff --git a/gradle.properties b/gradle.properties index 731bcb136..20d7ad403 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ baseGroup=com.jelly.farmhelperv2 mcVersion=1.8.9 modid=farmhelperv2 modName=FarmHelper -version=2.9.11.2 +version=2.9.5 shouldRelease=true diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index 805d44e65..caed58e06 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -23,6 +23,7 @@ import com.jelly.farmhelperv2.hud.DebugHUD; import com.jelly.farmhelperv2.hud.ProfitCalculatorHUD; import com.jelly.farmhelperv2.hud.StatusHUD; +import com.jelly.farmhelperv2.hud.UsageStatsHUD; import com.jelly.farmhelperv2.util.BlockUtils; import com.jelly.farmhelperv2.util.LogUtils; import com.jelly.farmhelperv2.util.PlayerUtils; @@ -111,10 +112,23 @@ public class FarmHelperConfig extends Config { @Switch( name = "Always hold W while farming", category = GENERAL, - description = "Always hold W while farming" + description = "Always hold W while farming", + size = OptionSize.DUAL ) public static boolean alwaysHoldW = false; + @Switch( + name = "Use Custom Farming Speed", category = GENERAL, + description = "Enable auto ranchers boots speed changer when farming" + ) + public static boolean customFarmingSpeed = false; + @Number( + name = "Custom Farming Speed", category = GENERAL, + description = "Set a Custom Farming Speed for Ranchers Boots", + min = 1, max = 400 + ) + public static int farmingSpeed = 400; + // @Switch( name = "Rotate After Warped", category = GENERAL, subcategory = "Rotation", @@ -1677,6 +1691,13 @@ public static void triggerManuallyPestsDestroyer() { size = 2 ) public static boolean autoPestExchangeTravelMethodInfo; + @DualOption( + name = "Teleport to", category = AUTO_PEST_EXCHANGE, subcategory = "Auto Pest Exchange", + description = "The plot to teleport to, to get to the pest exchange desk", + left = "Barn", + right = "Plot 2" + ) + public static boolean autoPestExchangeTpDestiination = false; @Slider( name = "Trigger before contest starts (in minutes)", category = AUTO_PEST_EXCHANGE, subcategory = "Auto Pest Exchange", description = "The time before the contest starts to trigger the auto pest exchange", @@ -2326,6 +2347,63 @@ public static void triggerManuallyAutoComposter() { name = "Profit Calculator HUD - Visual Settings", category = HUD, subcategory = " " ) public static ProfitCalculatorHUD profitHUD = new ProfitCalculatorHUD(); + @Switch( + name = "Colour-code 24-hour total", + description = "Green < 3.5 h, 3.5 h < Orange < 7 h, Red ≥ 7 h", + category = HUD, + subcategory = "Usage Stats" + ) + public static boolean colourCode24H = true; + @Switch( + name = "Show 24-hour total", + category = HUD, + subcategory = "Usage Stats" + ) + public static boolean showStats24H = true; + @Switch( + name = "Show 7-day total", + category = HUD, + subcategory = "Usage Stats" + ) + public static boolean showStats7D = false; + @Switch( + name = "Enable Long Term Data Storage", + category = HUD, + subcategory = "Usage Stats" + ) + public static boolean longTermUserStats = false; + @Info( + text = "Enabling long term storage of user stats could potentially lead to large files (< 1mb), which may cause lag, in time, on slow systems", + type = InfoType.WARNING, + category = HUD, + subcategory = "Usage Stats", + size = 2 + ) + public static boolean usageStatsInfo; + @Switch( + name = "Show 30-day total", + category = HUD, + subcategory = "Usage Stats" + ) + public static boolean showStats30D = false; + @Switch( + name = "Show lifetime total", + category = HUD, + subcategory = "Usage Stats" + ) + public static boolean showStatsLifetime = true; + @Switch( + name = "Show FH Usage Stats Title", + category = HUD, + subcategory = "Usage Stats" + ) + public static boolean showStatsTitle = false; + @HUD( + name = "Usage Stats HUD - Visual Settings", + category = HUD, + subcategory = "Usage Stats" + ) + public static UsageStatsHUD UsageStatsHUD = new UsageStatsHUD(); // // @@ -2445,6 +2523,8 @@ public FarmHelperConfig() { this.addDependency("macroType", "Macro Type", () -> !MacroHandler.getInstance().isMacroToggled()); + this.addDependency("farmingSpeed", "customFarmingSpeed"); + this.addDependency("customPitchLevel", "customPitch"); this.addDependency("customYawLevel", "customYaw"); @@ -2607,6 +2687,9 @@ public FarmHelperConfig() { this.addDependency("leaveTime", "leaveTimer"); + this.addDependency("showStats30D", "longTermUserStats"); + this.addDependency("showStatsLifetime", "longTermUserStats"); + this.hideIf("shownWelcomeGUI", () -> true); this.hideIf("configVersion", () -> true); diff --git a/src/main/java/com/jelly/farmhelperv2/feature/.FeatureManager.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/.FeatureManager.java.swp new file mode 100644 index 0000000000000000000000000000000000000000..2c0fc7bdddddc3f274e51557f22dbb173e589dfd GIT binary patch literal 16384 zcmeI2ZHy#E8OMt^57EOHe1Uk;-XmUSmF?lqFS5(a?al6RE4%J+vwIhbUut@4X8NwD zYpAMTn1c%h{h$&PH5wxrjWN*}G=3uiK0rJ)F?{yr14a`~Bq0z28jkP*|J7YJJv(nb z$4v-$-N|ozUY_oH`d`mf)$?rCZaluW;oRgNBse}y$R9ra$(DZk{60eN+CH+WUuPXF ztJOQUHY*E<*0)QQqt&tIrN!d5WI`78jf)k*Pcl!*VwsBeQ5JNVC`#cK+td$>C+Q9? zdc0jc$%3F;Y`~-yo9rAaHW*crV8wEB-k>3EGU4h=#x|XQkt=XxBFkzTcq>0QmpEt^xe@ zLxlVV{0iI;8lVC;!4g;m`@kz#6Y^{D7&r~?0t?`Ja22>5Tn1j>OUR4hm*5xRK2Qex zz-u4Go&)e>Aiyg4IC$X$gggU&2-@HXe^gKvRTU={2E|9&4KKLQVf2fzt%C#Znyz-w0! z@=f4_gW#W+!x!*Ja2EUy{1ki@90%Lr6W}=%Sbh(l1rGrSJcvFx4Z1-0$7jJ_a0NJr z!p!TsI5VTe!O@9of$uprZr|8*{2>n*4ISCyQ84cF`dTyOf|Y3?S*bOh74uFN=AHZS z#5m57Vo{&KsX7cgevJkW@T`JdosS1*XbtdLrkB17IPo!;VetwC>uBF~} zbW6QP%np>1zG^Qs+p#V5dLj|sm&;*yQ?-~dEv$yL7O;9@&AfMA*D+qFQeKd&4QK8a zd&}gh&(|k=^{_*x-=y2%VwIvJ?PDx13MQGVDyo=VZYU<=PF(S2{J2Jbj)Cq zF9$(#Nq->Or$5uzY5KD>#C~JX>%6(G`~ba%eqUj=s9D%=o3s(L=)r$GDFdp*`sy-u7Mi(}OBFt&*Pr+%k9TmrBIGh`!pf6Y3 z9o4lO4*Xar4U4^@*LpoL@TQ^K``yxd9sO=YG9EPhBDU|Py=8?-rMLBATOP(!MMIBa zpqCMI+N`IRHC~PsKS4!Z@EYrx-!NphEwRl{|L*0Mpx!Cm8b8Z5bN9mh@C6mWvcc;t z%j~!>eZ_^0hn_6s?XW3mZG&SL$TF>ZEmn_$Df|??;j0o2yeOdXBEKnWL?v zXqpaPXLN^c`8xPAB4nL5SD3;k)NIkqg0X<}Q(3o!7~Rk-wXn>|ZvRN7I%O;$q2XHC z;3ukC?Z+L6J+sr;9b+9>vQSN9th)>&e~X6A%+S|P9Aj8ch0u1Io8Qjs6+V?^34P#C zuo>u+Q9{D9U%c8_zE%9b|2)y@-#@eY#2Z6Cfpc^$t=mq}(i zu;X?*9i%1>4*R`n$+&AaW83CpLo8-eWB3&Xft@tX<70+U$T@c3!`b!YwW~@iLc5RF#v0oxO|JV8I z8^~RC{=b6L50KmIykCGl;AQ0S{{j-|9KQnohTQ#G@Fchm8~{3>e+;?%_rN#6N5DDc z>@S0F0|ickH;}Xc1N<301D*s=fJZ?D=E0TVDdh0K0Y3wef=9pu;45G+coBL0Pr!G; z*TL7o8E`*X2A=|dM-KlqxEpxj1h^Aaz_s9cx0e&h<| z3gim>zbKH*=INYnrhSpr$;?zN`)2=vG%vkUPxAU0xYR|~Xj8_4Yj@W-c9-VtOqQgu z$oGU=R&j0?zeWw_yb^Bh*uVl|z|RTmgrq(?a5ErE*Woo0gST}v;&PEz)ijgkvrLnG^ z>5tK|vADa&+$+?bUx@arXMM5D-3yJR3l;}!WTD<2+OW6?t_x9GU!prHmB$vb^uHp~ zj!eJT*2YGOsLw?Avrg>Bq>HG(+6a#8uXB@ZlQ@Z!|1uY4iXt;@Fr;w(0WqadBT8sP zzKpV&r4Ra9$LIY+?qrzH(z6LgyCJtG+0N3Zth(HgW0@Ds)Vm2Kw_(pF8PC!y9WrAo hMMF+avYoY0qY6?Z9U5skYi~vsy+(R7(r}_T{{wHW!><4U literal 0 HcmV?d00001 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java index ec985f3a7..be4694ddb 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java @@ -50,6 +50,7 @@ public List fillFeatures() { UngrabMouse.getInstance(), VisitorsMacro.getInstance(), PiPMode.getInstance(), + UsageStatsTracker.getInstance(), AutoWardrobe.instance, PestFarmer.instance// sue me ); diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoPestExchange.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoPestExchange.java index 3e10ab105..85c72dbb5 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoPestExchange.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoPestExchange.java @@ -257,7 +257,11 @@ public void onTickExecutionNew(TickEvent.ClientTickEvent event) { } positionBeforeTp = mc.thePlayer.getPosition(); newState = NewState.WAIT_FOR_TP; - mc.thePlayer.sendChatMessage("/tptoplot barn"); + if (!FarmHelperConfig.autoPestExchangeTpDestiination) { + mc.thePlayer.sendChatMessage("/tptoplot barn"); + } else { + mc.thePlayer.sendChatMessage("/tptoplot 2"); + } delayClock.schedule((long) (600 + Math.random() * 500)); break; case WAIT_FOR_TP: diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/BanInfoWS.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/BanInfoWS.java index ea1a65d36..2dbcd1ca3 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/BanInfoWS.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/BanInfoWS.java @@ -470,6 +470,24 @@ public void saveStats() { } public long getLongestSessionLast7D() { + if (FarmHelperConfig.longTermUserStats) { + long sevenDaysAgo = System.currentTimeMillis() - 604800000L; // 7 days in milliseconds + JsonArray jsonArray = readJsonArrayFromFile(); + long longestSessionLength = 0L; + + for (JsonElement element : jsonArray) { + JsonObject session = element.getAsJsonObject(); + long sessionTimestamp = session.get("timestamp").getAsLong(); + if (sessionTimestamp >= sevenDaysAgo) { + long sessionLength = session.get("timeMacroing").getAsLong(); + if (sessionLength > longestSessionLength) { + longestSessionLength = sessionLength; + } + } + } + return longestSessionLength; + } + long sevenDaysAgo = System.currentTimeMillis() - 604800000L; // 7 days in milliseconds JsonArray jsonArray = readJsonArrayFromFile(); JsonArray updatedJsonArray = new JsonArray(); @@ -486,9 +504,10 @@ public long getLongestSessionLast7D() { updatedJsonArray.add(session); } } - - writeJsonArrayToFile(updatedJsonArray); // Optimize by writing only if needed + // every time a user gets banned this function will run. it will delete entries in the json that are older than 7d + writeJsonArrayToFile(updatedJsonArray); return longestSessionLength; + } private JsonArray readJsonArrayFromFile() { diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/RancherSpeedSetter.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/RancherSpeedSetter.java new file mode 100644 index 000000000..cb092c666 --- /dev/null +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/RancherSpeedSetter.java @@ -0,0 +1,107 @@ +package com.jelly.farmhelperv2.feature.impl; + +import cc.polyfrost.oneconfig.utils.Multithreading; +import com.jelly.farmhelperv2.config.FarmHelperConfig; +import com.jelly.farmhelperv2.handler.MacroHandler; +import com.jelly.farmhelperv2.util.InventoryUtils; +import com.jelly.farmhelperv2.util.LogUtils; +import com.jelly.farmhelperv2.util.PlayerUtils; +import com.jelly.farmhelperv2.util.helper.Clock; +import com.jelly.farmhelperv2.util.helper.SignUtils; +import net.minecraft.client.Minecraft; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import java.util.concurrent.TimeUnit; + + +public final class RancherSpeedSetter { + /** @return true if need to change speed (async started), false otherwise */ + public static boolean runIfNeeded(Runnable after) { + if (!FarmHelperConfig.customFarmingSpeed) return false; + + int current = InventoryUtils.getRancherBootSpeed(); + if (current == -1) return false; + if (current == FarmHelperConfig.farmingSpeed) return false; + + INSTANCE.start(after); + return true; + } + + private enum Stage { NONE, START, INPUT, CONFIRM, END } + + private static final RancherSpeedSetter INSTANCE = new RancherSpeedSetter(); + + private final Minecraft mc = Minecraft.getMinecraft(); + private final Clock clock = new Clock(); + private Stage stage = Stage.NONE; + private Runnable callback; + private boolean enabled; + private boolean worldChanging; + + private RancherSpeedSetter() {} + + private void start(Runnable after) { + if (enabled) return; + this.callback = after; + this.stage = Stage.START; + this.enabled = true; + this.worldChanging = false; + clock.reset(); + MinecraftForge.EVENT_BUS.register(this); + LogUtils.sendDebug("[Rancher Speed Setter]: starting (target " + FarmHelperConfig.farmingSpeed + ")"); + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload e) { worldChanging = true; } + + @SubscribeEvent + public void onTick(TickEvent.ClientTickEvent e) { + if (!enabled || e.phase == TickEvent.Phase.END) return; + if (mc.thePlayer == null || mc.theWorld == null || worldChanging) { finish(); return; } + if (clock.isScheduled() && !clock.passed()) return; + + switch (stage) { + case START: { + mc.thePlayer.sendChatMessage("/setmaxspeed"); + stage = Stage.INPUT; + clock.schedule(750); + break; + } + case INPUT: { + if (mc.currentScreen == null) break; + SignUtils.setTextToWriteOnString(String.valueOf(FarmHelperConfig.farmingSpeed)); + stage = Stage.CONFIRM; + clock.schedule(750); + break; + } + case CONFIRM: { + if (mc.currentScreen == null) break; + SignUtils.confirmSign(); + stage = Stage.END; + clock.schedule(750); + break; + } + case END: { + LogUtils.sendSuccess("Rancher's Boots Speed set to " + FarmHelperConfig.farmingSpeed + "."); + PlayerUtils.getFarmingTool(MacroHandler.getInstance().getCrop(), false, false); + finish(); + break; + } + default: break; + } + } + + private void finish() { + enabled = false; + stage = Stage.NONE; + clock.reset(); + MinecraftForge.EVENT_BUS.unregister(this); + if (callback != null) { + Runnable run = callback; + callback = null; + Multithreading.schedule(run, 1, TimeUnit.MILLISECONDS); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/UsageStatsTracker.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/UsageStatsTracker.java new file mode 100644 index 000000000..f9d23d7ba --- /dev/null +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/UsageStatsTracker.java @@ -0,0 +1,119 @@ +package com.jelly.farmhelperv2.feature.impl; + +import com.google.gson.*; +import com.jelly.farmhelperv2.feature.IFeature; +import com.jelly.farmhelperv2.util.LogUtils; +import net.minecraft.client.Minecraft; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.time.*; +import java.util.concurrent.TimeUnit; +import java.util.zip.GZIPInputStream; + +import static com.jelly.farmhelperv2.feature.impl.BanInfoWS.fileNamePrefix; +import static com.jelly.farmhelperv2.feature.impl.BanInfoWS.statsDirectory; + + +public class UsageStatsTracker implements IFeature { + private static UsageStatsTracker instance; + public static UsageStatsTracker getInstance() { + return instance == null ? (instance = new UsageStatsTracker()) : instance; + } + + private long baseTodayMillis = 0; + private long baseTotalMillis = 0; + private LocalDate todayDate = LocalDate.now(); + private long sessionMillis = 0; + private long lastTickMillis = System.currentTimeMillis(); + private boolean running = false; + + private UsageStatsTracker() { loadFromFile(); } + + public String getTodayString() { + return fmt(baseTodayMillis + sessionMillis); + } + public String getTotalString() { + return fmt(baseTotalMillis + sessionMillis); + } + + public long getTodayMillis() { return baseTodayMillis + sessionMillis; } + + private long rollingMillis(int days) { + long cutoff = System.currentTimeMillis() - days * 86_400_000L; + long sum = 0; + for (JsonElement e : readArray()) { + JsonObject o = e.getAsJsonObject(); + if (o.get("timestamp").getAsLong() >= cutoff) + sum += o.get("timeMacroing").getAsLong(); + } + return sum + sessionMillis; + } + + public long get7dMillis() { return rollingMillis(7); } + public long get30dMillis() { return rollingMillis(30); } + public String get7dString() { return fmt(get7dMillis()); } + public String get30dString() { return fmt(get30dMillis()); } + + @Override public String getName() { return "User Stats Tracker"; } + @Override public boolean isRunning() { return running; } + @Override public boolean shouldPauseMacroExecution() { return false; } + @Override public boolean shouldStartAtMacroStart() { return false; } + @Override public boolean isToggled() { return true; } + @Override public boolean shouldCheckForFailsafes() { return false; } + @Override public void resetStatesAfterMacroDisabled() {} + @Override public void start() { running = true; lastTickMillis = System.currentTimeMillis(); } + @Override public void resume() { start(); } + @Override public void stop() { running = false ;} + + public void tick(boolean macroRunning) { + long now = System.currentTimeMillis(); + long delta = now - lastTickMillis; + lastTickMillis = now; + if (!todayDate.equals(LocalDate.now())) { + todayDate = LocalDate.now(); + baseTodayMillis = 0; + } + if (macroRunning && delta > 0 && delta < 5000) { + sessionMillis += delta; + } + } + + private void loadFromFile() { + JsonArray arr = readArray(); + LocalDate today = LocalDate.now(); + for (JsonElement e : arr) { + JsonObject o = e.getAsJsonObject(); + long ms = o.get("timeMacroing").getAsLong(); + baseTotalMillis += ms; + long ts = o.get("timestamp").getAsLong(); + LocalDate d = Instant.ofEpochMilli(ts).atZone(ZoneId.systemDefault()).toLocalDate(); + if (d.equals(today)) baseTodayMillis += ms; + } + } + + private String fmt(long ms) { + long h = TimeUnit.MILLISECONDS.toHours(ms); + long m = TimeUnit.MILLISECONDS.toMinutes(ms) % 60; + return String.format("%dh %02dm", h, m); + } + + private File statsFile() { + String uuid = Minecraft.getMinecraft().getSession().getPlayerID().replace("-", ""); + return new File(statsDirectory, fileNamePrefix + uuid + ".dat"); + } + + private JsonArray readArray() { + File f = statsFile(); + if (!f.exists()) return new JsonArray(); + try (GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(f)); + InputStreamReader isr = new InputStreamReader(gzis, StandardCharsets.UTF_8)) { + JsonElement el = new JsonParser().parse(isr); + return el.isJsonArray() ? el.getAsJsonArray() : new JsonArray(); + } catch (Exception e) { + LogUtils.sendDebug("Error Reading Usage Stats Array"); +// e.printStackTrace(); + } + return new JsonArray(); + } +} \ No newline at end of file diff --git a/src/main/java/com/jelly/farmhelperv2/handler/GameStateHandler.java b/src/main/java/com/jelly/farmhelperv2/handler/GameStateHandler.java index af4d393ec..a3eaa19c8 100644 --- a/src/main/java/com/jelly/farmhelperv2/handler/GameStateHandler.java +++ b/src/main/java/com/jelly/farmhelperv2/handler/GameStateHandler.java @@ -49,7 +49,7 @@ public class GameStateHandler { public final Pattern jacobsRemainingTimePattern = Pattern.compile("([0-9]|[1-2][0-9])m([0-9]|[1-5][0-9])s"); public final Pattern jacobsStartsInTimePattern = Pattern.compile("Starts In: ([1-3]?[0-9])?m ?([1-5]?[0-9])?s?"); private final Pattern serverClosingPattern = Pattern.compile("Server closing: (?\\d+):(?\\d+) .*"); - private final Pattern pestsFromVacuumPattern = Pattern.compile("Vacuum Bag: (\\d+) Pest(s)?"); + private final Pattern pestsFromVacuumPattern = Pattern.compile("Vacuum Bag: ([\\d,]+) Pest(s)?"); private final Pattern composterResourceTablistPattern = Pattern.compile("\\s(Organic Matter|Fuel): (\\d{1,3}(\\.\\d{1,3})?)k"); @Getter private Location lastLocation = Location.TELEPORTING; @@ -770,7 +770,8 @@ public int getPestsFromVacuum() { Matcher matcher = pestsFromVacuumPattern.matcher(line); if (matcher.find()) { try { - return Integer.parseInt(matcher.group(1)); + String numberStr = matcher.group(1).replaceAll(",", ""); + return Integer.parseInt(numberStr); } catch (Exception e) { LogUtils.sendError("Failed to parse pests from vacuum bag!"); LogUtils.sendWarning("Report this to #bug-reports!"); diff --git a/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java b/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java index 2b2538723..5775cf043 100644 --- a/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java +++ b/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java @@ -15,6 +15,7 @@ import com.jelly.farmhelperv2.util.LogUtils; import com.jelly.farmhelperv2.util.PlayerUtils; import com.jelly.farmhelperv2.util.RenderUtils; +import com.jelly.farmhelperv2.util.InventoryUtils; import com.jelly.farmhelperv2.util.helper.AudioManager; import com.jelly.farmhelperv2.util.helper.Clock; import com.jelly.farmhelperv2.util.helper.Timer; @@ -165,6 +166,18 @@ public void toggleMacro() { LogUtils.sendWarning("Farm manually and DO NOT restart the macro too soon! The staff might still be spectating you for a while!"); return; } + if (FarmHelperConfig.customFarmingSpeed) { + if (InventoryUtils.getRancherBootSpeed() == -1) { + LogUtils.sendError("You must have Rancher's Boots equipped for custom farming speed."); + } + else if (InventoryUtils.getRancherBootSpeed() != FarmHelperConfig.farmingSpeed) { + if (RancherSpeedSetter.runIfNeeded(this::enableMacro)) { + return; + } + } else { + LogUtils.sendDebug("Rancher's Boot at custom farming speed."); + } + } this.enableMacro(); } } @@ -321,6 +334,7 @@ public void onTick(TickEvent.ClientTickEvent event) { if (!cm.isEnabledAndNoFeature()) return; cm.onTick(); }); + UsageStatsTracker.getInstance().tick(!isCurrentMacroPaused()); } @SubscribeEvent diff --git a/src/main/java/com/jelly/farmhelperv2/hud/UsageStatsHUD.java b/src/main/java/com/jelly/farmhelperv2/hud/UsageStatsHUD.java new file mode 100644 index 000000000..65d43daca --- /dev/null +++ b/src/main/java/com/jelly/farmhelperv2/hud/UsageStatsHUD.java @@ -0,0 +1,54 @@ +package com.jelly.farmhelperv2.hud; + +import cc.polyfrost.oneconfig.config.core.OneColor; +import cc.polyfrost.oneconfig.hud.TextHud; +import com.jelly.farmhelperv2.config.FarmHelperConfig; +import com.jelly.farmhelperv2.feature.impl.UsageStatsTracker; +import com.jelly.farmhelperv2.handler.GameStateHandler; + +import java.util.List; + +public class UsageStatsHUD extends TextHud { + + public UsageStatsHUD() { + super(true, 1f, 10f, 0.9f, true, true, + 4, 5, 5, new OneColor(0,0,0,150), + false, 2, new OneColor(0,0,0,127)); + } + + @Override + protected void getLines(List lines, boolean example) { + if (FarmHelperConfig.showStatsTitle) { + lines.add("§lFH Usage Stats"); + } + if (FarmHelperConfig.showStats24H) { + String colour = ""; + if (FarmHelperConfig.colourCode24H) { + double hrs = UsageStatsTracker.getInstance().getTodayMillis() / 3_600_000.0; + if (hrs < 3.5) colour = "§a"; + else if (hrs < 7.0) colour = "§6"; + else colour = "§c"; + } + lines.add("24 hour: " + colour + UsageStatsTracker.getInstance().getTodayString()); + } + if (FarmHelperConfig.showStats7D) { + lines.add("7 day: §a" + UsageStatsTracker.getInstance().get7dString()); + } + if (FarmHelperConfig.showStats30D) { + lines.add("30 day: §a" + UsageStatsTracker.getInstance().get30dString()); + } + if (FarmHelperConfig.showStatsLifetime) { + lines.add("lifetime: §a" + UsageStatsTracker.getInstance().getTotalString()); + } + if (!FarmHelperConfig.showStatsTitle &&!FarmHelperConfig.showStats24H && !FarmHelperConfig.showStats7D && !FarmHelperConfig.showStats30D && !FarmHelperConfig.showStatsLifetime) { + lines.add("§cEnable usage stats in the HUD config menu"); + } + } + + @Override + protected boolean shouldShow() { + return super.shouldShow() + && !FarmHelperConfig.streamerMode + && GameStateHandler.getInstance().inGarden(); + } +} diff --git a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java index b5b5ac2f1..032f4ba2b 100644 --- a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java @@ -4,6 +4,7 @@ import com.jelly.farmhelperv2.config.FarmHelperConfig; import com.jelly.farmhelperv2.event.ReceivePacketEvent; import com.jelly.farmhelperv2.failsafe.FailsafeManager; +import com.jelly.farmhelperv2.failsafe.impl.RotationFailsafe; import com.jelly.farmhelperv2.feature.FeatureManager; import com.jelly.farmhelperv2.failsafe.impl.RotationFailsafe; import com.jelly.farmhelperv2.feature.impl.DesyncChecker; diff --git a/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java b/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java index 3f2cc34d4..1cefc075f 100644 --- a/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java +++ b/src/main/java/com/jelly/farmhelperv2/util/PlayerUtils.java @@ -384,7 +384,7 @@ public static EnumFacing getHorizontalFacing(float yaw) { public static void closeScreen() { if (mc.currentScreen != null && mc.thePlayer != null) { - mc.thePlayer.closeScreen(); + mc.addScheduledTask(() -> { mc.thePlayer.closeScreen();}); } } From 2154c45f0b1d7b9eed4866c8cef1346562bf6f04 Mon Sep 17 00:00:00 2001 From: Osama <136880578+osamabeinglagging@users.noreply.github.com> Date: Sun, 4 May 2025 17:30:11 +0600 Subject: [PATCH 14/19] Fixed Suntzu Tweking --- .../jelly/farmhelperv2/macro/impl/SShapeVerticalCropMacro.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jelly/farmhelperv2/macro/impl/SShapeVerticalCropMacro.java b/src/main/java/com/jelly/farmhelperv2/macro/impl/SShapeVerticalCropMacro.java index c78e07af8..943f412a5 100644 --- a/src/main/java/com/jelly/farmhelperv2/macro/impl/SShapeVerticalCropMacro.java +++ b/src/main/java/com/jelly/farmhelperv2/macro/impl/SShapeVerticalCropMacro.java @@ -45,7 +45,7 @@ public void updateState() { } changeState(State.SWITCHING_LANE); setWalkingDirection(); - } else if (FarmHelperConfig.getMacro() != FarmHelperConfig.MacroEnum.S_CACTUS && GameStateHandler.getInstance().isBackWalkable() && !FarmHelperConfig.alwaysHoldW) { + } else if (FarmHelperConfig.getMacro() != FarmHelperConfig.MacroEnum.S_CACTUS && FarmHelperConfig.getMacro() != FarmHelperConfig.MacroEnum.S_CACTUS_SUNTZU && GameStateHandler.getInstance().isBackWalkable() && !FarmHelperConfig.alwaysHoldW) { if (stuckInMelonsOrPumpkins()) { AntiStuck.getInstance().setDirectionBlockPos(BlockUtils.getRelativeBlockPos(0, 0, -1, getYaw())); AntiStuck.getInstance().start(); From a76dbf8cfdc6ee7be35b59f67263b9cc14b6b3ac Mon Sep 17 00:00:00 2001 From: Osama Date: Sun, 4 May 2025 17:57:57 +0600 Subject: [PATCH 15/19] Rod Cast --- .../farmhelperv2/config/FarmHelperConfig.java | 5 ++++ .../feature/.FeatureManager.java.swp | Bin 16384 -> 0 bytes .../feature/impl/.PestFarmer.java.swp | Bin 0 -> 40960 bytes .../farmhelperv2/feature/impl/PestFarmer.java | 26 ++++++++++++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) delete mode 100644 src/main/java/com/jelly/farmhelperv2/feature/.FeatureManager.java.swp create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index caed58e06..cffb1d501 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -1479,6 +1479,11 @@ public static void triggerManuallyPestsDestroyer() { ) public static int pestFarmingWaitTime = 255; + @Switch( + name = "Cast Rod After Warping", category = PEST_FARMER + ) + public static boolean pestFarmingCastRod = false; + @Switch( name = "Swap Equipments", category = PEST_FARMER ) diff --git a/src/main/java/com/jelly/farmhelperv2/feature/.FeatureManager.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/.FeatureManager.java.swp deleted file mode 100644 index e7f4cd558ced427e3a6e18ca0f6cfd0acebdc6fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI2O^h7H6~_x>K4O9)9~O`xxz{GvY{>T5<^sDhcz1T!-ei{@Ji8ctqPC}IrtO~Y zp{jcAwXt$Y4!J~191zGvkq}WLM7VH33MdK+$VlXpLriiY0tt|i5Fdg_!OFq;S9jI) z?0oeYj}YK)>9;e}^SbNxzur{Uds{0z@10w)?yz?e9M==_=dCx?)Z4$`M987#sYUfZ z?US${xUDYf*>v_rrog4GKqxC?w{Ir5 z?cTL>`?eA5Ti;y1wDriIK2so5AX6YyAX6YyAX6YyAXDHHR6sU1kn?!%4Zs1HX)ed> zG*HC=buK$H1u_LP1u_LP1u_LP1u_LP1u_LP1u_LP1u_M`yb91VA;;nVcT@oY|NmDt zfPY;_$UnhT;2}@}MX(4az&N-We6*R6KZ2*hac~HXf$d-u*a$8M|Gk!w_rM>(@4*Q$ z3vLFVe4UUp;5UGS8L$PsdkrBkf=59e>;*T1_csyp5_lL?fDO)njgYh8Ng%+Fz*g|_ z)r9;FoCYqK0$ac)@YYp?yb4|hFM(6w0dNT155~c_!E09%@*JpvL*Q<(16W`yc=rlI z{tE5`w*vy6-AKsqz+>PP_!aQMt>Am$7Vr)VET_T4;Md?D@FDtO5zK-8K=sLgP<(kE z`~$oK&VVk5g`*L!c&=lu1m=TzjZOw0qrN3-LFn~5U!JS_0cW$+6Rc1h%!)Zja--G> z2!i7z$>-IpIyl274d2q6HH0lBXSALhwW+_hK&4a5>94G@JB^hcxmPaIP_PB+@L=W` zb3*9`KHAu^qiN=f1EKG`el59k7xjFsWwrxv$ok)36u2!s( zJ?572Q(vf0=ITy|biWC^67U&{jx>)kKF*n7vLvZwVzMF`k2-PM7185r`L!dffm=q9 zz<$#6;!9cs$vpkZmQGXWP7?Etd7Tfc%hL7GYv}iBwh~rz+f0)tV#cj))~)7)U1joa zT4y=aUFJ^ewMRs7Ru5KLGm?@(GS_NR5avN6*XFZZvCNgWE0%(4RdxPQA{xEZ=0Vae z+9egau~n<`<+xLz{me0kHDt3B`^I7qbsUT>y!EL+?_L|8`f4n@SVg<${lTyivf|1D^__4YAou_v}RO5CD)}} zb4)dL6?TJk=scsVY{^y8ni5j;v^vcsHle1AKFb;Ng5XHnEg{C5?-XiS7p1p9RV)n{ z{8QAQ^DDu@Qd;{_2V&3cAa(~>1D4E}gBYtW!&FhDel<1pl@kXT)?Yrf9pvWwf^sn! z$g+Swa0har5Y!uiz#=5o0bjZ$89J$bs~&5L9;dYDE!Fz-hh{m{T-HV-thL8lzf6rr zL_N^AU*~$>Y`nW!B$G*lyQ^4PStZumM)wH?t@-SzwV#TbGQZPIEPL?@l0+fN$`|+A( zs1c#!`qYaRZ5K}qryYw#k4%~(n0s_@*7!O>w0Dk2g=lvU)2@s7;?h$4&TS+qp8fra z=1DK8uVAo<)t)e>`fRLw^DMTx+tD_6yLFp;d`q*qO*7VWyA7XWKN^@*F~M3rZm#Vo zh|2%ZA|E}ca#!U4(|CCVxxLE!Ik*aZfE@m9Ab`s8i{RhL-CqXJgS)^Epz`^rk-MJ) zKL_6cpCV`f0Q>?-a2T9J&i*EN4ZH}R2Y&*OgAj~@tHBG%;hzCdfXBgU@Dp%9xE8#J zJpQ-fm*8jMr{E-b2uyfa1B&2A@H%pMmEXHy0*rwXa2fa?G*P;I zs+Oo6Y80`Y8~%;|dC=W$_8PsO5T_HWAzlPlFEua34$ZKRnd$85WHeL-Y> zEzitkan6ebk;_RLlqLQ92ENO|nHPen+6?fJZiRvSDd^WLkG1XM}1~2uQNJ9}a zRMo&F)|E4@G1@a0*B7OmmAwlK(N^`0FJ`%Wv5|Dq;$V%;q@QgZCsFc08}M0*sx+-Iq;RbP zF`!RfYHl6Abh8S{P_Z@Lw|x_Z;qu&+1&2kWNK`~Uy| diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp new file mode 100644 index 0000000000000000000000000000000000000000..f7fdecb720e170a4addb517bcfc12d4c3e8462c4 GIT binary patch literal 40960 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 Date: Sun, 4 May 2025 18:06:27 +0600 Subject: [PATCH 16/19] idota --- .../feature/impl/.PestFarmer.java.swp | Bin 40960 -> 32768 bytes .../farmhelperv2/feature/impl/PestFarmer.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp index f7fdecb720e170a4addb517bcfc12d4c3e8462c4..92f6489a521e35932788eb396d35fec743519169 100644 GIT binary patch delta 998 zcmXZaTS(Jk7{~Ev+kZNQ{Y z--}#DN?urz7rKiMU>ZajbWq45^rC1{mf+2@i_rBQ?S&8T^M83S-v9G^dZvs$Jw}J8 zu+dfR*qvV_EM26yDeYvebY_YiX(+Gho6Q-kcxo$1kSM1{oP{AyV|Sw~{+-C~!E05g zry0y4pMKre_t`P-&~$SF=h-T$u-m`5PUIObU>A&dkR&pIUIfsMdQ_qWI+iUWFYp+* z(25$AAPY7mVwGq7!3t&&ghD^s6U8s36h$b+YJ$iYOk)&5^r923IE5nEuwoXO$4g9L z5J3zefG#wn7FBS;4hvT3)dD6pzsOyRYiPqkFPl9#6Oedoaq1n delta 1543 zcmXZceM}Q)0LSsC<)9Qjdg#QIEYcwoXC`Yg65lWa4gzk1(UMFCN{5P(89^Z%f+dXo zLoz2mCcKD=N;WmVY;ymofMfUurrGFxk6_r;#o$OxCKiprzPI&~PoL+xyI$M-{d%>v z=Gq>!!{f}$`oys`(Iwb4ArkUtml)IgAwq0)r{y&IP~k{gHH_z7(| zh(@f138ShIk1>Qn^x+VyQG!AgU=d<53-2H>U5F2#NiD!`3>8U2^XUAj7A(r0iqEg^*_*p8hGHsXecTEN~{-P z#J&upr1m>b!-Gepa~k#7f*h>HTap;U4O~YPs<8>_n2#7(FhM47@f5vi#~JYdl>X9a z{pYf1Rk5E7;+&5G8pthUMK)c0ksd%7In9w7@W!ooJ>WM+PxCH>p&#*)K!dAvN9af7$0Scq3#vCghKZf!G>ZwvH&VZ>Bl{Ep&6gzU6}BIj+}$>_(_0L3z~@+vL@dNZI?{z7@I5M#kCljn1+Tf& de_;?0RbH;*80yT8{&6EhIq+4O-cweh{tF#4`1Jq) diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index eab6be404..d979692aa 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -476,7 +476,7 @@ public void onTickSwap(ClientTickEvent event) { break; case HOLD_ROD: if (isTimerRunning()) return; - if (FarmHelperConfig.pestFarmerCastRod) { + if (FarmHelperConfig.pestFarmingCastRod) { for (int i = 0; i < 9; i++) { ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i); if (stack != null && stack.getItem() instanceof ItemFishingRod) { From da70c33a84a6c48cccb7f34efd616a605a951fa1 Mon Sep 17 00:00:00 2001 From: Osama Date: Sun, 4 May 2025 18:34:48 +0600 Subject: [PATCH 17/19] Rod 3 --- .../feature/impl/.PestFarmer.java.swp | Bin 32768 -> 40960 bytes .../farmhelperv2/feature/impl/PestFarmer.java | 71 ++++++++++++------ 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp index 92f6489a521e35932788eb396d35fec743519169..7e9bc9fe2495596498a9a6155c2e5823cc7710d9 100644 GIT binary patch delta 3975 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 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index d979692aa..2878f0a09 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -23,6 +23,8 @@ import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemFishingRod; import java.lang.Math; @@ -204,7 +206,7 @@ public void onChat(ClientChatReceivedEvent event) { } else { if (returnState.ordinal() == 1) setState(ReturnState.TP_TO_SPAWN_PLOT, 0); else { - setState(ReturnState.HOLD_ROD, FarmHelperConfig.getRandomGUIMacroDelay()); + setState(ReturnState.HOLD_MOUSEMAT, FarmHelperConfig.getRandomGUIMacroDelay()); wasSpawnChanged = false; } } @@ -287,8 +289,28 @@ public void onTickSwap(ClientTickEvent event) { break; } - setState(State.ENDING, 0); + setState(State.HOLD_ROD, FarmHelperConfig.getRandomGUIMacroDelay()); break; + case HOLD_ROD: + if (isTimerRunning()) return; + if (FarmHelperConfig.pestFarmingCastRod) { + for (int i = 0; i < 9; i++) { + ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i); + if (stack != null && stack.getItem() instanceof ItemFishingRod) { + mc.thePlayer.inventory.currentItem = i; + setState(State.CAST_ROD, FarmHelperConfig.getRandomGUIMacroDelay()); + return; + } + } + LogUtils.sendError("Could not find a fishing rod in hotbar"); + } + setState(State.ENDING, 0); + break; + case CAST_ROD: + if (isTimerRunning()) return; + KeyBindUtils.rightClick(); + setState(ReturnState.ENDING, 0); + break; case ENDING: stop(); break; @@ -474,25 +496,25 @@ public void onTickSwap(ClientTickEvent event) { break; } break; - case HOLD_ROD: - if (isTimerRunning()) return; - if (FarmHelperConfig.pestFarmingCastRod) { - for (int i = 0; i < 9; i++) { - ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i); - if (stack != null && stack.getItem() instanceof ItemFishingRod) { - mc.thePlayer.inventory.currentItem = i; - setState(ReturnState.CAST_ROD, FarmHelperConfig.getRandomGUIMacroDelay()); - return; - } - } - } - setState(ReturnState.ENDING, 0); - break; - case CAST_ROD: - if (isTimerRunning()) return; - KeyBindUtils.rightClick(); - setState(ReturnState.ENDING, 0); - break; + case HOLD_MOUSEMAT: + if (isTimerRunning()) return; + /* + if (FarmHelperConfig.pestFarmingUseMousemat) { + for (int i = 0; i < 9; i++) { + ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i); + if (stack != null && stack.hasDisplayName() && stack.getDisplayName.contains("Mousemat")) { + List lore = InventoryUtils.getItemLore(stack); + int j = 0; + for (String str: lore) { + if (str.contains(": ")) { + } + } + } + } + } + */ + setState(State.ENDING, 0); + break; case ENDING: KeyBindUtils.stopMovement(); stop(); @@ -545,6 +567,8 @@ enum State { TOGGLING_PEST_DESTROYER, WAITING_FOR_PEST_DESTROYER, WAITING_FOR_WARP, + HOLD_ROD, + CAST_ROD, ENDING } @@ -563,8 +587,9 @@ enum ReturnState { SNEAKING_AND_ROTATING, SETTING_SPAWN, WAITING_FOR_SPAWN_2, // definitely could've improved but you dont see me care now do you - HOLD_ROD, - CAST_ROD, + HOLD_MOUSEMAT, + USE_MOUSEMAT, + WAITING_FOR_MOUSEMAT, ENDING } } From 40b408bfb21f223538ba047abb92d1102b99daa0 Mon Sep 17 00:00:00 2001 From: Osama Date: Mon, 5 May 2025 09:58:12 +0600 Subject: [PATCH 18/19] Rod-fix --- .../feature/impl/.PestFarmer.java.swp | Bin 40960 -> 0 bytes .../farmhelperv2/feature/impl/PestFarmer.java | 44 +++++++++--------- 2 files changed, 22 insertions(+), 22 deletions(-) delete mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp deleted file mode 100644 index 7e9bc9fe2495596498a9a6155c2e5823cc7710d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index 2878f0a09..63e2fa4ca 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -291,31 +291,31 @@ public void onTickSwap(ClientTickEvent event) { setState(State.HOLD_ROD, FarmHelperConfig.getRandomGUIMacroDelay()); break; - case HOLD_ROD: - if (isTimerRunning()) return; - if (FarmHelperConfig.pestFarmingCastRod) { - for (int i = 0; i < 9; i++) { - ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i); - if (stack != null && stack.getItem() instanceof ItemFishingRod) { - mc.thePlayer.inventory.currentItem = i; - setState(State.CAST_ROD, FarmHelperConfig.getRandomGUIMacroDelay()); - return; - } - } - LogUtils.sendError("Could not find a fishing rod in hotbar"); - } - setState(State.ENDING, 0); - break; - case CAST_ROD: - if (isTimerRunning()) return; - KeyBindUtils.rightClick(); - setState(ReturnState.ENDING, 0); - break; + case HOLD_ROD: + if (isTimerRunning()) return; + if (FarmHelperConfig.pestFarmingCastRod) { + for (int i = 0; i < 9; i++) { + ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i); + if (stack != null && stack.getItem() instanceof ItemFishingRod) { + mc.thePlayer.inventory.currentItem = i; + setState(State.CAST_ROD, FarmHelperConfig.getRandomGUIMacroDelay()); + return; + } + } + LogUtils.sendError("Could not find a fishing rod in hotbar"); + } + setState(State.ENDING, 0); + break; + case CAST_ROD: + if (isTimerRunning()) return; + KeyBindUtils.rightClick(); + setState(State.ENDING, 0); + break; case ENDING: stop(); break; - } - break; + } + break; } case RETURN: { From ace13e80708c007c72be03eacb05fa47b90ad746 Mon Sep 17 00:00:00 2001 From: Osama Date: Mon, 5 May 2025 10:24:37 +0600 Subject: [PATCH 19/19] Some more fixes --- gradle.properties | 2 +- .../farmhelperv2/config/FarmHelperConfig.java | 11 ++++++----- .../feature/impl/.PestFarmer.java.swp | Bin 0 -> 36864 bytes .../farmhelperv2/feature/impl/PestFarmer.java | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp diff --git a/gradle.properties b/gradle.properties index 20d7ad403..8084eea36 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ baseGroup=com.jelly.farmhelperv2 mcVersion=1.8.9 modid=farmhelperv2 modName=FarmHelper -version=2.9.5 +version=2.9.5-1 shouldRelease=true diff --git a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java index cffb1d501..ea65c35dc 100644 --- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java +++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java @@ -1479,11 +1479,6 @@ public static void triggerManuallyPestsDestroyer() { ) public static int pestFarmingWaitTime = 255; - @Switch( - name = "Cast Rod After Warping", category = PEST_FARMER - ) - public static boolean pestFarmingCastRod = false; - @Switch( name = "Swap Equipments", category = PEST_FARMER ) @@ -1512,6 +1507,11 @@ public static void triggerManuallyPestsDestroyer() { ) public static boolean pestFarmerKillPests = false; + @Switch( + name = "Cast Rod After Warping", category = PEST_FARMER + ) + public static boolean pestFarmerCastRod = false; + @Slider( name = "Pest Count to Start Killing At", category = PEST_FARMER, min = 1, max = 8 @@ -2689,6 +2689,7 @@ public FarmHelperConfig() { this.addDependency("pestFarmerStartKillAt", "pestFarmerKillPests"); this.addDependency("pestSwapEq", "pestSwapEquipments"); + this.addDependency("pestFarmerCastRod", "pestFarmerKillPests"); this.addDependency("leaveTime", "leaveTimer"); diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp new file mode 100644 index 0000000000000000000000000000000000000000..f5ef4b249eb2bae2eed514428d4bbe4d806535f5 GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java index 63e2fa4ca..8da4a3767 100644 --- a/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java +++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java @@ -293,7 +293,7 @@ public void onTickSwap(ClientTickEvent event) { break; case HOLD_ROD: if (isTimerRunning()) return; - if (FarmHelperConfig.pestFarmingCastRod) { + if (FarmHelperConfig.pestFarmerCastRod) { for (int i = 0; i < 9; i++) { ItemStack stack = mc.thePlayer.inventory.getStackInSlot(i); if (stack != null && stack.getItem() instanceof ItemFishingRod) { @@ -513,7 +513,7 @@ public void onTickSwap(ClientTickEvent event) { } } */ - setState(State.ENDING, 0); + setState(ReturnState.ENDING, 0); break; case ENDING: KeyBindUtils.stopMovement();