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 +} 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), 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(); + } +} 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]; + } +}