Skip to content

Conversation

@chsami
Copy link
Owner

@chsami chsami commented Jan 28, 2026

Bank Fixes + Update latest runelite

crispycritter99 and others added 24 commits January 19, 2026 00:48
lost widget [bank]group_storage_button 12.8
# Replaced reference to int BANK_ITEM_CONTAINER to a local int BANK_ITEM_CONTAINER with updated working value.
## Fixed Rs2Bank.isOpen() method. Now correctly identifies if bank is open properly again.
### May not fix all banking issues for other banking situations.
# Conflicts:
#	gradle.properties
Add arkan blade to SpecialAttackWeaponEnum
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 28, 2026

Walkthrough

This pull request updates the RuneLite API and client to version 1.12.14, introducing new game data constants for group ironman game modes, sailing facility items, and facility bottles. It reindexes bank interface field IDs in the interface definitions and refactors the bank plugin to use updated script argument counts and new event handlers for popup tab drawing. Multiple skill calculator actions are added for new resources (camphor, ironwood, rosewood logs and related items), and the world hopper plugin gains TCP retransmit loss tracking on Windows. Build and microbot versions are incremented accordingly.

Possibly related PRs

  • Support item mode in Rs2Bank method #1489: Modifies Rs2Bank withdraw-mode toggling to use interface ID constants instead of hard-coded widget IDs, aligning with similar Rs2Bank interface changes.
  • 2.0.34 #1585: Updates the same autogenerated API files (InterfaceID, VarbitID, DBTableID, SpriteID) with game data constant reindexing and additions.
  • 2.1.9 #1650: Adds new Task enum constants to the slayer plugin, parallel to the new IconID and skill calculator enum additions in this PR.
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.89% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Bank Fixes + Update latest runelite' is directly related to the main changes shown in the PR, which include bank interface updates, widget ID reindexing, and multiple RuneLite API updates.
Description check ✅ Passed The description 'Bank Fixes + Update latest runelite' is related to the changeset, describing the primary focus on bank-related fixes and API updates from the latest RuneLite release.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ast-grep (0.40.5)
runelite-api/src/main/java/net/runelite/api/ItemID.java
runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java
runelite-api/src/main/java/net/runelite/api/NullItemID.java
  • 6 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 and usage tips.

@chsami chsami merged commit ba01d8e into main Jan 28, 2026
2 of 3 checks passed
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: 3

🤖 Fix all issues with AI agents
In `@runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java`:
- Around line 86629-86637: The file adds SAILING_FACILITY_BOTTLE_EMPTY and
SAILING_FACILITY_BOTTLE_FULL but the Cert/Placeholder groups only define the
EMPTY variant, causing incomplete mappings; verify the canonical source for
cert/placeholder IDs for the FULL variant (and for the other occurrences
referenced at IDs 91219-91220 and 100672-100673) and either add the missing
SAILING_FACILITY_BOTTLE_FULL cert/placeholder constants with the correct IDs to
the corresponding Cert/Placeholder sections or, if no cert/placeholder exists,
remove or document the FULL top-level constant to keep tiered sets consistent
(search for SAILING_FACILITY_BOTTLE_EMPTY, SAILING_FACILITY_BOTTLE_FULL and the
Cert/Placeholder blocks to locate the spots to edit).

In
`@runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPingOverlay.java`:
- Around line 79-80: The text height calculation in WorldHopperPingOverlay uses
fm.getAscent() - fm.getDescent(), which underestimates the height; update the
calculation where FontMetrics fm is obtained (in WorldHopperPingOverlay, near
the render/paint code using fm) to use fm.getAscent() + fm.getDescent() so
textHeight reflects the full ascent+descent. Ensure any downstream layout that
uses textHeight continues to work with the corrected value.

In
`@runelite-client/src/main/java/net/runelite/client/util/ExecutorServiceExceptionLogger.java`:
- Around line 80-90: The one-shot schedule(Runnable, long, TimeUnit) and
schedule(Callable<V>, long, TimeUnit) overloads in
ExecutorServiceExceptionLogger currently delegate directly to
service.schedule(...) and therefore bypass the monitor(...) wrappers used by
scheduleAtFixedRate and scheduleWithFixedDelay; update the schedule(...)
implementations to pass the wrapped tasks (use monitor(command) for Runnable and
the Callable equivalent, e.g., monitor(callable) or a monitorCallable helper)
into service.schedule(...) so all scheduled tasks go through the same
exception-logging monitor in ExecutorServiceExceptionLogger.

Comment on lines +86629 to +86637
/**
* Facility bottle (empty)
*/
public static final int SAILING_FACILITY_BOTTLE_EMPTY = 33074;

