Feat/mushtree and digsite transport#1672
Conversation
Chillibloke
commented
Feb 2, 2026
- New file: MagicMushtree.java - Handles all 4 Fossil Island mushtree destinations
- Modified: MountedDigsite.java - Fixed widget-based teleport selection
- Modified: Rs2Walker.java - Added mushtree handling and reachability bypass
- Modified: transports.tsv - Added 12 mushtree routes + Brimhaven dungeon entries
build(ci): update Gradle task for shaded JAR build
2.1.10 upgrade to latest runelite
fix(gradle): update microbot version to 2.1.11
Update breakhandler to allow to stop a plugin when taking a break
Development
update latest runelite and collision map
Added: Grimstone dungeon ledge, brimhaven dungeon, waterbirth island dungeon
Added fairy ring DLP (grimstone dungeon)
Update transports.tsv
Update fairy_rings.tsv
Bank Fixes + Update latest runelite
Add dialogue handling for multi-destination teleport items when used from inventory (not equipped). Previously, items like Slayer Ring would interact successfully but fail to handle the destination selection dialogue that appears afterward. Supported items: Slayer ring, Games necklace, Skills necklace, Ring of dueling, Ring of wealth, Amulet of glory, Combat bracelet, Digsite pendant, Necklace of passage, Giantsoul amulet. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Allow Crafting Guild bank location to be accessible when the crafting cape is in inventory, not just when equipped. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Magic Mushtree (Mycelium Transportation System) support for Fossil Island - Fix POH mounted digsite pendant to use widget clicks like MountedXerics - Add Brimhaven Dungeon transport entries with correct object IDs - Skip tile reachability check for mushtree transports Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
WalkthroughThis pull request introduces Magic Mushtree transport support for Fossil Island, adding a new enum with four destination constants and methods for validating and handling mushtree-based transport interactions. It enhances the crafting guild bank location to recognize crafting capes in the inventory as valid access requirements. The Rs2Walker class is extended to detect Magic Mushtree objects, skip reachability checks for them, and delegate transport handling to the new enum. Additionally, dialogue-based destination selection is now supported for multi-destination teleport items, with a new helper method to identify items requiring dialogue-driven selection. A duplicate getWidget() method in MountedDigsite is refactored to a single location. Possibly related PRs
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ast-grep (0.40.5)runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/walker/Rs2Walker.javaThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In
`@runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/MagicMushtree.java`:
- Around line 76-78: The method in MagicMushtree currently ignores the boolean
result of sleepUntil and always returns true; capture the return value of
sleepUntil (the arrival success) when calling sleepUntil(() ->
Rs2Player.getWorldLocation().distanceTo(dest) < OFFSET, 10000) and return that
boolean instead of unconditionally returning true so the method accurately
reflects whether the player arrived.
In
`@runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/bank/enums/BankLocation.java`:
- Around line 129-134: The equipped vs inventory cape check is inconsistent:
isWearingCraftingGuild (in BankLocation) only checks
Rs2Equipment.isWearing("crafting cape") but the inventory check includes
"crafting cape(t)"; update the isWearingCraftingGuild boolean to also accept the
trimmed variant by adding Rs2Equipment.isWearing("crafting cape(t)") (or
otherwise normalize/check both "crafting cape" and "crafting cape(t)") so both
equipped and inventory checks treat trimmed crafting capes the same.
| // Wait until we arrive at destination | ||
| sleepUntil(() -> Rs2Player.getWorldLocation().distanceTo(dest) < OFFSET, 10000); | ||
| return true; |
There was a problem hiding this comment.
Return value ignores whether arrival actually succeeded.
The sleepUntil on line 77 returns a boolean indicating if the player arrived at the destination, but the method returns true unconditionally on line 78. If the 10-second timeout expires without arriving, the method still reports success—inconsistent with the documented contract.
🔧 Proposed fix
// Wait until we arrive at destination
- sleepUntil(() -> Rs2Player.getWorldLocation().distanceTo(dest) < OFFSET, 10000);
- return true;
+ return sleepUntil(() -> Rs2Player.getWorldLocation().distanceTo(dest) < OFFSET, 10000);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // Wait until we arrive at destination | |
| sleepUntil(() -> Rs2Player.getWorldLocation().distanceTo(dest) < OFFSET, 10000); | |
| return true; | |
| // Wait until we arrive at destination | |
| return sleepUntil(() -> Rs2Player.getWorldLocation().distanceTo(dest) < OFFSET, 10000); |
🤖 Prompt for AI Agents
In
`@runelite-client/src/main/java/net/runelite/client/plugins/microbot/shortestpath/MagicMushtree.java`
around lines 76 - 78, The method in MagicMushtree currently ignores the boolean
result of sleepUntil and always returns true; capture the return value of
sleepUntil (the arrival success) when calling sleepUntil(() ->
Rs2Player.getWorldLocation().distanceTo(dest) < OFFSET, 10000) and return that
boolean instead of unconditionally returning true so the method accurately
reflects whether the player arrived.