Open
Conversation
Minigame teleports were incorrectly allowed on plane 1 and above from inside the wilderness. Now the wilderness check ignores z plane level
The quest was incorrectly called "Watchtower Quest" instead of "Watchtower", and the VarPlayer for unlocking the Watchtower teleport was not used.
116=15 is sufficient to have access to the Hajedy Shilo Village travel cart. Not sure what 116=16 and 116=17 is used for.
* Add documentation for Transport TSV format and Useful Tools * Refactor section headers in Transport TSV format documentation for consistency * fix: correct TransportLoader reference in documentation and enhance Useful Tools section with additional resources and editing tips * docs: add Runelite report button section to Useful Tools documentation * docs: enhance Transport TSV format documentation with detailed column descriptions and examples * docs: update Useful Tools documentation for clarity and add Spreadsheet Editors section
* Fix teleportation coordinates for Temple of the Eye and update Useful Tools documentation * fixed tabs
* Add POH bounds and exit transport detection to path overlays
* Enhance POH exit detection to include notable transports like fairy rings and spirit trees
* Enhance exit info display for teleportation types in path overlays
* Enhance teleportation exit info to include specific talismans and update transport data
* Update teleportation portal data to include skill requirements for various portals
* Remove skill requirements from teleportation portal data in POH
* Add POH fairy ring and spirit tree toggles for boosted players
Players who boosted Construction/Farming to build POH features (fairy ring, spirit tree)
were unable to use them after the boost wore off because the plugin checked current skill
levels against build requirements. This adds separate toggle settings for these features
that allow players to enable them regardless of current skill levels.
Changes:
- Add 'Use POH fairy ring' config option (position 9, default: false)
- Requires 85 Construction to build, but toggle bypasses ongoing level check
- Add 'Use POH spirit tree' config option (position 10, default: false)
- Requires 75 Construction + 83 Farming to build, but toggle bypasses ongoing level check
- Remove Construction requirement from POH fairy ring in fairy_rings.tsv
- Now controlled by usePohFairyRing setting instead
- Enable POH spirit tree entries in spirit_trees.tsv at coordinates 2007 5700 0
- Removed skill requirements, now controlled by usePohSpiritTree setting
- Add filtering logic in PathfinderConfig.useTransport() to check POH bounds
- Blocks POH fairy ring if inside POH and usePohFairyRing is disabled
- Blocks POH spirit tree if inside POH and usePohSpiritTree is disabled
- Increment all config position numbers from 10 onwards to maintain sequential order
Both settings default to false to maintain existing behavior. Players who have built
these features can enable the toggles to use them without maintaining boosted levels.
* Add import for TransportType in PathTileOverlay
* Plan: Fix POH Fairy Ring & Spirit Tree Routing
TL;DR: All POH furniture (fairy ring, spirit tree, nexus, jewellery box) is unreachable by the pathfinder because POH has no collision data and the BFS cannot walk between tiles inside the house. The transport origins (fairy ring at 2027,5700; spirit tree at 2007,5700; jewellery box at 1870,5698; nexus at 1928,5731) are dozens of tiles away from the house landing (1923,5709), so the BFS gets stranded at the landing tile and never discovers those transports. What the user sees as "working" for jewellery box and fairy ring is actually just a look-ahead display (getPohExitInfo + findSecondaryTransport) that creates the illusion of routing through the POH — the real path goes via an outside-house teleport or an unrelated nearby transport. The fix is to remap all POH transport origins to the house landing tile so the BFS immediately finds them, then update the display logic to handle fairy ring and spirit tree exit types.
Steps
Remap POH transport origins to house landing tile in PathfinderConfig.java:352-370
At the end of refreshTransports(), after the main for (Map.Entry ...) loop finishes populating transports and transportsPacked
Define the POH house landing packed coordinate: WorldPointUtil.packWorldPoint(1923, 5709, 0)
Iterate over transports entries. For any key whose unpacked X/Y falls inside POH bounds (isInsidePoh()), collect its transport set and remap it under the house landing key
Merge (not replace) with any existing transports already at the landing key
Update transportsPacked to match
This makes the BFS discover all POH furniture transports (fairy ring, spirit tree, jewellery box, nexus, glory, xeric's, digsite pendant) the moment it arrives at the house landing tile via "Teleport to House"
Add FAIRY_RING and SPIRIT_TREE exit type handling in ShortestPathPlugin.java:669-690
Currently, the method handles TELEPORTATION_BOX (→ "Jewelry Box: ...", "Xeric's Talisman: ...", "Digsite Pendant: ...") and TELEPORTATION_PORTAL_POH (→ "Nexus: ...")
Add a new else if for TransportType.FAIRY_RING: set immediateExitInfo = "Fairy Ring " + exitInfo (e.g., "Fairy Ring A I Q")
Add a new else if for TransportType.SPIRIT_TREE: set immediateExitInfo = "Spirit Tree: " + exitInfo (e.g., "Spirit Tree: 4: Grand Exchange")
With this change, the look-ahead display will now show the ACTUAL exit transport (since the path genuinely goes through POH) instead of relying on findSecondaryTransport() to detect a nearby fairy ring/spirit tree 30 steps later
Fix varbit 4744 checks in teleportation_spells.tsv
The inside-house entry (destination 1923 5709 0, teleportation_spells.tsv:21) has varbits 4070=0 only — it's always active for Standard spellbook, even when the player configured "teleport outside house" (varbit 4744=1). Add 4744=0 to make it only active when "inside house" is set.
The outside-house entries (lines 23-39) with varbits 4070=0;2187=N are missing 4744=1 — they're active even when the player has "teleport inside house." Add 4744=1 to each.
Reference: teleportation_items.tsv already has these checks correct (line 119 uses 4744=0 for inside, lines 121+ use 4744=1 for outside)
Verify the toggle logic still works — no code change needed here, just verification
useTransport() in PathfinderConfig.java:444-452 (fairy ring) and PathfinderConfig.java:489-497 (spirit tree) check transport.getOrigin() — the Transport object's original origin, not the map key
Since step 1 only changes the map key (not the Transport object), the POH fairy ring transport still has origin 2027 5700 0 internally, isInsidePoh(2027, 5700) still returns true, and the usePohFairyRing/usePohSpiritTree toggles continue to filter correctly
When toggles are OFF → transports are filtered out in useTransport() → never added to the map → never remapped → pathfinder uses alternative routes (outside-house teleport, Salve Graveyard, Varrock GE)
When toggles are ON → transports pass filter → added to map → remapped to house landing → BFS finds them immediately
Verification
Run existing tests: ./gradlew test — ensure no regressions
Manual testing scenarios:
Set destination to a fairy ring code destination (e.g., near fairy ring ALS). With usePohFairyRing ON → should show "Teleport to House (Exit: Fairy Ring A L S)" with path going through POH. With usePohFairyRing OFF → should route via nearest real-world fairy ring
Set destination near a spirit tree (e.g., Grand Exchange). With usePohSpiritTree ON → should show "Teleport to House (Exit: Spirit Tree: 4: Grand Exchange)". With OFF → should route via Varrock teleport or walking
Set destination to Edgeville. Jewellery box path should still show "Teleport to House (Exit: Jewelry Box: Edgeville)" — unchanged behavior
Verify varbit 4744 fix: with "teleport outside house" enabled, the inside-house spell entry (1923 5709 0) should NOT be used by the pathfinder
Decisions
Remap in code vs change TSV origins: Chose code-based remapping in refreshTransports() because it keeps TSV files accurately documenting real-world POH furniture coordinates, handles all transport types uniformly, and is centralized in one method
House landing tile: Using the fixed coordinate 1923 5709 0 which is the universal POH landing point for all players (defined in teleportation_spells.tsv and teleportation_items.tsv)
* Summary of Changes
1. Text Duplication Fix (PathTileOverlay.java:299)
Added a special handler for when both the transport and player are inside POH
Gets getPohExitInfo once instead of iterating through all transports
Finds the first matching transport for the display name
Renders exactly one label and returns immediately
This prevents 1–15 duplicate labels from stacking
2. Canvas Position Fix (PathTileOverlay.java:378)
Removed the transportAndPlayerInsidePoh conditional in the canvas point calculation
Now always uses lp (local point) directly since POH is handled by the early return
Simplifies the rendering logic for non-POH transports
3. Red Tiles Fix (render loop)
Added POH coordinate check before drawing tiles
Skips drawTile for any path step inside POH bounds (X: 1856-2047, Y: 5696-5767)
Counter still increments to maintain correct tile numbering
Eliminates red tiles appearing inside the house
The POH fairy ring and spirit tree routing should now work correctly without visual glitches!
* Plan: Add POH Jewellery Box Tier & Mounted Items Config
TL;DR: Replace the single boolean useTeleportationBoxes toggle with two granular controls: (1) a dropdown to select the player's jewellery box tier (None/Basic/Fancy/Ornate), and (2) a toggle for mounted items (Glory, Xeric's, Digsite Pendant, Mythical Cape). The filtering will check the transport's objectInfo field to determine which tier/category it belongs to, ensuring only the correct transports are active and the correct display text shows.
Steps
Create a JewelleryBoxTier enum — new file src/main/java/shortestpath/JewelleryBoxTier.java
Values: NONE("None"), BASIC("Basic"), FANCY("Fancy"), ORNATE("Ornate")
Follow the same pattern as TeleportationItem — @Getter @requiredargsconstructor with a type string field and toString() override
Update config in ShortestPathConfig.java:232-240
Replace useTeleportationBoxes (boolean, position 19) with two new config items:
pohJewelleryBoxTier — dropdown using JewelleryBoxTier enum, default ORNATE, position 19. Description: "The tier of jewellery box built in your PoH. Set to None to disable."
usePohMountedItems — boolean toggle, default true, position 20. Description: "Whether to include mounted items in the path (e.g. mounted glory, Xeric's talisman, digsite pendant, mythical cape)"
Shift all subsequent position numbers up by 1 (position 20→21, 21→22, etc.)
Update PathfinderConfig.java
Replace the useTeleportationBoxes boolean field with:
JewelleryBoxTier pohJewelleryBoxTier (imported from shortestpath package)
boolean usePohMountedItems
In refresh() (line ~196): replace the useTeleportationBoxes assignment with pohJewelleryBoxTier = ... and usePohMountedItems = ...
In useTransport() (line ~543): replace the TELEPORTATION_BOX check with logic that inspects transport.getObjectInfo():
If objectInfo contains "Jewellery Box": check the tier — "Basic Jewellery Box" requires BASIC or higher, "Fancy Jewellery Box" requires FANCY or higher, "Ornate Jewellery Box" requires ORNATE. If pohJewelleryBoxTier is NONE, reject all.
If objectInfo contains "Amulet of Glory", "Mythical cape", "Xeric's Talisman", or "Digsite": check usePohMountedItems
This uses the existing objectInfo data from the TSV (e.g., "Teleport Menu Basic Jewellery Box 37492", "Edgeville Amulet of Glory 13523")
Update getPohExitInfo display logic in ShortestPathPlugin.java:666-675
Add objectInfo checks for mounted glory and mythical cape in the TELEPORTATION_BOX branch:
If objectInfo contains "Amulet of Glory": immediateExitInfo = "Mounted Glory: " + exitInfo
If objectInfo contains "Mythical cape": immediateExitInfo = "Mythical Cape: " + exitInfo
Otherwise (jewellery box): keep existing "Jewelry Box: " + exitInfo
Update drawTransportInfo POH path in PathTileOverlay.java:316-353
The POH early-return code block currently finds the first matching transport's displayInfo for the label text. Since mounted glory and jewellery box can share the same destination (e.g., Edgeville at 3087 3496 0), we need to prefer the one the pathfinder actually used.
Currently the path itself encodes which destination was chosen (via BFS visited marking the first match). Since both transports share the same destination, we can't distinguish from the path alone. However, the getPohExitInfo method already picks a transport and formats its display correctly — so the drawTransportInfo label should use the exit info from getPohExitInfo directly rather than looking up a separate transport display name.
Fix: Instead of looking up a separate transport for the label text, just use the teleport name that landed us in POH (which is already the text from the current path step's transport — e.g., "Teleport to House") and append the pohExitInfo.
Update the test in PathfinderTest.java:217 — change when(config.useTeleportationBoxes()).thenReturn(true) to mock the new config methods.
Verification
Run ./gradlew test to ensure no regressions
Manual testing:
Set jewellery box tier to Ornate → going to Edgeville should show "Teleport to House (Exit: Jewelry Box: O: Edgeville)"
Set jewellery box tier to Basic → Edgeville should NOT be available via jewellery box (only in Ornate tier), but mounted glory should still work if mounted items is ON → "Teleport to House (Exit: Mounted Glory: Edgeville)"
Set jewellery box tier to None + mounted items OFF → no POH box transports available at all
Set jewellery box tier to Fancy → destinations A-J (Fancy tier) should work, K-R (Ornate tier) should not
Decisions
Default ORNATE for jewellery box tier to maintain backward compatibility with the previous useTeleportationBoxes=true default
Default true for mounted items toggle for same reason
Filtering uses objectInfo string matching (the TSV "menuOption menuTarget objectID" column) since it already distinguishes "Basic Jewellery Box 37492" vs "Fancy Jewellery Box 37501" vs "Ornate Jewellery Box 37520" vs "Amulet of Glory 13523"
* Changes Summary
1. New Enum: JewelleryBoxTier.java
Created enum with NONE, BASIC, FANCY, ORNATE values
Follows TeleportationItem pattern with fromType() method
2. Config Fields: ShortestPathConfig.java
Replaced useTeleportationBoxes boolean with pohJewelleryBoxTier enum (position 19, default ORNATE)
Added usePohMountedItems boolean (position 20, default true)
Updated position numbers 21→22, 22→23, etc. for all following config items
3. Filtering Logic: PathfinderConfig.java
Added JewelleryBoxTier import
Replaced useTeleportationBoxes field with pohJewelleryBoxTier and usePohMountedItems
Updated refresh() to read new config values
Implemented tier-based filtering in useTransport():
Mounted items (Glory, Xeric's, Digsite, Mythical Cape) filtered by usePohMountedItems
Jewellery boxes filtered by tier using objectInfo string matching
4. Display Prefixes: ShortestPathPlugin.java
Added "Mounted Glory: " prefix for Amulet of Glory transports
Added "Mythical Cape: " prefix for Mythical cape transports
Added JewelleryBoxTier override() method for config override system
5. Test Updates: PathfinderTest.java
Updated testTeleportationBoxes() to mock pohJewelleryBoxTier (ORNATE) and usePohMountedItems (true)
This resolves the Edgeville routing issue — ornate jewellery box destinations will now show "O: Edgeville" while mounted glory will show "Mounted Glory: Edgeville", and users can configure their actual construction level via the tier dropdown.
* Implementation Complete
All changes have been implemented successfully:
1. New POH Config Section — ShortestPathConfig.java
Added sectionPoh at position 31 with closedByDefault = true
Moved sectionThresholds from position 34 → 38 to make room
2. Master POH Toggle — Position 32
usePoh() — "Enable POH teleports"
Default: false
Description: "Master toggle for all Player-Owned House (POH) teleports. When disabled, all POH transports are excluded regardless of individual settings below."
3. Reorganized POH Config Items — Positions 33-37
All moved to sectionPoh with consistent "POH" naming:
Position 33: usePohFairyRing() — "POH fairy ring" (was position 9)
Position 34: usePohSpiritTree() — "POH spirit tree" (was position 10)
Position 35: useTeleportationPortalsPoh() — "POH portal nexus" (was position 23)
Position 36: pohJewelleryBoxTier() — "POH jewellery box tier" (was position 19)
Position 37: usePohMountedItems() — "POH mounted items" (was position 20)
4. Fixed Position Number Gaps — sectionSettings
Renumbered after removing POH items:
Positions 1-8: unchanged (avoidWilderness → useFairyRings)
Positions 9-21: renumbered (useSpiritTrees → useWildernessObelisks)
Positions 22-31: renumbered (useSeasonalTransports → showTransportInfo)
Fixed duplicate position 27 bug (useSeasonalTransports and includeBankPath)
Fixed duplicate position 34 bug (tileCounterStep and showTransportInfo)
5. Master POH Gate — PathfinderConfig.java
Added usePoh boolean field
Added usePoh = ShortestPathPlugin.override("usePoh", config.usePoh()) in refresh()
Added early check in useTransport(): if !usePoh and transport origin is inside POH bounds, return false
This single check gates ALL POH transports: FAIRY_RING (POH), SPIRIT_TREE (POH), TELEPORTATION_BOX, TELEPORTATION_PORTAL_POH
6. Ornate Jewellery Box Dedup — PathfinderConfig.java
In the TELEPORTATION_BOX section of useTransport():
Detect mounted glory via objectInfo.contains("Amulet of Glory")
If mounted glory AND pohJewelleryBoxTier == ORNATE, return false (skip the glory)
This suppresses all 4 overlapping destinations: Edgeville, Karamja, Draynor, Al Kharid
Ornate box displays these with "O: " prefix, mounted glory would show "Mounted Glory: "
Other mounted items (Xeric's, Digsite, Mythical Cape) unaffected — no overlap
7. Test Updates — PathfinderTest.java
Added when(config.usePoh()).thenReturn(false) to setupConfig() for default behavior
Added when(config.usePoh()).thenReturn(true) override in testTeleportationBoxes()
Result: The config UI now has a dedicated "Player-Owned House" section with a master toggle. When ornate jewellery box is enabled, it takes priority over mounted glory for shared destinations (Edgeville, Karamja, Draynor, Al Kharid), showing the correct "O: Edgeville" prefix instead of non-deterministic HashSet iteration between "Mounted Glory: Edgeville" and "O: Edgeville".
* POH Wilderness Obelisk Support
1. Enabled POH Obelisk in TSV — wilderness_obelisks.tsv
Uncommented the POH obelisk origin with coordinate 1888 5717 0 (inside POH bounds)
This pairs with the existing 6 destination entries via the permutation pattern
2. Added Config Toggle — ShortestPathConfig.java
Position 38: usePohObelisk() — "POH wilderness obelisk"
Default: false
Requires 80 Construction
Updated sectionThresholds position to 39
3. Added Filtering Logic — PathfinderConfig.java
Added usePohObelisk field
Added refresh logic to read config value
Updated WILDERNESS_OBELISK filtering to check if origin is inside POH:
If useWildernessObelisks is false → reject all
If origin is inside POH and usePohObelisk is false → reject POH obelisk only
Master usePoh gate already covers this via the early check
4. Updated Tests — PathfinderTest.java
Added usePoh() and usePohObelisk() mocks to testWildernessObelisks()
The POH obelisk now follows the same pattern as POH fairy ring and spirit tree:
Master gate: usePoh must be enabled
Parent toggle: useWildernessObelisks must be enabled
Sub-toggle: usePohObelisk must be enabled
Display: Already handled — shows "Obelisk: 1: Level 13 Wilderness", etc.
All POH teleports are now fully integrated into the dedicated POH config section!
* Start implementation
Perfect! All three fixes have been applied:
1. Added "Obelisk:" prefix for POH obelisk exits
In getPohExitInfo(), added WILDERNESS_OBELISK handling in the immediate exit section. Now when using the POH obelisk, it displays:
"Teleport to House (Exit: Obelisk: 4: Level 35 Wilderness)" ✓
2. Removed obelisk from secondary transport look-ahead
Deleted the WILDERNESS_OBELISK block from findSecondaryTransport(). This prevents the look-ahead from incorrectly showing obelisk info when the POH obelisk is disabled. Now when routing through Nexus→Ghorrock→walk to obelisk, it correctly displays:
"Teleport to House (Exit: Nexus: Ghorrock)" ✓
3. Fixed house tablet display name
Changed "Teleport to House tablet" → "Teleport to House" in the TSV, matching the spell display.
The POH obelisk now:
Shows correct prefix when enabled
Doesn't interfere with display when disabled
Works seamlessly with the master POH toggle and wilderness obelisk parent toggle
* Changes Made
Removed obsolete findSecondaryTransport() method (previously lines 722-758):
This method was a legacy workaround from before POH transport remapping was implemented
It scanned 30 steps ahead looking for fairy rings, spirit trees, and gliders
Now that all POH transports are remapped to the landing tile, the immediate exit is always correct
Removed the call to findSecondaryTransport() (previously lines 703-710):
The code was overriding the correct immediateExitInfo with secondary transport results
This caused display bugs when POH-specific toggles were disabled (e.g., showing "Fairy Ring CKS" instead of "Nexus: Salve Graveyard")
Expected Behavior Now
✅ POH fairy ring OFF: Shows "Nexus: Salve Graveyard" (or appropriate nexus exit), not fairy ring info
✅ POH obelisk OFF: Shows correct immediate exit (nexus/jewelry box), not obelisk info
✅ POH spirit tree OFF: Shows correct immediate exit, not spirit tree info
✅ Works with both house tablets and house runes: Display logic is transport-agnostic
✅ POH toggles ON: Still shows the POH furniture exits correctly
The display will now always show the actual first transport used to exit the POH, respecting your toggle settings.
Player-owned house spirit tree is now included
* [wip] Add teleportation entries for Abyss and various altars in transports.tsv * Update teleportation entries for Abyss and various altars in transports.tsv * Remove mavenLocal() from repositories * Fix formatting for Fire Altar teleportation entry in transports.tsv * Add mavenLocal() to repositories in build.gradle * Update src/main/resources/transports/transports.tsv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/main/resources/transports/transports.tsv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/main/resources/transports/transports.tsv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/main/resources/transports/transports.tsv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/main/resources/transports/transports.tsv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/main/resources/transports/transports.tsv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update transports.tsv with clarifications on passage destinations and adjustments to coordinates * Update transports.tsv to add blank lines for better readability and clarify comments --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add Keldagrim boat and minecart transport entries; update teleportation item descriptions * Update src/main/resources/transports/boats.tsv Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor PathfinderTest to use active transports from pathfinderConfig * Add tests for Lovakengj minecart network costs before and after quest completion * Implement item requirement merging in Transport class and add test for Lovakenj minecart network reverse usability before quest completion * Update docs/Transport-TSV-format.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
For some reason when I set a path it will randomly increase my RAM useage to 1.5gb. Even if i clear the path and log out it fills my ram to 1.5gb and my frames drop to 1fps. All other apps still working fine. This happens randomly, maybe 1 in 3 paths I set. Paths can be simple, no obsticles ect and short path.
not sure if it matters;
PC 16gb ddr4 ram, i7 10700k, 3070ti, 2t nvme ssd