From e75d1a7b49c8f18f03ec467ff55e0015d62cc679 Mon Sep 17 00:00:00 2001 From: heap-overfl0w Date: Wed, 3 Sep 2025 16:45:50 -0500 Subject: [PATCH 1/5] Agility Pyramid plugin will now auto-cast Humidify if you have the requirements satisfied to do so. Fixed a deprecated API call with Simon Templeton by using Rs2NpcModel instead. --- .../agility/courses/PyramidCourse.java | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/courses/PyramidCourse.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/courses/PyramidCourse.java index 240fceb426f..ab91d5be606 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/courses/PyramidCourse.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/courses/PyramidCourse.java @@ -16,6 +16,9 @@ import net.runelite.client.plugins.microbot.util.gameobject.Rs2GameObject; import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory; import net.runelite.client.plugins.microbot.util.npc.Rs2Npc; +import net.runelite.client.plugins.microbot.util.npc.Rs2NpcModel; +import net.runelite.client.plugins.microbot.util.magic.Rs2Magic; +import net.runelite.client.plugins.skillcalculator.skills.MagicAction; import net.runelite.client.plugins.microbot.util.player.Rs2Player; import net.runelite.client.plugins.microbot.util.walker.Rs2Walker; import net.runelite.client.plugins.microbot.agility.courses.PyramidObstacleData.ObstacleArea; @@ -1157,7 +1160,7 @@ private boolean handlePyramidTurnIn() { } } else { // Not in dialogue, use pyramid top on Simon - boolean used = Rs2Inventory.useItemOnNpc(ItemID.PYRAMID_TOP, simon); + boolean used = Rs2Inventory.useItemOnNpc(ItemID.PYRAMID_TOP, new Rs2NpcModel(simon)); if (used) { log.debug("Successfully used pyramid top on Simon"); Global.sleepUntil(() -> Rs2Dialogue.isInDialogue(), 3000); @@ -1197,19 +1200,35 @@ private boolean handlePyramidTurnIn() { return false; } } - - /** - * Checks for empty waterskins in inventory and drops them - * @return true if waterskins were dropped, false otherwise - */ + + private boolean handleEmptyWaterskins() { - if (Rs2Inventory.contains(ItemID.WATERSKIN0)) { - log.debug("Found empty waterskin(s), dropping them"); - Rs2Inventory.drop(ItemID.WATERSKIN0); - Global.sleep(300, 500); + final boolean hasEmpty = Rs2Inventory.contains(ItemID.WATERSKIN0); + if (!hasEmpty) return false; + + final boolean hasFilled = Rs2Inventory.contains( + ItemID.WATERSKIN1, ItemID.WATERSKIN2, ItemID.WATERSKIN3, ItemID.WATERSKIN4 + ); + + if (!hasFilled && Rs2Magic.canCast(MagicAction.HUMIDIFY)) { + log.debug("All waterskins are empty; casting Humidify"); + if (Rs2Magic.cast(MagicAction.HUMIDIFY)) { + Global.sleepUntil(Rs2Player::isAnimating, 1500); + Global.sleepUntil(() -> !Rs2Player.isAnimating() && !Rs2Inventory.contains(ItemID.WATERSKIN0), 3500); + Global.sleep(200, 400); + } return true; } - return false; + + if (hasFilled && Rs2Magic.canCast(MagicAction.HUMIDIFY)) { + log.debug("Have filled waterskin(s); not casting Humidify because not all Waterskins are empty"); + return false; + } + + log.debug("Cannot cast Humidify; dropping empty waterskin(s)"); + Rs2Inventory.drop(ItemID.WATERSKIN0); + Global.sleep(300, 500); + return true; } -} \ No newline at end of file +} From 5b4e818cb40a35707b3829cb006d0b8e61482a39 Mon Sep 17 00:00:00 2001 From: heap-overfl0w Date: Wed, 3 Sep 2025 23:16:38 -0500 Subject: [PATCH 2/5] Added support for Tiaras and Unstrung symbols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Handled issue where the banking branch tried to withdraw “gems” even when none were required for things like Unstrung symbols and Tiaras. --- .../client/plugins/microbot/crafting/jewelry/JewelryScript.java | 2 +- .../client/plugins/microbot/crafting/jewelry/enums/Jewelry.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/JewelryScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/JewelryScript.java index fcf9a9bdc65..b19b87eab6c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/JewelryScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/JewelryScript.java @@ -125,7 +125,7 @@ public boolean run() { Rs2Inventory.waitForInventoryChanges(1800); } - if (plugin.getJewelry().getGem() != null) { + if (plugin.getJewelry().getGem() != Gem.NONE) { Rs2Bank.withdrawX(plugin.getJewelry().getGem().getCutItemID(), withdrawAmount); Rs2Inventory.waitForInventoryChanges(1800); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/enums/Jewelry.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/enums/Jewelry.java index 5b0ec80c4d4..ba42e8acc3b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/enums/Jewelry.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/jewelry/enums/Jewelry.java @@ -15,6 +15,8 @@ public enum Jewelry { GOLD_NECKLACE("gold necklace", ItemID.GOLD_NECKLACE, Gem.NONE, ItemID.NECKLACE_MOULD, JewelryType.GOLD, null, 6), GOLD_BRACELET("gold bracelet", ItemID.GOLD_BRACELET, Gem.NONE, ItemID.BRACELET_MOULD, JewelryType.GOLD, null, 7), GOLD_AMULET("gold amulet", ItemID.GOLD_AMULET_U, Gem.NONE, ItemID.AMULET_MOULD, JewelryType.GOLD, null, 8), + TIARA("tiara", ItemID.TIARA, Gem.NONE, ItemID.TIARA_MOULD, JewelryType.SILVER, null, 23), + UNSTRUNG_SYMBOL("holy symbol", ItemID.UNSTRUNG_SYMBOL, Gem.NONE, ItemID.HOLY_MOULD, JewelryType.SILVER, null, 16), OPAL_RING("opal ring", ItemID.OPAL_RING, Gem.OPAL, ItemID.RING_MOULD, JewelryType.SILVER, EnchantSpell.LEVEL_1, 1), OPAL_NECKLACE("opal necklace", ItemID.OPAL_NECKLACE, Gem.OPAL, ItemID.NECKLACE_MOULD, JewelryType.SILVER, EnchantSpell.LEVEL_1, 16), OPAL_BRACELET("opal bracelet", ItemID.OPAL_BRACELET, Gem.OPAL, ItemID.BRACELET_MOULD, JewelryType.SILVER, EnchantSpell.LEVEL_1, 22), From 9b1bf1c836760cdfb24daeb179d6a7c2ea37061e Mon Sep 17 00:00:00 2001 From: heap-overfl0w Date: Wed, 3 Sep 2025 23:45:44 -0500 Subject: [PATCH 3/5] Added support for Spin Flax method --- .../magic/aiomagic/AIOMagicPlugin.java | 85 ++++++----- .../magic/aiomagic/enums/MagicActivity.java | 1 + .../aiomagic/scripts/SpinFlaxScript.java | 142 ++++++++++++++++++ 3 files changed, 189 insertions(+), 39 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicPlugin.java index eedb09fb6b8..27f924fdbde 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicPlugin.java @@ -60,16 +60,19 @@ AIOMagicConfig provideConfig(ConfigManager configManager) { private SuperHeatScript superHeatScript; @Inject - private TeleportScript teleportScript; + private TeleportScript teleportScript; @Inject - private TeleAlchScript teleAlchScript; + private TeleAlchScript teleAlchScript; @Inject - private StunAlchScript stunAlchScript; + private StunAlchScript stunAlchScript; @Inject - private StunTeleAlchScript stunTeleAlchScript; // NEW + private StunTeleAlchScript stunTeleAlchScript; // NEW + + @Inject + private SpinFlaxScript spinFlaxScript; public static String version = "1.2.0"; // bumped @@ -108,41 +111,45 @@ protected void startUp() throws AWTException { overlayManager.add(aioMagicOverlay); } - switch (config.magicActivity()) { - case SPLASHING: - splashScript.run(); - break; - case ALCHING: - alchScript.run(); - break; - case SUPERHEAT: - superHeatScript.run(); - break; - case TELEPORT: - teleportScript.run(); - break; - case TELEALCH: - teleAlchScript.run(); - break; - case STUNALCH: - stunAlchScript.run(); - break; - case STUNTELEALCH: // NEW - stunTeleAlchScript.run(); - break; - } - } - - protected void shutDown() { - splashScript.shutdown(); - alchScript.shutdown(); - superHeatScript.shutdown(); - teleportScript.shutdown(); - teleAlchScript.shutdown(); - stunAlchScript.shutdown(); - if (stunTeleAlchScript != null) stunTeleAlchScript.shutdown(); // NEW - overlayManager.remove(aioMagicOverlay); - } + switch (config.magicActivity()) { + case SPLASHING: + splashScript.run(); + break; + case ALCHING: + alchScript.run(); + break; + case SUPERHEAT: + superHeatScript.run(); + break; + case TELEPORT: + teleportScript.run(); + break; + case TELEALCH: + teleAlchScript.run(); + break; + case STUNALCH: + stunAlchScript.run(); + break; + case STUNTELEALCH: // NEW + stunTeleAlchScript.run(); + break; + case SPINFLAX: + spinFlaxScript.run(); + break; + } + } + + protected void shutDown() { + splashScript.shutdown(); + alchScript.shutdown(); + superHeatScript.shutdown(); + teleportScript.shutdown(); + teleAlchScript.shutdown(); + stunAlchScript.shutdown(); + if (stunTeleAlchScript != null) stunTeleAlchScript.shutdown(); // NEW + if (spinFlaxScript != null) spinFlaxScript.shutdown(); + overlayManager.remove(aioMagicOverlay); + } @Subscribe public void onConfigChanged(ConfigChanged event) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/enums/MagicActivity.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/enums/MagicActivity.java index c42b874195a..197a4cb5f63 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/enums/MagicActivity.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/enums/MagicActivity.java @@ -8,4 +8,5 @@ public enum MagicActivity { TELEALCH, STUNALCH, STUNTELEALCH, // NEW + SPINFLAX, } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java new file mode 100644 index 00000000000..5b3b031e5c0 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java @@ -0,0 +1,142 @@ +package net.runelite.client.plugins.microbot.magic.aiomagic.scripts; + +import net.runelite.api.Skill; +import net.runelite.api.gameval.ItemID; +import net.runelite.client.plugins.microbot.Microbot; +import net.runelite.client.plugins.microbot.Script; +import net.runelite.client.plugins.microbot.magic.aiomagic.AIOMagicPlugin; +import net.runelite.client.plugins.microbot.magic.aiomagic.enums.MagicState; +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.antiban.enums.Activity; +import net.runelite.client.plugins.microbot.util.bank.Rs2Bank; +import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory; +import net.runelite.client.plugins.microbot.util.magic.Rs2Magic; +import net.runelite.client.plugins.microbot.util.magic.Rs2Spells; +import net.runelite.client.plugins.microbot.util.magic.Runes; +import net.runelite.client.plugins.microbot.util.player.Rs2Player; + +import javax.inject.Inject; +import java.util.concurrent.TimeUnit; + +public class SpinFlaxScript extends Script { + + private MagicState state; + private int castsDone; + + private final AIOMagicPlugin plugin; + + @Inject + public SpinFlaxScript(AIOMagicPlugin plugin) { + this.plugin = plugin; + } + + public boolean run() { + Microbot.enableAutoRunOn = false; + Rs2Antiban.resetAntibanSettings(); + Rs2Antiban.antibanSetupTemplates.applyGeneralBasicSetup(); + Rs2AntibanSettings.simulateAttentionSpan = true; + Rs2AntibanSettings.nonLinearIntervals = true; + Rs2AntibanSettings.contextualVariability = true; + Rs2AntibanSettings.usePlayStyle = true; + Rs2Antiban.setActivity(Activity.CASTING_SPIN_FLAX); + + mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { + try { + if (!Microbot.isLoggedIn()) return; + if (!super.run()) return; + + if (!Rs2Player.getSkillRequirement(Skill.MAGIC, 76)) { + Microbot.showMessage("Spin Flax requires 76 Magic."); + shutdown(); + return; + } + + if (state == null) { + state = MagicState.BANKING; + castsDone = 0; + } + + switch (state) { + case BANKING: + Microbot.status = "Banking: prepare 25 flax"; + boolean isBankOpen = Rs2Bank.isNearBank(15) ? Rs2Bank.useBank() : Rs2Bank.walkToBankAndUseBank(); + if (!isBankOpen || !Rs2Bank.isOpen()) return; + + Rs2Bank.depositAll(ItemID.BOW_STRING); + Rs2Inventory.waitForInventoryChanges(1200); + + boolean hasAstralInv = Rs2Inventory.hasItem(Runes.ASTRAL.getItemId()); + boolean hasNatureInv = Rs2Inventory.hasItem(Runes.NATURE.getItemId()); + boolean hasAirInv = Rs2Inventory.hasItem(Runes.AIR.getItemId()); + + boolean hasAstralBank = Rs2Bank.hasItem(Runes.ASTRAL.getItemId()); + boolean hasNatureBank = Rs2Bank.hasItem(Runes.NATURE.getItemId()); + boolean hasAirBank = Rs2Bank.hasItem(Runes.AIR.getItemId()); + + if (!hasAstralBank && !hasAstralInv) { Microbot.showMessage("Astral runes not found in bank."); shutdown(); return; } + if (!hasNatureBank && !hasNatureInv) { Microbot.showMessage("Nature runes not found in bank."); shutdown(); return; } + if (!hasAirBank && !hasAirInv) { Microbot.showMessage("Air runes not found in bank."); shutdown(); return; } + + if (hasAstralBank) { if (!Rs2Bank.withdrawAll(Runes.ASTRAL.getItemId())) return; Rs2Inventory.waitForInventoryChanges(1200); } + if (hasNatureBank) { if (!Rs2Bank.withdrawAll(Runes.NATURE.getItemId())) return; Rs2Inventory.waitForInventoryChanges(1200); } + if (hasAirBank) { if (!Rs2Bank.withdrawAll(Runes.AIR.getItemId())) return; Rs2Inventory.waitForInventoryChanges(1200); } + + if (!Rs2Bank.hasBankItem(ItemID.FLAX, 1)) { + Microbot.showMessage("No flax in bank."); + shutdown(); + return; + } + + int empty = Rs2Inventory.emptySlotCount(); + if (empty < 25) { + Rs2Bank.depositAll(ItemID.BOW_STRING); + Rs2Inventory.waitForInventoryChanges(1200); + empty = Rs2Inventory.emptySlotCount(); + if (empty < 25) return; // wait next tick + } + + if (!Rs2Bank.withdrawX(ItemID.FLAX, 25)) return; + Rs2Inventory.waitForInventoryChanges(1200); + + Rs2Bank.closeBank(); + castsDone = 0; + state = MagicState.CASTING; + break; + + case CASTING: + Microbot.status = "Casting: Spin Flax (" + castsDone + "/5)"; + + if (!Rs2Inventory.hasItem(ItemID.FLAX) || !Rs2Magic.hasRequiredRunes(Rs2Spells.SPIN_FLAX)) { + state = MagicState.BANKING; + break; + } + + if (castsDone >= 5) { + state = MagicState.BANKING; + break; + } + + if (!Rs2Magic.cast(Rs2Spells.SPIN_FLAX)) { + Microbot.log("Unable to cast Spin Flax"); + state = MagicState.BANKING; + break; + } + Rs2Player.waitForXpDrop(Skill.MAGIC, 10000, false); + castsDone++; + break; + } + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + }, 0, 1000, TimeUnit.MILLISECONDS); + return true; + } + + @Override + public void shutdown() { + Rs2Antiban.resetAntibanSettings(); + super.shutdown(); + } +} From c3d1adfb42e9ba7b493c1d0dab420f401edd5c5e Mon Sep 17 00:00:00 2001 From: heap-overfl0w Date: Thu, 4 Sep 2025 11:57:11 -0500 Subject: [PATCH 4/5] Added support for Fortis Gem Stall --- .../thieving/stalls/StallThievingScript.java | 1 - .../stalls/constants/ThievingSpot.java | 3 +- .../stalls/constants/ThievingSpotMapper.java | 4 +- .../model/FortisGemStallThievingSpot.java | 53 +++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/model/FortisGemStallThievingSpot.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/StallThievingScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/StallThievingScript.java index 1d4e91922e0..163660e71c3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/StallThievingScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/StallThievingScript.java @@ -32,7 +32,6 @@ public boolean run(StallThievingConfig config) { long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; - System.out.println("Total time for loop " + totalTime); } catch (Exception ex) { Microbot.logStackTrace(this.getClass().getSimpleName(), ex); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpot.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpot.java index 356712f41a2..5832fca2537 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpot.java @@ -4,6 +4,7 @@ public enum ThievingSpot { VARROCK_TEA_STALL, ARDY_BAKER, ARDY_SILK, - HOSIDIUS_FRUIT + HOSIDIUS_FRUIT, + FORTIS_GEM_STALL ; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpotMapper.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpotMapper.java index aa7b526ecdd..445fa902872 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpotMapper.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/constants/ThievingSpotMapper.java @@ -15,7 +15,8 @@ public IStallThievingSpot getThievingSpot(final ThievingSpot thievingSpot) ThievingSpot.VARROCK_TEA_STALL, varrockTeaStallThievingSpot, ThievingSpot.ARDY_BAKER, ardyBakerThievingSpot, ThievingSpot.ARDY_SILK, ardySilkThievingSpot, - ThievingSpot.HOSIDIUS_FRUIT, hosidiusFruitThievingSpot + ThievingSpot.HOSIDIUS_FRUIT, hosidiusFruitThievingSpot, + ThievingSpot.FORTIS_GEM_STALL, fortisGemStallThievingSpot ); return map.get(thievingSpot); @@ -25,4 +26,5 @@ public IStallThievingSpot getThievingSpot(final ThievingSpot thievingSpot) private ArdyBakerThievingSpot ardyBakerThievingSpot; private ArdySilkThievingSpot ardySilkThievingSpot; private HosidiusFruitThievingSpot hosidiusFruitThievingSpot; + private FortisGemStallThievingSpot fortisGemStallThievingSpot; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/model/FortisGemStallThievingSpot.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/model/FortisGemStallThievingSpot.java new file mode 100644 index 00000000000..4f5d98b3794 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/thieving/stalls/model/FortisGemStallThievingSpot.java @@ -0,0 +1,53 @@ +package net.runelite.client.plugins.microbot.thieving.stalls.model; + +import net.runelite.api.GameObject; +import net.runelite.api.Skill; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.microbot.util.bank.Rs2Bank; +import net.runelite.client.plugins.microbot.util.Global; +import net.runelite.client.plugins.microbot.util.gameobject.Rs2GameObject; +import net.runelite.client.plugins.microbot.util.player.Rs2Player; +import net.runelite.client.plugins.microbot.util.walker.Rs2Walker; + +import javax.inject.Inject; + +public class FortisGemStallThievingSpot implements IStallThievingSpot { + + private static final WorldPoint SAFESPOT = new WorldPoint(1671, 3101, 0); + private static final int STALL_ID = 51935; + + @Inject + public FortisGemStallThievingSpot() {} + + @Override + public void thieve() { + boolean atSafespot = SAFESPOT.equals(Rs2Player.getWorldLocation()); + if (!atSafespot) { + Rs2Walker.walkTo(SAFESPOT); + Global.sleepUntil(() -> SAFESPOT.equals(Rs2Player.getWorldLocation()), 3000); + if (!SAFESPOT.equals(Rs2Player.getWorldLocation())) { + return; + } + } + + final GameObject stall = Rs2GameObject.getGameObject(STALL_ID, SAFESPOT, 2); + if (stall == null) { + return; + } + + Rs2GameObject.interact(stall, "Steal-from"); + Rs2Player.waitForXpDrop(Skill.THIEVING); + } + + @Override + public void bank() { + Rs2Bank.walkToBankAndUseBank(); + Rs2Bank.depositAll(); + Rs2Bank.closeBank(); + } + + @Override + public Integer[] getItemIdsToDrop() { + return new Integer[0]; + } +} From 3d8e567efba0392f3c8b01e8b72dcbfbd42bf650 Mon Sep 17 00:00:00 2001 From: heap-overfl0w Date: Thu, 4 Sep 2025 13:52:54 -0500 Subject: [PATCH 5/5] - Current AIO magic implementation only showed a log when out of runes but did not properly shutdown. It will now shutdown when out of runes. --- .../magic/aiomagic/scripts/AlchScript.java | 3 ++- .../magic/aiomagic/scripts/SpinFlaxScript.java | 8 +++++++- .../magic/aiomagic/scripts/SplashScript.java | 6 ++++++ .../magic/aiomagic/scripts/StunAlchScript.java | 9 ++++++++- .../aiomagic/scripts/StunTeleAlchScript.java | 15 +++++++++++++-- .../magic/aiomagic/scripts/TeleAlchScript.java | 9 ++++++++- .../magic/aiomagic/scripts/TeleportScript.java | 6 ++++++ 7 files changed, 50 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/AlchScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/AlchScript.java index e83be18f5f5..6b58bd71240 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/AlchScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/AlchScript.java @@ -63,7 +63,8 @@ public boolean run() { } if (!Rs2Magic.hasRequiredRunes(plugin.getAlchSpell())) { - Microbot.log("Unable to cast alchemy spell"); + Microbot.showMessage("Out of runes for alchemy"); + shutdown(); return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java index 5b3b031e5c0..28cfc3f8624 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SpinFlaxScript.java @@ -107,11 +107,17 @@ public boolean run() { case CASTING: Microbot.status = "Casting: Spin Flax (" + castsDone + "/5)"; - if (!Rs2Inventory.hasItem(ItemID.FLAX) || !Rs2Magic.hasRequiredRunes(Rs2Spells.SPIN_FLAX)) { + if (!Rs2Inventory.hasItem(ItemID.FLAX)) { state = MagicState.BANKING; break; } + if (!Rs2Magic.hasRequiredRunes(Rs2Spells.SPIN_FLAX)) { + Microbot.showMessage("Out of runes for Spin Flax"); + shutdown(); + return; + } + if (castsDone >= 5) { state = MagicState.BANKING; break; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SplashScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SplashScript.java index 080a54ce468..b4b052f52e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SplashScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/SplashScript.java @@ -40,6 +40,12 @@ public boolean run() { if (!super.run()) return; long startTime = System.currentTimeMillis(); + if (!Rs2Magic.canCast(plugin.getCombatSpell().getMagicAction())) { + Microbot.showMessage("Out of runes for " + plugin.getCombatSpell().name()); + shutdown(); + return; + } + if (Rs2Magic.getCurrentAutoCastSpell() != plugin.getCombatSpell()) { Rs2Combat.setAutoCastSpell(plugin.getCombatSpell(), false); return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunAlchScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunAlchScript.java index cbf7e95aa8f..095e122c565 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunAlchScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunAlchScript.java @@ -52,7 +52,14 @@ public boolean run() { } if (!Rs2Magic.hasRequiredRunes(plugin.getAlchSpell())) { - Microbot.log("Unable to cast alchemy spell"); + Microbot.showMessage("Out of runes for alchemy"); + shutdown(); + return; + } + + if (!Rs2Magic.hasRequiredRunes(plugin.getStunSpell().getRs2Spell())) { + Microbot.showMessage("Out of runes for " + plugin.getStunSpell().name()); + shutdown(); return; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunTeleAlchScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunTeleAlchScript.java index c91c415e03d..e4998f6d88d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunTeleAlchScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/StunTeleAlchScript.java @@ -50,7 +50,14 @@ public boolean run() { } // Ensure we can alch if (!Rs2Magic.hasRequiredRunes(plugin.getAlchSpell())) { - Microbot.log("Unable to cast alchemy spell"); + Microbot.showMessage("Out of runes for alchemy"); + shutdown(); + return; + } + // Ensure we can stun + if (!Rs2Magic.hasRequiredRunes(plugin.getStunSpell().getRs2Spell())) { + Microbot.showMessage("Out of runes for " + plugin.getStunSpell().name()); + shutdown(); return; } // Resolve the alch item @@ -86,6 +93,11 @@ public boolean run() { sleep(200, 300); } // 3) TELEPORT: always the hard-locked teleport + if (!Rs2Magic.hasRequiredRunes(FIXED_TELEPORT.getRs2Spell())) { + Microbot.showMessage("Out of runes for " + FIXED_TELEPORT.name()); + shutdown(); + return; + } Rs2Magic.cast(FIXED_TELEPORT.getRs2Spell().getMagicAction()); sleep(100, 200); break; @@ -105,4 +117,3 @@ public void shutdown() { super.shutdown(); } } - diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleAlchScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleAlchScript.java index 571fe273c91..9ac0793b1a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleAlchScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleAlchScript.java @@ -50,7 +50,8 @@ public boolean run() { } if (!Rs2Magic.hasRequiredRunes(plugin.getAlchSpell())) { - Microbot.log("Unable to cast alchemy spell"); + Microbot.showMessage("Out of runes for alchemy"); + shutdown(); return; } @@ -75,6 +76,12 @@ public boolean run() { Rs2Magic.alch(alchItem, 100, 150); + if (!Rs2Magic.hasRequiredRunes(plugin.getTeleportSpell().getRs2Spell())) { + Microbot.showMessage("Out of runes for " + plugin.getTeleportSpell().name()); + shutdown(); + return; + } + Rs2Magic.cast(plugin.getTeleportSpell().getRs2Spell().getMagicAction()); sleep(900, 950); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleportScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleportScript.java index 917dd1d80a0..5dd92a77d0a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleportScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleportScript.java @@ -45,6 +45,12 @@ public boolean run() { switch (state) { case CASTING: + if (!Rs2Magic.hasRequiredRunes(plugin.getTeleportSpell().getRs2Spell())) { + Microbot.showMessage("Out of runes for " + plugin.getTeleportSpell().name()); + shutdown(); + return; + } + if (!Rs2Magic.cast(plugin.getTeleportSpell().getRs2Spell().getMagicAction())) { Microbot.log("Unable to cast " + plugin.getTeleportSpell().getRs2Spell().name()); }