#development
1 messages · Page 2 of 1
my bad
no worries at all, thanks for fixing it/noticing the bug and thanks for not including 900 lines of unrelated things with the fix 🙂
although java and game development isnt my stack (C# .net, typescript, angular/react is) , ive been a dev for 10 years so i get it haha 😄
it's okay to do two seperate prs for the same plugin yea?
Do you mean making two PRs to update your plugin at the same time?
not necessarily at the same time
You can update your plugin through PRs as many times as you want - if you have multiple PRs open for the same plugin you are going to run into merge conflicts so I'd avoid it unless you have a good reason for it
one is just a small diff update (which I imagine would be reviewed first) second is a large refactor
The problem with having two PRs open at the same would be that a plugin reviewer might not necessarily know which one to handle first, so if you can avoid it (which it sounds like you can), I'd suggest opening the small diff update PR first, waiting for it to be merged in, and then making your PR with your large refactor.
If you do decide to have multiple PRs open, it would be nice if you use the "Draft" feature for the PR that you want merged in later (in this case, the large refactor one)
Would a comment suffice or would you rather I just keep it in draft?
I'd rather you keep it as a draft, and then when it's ready to be merged in you mark it was ready to be reviewed again. That way no one goes into reviewing a diff that will change by the time it's actually ready
sounds good, thank you!
are singleton hub plugins generally frowned upon?
as in, making one that expands on a native plugin but both cannot be used in tandem
or alternatively has another plugin as a dependency
- Adds Frost dragons task https://oldschool.runescape.wiki/w/Frost_dragon
noticed I missed a task in https://github.com/runelite/runelite/pull/19634
the answer is it depends
kinda figured, thought id still check first if its at least an option. ty
Is it possible to have a plugin interact with another external plugins overlay?
Trying to see if I can have an overlay which would be locked to being on top of another plugins overlay (if present)/be able to move with it if dragged.
If this is done anywhere, if I could get a plugin name where I can check out its implementation I would really appreciate it
i don't believe so because you can't really access other overlays at runtime
You could probably use a PluginMessage to pass the location and dimensions of the overlay between plugins, but that would require you modify both plugins. Otherwise not possible without reflection afaik
reflection is banned
ur banned
lol
Ty for the info
thinking about the ping stuff more, I'd think it might be worth trying to keep a long standing connection for the current world, but not sure if we there's any valid message we could use for an in-band ping/pong to measure the rtt on
Kernels generally have to keep track of stuff like the rtt for congestion and window tracking, so if we had a long standing connection we could query that information for the one socket, might be more accurate but maybe not worth the hassle
If no one beats me to it, I can try writing a small tool for using this api for doing some manual testing when I'm off work
yeah that would he helpful
you could probably just vibecode that tbh
just like a cli app that opens a connection and then dumps tcp stats
you might need some active data on the line for the stats to be accurate
yes
Apologies if this has been asked already, but is there a way to set a music track to begin playing? Came across this and I'm assuming it's still an open request, I just wanted to double check here: https://github.com/runelite/runelite/issues/10692
theres been no work twords it
Ive tried using SIO_TCP_INFO on the sockets created by tcpPing as well as the long standing connection. I kept getting error 10045 operation not supported. I'm exploring TCP_ESTATS_TYPE atm
interesting
thats from WSAIoctl()?
Yup
https://learn.microsoft.com/en-us/windows/win32/winsock/sio-tcp-info its definitely a real thing, idk
Adds the following options to the Drift Net plugin:
- Net fill opacity: Adjustable fill opacity for drift nets (uses the existing status color)
- Use clickbox for nets: Option to highlight nets using clickbox instead of hull
- Untagged fish fill color: Fill color for untagged fish tiles
Type
Incorrect behavior
Operating System
None
OS Version
No response
Bug description
When selecting quick-deposit on the ironwood cargo hold with Item Count turned on in the Sailing plugin:
- Expected behavior: item count increases by the number of salvage deposited
- Actual behavior: item count is unchanged
Item count only seems to change when:
A) opening the cargo hold interface
B) crewmate deposits salvage (increments the incorrect count by 1)
Screenshots or ...
Sailing plugin issues should be reported to the sailing repository.
In this case there is already an existing issue: https://github.com/LlemonDuck/sailing/issues/177
Ah, forgot Sailing was a standalone plugin. Thanks @ldavid432
Im able to get SIO_TCP_INFO working ok locally
Not in runelite but i just made a small c++ app
it definitely seems to work
I was running into trouble using it on the sockets created by the runelite client specifically
were you using jna?
yes, but to be clear youre referring to using WSAIoctl() correct?
TCP_INFO_v0 info;
DWORD bytesReturned = 0;
ZeroMemory(&info, sizeof(info));
DWORD tcpInfoVersion = 0; // Version 0 of TCP_INFO
int rc = WSAIoctl(s,
SIO_TCP_INFO,
&tcpInfoVersion, sizeof(tcpInfoVersion),
&info, sizeof(info),
&bytesReturned,
NULL, NULL);
Yup that looks like it
also id like to mention copilot had a terrible time with this
could not figure it out
i dont know why it wouldnt work on the normal Socket() stuff
I spent a lot of time with copilot getting it to work lol
whats your code look like?
also I think you have to use reflection to get the fd from the Socket which is sort of a problem
sock,
SIO_TCP_INFO,
version.getPointer(),
4,
info.getPointer(),
info.size(),
bytesReturned,
null,
null
);```
tcpInfoVersion0
what is sock here?
yup you do. I figured it'd be a problem but i was going for a proof of concept here
UINT_PTR sock = new UINT_PTR(handle);```
[runelite/static.runelite.net] New branch created: wiki-data-2026-01-09
5ecc072 Update wiki data - RuneLite Wiki Scraper
this seems ok i guess assuming handle is right, idk
I’m pretty confident the handle is correct too. I ran this one on the sockets created in tcpPing(). The handle I got for the live game connection could be wrong
but it doesnt work with the tcpPing socket either?
Nope I ran into the same error operation not supported on both. Apparently that error can occur from issues with the socket itself
idk, it should work
I may spend some more time attempting to get it to work but you were right it’s been neither easy or intuitive
This pr has the same fundamental flaws as your hub pr and seeing as it looks LLM generated, I'm not sure you understand what I mean.
I tookover a plugin a couple months ago and need to fix some more stuff, working with it is really annoying because they used spaces. If I submit a pr just formatting it like how i want the diff will look huge, will it take forever to get reviewed
if it's just converting spaces to tabs, just mention that we should view the diff with ?w=1 to skip whitespace-only lines
spaces > tabs
theres other changes like opening brackets on a new line, but hiding whitespace changes removes like 99% of the diff so thats fine
This pr has the same fundamental flaws as your hub pr and seeing as it looks LLM generated, I'm not sure you understand what I mean.
I appreciate the feedback, but I'm having trouble understanding the technical issues you're describing. I'm not experienced with RuneLite's internal architecture. I do not know the delineation of what "core" means in terms of rendering encapsulation. I have no clue how a complex feature would function without some level of UI housed in a side panel, so, I s...
formatting prs are mostly whatever just DON'T like change plugin behavior and reformat in the same submission
also you say it "will look huge" but what is that in terms of LoC (like without the w1 even)
which llm is stuck in 2024
Does anyone know where I can find the crowdsourced data for desert heat tiles? I'm interested in making a plugin outlining the borders between desert heat tiles and safe tiles, if that doesn't already exist.
Yea I was thinking if I had a bunch of data on which tiles had instances of desert heat, I could draw a rough outline at least
+2146 -1947 without hiding whitespace
+223 -24 hiding whitespace
you were right. It works. I'm seeing ping numbers consistent with the ones calculated in tcpPing() using SIO_TCP_INFO. I'm also seeing accurate ping numbers from the active game connection using SIO_TCP_INFO. I'm a fool and I had the wrong SIO_TCP_INFO control code 🤦♂️
@tribal jungle nobody has time to look at a 10k diff, you can either figure out how to roll that out in multiple PRs or basically let it rot
fair enough, I'll figure something out
Is there a particular reason why the over-culling issue with expanded camera limits has gone unfixed for years? Is it just lack of interest/niche problem (fixed-only + expanded camera limits only perhaps)? Or is there a reason why it can't be fixed/hard to fix. I might be interested in fixing it since it just seems like a calculation error in what should be culled.
that is sort of a loaded question with some assumptions lmao
yea absolutely, please correct me
in general, we are not doing things like spite not fixing your pet problem because we don't like you or something
i'm not aware of this problem, and even if I was aware of it, it cant be older than ~50 days
hmm ok, maybe there are multiple culling problems, because I've seen culling issues on runelite for years
it's possible that I've conflated the two and they are different in nature, and the previous one is already patched
ok well ive never seen one like that
all of the culling and rendering code got replaced 50 days ago, none of it is the same as before
or works similarly, really at all
ah I see, now that I think more about it, I think the culling issues I'm recalling from the past were tile-based culling maybe? and this seems to be chunk based I think
anyways mb for coming off the wrong way with my question, im not the best at expressing what im thinking
it looks like my assumptions were incorrect on this one too, it has nothing to do with camera plugin or fixed
You get bonus points for not feeding your responses through an LLM first 🙂
Type
Incorrect behavior
Operating System
Windows
OS Version
Windows 11
Bug description
There appears to be a large section of the world (a chunk I believe) getting culled that shouldn't be. This happens regardless of Camera plugin being on/off, and regardless of fixed/resizable.
Screenshots or videos
https://github.com/user-attachments/assets/c0c7e8b6-551b-4026-964b-8e306d0a0bfb
RuneLite version
Runelite version: 1.12.11
Launcher version: 2.7.3
Logs
_N...
Here are some combination's that produce problems. The two problems shown in this clip I believe are different problems:
- GPU plugin enabled, regardless of camera plugin seems to cull chunks it shouldn't
- GPU plugin disabled and camera plugin expanded pitch limit seems to cull tiles it shouldn't
https://github.com/user-attachments/assets/4b878d76-2184-4c27-b5d4-8dcbee9ed911
What's an easy way for a plugin to check whether a certain other external plugin is installed before checking the config values of that plugin?
I believe quest helper does that if you want to look at their code
Thanks! I'll have a look.
Found it, ExternalPluginManager's getInstalledExternalPlugins() method. Thanks for the tip 😄
i think you could also use configmanager to see if a plugin is turned on (meaning it's installed)
good shout, didn't know that would work too in case it's not installed
@severe grail https://github.com/DarockObama/StreamerbotPlugin/tree/master/src/main/java/com/streamerbot A simple plugin that uses Dink's outbound pluginmessage to trigger streamerbot actions.
GitHub
Triggers Streamerbot actions on through Runelite notifiers - DarockObama/StreamerbotPlugin
Don't judge my terrible coding skills, this is my first (and probably last) java project.
Can confirm, am having the same issues.
yo i wanted to make a plugin that shows which ranks need to be changed in a clan, based on input from an external api. It highlights the names and shows the rank they should be in the clan members list.
I assume there needs to be a warning for using external websites, but i dont think theres anything else wrong with this. Would it take long to get approved for pluginhub, if the plugin is ok?
that sounds fine otherwise, yes
Cheers. Ill ask a friend to look it through as ai made the whole plugin. Seems pretty solid ngl
how long your plugin takes to get approved is entirely dependent on how big/complex it is, which we don't really know until you submit it
Hey, I found this issue with the latest snapshot, it appears that the portal to GotR was transformed into a stool, the stool highlighted in the screenshot is said portal and even its clickbox is of the stools
This happens if you log into the basement with or hop worlds while inside the basement. Is this something you were aware of happening? I have confirmed that it does not happen on 1.12.11
To enable safemode
Windows
Run the RuneLite (configure) shortcut from the windows start menu
Tick the Safe mode box, save, launch RuneLite the way you normally do.
Mac
In Terminal, run
/Applications/RuneLite.app/Contents/MacOS/RuneLite --configure
Tick the Safe mode box, save, launch RuneLite the way you normally do.
Does it happen in safe mode?
I should add that this is run through an IDE isnt it always in safe mode in that case?
Lol no
it is not always safe mode
ok I can do that then and report back, sorry not a developer 😓
yes it still happens in safe mode, if this is correct
no, you would pass --safe-mode in ij
but it will be a gpu only bug
so it won't happen in safe mode
ah ok sorry, yeah I passed it into ij and its still happening, I presume since theres no gpu plugin that confirms I correctly launched it with safemode
oh it also says in the titlebar 🙈
Its rather scary that its using the clickbox of the stool no? If it was just the objects model being swapped I wouldnt be worried but the clickbox itself is that of the stools rather than the portal
the clickbox is only from the model
I was under the impression that the client was not allowed to modify clickboxes in any way, and its definitely different, if theres no issue here sorry for wasting your time
This seems like a vanilla bug then probably
there is an issue, its not supposed to be a stool
but since its model changed, the clickbox will change by definition
doesnt happen on the jagex client
Problem Statement:
With more servers soon to move to AWS and AWS not supporting ICMP pings we are concerned with a potential 2000 new TCP connections opened/closed per second per server. The solution should treat the 3 types of pings (pingInitialWorlds, pingCurrentWorld, pingNextWorld) separately.
Solution:
Modify Ping.tcpPing() to introduce a cooldown on a per world ID basis via a hashmap. The cooldown is set to at least 5 seconds but in reality the cooldown will be longer as ...
Well, its specifically only happening on 1.12.12-SNAPSHOT anyway, while 1.12.11 is normal
Hopefully my report is useful in some way, as I say I'm not really a developer I just help out around 117HD doing json work so I'm not really aware of how important an issue this would be
I wont be able to test this on mac/linux for a bit.
it definitely shouldnt be a stool, ill look at it
this is not really at all what i wanted to do / what we've been talking about for days in this channel, i am confused
or well i am confused how you managed to get to this from the entire rtt discussion we've had
I pushed this as a solution that avoids reflection. Tried to keep changes small since what we've discussed would be the long term solution
I really dont like the client doing connect() over and over to the current world to measure ping, theres basically no scenarios where i want to do that
even if you are making it every 5s instead of every 1s
This would only occur on worlds where ICMP fails as a fallback. It's definitely not desired but I'm not sure how to get the active game socket without reflection
we can add a FileDescriptor getSocketFD() to client
yes. regardless you have to use reflection to get the SOCKET off of the FileDescriptor so no matter what we're using reflection here
which, is fine. its sort of annoying for jdk17 but luckily we dont use that sort of
got it. Didnt want to go that route and get myself in hot water
its pretty obviously just not possible to do it without using native code or reflection?
im fine with reflecting into it and then figuring out 17 later I guess.
a couple other thoughts 1) Ping should not be keeping track of rate limiting state like this, whatever is calling it should be 2) ideally we can herustically detect the aws servers maybe by detecting if the servers have >1 ip or something
although I guess this approach would make it work if the user just happens to be on a network which filters icmps which does sometimes happen
which is nice
I appreciate the feedback. I will abandon this solution though in favor of monitoring the active game connection like we discussed. I'm assuming the old ICMP pings would no longer be needed afterwards.
I think it should probably prefer icmp
tcp rtt and ping isn't really the same thing
Yes they measure different things. I will of course include some statistics between tcp rtt the current ICMP ping when the time comes.
in the case of the new jagex servers tcp rtt is the least-worst option so it doesnt really matter how incorrect it is
but the servers which can do icmp we should do icmp to
imo we should do rtt on all of them, otherwise they are uncomparable and that is weird
also I can do the linux and mac impls if you want
can we show something visually to show if it is a ping or rtt?
would the users understand the difference?
yeah i was just typing that, no not really
i think that would be ok as long as we change our labeling (like the world hopper table header, config etc) from ping -> rtt
or RTT (ping) or something
hm
this would require opening/closing a socket to every world on startup
but i guess we're trending towards that regardless
ive 0 idea what time of timespan they are thinking about in replacing their servers with aws
jagex tends to move slow, it might be never, idk
or like only in non-eu/non-us places
doing a connect() to everything for the initial pings seems pretty bad
I think it'd be best to use your initial suggestion: icmpPing with fallback to tcpPing for pingInitialWorlds, same idea for pingNextWorld, and RTT for pingCurrentWorld. We'll just have to accept the discrepancy of ping vs RTT
Also, is runelite supported on older windows versions than 10?
7 is supported
I believe SIO_TCP_INFO was added in windows 10
yeah
Hm ok. Using TCP_ESTATS_TYPE is available on vista+ but requires admin so I assume its not appropriate
as long as it doesn't crash its fine imo
yes, 7 doesnt matter, i think it might be all bots and venes
its supported as in it sort of runs (eg the jdk supports it) but its not something we care about particularly
Have we heard any updates on vanilla client plugins? I was talking with mod gengis about it a while back… but it seems like it got put on hold?
Just excited to port my plugin to mobile 😂
no
winter 20127
20427 
Type
Incorrect behavior
Operating System
Linux
OS Version
Fedora 42, Linux, kernel 6.17.12. i3/x11, nvidia 580.119
Bug description
The south eastern quadrant of Prifddinas seems to not work properly with the roof removal plugin. From a distance the roof removal works as expected, like if I'm running to the bank, but once I enter the quadrant it stops working and the roofs are always visible regardless of settings.
My home is in Prifddinas but I don't need to access my ...
More roof removal bugs yippee
Type
Incorrect behavior
Operating System
None
OS Version
No response
Bug description
For this medium clue step, the Clue Scroll helper states "Baxtorian Falls (Bring rope)". Completing the medium Kandarin diary adds two permanent rope objects to the area that can be used instead, making it unnecessary to bring a rope.
Screenshots or videos
RuneLite version
RuneLite version: 1.12.11...
🐇 someone submitted an issue to my plugin saying it doesnt turn on for them but i have no clue why it wouldnt, it works just fine for me could someone else see if it works? its called Limey Tile Man, and its on the plugin hub :3
you can try getting logs from them to figure out why
oh true true
how do i ask for that tho? like where is the log located so i can ask them for it x)
To find the logs, you can do one of the following:
- If your client failed to open, click the
Open logs folderbutton. - Open the screenshot directory by right-clicking 📷
Camerabutton, navigate 1 directory up, then open logs folder. - Navigate to
%userprofile%\.runelite\logson Windows or$HOME/.runelite/logson Linux and macOS.
Upload the log files named client and launcher by dragging them to Discord. If there are files prefixed with jvm_crash dated from today, upload them too.
🐇 thank you guys
e922589 update contextual-cursor to v1.7.0 (#10094) - ldavid432
be4aaf1 update dude-wheres-my-stuff to v2.11.0 (#10109) - Thource
d037448 update quicksplitcalc to v1.1.0 (#10114) - EricSiane
gengis is no longer employed at jagex and no other jmod has continued to communicate as much as he did about mobile/hd client. So it's pretty unknown what they are working on atm
This pr has the same fundamental flaws as your hub pr and seeing as it looks LLM generated, I'm not sure you understand what I mean.
refactored to use OverlayAnchorManager and integrate anchor rendering into OverlayRenderer
815769a update shortest-path to v1.17.21 (#10143) - Skretzo
was this plugin removed or renamed? because I can't find it in the hub
been rummaging through the api docs and cant seem to figure out how i would get the model id from a graphics object.
i want to use client.loadModel(int id) but Model doesnt have a getId() function.
After loading the model i want to spawn it using client.createRuneLiteObject(). Currently I am able to spawn the object by fetching the model using client.getGraphicsObject(). But I want to spawn the object when I want, is this not possible? 🤔
please let me know if there's a plugin code i could look at to understand 😄
Some hub plugins failed to build against the latest RuneLite version, this means that they're not available until the owner updates them.
We don't provide builds of pluginhub plugins for snapshot versions. Usually you can pass -Drunelite.pluginhub.version=<current RL version> as a VM option to load the plugins built against the release into your build, which will work if there are no ABI changes. If there are ABI changes, build the plugins yourself and place them into the sideloaded-plugins directory when running in developer mode.
Question, do you have to use Jetbrains or could you use VS code?
You can use either
just need to have the right JDK right?
The build guide might look a bit different
But it can’t be too hard to set up because the amount of ai generated from vs code that people submit
its helpfull when vibe coding but only if you get what its doing.
Type
Incorrect behavior
Operating System
Windows
OS Version
Windows 11
Bug description
Item Charges plugin is not showing potion doses for Extended Stamina potions. Not sure if this is isolated or an issue with the new sailing potions
Screenshots or videos
RuneLite version
RL version: 1.12.11
Launcher version: 2.7.1
Logs
[launcher.log](https://github.com/user-attachments/file...
675d39a update flipping-copilot to v1.7.14 (#10098) - jptrs93
5835227 update immersive-ground-markers (#10129) - Xyriella
this would also help with kraken task marking the sailing ones
<img width="564" height="466" alt="image" src="https://github.com/user-attachments/assets/159006ee-8f4b-4226-8d7b-8adf1d52693d" /> I assume kraken boss task also marks the cave krakens incorrectly as well
ItemComposition#getHaPrice() says "Get the high alchemy price for this item. All items have a high alchemy price, but not all items can be alched."
From what I can tell if cache param 295 is 1 then the item is not alchable. If this is the case, would it be worth either setting the haPrice to 0 or somehow exposing that?
you can call getIntValue on ItemComposition to get at it if you want. I wouldn't be opposed to changing getHaPrice though
It seems like it would be an improvement to things like the Item Prices plugin among other things.
bingo chapter 8 has hit the second tower
I've seen some other projects have essentially a canned response they give to prs that are ai-written
maybe it would be good to figure out some wording for that
“begone sloplord”
naturally i asked chatgpt to write me one
Our project does not accept AI-written pull requests—not because we object to AI use in general, but because it adds friction without adding value. If we wanted AI-generated code, we could generate it ourselves in a form that matches our expectations and constraints. When a contributor submits AI-written code, the maintainer still has to do the same work: understand the intent, verify correctness, and ensure it fits the project. In practice, this often takes more time than simply writing the correct solution directly.
Additionally, reviewing AI-generated submissions tends to introduce an inefficient feedback loop. Review comments are frequently passed verbatim back to an LLM, which produces another revision that still requires careful human verification. This extra “hop” slows down iteration and diffuses responsibility for the code’s correctness. We value contributions where the author fully understands, owns, and can directly reason about the changes they submit. For this project, human-authored code leads to faster reviews, clearer communication, and higher overall quality.
wow
are you saying you're in favor of rejecting ai hub prs?
because that is most of them
no those are fine
ok
mostly im looking at #19780
if someone is trying to shove in contributions through an LLM without any understanding of what's going on, that adds literally zero value on top of just being fucking rude
llm code is a lot worse than normal human code since it will also lie in comments in a way that you wouldnt get from humans
like this is just a lie
like it makes sense to check them in render order
but this just isnt at all how you do that
and even if it was, its also missing locking, lol
i mean it would maybe be different if the person actually knew code and like the ai was just to sort of bootstrap it
but i don't think that is the case here
For anyone who uses IntelliJ, it happens quite frequently that it forgets all of the imports, as such. I thought that "sync gradle project" would fix it but it doesn't. Before, "repair IDE" would fix it, but it doesn't work anymore. Does anyone know what to do?
switch branches, wait a second and switch back or close and reopen
Whenever I use the "run" command it gives the following error:
Execution failed for task ':run'.
> Could not resolve all files for configuration ':testRuntimeClasspath'.
> Could not find lwjgl-opengl-3.3.2-natives-linux-arm64.jar (org.lwjgl:lwjgl-opengl:3.3.2).
Searched in the following locations:
file:/C:/Users/simon/.m2/repository/org/lwjgl/lwjgl-opengl/3.3.2/lwjgl-opengl-3.3.2-natives-linux-arm64.jar
> Could not find lwjgl-3.3.2-natives-linux-arm64.jar (org.lwjgl:lwjgl:3.3.2).
Searched in the following locations:
file:/C:/Users/simon/.m2/repository/org/lwjgl/lwjgl/3.3.2/lwjgl-3.3.2-natives-linux-arm64.jar
Possible solution:
- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
But since I'm not sure what the opengl is trying to do I don't know how to fix it
I'm on windows and it's trying to find linux things? Idk
That usually does fix it, but now I'm getting this additional error that I usually don't get
delete that folder from your .m2
the repository folder?
just deleting the lwjgl/3.3.2 folder should fix it
but you can delete the whole thing too
Thank you so much! When I ran it this time it downloaded a bunch of stuff, I'm guessing some of that stuff was invalid. Perfect!
this code isn't mine but in one of my plugins and the projectile.getX1 and getY1 are deprecated. They're used for getting the start position of the projectile. I had a look around and don't really see an equivalent way to do this anymore.
LocalPoint playerLocalPoint = player.getLocalLocation();
int wv = playerLocalPoint.getWorldView();
WorldView worldView = client.getWorldView(wv);
LocalPoint telegrabStartLocation = new LocalPoint(event.getProjectile().getX1(), event.getProjectile().getY1(), worldView);```
maybe
LocalPoint telegrabStartLocation = LocalPoint.fromWorld(worldView, event.getProjectile().getSourcePoint());
ahh completely missed that one tysm
#github message fyi i don't think this is actually 90k java. the diffs for those kinds of plugins got annoying to read and i was meaning to write some sort of greasemonkey to show me a better diff but i just haven't yet
cloning this repo took forever 
they probably need to move that static data out tbh
they're gonna hit the jar size limit
641e835 worldhopper: exclude pvp worlds from high risk ... - Adam-
I've excluded pvp worlds from the high risk filter https://github.com/runelite/runelite/commit/641e835535cc546d4618581d14283c62f3dfae35
hear me out, what if the bot detected duplicate prs and emitted a message
i literally wanted to make it explicitly say not to do it, not to suggest it
but there was pushback
@reef badger gave some good feedback on my PR, I am committing into the plugin repository transcript json files for quests.
Those files contain every dialog line for every character which is used to generate the voice over for them.
This also has the bad side effect of polluting the diff when I want to update my actual plugin.
I try to help by separating the plugin changes to actual isolated atomic commits, and then linking those in the PR description, but is there a better way for me to approach this?
I want to make your lives easier when reviewing my PRs.
They are used by a cli too within the repo to generate the voiceovers, they are not included within the jar.
i would rather nothing other than code exist in your thing tbh
can you put them in a branch?
hmm I'll take @rugged pivot and @rancid marten's advice and move it to a different branch
probably just do that yeah
you're already doing that for the db and sound files
and i recognize that will make your pr even bigger but that's fine obv
Yeah lol, I will let you know. Thanks for working with me around this.
one last big PR to move everything outand then others will be smaller.
like if you just had a small script and some fixed data i wouldn't care but this is every text in every quest in the game which is not really scalable
ping me here when you do it and i'll review it
+1250/-51521515 looks a lot better than +89000/-something
yeah i mean mostly that he talked to us about it and we know what he's doing
yeah true
also FYI in general to anyone submitting plugins -- it is helpful if you have a bunch of extra diff noise like this to just call it out at the top of the PR description so the reviewer has the context going in. i probably looked at this for like 12 seconds originally and just forgot that this was a plugin with a bunch of text so i closed the diff without reading into it
At the very least I include the specific commits in the PR desc so it will be easier to review, although I should have been more explicit about it.
I've updated the PR so now it removes all of the non-plugin specific files from the main branch.
ok that was faster than i expected
i'm not actually at my machine but i will review it tn
and yeah your description to me just read like a summary of changes which i just ignore those completely tbh (and also even if you're linking commits i would still have to look at every commit to make sure no other java changes were there, i can't just review those commits in isolation)
Resolved with helper method to check diary completion then display either bring rope or not.
VarbitChanged.getValue appears to return the wrong value for varps? Getting 1 when the real value is 8, for VarPlayerID.PRAYER20 in my example
I think if that was broken almost all of the client would be broken, so that seems unlikely
yeah I'm not too sure what's going on, but it's definitely the case for me with my example, I put in a println, .getValue is 1 and client.getVarpValue is 8
got an example?
@Subscribe
void onVarbitChanged(VarbitChanged varbitChanged) {
if (clientState == ClientState.LOGGED_OUT) {
return;
}
if (varbitChanged.getVarpId() == VarPlayerID.PRAYER20) {
System.out.println("PRAYER20: " + varbitChanged.getValue() + " - " + client.getVarpValue(VarPlayerID.PRAYER20));
}
}
I take rex pet out of menagerie and put it back in
PRAYER20: 0 - 0
PRAYER20: 1 - 8
updated with a @Subscribe example straight on the plugin
I think you also need a && .getVarbitId() == -1
the event being fired is for a varbit change, not a varp change, and you are seeing the value of the varbit
interesting... with varbitChanged.getVarbitId() == -1 my logging isn't being hit at all
that means that there are no bits in the varp that aren't covered by a varbit
it only fires varbit changed with varbitId == -1 if no varbits cover the bits changed
I see... and that checks out because the varbitId is POH_MENAGERIE_REXPET
I'll use getVarpValue if varbitId is -1 then, ty
252ca4f Update osrs-chatlogger to v1.1.0 (#10171) - NullBotOSRS
Add the sailing potions to the item charges plugin
Fixes #19787
beaten by a few hours
to what extent should we be concerned 19792 is adding different potions to 19789
are you sure they are not just, not alphabetical
oh i guess haemostatic is here
one is adding an extra potion compared to the other
dressings arent exactly potions but they basically are
Old School RuneScape Wiki
Haemostatic dressings are a potion-type item that cures bleed when applied, healing 5 Hitpoints if bleeding was stopped via its use. It is made by using cotton yarn on haemostatic poultice, requiring 56 Herblore and granting 100 Herblore experience; though not a true "potion", the amulet of chemistry acts as normal when making haemostatic dressi...
"potion-type"
you can decant them at the ge. potion enough for me
i would agree with that thought process
if mr the decant guy recognizes it as a potion, it's a potion
Looked while I was at work, didn't check again after 🦥
apparently the wiki does not know he decants them, but I do
First time I've built since the gradle switch and no messing around though so that was nice
The amulet of chemistry procs when making them and they use potion delay when consuming them so they felt enough like potions to include them in my mind
[runelite/static.runelite.net] branch deleted: 1.12.4-19371482354
[runelite/static.runelite.net] branch deleted: 1.12.4-19396591623
[runelite/static.runelite.net] branch deleted: 1.12.5-19493146954
[runelite/static.runelite.net] branch deleted: 1.12.5.1-19498995076
[runelite/static.runelite.net] branch deleted: 1.12.5.2-19505412833
[runelite/static.runelite.net] branch deleted: cache-code-2025-11-20-rev235
[runelite/static.runelite.net] branch deleted: wiki-data-2025-11-21
[runelite/static.runelite.net] branch deleted: 1.12.6-19585974426
[runelite/static.runelite.net] branch deleted: cache-code-2025-11-26-rev235
[runelite/static.runelite.net] branch deleted: wiki-data-2025-11-28
[runelite/static.runelite.net] branch deleted: cache-code-2025-12-03-rev235
[runelite/static.runelite.net] branch deleted: 1.12.7-19898884479
[runelite/static.runelite.net] branch deleted: wiki-data-2025-12-05
[runelite/static.runelite.net] branch deleted: 1.12.8-20096547646
[runelite/static.runelite.net] branch deleted: cache-code-2025-12-10-rev235
[runelite/static.runelite.net] branch deleted: wiki-data-2025-12-12
[runelite/static.runelite.net] branch deleted: cache-code-2025-12-17-rev235
[runelite/static.runelite.net] branch deleted: wiki-data-2025-12-19
[runelite/static.runelite.net] branch deleted: 1.12.9-20376515721
[runelite/static.runelite.net] branch deleted: 1.12.10-20418220719
[runelite/static.runelite.net] branch deleted: wiki-data-2025-12-26
[runelite/static.runelite.net] branch deleted: wiki-data-2026-01-02
[runelite/static.runelite.net] branch deleted: 1.12.11-20765869388
[runelite/static.runelite.net] branch deleted: cache-code-2026-01-07-rev235
so many old branches
Same here. Using new GPU plugin. It is fairly rare. I don't remember it happening before sailing.
Windows 11 event viewer logs:
Faulting application name: RuneLite.exe, version: 0.0.0.0, time stamp: 0xa599537e
Faulting module name: d3d9.dll, version: 10.0.22621.5415, time stamp: 0x63764763
Exception code: 0xc0000005
Fault offset: 0x00000000000cda5a
Faulting process id: 0x0xA1C
Faulting application start time: 0x0x1DC84735F00CED5
Faulting application path: C:\Users<REDACTED>\AppData\Local...
@rotund pier hi, I found your bronzeman plugin on the plugin hub repo and am very interested to do early testing (before it goes live on the hub because the review might still take a while). I sent you a discord invite to talk more. Hope you're open to this :)
how do you guys deal with secrets that you dont want in the runelite/plugin repository but the plugin needs to have?
user needs to input those manually and not show them to anyone else
ah okay, i was thinking for things like external services like databases and things
you cant have secrets in open source software nor java really
you'd need to put it behind a web service or have user input it
yeah i thought as much. thanks for the responses
would it be a "bug" to say that a bank tag layout's export sometimes uses the palceholderId? (if that is what was used to create the bank tag) I noticed when exporting my bank tag for potions:
banktags,1,potions,249,layout,0,15196,1,249
15196 is the grimy guam leaf's placeholder. It doesn't impact runelite but it is odd
Type
Incorrect behavior
Operating System
Windows
OS Version
w11
Bug description
the blue spec regen bar is faster than the actual regen. fyi ive never used a lightbearer or such on the account
Screenshots or videos
No response
RuneLite version
1.12.11
2.7.5
Logs
No response
Type
Incorrect behavior
Operating System
Windows
OS Version
Windows 10
Bug description
Since I've turned on entity hider I've not been able to "finish" my frog events, due to the entity hider hiding the princess/prince.
It only shows the one that stands next to you.
Screenshots or videos
No response
RuneLite version
RuneLite version: 1.12.11
Launcher version: 2.6.4
Logs
I scrolled through the logs, but I see no specific logging regarding the entity ...
It might matter for variant items like charged jewellery.
For Guam leaf it certainly won't make a difference.
Did you ever happen to look into it? I've just been busy haven't made time for it yet
Haven't noticed that either hunter rumours or shortest path addressed the misbehavior after the fairy ring change, so not yet a common solution I'm aware of
00ae003 update presence-checker to v1.1 (#10099) - itsdukey
I'm on Hyprland 0.53.1 and it seems they changed windowrules. None of the above worked for me on this version. This is what worked for me.
windowrule {
name = runelite-tooltips
match:class = ^(net-runelite-client-RuneLite)$
match:title = ^win(.*)$
no_initial_focus = true
}
Same here tbh
[ https://github.com/frolv ] [ @strange kettle 691690997754757211 ] frolv#0
@upper valve thanks for taking the time to review!
i'll make sure to keep the scope of all future changes small 😂
we actually got blert before gta6
This excites me more than gta6 im ngl
average for the rik
My 29 files and 5005 additions one was nothing compared to that
Oh, but mine was 48 files and 11215 additions initially, not bad ...
at work I'd be tempted to reject anything over ~500 lines 😅 I suppose the way the plugin system works does kinda encourage big PRs here though
in total, lots of small PRs > less big PRs
but that wouldn't really be feasible for plugins
this does not mean we're also getting bronzeman unleashed and modern chat tomorrow btw
its easier to PR yes, but easier to develop?
you also have to review code quality for work
for hub plugins, that is not one of the criteria
ah fair yeah, that makes it more reasonable haha
hence the hub quality™ meme
Sure it can be more difficult, but I still think being in the habit of thinking about how to break things down into smaller more manageable chunks is a positive overall
it depends really i guess, green field this is easy, but a large complex system, unless its a minor feature, good luck 😄
where is the line for large complex system? 😄
501 lines?
At work I just type LGTM and hit the 👍
if i were to reject all code over 500 lines, Devin would never get any work done in my job, and as they keep telling us "Devin is a 90%/10% tool, it does 90% you finish the last 10%, oh and your performance is based on how much you use Devin, whilst keeping your ACU usage per session below 20, have fun"
limiting the scope of PRs to small incremental changes probably helps Devin with context too 😉
again depends on the system
I didn't know line count was such a factor. In my PR I fixed the unusual indenting that previously existed so it's marked every line in the file as being replaced. It's a small update, but I'm suspecting that's why it hasn't been PR'd yet.
im all for uncle bob and clean code, but i find there is such a thing as over refining the code which adds complexity
leave a comment saying to disable whitespace changes
my favorite thing i ever merged on the hub was boolean inWildy { return player.y > 5000 }
their pr is like 300 lines it really doesn't matter
that gets the hub quality™ stamp of approval!
@narrow sentinel your pr hasn't been approved yet because the volunteers that review PRs have not gotten to it yet
also every time you comment on a pr you update it which pushes it to the end of the queue
I can't wait to PR a single regex change for NER because jagex hates me personally
what
must be a cat
i know some of these numbers
I didn't know that. Should I still leave a comment to disable whitespace changes or is that just going to cause myself trouble?
your diff is 300 lines it's not a problem to review at all
anything under 1k i will pretty much look at without raising an eyebrow, 1-2k is okay, 2-3k is iffy and beyond 3k you should probably stop
Sry im inexperienced, how do i check how many lines?
go to "files" on the pr
no
no?
that would be the diff for the marker file
they need to click the diff linked by the bot
sorry yeah
Ah, ty sir
also the "queue" is not an exact science and i'll jump up and down it to skip bigger prs or grab smaller ones, just depends on how much time i have
i am pretty sure all of the people that review prefer the former
I've had the same issue. It is specifically with "Hide others' random events". The frog event spawns a few frogs, but it blocks all but the one who originally talks to you. The prince/princess frog is always hidden with the rest. My workaround has been to just disable entity hider when I get the event, though, of course, that is very inconvenient.
Oh that is annoying
Yeah there's not a good fix for that afaik
Would at least be nice if it didn't hide the prince/princess frogs for everyone, like how the strange plant isn't hidden for other players
Could it just unhide all prince/princess frogs for a min or so when a Frog Herald for the player appears?
yeah that could work
my clan did a bingo last week and all we needed was Dink pretty much
Make them all core
Absolutely not
booo
@DBADoubleG
Thank you for helping with the extra explanation! I only figured out at the time of posting that it is the entity hider that causes this. I'll use your workaround next time.
Are WebSocket clients allowed in plugins?
there is one in okhttp that you can use
[runelite/static.runelite.net] New branch created: cache-code-2026-01-14-rev235
Would you mind explaining which scripts you're referring to? Want to take another look at this
idk, use script inspector by black listing everything that runs every tick and watch the console as you open it
then search the cs2 lib for them to see if that's right
I did a PR in Hunters Rumour, that should fix it. The dynamic child needs to be updated every gametick
How do you interpret the "value frequency" charts on Chisel varbit viewer? Trying to figure out where (around 450) is the varbit for ToG being ready for the week
These charts in particular
Or do we have a better way now to find not yet named varbits?
consult VarPlayerID.java and VarbitID.java here https://github.com/runelite/runelite/tree/master/runelite-api/src/main/java/net/runelite/api/gameval and most likely they will have a name for what you're looking for
iirc this just means they've recorded the value being set to 1 122 times, and specifically the jump from the old value being 0 to 1 122 times
did this feature ever get added? it would be really useful, and I'm not opposed to an end of string syntax that supports operators like >= <= ? was a great idea, that got boldly misunderstood almost immediately and dismissed, to which the OP responded in the same regard, and then got demonised for it 😆
item<xworks yes
if this is true, then that is massive, thank you for such a quick response
Is there an API to tell if the client is minimized, not just when its not focused?
you can use the swing api
I think you need to client.getParent() a few times to get the JFrame and then check that
Thanks, got it working
Type
GPU
Operating System
Windows
OS Version
11
Bug description
Since October/November of 2025 I'm getting this weird graphical glitch with the regular GPU plugin.
On the Legacy GPU plugin this does not occur.
It seems to specifically affect the farming guild herb patch.
I am using streched mode
Screenshots or videos
RuneLite version
1.12.11
Rev 235
Launcher 2.7.5
Logs
2026-01-15 09:12:20 CET [RuneLite] INFO net....
It seems to occur on most other farming patches, atleast in the farming guild.
[runelite/runelite] New tag created: runelite-parent-1.12.12
[runelite/static.runelite.net] New branch created: 1.12.12-21037526920
d37bd90 API docs for 1.12.12 - RuneLite updater
ac82455 Release 1.12.12 - RuneLite updater
quest-helper failed to build, have notified @copper pewter
yeah it's just some gameval object IDs that were updated, if zoink hasn't fixed it in a bit i also have push perms
zoink is on it
and port tasks
Updating now
curious why the plugin has been working since the update yesterday considering these are gameval changes?
no wonder I was having issues

Can I use Java 16 features in a Plugin Hub plugin?
no
Okay, just 11 then
Thanks for volunteering your time to do this. We appreciate it!
https://github.com/runelite/plugin-hub/pull/10203 they cannot be this stupid
im amazed you guys even try to talk to them
i mean my response to that would've been to close it lol, felan just got to the button first
lol i didnt even notice the diff was unchanged
yeah he literally just made a PR that deleted the EOL newline lol
the vague comments and flame seem unnecessary just say its invalid, close it, and move on
i was mostly trying to figure out if they were actually trolling or if they were trying to do something ill-guided, it was the latter
they probably just dont know what they are doing
you didn't really ask a question that makes sense if they don't know what they are doing
ok
something like "this is not updating the plugin because there are no code changes here" would be ok
my final comment did say that
yeah, I mean instead of just replying "what are you doing"
does anyone other than llemon have write privs to sailing?
i thought abex did
.. hes probably asleep
i would think abex if anyone
idk just transfer it to your repo i doubt she's gonna care
is she gone for multiple days?
On Windows, is RuneLite's bundled java.exe accessible and if so where? Mac user here
%localappdata%/runelite i think
thats me
Show the tree protection icon on the time tracking pane if the Falador diary message is in the chat
i tried to fix the sailing plugin
text check holy moly
i opened a PR to fix it but it seems like the creator is MIA

but Adam reverted the client update so if you restart the client it will be back
oh nice
what broke
Cargo hold gamevals
the release got reverted for unrelated reasons so its fine atm
oh ok
that said i have a gradle problem where it doesnt pick up runelite.version changes
saw that too yeah i'll look at it later
Can a config have another config's value as default?
i think no but im not sure
you can make a constant that is the default of two different configs
why does this pass checkstyle?
Built this and sideloaded into client built from latest master and it still works.
But one currently on hub also worked so not sure why.
I built from master though and sailing plugin didn't have any incompatibility issue.
Also that PR llemon linked only seemed to be adding more gamevals not changing any so not sure what was missing or incompatible at first glance.
all the _OPEN's are removed in that PR
Right sorry I tried building with latest.intergration and saw that now.
I think I see why it still worked. The gameval didn't actually change for the one being used in game. I guess the _OPEN form was not actually in use?
When I open my cargo hold or put items it in the ID never changes nor does it change visually.
They made them multilocs is what I saw, so the one they spawn should still be the same
I am experiencing the same issue. It looks like if you mark a tile on another players boat the marked tile will show up on ALL boats. The only way to remove the marked tile is to find that player's boat and unmark the tile.
[runelite/static.runelite.net] New branch created: wiki-data-2026-01-16
13d426c Update wiki data - RuneLite Wiki Scraper
does sailing plugin need a hold-for-release or can i merge now
you can merge now
Have a question regarding my PR that was merged yesterday. For some reason, the upload job was skipped. Was that on purpose or does it have to be run retroactively to get it live? https://github.com/runelite/plugin-hub/pull/10189#event-22077218533 / https://github.com/runelite/plugin-hub/actions/runs/20986094232
you are looking at the pr build, not the merged commit
but since we reverted the release that your plugin was built on, it won't be live on the current client
we will build another release some time tomorrow, which will have it
Ah, I see. Alright, thanks! 🙌
Okay so there's a big PR for Bronzeman Unleashed on the hub rn and understandably, there has not been much movement to get it reviewed because it's a pretty big plugin. I am very interested in getting this plugin through the process as I'd love to play the mode myself, without having to hack it in with a custom client or starting in dev mode all the time. Can I somehow contribute to the reviewing process? I've done some plugin contribution myself, and am open to learning/studying the reqs for a plugin to be allowed on the hub, or learning from other reviewers to gain some experience. Basically, how can I become a reviewer, and would I be allowed to focus only on specific plugin projects?
for such a big review it basically just falls to whenever I get the chance
Does your response also imply I cannot become a reviewer at all currently?
Another option about which I spoke to elertan: would it help if the plugin got re-PRed with a smaller initial footprint? We'd basically nuke most of the features and keep a (hopefully) much lower LOC count base plugin. We could put other features on a separate branch and PR them in more incrementally.
Alot of the code has to do with game events of group members getting broadcast to the others, and syncing rules and unlocks, but the first version could exclude the group play part entirely, for example, to make it more easily reviewable
No, reviewers are invite only
Yes, a smaller version would likely be reviewed quicker
Depending on how it was written you could just point to an earlier commit than your latest one
Unlikely to work, it was under pretty heavy development with bugfixes and stuff. It probably works better to remove stuff and cherry pick them back, or create reverts later or something. But thanks for the idea :)
Type
Incorrect behavior
Operating System
Windows
OS Version
25H2
Bug description
Tags are not changing the outline of items, filling them instead
Screenshots or videos
RuneLite version
runeite ver: 1.12.11
Launcher ver: 2.7.6
Logs
Hi, can i add another warning in my plugin? since my plugin shares screenshots to a discord server unless disabled in settings
for example:
warning=This plugin submits your IP address and comprehensive records of your account activity and progress to a 3rd-party server not controlled or verified by the Runelite developers. This plugin will share screenshots to a discord server unless disabled in configs.
it would just be in the first line along side ip, etc
that would be fine, unless i could change it to a newline with \n i guess
it is html
How long after a merge to master does it take for plugin hub to update?
normally a couple of minutes, but because we reverted the release it won't be until we build another release, probably later today
Appreciate the quick response!
FYI my personal limit for a new plugin is ~5k as viewed through https://codetabs.com/count-loc/count-loc-online.html
i made a mistake of refactoring my PR at the same time as adding new features - lesson learned 🙈 - separate PRs next time
Thanks for the indication, I'll talk to elertan and see how much we can reduce it :)
I'm looking for a way so get the item id of a clog unlock when it happens. Is there a way I can pull it from the toast notification overlay?
Does item movement in the bank (aka bank organizers) have to be one click per item movement?
[redacted my original answer because i'm not sure what your intent is]
Okay, that's what I felt would be the case
could you clarify how you intend this to work?
I dont think we would want a plugin moving an item at all regardless if you're doing it one at a time
If you are talking about making a plugin that moves items in the real bank, no we wouldn't want that.
you are free to use the layout feature of tagtabs
@quaint escarp my original answer was a bit misleading. a single click that automatically moves an item in your bank somewhere wouldn't be allowed even if it was one item at a time
(players often cite the 1:1 rule but that was NEVER an official jagex position. players made that up and i'm pretty sure LLMs also believe it now)
it would use menuaction.widget_target (grab widget ids) i think
But what I could do is just have it recolor heatmap esq for each tab
So player's manually just drag colored items to the correct tab
Thanks for the clarification - this seems fine to me since you're essentially just showing where the user should drag the item
isnt there a bank organizer plugin already?
There is but it doesn't go as much in-depth as I desire
https://runelite.net/plugin-hub/show/bank-organizer
I want an endstate which is more or so organized with tagging suggestions based on bosses. So if a player wants to gear up for a boss the tags can be acquired (highlight relevent items, player tags)
So surface level organization, then tagging for niche activities
ok
Type
GPU
Operating System
Linux
OS Version
Pop!_OS 24.04 LTS
Bug description
logs included, just updated the system NVIDIA driver and now it can't find a frame buffer config. every time I try to switch on GPU or 117 it just spits that error out in client.log
Screenshots or videos
No response
RuneLite version
RuneLite version: 1.12.11
Launcher version: 2.7.6
Logs
[client....
already did that
<img width="734" height="211" alt="Image" src="https://github.com/user-attachments/assets/42aab74d-2a54-482c-a1e7-80d62933522b" />
fucking unlucky ig
Why does it say uninstall complete
thats a great question
I just decided to force the driver into the sandbox and now gpu plugin works again, here's the list of commands if anyone is facing the same issue
ce83baa client: make processResources depend on project... - Adam-
[runelite/runelite] New branch created: 1.12.12
[runelite/runelite] New tag created: runelite-parent-1.12.12.1
[runelite/static.runelite.net] New branch created: 1.12.12.1-21078885279
d0b6da2 API docs for 1.12.12.1 - RuneLite updater
724b1f9 Release 1.12.12.1 - RuneLite updater
Does anyone know what the varbit XPTRACKER_SLAYER_MULTIPLIER does? Also, why on a kill, XPTRACKER_SLAYER_LASTKILLXP changes to 1/2 recieved amount, then to the actual amount?
Maybe something to do with kill credit for the monster? Since you get half xp if someone else damages it
Are there any rules/limitations on what a plugin can include or display in their README file?
For context, I'm asking because I recorded a gif of the plugin in action and wondering if I need to edit it due to some vulgar language and possibly vulgar imagery
Can share the gif if needed
I am curious what the heck could be in this gif lol
lmfao
i'd say you shouldn't really be allowing sexual content
The plugin has no control over the content of the emojis, so that's up to the users themselves.
at least don't show it in the readme i guess
in general there aren't really rules rn for what can be in a readme but i'd imagine use some common judgement there
Totally fair, was a moonshot to begin with lol
Summary
String.format internally creates new Formatter(), which in turn create a new List & various other PODs to help the formatting.
Instead, the formatting has been expanded out using a String Builder to remove all allocations other than the built string, removing garbage generated between collections which was in the ballpark of 300 MB and sometimes more.
Testing
To confirm the formatting is the same, I added asserts comparing the previous String.format to the new
...
It messed up the profile I left running for awhile so 🤷♀️
Did you make that PR using ai? The PR body says it adds asserts to confirm identical behavior but that's not in the changes themselves
Lol no, thats testing done. Wouldn't make sense to leave the String.format in just for the assert 🤔
(I was going to say that asserts at runtime aren't the right way to confirm things are working)
You could add some tests to check that
imo the problem here is more this is doing a ton of string formatting to generate a snapshot when it never uses it
Indeed, it would also be beneficial for getStartGoalXp to exposed on XpTrackerPlugin instead. Would avoid the need to call getSkillSnapshot
the entire xp tracker plugin got sort of over engineered in like 2018 and ive been trying to unscrew it up since
Yeah, Seeing @Builder in rendering hot path made me think so too
Less/simpler is more, more often than not 🤷♀️
Anywho, seemed easier to fix the formatting than to touch XpTrackerServiceImpl (Which I imagine would have a large bug surface area potential)
Technically all of those functions could be changed to getSkillState with the appropriate getters exposed, I guess.
(Seems like the idea behind Snapshot, is as it says on the tin, but it defeats the purpose to then grab only a single property off it)
I've been chasing nothing but this idea for years and it's undone a lot of brain damage from my development as a programmer.
Anyone know a way to distinguish the GE search box from the mermaid item puzzle search box?
quest helper has some check for this
I have a fair few updates to do to my plugin, is it preferred that i do more smaller PRs with less of these updates or all at once? Im just conscious that larger PRs are less convenient for reviewers to check, i think i already know the answer, but i didnt want to annoy people with many one after another 🙈
Yes they prefer multiple small ones to one large one
as i thought thanks
what pr is this
not made them yet, although i do have a PR currently there its been dealt with and will be merged soon i think.. im just thinking best practice going forward
i tell people that if you don't want me to skip it keep it to 1k or less. 1-2k is okay i just might not get to it immediately. much beyond that is questionable
thats my thought process haha, plus i hate it when i get a large pr at work, so i know the feeling, and you guys aint getting paid for this so wanna make it as easy as i can
right
f062813 add discord-boss-kc-json-uploader (#10185) - BMG334
ced8cdc timetracking: support Falador elite diary patch... - Adam-
added in ced8cdca0a9e2992a549934503e9c847ab7c2b87
this is just rude imo, don't do this
hmm?
as in my reaction, or what they did sorry?
what they did
im trying to see how they even managed to PR it..
oh did they create the file just leave it empty?
Choicer should probably make sure their readme isn't so copy-pasted
i'll make an issue
Type
GPU
Operating System
Windows
OS Version
Windows 11
Bug description
Hey, I'm submitting this report for a friend.
For the last 2-4 days, he has been having massive issues with RuneLite. After troubleshooting for a few days, even factory resetting his computer without any luck, we found out it is a memory leak issue. EventViewer told us a few times his RuneLite application was using 19GB of memory when his computer started to act weird. RuneLite crash logs also tell...
that crash log does seem to be an 11 minute oom
there is no correlation between 1.12.12 and ooms
shrug
at least if there is its so small i cant notice it
i also dont have an arm machine so idk
cool - does this mean my plugins gonna be added? sorry first time making one
it has been added
great thanks for reviewing 🙂
typically takes a few mins to go from merging a PR to that showing up on the hub
it's there
thanks!
for updating the plugin, am I right in thinking I just make a new branch of forked plugin-hub + update commit hash + pull request?
yep
cool thanks
the readme has a section on that w/ some commands
out of interest, since ai tools have become more prominent have you seen a massive rise in plugins appear?
yes
Yes
90% of submissions are ai-generated
it sucks
mine was written with the help of claude code. i know how to program but idk java so was good for me
imagine theres a lot of slop shit though
(my own personal opinions about AI aside) it doesn't really make a difference to me other than AI sometimes does funny things
we don't review plugins for being correct, just for whether they break rules or hack you, and to some extent we check whether they won't destabilize the client. AI code isn't really easier or harder to review in that sense vs. something that was written by hand
can you overlay this graph with the "number of ritkens" graph?
did you just synthesize that somehow or are there metrics
yeah, my opinion on it, its a great tool, but its still a tool, you have to maintain it, check it, and understand what its doing. Not gonna lie and say i dont use claude for development.
I think my major problem with ai is, vibe coding, like its so easy to let it just do it, and not understand it/learn from it/correct it. Im not a java dev (okay c# isnt too far off) but i reviewed my own code, and did my best to actually learn the tech a bit as well
Its based on creation date of files in /plugins for the plugin-hub repo
i am guessing that spike at the end is when i got merge privs lol
that 2026 is a steap climb though considering were only half way through
i think that actually just correlates to me
i got merge like a month or two ago and i reviewed a lot of new ones
If you could try bisecting that would be helpful in narrowing this down, if it is a real issue. That said I don't see any correlation between 1.12.12 and OOMS; though if it is limited to only eg Windows+ARM it probably wouldn't stand out enough in my data to easily tell.
Hey, thanks for your response!
It could be Windows-ARM related. He is using Samsung Galaxy Book 4 Edge, which uses an ARM-based CPU.
It's hard to analyze further, since the logs doesn't give us much information prior to the out of memory exceptions. In his client.log file, I found these two exceptions at similar timestamps to when he notices issues:
2026-01-17 15:46:09 GMT [Client] ERROR n.r.client.plugins.gpu.GpuPlugin - error swapping buffers
java.lang.RuntimeException: unable t...
how much u recon is generated by people who have 0 idea how to either code or java. Im guessing half
for new submission's probably 98%
that was my 90% figure
ah well, thought less was clueless people. Thanks for reviewing all the shit ppl send in (myself included)
Thanks
Hi, i'd like to repot the same issue. I am running Runelite on ARM64 Surface 7 Laptop. Also seen it reported here: https://www.reddit.com/r/2007scape/comments/1qaa7qs/runelite_memory_leak_arm64/
Attaching a snippet of the jvm_crash log for reference.
`#
There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate
Possible reasons:
The system is out of physical RAM or swap space
...
Can I have a maintainer look at this PR please? Single line change hotfix for a bug that can break the chat widget if the user has split private chat enabled.
https://github.com/runelite/plugin-hub/pull/10226
Thank you so much ❤️
gotchu
Thank you so much
issue still persists, i have noticed upon login the plugin does not work entirely and have to disbable and re-enable it for it to function entirely
I'm not very familiar with gradle and maven so maybe someone can say something useful here. I can't get my plugin to build correctly with mavenLocal() in my repositories. It also causes the IDE to throw a wall of red cannot resolve errors at me. When I remove it and refresh gradle deps, my IDE stops complaining and builds work fine. Is this some kind of issue in my local maven repo?
Is the local repo just used to cache stuff, provided I don't do other java development and publish things to this local repo?
you can remove it from your repositories safely
you can publish a local rl-client build to it, then use that build in hub plugins
you can also just delete the artifact that is broken from .m2 and it will be fine
Does using mavenLocal automatically build the plugin with a local rl-client build, if I ever published one?
not unless you build a release tag
Does building on its own publish anything? Or do I need to run a gradle script explicitly to build a release tag and publish it locally
you would gradle publishToMavenLocal in the rl repo, then set your phub rl version to whatever you just built
I see, I've never done that, so that wouldn't be the reason my plugin is breaking on mavenlocal
yeah, your maven local is probably just in a state that gradle doesn't like
If I purged my local repo with mvn dependency:purge-local-repository, that might fix it right?
I opened the folder and it has loads of packages in there, but not stuff that I ever published myself iirc lol
maven uses it as a cache mostly
So it's like deleting yarn cache right? Doesn't break anything and only result is having to re-cache it
yeah
Thanks abex :)
I deleted my .m2 when runelite switched from maven and never seen it show up again. So if you do not use maven for anything else I don't think it's needed.
Ah so it's actually unused?
I saw it still there in the plugin hub example plugin so I figured there was a reason to keep it
mostly
Except what you just explained about custom rl client builds
So maven is a build tool but also a repo standard right? Gradle can use maven repos but is a different build tool
yeah
So conclusion, delete ~/.m2 and mavenLocal() and use that included builds thing haha
https://docs.gradle.org/current/userguide/composite_builds.html
is this what you meant? I'll do some of my own reading instead of pestering you more haha
yeah
If you delete .m2 mavenLocal() will do nothing anyway.
you basically never need to do this unless you are modifying both core and a phub plugin at the same time
Let's say I need a client update for my plugin to be able to do some advanced stuff, that's when I'd need that. But I'm not at a point where that'd be necessary luckily haha
yeah
I've revisited this PR after receiving notifications, and upon review I found that since the commit was authored, changes have been announced to Blighted Overloads for the upcoming seasonal Deadman mode, which I want to bring to attention.
These were detailed under the section 'Miscellaneous Changes' of this post:
https://secure.runescape.com/m=news/deadman-annihilation-overview--rewards-blog?oldschool=1
Blighted Overloads will deal 5 damage to you (down from 25) when sipped. Your D...
Jagex's third party client guidelines: https://secure.runescape.com/m=news/third-party-client-guidelines?oldschool=1
Additionally, these features have been rejected or removed from RuneLite: https://github.com/runelite/runelite/wiki/Rejected-or-Rolled-Back-Features
5c28918 Update hotkeyable-menu-swaps to v2.5.19 (#10239) - geheur
ac1e1d9 Update weapon-animation-replacer to v3.7.16 (#1... - geheur
Is there a neat way to return data from a clientThread.invoke call back to the caller?
generally you use it from a thread that you aren't supposed to block, so no
if you are doing swing you will use SwingUtilities.invokeLater
I have a future that needs to get an item definition, I want some result of that definition to be usable in a chained stage of the same future
Please help me I’m 16 layers of clientThread and swingUtilities invokeLaters deep and I’m scared
Just make invokeLater return a future pls so I can use my sucky Java futures lol
you can use completablefuture
Yeah that's what I'll do haha
just remember that you can't ever call get() on it
unless you start your own thread
Otherwise it's a deadlock right?
down to one page 😄
I would assume this will affect all blighted overloads since they don't tend to maintain different dmm items across servers. (seasonal/permanent)
I would assume this will affect all blighted overloads since they don't tend to maintain different dmm items across servers. (seasonal/permanent)
ty mobile app for double posting
Besides adding the initial check for the capped lower bound for defense, I don't think we can really communicate that the repeated overload effect would lead to greater and greater defense drain over time. If you'd like to put in a PR to change the hitpoints drain (in advance of the upcoming seasonal), I'll be happy to merge it once that gets underway. Otherwise, I'm inclined to maybe just leave it be, since I don't think it's often that people will be drinking a blighted overload with their ...
Does Loot Tracker send a loot received for pet duplicates? I don't see it specifically checking funny feeling. I imagine it would if the pet got put in your inventory, but may not otherwise
Is there a good way to get NPCs killed by the player? I'm currently keeping track of who we're interacting with checking .isDead on the NPC but it gets a little weird with things like Gargoyles who can be killed without reaching 0 health
no
I think it's part of the server loot event, but don't really have a good way to know for sure
Does anyone know of a good way to determine if the user has their public chat mode set to off? Only thing I've been able to find is checking the text of the widget. Couldn't find anything with the var inspector.
I noticed the better npc highlight plugin ownership was moved to a repo adam owns due to issues it was facing with a runelite update and the author being unavailable to fix it
I've tried to take over that plugin in the past when the owner was being unresponsive, wondering what the long term solution for that plugin is right now
disclosure: I am partially asking because the original maintainer disagreed with a feature I wanted added, but there are multiple open issues asking for something like what I already coded for the plugin. I am interested in getting that feature in and also have the bandwidth to be a maintainer
I am definitely open to finding a new maintainer for it
send a pr and ill move it over to you
will do, setting it up
don't break it
Definitely not, too many people use it to be cavalier about significantly altering it
Is there a particular reason for the different behavior when sending a ChatMessageType.GAMEMESSAGE:
Client#addChatMessage- The text will not be highlighted at allQueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE)- All of the text after the firstChatColorType.HIGHLIGHTwill be highlighted regardless of the RL formatted stringQueuedMessage.builder().type(ChatMessageType.CONSOLE)- Works as intended
// Formatting idea thanks to Resource Pack plugin (https://github.com/melkypie/resource-packs)
String incorrectPuzzleMessage = new ChatMessageBuilder()
.append(ChatColorType.NORMAL)
.append("[")
.append(ChatColorType.HIGHLIGHT)
.append("Random Event Helper")
.append(ChatColorType.NORMAL)
.append("] " + "The puzzle solution was incorrect. You can type '")
.append(ChatColorType.HIGHLIGHT)
.append("::exportexampuzzle")
.append(ChatColorType.NORMAL)
.append("' to export the data to your logs and clipboard. Please share it by opening an issue on GitHub.")
.build();
chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).runeLiteFormattedMessage(incorrectPuzzleMessage).build());
this.client.addChatMessage(ChatMessageType.GAMEMESSAGE, "", "This is a test", null);
Someone asked if the data stored in raid data tracker could be shared via cloud save. I suppose the easiest format for this would be allowing for a user-input save location and letting them save to a Dropbox/OneDrive/etc folder. Is this the best option?
I think each raid completion data could feasibly be saved as a config item, but that seems like an extreme misuse of the config.
Would allowing custom save locations run into Windows permission issues if not running RuneLite as an Administrator?
It could, yes, though I'd expect a dropbox folder to be fairly permissive
If that was an option then I'm concerned with how applicable it would be with RuneLite's config syncing and making sure that those file locations were exactly the same across different computers and especially different operating systems. Almost feels like, at worst, I'd have to have path configs for different operating systems, and it'd probably just be up to the users to figure out a file system that works for them. Seems bleak.
Been a bit since I've done maintenance. The example plugin has Gradle 8.10 and Java 11 still. Any issues with Java 17+ or Gradle 9?
you can always refer back to the build guide on the wiki for how to set up a dev instance again
How to develop plugin-hub plugins: https://github.com/runelite/plugin-hub/blob/master/README.md
Happening to me too. Linux Wayland
Hold for anticipated update on SDMM/blighted overload.
This amends the HP drain from overloads from -25 to -5.
Ref:
https://github.com/runelite/runelite/pull/19254#issuecomment-3765197795
Type
Incorrect behavior
Operating System
Linux
OS Version
Arch Linux
Bug description
Ping grapher relies on the World Hopper plugin to measure ping. I noticed that on the salvaging worlds, there is no reported ping. All other worlds have ping.
Originally reported in https://github.com/yuh25/Ping-Grapher/issues/24
Screenshots or videos
RuneLite version
RuneLite version: 1.12.12.1
Launcher version: 2.7.5
Logs
Lo...
I can confirm it is still happening on RuneLite version 1.12.12.1 and even when 'Request focus' is set to 'Off'.
I'm not sure if the notification settings are even relevant at all here, because it also occurs when logged out.
that's a weird one, can recreate though
I changed the icon for RuneLite, but this folder icon is in fact RuneLite.
Someone's playing at work 😂
If I move a ConfigItem from one ConfigSection to another, keeping the same keyName, will users have to re-set their preference for that ConfigItem?
Nope, your users won't have to re-set their preference
Howdy, I joined to create my own plugin and im sure ill have questions about that, but a question ive had about runelite for a long time is related to the icons on the right side of the client. Is there dev work ongoing to be able to re-order those buttons?
or alternatively, is that something I could contribute to?
This is one of the most asked for questions and also one of the ones that is least open to contributors unfortunately
It's very hard to do well, correctly, and in a way that is agreed upon as what the UX should be
Most recently
doesnt surprise me that it gets asked often it would be a cool feature, but also makes sense that it has complexities
We've had multiple people submit approaches that failed to reach the bar for whatever reason and the biggest question still just remains, what should the ux be? Which really only goes down to what Adam decides it will be which needs to be decided before an approach worked toward
Is Adam the lead dev
Yes
cool
well, i currently dont know Java so im not gonna even begin to try my hand at an implementation
however, if I am understanding what you're saying correctly, it seems that the first blocker would just be presenting an acceptable ux
if I were to do that in just like ms paint or powerpoint or whatever, would that have the potential to get somewhere?
It has also been discussed to death, and many options presented, we have a plethora of options, please do not spend a bunch of time on this
or is it really something i should just stay away from (which is a fine answer)
I am only trying to save you your effort
100%, thats the answer i wanted to hear
It's genuinely one of the most talked about ad nauseam requests in the whole server
bc yeah im not tryna come in and be some big force or anything, just wanted to learn more about it
if u guys are working it tho I trust itll be completed over time
appreciate the info
if there was a way to do this as a hub plugin that ux problem no longer exists. Has anyone considered making an API for it?
Especially since hub plugin users are the ones who mostly have this problem.
it seems like it would be fitting XD
We generally don't let HUB plugins do things that run a risk of breaking core or other hub plugins
And getting it wrong could lock people out of their plugins or worse their whole client
what if it was just onsidebarbuttonadded(button b) { b.setpriority(7); } then at worst it could just screw up the ordering
Especially considering the config panel and the info panel are side panels
What is the easiest way to query this item "category" that I can see in the cache viewer? Is the meaning of the value documented somewhere?
the interface to modify that from the plugin would be mega jank but at least it would be a solution for people who have this problem
(to the extent it is a problem, I am a side panel hater XD)
well i think thats part of the solution tho, sounds like a solution that doesnt prioritize a solid ux is not on the table
just the implication im getting tho
that's why allowing hub plugins to do it would be so great. no quality standards.