#development

1 messages · Page 17 of 1

upper valve
#

although dev deps wouldnt normally have been an issue before. but yeah if you can build on standard you can do w/e

hollow sonnet
#

Maybe I've set it up wrong in the past, but my current build.gradle has to do some conditional shenanigans to include spotless. Either way, I'm happy to migrate to a simpler setup.

ember flareBOT
#

Each overlay snap zone currently has a hardcoded stacking direction (vertical or horizontal). This PR makes that configurable per zone.

Changes

  • New OverlayZoneDirection enum (VERTICAL / HORIZONTAL)
  • New OverlayConfig config interface with one dropdown per snap zone, bound in RuneLiteModule and exposed as a standalone "Overlay Zones" entry in the configuration list (same pattern as "Chat Color")
  • SnapCorners now accepts OverlayConfig and sets expand flags dynamically
  • `...
jolly hearth
#

if I'm using build=standard, does the contents of my build.gradle matter at all? I have spotless declared in there for formatting, which isn't an approved dependency, but my build.gradle will be disregarded, right?

glass sandal
#

No, correct

ember flareBOT
solid shadow
#

not even tested classic

upper valve
#

where is the "we dont't accept ai contribs" response

worthy sparrow
#

which pr is the least clanker

hoary spindle
ruby radish
#

looking to make a spotify integration sidebar that might eventually evolve into shared music choice/a little album popup above the player (or just integration into the sidebar), anything i should watch out for?

desert fulcrum
jolly hearth
#

Thank you @sinful lava ❤️

hoary spindle
#

I guess that in the end, the person reviewing it would point out if there would be a problem like that.

zenith belfry
rancid marten
#

looks ok

zenith belfry
#

Build success ✅ Thank you!

autumn star
#

can anyone think of a plugin that sends changelog messages to previous users only, not new users?

#

im thinking i have to check if any of my configs exist to detect a previous user

pseudo rapids
#

set config versionNumber to be default current version, and if it is different send changelog and set to current

heavy bobcat
#

Doesn't work if you didn't have the config in v1 of your plugin though

#

What I do is just check if the game state is LOGGED_IN or not on startup. Presumably if they're not logged in its a current install, if its LOGGED IN then they probably just installed it. Obviously room for error there, but I think its fairly accurate.

#

plus also have a lastSeenVersion in config

#

but if you didn't have that in V1 you need to do extra steps

autumn star
#

yeah no one will have the version in config until theyve seen the messages

pseudo rapids
#

if you update the plugin wouldn't you want all current users to get the message either way, so doesn't matter if they previously didn't have the version number saved because it just means they're not on current version

#

that was a mess of a sentence

autumn star
#

yes but that would also apply to new installers

#

and i dont want to show all updates to them

pseudo rapids
#

or wherever you call the send msg

heavy bobcat
#

yes which means both new and existing users will have the default value

ember flareBOT
#

Some other plugins that can throw, i've found that a quick way triggering this is logging in while in a boat

java.lang.NullPointerException: Cannot invoke "net.runelite.api.Player.getWorldLocation()" because "player" is null
    at net.runelite.client.plugins.timersandbuffs.TimersAndBuffsPlugin.onGameTick(TimersAndBuffsPlugin.java:1205)
    
java.lang.NullPointerException: Cannot invoke "net.runelite.api.Player.getWorldLocation()" because the return value of "net.r...
pseudo rapids
#

oh right fair

#

long day

heavy bobcat
#

so you can't use just that to tell, that's why I do that + the login check

autumn star
#

fwiw configs are null when using ConfigManager

#

this should detect new installers and anyone who has never changed settings as fresh users, probably good enough

    private boolean isAssumedFreshInstall(ConfigManager configManager) {
        String groupName = ConfigKeys.PLUGIN_CONFIG_GROUP_NAME;
        List<String> configKeys = configManager.getConfigurationKeys(groupName);
        for (String key : configKeys) {
            String configKey = key.substring(groupName.length() + 1);
            Object config = configManager.getConfiguration(groupName, configKey);
            if (config != null) {
                return false;
            }
        }
        return true;
    }
granite quest
# ember flare

Strange, I’m unable to reproduce any of these errors reported that occur within the onGameTick function. I wonder if it’s an OS thing

trail veldt
#

Can confirm I myself have a couple of plugins throwing NPE, all corresponding to when they call client.getLocalPlayer().getWorldLocation()

granite quest
#

It’s a known issue. I have an open PR to fix the ones I can reproduce. It occurs near the login/world hop boundary

ruby radish
#

pretty sure the answers no, but env vars set in intellij run config dont get saved anywhere in gradle or git correct?

glass sandal
#

No, but you can add them to the run config of the gradle file

ruby radish
#

mmm good to know

#

gotta keep those secrets secret

ruby radish
#

those args are set as env variables?

glass sandal
#

Program arguments

stuck shale
#

How come 238 removed AmbientSoundEffect's getMaxPosition and getMinPosition 😢

#

They were not used by any plugins but I used it in annoyance mute debug mode, are they gone gone or just removed in 238?

rancid marten
#

all of the jagex sound code changed and i saw 0 uses of it so i just deleted it

#

not sure if there is an equivalent or not

#

there wasnt an obvious one if i deleted it i guess

stuck shale
#

thats np, i had used it to see the source location for sounds in ambient muting, like you can see more easily the source of stuff by knowing the tile locations they're in

#

it doesnt have a use beyond that probably

#

ie the -1 is the ambient sound "container" (my word for it) for toa lobby and for some reason it's located out there, probably to make the sounds just be the noises everywhere in the room but music trees play their ambient sounds only when you're close to the tree

#

so it helps you know which bubble noise comes from for example but its only for my hub plugin really

rancid marten
#

btw i made the memory analyzer use a separate vm

sharp knot
#

Hype

ruby radish
#

is the general consensus that having dependencies is looked down upon, or is there a list of dependencies that most plugins use/a certain version is used?

fading iris
#

I imagine that having dependencies with other plugins makes things an enormous headache to debug

reef badger
#

u can use any of those dependency versions without putting your plugin in review limbo forever

upper valve
#

what dependencies are we talking

ruby radish
#

json parser and potential db use in the future

#

im a big nodejs guy but i havent touched any code in 6 or so years so im hoping to keep everything relatively native to java, but fuck if i want to parse json data natively lol

glass sandal
#

You can do an sqlite database
implementation files('lib/sqlite-jdbc-3.43.0.0.jar')

#

And inject runelite's Gson instance

rancid marten
#

definitely dont do that, just depend on sqlite-jdbc like normal

glass sandal
#

Oh, that's how Not Enough Runes did it

rancid marten
#

oh thats not good

#

NER is basically a disaster tbf

#

just implementation 'org.xerial:sqlite-jdbc:3.46.0.0' or whatever

ruby radish
#

does gson allow parsing json into objects if i dont include the entire response body? half the stuff from the api im working with doesnt apply yet so i dont want to create an entire object full of vars im not gonna use

rancid marten
#

yes

ruby radish
#

nvm, i found the correct implementation

#

thank you team

grand flame
#

How would I fix this when people are installing my plugin? I didn't realize that this would be long enough to almost strand across 2 monitors. Would I push a update and break it down into more lines?

rancid marten
#

im surprised it doesnt wrap at all

grand flame
#

I don't know what it does for people with 1 monitor but for me it streches across both almost all the way

ruby radish
#

after many hours intermittent writing one or two lines of code, i finally have my spotify token. life is so good

#

thank you guys for the gson recommendation as well, im sure i will be back with a stupid question or two

jolly hearth
#

Is there a way to see if a renderable is hidden by any draw listener? Specifically actors

My plugin draws an overlay over actors and I need to not do that if they’re hidden

ember flareBOT
#

Type

Incorrect behavior

Operating System

Windows

OS Version

Windows 11

Bug description

The roof in the lighthouse on Last Light island is not removed by the plugin when the player is on the upper floors.

Screenshots or videos

With plugin, middle floor:

Without plugin, middle floor:

With plugin, top floor:

Without plugin, top floor:

RuneLite version

RuneLite version: 1.12.26.3
Launcher version: 2.6.7

Logs

No response

native harbor
#

@upper valve I appreciate all your hard work! Thanks for merging my updates - I have more, I am sorry!

upper valve
#

pretty sure the bot did your plugin?

native harbor
#

I thought my plugin was too large for the bot - The email had your name attached to it.

upper valve
#

sometimes they are too old for the bot so we closeopen them so it sees it again, that is all i did

bleak mica
#

I was wondering if anyone had the time to look at my RuneLite PR: https://github.com/runelite/runelite/pull/20091. It would be nice to have some more flexibility in the config menus for plugins to reduce the visual noise when having a lot of options to configure. I've written up the details in the description.

GitHub

GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.

worthy sparrow
#

what is this

#

a panel like notification config

rugged pivot
#

seems like

#

but puts the contents of a ConfigSection in the subpanel

#

some pictures might help

worthy sparrow
#

the correct way to do this would be to just let people register a panel/interface like notifications

native harbor
upper valve
#

thread sleep isn't allowed

native harbor
#

T4

#

Resolved.... I just did it onGameTick

#

Thanks, Rik!

bleak mica
bleak mica
#

For notifications it's always the same panel however, here it will be depended on the plugin's config interface

worthy sparrow
#

what

bleak mica
#

Added some screenshots

rugged pivot
#

using the config != register a custom swing panel

bleak mica
rugged pivot
worthy sparrow
#

yes what I said is how you would do this

bleak mica
bleak mica
rugged pivot
#

Probably. It doesn't directly solve the issue Shortest Path has (you'd basically end up making a custom panel that sets configs via configmanager probably), but it'd be a lot more versatile than this, which as far as I can see the only major feature addition vs existing ConfigSections is the section header acting as a gate config

worthy sparrow
#

it's the same thing as sections with a boolean Xenabled in each

rugged pivot
#

ya

worthy sparrow
#

so really not even a net gain

rugged pivot
#

I can see the use, but I can't imagine both this and custom panels both being added, and the latter is more useful

bleak mica
bleak mica
worthy sparrow
#

what, you can still do a 1 line gate

bleak mica
#

I feel I'm missing something in the config interface then

#

Oh I see what you mean, yeah that works too

#

I was more concerened about visual noise above anything tbh, I didn't want to overwhelm users with a endless list of options in the top level menu

worthy sparrow
#

that's why you can minimize sections

#

and also hide them by default

bleak mica
#

Yeah, but that is still a lot for the top level. I feel you could make the same case for the notifications, but that's also much cleaner hidden behind a sub menu

#

Are there any plans to add the custom panel support?

#

I could have a look, but I don't want to re-invent the wheel if someone is already working on it

ember flareBOT
#

Previously you could only label all potions which would label super restores, brews, etc. which I didn't need labeled because they are very distinct. I wanted to label my unfinished potions as they are not as obvious and I was tired of right clicking them all to find a toadflax unf or snapdragon unf etc. There was no option to discern between unfinished and finished potions so I re-labeled them to allow the choice to only show one or both.

ember flareBOT
grand flame
#

I'm trying to push a update for my plugin I'm following the little thing posted in the Plugin-hub file. Idk what im doing wrong but it's not going anywhere. I use the name following the : correct? So i need to use exactly git push -f -u origin <TerpinheimerCC>

rancid marten
grand flame
#

Thats what im trying to do I just want to make sure im doing it right and dont open a duplicate cause in there its named 1 thing then the actual plugin when installing it is just called Terpinheimer. So I want to make sure im using the right thing

grand flame
#

I think i figured it out

flat furnace
#

I appreciate you guys ❤️

ember flareBOT
desert fulcrum
#

anyone got a clue why its broken

rancid marten
#

i think it uses interacting to tell what random is whose and the frogs dont actually interact with you

ruby radish
#

should the Scheduler/@Schedule annotation only be used with void methods? or is there a way to listen into the returned values at that given point?

stuck shale
#

I think it only does work with public void things but also don’t know how it would work for a scheduled thing to return a value to something that isn’t calling it

quick path
#

returned values from what exactly?

ruby radish
#

from the method itself thats scheduled, but i refactored around it. just wasnt sure what else i might need going forward

#

the ScheduledMethod constructor was kind of throwing me a bit, because i was trying to write my own timers built into runelite tasks, but i have no clue what you put into the Schedule parameter for something thats intended to be an annotation

#

i figure just using the schedule as a catch-all for what im trying to do is much cleaner and easier than trying to return Bool and handling it elsewhere anyways

upper valve
#

you can also just make your own scheduled executor instance and do whatever

#

just make sure things shut down

ruby radish
#

good point, thank you for that recommendation. going in the back pocket for later

jolly hearth
#

oh that's embarrassing, it's my own render callback that's making it return false... nevermind

rancid marten
#

Lol

jolly hearth
#

actually that leaves me with another question then, presumably it's not a good idea to deregister my callback, check, then re-register it every frame, so is there any other way?
I was going to loop the callbacks of renderCallbackManager myself but the attribute is private

rancid marten
#

Just set and unset a flag before and after the call

jolly hearth
#

ty!

iron tiger
#

I have a plugin that sends network requests to my server. Do I have to have a checkbox in my config in addition to the plugin warning on install for network requests? I have a config checkbox that is disabled by default but then it means that users who install have to know to turn that on after installing when they already accepted the warning dialog.

stuck shale
#

If it’s a new plugin you can do a warning=this plugin does stuff… (see others for examples) but it’s a previously installed plugin without a warning you’ll have to default false on a checkbox and add a warning to the checkbox

iron tiger
#

Ah okay, it’s newer and has always had a warning. I’ll make an update to remove the redundant config checkbox.

stuck shale
#

If it always had a warning you can change the warning but if it never had a warning you have to do the check box. You won’t need a check box with a warning if you had a warning originally.

ember flareBOT
#

I have recently started developing and publishing a couple plugins that rely on detecting scripts firing to function and using the script inspector was a bit of a rough experience. 🐈

This PR adds some QoL changes to the script inspector:

  • Added a right click popup to add/remove scripts from the log to the blacklist or highlights
  • Added the option to select multiple scrips from the right side panel to delete all at once

https://github.com/user-attachments/assets/2d7c712f-9262-49d4-9d...

lucid hazel
#

Is there a way for a plugin to run extra code when the user hits reset in the config, such as clearing out a cache file in the .runelite directory?

glass sandal
#
    @Override
    public void resetConfiguration()
    {
        // your code here
    }```
