From e6c02da3e91df7a75bc1662175d725577506791c Mon Sep 17 00:00:00 2001 From: Alex <45095641+runsonmypc@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:34:04 -0400 Subject: [PATCH] fix(barbarianfishing): replace isInteracting with isAnimating/isMoving, add Rs2DropUtils Replace unreliable isInteracting() check with isAnimating(timeout) and isMoving() using randomized timeouts via Rs2Random.truncatedGauss. Add Rs2DropUtils for humanized item dropping with per-session pace variance and sped-up natural mouse. Fix stale state on plugin restart, spec activation edge cases, and inventory full detection order. --- .../BarbarianFishingOverlay.java | 3 +- .../BarbarianFishingPlugin.java | 16 +--- .../BarbarianFishingScript.java | 93 ++++++++++--------- .../barbarianfishing/Rs2DropUtils.java | 77 +++++++++++++++ 4 files changed, 132 insertions(+), 57 deletions(-) create mode 100644 src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/Rs2DropUtils.java diff --git a/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingOverlay.java b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingOverlay.java index c6a6d36ffb..016b7493e8 100644 --- a/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingOverlay.java +++ b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingOverlay.java @@ -2,7 +2,6 @@ import net.runelite.client.plugins.microbot.Microbot; import net.runelite.client.plugins.microbot.barbarianfishing.BarbarianFishingPlugin; -import net.runelite.client.plugins.microbot.barbarianfishing.BarbarianFishingScript; import net.runelite.client.plugins.microbot.util.antiban.Rs2Antiban; import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory; import net.runelite.client.plugins.microbot.util.player.Rs2Player; @@ -52,7 +51,7 @@ public Dimension render(Graphics2D graphics) { panelComponent.getChildren().add(LineComponent.builder() .left(Microbot.status) - .right("Version:" + BarbarianFishingScript.version) + .right("Version:" + BarbarianFishingPlugin.version) .build()); diff --git a/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingPlugin.java b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingPlugin.java index 75c8967781..ba59cac226 100644 --- a/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingPlugin.java +++ b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingPlugin.java @@ -1,16 +1,11 @@ package net.runelite.client.plugins.microbot.barbarianfishing; import com.google.inject.Provides; -import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; -import net.runelite.client.eventbus.Subscribe; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.microbot.Microbot; import net.runelite.client.plugins.microbot.PluginConstants; -import net.runelite.client.plugins.microbot.barbarianfishing.BarbarianFishingConfig; -import net.runelite.client.plugins.microbot.barbarianfishing.BarbarianFishingOverlay; -import net.runelite.client.plugins.microbot.barbarianfishing.BarbarianFishingScript; import net.runelite.client.ui.overlay.OverlayManager; import javax.inject.Inject; @@ -29,7 +24,7 @@ isExternal = PluginConstants.IS_EXTERNAL ) public class BarbarianFishingPlugin extends Plugin { - public static final String version = "1.0.0"; + public static final String version = "1.1.0"; @Inject BarbarianFishingScript fishingScript; @Inject @@ -53,13 +48,10 @@ protected void startUp() throws AWTException { fishingScript.run(config); } - @Subscribe - public void onGameTick(GameTick tick) { - fishingScript.onGameTick(); - } - protected void shutDown() { fishingScript.shutdown(); - overlayManager.remove(fishingOverlay); + if (overlayManager != null) { + overlayManager.remove(fishingOverlay); + } } } diff --git a/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingScript.java b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingScript.java index bd0a99e9e2..ed94119c3f 100644 --- a/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingScript.java +++ b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/BarbarianFishingScript.java @@ -4,16 +4,15 @@ import net.runelite.client.game.FishingSpot; import net.runelite.client.plugins.microbot.Microbot; import net.runelite.client.plugins.microbot.Script; -import net.runelite.client.plugins.microbot.barbarianfishing.BarbarianFishingConfig; import net.runelite.client.plugins.microbot.util.antiban.Rs2Antiban; import net.runelite.client.plugins.microbot.util.antiban.Rs2AntibanSettings; import net.runelite.client.plugins.microbot.util.camera.Rs2Camera; import net.runelite.client.plugins.microbot.util.combat.Rs2Combat; import net.runelite.client.plugins.microbot.util.equipment.Rs2Equipment; +import net.runelite.client.plugins.microbot.barbarianfishing.Rs2DropUtils; import net.runelite.client.plugins.microbot.util.inventory.InteractOrder; import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory; import net.runelite.client.plugins.microbot.util.math.Rs2Random; -import net.runelite.client.plugins.microbot.util.npc.Rs2Npc; import net.runelite.client.plugins.microbot.api.npc.models.Rs2NpcModel; import net.runelite.client.plugins.microbot.util.player.Rs2Player; @@ -24,66 +23,71 @@ public class BarbarianFishingScript extends Script { private long specReadyTime = 0; private boolean specActivated = false; - public static String version = "1.1.3"; - public static int timeout = 0; + private int animationTimeout = 600; private BarbarianFishingConfig config; public boolean run(BarbarianFishingConfig config) { this.config = config; + specReadyTime = 0; + specActivated = false; + animationTimeout = 600; Rs2Antiban.resetAntibanSettings(); Rs2Antiban.antibanSetupTemplates.applyFishingSetup(); mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { - if (!super.run() || !Microbot.isLoggedIn() || !Rs2Inventory.hasItem("feather") || !Rs2Inventory.hasItem("rod")) { - return; - } + try { + if (!super.run() || !Microbot.isLoggedIn() || !Rs2Inventory.hasItem("feather") || !Rs2Inventory.hasItem("Barbarian rod")) { + return; + } - if (Rs2Equipment.isWearing(ItemID.DRAGON_HARPOON)) { - if (Rs2Combat.getSpecEnergy() == 1000) { - if (specReadyTime == 0) { - double delay = Rs2Random.gaussRand(45000, 30000); // Delay in ms (mean 1200, stddev 200) - specReadyTime = System.currentTimeMillis() + (long) delay; - } else if (!specActivated && System.currentTimeMillis() >= specReadyTime) { - Rs2Combat.setSpecState(true); - specActivated = true; + if (Rs2Equipment.isWearing(ItemID.DRAGON_HARPOON)) { + if (Rs2Combat.getSpecEnergy() == 1000) { + if (specReadyTime == 0) { + double delay = Math.max(0, Rs2Random.gaussRand(45000, 30000)); + specReadyTime = System.currentTimeMillis() + (long) delay; + } else if (!specActivated && System.currentTimeMillis() >= specReadyTime) { + if (Rs2Combat.setSpecState(true)) { + specActivated = true; + } + } + } else { + specReadyTime = 0; + specActivated = false; } - } else { - specReadyTime = 0; - specActivated = false; } - } - if (Rs2AntibanSettings.actionCooldownActive) return; + if (Rs2Inventory.isFull()) { + dropInventoryItems(config); + return; + } - if (Rs2Player.isInteracting()) - return; + if (Rs2AntibanSettings.actionCooldownActive) return; - if (Rs2Inventory.isFull()) { - dropInventoryItems(config); - return; - } + if (Rs2Player.isAnimating(animationTimeout) || Rs2Player.isMoving()) + return; - Rs2NpcModel fishingspot = findFishingSpot(); - if (fishingspot == null) { - return; - } + animationTimeout = (int) Rs2Random.truncatedGauss(600, 1200, 2.0); - if (!Rs2Camera.isTileOnScreen(fishingspot.getLocalLocation())) { - validateInteractable(fishingspot.getNpc()); - } + Rs2NpcModel fishingspot = findFishingSpot(); + if (fishingspot == null) { + return; + } - if(fishingspot.click("Use-rod")) { - Rs2Antiban.actionCooldown(); - Rs2Antiban.takeMicroBreakByChance(); - }; + if (!Rs2Camera.isTileOnScreen(fishingspot.getLocalLocation())) { + validateInteractable(fishingspot.getNpc()); + } + + if (fishingspot.click("Use-rod")) { + Rs2Antiban.actionCooldown(); + Rs2Antiban.takeMicroBreakByChance(); + } + } catch (Exception ex) { + Microbot.logStackTrace(this.getClass().getSimpleName(), ex); + } }, 0, 600, TimeUnit.MILLISECONDS); return true; } - public void onGameTick() { - - } - private Rs2NpcModel findFishingSpot() { return Microbot.getRs2NpcCache().query() .withIds(FishingSpot.BARB_FISH.getIds()) @@ -92,11 +96,14 @@ private Rs2NpcModel findFishingSpot() { private void dropInventoryItems(BarbarianFishingConfig config) { InteractOrder dropOrder = config.dropOrder() == InteractOrder.RANDOM ? InteractOrder.random() : config.dropOrder(); - Rs2Inventory.dropAll(x -> x.getName().toLowerCase().contains("leaping"), dropOrder); + Rs2DropUtils.dropAllHumanized(x -> { + String name = x.getName().toLowerCase(); + return name.contains("leaping") || name.contains("roe") || name.contains("caviar"); + }, dropOrder); } public void shutdown() { Rs2Antiban.resetAntibanSettings(); super.shutdown(); } -} \ No newline at end of file +} diff --git a/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/Rs2DropUtils.java b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/Rs2DropUtils.java new file mode 100644 index 0000000000..2c9b00f91c --- /dev/null +++ b/src/main/java/net/runelite/client/plugins/microbot/barbarianfishing/Rs2DropUtils.java @@ -0,0 +1,77 @@ +package net.runelite.client.plugins.microbot.barbarianfishing; + +import net.runelite.client.plugins.microbot.Microbot; + +import net.runelite.client.plugins.microbot.util.inventory.InteractOrder; +import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory; +import net.runelite.client.plugins.microbot.util.inventory.Rs2ItemModel; +import net.runelite.client.plugins.microbot.util.math.Rs2Random; +import net.runelite.client.plugins.microbot.util.mouse.naturalmouse.api.MouseMotionFactory; +import net.runelite.client.plugins.microbot.util.mouse.naturalmouse.api.SpeedManager; +import net.runelite.client.plugins.microbot.util.mouse.naturalmouse.support.DefaultSpeedManager; + +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import static net.runelite.client.plugins.microbot.util.Global.sleep; + +/** + * Humanized item dropping with fast natural mouse movement. + * Shared across all Hub plugins — included in each JAR during build. + */ +public final class Rs2DropUtils { + + private static final long DROP_MOUSE_BASE_MS = 40; + + private Rs2DropUtils() { + throw new UnsupportedOperationException("Utility class"); + } + + /** + * Drop matching items with humanized timing and sped-up natural mouse. + * Each drop session rolls a pace seed (150-250ms), then jitters per drop. + */ + public static void dropAllHumanized(Predicate predicate, InteractOrder order) { + List items = Rs2Inventory.calculateInteractOrder( + Rs2Inventory.items(predicate).collect(Collectors.toList()), order); + + if (items.isEmpty()) return; + + int pace = Rs2Random.fancyNormalSample(150, 250); + + SpeedManager savedManager = speedUpMouse(); + try { + for (int i = 0; i < items.size(); i++) { + Rs2Inventory.interact(items.get(i), "Drop"); + + if (i < items.size() - 1) { + int delay = Rs2Random.logNormalBounded( + (int) (pace * 0.7), + (int) (pace * 1.3)); + sleep(delay); + } + } + } finally { + restoreMouse(savedManager); + } + } + + private static SpeedManager speedUpMouse() { + if (Microbot.naturalMouse == null) return null; + + MouseMotionFactory factory = Microbot.naturalMouse.getFactory(); + SpeedManager original = factory.getSpeedManager(); + + DefaultSpeedManager fast = new DefaultSpeedManager(); + fast.setMouseMovementBaseTimeMs(DROP_MOUSE_BASE_MS); + factory.setSpeedManager(fast); + + return original; + } + + private static void restoreMouse(SpeedManager original) { + if (Microbot.naturalMouse == null || original == null) return; + Microbot.naturalMouse.getFactory().setSpeedManager(original); + } +}