Skip to content
Merged

2.0.41 #1607

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
018065b
slayer: fix Goblin and Kalphite task names
Felanbird Nov 7, 2025
5d05fbb
gpu: use scaled dimensions for targetDimensions uniform
zwyz Nov 7, 2025
9229b58
discord: use correct name for Emir's Arena
Nightfirecat Nov 8, 2025
e126c56
discord: update Tempoross region
Nightfirecat Nov 10, 2025
d11dd6c
fix(Rs2GameObject): make clickObject method public
chsami Nov 11, 2025
3ea8884
refactor(Script): remove deprecated hasLeveledUp variable
chsami Nov 11, 2025
a162241
refactor(Script): remove unused variables and deprecated methods
chsami Nov 11, 2025
7a56273
fix(Rs2GameObject): handle null case for impostor retrieval
chsami Nov 11, 2025
4fa3ec8
feat(tileobject): add API for interacting with tile objects
chsami Nov 11, 2025
a0777f7
feat(tileobject): add clickObject methods for tile interactions
chsami Nov 11, 2025
60622d8
refactor(tileobject): consolidate clickObject methods into a single c…
chsami Nov 11, 2025
a35fbff
fix(Rs2GameObject): handle null case for impostor retrieval
chsami Nov 11, 2025
b7fecfc
Merge pull request #1606 from chsami/GameObjects
chsami Nov 12, 2025
8fc04b0
fairyrings: fix search case sensitivity (#19541)
jamyc Nov 13, 2025
ed19ba3
worldmap: fix Auburnvale hunter location (#19532)
Meantub Nov 13, 2025
0689341
runecraft: properly display Colossal pouch fills (#19501)
gavin-lb Nov 13, 2025
b88eba6
gpu: use glMapBufferRange for vbos
Adam- Nov 12, 2025
ef50839
gpu: use GL_MAP_FLUSH_EXPLICIT_BIT for vbos
Adam- Nov 12, 2025
69ae030
gpu: remove geometry shader
Adam- Nov 13, 2025
ce01f64
gpu: use static unsorted draw mode for distant zones
Adam- Nov 13, 2025
3c040b5
Release 1.12.4
Nov 14, 2025
a373d97
Bump for 1.12.5-SNAPSHOT
Nov 14, 2025
cb33886
Merge branch 'runelite/master' into development
chsami Nov 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cache/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<parent>
<groupId>net.runelite</groupId>
<artifactId>runelite-parent</artifactId>
<version>1.12.3</version>
<version>1.12.4</version>
</parent>

<artifactId>cache</artifactId>
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

<groupId>net.runelite</groupId>
<artifactId>runelite-parent</artifactId>
<version>1.12.3</version>
<version>1.12.4</version>
<packaging>pom</packaging>

<name>RuneLite</name>
Expand Down
2 changes: 1 addition & 1 deletion runelite-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<parent>
<groupId>net.runelite</groupId>
<artifactId>runelite-parent</artifactId>
<version>1.12.3</version>
<version>1.12.4</version>
</parent>

<artifactId>runelite-api</artifactId>
Expand Down
4 changes: 2 additions & 2 deletions runelite-client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<parent>
<groupId>net.runelite</groupId>
<artifactId>runelite-parent</artifactId>
<version>1.12.3</version>
<version>1.12.4</version>
</parent>

<artifactId>client</artifactId>
Expand All @@ -41,7 +41,7 @@
<git.commit.id.abbrev>nogit</git.commit.id.abbrev>
<git.dirty>false</git.dirty>
<shade.skip>false</shade.skip>
<microbot.version>2.0.40</microbot.version>
<microbot.version>2.0.41</microbot.version>
<microbot.commit.sha>nogit</microbot.commit.sha>
</properties>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import java.util.Optional;
import java.util.concurrent.*;
import java.util.function.BooleanSupplier;
import java.util.function.Supplier;

@Singleton
@Slf4j
Expand Down Expand Up @@ -122,6 +123,40 @@ public void invoke(BooleanSupplier r)
invokeLater(r);
}

public <T> T invoke(Supplier<T> supplier) {
if (client.isClientThread()) {
return supplier.get();
}

CompletableFuture<T> f = new CompletableFuture<>();
invoke(() -> {
try {
f.complete(supplier.get());
} catch (Throwable t) {
f.completeExceptionally(t);
}
});

try {
return f.get(10, TimeUnit.SECONDS); // configurable timeout
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RuntimeException("Interrupted waiting for client thread", ie);
} catch (TimeoutException te) {
throw new RuntimeException("Timed out waiting for client thread", te);
} catch (ExecutionException ee) {
// unwrap original cause
Throwable cause = ee.getCause();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
}
if (cause instanceof Error) {
throw (Error) cause;
}
throw new RuntimeException(cause);
}
}

/**
* Will run r on the game thread after this method returns
* If r returns false, r will be ran again, at a later point
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,25 +36,25 @@ public class ConfigProfile
@Getter
private final long id;
@Getter
@Setter(AccessLevel.PACKAGE)
private String name;
@Setter
public String name;
@Getter
@Setter(AccessLevel.PACKAGE)
private String password;
@Setter
public String password;
@Getter
@Setter(AccessLevel.PACKAGE)
private String bankPin;
@Setter
public String bankPin;
Comment on lines +39 to +46
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 field visibility and redundant @Setter annotations.

Making these fields public while also adding @Setter is redundant—public fields can be modified directly without setters. More critically, exposing sensitive fields like password and bankPin as public breaks encapsulation and creates security concerns.

This is inconsistent with other fields in the class (e.g., discordWebhookUrl on line 58 remains private with @Setter, following proper encapsulation). If external modification is needed, use private fields with public setters (via @Setter), not public fields with @Setter.

Consider reverting these fields to private:

 	@Getter
 	@Setter
-    public String name;
+    private String name;
 	@Getter
 	@Setter
-	public String password;
+	private String password;
 	@Getter
 	@Setter
-    public String bankPin;
+    private String bankPin;

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In runelite-client/src/main/java/net/runelite/client/config/ConfigProfile.java
around lines 39-46, the fields are declared public while also annotated with
@Setter which is redundant and exposes sensitive data; change the visibility of
name, password and bankPin to private and keep the appropriate Lombok
annotations (e.g., @Getter and @Setter) on them instead of leaving them public,
and remove any duplicate or unnecessary @Setter annotations so sensitive fields
remain encapsulated and modifiers are consistent with other fields in the class.

@Getter
@Setter
private long memberExpireDaysTimeStemp;
@Getter
@Setter
private long memberExpireDays;
@Getter
@Setter(AccessLevel.PACKAGE)
private boolean isMember;
@Setter
public boolean isMember;
Comment on lines +54 to +55
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 field visibility and redundant @Setter annotation.

Same issue as above: making isMember public while adding @Setter is redundant and inconsistent with the encapsulation pattern used for other fields in this class.

Consider reverting to private:

 	@Getter
 	@Setter
-    public boolean isMember;
+    private boolean isMember;

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In runelite-client/src/main/java/net/runelite/client/config/ConfigProfile.java
around lines 54-55, the field isMember is declared public with a @Setter which
is redundant and breaks encapsulation; change the field to private (matching
other fields) and remove the field-level @Setter annotation so the class follows
the same visibility/encapsulation pattern and uses the class-level or
conventional accessors instead.

@Getter
@Setter(AccessLevel.PACKAGE)
@Setter
private String discordWebhookUrl;
@Getter
@Setter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ enum DiscordGameEventType
BOSS_SARACHNIS("Sarachnis", DiscordAreaType.BOSSES, 7322),
BOSS_SKOTIZO("Skotizo", DiscordAreaType.BOSSES, 9048),
BOSS_SMOKE_DEVIL("Thermonuclear smoke devil", DiscordAreaType.BOSSES, 9363, 9619),
BOSS_TEMPOROSS("Tempoross", DiscordAreaType.BOSSES, 12078),
BOSS_TEMPOROSS("Tempoross", DiscordAreaType.BOSSES, 12076),
BOSS_THE_LEVIATHAN("The Leviathan", DiscordAreaType.BOSSES, 8291),
BOSS_THE_ROYAL_TITANS("The Royal Titans", DiscordAreaType.BOSSES, 11669),
BOSS_THE_WHISPERER("The Whisperer", DiscordAreaType.BOSSES, 10595),
Expand Down Expand Up @@ -303,7 +303,7 @@ enum DiscordGameEventType
MG_BURTHORPE_GAMES_ROOM("Burthorpe Games Room", DiscordAreaType.MINIGAMES, 8781),
MG_CASTLE_WARS("Castle Wars", DiscordAreaType.MINIGAMES, 9520, 9620),
MG_CLAN_WARS("Clan Wars", DiscordAreaType.MINIGAMES, 12621, 12622, 12623, 13130, 13131, 13133, 13134, 13135, 13386, 13387, 13390, 13641, 13642, 13643, 13644, 13645, 13646, 13647, 13899, 13900, 14155, 14156),
MG_PVP_ARENA("PvP Arena", DiscordAreaType.MINIGAMES, 13362, 13363),
MG_EMIRS_ARENA("Emir's Arena", DiscordAreaType.MINIGAMES, 13362, 13363),
MG_FISHING_TRAWLER("Fishing Trawler", DiscordAreaType.MINIGAMES, 7499),
MG_FORTIS_COLOSSEUM("Fortis Colosseum", DiscordAreaType.MINIGAMES, 7216),
MG_FORTIS_COLOSSEUM_LOBBY("Fortis Colosseum Lobby", DiscordAreaType.MINIGAMES, 7316),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ else if ("fairyringFilterDbrow".equals(ev.getEventName()))
tags = ring.getTags();
}

var filter = client.getVarcStrValue(VarClientID.MESLAYERINPUT);
var filter = client.getVarcStrValue(VarClientID.MESLAYERINPUT).toLowerCase();

if (code.toLowerCase().contains(filter)
|| tags != null && tags.contains(filter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -396,10 +396,6 @@ private int pushFace(Model model, int face, IntBuffer opaqueBuffer, IntBuffer al
final byte overrideLum = model.getOverrideLuminance();

final short[] faceTextures = model.getFaceTextures();
final byte[] textureFaces = model.getTextureFaces();
final int[] texIndices1 = model.getTexIndices1();
final int[] texIndices2 = model.getTexIndices2();
final int[] texIndices3 = model.getTexIndices3();

final byte[] transparencies = model.getFaceTransparencies();
final byte[] bias = model.getFaceBias();
Expand Down Expand Up @@ -442,21 +438,16 @@ private int pushFace(Model model, int face, IntBuffer opaqueBuffer, IntBuffer al
float vy3 = modelLocalY[triangleC];
float vz3 = modelLocalZ[triangleC];

int texA, texB, texC;
SceneUploader.computeFaceUvs(model, face);

if (textureFaces != null && textureFaces[face] != -1)
{
int tface = textureFaces[face] & 0xff;
texA = texIndices1[tface];
texB = texIndices2[tface];
texC = texIndices3[tface];
}
else
{
texA = triangleA;
texB = triangleB;
texC = triangleC;
}
int su0 = (int) (SceneUploader.u0 * 256f);
int sv0 = (int) (SceneUploader.v0 * 256f);

int su1 = (int) (SceneUploader.u1 * 256f);
int sv1 = (int) (SceneUploader.v1 * 256f);

int su2 = (int) (SceneUploader.u2 * 256f);
int sv2 = (int) (SceneUploader.v2 * 256f);

int alphaBias = 0;
alphaBias |= transparencies != null ? (transparencies[face] & 0xff) << 24 : 0;
Expand All @@ -466,13 +457,13 @@ private int pushFace(Model model, int face, IntBuffer opaqueBuffer, IntBuffer al
var vb = alpha ? alphaBuffer : opaqueBuffer;

SceneUploader.putfff4(vb, vx1, vy1, vz1, alphaBias | color1);
SceneUploader.put2222(vb, texture, (int) modelLocalX[texA] - (int) vx1, (int) modelLocalY[texA] - (int) vy1, (int) modelLocalZ[texA] - (int) vz1);
SceneUploader.put2222(vb, texture, su0, sv0, 0);

SceneUploader.putfff4(vb, vx2, vy2, vz2, alphaBias | color2);
SceneUploader.put2222(vb, texture, (int) modelLocalX[texB] - (int) vx2, (int) modelLocalY[texB] - (int) vy2, (int) modelLocalZ[texB] - (int) vz2);
SceneUploader.put2222(vb, texture, su1, sv1, 0);

SceneUploader.putfff4(vb, vx3, vy3, vz3, alphaBias | color3);
SceneUploader.put2222(vb, texture, (int) modelLocalX[texC] - (int) vx3, (int) modelLocalY[texC] - (int) vy3, (int) modelLocalZ[texC] - (int) vz3);
SceneUploader.put2222(vb, texture, su2, sv2, 0);

return 3;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ public class GpuPlugin extends Plugin implements DrawCallbacks

static final Shader PROGRAM = new Shader()
.add(GL_VERTEX_SHADER, "vert.glsl")
.add(GL_GEOMETRY_SHADER, "geom.glsl")
.add(GL_FRAGMENT_SHADER, "frag.glsl");

static final Shader UI_PROGRAM = new Shader()
Expand Down Expand Up @@ -664,9 +663,18 @@ private void shutdownBuffers()
uniformBuffer = null;
Zone.freeBuffer();

vaoO.free();
vaoA.free();
vaoPO.free();
if (vaoO != null)
{
vaoO.free();
}
if (vaoA != null)
{
vaoA.free();
}
if (vaoPO != null)
{
vaoPO.free();
}
vaoO = vaoA = vaoPO = null;
}

Expand Down Expand Up @@ -1032,6 +1040,8 @@ public void drawZoneOpaque(Projection entityProjection, Scene scene, int zx, int
checkGLErrors();
}

private static final int ALPHA_ZSORT_CLOSE = 2048;

@Override
public void drawZoneAlpha(Projection entityProjection, Scene scene, int level, int zx, int zz)
{
Expand All @@ -1053,13 +1063,17 @@ public void drawZoneAlpha(Projection entityProjection, Scene scene, int level, i
}

int offset = scene.getWorldViewId() == -1 ? (SCENE_OFFSET >> 3) : 0;
int dx = cameraX - ((zx - offset) << 10);
int dz = cameraZ - ((zz - offset) << 10);
boolean close = dx * dx + dz * dz < ALPHA_ZSORT_CLOSE * ALPHA_ZSORT_CLOSE;

if (level == 0)
{
z.alphaSort(zx - offset, zz - offset, cameraX, cameraY, cameraZ);
z.multizoneLocs(scene, zx - offset, zz - offset, cameraX, cameraZ, ctx.zones);
}

z.renderAlpha(zx - offset, zz - offset, cameraYaw, cameraPitch, minLevel, this.level, maxLevel, level, hideRoofIds);
z.renderAlpha(zx - offset, zz - offset, cameraYaw, cameraPitch, minLevel, this.level, maxLevel, level, hideRoofIds, !close);

checkGLErrors();
}
Expand Down Expand Up @@ -1450,7 +1464,9 @@ private void drawUi(final int overlayColor, final int canvasHeight, final int ca
else
{
glDpiAwareViewport(0, 0, canvasWidth, canvasHeight);
glUniform2i(uniTexTargetDimensions, canvasWidth, canvasHeight);
final GraphicsConfiguration graphicsConfiguration = clientUI.getGraphicsConfiguration();
final AffineTransform t = graphicsConfiguration.getDefaultTransform();
glUniform2i(uniTexTargetDimensions, getScaledValue(t.getScaleX(), canvasWidth), getScaledValue(t.getScaleY(), canvasHeight));
}

// Set the sampling function used when stretching the UI.
Expand Down
Loading