lucid hazel
#

Perfect, thanks!

rancid marten
#

just noticed this on release with gpu off, has anyone seen this?

#

is that new?

sharp knot
#

Someone mentioned it a couple days ago I think

#

But I don't remember hearing anything about it prior to that

rancid marten
#

here there is a single tile lol

#

hmmm

#

maybe i messed up something with 238, but if so it would have been broken for weeks

dense furnace
#

Is there a lot of players without the GPU plugin?

#

I have been working a lot the past few weeks toggling between GPU/normal/local plugin especially around the lumbridge area and haven't noticed this a single time

sharp knot
rancid marten
#

i tried removing the tile cull test and that doesnt fix it lol

#

that is interesting

dense furnace
#

Could it be render ordering?

rancid marten
#

obviously no

dense furnace
#

The window perspective inside the building is also freaky

ember flareBOT
#

Type

Incorrect behavior

Operating System

Windows

OS Version

w 11

Bug description

My purple house portal vanished. And when I teleported inside, the fairy ring, ornate pool and occult altar had also gone. I explored outside and certain other things cannot be recognised. PoH was in Priff so I checked Gauntlet door - no click option. Seed store in the farming guild and flowwer patch also gone. Any advice?

Screenshots or videos

where the heck has it gone?

RuneL...

rancid marten
#

