Conversation
These projectiles have source level 1, despite being main-world projectiles, and would be hidden otherwise with roof removal on
This reverts commit e7ae65b.
These projectiles have source level 1, despite being main-world projectiles, and would be hidden otherwise with roof removal on
This happens rarely if the map load is slow and also there are back to back map build packets. Reproduce via sleep(2000) in loadScene() and use Book of the dead to teleport to Hosidius and run to the ladder south.
# Conflicts: # runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThis PR extends the RuneLite API with new game-world constants across multiple ID classes, including item, object, interface, sprite, and varbit identifiers. It reindexes existing SailingBoatFacilityStats constants to insert a new crystal helm resistance property and introduces a new PatchyData database table. The PR also updates item variation mappings, refines GPU rendering logic with improved plane capping and buffer handling, enhances tile iteration in dev tools overlays, and expands world view-based rendering support. Dependencies are updated, including microbot version bump and Linux ARM64 LWJGL native support. Possibly related PRs
Pre-merge checks and finishing touches❌ Failed checks (3 warnings)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
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/plugins/devtools/SceneOverlay.java (1)
406-426: Inconsistent loop control:returnshould becontinueThe for-each loop iterates over all actors in the set, but
returnstatements will exit the entire method on the first null check failure. This means if the first actor has no interaction target (or fails canvas projection), all subsequent actors are skipped.🔎 Apply this diff to fix the loop control flow:
Actor ta = fa.getInteracting(); if (ta == null) { - return; + continue; } LocalPoint fl = fa.getLocalLocation(); Point fs = Perspective.localToCanvas(client, fl, client.getPlane(), fa.getLogicalHeight() / 2); if (fs == null) { - return; + continue; } int fsx = fs.getX(); int fsy = fs.getY() - INTERACTING_SHIFT; LocalPoint tl = ta.getLocalLocation(); Point ts = Perspective.localToCanvas(client, tl, client.getPlane(), ta.getLogicalHeight() / 2); if (ts == null) { - return; + continue; }
📜 Review details
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (17)
runelite-api/src/main/java/net/runelite/api/ItemID.java(3 hunks)runelite-api/src/main/java/net/runelite/api/NullObjectID.java(1 hunks)runelite-api/src/main/java/net/runelite/api/ObjectID.java(1 hunks)runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java(2 hunks)runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java(3 hunks)runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java(3 hunks)runelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.java(1 hunks)runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java(1 hunks)runelite-api/src/main/java/net/runelite/api/gameval/VarPlayerID.java(1 hunks)runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java(2 hunks)runelite-client/pom.xml(4 hunks)runelite-client/src/main/java/net/runelite/client/callback/Hooks.java(2 hunks)runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java(2 hunks)runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java(3 hunks)runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java(4 hunks)runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java(1 hunks)runelite-client/src/main/resources/item_variations.json(22 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.java
📄 CodeRabbit inference engine (AGENTS.md)
**/*.java: Keep indentation with tabs, follow the brace placement already inMicrobotPlugin.java, and prefer lines under 120 characters
UseUpperCamelCasefor types,lowerCamelCasefor members, and prefix configuration interfaces with the plugin name (e.g.,ExampleConfig)
Rely on Lombok for boilerplate where already adopted
Files:
runelite-api/src/main/java/net/runelite/api/ItemID.javarunelite-api/src/main/java/net/runelite/api/gameval/VarbitID.javarunelite-client/src/main/java/net/runelite/client/callback/Hooks.javarunelite-api/src/main/java/net/runelite/api/ObjectID.javarunelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.javarunelite-api/src/main/java/net/runelite/api/gameval/VarPlayerID.javarunelite-api/src/main/java/net/runelite/api/NullObjectID.javarunelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.javarunelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.javarunelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.javarunelite-api/src/main/java/net/runelite/api/gameval/SpriteID.javarunelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.javarunelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.javarunelite-api/src/main/java/net/runelite/api/gameval/DBTableID.javarunelite-api/src/main/java/net/runelite/api/gameval/ItemID.java
🧠 Learnings (13)
📓 Common learnings
Learnt from: Voxsylvae
Repo: chsami/Microbot PR: 1415
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/MicroAgilityPrePostScheduleRequirements.java:7-7
Timestamp: 2025-08-25T06:45:09.673Z
Learning: Always use game ID classes from net.runelite.api.gameval package (like ItemID, ObjectID, NpcID) instead of the deprecated classes in net.runelite.api package. The gameval package contains the new, preferred classes while the old ones in the direct api package are deprecated.
Learnt from: runsonmypc
Repo: chsami/Microbot PR: 1417
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/AgilityScript.java:13-13
Timestamp: 2025-08-25T15:51:39.272Z
Learning: Both net.runelite.api.ItemID and net.runelite.api.gameval.ItemID are valid import paths in the RuneLite codebase. The microbot plugins consistently use net.runelite.api.ItemID as their established pattern.
Learnt from: Voxsylvae
Repo: chsami/Microbot PR: 1415
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/MicroAgilityPrePostScheduleRequirements.java:218-226
Timestamp: 2025-08-25T06:50:43.493Z
Learning: In MicroAgilityPrePostScheduleRequirements.java, the deprecated ItemID constants NATURERUNE and FIRERUNE should be replaced with NATURE_RUNE and FIRE_RUNE respectively when using the gameval package ItemID class.
Learnt from: runsonmypc
Repo: chsami/Microbot PR: 1417
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/AgilityScript.java:284-291
Timestamp: 2025-08-25T15:51:52.157Z
Learning: In RuneLite's ItemID class, both PIEDISH and PIE_DISH constants exist and are valid, both referring to item ID 2313. The gameval package uses PIEDISH while the regular api package uses PIE_DISH, so either naming convention can be used.
📚 Learning: 2025-08-25T06:50:43.493Z
Learnt from: Voxsylvae
Repo: chsami/Microbot PR: 1415
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/MicroAgilityPrePostScheduleRequirements.java:218-226
Timestamp: 2025-08-25T06:50:43.493Z
Learning: In MicroAgilityPrePostScheduleRequirements.java, the deprecated ItemID constants NATURERUNE and FIRERUNE should be replaced with NATURE_RUNE and FIRE_RUNE respectively when using the gameval package ItemID class.
Applied to files:
runelite-api/src/main/java/net/runelite/api/ItemID.javarunelite-api/src/main/java/net/runelite/api/gameval/VarbitID.javarunelite-api/src/main/java/net/runelite/api/ObjectID.javarunelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.javarunelite-api/src/main/java/net/runelite/api/gameval/SpriteID.javarunelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.javarunelite-api/src/main/java/net/runelite/api/gameval/DBTableID.javarunelite-api/src/main/java/net/runelite/api/gameval/ItemID.java
📚 Learning: 2025-08-25T15:51:39.272Z
Learnt from: runsonmypc
Repo: chsami/Microbot PR: 1417
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/AgilityScript.java:13-13
Timestamp: 2025-08-25T15:51:39.272Z
Learning: Both net.runelite.api.ItemID and net.runelite.api.gameval.ItemID are valid import paths in the RuneLite codebase. The microbot plugins consistently use net.runelite.api.ItemID as their established pattern.
Applied to files:
runelite-api/src/main/java/net/runelite/api/ItemID.javarunelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.java
📚 Learning: 2025-08-25T15:51:52.157Z
Learnt from: runsonmypc
Repo: chsami/Microbot PR: 1417
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/AgilityScript.java:284-291
Timestamp: 2025-08-25T15:51:52.157Z
Learning: In RuneLite's ItemID class, both PIEDISH and PIE_DISH constants exist and are valid, both referring to item ID 2313. The gameval package uses PIEDISH while the regular api package uses PIE_DISH, so either naming convention can be used.
Applied to files:
runelite-api/src/main/java/net/runelite/api/ItemID.javarunelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.javarunelite-api/src/main/java/net/runelite/api/gameval/ItemID.java
📚 Learning: 2025-08-25T06:45:09.673Z
Learnt from: Voxsylvae
Repo: chsami/Microbot PR: 1415
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/agility/MicroAgilityPrePostScheduleRequirements.java:7-7
Timestamp: 2025-08-25T06:45:09.673Z
Learning: Always use game ID classes from net.runelite.api.gameval package (like ItemID, ObjectID, NpcID) instead of the deprecated classes in net.runelite.api package. The gameval package contains the new, preferred classes while the old ones in the direct api package are deprecated.
Applied to files:
runelite-api/src/main/java/net/runelite/api/ItemID.javarunelite-api/src/main/java/net/runelite/api/gameval/VarbitID.javarunelite-api/src/main/java/net/runelite/api/ObjectID.javarunelite-api/src/main/java/net/runelite/api/NullObjectID.javarunelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.javarunelite-api/src/main/java/net/runelite/api/gameval/SpriteID.javarunelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.java
📚 Learning: 2025-11-24T19:05:32.967Z
Learnt from: CR
Repo: chsami/Microbot PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:05:32.967Z
Learning: Applies to runelite-client/src/main/java/net/runelite/client/plugins/microbot/*Plugin.java : When adding panel controls or overlays, update the Microbot navigation panel setup in `MicrobotPlugin` and provide default config values
Applied to files:
runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java
📚 Learning: 2025-11-24T19:05:32.967Z
Learnt from: CR
Repo: chsami/Microbot PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:05:32.967Z
Learning: `mvn -pl runelite-client -am package` builds the client and produces `target/microbot-<version>.jar`
Applied to files:
runelite-client/pom.xml
📚 Learning: 2025-11-24T19:05:32.967Z
Learnt from: CR
Repo: chsami/Microbot PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:05:32.967Z
Learning: `java -jar runelite-client/target/microbot-<version>.jar` launches a locally built client for manual validation
Applied to files:
runelite-client/pom.xml
📚 Learning: 2025-11-24T19:05:32.967Z
Learnt from: CR
Repo: chsami/Microbot PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:05:32.967Z
Learning: Applies to runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/**/*.java : Shared helpers sit under `.../microbot/util`
Applied to files:
runelite-client/pom.xml
📚 Learning: 2025-11-24T19:05:32.967Z
Learnt from: CR
Repo: chsami/Microbot PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:05:32.967Z
Learning: Applies to pom.xml : The root `pom.xml` controls the multi-module Maven build for `cache`, `runelite-api`, `runelite-client`, `runelite-jshell`, and `runelite-maven-plugin`
Applied to files:
runelite-client/pom.xml
📚 Learning: 2025-11-24T19:05:32.967Z
Learnt from: CR
Repo: chsami/Microbot PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:05:32.967Z
Learning: Applies to runelite-client/src/main/java/net/runelite/client/plugins/microbot/**/*.java : Gameplay automation lives in `runelite-client/src/main/java/net/runelite/client/plugins/microbot`; keep new scripts and utilities inside this plugin
Applied to files:
runelite-client/pom.xml
📚 Learning: 2025-11-24T19:05:32.967Z
Learnt from: CR
Repo: chsami/Microbot PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:05:32.967Z
Learning: Applies to runelite-client/src/main/java/net/runelite/client/plugins/microbot/example/**/*.java : Runnable examples live in `.../microbot/example`
Applied to files:
runelite-client/pom.xml
📚 Learning: 2025-08-31T19:19:07.691Z
Learnt from: chsami
Repo: chsami/Microbot PR: 1455
File: runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotVersionChecker.java:112-132
Timestamp: 2025-08-31T19:19:07.691Z
Learning: The Microbot project uses only numeric versioning (e.g., "1.2.3") without any alphanumeric suffixes like "-beta" or "-alpha", so simple integer parsing of version segments is safe.
Applied to files:
runelite-client/pom.xml
🧬 Code graph analysis (1)
runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java (2)
runelite-api/src/main/java/net/runelite/api/Constants.java (1)
Constants(33-154)runelite-api/src/main/java/net/runelite/api/Perspective.java (1)
Perspective(63-1177)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Build
🔇 Additional comments (17)
runelite-client/src/main/java/net/runelite/client/callback/Hooks.java (1)
54-55: LGTM!The new imports are correctly added to support the LocalPoint-based coordinate derivation in error handling.
runelite-client/pom.xml (3)
44-44: LGTM!Version bump to 2.0.60 is consistent with the PR title.
193-198: LGTM!Linux ARM64 natives for LWJGL core and OpenGL are added consistently, following the established pattern for other platforms.
Also applies to: 241-246
179-179: Verify the rlawt dependency version availability.The rlawt package had its last release on Jul 3, 2022. Confirm that version 1.7 is available on Maven Central or the RuneLite repository before merging, as direct version confirmation could not be established.
runelite-api/src/main/java/net/runelite/api/NullObjectID.java (1)
31301-31302: Both NullObjectID.java and ObjectID1.java are auto-generated files (as indicated by the header comment "This file is automatically generated. Do not edit."). Issues in auto-generated code cannot be addressed through code review and should be resolved at the source of generation, not in the generated files themselves.runelite-api/src/main/java/net/runelite/api/ItemID.java (1)
5618-5621: LGTM!All constant declarations are logically consistent. The BANDANA_EYEPATCH variants follow sequential IDs, the SMALL_KEY rename corrects a typo, and the CRATE_OF_* constants maintain consistent naming and value mapping patterns appropriate for auto-generated code.
Also applies to: 15553-15553, 16029-16094
runelite-client/src/main/resources/item_variations.json (1)
13149-13641: LGTM! Clean expansion of item variation mappings.The additions of new item IDs across the various crate categories and the introduction of two new crate types ("crate of bait" and "crate of alpaca wool") are properly formatted and structurally sound. The JSON syntax is correct with proper comma placement, bracket closure, and no trailing commas. The new IDs appear unique within their respective arrays, and the changes align well with the systematic expansion of item variations described in the PR summary.
runelite-api/src/main/java/net/runelite/api/ObjectID.java (1)
29315-29315: LGTM!The new constant is correctly placed in numeric order and the value aligns with the corresponding definition in the gameval package.
runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java (3)
952-953: LGTM!New top-level interface IDs follow the sequential numbering pattern established in this file.
1433-1502: LGTM!The new Bank interface constants maintain sequential hex values and consistent naming patterns. The ordering reflects the underlying game data structure.
30730-30758: LGTM!The new
Patchy(0x03b2 = 946) andMenuNew(0x03b3 = 947) nested classes correctly correspond to their top-level interface ID constants. Internal child IDs follow the expected sequential pattern.runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java (1)
13846-13846: LGTM!New varbit constants are properly defined with sequential IDs and consistent naming patterns. Since this is an auto-generated file, the additions integrate cleanly with the existing structure.
Also applies to: 13875-13879
runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java (2)
12874-12934: LGTM!The reindexing of boat facility stat columns is logically consistent. The new
COL_BOAT_CRYSTALHELM_RESISTANCEis inserted at index 23, and all subsequent constants are properly shifted with sequential indices through 35.
15894-15929: LGTM!The new
PatchyDatatable structure is internally consistent with proper column indexing (0, 1, 2) and follows the established pattern for data table definitions in this auto-generated file.runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java (3)
29610-29628: LGTM!Documentation enhancements clarify the color variants for the pirate bandana eyepatch items. No logic issues detected.
83700-83703: LGTM!Typo correction improves documentation accuracy. No logic issues detected.
86094-86423: LGTM!The new cargo crate constants follow a consistent naming pattern and are properly documented. All IDs are sequential and non-overlapping. No logic issues detected.
| Player player = client.getLocalPlayer(); | ||
| if (player != null) | ||
| { | ||
| Player player = client.getLocalPlayer(); | ||
| if (player != null) | ||
| LocalPoint lp = player.getLocalLocation(); | ||
| if (lp.getWorldView() == WorldView.TOPLEVEL || client.getClientThread() == Thread.currentThread()) | ||
| { | ||
| WorldPoint p = WorldPoint.fromLocalInstance(client, player.getLocalLocation()); | ||
| WorldPoint p = WorldPoint.fromLocalInstance(client, lp); | ||
| coord = String.format("%d_%d_%d_%d_%d", p.getPlane(), p.getX() / 64, p.getY() / 64, p.getX() & 63, p.getY() & 63); | ||
| } |
There was a problem hiding this comment.
Add null check for LocalPoint to prevent NPE in error handler.
The code checks if player is null but doesn't verify lp before calling lp.getWorldView() on line 652. If getLocalLocation() returns null, the error handler itself will crash with a NullPointerException. Error handling code must be especially robust.
🔎 Apply this diff to add the missing null check:
Player player = client.getLocalPlayer();
if (player != null)
{
LocalPoint lp = player.getLocalLocation();
- if (lp.getWorldView() == WorldView.TOPLEVEL || client.getClientThread() == Thread.currentThread())
+ if (lp != null && (lp.getWorldView() == WorldView.TOPLEVEL || client.getClientThread() == Thread.currentThread()))
{
WorldPoint p = WorldPoint.fromLocalInstance(client, lp);
coord = String.format("%d_%d_%d_%d_%d", p.getPlane(), p.getX() / 64, p.getY() / 64, p.getX() & 63, p.getY() & 63);
}
}🤖 Prompt for AI Agents
In runelite-client/src/main/java/net/runelite/client/callback/Hooks.java around
lines 648 to 656, the code checks player != null but calls lp.getWorldView()
without verifying lp; add a null check for LocalPoint (lp) before accessing its
methods so the error handler cannot NPE. Change the conditional to ensure lp !=
null (e.g., if (lp != null && (lp.getWorldView() == WorldView.TOPLEVEL ||
client.getClientThread() == Thread.currentThread()))), so
WorldPoint.fromLocalInstance is only called when lp is non-null.
| boolean isbridge = (settings[1][x][y] & Constants.TILE_FLAG_BRIDGE) != 0; | ||
| int flag = settings[z][x][y]; | ||
| boolean isvisbelow = (flag & Constants.TILE_FLAG_VIS_BELOW) != 0; | ||
| boolean hasroof = (flag & Constants.TILE_FLAG_UNDER_ROOF) != 0; |
There was a problem hiding this comment.
Inconsistent plane usage for bridge flag check.
The bridge flag is checked on hardcoded plane 1 (settings[1][x][y]), while visibility and roof flags are checked on the current plane z (settings[z][x][y]). When rendering flags for plane 2 or 3, this shows bridge information from plane 1, which is inconsistent with the other flags being displayed.
Consider checking all flags on the current plane for consistency:
-boolean isbridge = (settings[1][x][y] & Constants.TILE_FLAG_BRIDGE) != 0;
-int flag = settings[z][x][y];
+int flag = settings[z][x][y];
+boolean isbridge = (flag & Constants.TILE_FLAG_BRIDGE) != 0;📝 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.
| boolean isbridge = (settings[1][x][y] & Constants.TILE_FLAG_BRIDGE) != 0; | |
| int flag = settings[z][x][y]; | |
| boolean isvisbelow = (flag & Constants.TILE_FLAG_VIS_BELOW) != 0; | |
| boolean hasroof = (flag & Constants.TILE_FLAG_UNDER_ROOF) != 0; | |
| int flag = settings[z][x][y]; | |
| boolean isbridge = (flag & Constants.TILE_FLAG_BRIDGE) != 0; | |
| boolean isvisbelow = (flag & Constants.TILE_FLAG_VIS_BELOW) != 0; | |
| boolean hasroof = (flag & Constants.TILE_FLAG_UNDER_ROOF) != 0; |
🤖 Prompt for AI Agents
In
runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java
around lines 165 to 168, the bridge flag is being read from a hardcoded plane
(settings[1][x][y]) while the other flags use the current plane z; change the
bridge check to use the same current plane (settings[z][x][y]) so all flag
checks are consistent for the rendered plane, and ensure z is within bounds
before indexing if not already validated.
[ci skip]
# Conflicts: # cache/pom.xml # pom.xml # runelite-api/pom.xml # runelite-client/pom.xml # runelite-jshell/pom.xml # runelite-maven-plugin/pom.xml
No description provided.