Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
36adaaf
mes: migrate bankmain items swaps
Adam- Jan 28, 2026
75649a1
Add CJQ/Great Conch entry to fairy rings
crispycritter99 Jan 28, 2026
cdd0057
banktags: fix opening potion storage when a tag tab is open
Adam- Jan 28, 2026
2591ac6
world hopper: reset current world ping on hop
Adam- Jan 29, 2026
8ab69df
fix(walker): handle dialogue for inventory teleport items
Chillibloke Jan 28, 2026
454baeb
fix(bank): check for crafting cape in inventory for guild access
Chillibloke Jan 29, 2026
7c52372
item stats: decrease blighted overload hp drain
Macweese Jan 19, 2026
e12574e
Merge pull request #1668 from crispycritter99/patch-15
chsami Jan 31, 2026
8f6d4cf
feat: add new bank locations with sailing requirements
irkedMATT Jan 31, 2026
bcb1794
minimap: save and restore zoom level on restart
Adam- Jan 31, 2026
d896124
item stats: update blighted overload hp drain
Nightfirecat Feb 1, 2026
75b1f16
feat(walker): add Magic Mushtree transport and fix POH digsite pendant
Chillibloke Feb 1, 2026
e904697
Fix sailing level requirement for DEEPFIN_MINE_EAST
irkedMATT Feb 1, 2026
d3508a0
Merge pull request #1670 from irkedMATT/feature/New_Bank_Locations
chsami Feb 1, 2026
8e574d6
world hopper: use tcp rtt for current world ping if icmp is blocked
Adam- Feb 1, 2026
e61962d
world hopper: use tcp ping for slow world ping if icmp is blocked
Adam- Feb 1, 2026
3be5428
api: update 236
Adam- Jan 24, 2026
db791db
gpu: remove face priority sorting from alpha models
Adam- Jan 24, 2026
016c03c
cache: update 236
Adam- Feb 1, 2026
93d0b92
client: do not reference Applet
abextm Sep 15, 2025
8fcf932
Release 1.12.15
Feb 2, 2026
a973684
Bump for 1.12.16-SNAPSHOT
Feb 2, 2026
ea4f6d5
api: fix localToCanvas() on boats
Adam- Feb 2, 2026
61c1a7c
feat(api): add ClientConfiguration interface and update related classes
chsami Feb 3, 2026
f24ac9e
Merge pull request #1672 from Chillibloke/feat/mushtree-and-digsite-t…
chsami Feb 3, 2026
f2e5386
Merge remote-tracking branch 'origin/development' into development
chsami Feb 3, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public class NpcDefinition
public int crawlRotate180Animation = -1;
public int crawlRotateLeftAnimation = -1;
public int crawlRotateRightAnimation = -1;
public boolean idleAnimRestart;
public short[] recolorToFind;
public short[] recolorToReplace;
public short[] retextureToFind;
Expand Down Expand Up @@ -81,4 +82,5 @@ public class NpcDefinition
public boolean canHideForOverlap;
public int overlapTintHSL = 39188;
public boolean unknown1 = false;
public boolean zbuf = true;
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public class ObjectDefinition
private boolean obstructsGround = false;
private int contouredGround = -1;
private int supportsItems = -1;
private int raise;
private int[] configChangeDest;
private int category;
private boolean isRotated = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,10 @@ else if (opcode == 129)
{
def.unknown1 = true;
}
else if (opcode == 130)
{
def.idleAnimRestart = true;
}
else if (opcode == 145)
{
def.canHideForOverlap = true;
Expand All @@ -391,6 +395,10 @@ else if (opcode == 146)
{
def.overlapTintHSL = stream.readUnsignedShort();
}
else if (opcode == 147)
{
def.zbuf = false;
}
else if (opcode == 249)
{
length = stream.readUnsignedByte();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,10 @@ else if (opcode == 95)
{
def.setSoundVisibility(is.readUnsignedByte());
}
else if (opcode == 96)
{
def.setRaise(is.readUnsignedByte());
}
else if (opcode == 249)
{
int length = is.readUnsignedByte();
Expand Down
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ org.gradle.parallel=true
org.gradle.caching=false

project.build.group=net.runelite
project.build.version=1.12.14
project.build.version=1.12.15

glslang.path=
microbot.version=2.1.16
microbot.version=2.1.17
microbot.commit.sha=nogit
microbot.repo.url=http://138.201.81.246:8081/repository/microbot-snapshot/
microbot.repo.username=
Expand Down
3 changes: 1 addition & 2 deletions runelite-api/src/main/java/net/runelite/api/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,7 @@ public interface Client extends OAuthApi, GameEngine
void setGameState(GameState gameState);

/**
* Causes the client to shutdown. It is faster than
* {@link java.applet.Applet#stop()} because it doesn't wait for 4000ms.
* Causes the client to shutdown.
* This will call {@link System#exit} when it is done
*/
void stopNow();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2025 Abex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.api;

import java.net.URL;

public interface ClientConfiguration
{
URL getCodeBase();
String getParameter(String key);
void onError(String code);
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ public interface DecorativeObject extends TileObject
*/
int getYOffset();

int getXOffset2();

int getYOffset2();

/**
* A bitfield containing various flags:
* <pre>{@code
Expand Down
3 changes: 3 additions & 0 deletions runelite-api/src/main/java/net/runelite/api/GameEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
*/
public interface GameEngine
{
void setConfiguration(ClientConfiguration configuration);
void initialize();

/**
* Gets the canvas that contains everything.
*
Expand Down
43 changes: 10 additions & 33 deletions runelite-api/src/main/java/net/runelite/api/Perspective.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ public static Point localToCanvas(@Nonnull Client client, @Nonnull LocalPoint po
}

LocalPoint entityLocation = we.getLocalLocation();
int height = getTileHeight(we.getWorldView(), point.getX(), point.getY(), plane); // height in wv
height += getTileHeight(wv, entityLocation.getX(), entityLocation.getY(), wv.getPlane()); // height of we
int height = we.getWorldView().getTileHeight(point.getX(), point.getY(), plane); // height in wv
height += wv.getTileHeight(entityLocation.getX(), entityLocation.getY(), wv.getPlane()); // height of we
height -= heightOffset;

WorldView subWv = we.getWorldView();
Expand Down Expand Up @@ -671,30 +671,6 @@ public static int getFootprintTileHeight(@Nonnull Client client, @Nonnull LocalP
return h;
}

/**
* Get the height of a location, in local coordinates. Interpolates the height from the adjacent tiles.
* Does not account for bridges.
* @return
*/
private static int getTileHeight(@Nonnull WorldView wv, int localX, int localY, int plane)
{
int offset = wv.isTopLevel() ? ESCENE_OFFSET : 0;
int sceneX = (localX >> LOCAL_COORD_BITS) + offset;
int sceneY = (localY >> LOCAL_COORD_BITS) + offset;
if (sceneX >= 0 && sceneY >= 0 && sceneX < wv.getSizeX() + offset && sceneY < wv.getSizeY() + offset)
{
int[][][] tileHeights = wv.getScene().getTileHeights();

int x = localX & (LOCAL_TILE_SIZE - 1);
int y = localY & (LOCAL_TILE_SIZE - 1);
int var8 = x * tileHeights[plane][sceneX + 1][sceneY] + (LOCAL_TILE_SIZE - x) * tileHeights[plane][sceneX][sceneY] >> LOCAL_COORD_BITS;
int var9 = tileHeights[plane][sceneX][sceneY + 1] * (LOCAL_TILE_SIZE - x) + x * tileHeights[plane][sceneX + 1][sceneY + 1] >> LOCAL_COORD_BITS;
return (LOCAL_TILE_SIZE - y) * var8 + y * var9 >> LOCAL_COORD_BITS;
}

return 0;
}

/**
* Calculates a tile polygon from offset worldToScreen() points.
*
Expand Down Expand Up @@ -761,10 +737,11 @@ public static Polygon getCanvasTileAreaPoly(
}

int offset = wv.isTopLevel() ? ESCENE_OFFSET : 0;
int escene = offset << 1;
final int msx = localLocation.getSceneX() + offset;
final int msy = localLocation.getSceneY() + offset;

if (msx < 0 || msy < 0 || msx >= wv.getSizeX() + offset || msy >= wv.getSizeY() + offset)
if (msx < 0 || msy < 0 || msx >= wv.getSizeX() + escene || msy >= wv.getSizeY() + escene)
{
// out of scene
return null;
Expand All @@ -778,10 +755,10 @@ public static Polygon getCanvasTileAreaPoly(
var scene = wv.getScene();
final byte[][][] tileSettings = scene.getExtendedTileSettings();

int tilePlane = level;
int mapLevel = level;
if (level < Constants.MAX_Z - 1 && (tileSettings[1][msx][msy] & TILE_FLAG_BRIDGE) == TILE_FLAG_BRIDGE)
{
tilePlane = level + 1;
mapLevel = level + 1;
}

final int swX = localLocation.getX() - (sizeX * LOCAL_TILE_SIZE / 2);
Expand All @@ -796,10 +773,10 @@ public static Polygon getCanvasTileAreaPoly(
final int nwX = neX;
final int nwY = swY;

final int swHeight = getTileHeight(wv, swX, swY, tilePlane) - heightOffset;
final int nwHeight = getTileHeight(wv, nwX, nwY, tilePlane) - heightOffset;
final int neHeight = getTileHeight(wv, neX, neY, tilePlane) - heightOffset;
final int seHeight = getTileHeight(wv, seX, seY, tilePlane) - heightOffset;
final int swHeight = wv.getTileHeight(swX, swY, mapLevel) - heightOffset;
final int nwHeight = wv.getTileHeight(nwX, nwY, mapLevel) - heightOffset;
final int neHeight = wv.getTileHeight(neX, neY, mapLevel) - heightOffset;
final int seHeight = wv.getTileHeight(seX, seY, mapLevel) - heightOffset;

Point p1 = localToCanvas(client, wv.getId(), swX, swY, swHeight);
Point p2 = localToCanvas(client, wv.getId(), nwX, nwY, nwHeight);
Expand Down
10 changes: 10 additions & 0 deletions runelite-api/src/main/java/net/runelite/api/Renderable.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
*/
package net.runelite.api;

import org.intellij.lang.annotations.MagicConstant;

/**
* Represents an object that can be rendered.
*/
Expand All @@ -42,4 +44,12 @@ public interface Renderable extends Node
void setModelHeight(int modelHeight);

int getAnimationHeightOffset();

@MagicConstant(intValues = {RENDERMODE_DEFAULT, RENDERMODE_SORTED, RENDERMODE_SORTED_NO_DEPTH, RENDERMODE_UNSORTED})
int getRenderMode();

int RENDERMODE_DEFAULT = 0;
int RENDERMODE_SORTED = 1;
int RENDERMODE_SORTED_NO_DEPTH = 2;
int RENDERMODE_UNSORTED = 3;
}
6 changes: 6 additions & 0 deletions runelite-api/src/main/java/net/runelite/api/WorldView.java
Original file line number Diff line number Diff line change
Expand Up @@ -264,4 +264,10 @@ Projectile createProjectile(int id, int plane, int startX, int startY, int start
*/
@MagicConstant(intValues = {Constants.CLICK_ACTION_NONE, Constants.CLICK_ACTION_WALK, Constants.CLICK_ACTION_SET_HEADING})
int getYellowClickAction();

/**
* Gets the tile height at the given coordinates, interpolating the height from adjacent tiles.
* @return
*/
int getTileHeight(int x, int y, int maplevel);
}
50 changes: 41 additions & 9 deletions runelite-client/src/main/java/net/runelite/client/RuneLite.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,49 @@
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import joptsimple.*;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.management.ObjectName;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import javax.swing.SwingUtilities;
import joptsimple.ArgumentAcceptingOptionSpec;
import joptsimple.OptionParser;
import joptsimple.OptionSet;
import joptsimple.OptionSpec;
import joptsimple.ValueConversionException;
import joptsimple.ValueConverter;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.api.Constants;
import net.runelite.client.account.SessionManager;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.discord.DiscordService;
Expand Down Expand Up @@ -152,7 +190,6 @@ public class RuneLite
private Gson gson;

@Inject
@Nullable
private Client client;

@Inject
Expand Down Expand Up @@ -435,15 +472,10 @@ public void start() throws Exception
// Start the applet
copyJagexCache();

// Client size must be set prior to init
var applet = (Applet) client;
applet.setSize(Constants.GAME_FIXED_SIZE);

System.setProperty("jagex.disableBouncyCastle", "true");
System.setProperty("jagex.userhome", RUNELITE_DIR.getAbsolutePath());

applet.init();
applet.start();
client.initialize();

SplashScreen.stage(.57, null, "Loading configuration");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import com.google.inject.binder.ConstantBindingBuilder;
import com.google.inject.name.Names;
import com.google.inject.util.Providers;
import java.applet.Applet;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -152,13 +151,6 @@ else if (entry.getValue() instanceof Boolean)
requestStaticInjection(Microbot.class);
}

@Provides
@Singleton
Applet provideApplet(Client client)
{
return (Applet) client;
}

@Provides
@Singleton
Client provideClient()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,7 @@ private void opTagTab(ScriptEvent event)
{
if (client.getVarbitValue(VarbitID.BANK_CURRENTTAB) == PotionStorage.BANKTAB_POTIONSTORE)
{
// Opening a tag tab with the potion store open would leave the store open in the bankground,
// Opening a tag tab with the potion store open would leave the store open in the background,
// making deposits not work. Force close the potion store.
log.debug("Closing potion store");
client.menuAction(-1, InterfaceID.Bankmain.POTIONSTORE_BUTTON, MenuAction.CC_OP, 1, -1, "Potion store", "");
Expand Down Expand Up @@ -873,7 +873,9 @@ public void onMenuOptionClicked(MenuOptionClicked event)
}
}

if (event.getMenuOption().startsWith("View tab") || event.getMenuOption().equals("View all items") || event.getMenuOption().equals("Potion store"))
MenuEntry menuEntry = event.getMenuEntry();
if (event.getMenuOption().startsWith("View tab") || event.getMenuOption().equals("View all items")
|| (menuEntry.getType() == MenuAction.CC_OP && menuEntry.getParam1() == InterfaceID.Bankmain.POTIONSTORE_BUTTON))
{
closeTag(false);
}
Expand Down
Loading