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