diff --git a/gradle.properties b/gradle.properties
index 08672962c..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.4-pre4
+version=2.9.5-1
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..74f39556b 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;
@@ -15,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 {
@@ -58,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,8 +87,13 @@ public void update() {
FarmHelperConfig.checkForUpdate();
}
- @SubCommand
- public void test(){
- LogUtils.sendSuccess("SprayonatorState: " + GameStateHandler.getInstance().getSprayonatorState());
+ @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 976a9ee5f..089bec3f9 100644
--- a/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java
+++ b/src/main/java/com/jelly/farmhelperv2/config/FarmHelperConfig.java
@@ -44,6 +44,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";
@@ -52,6 +53,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";
@@ -225,6 +227,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",
@@ -281,6 +304,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);
//
//
@@ -817,26 +846,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();
@@ -1211,6 +1240,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"
@@ -1239,7 +1273,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;
@@ -1305,11 +1339,49 @@ 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;
+
+ @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 = "";
+
//
//
-
@Color(
name = "Rewarp Color", category = GENERAL, subcategory = "Rewarp",
description = "The color of the rewarp box"
@@ -1375,6 +1447,114 @@ 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;
+
+ @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;
+
+ @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
+ )
+ 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
+ )
+ 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 = " 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;
+
+ //
//
//
@Switch(
@@ -1828,6 +2008,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;
//
//
@@ -2156,7 +2342,11 @@ public static void triggerManuallyAutoComposter() {
name = "Reset stats between disabling", category = HUD, subcategory = "Profit Calculator"
)
public static boolean resetStatsBetweenDisabling = false;
-// @Button(
+ @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
// )
@@ -2248,7 +2438,6 @@ public static void triggerManuallyAutoComposter() {
)
public static boolean debugMode = false;
-
//
//
@@ -2329,7 +2518,6 @@ public static void triggerManuallyAutoComposter() {
)
public static boolean showDebugLogsAboutPDOTT = false;
-
//
@Number(name = "Config Version", category = EXPERIMENTAL, subcategory = "Experimental", min = 0, max = 1337)
@@ -2424,8 +2612,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");
@@ -2436,9 +2624,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);
@@ -2498,6 +2686,16 @@ public FarmHelperConfig() {
this.addDependency("rotationTimeDuringJacob", "customRotationDelaysDuringJacob");
this.addDependency("rotationTimeRandomnessDuringJacob", "customRotationDelaysDuringJacob");
+ this.addDependency("pestArmorSlot0", "pestSwapArmorBefore");
+ 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("pestFarmerCastRod", "pestFarmerKillPests");
+
this.addDependency("leaveTime", "leaveTimer");
this.addDependency("showStats30D", "longTermUserStats");
@@ -2524,6 +2722,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) {
@@ -2583,8 +2786,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) {
@@ -2597,8 +2801,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);
}
@@ -2607,8 +2812,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/FeatureManager.java b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java
index 061388f75..620fa2763 100644
--- a/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java
+++ b/src/main/java/com/jelly/farmhelperv2/feature/FeatureManager.java
@@ -49,8 +49,11 @@ public List fillFeatures() {
Scheduler.getInstance(),
UngrabMouse.getInstance(),
VisitorsMacro.getInstance(),
+ PiPMode.getInstance(),
UsageStatsTracker.getInstance(),
- PiPMode.getInstance()
+ UsageStatsTracker.getInstance(),
+ AutoWardrobe.instance,
+ PestFarmer.instance// sue me
);
features.addAll(featuresList);
return features;
@@ -103,8 +106,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 +118,9 @@ public boolean shouldIgnoreFalseCheck() {
if (AutoPestExchange.getInstance().isRunning() && !AutoPestExchange.getInstance().shouldCheckForFailsafes()) {
return true;
}
+ if (PestFarmer.instance.isRunning() && !PestFarmer.instance.shouldCheckForFailsafes()) {
+ return true;
+ }
if (AutoComposter.getInstance().isRunning() && !AutoComposter.getInstance().shouldCheckForFailsafes()) {
return true;
}
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 000000000..f5ef4b249
Binary files /dev/null and b/src/main/java/com/jelly/farmhelperv2/feature/impl/.PestFarmer.java.swp differ
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..2f7b200b5 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(FarmHelperConfig.autoSprayonatorStartDelay);
+ } 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
new file mode 100644
index 000000000..47ad62c83
--- /dev/null
+++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/AutoWardrobe.java
@@ -0,0 +1,270 @@
+package com.jelly.farmhelperv2.feature.impl;
+
+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 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;
+import net.minecraftforge.fml.common.gameevent.TickEvent.Phase;
+import java.util.List;
+import java.util.ArrayList;
+
+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 int invStart = 54;
+ private int invEnd = 54;
+ private List equipmentsToSwapTo = new ArrayList<>();
+ 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;
+ }
+
+ swapTo = slot;
+ enabled = true;
+ 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) {
+ return;
+ }
+ enabled = false;
+ swapTo = -1;
+ invStart = 54;
+ invEnd = 54;
+ equipmentsToSwapTo.clear();
+ 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 || mc.thePlayer == null || event.phase != Phase.START) {
+ 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") && InventoryUtils.isInventoryLoaded()) {
+ 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;
+ // this is just here to give a bit extra pause before it stops
+ case WAITING:
+ if (isTimerRunning()) {
+ return;
+ }
+ 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;
+ 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 "";
+ }
+ 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, OPENING_EQ, EQ_VERIFY, SWAPPING_EQUIPMENT, 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
new file mode 100644
index 000000000..8da4a3767
--- /dev/null
+++ b/src/main/java/com/jelly/farmhelperv2/feature/impl/PestFarmer.java
@@ -0,0 +1,595 @@
+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.feature.impl.PestsDestroyer;
+import com.jelly.farmhelperv2.handler.GameStateHandler;
+import com.jelly.farmhelperv2.handler.MacroHandler;
+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 net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemFishingRod;
+
+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 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() {
+ 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;
+ mainState = MainState.NONE;
+ returnState = ReturnState.STARTING;
+ swapTo = -1;
+ equipments.clear();
+ enabled = false;
+ }
+
+ @Override
+ public boolean isToggled() {
+ return FarmHelperConfig.pestFarming;
+ }
+
+ @Override
+ public boolean shouldCheckForFailsafes() {
+ return (mainState != MainState.RETURN || returnState.ordinal() > 7) && (state != State.WAITING_FOR_WARP);
+ }
+
+ @Override
+ public void start() {
+ if (enabled) {
+ return;
+ }
+ MacroHandler.getInstance().pauseMacro();
+ enabled = true;
+ IFeature.super.start();
+ }
+
+ @Override
+ public void stop() {
+ if (!enabled) {
+ return;
+ }
+
+ enabled = false;
+ kill = false;
+ equipments = new ArrayList<>();
+ mainState = MainState.NONE;
+ state = State.SWAPPING;
+ 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();
+ }
+
+ @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) {
+ return;
+ }
+ if (mc.currentScreen != null) {
+ 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 (wasSpawnChanged && FarmHelperConfig.pestFarmerKillPests && PlayerUtils.isStandingOnRewarpLocation()) {
+ mainState = MainState.RETURN;
+ start();
+ return;
+ }
+
+ if (pestSpawned) {
+ long timeDiff = System.currentTimeMillis() - pestSpawnTime;
+ if (timeDiff >= FarmHelperConfig.pestFarmingWaitTime * 1000L) {
+ pestSpawned = false;
+ 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;
+ if (FarmHelperConfig.pestFarmingSwapEq) {
+ equipments = Arrays.asList(FarmHelperConfig.pestFarmingEq0.split("\\|"));
+ }
+ mainState = MainState.SWAP_N_START;
+ start();
+ }
+ }
+ }
+
+ @SubscribeEvent(priority = EventPriority.HIGHEST)
+ public void onChat(ClientChatReceivedEvent event) {
+ if (event.type != 0) {
+ return;
+ }
+ String message = event.message.getUnformattedText();
+ 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.HOLD_MOUSEMAT, FarmHelperConfig.getRandomGUIMacroDelay());
+ 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
+ public void onTickSwap(ClientTickEvent event) {
+ if (!enabled) {
+ 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.HOLD_ROD, FarmHelperConfig.getRandomGUIMacroDelay());
+ break;
+ case HOLD_ROD:
+ if (isTimerRunning()) return;
+ if (FarmHelperConfig.pestFarmerCastRod) {
+ 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;
+ }
+
+ 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 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(ReturnState.ENDING, 0);
+ break;
+ case ENDING:
+ KeyBindUtils.stopMovement();
+ 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,
+ HOLD_ROD,
+ CAST_ROD,
+ 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
+ HOLD_MOUSEMAT,
+ USE_MOUSEMAT,
+ WAITING_FOR_MOUSEMAT,
+ 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 def6660e7..917df84b0 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;
@@ -48,19 +49,30 @@
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")
+ 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
@@ -72,6 +84,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;
@@ -104,6 +117,8 @@ public class PestsDestroyer implements IFeature {
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<>();
@@ -136,15 +151,20 @@ public boolean shouldStartAtMacroStart() {
@Override
public void start() {
- if (enabled) return;
+ 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()));
+// MacroHandler.getInstance().getCurrentMacro().ifPresent(am -> am.setSavedState(Optional.empty()));
KeyBindUtils.stopMovement();
+ if (FarmHelperConfig.profitCalcCountPestDrop) {
+ MacroHandler.getInstance().getMacroingTimer().resume();
+ }
}
escapeState = EscapeState.NONE;
rotationState = RotationState.NONE;
@@ -152,7 +172,9 @@ public void start() {
killedEntities.clear();
killedPestsFrom.clear();
Multithreading.schedule(() -> {
- if (!preparing) return;
+ if (!preparing) {
+ return;
+ }
enabled = true;
preparing = false;
LogUtils.sendWarning("[Pests Destroyer] Starting killing shitters!");
@@ -182,6 +204,7 @@ public void stop() {
delayBetweenFireworks.reset();
delayClock.reset();
stuckClock.reset();
+ suffocateEscapeTimer.reset();
preparing = false;
enabled = false;
isPlotObstructed = false;
@@ -191,6 +214,8 @@ public void stop() {
state = States.IDLE;
FlyPathFinderExecutor.getInstance().stop();
KeyBindUtils.stopMovement();
+ finishing = false;
+ currentSlot = -1;
IFeature.super.stop();
}
@@ -198,7 +223,9 @@ public void stop() {
public void resetStatesAfterMacroDisabled() {
stop();
gotRangeOfVacuum = false;
- if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) return;
+ if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) {
+ return;
+ }
FarmHelperConfig.pestsDestroyerAfkInfiniteMode = false;
LogUtils.sendWarning("[Pests Destroyer] AFK Mode has been disabled");
}
@@ -220,7 +247,9 @@ public boolean shouldCheckForFailsafes() {
@SubscribeEvent
public void onKeyInput(InputEvent.KeyInputEvent event) {
- if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) return;
+ if (!FarmHelperConfig.pestsDestroyerAfkInfiniteMode) {
+ return;
+ }
if (Keyboard.getEventKeyState() && Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) {
LogUtils.sendWarning("[Pests Destroyer] Disabling Pests Destroyer AFK Infinite Mode!");
stop();
@@ -230,12 +259,24 @@ public void onKeyInput(InputEvent.KeyInputEvent event) {
@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 (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 (canEnableMacro(true)) {
start();
@@ -247,15 +288,31 @@ public boolean canEnableMacro() {
}
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))
+ 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;
@@ -273,7 +330,9 @@ public boolean canEnableMacro(boolean manually) {
@SubscribeEvent
public void onTickExecute(TickEvent.ClientTickEvent event) {
- if (mc.thePlayer == null || mc.theWorld == null) return;
+ if (mc.thePlayer == null || mc.theWorld == null) {
+ return;
+ }
if (mc.currentScreen == null && checkedThisGui) {
checkedThisGui = false;
}
@@ -291,20 +350,31 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
}
}
}
- 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 (!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;
}
-
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);
+ 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);
@@ -312,7 +382,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
return;
}
- if (delayClock.isScheduled() && !delayClock.passed()) return;
+ if (delayClock.isScheduled() && !delayClock.passed()) {
+ return;
+ }
LogUtils.sendDebug("[Pests Destroyer] State: " + state);
@@ -326,7 +398,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
KeyBindUtils.stopMovement();
switch (escapeState) {
case GO_TO_HUB:
- if (isInventoryOpen()) break;
+ if (isInventoryOpen()) {
+ break;
+ }
if (GameStateHandler.getInstance().getLocation() == GameStateHandler.Location.HUB) {
escapeState = EscapeState.GO_TO_GARDEN;
delayClock.schedule((long) (5_500 + Math.random() * 3_500));
@@ -349,7 +423,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
}
break;
case GO_TO_GARDEN:
- if (isInventoryOpen()) break;
+ if (isInventoryOpen()) {
+ break;
+ }
if (GameStateHandler.getInstance().inGarden()) {
escapeState = EscapeState.GO_TO_HUB;
delayClock.schedule((long) (2_500 + Math.random() * 1_500));
@@ -373,7 +449,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
}
break;
case RESUME_MACRO:
- if (isInventoryOpen()) break;
+ if (isInventoryOpen()) {
+ break;
+ }
if (GameStateHandler.getInstance().inGarden()) {
escapeState = EscapeState.NONE;
state = States.IDLE;
@@ -405,37 +483,75 @@ 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()) return;
- finishMacro();
+ if (isInventoryOpen()) {
+ return;
+ }
+// finishMacro();
+ state = States.FINISH;
return;
}
- if (getVacuum(currentItem)) return;
- if (needToUpdatePlots || PlotUtils.needToUpdatePlots()) {
- state = States.OPEN_DESK;
+ if (getVacuum(currentItem)) {
+ return;
+ }
+ state = States.SWAP_ARMOR;
+ delayClock.schedule((long) (200 + Math.random() * 200));
+ LogUtils.sendDebug("Delay 2");
+ break;
+ case SWAP_ARMOR:
+ if (FarmHelperConfig.pestSwapArmorBefore) {
+ currentSlot = FarmHelperConfig.pestArmorSlot0;
+ if (finishing) {
+ currentSlot = FarmHelperConfig.pestArmorSlot1;
+ }
+ if (AutoWardrobe.activeSlot != currentSlot) {
+ AutoWardrobe.instance.swapTo(currentSlot, FarmHelperConfig.pestSwapEquipments ? Arrays.asList(FarmHelperConfig.pestSwapEq.split("\\|")) : Collections.emptyList());
+ }
+ }
+ state = States.ARMOR_SWAP_VERIFY;
+ break;
+ case ARMOR_SWAP_VERIFY:
+ if (AutoWardrobe.instance.isRunning()) {
+ return;
+ }
+ if (finishing) {
+ state = States.FINISH;
} else {
- if (FarmHelperConfig.dontTeleportToPlots) {
- state = States.GET_CLOSEST_PLOT;
+ if (needToUpdatePlots || PlotUtils.needToUpdatePlots()) {
+ state = States.OPEN_DESK;
} else {
- state = States.TELEPORT_TO_PLOT;
+ 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;
+ if (isInventoryOpen()) {
+ break;
+ }
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()) {
break;
}
- if (!InventoryUtils.isInventoryLoaded()) break;
if (chestName == null || !chestName.equals("Desk")) {
break;
}
@@ -446,6 +562,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;
@@ -453,6 +570,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;
@@ -462,6 +580,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)) {
@@ -472,7 +591,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()) {
@@ -484,36 +605,58 @@ 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 (isInventoryOpenDelayed()) {
+ break;
+ }
- 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()) return;
+ 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();
+// 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 (isInventoryOpenDelayed()) {
+ break;
+ }
PlotUtils.Plot closestPlot = getClosestPlot();
@@ -530,7 +673,8 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
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.");
+ 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;
}
@@ -542,11 +686,15 @@ 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()) return;
- if (isInventoryOpenDelayed()) break;
+ if (MacroHandler.getInstance().isTeleporting()) {
+ return;
+ }
+ if (isInventoryOpenDelayed()) {
+ break;
+ }
if (!this.closestPlot.isPresent()) {
LogUtils.sendError("[Pests Destroyer] Couldn't find closest plot!");
@@ -586,9 +734,13 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
state = States.GO_BACK;
return;
}
- if (isInventoryOpenDelayed()) break;
+ if (isInventoryOpenDelayed()) {
+ break;
+ }
ItemStack currentItem2 = mc.thePlayer.getHeldItem();
- if (getVacuum(currentItem2)) return;
+ if (getVacuum(currentItem2)) {
+ return;
+ }
if (getClosestPest() != null) {
FlyPathFinderExecutor.getInstance().stop();
@@ -635,7 +787,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
resetFireworkInfo();
lastFireworkTime = System.currentTimeMillis();
MovingObjectPosition mop = mc.objectMouseOver;
- if (RotationHandler.getInstance().isRotating()) break;
+ if (RotationHandler.getInstance().isRotating()) {
+ break;
+ }
float yaw = -1;
Vec3 playerPos = mc.thePlayer.getPositionEyes(1);
for (float i = 0; i < 360; i += 10) {
@@ -648,13 +802,15 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
}
}
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)) {
+ 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);
+ LogUtils.sendDebug("Delay 11");
break;
}
state = States.WAIT_FOR_LOCATION;
@@ -665,14 +821,20 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
}
KeyBindUtils.leftClick();
getLocationTries++;
- if (!stuckClock.isScheduled())
+ if (!stuckClock.isScheduled()) {
stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime);
+ }
delayClock.schedule(300);
+ LogUtils.sendDebug("Delay 12");
break;
case WAIT_FOR_LOCATION:
- if (isInventoryOpenDelayed()) break;
+ if (isInventoryOpenDelayed()) {
+ break;
+ }
- if (RotationHandler.getInstance().isRotating()) return;
+ if (RotationHandler.getInstance().isRotating()) {
+ return;
+ }
if (getClosestPest() != null) {
state = States.FIND_PEST;
@@ -703,13 +865,16 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
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);
+ 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);
+ LogUtils.sendDebug("Delay 13");
break;
}
if (System.currentTimeMillis() - lastFireworkTime > 6_000) {
@@ -718,7 +883,9 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
}
break;
case FIND_PEST:
- if (isInventoryOpenDelayed()) break;
+ if (isInventoryOpenDelayed()) {
+ break;
+ }
getLocationTries = 0;
if (GameStateHandler.getInstance().getPestsCount() == 0) {
RotationHandler.getInstance().reset();
@@ -754,7 +921,8 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
break;
}
if (closestPest instanceof EntityArmorStand) {
- Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(closestPest, (e) -> e instanceof EntityBat || e instanceof EntitySilverfish);
+ Entity realEntity = PlayerUtils.getEntityCuttingOtherEntity(closestPest,
+ (e) -> e instanceof EntityBat || e instanceof EntitySilverfish);
if (realEntity != null) {
closestPest = realEntity;
}
@@ -768,12 +936,16 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
state = States.KILL_PEST;
cantReachPest = 0;
KeyBindUtils.stopMovement();
- if (!stuckClock.isScheduled())
+ if (!stuckClock.isScheduled()) {
stuckClock.schedule(1_000 * 60 * FarmHelperConfig.pestsKillerStuckTime);
+ }
delayClock.schedule(300);
+ LogUtils.sendDebug("Delay 14");
break;
case KILL_PEST:
- if (isInventoryOpenDelayed()) break;
+ if (isInventoryOpenDelayed()) {
+ break;
+ }
if (mc.thePlayer.posY < 67 && FlyPathFinderExecutor.getInstance().isRunning()) {
FlyPathFinderExecutor.getInstance().stop();
RotationHandler.getInstance().reset();
@@ -811,6 +983,7 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
escapeState = EscapeState.GO_TO_HUB;
KeyBindUtils.stopMovement();
delayClock.schedule(300);
+ LogUtils.sendDebug("Delay 15");
return;
}
@@ -821,12 +994,14 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
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)
+ 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)
+ if (playerVelocity > 0.15 && distanceXZ < 3) {
KeyBindUtils.onTick(mc.gameSettings.keyBindBack);
+ }
}
}
if (rotationState != RotationState.CLOSE) {
@@ -870,6 +1045,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;
@@ -881,7 +1057,8 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
null
));
}
- FlyPathFinderExecutor.getInstance().setUseAOTV(distanceXZ > vacuumMinRange && InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End"));
+ FlyPathFinderExecutor.getInstance()
+ .setUseAOTV(distanceXZ > vacuumMinRange && InventoryUtils.hasItemInHotbar("Aspect of the Void", "Aspect of the End"));
if (distance2 < currentVacuumRange && getVacuum(mc.thePlayer.getHeldItem())) {
break;
}
@@ -889,13 +1066,18 @@ public void onTickExecute(TickEvent.ClientTickEvent event) {
}
break;
case CHECK_ANOTHER_PEST:
- if (previousCurrentPlotPestsCount == GameStateHandler.getInstance().getCurrentPlotPestsCount() && System.currentTimeMillis() - lastKillTimestamp < 2_000)
+ if (previousCurrentPlotPestsCount == GameStateHandler.getInstance().getCurrentPlotPestsCount()
+ && System.currentTimeMillis() - lastKillTimestamp < 2_000) {
return;
+ }
- LogUtils.sendDebug(GameStateHandler.getInstance().getPestsCount() + " pest" + (GameStateHandler.getInstance().getPestsCount() == 1 ? "" : "s") + " left");
+ 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));
+ LogUtils.sendDebug("Delay 17");
break;
}
System.out.println("Curr plot pests: " + GameStateHandler.getInstance().getCurrentPlotPestsCount());
@@ -907,6 +1089,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) {
@@ -916,20 +1099,32 @@ 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;
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;
}
}
@@ -955,7 +1150,8 @@ public boolean getVacuum(ItemStack currentItem2) {
LogUtils.sendError("[Pests Destroyer] Failed to find vacuum in hotbar!");
state = States.GO_BACK;
FarmHelperConfig.enablePestsDestroyer = false;
- finishMacro();
+// finishMacro();
+ state = States.FINISH;
return true;
}
mc.thePlayer.inventory.currentItem = vacuum;
@@ -991,14 +1187,20 @@ private boolean isInventoryOpen() {
private void finishMacro() {
- if (isInventoryOpen()) return;
+ if (isInventoryOpen()) {
+ return;
+ }
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);
+ if (FarmHelperConfig.profitCalcCountPestDrop) {
+ MacroHandler.getInstance().getMacroingTimer().pause();
+ }
} else {
stop();
}
@@ -1010,24 +1212,34 @@ private boolean hasBlocksAround() {
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;
+ 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);
+ 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;
+ 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);
+// 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) {
@@ -1050,22 +1262,40 @@ public void onChat(ClientChatReceivedEvent event) {
@SubscribeEvent
public void onRender(RenderWorldLastEvent event) {
- if (mc.thePlayer == null || mc.theWorld == null) return;
- if (!GameStateHandler.getInstance().inGarden()) return;
+ 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.isDead) {
+ return false;
+ }
+ if (entity.posY < 50) {
+ return false;
+ }
if (entity instanceof EntityArmorStand) {
- if (killedEntities.contains(entity)) return false;
+ if (killedEntities.contains(entity)) {
+ return false;
+ }
ItemStack itemStack = ((EntityArmorStand) entity).getEquipmentInSlot(4);
- if (itemStack == null || !itemStack.hasTagCompound()) return false;
+ 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;
+ 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)) {
@@ -1075,8 +1305,9 @@ public void onRender(RenderWorldLastEvent event) {
return false;
}
if (killedEntities.stream().noneMatch(ke -> ke.getDistanceToEntity(entity) < 1.5)) {
- if (!FarmHelperConfig.streamerMode)
+ if (!FarmHelperConfig.streamerMode) {
drawESP(entity);
+ }
return true;
}
return false;
@@ -1087,15 +1318,20 @@ public void onRender(RenderWorldLastEvent event) {
pestsLocations.clear();
pestsLocations.addAll(pests);
- if (!FarmHelperConfig.highlightPlotWithPests) return;
+ if (!FarmHelperConfig.highlightPlotWithPests) {
+ 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);
+ 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);
@@ -1103,19 +1339,28 @@ public void onRender(RenderWorldLastEvent event) {
RenderUtils.drawText("Plot " + plotNumber, centerX, 80, centerZ, 1);
}
- if (!FarmHelperConfig.debugMode) return;
+ if (!FarmHelperConfig.debugMode) {
+ return;
+ }
ItemStack currentItem = mc.thePlayer.getHeldItem();
- if (currentItem == null || !currentItem.getDisplayName().contains("Vacuum")) return;
+ 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);
+ 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);
+ 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;
@@ -1133,16 +1378,20 @@ private void drawESP(Entity entity) {
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 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)));
+ 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());
+ RenderUtils.drawTracer(new Vec3(entity.posX, entity.posY + entity.getEyeHeight(), entity.posZ),
+ FarmHelperConfig.pestsTracersColor.toJavaColor());
}
}
@@ -1150,13 +1399,18 @@ 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()));
+ 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;
+ 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());
@@ -1170,43 +1424,51 @@ public void onEntityDeath(LivingDeathEvent event) {
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());
+ 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());
+ 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 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());
+ 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());
+ LogUtils.sendDebug("[Pests Destroyer] Found name entity: " + nameEntity.getName() + "(" + nameEntity.getEntityId() + ")" + " at: "
+ + nameEntity.getPosition());
killedEntities.add(nameEntity);
}
}
- if (isRunning())
+ if (isRunning()) {
FlyPathFinderExecutor.getInstance().stop();
+ }
resetFireworkInfo();
lastFireworkTime = 0;
currentEntityTarget.ifPresent(e -> {
if (!e.equals(event.entity)) {
return;
}
- if (isRunning())
+ if (isRunning()) {
KeyBindUtils.stopMovement();
+ }
currentEntityTarget = Optional.empty();
stuckClock.reset();
});
PlotUtils.Plot plot = PlotUtils.getPlotNumberBasedOnLocation(entity.getPosition());
if (plot == null) {
- if (isRunning())
+ 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);
@@ -1219,17 +1481,29 @@ public void onEntityDeath(LivingDeathEvent event) {
@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 (mc.thePlayer == null || mc.theWorld == null) {
+ return;
+ }
+ if (!GameStateHandler.getInstance().inGarden()) {
+ return;
+ }
+ if (!enabled) {
+ return;
+ }
+ if (state != States.WAIT_FOR_LOCATION) {
+ return;
+ }
EnumParticleTypes type = event.getParticleTypes();
- if (type != EnumParticleTypes.VILLAGER_ANGRY) return;
+ if (type != EnumParticleTypes.VILLAGER_ANGRY) {
+ return;
+ }
lastFireworkTime = System.currentTimeMillis();
if (firstLocation == null) {
- if (mc.thePlayer.getPositionVector().distanceTo(event.getPos()) > 5) return;
+ if (mc.thePlayer.getPositionVector().distanceTo(event.getPos()) > 5) {
+ return;
+ }
firstLocation = event.getPos();
locations.add(firstLocation);
lastLocation = firstLocation;
@@ -1244,7 +1518,9 @@ public void onFirework(SpawnParticleEvent event) {
}
private Vec3 calculateWaypoint() {
- if (lastLocation == null) return null;
+ if (lastLocation == null) {
+ return null;
+ }
Vec3 direction = lastLocation.subtract(firstLocation).normalize();
return lastLocation.addVector(direction.xCoord * 10, 0, direction.zCoord * 10);
}
@@ -1258,11 +1534,21 @@ public void resetFireworkInfo() {
@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;
+ 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;
+ }
double distance = mc.thePlayer.getDistance(event.pos.xCoord, event.pos.yCoord, event.pos.zCoord);
if (distance < 3) {
@@ -1275,7 +1561,8 @@ public void onSpawnObject(SpawnObjectEvent event) {
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);
+ 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;
}
}
@@ -1284,22 +1571,38 @@ public void onSpawnObject(SpawnObjectEvent event) {
@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;
+ 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;
+ if (guiName == null) {
+ return;
+ }
+ if (!delayClock.passed()) {
+ return;
+ }
ContainerChest guiChest = (ContainerChest) ((GuiChest) event.guiScreen).inventorySlots;
- if (!InventoryUtils.isInventoryLoaded()) return;
+ 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 == null || !slot.getHasStack()) {
+ continue;
+ }
if (slot.getStack().getDisplayName().contains("Plot")) {
String displayName = StringUtils.stripControlCodes(slot.getStack().getDisplayName());
try {
@@ -1310,8 +1613,9 @@ public void onGuiOpen(DrawScreenAfterEvent event) {
LogUtils.sendError("[Pests Destroyer] Failed to parse plot number: " + displayName);
}
plotCounter++;
- } else if (StringUtils.stripControlCodes(slot.getStack().getDisplayName()).equals("The Barn"))
+ } else if (StringUtils.stripControlCodes(slot.getStack().getDisplayName()).equals("The Barn")) {
plotCounter++;
+ }
}
} else {
@@ -1334,12 +1638,12 @@ 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;
}
- if (mc.thePlayer.motionY < -0.0784000015258789 || BlockUtils.getRelativeBlock(0, 0, 0).getMaterial().isLiquid())
+ 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;
@@ -1349,6 +1653,7 @@ private void fly() {
} else if (flyDelay.isScheduled()) {
return;
}
+ }
if (mc.thePlayer.onGround) {
mc.thePlayer.jump();
flyDelay.schedule(80 + (long) (Math.random() * 80));
@@ -1383,7 +1688,9 @@ private PlotUtils.Plot getClosestPlot() {
}
private boolean isNearPlotCenter() {
- if (!closestPlot.isPresent()) return false;
+ 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;
@@ -1391,6 +1698,8 @@ private boolean isNearPlotCenter() {
public enum States {
IDLE,
+ SWAP_ARMOR,
+ ARMOR_SWAP_VERIFY,
OPEN_DESK,
OPEN_PLOTS,
WAIT_FOR_INFO,
@@ -1405,7 +1714,8 @@ public enum States {
FIND_PEST,
KILL_PEST,
CHECK_ANOTHER_PEST,
- GO_BACK
+ GO_BACK,
+ FINISH
}
enum RotationState {
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..f28634939 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
@@ -328,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()) {
@@ -356,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;
}
@@ -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)) * 160);
+ LogUtils.sendDebug("Added " + matcher.group(2) + ", killed " + matcher.group(3));
+ }
+ }
}
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 b3f17054f..73fc55bf2 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;
diff --git a/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java b/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java
index d43ab7ff6..5775cf043 100644
--- a/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java
+++ b/src/main/java/com/jelly/farmhelperv2/handler/MacroHandler.java
@@ -344,6 +344,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 1ce2c0355..032f4ba2b 100644
--- a/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java
+++ b/src/main/java/com/jelly/farmhelperv2/macro/AbstractMacro.java
@@ -6,6 +6,7 @@
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;
import com.jelly.farmhelperv2.feature.impl.LagDetector;
import com.jelly.farmhelperv2.handler.GameStateHandler;
@@ -148,6 +149,7 @@ public void onTick() {
}
checkOnSpawnClock.schedule(5000);
}
+
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! If it's there already, then you've been macro checked, good luck.");
MacroHandler.getInstance().triggerWarpGarden(true, false);
@@ -155,7 +157,6 @@ public void onTick() {
return;
}
-
if (getRotation().isRotating()) {
if (!mc.gameSettings.keyBindSneak.isKeyDown())
KeyBindUtils.stopMovement();
@@ -383,14 +384,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/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();
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..f5a425042 100644
--- a/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java
+++ b/src/main/java/com/jelly/farmhelperv2/mixin/client/MixinMinecraft.java
@@ -4,22 +4,26 @@
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;
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 +114,13 @@ 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;
+ }
+ return Display.isActive();
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java b/src/main/java/com/jelly/farmhelperv2/pathfinder/FlyPathFinderExecutor.java
index 549e2d9ff..8f16d11b4 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 (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;
+ }
+
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 d5ec6d473..1cefc075f 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();
}