Skip to content

fix: block Al Kharid mine in pathfinder collision data#1813

Open
Zimada1 wants to merge 1 commit into
chsami:mainfrom
Zimada1:fix/al-kharid-mine-pathfinding
Open

fix: block Al Kharid mine in pathfinder collision data#1813
Zimada1 wants to merge 1 commit into
chsami:mainfrom
Zimada1:fix/al-kharid-mine-pathfinding

Conversation

@Zimada1

@Zimada1 Zimada1 commented Jul 2, 2026

Copy link
Copy Markdown

Problem

The shortest-path A* pathfinder routes through the Al Kharid mine open pit because the cache-derived collision data doesn't mark the terrain as blocking. This causes the walker to get stuck — the path goes green then recalculates to red but the character never moves.

Fix

Add 88 blocked edges around the mine perimeter (x=3281-3300, y=3151-3178) to �locked_edges.tsv. These edge-level blocks prevent the pathfinder from routing through the mine area, forcing it to find an alternate surface route.

Testing

Tested by walking through the Al Kharid area — pathfinder now correctly routes around the mine instead of through it.

The shortest-path A* pathfinder routes through the Al Kharid mine
open pit because the cache-derived collision data doesn't mark the
terrain as blocking. This causes the walker to get stuck when the
path enters the mine area.

Add blocked edges around the mine perimeter (x=3281-3300, y=3151-3178)
to prevent the pathfinder from routing through it.
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

This PR updates the RuneLite client dependency to a new game version. It changes camera focal point/pitch/yaw API types and units, removes getMapAngle(), restructures EntityOps sub-operation access, and adds cache loader support for named/ID-based world map and item stackable opcodes. It regenerates numerous ID constants (items, NPCs, objects, interfaces, DB tables, varbits, varclients, sprites), updates GPU alpha rendering, adjusts overlay menu entry creation/timing, adds cutscene overlay suppression, extends item mappings, updates Plugin Hub UI messaging/layout, and updates compiled bank/private-message scripts and resource data files.

Changes

Area Change
Cache Named/ID-based archive lookup for world map and stackable opcode 160 in ItemLoader
API contracts Camera focal point double→float, getMapAngle removed, EntityOps sub-op API restructured
Generated IDs Large batches of new/renamed/removed constants across Item/Npc/Object/Interface/DBTable/VarClient/Varbit/Sprite IDs
GPU Face transparency in temp model alpha upload; 14-bit sine/cosine in Zone rendering
Plugins Overlay origin menu now hooks PostMenuSort with new entry ids; NpcOverlay suppressed during cutscenes; new ItemMapping entries; Plugin Hub warning UI reworked
Resources item_variations.json and roofremoval overrides updated
Scripts BankMainBuild and PrivateMessage rs2asm/hash recompiled with restructured control flow
Build Version bumped to 1.12.31-SNAPSHOT

Sequence Diagram(s)

sequenceDiagram
  participant MenuEntrySwapperPlugin
  participant EntityOps
  MenuEntrySwapperPlugin->>EntityOps: getSubOps(opIdx)
  EntityOps-->>MenuEntrySwapperPlugin: subops
  MenuEntrySwapperPlugin->>EntityOps: subops.getNumOps()
  MenuEntrySwapperPlugin->>EntityOps: subops.getOp(subIdx)
  MenuEntrySwapperPlugin->>MenuEntrySwapperPlugin: packSubID(opIdx, subIdx)
Loading

Possibly related PRs

  • chsami/Microbot#1805: Adds the same WorldMapManager.DETAILS_ID/COMPOSITEMAP_ID constants and named-vs-ID index handling, plus the matching ItemLoader opcode 160 and test changes.
  • chsami/Microbot#1732: Introduces the EntityOps interface shape that this PR modifies with the new sub-op accessors.
  • chsami/Microbot#1667: Also reindexes [bank] interface component IDs in interfaces.toml.

Suggested labels: dependencies, cache, api-change, generated-ids

Suggested reviewers: chsami

I combed through the sub-op refactor and the WorldMapManager named/ID fallback — logic checks out consistently. No inconsistencies spotted worth flagging! 🐰