ok I see, there are a bunch of 238 vismap changes that i just missed totally it seems is the problem

ember flareBOT
#

<img width="1536" height="816" alt="Image" src="https://github.com/user-attachments/assets/bdd88d99-7961-47eb-8d94-010f6b2588a6" /> even the space for these items do not exist any more. Just a 'theme space' in the garden and no clickable option at all for altar.

These things don't happen in the official jagex client btw:

https://github.com/user-attachments/assets/0205b1eb-ec49-4b51-a009-479b0e98b0cb

ember flareBOT
#

Fixes #17612 I ended up installing jdk and trying to build and log the changes of the resize bug. Some weirdness keeps happening with the insets and in my case the frame insets get changed at some point causing the clientSize to increase to 1930x1082

2026-05-26 17:52:10 EEST [AWT-EventQueue-0] INFO  net.runelite.client.ui.ClientUI - Skipping layout because decorated frame insets are not yet initialized (bounds=java.awt.Rectangle[x=3840,y=1080,width=0,height=0])
2026-05-26 17:52:10 EE...
ember flareBOT
stone cairn
# ember flare

@quick path When you have the time, can you check this, please?

quick path
#

looks like it should actually be 3803, 3529?

#

if it's 3 tiles too far north, y=3530 would only bump it down 2 tiles, not 3

ember flareBOT
stone cairn
quick path
#

PR is welcome

#

I'll fix it later if I don't see one though

ember flareBOT
stone cairn
#

Done 😁

jolly hearth
#

#support message

Bumping this - it's not possible to modify the right click menu (outside of its entries) in a plugin.

Could any RL internal devs weigh in on how difficult it would be to implement scaling of the right click menu into the client? Similar to how the current setStretchedEnabled stuff works, but specifically only for the right click menu

amber rampart
#

there isn't really any good way for the client to render scaled fonts like that

jolly hearth
#

the Stretched Mode plugin already does it though, right? or would scaling just the right click menu be different?

amber rampart
#

no, the stretched mode plugin just scales the whole canvas

ember flareBOT
#

Type

Incorrect behavior

Operating System

Windows

OS Version

11

Bug description

My (and others) character will navigate to a destination tile and then immediately face a random direction as if it is snapped to something out of bounds.

Screenshots or videos

#support message
It won't let me upload my video but I posted it in support in the discord.

RuneLite version

1.12.26.3
2.7.3

Log...

dusky crane
#

What's the rundown on build type? From the build-type wiki it's still not quite clear if I should use standard or gradle. I don't have any deps except for lombok, but I do have a task in mine (to create the setups version text file). My build.gradle (InventorySetups) for reference: https://github.com/dillydill123/inventory-setups/blob/master/build.gradle. Thanks for any insight..

rancid marten
#

do you want your task to run when we build the plugin?

dusky crane
#

Yes

rancid marten
#

then build=gradle

dusky crane
#

Thanks!

upper valve
#

maybe worth noting that will prevent your plugin from being autoreviewed

dusky crane
#

Is autoreview some AI that previews it for a maintainer?

dusky crane
#

Good to know though.. Maybe in the future I can remove the task dependency

#

Ha, Inventory Setups is 100% grass fed crappy java code 😉

#

Too scared to unleash an AI on this code that has 0 tests 💀

upper valve
#

it reviews and merges it

glad onyx
#

Regarding conditional menu swapping, since it seems quite a few plugins offer that behavior, is there a clear way to know what may be allowed before bothering to develop a feature?

heavy bobcat
#

Well you can certainly ask here

glad onyx
#

First one would be dynamic swap for enchanted symbol use in wildy for suicide depending if you have protect item on

ember flareBOT
ember flareBOT
#

06adab7 Update Scripts to 2026-5-27 - RuneLite Cache-Code Autoupdater
768e15a Update Item variations to 2026-5-27 - RuneLite Cache-Code Autoupdater
646275f Update Legacy ID classes to 2026-5-27 - RuneLite Cache-Code Autoupdater
26b48fb Update GameVals to 2026-5-27 - RuneLite Cache-Code Autoupdater

#
[runelite/runelite] New tag created: runelite-parent-1.12.27
#
[runelite/static.runelite.net] New branch created: 1.12.27-26504454311
#
[runelite/static.runelite.net] New branch created: cache-code-2026-05-27-rev238
ember flareBOT
jolly hearth
#

is it known/intended that plugins are loaded before the game cache is downloaded?

rancid marten
#

yes

jolly hearth
#

is using clientThread.invokeLater with a boolean supplier that checks if the image is null my best option for loading images through SpriteManager then?

jolly hearth
#

clientThread.invokeLater with boolean supplier works well, it does spam a bit though, retrying every 20ms

quick path
#

That's fine, just don't spam logs every 20ms or anything and it should be ok

jolly hearth
#

I suspect using the same logic that SpriteManager.getSprite does would be the proper way: client.getGameState().ordinal() < GameState.LOGIN_SCREEN.ordinal()

jolly hearth
upper valve
#

cant you use getSpriteAsync?

ruby radish
#

any good examples of async handling in java with plugins? im only used to nodejs async handling on the server side so i want to touch up how i think i should be doing it