diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 782dc33e0f..1aafdf8be5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,9 +27,9 @@ jobs: uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "1.6.7" + automatic_release_tag: "1.6.7.1" prerelease: false - title: "Release 1.6.7" + title: "Release 1.6.7.1" files: | /home/runner/work/Microbot/Microbot/runelite-client/target/microbot-*.jar diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index edcd84b2d6..392e9ca360 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -41,7 +41,7 @@ nogit false false - 1.6.7 + 1.6.7.1 diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java index 2e1c476fe6..cf739910ee 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java @@ -252,11 +252,20 @@ public void onConfigChanged(ConfigChanged ev) { @Subscribe public void onGameTick(GameTick event) { if (client.getLocalPlayer().isInteracting()) { - if (client.getLocalPlayer().getInteracting() instanceof Player - || client.getLocalPlayer().getInteracting() instanceof NPC) { + Actor interactingActor = client.getLocalPlayer().getInteracting(); + if (interactingActor instanceof Player) { if (ticks.get() == 2) { ticks.set(0); Rs2Player.updateCombatTime(); + Rs2Player.lastInteractWasPlayer = true; + } else { + ticks.incrementAndGet(); + } + } else if (interactingActor instanceof NPC) { + if (ticks.get() == 2) { + ticks.set(0); + if (Rs2Player.lastInteractWasPlayer) Rs2Player.lastInteractWasPlayer = false; + Rs2Player.updateCombatTime(); } else { ticks.incrementAndGet(); } 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 c397765326..2495795dc2 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 @@ -71,6 +71,7 @@ public boolean run() { Rs2Dialogue.clickCombinationOption(plugin.getJewelry().getGem().getUncutItemName()); sleepUntil(Rs2Player::isAnimating); Rs2Antiban.actionCooldown(); + Rs2Antiban.takeMicroBreakByChance(); Rs2Bank.preHover(); break; case BANKING: @@ -319,6 +320,7 @@ public boolean run() { sleepUntilTrue(() -> Rs2Widget.isGoldCraftingWidgetOpen() || Rs2Widget.isSilverCraftingWidgetOpen(), 500, 20000); Rs2Widget.clickWidget(plugin.getJewelry().getItemName()); Rs2Antiban.actionCooldown(); + Rs2Antiban.takeMicroBreakByChance(); break; case ALCHING: if (!Rs2Equipment.hasEquipped(staffItemID)) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/scripts/GlassblowingScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/scripts/GlassblowingScript.java index a14f42fef8..8668d046e4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/scripts/GlassblowingScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/crafting/scripts/GlassblowingScript.java @@ -42,7 +42,7 @@ public void run(CraftingConfig config) { if (!Microbot.isLoggedIn()) return; if (!super.run()) return; - if (Rs2Player.isAnimating(2400) || Rs2Antiban.getCategory().isBusy() || Microbot.pauseAllScripts) return; + if (Rs2Player.isAnimating(3000) || Rs2Antiban.getCategory().isBusy() || Microbot.pauseAllScripts) return; if (Rs2AntibanSettings.actionCooldownActive) return; if (config.glassType() == Glass.PROGRESSIVE) { @@ -101,8 +101,7 @@ private void craft(CraftingConfig config) { Rs2Widget.sleepUntilHasNotWidgetText("How many do you wish to make?", 270, 5, false, 5000); Rs2Antiban.actionCooldown(); - - sleepUntil(() -> !Rs2Inventory.hasItem(moltenGlass), 60000); + Rs2Antiban.takeMicroBreakByChance(); } public ProgressiveGlassblowingModel calculateItemToCraft() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/giantsfoundry/GiantsFoundryScript.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/giantsfoundry/GiantsFoundryScript.java index adc34b3fc5..918f563f03 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/giantsfoundry/GiantsFoundryScript.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/giantsfoundry/GiantsFoundryScript.java @@ -117,6 +117,7 @@ public void selectMould() { Microbot.getMouse().click(forte.getBounds()); sleep(600, 1200); MouldHelper.selectBest(); + sleep(600, 1200); } Widget blades = Rs2Widget.findWidget("Blades", null); @@ -124,12 +125,14 @@ public void selectMould() { Microbot.getMouse().click(blades.getBounds()); sleep(600, 1200); MouldHelper.selectBest(); + sleep(600, 1200); } Widget tips = Rs2Widget.findWidget("Tips", null); if (tips != null) { Microbot.getMouse().click(tips.getBounds()); sleep(600, 1200); MouldHelper.selectBest(); + sleep(600, 1200); Microbot.getMouse().click(forte.getBounds()); } Widget setMould = Rs2Widget.getWidget(47054854); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicConfig.java index ede8d42a63..d8ce32cbe4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/AIOMagicConfig.java @@ -6,7 +6,10 @@ import net.runelite.client.config.ConfigSection; import net.runelite.client.plugins.microbot.magic.aiomagic.enums.MagicActivity; import net.runelite.client.plugins.microbot.magic.aiomagic.enums.SuperHeatItem; +import net.runelite.client.plugins.microbot.magic.aiomagic.enums.TeleportSpell; import net.runelite.client.plugins.microbot.util.magic.Rs2CombatSpells; +import net.runelite.client.plugins.microbot.util.magic.Rs2Spells; +import net.runelite.client.plugins.microbot.util.magic.Rs2Staff; @ConfigGroup(AIOMagicConfig.configGroup) public interface AIOMagicConfig extends Config { @@ -16,6 +19,9 @@ public interface AIOMagicConfig extends Config { String alchItems = "alchItems"; String superHeatItem = "superHeatItem"; String npcName = "npcName"; + String staff = "staff"; + String teleportSpell = "teleportSpell"; + String castAmount = "castAmount"; @ConfigSection( name = "General Settings", @@ -45,6 +51,13 @@ public interface AIOMagicConfig extends Config { ) String superHeatSection = "superHeat"; + @ConfigSection( + name = "Teleport Settings", + description = "Configure teleport settings", + position = 3 + ) + String teleportSection = "teleport"; + @ConfigItem( keyName = activity, name = "Activity", @@ -99,4 +112,37 @@ default String alchItems() { default SuperHeatItem superHeatItem() { return SuperHeatItem.IRON; } + + @ConfigItem( + keyName = teleportSpell, + name = "Teleport Spell", + description = "Select the teleport spell you would like to use", + position = 0, + section = teleportSection + ) + default TeleportSpell teleportSpell() { + return TeleportSpell.VARROCK_TELEPORT; + } + + @ConfigItem( + keyName = staff, + name = "Staff", + description = "Select the staff you would like to use", + position = 1, + section = teleportSection + ) + default Rs2Staff staff() { + return Rs2Staff.STAFF_OF_AIR; + } + + @ConfigItem( + keyName = castAmount, + name = "Total amount of casts", + description = "Define the amount of teleport casts", + position = 2, + section = teleportSection + ) + default int castAmount() { + return 1000; + } } 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 bd4748f2d9..d33907de35 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 @@ -14,10 +14,10 @@ import net.runelite.client.plugins.microbot.Microbot; import net.runelite.client.plugins.microbot.magic.aiomagic.enums.MagicActivity; import net.runelite.client.plugins.microbot.magic.aiomagic.enums.SuperHeatItem; -import net.runelite.client.plugins.microbot.magic.aiomagic.scripts.AlchScript; -import net.runelite.client.plugins.microbot.magic.aiomagic.scripts.SplashScript; -import net.runelite.client.plugins.microbot.magic.aiomagic.scripts.SuperHeatScript; +import net.runelite.client.plugins.microbot.magic.aiomagic.enums.TeleportSpell; +import net.runelite.client.plugins.microbot.magic.aiomagic.scripts.*; import net.runelite.client.plugins.microbot.util.magic.Rs2CombatSpells; +import net.runelite.client.plugins.microbot.util.magic.Rs2Staff; import net.runelite.client.ui.overlay.OverlayManager; import javax.inject.Inject; @@ -53,6 +53,10 @@ AIOMagicConfig provideConfig(ConfigManager configManager) { private AlchScript alchScript; @Inject private SuperHeatScript superHeatScript; + @Inject + private TeleportScript teleportScript; + @Inject + private TeleAlchScript teleAlchScript; public static String version = "1.0.0"; @@ -64,6 +68,12 @@ AIOMagicConfig provideConfig(ConfigManager configManager) { private SuperHeatItem superHeatItem; @Getter private String npcName; + @Getter + private TeleportSpell teleportSpell; + @Getter + private Rs2Staff staff; + @Getter + private int totalCasts; @Override protected void startUp() throws AWTException { @@ -71,6 +81,9 @@ protected void startUp() throws AWTException { alchItemNames = updateItemList(config.alchItems()); superHeatItem = config.superHeatItem(); npcName = config.npcName(); + teleportSpell = config.teleportSpell(); + staff = config.staff(); + totalCasts = config.castAmount(); if (overlayManager != null) { overlayManager.add(aioMagicOverlay); @@ -86,6 +99,12 @@ protected void startUp() throws AWTException { case SUPERHEAT: superHeatScript.run(); break; + case TELEPORT: + teleportScript.run(); + break; + case TELEALCH: + teleAlchScript.run(); + break; } } @@ -93,6 +112,8 @@ protected void shutDown() { splashScript.shutdown(); alchScript.shutdown(); superHeatScript.shutdown(); + teleportScript.shutdown(); + teleAlchScript.shutdown(); overlayManager.remove(aioMagicOverlay); } @@ -114,6 +135,18 @@ public void onConfigChanged(ConfigChanged event) { if (event.getKey().equals(AIOMagicConfig.npcName)) { npcName = config.npcName(); } + + if (event.getKey().equals(AIOMagicConfig.teleportSpell)) { + teleportSpell = config.teleportSpell(); + } + + if (event.getKey().equals(AIOMagicConfig.staff)) { + staff = config.staff(); + } + + if (event.getKey().equals(AIOMagicConfig.castAmount)) { + totalCasts = config.castAmount(); + } } @Subscribe 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 3e86d27020..bd2255b518 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 @@ -4,4 +4,6 @@ public enum MagicActivity { SPLASHING, ALCHING, SUPERHEAT, + TELEPORT, + TELEALCH, } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/enums/TeleportSpell.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/enums/TeleportSpell.java new file mode 100644 index 0000000000..58ce026ffb --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/enums/TeleportSpell.java @@ -0,0 +1,19 @@ +package net.runelite.client.plugins.microbot.magic.aiomagic.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.runelite.client.plugins.microbot.util.magic.Rs2Spells; + +@Getter +@RequiredArgsConstructor +public enum TeleportSpell { + VARROCK_TELEPORT(Rs2Spells.VARROCK_TELEPORT), + LUMBRIDGE_TELEPORT(Rs2Spells.LUMBRIDGE_TELEPORT), + FALADOR_TELEPORT(Rs2Spells.FALADOR_TELEPORT), + CAMELOT_TELEPORT(Rs2Spells.CAMELOT_TELEPORT), + ARDOUGNE_TELEPORT(Rs2Spells.ARDOUGNE_TELEPORT), + WATCHTOWER_TELEPORT(Rs2Spells.WATCHTOWER_TELEPORT), + TROLLHEIM_TELEPORT(Rs2Spells.TROLLHEIM_TELEPORT),; + + private final Rs2Spells rs2Spell; +} 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 1282e39047..1b19586f9e 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 @@ -107,11 +107,11 @@ public boolean run() { } Rs2Bank.setWithdrawAsNote(); - for (String item : plugin.getAlchItemNames()) { + plugin.getAlchItemNames().forEach((itemName) -> { if (!isRunning()) return; - Rs2Bank.withdrawAll(item); - Rs2Random.waitEx(600, 100); - } + Rs2Bank.withdrawAll(itemName); + Rs2Inventory.waitForInventoryChanges(1200); + }); Rs2Bank.setWithdrawAsItem(); Rs2Bank.closeBank(); @@ -135,7 +135,7 @@ public boolean run() { return; } - Rs2Magic.alch(plugin.getAlchItemNames().get(0)); + Rs2Magic.alch(alchItem); Rs2Player.waitForXpDrop(Skill.MAGIC, 10000, false); break; } 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 new file mode 100644 index 0000000000..539c1b43ca --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleAlchScript.java @@ -0,0 +1,168 @@ +package net.runelite.client.plugins.microbot.magic.aiomagic.scripts; + +import net.runelite.api.Skill; +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.equipment.Rs2Equipment; +import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory; +import net.runelite.client.plugins.microbot.util.inventory.Rs2Item; +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.Map; +import java.util.concurrent.TimeUnit; + +public class TeleAlchScript extends Script { + + private MagicState state; + private final AIOMagicPlugin plugin; + + @Inject + public TeleAlchScript(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.TELEPORT_TRAINING); + mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { + try { + if (!Microbot.isLoggedIn()) return; + if (!super.run()) return; + long startTime = System.currentTimeMillis(); + + if (hasStateChanged()) { + state = updateState(); + } + + switch (state) { + case BANKING: + boolean isBankOpen = Rs2Bank.isNearBank(15) ? Rs2Bank.useBank() : Rs2Bank.walkToBankAndUseBank(); + if (!isBankOpen || !Rs2Bank.isOpen()) return; + + if (!Rs2Equipment.hasEquipped(plugin.getStaff().getItemID())) { + if (!Rs2Bank.hasItem(plugin.getStaff().getItemID())) { + Microbot.showMessage("Configured Staff not found!"); + shutdown(); + return; + } + + Rs2Bank.withdrawAndEquip(plugin.getStaff().getItemID()); + } + + Map requiredTeleportRunes = getRequiredTeleportRunes(plugin.getTotalCasts()); + + requiredTeleportRunes.forEach((rune, quantity) -> { + if (!isRunning()) return; + int itemID = rune.getItemId(); + + if (!Rs2Bank.withdrawX(itemID, quantity)) { + Microbot.log("Failed to withdraw " + quantity + " of " + rune.name()); + } + Rs2Inventory.waitForInventoryChanges(1200); + }); + + Rs2Bank.setWithdrawAsNote(); + plugin.getAlchItemNames().forEach((itemName) -> { + if (!isRunning()) return; + Rs2Bank.withdrawAll(itemName); + + Rs2Inventory.waitForInventoryChanges(1200); + }); + Rs2Bank.setWithdrawAsItem(); + + int totalAlchCasts = getAlchCastAmount(); + + Map requiredAlchRunes = getRequiredAlchRunes(totalAlchCasts); + requiredAlchRunes.forEach((rune, quantity) -> { + if (!isRunning()) return; + int itemID = rune.getItemId(); + if (!Rs2Bank.withdrawX(itemID, quantity)) { + Microbot.log("Failed to withdraw " + quantity + " of " + rune.name()); + } + }); + + Rs2Bank.closeBank(); + sleepUntil(() -> !Rs2Bank.isOpen()); + break; + case CASTING: + if (!Rs2Inventory.hasItem(plugin.getAlchItemNames().get(0))) { + plugin.getAlchItemNames().remove(0); + return; + } + + Rs2Item alchItem = Rs2Inventory.get(plugin.getAlchItemNames().get(0)); + int inventorySlot = Rs2Player.getRealSkillLevel(Skill.MAGIC) >= 55 ? 11 : 4; + if (alchItem.getSlot() != inventorySlot) { + Rs2Inventory.moveItemToSlot(alchItem, inventorySlot); + return; + } + + Rs2Magic.cast(plugin.getTeleportSpell().getRs2Spell().getAction()); + Rs2Player.waitForAnimation(1200); + + Rs2Magic.alch(alchItem); + Rs2Player.waitForXpDrop(Skill.MAGIC, false); + break; + } + + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + System.out.println("Total time for loop " + totalTime); + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + }, 0, 1000, TimeUnit.MILLISECONDS); + return true; + } + + @Override + public void shutdown() { + Rs2Antiban.resetAntibanSettings(); + super.shutdown(); + } + + private boolean hasStateChanged() { + if (!getRequiredTeleportRunes(1).isEmpty() || !getRequiredAlchRunes(1).isEmpty()) return true; + return state == MagicState.BANKING && getRequiredTeleportRunes(plugin.getTotalCasts()).isEmpty(); + } + + private MagicState updateState() { + if (!getRequiredTeleportRunes(1).isEmpty()) return MagicState.BANKING; + if (state == MagicState.BANKING && (getRequiredTeleportRunes(plugin.getTotalCasts()).isEmpty() || getRequiredAlchRunes(getAlchCastAmount()).isEmpty())) + return MagicState.CASTING; + return null; + } + + private Map getRequiredTeleportRunes(int casts) { + return Rs2Magic.getRequiredRunes(plugin.getTeleportSpell().getRs2Spell(), plugin.getStaff(), casts, false); + } + + private Map getRequiredAlchRunes(int casts) { + Rs2Spells alchSpell = Rs2Player.getRealSkillLevel(Skill.MAGIC) >= 55 ? Rs2Spells.HIGH_LEVEL_ALCHEMY : Rs2Spells.LOW_LEVEL_ALCHEMY; + return Rs2Magic.getRequiredRunes(alchSpell, plugin.getStaff(), casts, false); + } + + private int getAlchCastAmount() { + return Rs2Inventory.items().stream() + .filter(item -> plugin.getAlchItemNames().contains(item.getName().toLowerCase())) + .mapToInt(Rs2Item::getQuantity) + .sum(); + } +} 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 new file mode 100644 index 0000000000..b75d5ad368 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/magic/aiomagic/scripts/TeleportScript.java @@ -0,0 +1,120 @@ +package net.runelite.client.plugins.microbot.magic.aiomagic.scripts; + +import net.runelite.api.Skill; +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.equipment.Rs2Equipment; +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.Runes; +import net.runelite.client.plugins.microbot.util.player.Rs2Player; + +import javax.inject.Inject; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class TeleportScript extends Script { + + private MagicState state; + private final AIOMagicPlugin plugin; + + @Inject + public TeleportScript(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.TELEPORT_TRAINING); + mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { + try { + if (!Microbot.isLoggedIn()) return; + if (!super.run()) return; + long startTime = System.currentTimeMillis(); + + if (hasStateChanged()) { + state = updateState(); + } + + switch (state) { + case BANKING: + boolean isBankOpen = Rs2Bank.isNearBank(15) ? Rs2Bank.useBank() : Rs2Bank.walkToBankAndUseBank(); + if (!isBankOpen || !Rs2Bank.isOpen()) return; + + if (!Rs2Equipment.hasEquipped(plugin.getStaff().getItemID())) { + if (!Rs2Bank.hasItem(plugin.getStaff().getItemID())) { + Microbot.showMessage("Configured Staff not found!"); + shutdown(); + return; + } + + Rs2Bank.withdrawAndEquip(plugin.getStaff().getItemID()); + } + + Map requiredRunes = getRequiredRunes(plugin.getTotalCasts()); + + requiredRunes.forEach((rune, quantity) -> { + if (!isRunning()) return; + int itemID = rune.getItemId(); + + if (!Rs2Bank.withdrawX(itemID, quantity)) { + Microbot.log("Failed to withdraw " + quantity + " of " + rune.name()); + } + + Rs2Inventory.waitForInventoryChanges(1200); + }); + + Rs2Bank.closeBank(); + sleepUntil(() -> !Rs2Bank.isOpen()); + break; + case CASTING: + Rs2Magic.cast(plugin.getTeleportSpell().getRs2Spell().getAction()); + Rs2Player.waitForAnimation(1200); + break; + } + + long endTime = System.currentTimeMillis(); + long totalTime = endTime - startTime; + System.out.println("Total time for loop " + totalTime); + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + }, 0, 1000, TimeUnit.MILLISECONDS); + return true; + } + + @Override + public void shutdown() { + Rs2Antiban.resetAntibanSettings(); + super.shutdown(); + } + + private boolean hasStateChanged() { + if (!getRequiredRunes(1).isEmpty()) return true; + if (state == MagicState.BANKING && getRequiredRunes(plugin.getTotalCasts()).isEmpty()) return true; + return false; + } + + private MagicState updateState() { + if (!getRequiredRunes(1).isEmpty()) return MagicState.BANKING; + if (state == MagicState.BANKING && getRequiredRunes(plugin.getTotalCasts()).isEmpty()) return MagicState.CASTING; + return null; + } + + private Map getRequiredRunes(int casts) { + return Rs2Magic.getRequiredRunes(plugin.getTeleportSpell().getRs2Spell(), plugin.getStaff(), casts, false); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/antiban/enums/Activity.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/antiban/enums/Activity.java index 1ac054eca8..7216277a83 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/antiban/enums/Activity.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/antiban/enums/Activity.java @@ -467,6 +467,7 @@ public enum Activity { GETTING_INFINITE_MONEY("Getting infinite money", Category.COLLECTING_NONE, ActivityIntensity.HIGH), ALCHING("Low/High Alching", Category.SKILLING_MAGIC, ActivityIntensity.MODERATE), SUPERHEATING("Superheating items", Category.SKILLING_MAGIC, ActivityIntensity.MODERATE), + TELEPORT_TRAINING("Teleport training", Category.SKILLING_MAGIC, ActivityIntensity.MODERATE), SPLASHING("Splashing spells on monsters", Category.SKILLING_MAGIC, ActivityIntensity.LOW); @Getter diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/bank/enums/BankLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/bank/enums/BankLocation.java index 707f9b8e25..2ab16ccd80 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/bank/enums/BankLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/bank/enums/BankLocation.java @@ -28,6 +28,7 @@ public enum BankLocation { CANIFIS(new WorldPoint(3512, 3480, 0)), CASTLE_WARS(new WorldPoint(2443, 3083, 0)), CATHERBY(new WorldPoint(2808, 3441, 0)), + CLAN_HALL(new WorldPoint(1747, 5476, 0)), COOKS_GUILD(new WorldPoint(3147,3450,0)), CORSAIR_COVE(new WorldPoint(2570, 2864, 0)), CRAFTING_GUILD(new WorldPoint(2936, 3281, 0)), @@ -167,6 +168,9 @@ public boolean hasRequirements() { return Rs2Player.getQuestState(Quest.THE_CORSAIR_CURSE) == QuestState.FINISHED; case SOPHANEM: return Rs2Player.getQuestState(Quest.CONTACT) == QuestState.FINISHED; + case CLAN_HALL: + // Requires Clan Membership, varbit 933 + return Microbot.getVarbitValue(933) > 1; default: return true; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Magic.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Magic.java index 23e901fbea..7afdab8f9c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Magic.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Magic.java @@ -94,10 +94,12 @@ public static boolean quickCanCast(MagicAction magicSpell) { Rs2Tab.switchToMagicTab(); sleepUntil(() -> Rs2Tab.getCurrentTab() == InterfaceTab.MAGIC); } - - Widget widget = Rs2Widget.findWidget(magicSpell.getName()); + + Widget spellbookWidget = Rs2Widget.getWidget(218, 3); + if (spellbookWidget == null) return false; + Widget widget = Rs2Widget.findWidget(magicSpell.getName(), List.of(spellbookWidget)); + if (widget == null) return false; return widget.getSpriteId() == magicSpell.getSprite(); - } public static boolean quickCanCast(String spellName) { @@ -419,6 +421,7 @@ public static List findStavesByRunes(List runes) { .filter(staff -> staff.getRunes().containsAll(runes)) .collect(Collectors.toList()); } + /** * Calculates the runes required to cast a specified spell a certain number of times, * taking into account equipped staves, inventory, and optionally, rune pouch runes. @@ -489,6 +492,77 @@ public static Map getRequiredRunes(Rs2CombatSpells spell, Rs2Sta return requiredRunes; } + + /** + * Calculates the runes required to cast a specified spell a certain number of times, + * taking into account equipped staves, inventory, and optionally, rune pouch runes. + * + * This method dynamically determines the number of runes still needed to meet the + * casting requirement by checking available runes in the inventory and rune pouch + * and accounting for any runes provided by equipped staves. + * + * @param spell The spell to cast, represented as an {@link Rs2Spells} enum. + * @param equippedStaff The currently equipped staff, represented as an {@link Rs2Staff} object, + * which can reduce the number of required runes. + * @param casts The number of times the spell should be cast. Must be greater than 0. + * @param checkRunePouch A boolean indicating whether to include runes from the rune pouch in the calculation. + * @return A {@link Map} where the key is a {@link Runes} enum representing the type of rune, + * and the value is an {@code Integer} representing the quantity of that rune still needed. + * If all required runes are available, the map will be empty. + * @throws IllegalArgumentException if the {@code casts} parameter is less than or equal to 0. + */ + public static Map getRequiredRunes(Rs2Spells spell, Rs2Staff equippedStaff, int casts, boolean checkRunePouch) { + if (casts <= 0) { + throw new IllegalArgumentException("Number of casts must be greater than 0."); + } + + // Calculate total required runes for the desired number of casts + Map requiredRunes = new HashMap<>(); + spell.getRequiredRunes().forEach((rune, amount) -> requiredRunes.put(rune, amount * casts)); + + // Subtract runes provided by the equipped staff + if (equippedStaff != null) { + for (Runes providedRune : equippedStaff.getRunes()) { + requiredRunes.remove(providedRune); + } + } + + // Gather available runes from inventory + Map availableRunes = new HashMap<>(); + for (Rs2Item item : Rs2Inventory.items()) { + Arrays.stream(Runes.values()) + .filter(rune -> rune.getItemId() == item.getId()) + .findFirst() + .ifPresent(rune -> availableRunes.merge(rune, item.getQuantity(), Integer::sum)); + } + + // Optionally add runes from the rune pouch + if (checkRunePouch) { + RunePouch.getRunes().forEach((runeId, quantity) -> { + Arrays.stream(Runes.values()) + .filter(r -> r.getItemId() == runeId) + .findFirst() + .ifPresent(rune -> availableRunes.merge(rune, quantity, Integer::sum)); + }); + } + + // Calculate remaining runes needed + for (Runes rune : requiredRunes.keySet()) { + int requiredAmount = requiredRunes.get(rune); + int availableAmount = availableRunes.getOrDefault(rune, 0); + + if (availableAmount >= requiredAmount) { + requiredRunes.put(rune, 0); + } else { + requiredRunes.put(rune, requiredAmount - availableAmount); + } + } + + // Remove runes that are fully satisfied + requiredRunes.entrySet().removeIf(entry -> entry.getValue() <= 0); + + return requiredRunes; + } //DATA diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Spells.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Spells.java index 79a7ed679a..3cd8aadc45 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Spells.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/magic/Rs2Spells.java @@ -2,53 +2,53 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -import net.runelite.api.World; -import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.skillcalculator.skills.MagicAction; -import org.apache.commons.lang3.tuple.Pair; + +import java.util.Map; @Getter @RequiredArgsConstructor public enum Rs2Spells { - VARROCK(25, - new Pair[] {Pair.of("law rune", 1), Pair.of("air rune", 3), Pair.of("fire rune", 1)}, - new WorldPoint(3213, 3425, 0), "Varrock Teleport", "Varrock teleport", MagicAction.VARROCK_TELEPORT), - LUMBRIDGE(31, - new Pair[] {Pair.of("law rune", 1), Pair.of("air rune", 3), Pair.of("earth rune", 1)}, - new WorldPoint(3222, 3218, 0), "Lumbridge Teleport", "Lumbridge teleport", MagicAction.LUMBRIDGE_TELEPORT), - FALADOR(37, - new Pair[] {Pair.of("law rune", 1), Pair.of("air rune", 3), Pair.of("water rune", 1)}, - new WorldPoint(3093, 3380, 0), "Falador Teleport", "Falador teleport", MagicAction.FALADOR_TELEPORT), - CAMELOT(45, - new Pair[] {Pair.of("law rune", 1), Pair.of("air rune", 5)}, - new WorldPoint(2756, 3476, 0), "Camelot Teleport", "Camelot teleport", MagicAction.CAMELOT_TELEPORT), - - ARDOUGNE(51, - new Pair[] {Pair.of("law rune", 2), Pair.of("water rune", 2)}, - new WorldPoint(2789, 3306, 0), "Ardougne Teleport", "Ardougne teleport", MagicAction.ARDOUGNE_TELEPORT), - CONFUSE(3, - new Pair[] {Pair.of("earth rune", 2), Pair.of("water rune", 3), Pair.of("body rune", 1)}, - new WorldPoint(-1, -1, 0), "Confuse", "", MagicAction.CONFUSE), - WEAKEN(11, - new Pair[] {Pair.of("earth rune", 2), Pair.of("water rune", 3), Pair.of("body rune", 1)}, - new WorldPoint(-1, -1, 0), "Weaken", "", MagicAction.WEAKEN), - CURSE(19, - new Pair[] {Pair.of("earth rune", 3), Pair.of("water rune", 2), Pair.of("body rune", 1)}, - new WorldPoint(-1, -1, 0), "Weaken", "", MagicAction.CURSE), - VULNERABILITY(66, - new Pair[] {Pair.of("earth rune", 5), Pair.of("water rune", 5), Pair.of("soul rune", 1)}, - new WorldPoint(-1, -1, 0), "Weaken", "", MagicAction.VULNERABILITY), - ENFEEBLE(73, - new Pair[] {Pair.of("earth rune", 8), Pair.of("water rune", 8), Pair.of("soul rune", 1)}, - new WorldPoint(-1, -1, 0), "Weaken", "", MagicAction.ENFEEBLE), - STUN(80, new Pair[] {Pair.of("earth", 12), Pair.of("water rune", 12), Pair.of("soul rune", 1)}, - new WorldPoint(-1, -1, 0), "Weaken", "", MagicAction.STUN); - + VARROCK_TELEPORT(MagicAction.VARROCK_TELEPORT, Map.of( + Runes.FIRE, 1, + Runes.AIR, 3, + Runes.LAW, 1 + )), + LUMBRIDGE_TELEPORT(MagicAction.LUMBRIDGE_TELEPORT, Map.of( + Runes.EARTH, 1, + Runes.AIR, 3, + Runes.LAW, 1 + )), + FALADOR_TELEPORT(MagicAction.FALADOR_TELEPORT, Map.of( + Runes.WATER, 1, + Runes.AIR, 3, + Runes.LAW, 1 + )), + CAMELOT_TELEPORT(MagicAction.CAMELOT_TELEPORT, Map.of( + Runes.AIR, 5, + Runes.LAW, 1 + )), + ARDOUGNE_TELEPORT(MagicAction.ARDOUGNE_TELEPORT, Map.of( + Runes.WATER, 2, + Runes.LAW, 2 + )), + WATCHTOWER_TELEPORT(MagicAction.WATCHTOWER_TELEPORT, Map.of( + Runes.EARTH, 2, + Runes.LAW, 2 + )), + TROLLHEIM_TELEPORT(MagicAction.TROLLHEIM_TELEPORT, Map.of( + Runes.FIRE, 2, + Runes.LAW, 2 + )), + LOW_LEVEL_ALCHEMY(MagicAction.LOW_LEVEL_ALCHEMY, Map.of( + Runes.FIRE, 3, + Runes.NATURE, 1 + )), + HIGH_LEVEL_ALCHEMY(MagicAction.HIGH_LEVEL_ALCHEMY, Map.of( + Runes.FIRE, 5, + Runes.NATURE, 1 + )); - private final int level; - private final Pair[] itemsRequired; - private final WorldPoint destination; - private final String widgetText; - private final String tabletName; - private final MagicAction spell; + private final MagicAction action; + private final Map requiredRunes; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/player/Rs2Player.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/player/Rs2Player.java index 09e85f0599..3c312dc082 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/player/Rs2Player.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/player/Rs2Player.java @@ -52,6 +52,7 @@ public class Rs2Player { public static Instant lastAnimationTime = null; private static final long COMBAT_TIMEOUT_MS = 10000; private static long lastCombatTime = 0; + public static boolean lastInteractWasPlayer = false; @Getter public static int lastAnimationID = AnimationID.IDLE; @@ -707,6 +708,9 @@ public static void updateCombatTime() { * @return True if the player is in combat, false otherwise. */ public static boolean isInCombat() { + if (lastInteractWasPlayer) { + return (System.currentTimeMillis() - lastCombatTime < COMBAT_TIMEOUT_MS) && Microbot.getVarbitPlayerValue(1075) != -1; + } return System.currentTimeMillis() - lastCombatTime < COMBAT_TIMEOUT_MS; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/Rs2Walker.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/Rs2Walker.java index eed4455037..3ef4dc21e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/Rs2Walker.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/Rs2Walker.java @@ -1307,10 +1307,8 @@ public void setStart(WorldPoint start) { * @return distance */ public static int getDistanceBetween(WorldPoint startpoint, WorldPoint endpoint) { - ExecutorService pathfindingExecutor = Executors.newSingleThreadExecutor(); Pathfinder pathfinder = new Pathfinder(ShortestPathPlugin.getPathfinderConfig(), startpoint, endpoint); - pathfindingExecutor.submit(pathfinder); - sleepUntil(pathfinder::isDone); + pathfinder.run(); return pathfinder.getPath().size(); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_portals.tsv b/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_portals.tsv index 52547e27d2..e10583d6d5 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_portals.tsv +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_portals.tsv @@ -1,101 +1,103 @@ -# Origin Destination menuOption menuTarget objectID Skills Items Quests Duration isMembers Display info -3147 3638 0 2440 3089 0 Enter;Castle Wars portal;30386 1 -3147 3639 0 2440 3089 0 Enter;Castle Wars portal;30386 1 -3147 3640 0 2440 3089 0 Enter;Castle Wars portal;30386 1 -2444 3089 0 3151 3635 0 Enter;Large door;30388 1 -2444 3090 0 3151 3635 0 Enter;Large door;30388 1 -2438 3097 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 -2438 3096 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 -2436 3095 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 -2437 3095 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 -2436 3091 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2437 3091 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2438 3090 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2438 3089 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2436 3088 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2437 3088 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2436 3091 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2437 3091 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2438 3090 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2438 3089 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2436 3088 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2437 3088 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 -2436 3084 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 -2437 3084 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 -2438 3083 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 -2438 3082 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 -2374 9488 0 2440 3089 0 Exit;Portal;4389 1 -2375 9488 0 2440 3089 0 Exit;Portal;4389 1 -2376 9487 0 2440 3089 0 Exit;Portal;4389 1 -2376 9486 0 2440 3089 0 Exit;Portal;4389 1 -2374 9485 0 2440 3089 0 Exit;Portal;4389 1 -2375 9485 0 2440 3089 0 Exit;Portal;4389 1 -2373 9486 0 2440 3089 0 Exit;Portal;4389 1 -2373 9487 0 2440 3089 0 Exit;Portal;4389 1 -2424 9531 0 2440 3089 0 Exit;Portal;4390 1 -2425 9531 0 2440 3089 0 Exit;Portal;4390 1 -2426 9530 0 2440 3089 0 Exit;Portal;4390 1 -2426 9529 0 2440 3089 0 Exit;Portal;4390 1 -2424 9528 0 2440 3089 0 Exit;Portal;4390 1 -2425 9528 0 2440 3089 0 Exit;Portal;4390 1 -2423 9529 0 2440 3089 0 Exit;Portal;4390 1 -2423 9530 0 2440 3089 0 Exit;Portal;4390 1 -3128 3625 0 3327 4751 0 Enter;Free-for-all portal;26645 1 -3128 3627 0 3327 4751 0 Enter;Free-for-all portal;26645 1 -2595 3087 2 3109 3159 0 Enter;Magic Portal;2156 1 -2595 3088 2 3109 3159 0 Enter;Magic Portal;2156 1 -2590 3083 2 2907 3333 0 Enter;Magic Portal;2157 1 -2591 3083 2 2907 3333 0 Enter;Magic Portal;2157 1 -2586 3087 2 2703 3406 0 Enter;Magic Portal;2158 1 -2586 3088 2 2703 3406 0 Enter;Magic Portal;2158 1 -2206 2858 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2206 2857 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2206 2859 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2204 2859 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2204 2858 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2204 2857 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2205 2856 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2205 2860 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave -2206 2858 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2206 2859 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2206 2857 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2205 2856 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2205 2860 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2204 2859 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2204 2858 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2204 2857 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville -2720 4884 2 2721 4911 0 Enter;Portal;6282 1 -2719 4884 2 2721 4911 0 Enter;Portal;6282 1 -2721 4884 2 2721 4911 0 Enter;Portal;6282 1 -2718 4883 2 2721 4911 0 Enter;Portal;6282 1 -2722 4883 2 2721 4911 0 Enter;Portal;6282 1 -2719 4882 2 2721 4911 0 Enter;Portal;6282 1 -2720 4882 2 2721 4911 0 Enter;Portal;6282 1 -2721 4882 2 2721 4911 0 Enter;Portal;6282 1 -2677 5214 2 3110 3363 2 Enter;Portal Home;11356 1 -2677 5215 2 3110 3363 2 Enter;Portal Home;11356 1 -2678 5213 2 3110 3363 2 Enter;Portal Home;11356 1 -3084 3476 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars -3083 3476 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars -3082 3476 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars -3081 3475 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars -3081 3474 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars -3081 3473 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars -3158 10028 0 2206 2858 0 Enter;Soul Wars Portal;40475 1 Y Soul Wars -3158 10027 0 2206 2858 0 Enter;Soul Wars Portal;40475 1 Y Soul Wars -3158 10026 0 2206 2858 0 Enter;Soul Wars Portal;40475 1 Y Soul Wars -3327 4751 0 3128 3628 0 Exit;Portal;26646 1 -3328 4751 0 3128 3629 0 Exit;Portal;26646 1 -3097 3508 1 3157 9818 0 Use;Clan Cup portal;27094 1 -3157 9818 0 3097 3508 1 Use;Clan Cup portal;27095 1 -2040 5240 0 2021 5223 0 Use;Portal;19005 1 -1863 5239 0 1914 5222 0 Use;Portal;20786 1 -2120 5257 0 2146 5287 0 Use;Portal;23707 1 -2119 5258 0 2146 5287 0 Use;Portal;23707 1 -2121 5258 0 2146 5287 0 Use;Portal;23707 1 -2119 5258 0 2146 5287 0 Use;Portal;23707 1 -2121 5258 0 2146 5287 0 Use;Portal;23707 1 -2364 5212 0 2341 5219 0 Use;Portal;23922 1 -3233 9313 0 3233 2887 0 Use;Portal;6550 1 -3234 9312 0 3233 2887 0 Use;Portal;6550 1 -3232 9312 0 3233 2887 0 Use;Portal;6550 1 +# Origin Destination menuOption menuTarget objectID Skills Items Quests Varbits Duration isMembers Display info +3147 3638 0 2440 3089 0 Enter;Castle Wars portal;30386 1 +3147 3639 0 2440 3089 0 Enter;Castle Wars portal;30386 1 +3147 3640 0 2440 3089 0 Enter;Castle Wars portal;30386 1 +2444 3089 0 3151 3635 0 Enter;Large door;30388 1 +2444 3090 0 3151 3635 0 Enter;Large door;30388 1 +2438 3097 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 +2438 3096 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 +2436 3095 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 +2437 3095 0 2376 9489 0 Enter;Saradomin Portal;4387 0 Headslot;0 Capeslot 1 +2436 3091 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2437 3091 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2438 3090 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2438 3089 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2436 3088 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2437 3088 0 2376 9489 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2436 3091 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2437 3091 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2438 3090 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2438 3089 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2436 3088 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2437 3088 0 2416 9524 0 Enter;Guthix Portal;4408 0 Headslot;0 Capeslot 1 +2436 3084 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 +2437 3084 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 +2438 3083 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 +2438 3082 0 2416 9524 0 Enter;Zamorak Portal;4388 0 Headslot;0 Capeslot 1 +2374 9488 0 2440 3089 0 Exit;Portal;4389 1 +2375 9488 0 2440 3089 0 Exit;Portal;4389 1 +2376 9487 0 2440 3089 0 Exit;Portal;4389 1 +2376 9486 0 2440 3089 0 Exit;Portal;4389 1 +2374 9485 0 2440 3089 0 Exit;Portal;4389 1 +2375 9485 0 2440 3089 0 Exit;Portal;4389 1 +2373 9486 0 2440 3089 0 Exit;Portal;4389 1 +2373 9487 0 2440 3089 0 Exit;Portal;4389 1 +2424 9531 0 2440 3089 0 Exit;Portal;4390 1 +2425 9531 0 2440 3089 0 Exit;Portal;4390 1 +2426 9530 0 2440 3089 0 Exit;Portal;4390 1 +2426 9529 0 2440 3089 0 Exit;Portal;4390 1 +2424 9528 0 2440 3089 0 Exit;Portal;4390 1 +2425 9528 0 2440 3089 0 Exit;Portal;4390 1 +2423 9529 0 2440 3089 0 Exit;Portal;4390 1 +2423 9530 0 2440 3089 0 Exit;Portal;4390 1 +3128 3625 0 3327 4751 0 Enter;Free-for-all portal;26645 1 +3128 3627 0 3327 4751 0 Enter;Free-for-all portal;26645 1 +2595 3087 2 3109 3159 0 Enter;Magic Portal;2156 1 +2595 3088 2 3109 3159 0 Enter;Magic Portal;2156 1 +2590 3083 2 2907 3333 0 Enter;Magic Portal;2157 1 +2591 3083 2 2907 3333 0 Enter;Magic Portal;2157 1 +2586 3087 2 2703 3406 0 Enter;Magic Portal;2158 1 +2586 3088 2 2703 3406 0 Enter;Magic Portal;2158 1 +2206 2858 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2206 2857 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2206 2859 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2204 2859 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2204 2858 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2204 2857 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2205 2856 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2205 2860 0 3158 10027 0 Ferox Enclave;Portal;40476 1 Y Soul Wars: Ferox Enclave +2206 2858 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2206 2859 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2206 2857 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2205 2856 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2205 2860 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2204 2859 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2204 2858 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2204 2857 0 3081 3475 0 Edgeville;Portal;40476 1 Y Soul Wars: Edgeville +2720 4884 2 2721 4911 0 Enter;Portal;6282 1 +2719 4884 2 2721 4911 0 Enter;Portal;6282 1 +2721 4884 2 2721 4911 0 Enter;Portal;6282 1 +2718 4883 2 2721 4911 0 Enter;Portal;6282 1 +2722 4883 2 2721 4911 0 Enter;Portal;6282 1 +2719 4882 2 2721 4911 0 Enter;Portal;6282 1 +2720 4882 2 2721 4911 0 Enter;Portal;6282 1 +2721 4882 2 2721 4911 0 Enter;Portal;6282 1 +2677 5214 2 3110 3363 2 Enter;Portal Home;11356 1 +2677 5215 2 3110 3363 2 Enter;Portal Home;11356 1 +2678 5213 2 3110 3363 2 Enter;Portal Home;11356 1 +3084 3476 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars +3083 3476 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars +3082 3476 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars +3081 3475 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars +3081 3474 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars +3081 3473 0 2206 2858 0 Enter;Soul Wars Portal;40474 1 Y Soul Wars +3158 10028 0 2206 2858 0 Enter;Soul Wars Portal;40475 1 Y Soul Wars +3158 10027 0 2206 2858 0 Enter;Soul Wars Portal;40475 1 Y Soul Wars +3158 10026 0 2206 2858 0 Enter;Soul Wars Portal;40475 1 Y Soul Wars +3327 4751 0 3128 3628 0 Exit;Portal;26646 1 +3328 4751 0 3128 3629 0 Exit;Portal;26646 1 +3097 3508 1 3157 9818 0 Use;Clan Cup portal;27094 1 +3157 9818 0 3097 3508 1 Use;Clan Cup portal;27095 1 +2040 5240 0 2021 5223 0 Use;Portal;19005 1 +1863 5239 0 1914 5222 0 Use;Portal;20786 1 +2120 5257 0 2146 5287 0 Use;Portal;23707 1 +2119 5258 0 2146 5287 0 Use;Portal;23707 1 +2121 5258 0 2146 5287 0 Use;Portal;23707 1 +2119 5258 0 2146 5287 0 Use;Portal;23707 1 +2121 5258 0 2146 5287 0 Use;Portal;23707 1 +2364 5212 0 2341 5219 0 Use;Portal;23922 1 +3233 9313 0 3233 2887 0 Use;Portal;6550 1 +3234 9312 0 3233 2887 0 Use;Portal;6550 1 +3232 9312 0 3233 2887 0 Use;Portal;6550 1 +3185 3472 0 1760 5487 0 Enter-member;Clan hall portal;41724 933>1 8 +1760 5487 0 3185 3472 0 Leave;Portal;41617 8 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_spells.tsv b/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_spells.tsv index 03093cc5c6..2c3a85adda 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_spells.tsv +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/teleportation_spells.tsv @@ -44,7 +44,7 @@ # Watchtower Teleport 2549 3112 2 557 563;563 4696;563 4698;563 4699;563 1385;563 20736;563 6562;563 3053 58 Magic Watchtower Quest 19 4070=0 Y 10 Watchtower Teleport # Varbit 4460 is DIARY_ARDOUGNE_HARD -2584 3097 0 557 563;563 4696;563 4698;563 4699;563 1385;563 20736;563 6562;563 3053 58 Magic Watchtower Quest 19 4070=0;4460=1 Y 10 WatchtowerTeleport: Yanille +2584 3097 0 557 563;563 4696;563 4698;563 4699;563 1385;563 20736;563 6562;563 3053 58 Magic Watchtower Quest 19 4070=0;4460=1 Y 10 Watchtower Teleport: Yanille # Trollheim Teleport 2890 3679 0 554 563;563 4699;563 4697;563 4694;563 1387;563 11787;563 3053;563 11998;563 20714 61 Magic Eadgar's Ruse 19 4070=0 Y 10 Trollheim Teleport diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/transports.tsv b/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/transports.tsv index 1097af521a..9157877aad 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/transports.tsv +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/transports.tsv @@ -4368,16 +4368,16 @@ # Karamja 2910 3049 0 2906 3049 0 Cross;A wooden log;23644 5 2906 3049 0 2910 3049 0 Cross;A wooden log;23644 5 -2879 2954 0 2876 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2880 2953 0 2876 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2880 2952 0 2876 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2880 2951 0 2876 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2879 2950 0 2876 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2877 2954 0 2880 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2876 2953 0 2880 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2876 2952 0 2880 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2876 2951 0 2880 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 -2877 2950 0 2880 2952 0 Climb-over;Broken cart;2216 Shilo Village 2 +2879 2954 0 2876 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2880 2953 0 2876 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2880 2952 0 2876 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2880 2951 0 2876 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2879 2950 0 2876 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2877 2954 0 2880 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2876 2953 0 2880 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2876 2952 0 2880 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2876 2951 0 2880 2952 0 Climb over;Broken cart;2216 Shilo Village 2 +2877 2950 0 2880 2952 0 Climb over;Broken cart;2216 Shilo Village 2 2777 3214 0 2834 2951 0 Board;Travel cart;2230 10 coins Shilo Village 5 2778 3214 0 2834 2951 0 Board;Travel cart;2230 10 coins Shilo Village 5 2776 3213 0 2834 2951 0 Board;Travel cart;2230 10 coins Shilo Village 5