/**
* Facility bottle (full)
*/
public static final int SAILING_FACILITY_BOTTLE_FULL = 33077;
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 | 🟡 Minor

Inconsistent variant coverage for facility bottle IDs
Top-level adds both EMPTY and FULL, but Cert/Placeholder only add EMPTY. If FULL has cert/placeholder IDs, they’re missing and callers can’t map them. Please confirm the source data and either add FULL entries under Cert/Placeholder (with the correct IDs) or document/remove the FULL variant to keep the tiered sets consistent.

Also applies to: 91219-91220, 100672-100673

🤖 Prompt for AI Agents
In `@runelite-api/src/main/java/net/runelite/api/gameval/ItemID.java` around lines
86629 - 86637, The file adds SAILING_FACILITY_BOTTLE_EMPTY and
SAILING_FACILITY_BOTTLE_FULL but the Cert/Placeholder groups only define the
EMPTY variant, causing incomplete mappings; verify the canonical source for
cert/placeholder IDs for the FULL variant (and for the other occurrences
referenced at IDs 91219-91220 and 100672-100673) and either add the missing
SAILING_FACILITY_BOTTLE_FULL cert/placeholder constants with the correct IDs to
the corresponding Cert/Placeholder sections or, if no cert/placeholder exists,
remove or document the FULL top-level constant to keep tiered sets consistent
(search for SAILING_FACILITY_BOTTLE_EMPTY, SAILING_FACILITY_BOTTLE_FULL and the
Cert/Placeholder blocks to locate the spots to edit).

Comment on lines +79 to +80
final FontMetrics fm = graphics.getFontMetrics();
final int textHeight = fm.getAscent() - fm.getDescent();
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 | 🟡 Minor

Inconsistent text height calculation.

The formula fm.getAscent() - fm.getDescent() produces a value smaller than the actual text height. Standard text height should be fm.getAscent() + fm.getDescent() (both are positive values representing distance from the baseline).

Proposed fix
 		final FontMetrics fm = graphics.getFontMetrics();
-		final int textHeight = fm.getAscent() - fm.getDescent();
+		final int textHeight = fm.getAscent() + fm.getDescent();
📝 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
final FontMetrics fm = graphics.getFontMetrics();
final int textHeight = fm.getAscent() - fm.getDescent();
final FontMetrics fm = graphics.getFontMetrics();
final int textHeight = fm.getAscent() + fm.getDescent();
🤖 Prompt for AI Agents
In
`@runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPingOverlay.java`
around lines 79 - 80, The text height calculation in WorldHopperPingOverlay uses
fm.getAscent() - fm.getDescent(), which underestimates the height; update the
calculation where FontMetrics fm is obtained (in WorldHopperPingOverlay, near
the render/paint code using fm) to use fm.getAscent() + fm.getDescent() so
textHeight reflects the full ascent+descent. Ensure any downstream layout that
uses textHeight continues to work with the corrected value.

Comment on lines +80 to +90
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
{
return service.scheduleAtFixedRate(monitor(command), initialDelay, period, unit);
}

@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
{
return service.scheduleWithFixedDelay(monitor(command), initialDelay, delay, unit);
}
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 wrapping: schedule() methods are not monitored.

The new scheduleAtFixedRate and scheduleWithFixedDelay methods correctly wrap commands with monitor(), but the schedule(Runnable, ...) and schedule(Callable, ...) methods at lines 149-158 still delegate directly without wrapping. This defeats exception logging for one-shot scheduled tasks.

🔧 Proposed fix to wrap schedule methods consistently
 	`@Override`
 	public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
 	{
-		return service.schedule(command, delay, unit);
+		return service.schedule(monitor(command), delay, unit);
 	}

 	`@Override`
 	public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
 	{
-		return service.schedule(callable, delay, unit);
+		return service.schedule(monitor(callable), delay, unit);
 	}

Also applies to: 148-158

🤖 Prompt for AI Agents
In
`@runelite-client/src/main/java/net/runelite/client/util/ExecutorServiceExceptionLogger.java`
around lines 80 - 90, The one-shot schedule(Runnable, long, TimeUnit) and
schedule(Callable<V>, long, TimeUnit) overloads in
ExecutorServiceExceptionLogger currently delegate directly to
service.schedule(...) and therefore bypass the monitor(...) wrappers used by
scheduleAtFixedRate and scheduleWithFixedDelay; update the schedule(...)
implementations to pass the wrapped tasks (use monitor(command) for Runnable and
the Callable equivalent, e.g., monitor(callable) or a monitorCallable helper)
into service.schedule(...) so all scheduled tasks go through the same
exception-logging monitor in ExecutorServiceExceptionLogger.

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.

10 participants