A rabbit hops through bytes anew,
Swapping doubles for floats so true,
Sub-ops nested, IDs regrown,
Bank scripts rewired, labels re-sewn,
Version bumped — the burrow's construction crew! 🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly matches the stated main change: blocking the Al Kharid mine in pathfinder collision data.
Description check ✅ Passed The description directly explains the same collision-data fix and the added blocked edges around the mine perimeter.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch fix/al-kharid-mine-pathfinding

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.44.0)
runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java

[{"text":""https://runelite.net/plugin-hub/show/" + manifest.getInternalName()","range":{"byteOffset":{"start":9678,"end":9746},"start":{"line":310,"column":51},"end":{"line":310,"column":119}},"file":"runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java","lines":"\t\t\thelp.addActionListener(ev -> LinkBrowser.browse("https://runelite.net/plugin-hub/show/" + manifest.getInternalName()));","charCount":{"leading":51,"trailing":3},"language":"Java","metaVariables":{"single":{},"multi":{"secondary":[{"text":""https://runelite.net/plugin-hub/show/"","range":{"byteOffset":{"start":9678,"end":9717},"start":{"line":310,"column":51},"end":{"line":310,"column":90}}}]},"transformed":{}},"ruleId":"tainted-url-host","severity":"warning","note":"[CWE-20] Improper Input Validation. [REFERENCES]\n - https://cwe.mitre.org/data/definitions/20.html","message":"Avoid building a URL host from untrusted input","labels":[{"text":""https://runelite.net/plugin-hub/show

... [truncated 893 characters] ...

mn":44}}},"FILTER":{"text":"query","range":{"byteOffset":{"start":21956,"end":21961},"start":{"line":700,"column":46},"end":{"line":700,"column":51}}},"CTX":{"text":"PluginSearch","range":{"byteOffset":{"start":21927,"end":21939},"start":{"line":700,"column":17},"end":{"line":700,"column":29}}}},"multi":{},"transformed":{}},"ruleId":"ldap-injection-java","severity":"warning","note":"[CWE-90] Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection'). Security best practice. [REFERENCES]\n - https://cwe.mitre.org/data/definitions/90.html","message":"Avoid LDAP injections","labels":[{"text":"PluginSearch.search(plugins, query)","range":{"byteOffset":{"start":21927,"end":21962},"start":{"line":700,"column":17},"end":{"line":700,"column":52}},"style":"primary"}]}]

runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java

[{"text":""https://runelite.net/plugin-hub/show/" + manifest.getInternalName()","range":{"byteOffset":{"start":9678,"end":9746},"start":{"line":310,"column":51},"end":{"line":310,"column":119}},"file":"runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java","lines":"\t\t\thelp.addActionListener(ev -> LinkBrowser.browse("https://runelite.net/plugin-hub/show/" + manifest.getInternalName()));","charCount":{"leading":51,"trailing":3},"language":"Java","metaVariables":{"single":{},"multi":{"secondary":[{"text":""https://runelite.net/plugin-hub/show/"","range":{"byteOffset":{"start":9678,"end":9717},"start":{"line":310,"column":51},"end":{"line":310,"column":90}}}]},"transformed":{}},"ruleId":"tainted-url-host","severity":"warning","note":"[CWE-20] Improper Input Validation. [REFERENCES]\n - https://cwe.mitre.org/data/definitions/20.html","message":"Avoid building a URL host from untrusted input","labels":[{"text":""https://runelite.net/plugin-hub/show

... [truncated 893 characters] ...

mn":44}}},"FILTER":{"text":"query","range":{"byteOffset":{"start":21956,"end":21961},"start":{"line":700,"column":46},"end":{"line":700,"column":51}}},"CTX":{"text":"PluginSearch","range":{"byteOffset":{"start":21927,"end":21939},"start":{"line":700,"column":17},"end":{"line":700,"column":29}}}},"multi":{},"transformed":{}},"ruleId":"ldap-injection-java","severity":"warning","note":"[CWE-90] Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection'). Security best practice. [REFERENCES]\n - https://cwe.mitre.org/data/definitions/90.html","message":"Avoid LDAP injections","labels":[{"text":"PluginSearch.search(plugins, query)","range":{"byteOffset":{"start":21927,"end":21962},"start":{"line":700,"column":17},"end":{"line":700,"column":52}},"style":"primary"}]}]

runelite-client/src/main/java/net/runelite/client/plugins/gpu/Zone.java

[{"text":""https://runelite.net/plugin-hub/show/" + manifest.getInternalName()","range":{"byteOffset":{"start":9678,"end":9746},"start":{"line":310,"column":51},"end":{"line":310,"column":119}},"file":"runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java","lines":"\t\t\thelp.addActionListener(ev -> LinkBrowser.browse("https://runelite.net/plugin-hub/show/" + manifest.getInternalName()));","charCount":{"leading":51,"trailing":3},"language":"Java","metaVariables":{"single":{},"multi":{"secondary":[{"text":""https://runelite.net/plugin-hub/show/"","range":{"byteOffset":{"start":9678,"end":9717},"start":{"line":310,"column":51},"end":{"line":310,"column":90}}}]},"transformed":{}},"ruleId":"tainted-url-host","severity":"warning","note":"[CWE-20] Improper Input Validation. [REFERENCES]\n - https://cwe.mitre.org/data/definitions/20.html","message":"Avoid building a URL host from untrusted input","labels":[{"text":""https://runelite.net/plugin-hub/show

... [truncated 893 characters] ...

mn":44}}},"FILTER":{"text":"query","range":{"byteOffset":{"start":21956,"end":21961},"start":{"line":700,"column":46},"end":{"line":700,"column":51}}},"CTX":{"text":"PluginSearch","range":{"byteOffset":{"start":21927,"end":21939},"start":{"line":700,"column":17},"end":{"line":700,"column":29}}}},"multi":{},"transformed":{}},"ruleId":"ldap-injection-java","severity":"warning","note":"[CWE-90] Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection'). Security best practice. [REFERENCES]\n - https://cwe.mitre.org/data/definitions/90.html","message":"Avoid LDAP injections","labels":[{"text":"PluginSearch.search(plugins, query)","range":{"byteOffset":{"start":21927,"end":21962},"start":{"line":700,"column":17},"end":{"line":700,"column":52}},"style":"primary"}]}]

  • 25 others

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Warning

⚠️ This pull request has been flagged as potential spam (gibberish) by CodeRabbit slop detection and should be reviewed carefully.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java (1)

176-193: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Move the origin menu injection to MenuOpened.
PostMenuSort is the wrong hook for adding the Shift+click overlay origin submenu; inject it from onMenuOpened instead so it’s built with the rest of the menu entries.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java`
around lines 176 - 193, The Shift+click overlay origin submenu is currently
being added from `onPostMenuSort`, but it should be injected when the menu is
first built. Move the `overlayManager.addOriginMenu(...)` call into
`onMenuOpened` in `OverlayRenderer`, and keep the existing guards for
`curHoveredOverlay`, `client.isMenuOpen()`, and
`client.isKeyPressed(KeyCode.KC_SHIFT)` so the submenu is assembled with the
rest of the menu entries.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java`:
- Around line 582-600: The submenu action is using the loop index instead of the
encoded submenu identifier, which can break matching later in
MenuEntrySwapperPlugin. Update the submenu click wiring in the block that builds
entries from EntityOps so it passes the encoded sub-ID from the source data (or
make the matcher use the same source) rather than the local subIdx loop counter.
Use the existing symbols EntityOps, packSubID, objectConsumer, and the menu
entry matcher logic to keep both sides aligned.

---

Outside diff comments:
In
`@runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java`:
- Around line 176-193: The Shift+click overlay origin submenu is currently being
added from `onPostMenuSort`, but it should be injected when the menu is first
built. Move the `overlayManager.addOriginMenu(...)` call into `onMenuOpened` in
`OverlayRenderer`, and keep the existing guards for `curHoveredOverlay`,
`client.isMenuOpen()`, and `client.isKeyPressed(KeyCode.KC_SHIFT)` so the
submenu is assembled with the rest of the menu entries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 8727e976-107a-4586-9fd8-8d5a3d7d13fc

📥 Commits

Reviewing files that changed from the base of the PR and between 16ec781 and e89a346.

⛔ Files ignored due to path filters (1)
  • runelite-client/src/main/resources/net/runelite/client/plugins/microbot/shortestpath/blocked_edges.tsv is excluded by !**/*.tsv
📒 Files selected for processing (36)
  • cache/src/main/java/net/runelite/cache/WorldMapManager.java
  • cache/src/main/java/net/runelite/cache/definitions/loaders/ItemLoader.java
  • cache/src/test/java/net/runelite/cache/WorldMapDumperTest.java
  • gradle.properties
  • runelite-api/src/main/interfaces/interfaces.toml
  • runelite-api/src/main/java/net/runelite/api/Client.java
  • runelite-api/src/main/java/net/runelite/api/EntityOps.java
  • runelite-api/src/main/java/net/runelite/api/ItemID.java
  • runelite-api/src/main/java/net/runelite/api/NpcID.java
  • runelite-api/src/main/java/net/runelite/api/NullItemID.java
  • runelite-api/src/main/java/net/runelite/api/NullNpcID.java
  • runelite-api/src/main/java/net/runelite/api/ObjectID.java
  • runelite-api/src/main/java/net/runelite/api/Perspective.java
  • runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/NpcID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.java
  • runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/VarClientID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java
  • runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java
  • runelite-client/src/main/java/net/runelite/client/game/npcoverlay/NpcOverlay.java
  • runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java
  • runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java
  • runelite-client/src/main/java/net/runelite/client/plugins/gpu/Zone.java
  • runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java
  • runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java
  • runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayManager.java
  • runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java
  • runelite-client/src/main/resources/item_variations.json
  • runelite-client/src/main/resources/net/runelite/client/plugins/roofremoval/overrides.jsonc
  • runelite-client/src/main/scripts/BankMainBuild.hash
  • runelite-client/src/main/scripts/BankMainBuild.rs2asm
  • runelite-client/src/main/scripts/PrivateMessage.hash
  • runelite-client/src/main/scripts/PrivateMessage.rs2asm
💤 Files with no reviewable changes (1)
  • runelite-api/src/main/java/net/runelite/api/NullNpcID.java

Comment on lines +582 to +600
EntityOps subops = ops.getSubOps(opIdx);
if (subops != null)
{
String subOp = ops.getSubOp(opIdx, subIdx);

if (subOp != null)
int numSubOps = subops.getNumOps();
for (int subIdx = 0; subIdx < numSubOps; subIdx++)
{
int subID = ops.getSubID(opIdx, subIdx);
subLeft.createMenuEntry(0)
.setOption(subOp)
.setType(MenuAction.RUNELITE)
.onClick(objectConsumer(composition, subOp, packSubID(opIdx, subID), false));
subShift.createMenuEntry(0)
.setOption(subOp)
.setType(MenuAction.RUNELITE)
.onClick(objectConsumer(composition, subOp, packSubID(opIdx, subID), true));
String subOp = subops.getOp(subIdx);

if (subOp != null)
{
subLeft.createMenuEntry(0)
.setOption(subOp)
.setType(MenuAction.RUNELITE)
.onClick(objectConsumer(composition, subOp, packSubID(opIdx, subIdx), false));
subShift.createMenuEntry(0)
.setOption(subOp)
.setType(MenuAction.RUNELITE)
.onClick(objectConsumer(composition, subOp, packSubID(opIdx, subIdx), true));
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify whether EntityOps sub-op indexes are guaranteed to match encoded menu-entry sub IDs.
rg -n -C4 'class .*EntityOps|implements EntityOps|getSubOps|getNumOps|getSubID|getSubOp|packSubID|>> 16' --glob '*.java'

Repository: chsami/Microbot

Length of output: 153


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate the relevant files and symbols.
git ls-files | rg 'MenuEntrySwapperPlugin\.java|EntityOps|packSubID|getSubOps|getSubID|menuentryswapper'

# Show outline for the plugin file if present.
plugin=$(git ls-files | rg 'MenuEntrySwapperPlugin\.java' | head -n1)
if [ -n "${plugin:-}" ]; then
  echo "=== OUTLINE: $plugin ==="
  ast-grep outline "$plugin" --view expanded || true
  echo "=== PACK/SUB SEARCH ==="
  rg -n 'packSubID|getSubOps|getSubID|menuEntry\.getIdentifier\(\) >> 16|>> 16' "$plugin"
fi

# Search repository for EntityOps definitions/usages.
echo "=== ENTITYOPS SEARCH ==="
rg -n 'EntityOps|getSubOps|getSubID|getNumOps|packSubID' --glob '*.java' .

Repository: chsami/Microbot

Length of output: 12094


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Search for the classes/methods that define submenu IDs and any matching logic.
fd -a 'EntityOps.java' . || true
fd -a 'MenuEntrySwapperPlugin.java' . || true
rg -n 'class EntityOps|interface EntityOps|record EntityOps|getSubOps|getSubID|getNumOps|packSubID|menuEntry\.getIdentifier\(\) >> 16' --glob '*.java' .

Repository: chsami/Microbot

Length of output: 1903


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the plugin code around the changed area and any identifier packing/matching logic.
plugin=$(git ls-files | rg 'MenuEntrySwapperPlugin\.java$' | head -n1)
echo "PLUGIN=$plugin"
if [ -z "$plugin" ]; then
  exit 0
fi

echo '--- file outline ---'
ast-grep outline "$plugin" --view expanded || true

echo '--- relevant lines ---'
rg -n -C 3 'packSubID|getSubOps|getSubID|menuEntry\.getIdentifier\(\) >> 16|subIdx|subID' "$plugin"

echo '--- EntityOps search ---'
rg -n -C 3 'class EntityOps|interface EntityOps|record EntityOps|getSubOps|getSubID|getNumOps|packSubID' --glob '*.java' .

Repository: chsami/Microbot

Length of output: 13600


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find the exact plugin file and inspect the changed block plus the matching logic.
plugin=$(git ls-files 'runelite-client/src/main/java/**/MenuEntrySwapperPlugin.java' | head -n1)
printf 'plugin=%s\n' "$plugin"

if [ -n "$plugin" ]; then
  nl -ba "$plugin" | sed -n '540,640p'
  echo '--- packSubID references ---'
  rg -n 'packSubID|menuEntry\.getIdentifier\(\) >> 16|getSubOps|getSubID|subIdx|subID' "$plugin"
fi

echo '--- repo search for EntityOps-like definitions ---'
rg -n 'EntityOps|getSubOps|getSubID|getNumOps|packSubID' runelite-client/src/main/java --glob '*.java'

Repository: chsami/Microbot

Length of output: 303


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- EntityOps implementations ---'
rg -n 'implements EntityOps|class .*EntityOps|record .*EntityOps' runelite-api runelite-client cache --glob '*.java'

echo '--- EntityOpsDefinition ---'
sed -n '1,220p' cache/src/main/java/net/runelite/cache/EntityOpsDefinition.java

echo '--- EntityOpsLoader ---'
sed -n '1,220p' cache/src/main/java/net/runelite/cache/definitions/loaders/EntityOpsLoader.java

Repository: chsami/Microbot

Length of output: 7253


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Narrowly inspect the data model for submenu IDs.
sed -n '1,220p' cache/src/main/java/net/runelite/cache/EntityOpsDefinition.java
printf '\n---\n'
sed -n '1,220p' cache/src/main/java/net/runelite/cache/definitions/loaders/EntityOpsLoader.java
printf '\n--- implementations ---\n'
rg -n 'implements EntityOps|class .*EntityOps|record .*EntityOps' runelite-api runelite-client cache --glob '*.java'

Repository: chsami/Microbot

Length of output: 7197


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect how submenu entries are stored and exposed.
sed -n '1,220p' cache/src/main/java/net/runelite/cache/EntityOpsDefinition.java
printf '\n---\n'
sed -n '1,220p' cache/src/main/java/net/runelite/cache/definitions/loaders/EntityOpsLoader.java
printf '\n---\n'
rg -n 'implements EntityOps|class .*EntityOps|record .*EntityOps|getSubOps|getNumOps|getOp|subID' runelite-api runelite-client cache --glob '*.java'

Repository: chsami/Microbot

Length of output: 44332


Use the encoded submenu ID here. subIdx is only the loop index, but the matcher still compares against menuEntry.getIdentifier() >> 16. Since EntityOps carries a separate subID, this should use that value, or the matcher should switch to the same source.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java`
around lines 582 - 600, The submenu action is using the loop index instead of
the encoded submenu identifier, which can break matching later in
MenuEntrySwapperPlugin. Update the submenu click wiring in the block that builds
entries from EntityOps so it passes the encoded sub-ID from the source data (or
make the matcher use the same source) rather than the local subIdx loop counter.
Use the existing symbols EntityOps, packSubID, objectConsumer, and the menu
entry matcher logic to keep both sides aligned.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant