#development
1 messages · Page 17 of 1
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.
Each overlay snap zone currently has a hardcoded stacking direction (vertical or horizontal). This PR makes that configurable per zone.
Changes
- New
OverlayZoneDirectionenum (VERTICAL/HORIZONTAL) - New
OverlayConfigconfig interface with one dropdown per snap zone, bound inRuneLiteModuleand exposed as a standalone "Overlay Zones" entry in the configuration list (same pattern as "Chat Color") SnapCornersnow acceptsOverlayConfigand sets expand flags dynamically- `...
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?
No, correct
To be clear! I do not usually work with Java and this is entirely AI generated code off my prompt.
This needs testing and may need additional contributions (if its even possible to get working).
This is basically attempting to give the user the option to rebind the CTRL+M to M when opening the map - it was a complaint from a friend so figured I'd give Claude a whack at it.
not even tested 
where is the "we dont't accept ai contribs" response
which pr is the least clanker
If anyone is interested in looking at a small 100% human made pr, there is this one 👀 https://github.com/runelite/runelite/pull/20074
(if anyone does, thanks a lot!)
oh I actually like this
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?
dont think this migrates configs right? some people may see tooltips all of a sudden.
Any reviewers around that could merge https://github.com/runelite/plugin-hub/pull/12141 for me please? It’s a one line change but a pretty important fix - stops Improved Tile Indicators from removing hitsplats
Thank you @sinful lava ❤️
Im cant say im 100% sure on how it will work, but since i didnt change anything about the original settings and only added new ones that are off by default, i assume peoples settings wont get touched. At least that was what happened for me when testing it.
I guess that in the end, the person reviewing it would point out if there would be a problem like that.
First time plugin builder here, I accidentally removed build=standard in my last fix, so the build failed of course. Any chance someone could take a look to see if it passes now?
https://github.com/runelite/plugin-hub/pull/11823
looks ok
Build success ✅ Thank you!
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
set config versionNumber to be default current version, and if it is different send changelog and set to current
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
yeah no one will have the version in config until theyve seen the messages
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
yes but that would also apply to new installers
and i dont want to show all updates to them
.
won't config be filled with default values before startup
or wherever you call the send msg
yes which means both new and existing users will have the default value
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...
so you can't use just that to tell, that's why I do that + the login check
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;
}
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
Can confirm I myself have a couple of plugins throwing NPE, all corresponding to when they call client.getLocalPlayer().getWorldLocation()
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
pretty sure the answers no, but env vars set in intellij run config dont get saved anywhere in gradle or git correct?
No, but you can add them to the run config of the gradle file
those args are set as env variables?
Program arguments
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?
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
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
btw i made the memory analyzer use a separate vm
Hype
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?
I imagine that having dependencies with other plugins makes things an enormous headache to debug
u can use any of those dependency versions without putting your plugin in review limbo forever
what dependencies are we talking
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
You can do an sqlite database
implementation files('lib/sqlite-jdbc-3.43.0.0.jar')
And inject runelite's Gson instance
definitely dont do that, just depend on sqlite-jdbc like normal
Oh, that's how Not Enough Runes did it
oh thats not good
NER is basically a disaster tbf
just implementation 'org.xerial:sqlite-jdbc:3.46.0.0' or whatever
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
yes
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?
im surprised it doesnt wrap at all
I don't know what it does for people with 1 monitor but for me it streches across both almost all the way
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
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
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
@upper valve I appreciate all your hard work! Thanks for merging my updates - I have more, I am sorry!
pretty sure the bot did your plugin?
I thought my plugin was too large for the bot - The email had your name attached to it.
sometimes they are too old for the bot so we closeopen them so it sees it again, that is all i did
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.
seems like
but puts the contents of a ConfigSection in the subpanel
some pictures might help
the correct way to do this would be to just let people register a panel/interface like notifications
Never had this issue (attached)
I submitted it from my main account - Realized Runelite changed the cords for the direct for the chatbox - Made those changes and updates the SHA and now I am assuming an admin/reviewer has to check it for that check to clear?
PR: #12176
https://github.com/runelite/plugin-hub/pull/12176
RuneWatch Assit
Color Blindness
QoL Updates
thread sleep isn't allowed
I'll add some!
Yeah, that's what I was going for. Most of I did was replicate how it now works for notificaitons.
For notifications it's always the same panel however, here it will be depended on the plugin's config interface
what
Added some screenshots
using the config != register a custom swing panel
Maybe this'll help
people have been asking for the latter forever, so it would likely be the accepted solution
yes what I said is how you would do this
Ah I see, not too familiar with the swing terminology
So, what you mean is that it's preferred to create a custom swing panel that registers into the config over a config interface driven solution?
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
it's the same thing as sections with a boolean Xenabled in each
ya
so really not even a net gain
I can see the use, but I can't imagine both this and custom panels both being added, and the latter is more useful
It is. I did that mostly for code clarity, as a one-line gate is much cleaner than a potentially 50+ conditional boolean
That I do agree with. Custom panels would be the way to go, but that seemed way more invasive to the code base.
what, you can still do a 1 line gate
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
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
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.
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>
https://github.com/runelite/plugin-hub#updating-a-plugin are you doing this?
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
I think i figured it out
I appreciate you guys ❤️
Same issue here. This has been in "needs triage" for a while, please give this the attention it deserves!
anyone got a clue why its broken
i think it uses interacting to tell what random is whose and the frogs dont actually interact with you
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?
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
returned values from what exactly?
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
you can also just make your own scheduled executor instance and do whatever
just make sure things shut down
good point, thank you for that recommendation. going in the back pocket for later
anyone know about this? I've tried injecting Hooks and then calling hooks.draw(actor, true) but it's always returning false
oh that's embarrassing, it's my own render callback that's making it return false... nevermind
Lol
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
Just set and unset a flag before and after the call
ty!
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.
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
Ah okay, it’s newer and has always had a warning. I’ll make an update to remove the redundant config checkbox.
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.
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...
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?
@Override
public void resetConfiguration()
{
// your code here
}```
Perfect, thanks!
Someone mentioned it a couple days ago I think
But I don't remember hearing anything about it prior to that
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
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
Mentioned two days ago
i tried removing the tile cull test and that doesnt fix it lol
that is interesting
Could it be render ordering?
obviously no
The window perspective inside the building is also freaky
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...
Does this occur on a fresh profile with only GPU enabled?
ok I see, there are a bunch of 238 vismap changes that i just missed totally it seems is the problem
It happens with gpu on and of, low detail on and off. I don't use HD 117 because potato laptop.
The altar and fairy ring and pool don't exist in building mode either.
<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
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...
I think this https://github.com/runelite/runelite/issues/9601#issuecomment-570070536 was partially implemented.
Proof: https://github.com/Daniel-Tudose/True-Clue-Dig-Locations/issues/12#issuecomment-4538095072 which says it is 3 steps too far north.
So it should be 3803, 3530? Correct me if my math is wrong
@quick path When you have the time, can you check this, please?
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
Given that it is currently at 3803, 3532, you'd need to set the y value to 3529 to bump it down 3 tiles, no?
Oh, yea, right! Sorry I was thinking in areas terms.
So yea, it would be 3529. Could that be modified, please?
yup, right. It's been a long day for me
As of last comment I made on the mega issue for H&C master steps
Done 😁
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
there isn't really any good way for the client to render scaled fonts like that
the Stretched Mode plugin already does it though, right? or would scaling just the right click menu be different?
no, the stretched mode plugin just scales the whole canvas
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...
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..
do you want your task to run when we build the plugin?
Yes
then build=gradle
Thanks!
maybe worth noting that will prevent your plugin from being autoreviewed
Is autoreview some AI that previews it for a maintainer?
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 💀
it reviews and merges it
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?
Well you can certainly ask here
First one would be dynamic swap for enchanted symbol use in wildy for suicide depending if you have protect item on
I discovered the problem. A plugin called -Polygon limiter', yet t has neve had these problems before. Thanks. Maybe tell the dev.
dcea5a1 API docs for 1.12.27 - RuneLite updater
6c62270 Release 1.12.27 - RuneLite updater
that seems fine to me
is it known/intended that plugins are loaded before the game cache is downloaded?
yes
is using clientThread.invokeLater with a boolean supplier that checks if the image is null my best option for loading images through SpriteManager then?
good idea, but my plugin would need the images prior to login, for the side panel
clientThread.invokeLater with boolean supplier works well, it does spam a bit though, retrying every 20ms
That's fine, just don't spam logs every 20ms or anything and it should be ok
I suspect using the same logic that SpriteManager.getSprite does would be the proper way: client.getGameState().ordinal() < GameState.LOGIN_SCREEN.ordinal()
this works, but still requires null checking the images after loading, presumably because the full cache hadn't loaded on the first run of the loop
cant you use getSpriteAsync?
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