Skip to content

Comments

2.0.60#1628

Merged
chsami merged 21 commits intomainfrom
development
Dec 20, 2025
Merged

2.0.60#1628
chsami merged 21 commits intomainfrom
development

Conversation

@chsami
Copy link
Owner

@chsami chsami commented Dec 18, 2025

No description provided.

chsami and others added 18 commits December 10, 2025 21:26
These projectiles have source level 1, despite being main-world projectiles, and would be hidden otherwise with roof removal on
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
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 18, 2025

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

This 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)
Check name Status Explanation Resolution
Title check ⚠️ Warning The title '2.0.60' references a version number but does not describe the actual changes in the pull request, which include API updates, new game constants, dependency upgrades, and bug fixes. Use a descriptive title that summarizes the main changes, such as 'Update to version 2.0.60 with API additions and dependency updates' or similar.
Description check ⚠️ Warning No pull request description was provided by the author, making it impossible to understand the intent or scope of the changes. Add a meaningful description explaining what was changed, why, and any relevant context or migration notes for reviewers.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.

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 and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

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: return should be continue

The for-each loop iterates over all actors in the set, but return statements 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

📥 Commits

Reviewing files that changed from the base of the PR and between 2ed7386 and b024396.

📒 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 in MicrobotPlugin.java, and prefer lines under 120 characters
Use UpperCamelCase for types, lowerCamelCase for 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.java
  • runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java
  • runelite-client/src/main/java/net/runelite/client/callback/Hooks.java
  • runelite-api/src/main/java/net/runelite/api/ObjectID.java
  • runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java
  • runelite-api/src/main/java/net/runelite/api/gameval/VarPlayerID.java
  • runelite-api/src/main/java/net/runelite/api/NullObjectID.java
  • runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java
  • runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java
  • runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java
  • runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.java
  • runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java
  • runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java
  • runelite-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.java
  • runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java
  • runelite-api/src/main/java/net/runelite/api/ObjectID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.java
  • runelite-api/src/main/java/net/runelite/api/gameval/DBTableID.java
  • runelite-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.java
  • runelite-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.java
  • runelite-api/src/main/java/net/runelite/api/gameval/ObjectID1.java
  • runelite-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.java
  • runelite-api/src/main/java/net/runelite/api/gameval/VarbitID.java
  • runelite-api/src/main/java/net/runelite/api/ObjectID.java
  • runelite-api/src/main/java/net/runelite/api/NullObjectID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/InterfaceID.java
  • runelite-api/src/main/java/net/runelite/api/gameval/SpriteID.java
  • runelite-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) and MenuNew (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_RESISTANCE is inserted at index 23, and all subsequent constants are properly shifted with sequential indices through 35.


15894-15929: LGTM!

The new PatchyData table 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.

Comment on lines +648 to 656
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);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

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.

Comment on lines +165 to +168
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;
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

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.

Suggested change
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.

RuneLite updater and others added 3 commits December 19, 2025 16:55
# Conflicts:
#	cache/pom.xml
#	pom.xml
#	runelite-api/pom.xml
#	runelite-client/pom.xml
#	runelite-jshell/pom.xml
#	runelite-maven-plugin/pom.xml
@chsami chsami merged commit 972db0e into main Dec 20, 2025
3 checks passed
@coderabbitai coderabbitai bot mentioned this pull request Feb 12, 2026
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.

5 participants