#development

1 messages ยท Page 6 of 1

ember flareBOT
reef badger
#

i'd prefer it after i show him he's got a fake client

ember flareBOT
rugged pivot
#

but if the issue is persistent...

reef badger
#

not my problem

ember flareBOT
low hatch
#

Out of curiosity, anyone happen to know whether or not cache contains a list of transports like teleports, doors, stairs, etc.?

#

I know Shortest Path plugin adds transports manually so I am assuming it's not in the cache, but I'm asking just to confirm there's no way to extract it

rose void
#

does a plugin config only support primatives/enums or is there a way you can use classes

quick path
#

it doesn't support arbitrary classes, no

worthy sparrow
#

you can serialize something to a json string

rose void
#

eh i was trying to figure out if there was a way to put config groupings into logical classes, then show the individual config items in the plugin settings

#

but it doesnt seem like it

#

ive got like 150 configitems in 1 file and it bugs me

quick path
#

you could make a panel and manage that part of your config from there

rose void
#

I really dont like the state of panels and dont want to contribute to the problem

quick path
#

fair enough

ember flareBOT
trail marten
# ember flare

@rancid marten if you could add this before the next update that would be appreciated

#

I need it for a mass convert feature between btl and bt layouts

#

the second pr is not necessary

hollow lintel
#

convo was a while ago and apologies for ping but that's 'combat achievements tracker'

heavy bobcat
rose void
ember flareBOT
trail marten
#

ty!

rancid marten
#

almost could have an hasLayout() but I guess it runs infrequently

trail marten
#

yeah I had the same thought

ember flareBOT
glass sandal
trail marten
#

only costs 1-1.5ms

ember flareBOT
ember flareBOT
#

Test is running great on Intel Mac. Looks great as well!
<img width="2334" height="1692" alt="2026-02-18_18-12-24" src="https://github.com/user-attachments/assets/fce95e4d-7696-4aef-a5f3-3f83c374fb5c" />
<img width="2334" height="1692" alt="2026-02-18_18-12-20" src="https://github.com/user-attachments/assets/dcca6355-4b4a-4a6c-99b5-ab757c9e6795" />
<img width="2334" height="1692" alt="2026-02-18_18-12-15" src="https://github.com/user-attachments/assets/a0f766e1-24b7-4819-a503-09e9ec7956dc"...

ember flareBOT
#

@naturedamends The issue I've worked out is twofold. First, I believe my original instructions are incorrect and not what I was actually doing at the time. The options I gave in that post did make the launcher use the proxy, but when the launcher launches the client, that client doesn't inherit those options. The correct way to do that is by setting an environmental variable, like `export JAVA_TOOL_OPTIONS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080...

ember flareBOT
ember flareBOT
grim laurel
#

So, just want to check since it's been a while and I swear this used to work:
Made a PR for the hub, and it failed the check. Fixed the issue and force pushed the branch like I used to do, and the PR just isn't updating with the new contents of the branch at all (even though the commit on the PR no longer exists as far as I can tell).
Am I doing something wrong? or has the submission process changed in the past couple years
https://github.com/runelite/plugin-hub/pull/10651

trail marten
#

sounds like a github issue to me. never heard of this

solid shadow
#

first time I am seeing this happen

grim laurel
#

yeah I'm super confused

upper grove
grim laurel
ember flareBOT
snow needle
#

Is there any way to get these stack variants in my plugin without dumping them from cache to a file and loading from there?

reef badger
#

i dont think they're going to add a new coin stack so you can probably just hardcode them

snow needle
#

I need all stackable objects. I could hardcode it but I'd like a general solution.

reef badger
#

mmm

misty hornet
#

item manager, get item composition?

#

doesn't that have a return for variants

snow needle
#

I don't see one ๐Ÿ™

#

and the RuneLite ItemVariant mapping does not handle stackable variants AFAICT

misty hornet
#

yeah you're right, I don't see it either

snow needle
#

If I PR a change to add stackable variants to wherever item_variations gets generated would that get approved?

misty hornet
#

Can you look into how bank layouts does it? Doesn't that map for variants

#

Maybe not

snow needle
#

Looks like that uses ItemVariationMapping which isn't aware of stack variants

#

I think stack variants are only used for visuals of stack count > 1 so probably most plugins don't need to be aware of them

worthy sparrow
#

yes

#

what would core use stack variants for

snow needle
#

Probably nothing?

stuck shale
#

I think that is your answer as to why it's not done for core

snow needle
#

That wasn't my question, but I guess the answer to my actual question is "no"

upper valve
#

that is sort of the defacto answer for "can i pr x to core in the name of hub plugin y" but it's not wrong to ask imo

trail marten
#

you can generate images of an item with a certain stack count

rugged pivot
#

I think the only awareness core has of stackables is in generating images of them (eg for loot tracker) and the ItemManager has a thing for doing that by quantity, built from the cache i think

trail marten
#

but I doubt that's uesful to you

rugged pivot
#

oop beat me

trail marten
#

barely XD

rugged pivot
#

only cause I paused to look up if it does it straight from cache

trail marten
#

I assume it gets it from the client

#

where did you look this up? wouldn't that be closed source code?

rugged pivot
#

whatever this is

trail marten
#

oh I meant client.createItemSprite

rugged pivot
#

oh interesting ItemManager::getImage can take quantity and stackable bool

#

oh right itemmanager is using createItemSprite

snow needle
trail marten
#

I don't know if anyone has ever asked for this

#

oh btw I saw your plugin on reddit. that thing has legs it seems XD

snow needle
#

but it would be nice in general to have this stuff available unless there's a good reason not to expose it IMO

snow needle
ember flareBOT
low hatch
# trail marten only costs 1-1.5ms

Everytime I do bank options my game tanks FPS ๐Ÿ˜” must be nice only having 1-2ms Though I feel like potion storage is at fault ๐Ÿ˜‚

trail marten
#

not just on bank options

low hatch
#

I should profile it next time I get on

trail marten
#

how many tag tabs do you have?

#

this thing that I PR'd is done once per tag tab

rancid marten
#

Is it new since the recent changes?

low hatch
#

Not that many tabs, like around 10 IIRC

low hatch
#

Sorry for the confusion if that's what you both thought

ember flareBOT
trail marten
#

if a ConfigChanged comes in on the swing thread is it guaranteed to be from an actual user input on the config page?

#

I want to open a modal dialogue in this

#

And I'm paranoid that somehow something like plugin presets might somehow f this up and have it open at weird times.

rancid marten
#

no

ember flareBOT
arctic surge
#

I own the zulrah loot locator plugin, and I was recently approached by someone who is interested in making the same kind of plugin for locating where loot will spawn at leviathan. I suggested that these features should be part of the same plugin (toggleable in config), so there isn't a unique loot locating plugin for every boss.

Does rebranding/renaming a plugin come with any special hoops/obstacles to navigate?

upper valve
#

basically don't change the plugin class simple name or the hub manifest filename. you can change other things like the display name or whatever

arctic surge
#

gotcha, thanks for the heads up

quick path
#

Be aware if you change the plugin name you should set a configName on the plugin descriptor to ensure it references users' existing configs

reef badger
#

also while i do appreciate you putting the effort in to adding it as a feature for your existing plugin, if i'm understanding what your plugin currently does, you might need to make the levi one off by default

#

otherwise we're gonna get a ton of traffic about some weird square appearing in the fight

arctic surge
#

yea that sounds reasonable

upper valve
#

do these two bosses actually use like the same algorithm for this

trail marten
arctic surge
arctic surge
reef badger
#

can that be changed? cuz the example gifs show it changing spots

arctic surge
#

but I would be inclined to just have it off by default like felan said

reef badger
#

thats why i said that

arctic surge
reef badger
#

mmm

trail marten
#

but that's your choice I suppose

arctic surge
#

yea that is weird ๐Ÿ˜ญ

reef badger
#

i suggested it because of sote wall hider

trail marten
#

could check what the hp threshold is and disable it if it's > 0 maybe.

reef badger
#

adding a bunch of new bosses on by default

#

where did my walls go ????????????????????????????????????????

#

and 1 square is enough to confuse people, see default radius markers

grizzled aspen
#

more people should just utilize update messages for their plugins

trail marten
#

not implementable afaict if you didn't already mark that your plugin was previously installed.

#

that's something I wish runelite had natively though

#

onPluginUpdated() something like that

rugged pivot
#

add text to the tiles that says "this tile is brought to you buy the Loot Locator plugin"

low hatch
#

Anyone know off the top of their head if a plugin's #shutDown is ran

  • When a user gracefully shuts down RuneLite
  • When a user forcefully shuts down RuneLite (eg. power out)
    • _I'm assuming it doesn't run?
trail marten
#

I don't think it runs on any shutdowns

#

only if you disable the plugin

low hatch
#

Oh...

trail marten
#

onclientshutdown

low hatch
#

TIL. Thanks.

trail marten
#

won't help with power cuts ofc.

low hatch
#

Mhm, got it

upper valve
#

onComputerLostPower when?

rugged pivot
#

plugin that accepts graceful shutdown command from my UPS before my OS does

trail marten
arctic surge
#

is there a way to ship out different defaults depending on if the user already had the plugin installed vs. fresh install?

trail marten
#

no, unless you stored in the config that it had previously been installed

low hatch
# upper valve onComputerLostPower when?

Unironically would be nice for Plugin Presets plugin o7 Though I reckon it has something to do with having the file always open, and when a PC shutsdown it gets corrupted.

forest forge
rugged pivot
#

you have to first update the plugin to have taht system

forest forge
#

Wait, is that storing the entire UPDATE_CHAT_TEXT string as the version

rugged pivot
#

then update it again with the new stuff you wanna announce

forest forge
#

Instead of just storing 4.12.1 lol

#

I guess its one less variable to change code wise and you'd only save some storage space

rugged pivot
#

I think defaults are stored in the config file

ember flareBOT
forest forge
#

If so easy way to check for legacy users would be remove/rename a config option and check for old key in manager.

#

And then do what Pine showed moving forward if you want actual update messages

rugged pivot
#

as of this message, yes

topaz pierBOT
grizzled aspen
#

if you write it manually instead of via the config file i don't see why it would write a 'default' value, and the method i showed would work either way

quick path
#

I was gonna say, yes if you launch the client, all plugin configs will have some value written--whether that's the default, or a user-defined value

#

launching with a fresh profile will write default configs for all installed plugins (by default, only core plugins)

topaz pierBOT
snow needle
#

LMAO I was looking through the game's textures to see what all is available. I can't wait to replace the fire cape with some random king's portrait.

trail marten
#

fish net cape

#

stars look good too.

snow needle
#

I think those are from the magic tree. Will probably look cool on a cape

quick path
#

roof cape

rancid marten
#

So there is not an "animated model cache" so idk totally whare you are having a problem with

ember flareBOT
snow needle
rancid marten
#

its because the player model is cached and then after that you are modifying the item configs

snow needle
#

Shouldn't playerComposition.setHash fix that though?

rancid marten
#

no

#

PostItemComposition is more close to what you would want but it still wouldnt work correctly if your plugin is started after the player is already logged in

snow needle
#

My actual plugin uses PostItemComposition and sees the same problem even if it starts up before login

rancid marten
#

are you sure?

snow needle
#

Pretty sure, yes. What does playerComposition.setHash actually do then? It causes my changes to the item composition to reflect on the player for the idle, walk, and run animations, but not skilling animations.

rancid marten
#

it computes a hash derived of all of the player kit/equipment which is used to look up the player model from the model cache

#

you are modifying the item compositions themselves though which is different, the player hash just includes the item id

snow needle
#

So color replacements are not part of that hash then?

rancid marten
#

not color replacements applied to the item, no

#

youre confusing items and players

snow needle
#

Well every time I've looked at playerComposition getColorTextureOverrides it's been null

rancid marten
#

if you use PostItemComposition and apply the recolors there and then start your plugin before login, there is basically no chance it is broken

rancid marten
#

if i were to fix this i would take this route though

snow needle
#

Yeah that's right; the only way it fully works right now is to use PostItemComposition and restart the client.

rancid marten
#

idk if you would need to restart, you just need to logout i think

rancid marten
snow needle
#

For most animations it seems to snapshot the colors of the item compositions the first time the animation plays and cache that. That lines up with what you're saying regarding setHash's behavior.
For idle, walk, run animations, setHash does cause the player model to change

snow needle
rancid marten
#

I can expand the ColorTextureOverride api a little to make it so this works I think

#

it is a little tricky since the overrides only work if the existing item also has an override of the same length

snow needle
#

I'd be super happy if you do that!
I updated my repro plugin to split the cache reset and playerComposition.setHash into separate buttons. Based on what you said, "Step 5 Set Hash" shouldn't do anything because I didn't change any equipment, and yet it clearly applies the changes I made to the itemComposition in step 4. Is that a bug?

rancid marten
#

is getColorTextureOverrides() non null for you?

snow needle
#

No, it's null for every step

rancid marten
#

this would be easier with code samples

#

there are basically no bugs

rancid marten
#

but again youre not using the post item comp event

snow needle
#

oh let me add that

rancid marten
#

these inconsistencies happen when the player model cache is updated with a model prior to you changing the item composition in a way which affects the model

#

also the player model cache isnt exposed and is neither of these caches you are resetting

snow needle
#

I think everything you're saying makes sense except the current setHash behavior changing the idle, walk, and run animations.

#

Adding a postitemcomp event to recolor these items to black will not allow me to dynamically change their color so the repro won't work

rancid marten
#

it does, you just need to reset the item comp cache

#

but, again, it wouldnt reset the player model cache

snow needle
#

err.. I can dynamically change the color yes, but it won't demonstrate any different behavior is what I mean.

#

So do idle, walk, and run animations use the player model cache differently than other animations like mining? It seem so strange that these animations have different behavior with setHash.

rancid marten
#

no, they dont

#

also this has nothing at all to do with animations

#

it gets an unanimated model from the cache and then animates it after that

#

whether its walking or mining or w\e is not relevant

#

the mining anim is a different model though because the player has the pickaxe

#

or well it is if the player doesnt have the pickaxe wielded

snow needle
#

Will the player model hash be the same for a player wielding a bronze pickaxe and when playing the animation HUMAN_MINING_BRONZE_PICKAXE?

rancid marten
#

i dont know

#

maybe not

#

kind of looks like no

ember flareBOT
snow needle
#

Yeah it doesn't appear to be the same in my testing. I think everything you've said makes sense and aligns with what I see; I really appreciate the explanation.

So to summarize potential fixes for my issue:

  1. I need a way to reset the player model cache after changing an itemComposition's colors if I want consistency.
  2. PlayerComposition ColorTextureOverride API expansion would allow me to change colors per-player and would be nice to have, but wouldn't actually fix my issue without access to the player model cache
rancid marten
#

you wouldnt need a way to reset the player model cache if i improve the colortextureoverride api

#

since the overrides are hashed in setHash

ember flareBOT
rancid marten
#

I think

snow needle
#

oh gotcha

rancid marten
#

yeah

#
    /**
     * Get the {@link ColorTextureOverride} for a kit slot
     */
    @Nullable
    ColorTextureOverride getColorTextureOverride(KitType kit);

    /**
     * Create a {@link ColorTextureOverride} for a kit slot.
     * The ColorTextureOverride is initialized with the overrides from the provided item.
     */
    ColorTextureOverride createColorTextureOverride(KitType kit, int itemId);

    /**
     * Remove the {@link ColorTextureOverride} for a kit slot
     */
    void removeColorTextureOverride(KitType kit);

I made this

snow needle
#

That sounds perfect!

karmic fiber
#

Is there any way to replace an npcs attack/block/death animations? Seem to only be able to get idle and walking working.

rancid marten
#

just setAnimation() it right?

ember flareBOT
rancid marten
#

give this a try once its done deploying

karmic fiber
#

I found the issue, setAnimation() was indeed correct, it was just that the animation check was targeting the old npc id and not the new one I believe

ember flareBOT
#
[runelite/static.runelite.net] New branch created: wiki-data-2026-02-20
rose terrace
#

first time contributor; what's the turnaround time on the tests for a new plugin? i'm not asking about it being on the plugin hub, but it's been at the RuneLite Plugin Hub Checks for ~24h now. I guess i just don't know the process

glass sandal
#

Which pr?

rose terrace
#

10657

glass sandal
#

You have a new github account which requires a maintainer to manually run the action

rose terrace
#

ok, thanks. i didn't see anything about that

oak rock
#

Does it not say anything in your end that it requires us to approve it to run?

#

I clicked the run button now though

rose terrace
#

i saw an approval i just thought that was for adding it to the repo

oak rock
#

Yea i could see that being confusing

rose terrace
#

but thanks for the quick support guys. hope to keep contributing in the future

oak rock
#

If you're not familiar with the gh process, which most people doing hub dev are

rose terrace
#

not super familiar with working with others' projects, no. i just use it personally for version control mostly

ember flareBOT
rancid marten
#

were you able to check out the new api?

snow needle
#

How do I tell if it's released yet? When I tried last I got an error

glass sandal
#

In your build.gradle change the version to latest.integration

snow needle
#

I switched to latest.integration and I get the same error: java.lang.AbstractMethodError: Receiver class oj does not define or inherit an implementation of the resolved method 'abstract net.runelite.api.ColorTextureOverride createColorTextureOverride(net.runelite.api.kit.KitType, int)' of interface net.runelite.api.PlayerComposition.

rancid marten
#

add --refresh-dependencies

snow needle
#

Ok that fixed it. Yes it looks to be working!

#

I'm able to recolor items mid animation and it shows up on equipment as expected. I'll keep testing it but so far so good.

#

Thanks so much, Adam! ๐Ÿ™‚

rose void
#

does onNpcSpawned actually mean every time an npc is drawn on screen for the first time, not actual spawning

late hare
#

yeah, it's when the npc is sent to the client

ember flareBOT
ember flareBOT
#

I believe I've managed to get to the cause of this issue with some assistance from Claude & Ruffled (117 HD) and @IComplainInComments's tipoff.

It appears that the macOS window server is holding a reference to the back buffer IOSurface and occasionally re-reading it while it's being rendered into despite the CALayer's contents pointing to the front buffer. I came to this conclusion by:

ember flareBOT
#

Type

Incorrect behavior

Operating System

Windows

OS Version

10

Bug description

An unsuccessful devtools.highlights load from config renders the script inspector unusable

Screenshots or videos

Image

RuneLite version

RL 1.12.18-SNAPSHOT

Logs

2026-02-19 23:28:55 PST [AWT-EventQueue-0] ERROR net.runelite.client.RuneLite - Uncaught exception:
java.lang.NullPointerException...

brisk sedge
glad ermine
#

I was talking in 117hd discord about the possibility of rendering text in-game natively instead of using the client's text rendering engine. This could be useful to render arbitrary size text, so you could use custom size scaling. Or when playing with stretched mode, most of the scaling algo's leave the text looking a bit blurry unless you're integer scaling.

My very rough first draft idea for the api is like this:

  • have the client go through most of its regular text rendering composition stuff
  • as soon as the bounding box of the text is known, call a hook/callback
  • the callback, if registered can override the content of the text widget. It receives the bounding box of the original text and the desired string
  • the callback renders a different output in place of the original text widget
  • alternatively, the callback returns a widget with the custom rendered text but idk if you can have an arbitrary bitmap or whatever as a widget
#

This would require somehow having information about what text is being rendered and override the normal rendering process, so I think this would need to go into the injected client and be exposed through the api, so perhaps that already makes this infeasible, but I thought I'd just pitch the idea anyway lol

amber rampart
#

I have thought about this before, basically the hard part is you have to then scale all of the client's rendering too

#

not just the text

#

since they are all written to the same buffer

glad ermine
#

Yeah I realize there's two parts to this

amber rampart
#

which is also the same thing we use for overlays, so those have to be hidpi aware too

glad ermine
#

Let's say you only allow the same size box to be drawn, you couldn't scale up anymore, but you could change the font, I suppose

amber rampart
#

changing the font would mostly be just swapping out some sprites and a tiny bit of metadata

glad ermine
#

But you're still stuck with the client's glyph rendering right

amber rampart
#

yeah

#

if you wanted more complex glyph rendering you would have to swap out the client's font metrics stuff too

glad ermine
#

Does stretched mode render the regular interface and then scale it up by some fixed factor based on the size of the client?

amber rampart
#

yes

glad ermine
#

It's not just graphics scaling tho, it also scales input boxes and stuff..?

#

So does it create bitmap widgets?

#

ah wait it already has such widgets to work with, it just makes every widget larger and then populates the content with the upscaled version of what was there before

amber rampart
#

it scales down input going in, and scales up the image buffer coming out

#

it doesn't touch widgets at all

glad ermine
#

then what is changing the widget sizes

amber rampart
#

nothing changes the widget's size

glad ermine
#

My inventory becomes twice as large when I enable stretched mode

#

so somewhere, the size of clickable things is also adjusted right? I'm missing something here I think lol

amber rampart
#

no, the widget is the same size

#

if you call getWidth on it, it will return the same value regardless of if stretched mode is on or off

glad ermine
#

in resizable mode, the canvas is the same size as the game window (minus the sidebar) right?

#

so what happens when you enable stretched mode..? does the canvas become smaller by the stretched mode factor, so every click is also mapped like that?

amber rampart
#

the canvas is, but the pixel buffer the game draws to is not if you are stretched

glad ermine
#

so the pixel buffer is sized down and then whatever goes into the buffer gets upscaled?

amber rampart
#

yes

glad ermine
#

and then gpu/117hd render over the viewport, actually rendering the game at the real window size

#

but the ui buffer is still downsized and upscaled?

amber rampart
#

yes, they upscale the ui texture in a shader

glad ermine
#

and stretched mode with the original client renderer just upscales the whole output buffer?

amber rampart
#

yes, it rasterizes the tris at a downscaled resolution, then its upscaled with java2d

#

where downscaled = vanilla native res

glad ermine
#

good stuff, that works quite differently from what I thought

#

and native is a fixed res even in resizable mode?

#

no that doesn't make sense haha

amber rampart
#

its canvas size * scaling factor

glad ermine
#

which is capped at 2x?

amber rampart
#

with some checks to make sure it doesn't get under the canvas min size

#

I don't think its capped at 2x

glad ermine
#

the injected client decides that factor right

amber rampart
#

its mostly just set by the plugin

#

but the injected-client is what actually handles it

glad ermine
#

oh I understand now lol, setting the scaling to 100% basically means, halve the game res, then upscale the output back to the original window size

amber rampart
#

yes

glad ermine
#

so you could put it to 200% and it would divide by 3(ish)?

amber rampart
#

yes

glad ermine
#

but capped by the minimum client size I guess

#

so on 4k you could scale a lot more before you reach the cap

amber rampart
#

yes

glad ermine
#

okay thanks alot I did learn much just now haha

#

So does the vanilla client use three fixed sizes (regular, small, bold) for font rendering?

amber rampart
#

there are like 10 different fonts iirc

glad ermine
#

ah thanks

amber rampart
#

they are all just bitmap fonts

glad ermine
#

You could natively render text into the (bounding box that would be created by the vanilla text renderer) * scaleFactor

amber rampart
#

it wouldn't layer correctly

glad ermine
#

right

#

Unless you keep a cache of every text widget and its z layer

amber rampart
#

they don't have a z layer, its just draw order

glad ermine
#

hmm

#

so you need to tell some module to "render this string please, but make sure it fits into this size", and immediately draw the output into the buffer

amber rampart
#

that doesn't help you get a different size/dpi awareness

glad ermine
#

Instead of what the client would've rendered there. If I understand the flow more or less

#

Yeah but you could antialias it

#

wait no because the upscaling happens after

#

REEEEEEEEEEE

amber rampart
#

yeah

glad ermine
#

introduce z-buffer

#

or delegate composition to the upscaled version

#

i.e. build all widgets in an ordered list, then upscale each one, then draw. And flag text widgets to add antialiasing when rendering takes place

amber rampart
#

that would be way slow

#

also would not layer correctly since most of the client cannot deal with alpha

#

also there is stuff like items and the minimap that are render to texture that you have to deal with

glad ermine
#

Not sure I follow

amber rampart
#

the minimap and items are drawn to an intermediate buffer, then copied to the actual backbuffer

#

so you have to decide if those should be scaled / how that works

glad ermine
#

are those intermediate buffers the same size as the backbuffer?

amber rampart
#

nope

glad ermine
#

but the logic stays the same right

amber rampart
#

nope

#

they are never scaled

glad ermine
#

also did you mean items as in, inventory?

amber rampart
#

yeah

glad ermine
#

minimap I get, you "paste" the texture into the minimap bounding box right

amber rampart
#

its the way it is so it can be rotated

glad ermine
#

and mask parts that are outside the target

#

but if you upscale it centered on the player (how the rotation is done also), that would do it

#

upscaling is linear anyway

#

still not sure what the item(s?) buffer is for

amber rampart
#

its createItemSprite

glad ermine
amber rampart
#

yes

#

you would need to clear the lowres buffer, draw to it, then composite it onto the real buffer for each thing you draw

glad ermine
#

i'm not a graphics programmer but what if you paste all of the buffers into one big one and upscale them all at once, excluding the text ones

amber rampart
#

then its more expensive to upload to the gpu

amber rampart
glad ermine
#

I meant more like

#

put individual sprites/textures next to each other

#

you'd need to have a variable size buffer tho

#

idk if that is possible

#

imagine an inventory in a game like diablo

#

items have a size and you put them next to each other in a 2d grid

amber rampart
#

upscaling them at load time would be okay, but there is still the problem of the hundreds of things that are not just a texture

glad ermine
#

upscale the whole 2d grid, then cut each part

amber rampart
#

the cost of upscaling is basically per pixel, so batching them together is worse since you are now upscaling whitespace

glad ermine
#

I'm beginning to understand why it's just a single buffer upscale and a mouse click translation ๐Ÿคฃ

#

if you upscale on gpu, could you apply the shader to multiple textures at once?

ember flareBOT
#

Good debugging! A few notes from looking into this.

  1. Chrome doesn't use IOSurfaces to pass to a CALayer like we do, it just uses them to frames between two processes with different gl contextes, which is why it doesn't need to doublebuffer
  2. I did try to use IOSurface(Un)Lock, but that has no effect. According to a GTK comment it doesn't really lock anything, but manages copying the buffer to/from the gpu
  3. Firefox has SurfacePoolCA which does basically what you describe, so I'm interes...
glad ermine
#

like a cube and the upscale works on each slice, but parallelized basically

amber rampart
#

you would also have to composite it on the gpu

#

and now you are paying gpu transfer cost for overdraw too, which there is a lot of

glad ermine
#

I think I'm underestimating the cost of switching the data between cpu and gpu

#

my idea was something like:

  • rasterize every widget,
  • take the dimensions of largest texture (this could be optimized probably) and create a cube buffer of x * y * z (z is probably bounded by max gpu parallelism)
  • fit all smaller textures into the cube, minimizing whitespace where possible, also need to keep some open space between them to prevent bleeding
  • upload the buffer to the gpu, upscale the whole cube, or cubes if everything does not fit into the z layers
  • download the buffer(s) and do compositing
  • this is the final frame buffer, upload it to wherever it needs to go to display it
#

or maybe you could upload another buffer that contains the necessary composition info and skip the extra download/upload cycle

amber rampart
#

you basically cannot do an operation on the gpu then copy the result back to the cpu in a single frame

glad ermine
#

today in #development: ririshi learns basic concepts about graphics and discovers the same things that abex just said, repeating exactly what he said a few minutes later because he came to the same conclusion

amber rampart
#

and uploading all of that data every frame is way too slow

glad ermine
#

maybe if you keep separate buffers for well known things, so again basically like you said, load items and fixed 2d textures and upscale them once

#

then somehow inform the gpu to copy certain boxes from those pre-scaled buffers when compositing

#

but that doesn't solve the 100s of non-texture widgets

#

some of those might be static which means you can draw them once to save time?

amber rampart
#

basically the only way I could think of making it work is to just implement 99% of the whole ui renderer on the gpu

#

with all of the annoying buffer management that goes with that

glad ermine
#

then virtualize the gpu so you can also run the game on just the cpu again

#

I guess that's what software gl is for

#

might as well write the whole client to run on the gpu instead

#

who needs a cpu in 2026 smh

small cipher
#

Hey looking for some advice - deving my first plugin.

  1. The functionality I'm going for is private messages decaying over time. I've got this functionality working, however it lives in onClientTick. Is this appropriate? The only alternative I can think of it making a thread of each pm.

  2. When private messages are using split chat, I'd like for the messages to stay in the chat box but be removed from the text coving the game window. With my current implementation it deletes both. I'm just wondering where I might start looking for implementing this.

amber rampart
#

you could probably use onGameTick or @Schedule, or a ScheduledExecutorService method

heavy bobcat
amber rampart
small cipher
#

Yeah I'm currently deleting the message, I'll take a look at the widget and clientscripts ty

ember flareBOT
ember flareBOT
buoyant pendant
#

I want to differentiate between two objects in a "onMenuOptionClicked" event that have the same event.getId(). ObjectID.PMOON_TELEBOX_3X3. It seems that the param1 is different for them. Is that a good way of doing it?

#

They are entrances that lead to different areas of Neypotzli and I just want the one that is the exit

#

I've never really understood what the param0 and param1 means really

trail marten
#

object marker plugin says param1 is y coordinate

#

param0 is x

buoyant pendant
#

That should work then right?

trail marten
#

sounds good

buoyant pendant
#

Thanks!

ruby nest
#

Using --insecure-write-credentials is the offical way to do runelight plugin development with Jagex accounts?

trail marten
#

that's why the github wiki says to use it

ruby nest
#

Aight thaks wanted to double check before I leaked my creds.

reef badger
#

it's the INSECURE way, but also the only way

buoyant pendant
#

the best thing is to remove the file when you're done coding

ember flareBOT
ruby nest
reef badger
#

isn't it mentioned in the guide

buoyant pendant
#

.runelite/credentials.properties

solid shadow
#

read that carefully

buoyant pendant
#

Ok I'm very confused now. When I first login and click the entrance, it has param0=63 and param1=44. I then walk around, going through different entrances. When I return to THE SAME PLACE, the SAME entrance now has param0=71, param1=52. What the hell???

#

this also happens to the other doors, but once you enter a door once it seems to find the correct params

#

Seems to be some kind of login thing that gets calibrated once you enter some other area? I have no idea why it does this. Does anyone know?

amber rampart
#

it is a scene coord, so its relative to the scene base

#

you want to LocalPoint::fromScene it

#

then WorldPoint::fromLocal or fromLocalInstance if you expect to deal with instances

buoyant pendant
#

Man this one I'm not so sure of, I have tested it and it seems to work, but I wonder if there's any better way of doing it.

                String menu = event.getMenuOption();
                MenuEntry entry = event.getMenuEntry();
                WorldView wv = client.getWorldView(entry.getWorldViewId());
                int level = wv.getPlane();
                Scene scene = wv.getScene();
                Tile[][][] tiles = scene.getTiles();
                final Tile tile = tiles[level][entry.getParam0()][entry.getParam1()];
                LocalPoint localPoint = tile.getLocalLocation();
                int localX = localPoint.getSceneX();
                int localY = localPoint.getSceneY();
                int deltax = localX + wv.getScene().getBaseX();
                int deltay = localY + wv.getScene().getBaseY();
                //1439 and 9612 are 'magic numbers' that are the non-relative x and y axis of the entrance I want to block, meaning that the other entrances are not blocked.
                if (menu.equals("Pass-through") && event.getId() == ObjectID.PMOON_TELEBOX_3X3 && deltax == 1439 && deltay == 9612) {
                    event.consume();
                    client.addChatMessage(ChatMessageType.GAMEMESSAGE, "", "[Prevent Misclicks] Leaving the cave disabled" +
                            " since you have " + amountSulphurAsh + " sulphurous essence in your inventory!", null);
                }

I get an non-relative position when doing localX + wv.getScene().getBaseX(), and this number is constant no matter where it loads. What do you think, is this a decent solution?

#

It was surprisingly difficult for me to get this to work, I feel like I'm missing a piece of information since it probably isn't that difficult really.

#

I looked at the code for objectindicators for inspiration but couldn't quite crack it. I know you get a tileObject. Perhaps you could use that?

trail marten
#

what about the api abex mentioned

buoyant pendant
#

I use it in the code, localpoint is from tile, which is from scene.getTiles()

#

but I can't use a localpoint, I need to use a non-relative point

#

that's why I use two relatives, since it makes a non-relative

stable mural
#

localpoint -> worldpoint?

#

Look at 2nd part he sent

buoyant pendant
#

I'm sadly not familiar with that notation, I tried doing localPoint. but couldn't find anything returning a worldpoint

wind fjord
#

any ideas why my VSCode keeps reformatting my code to some strange format?
Kinda feels like, whenever im switching pc and pulling it gets like this for some reason
I need to manually format selection everytime

stable mural
#

WorldPoint::fromLocal

oak rock
#

<class>::<method>

rose terrace
#

post passing checks for a new plugin, what's needed to get review/approval?

stable mural
#

Wait for a reviewer to review the plugin

#

Depending on queue/plugin size it might take a while

rose terrace
#

is there a way to see the queue status?

buoyant pendant
#

I see

restive garnet
rugged pivot
#

sort by least recently updated, pretend all the "Plugin added" ones aren't there, that's the queue I think :L

buoyant pendant
#

Wow this is actually so awesome. It turns out what I did is literally calculating the worldPoint ๐Ÿคฃ

#

worldX: 1439 worldY: 9612

#

Thanks everyone!

glass sandal
#

You can also check early if event.getId() == ObjectID.PMOON_TELEBOX_3X3 and return early if it isn't. No need to do any of the coordinate calcs if it isn't the right object.

buoyant pendant
#

hey that's a good point

#

less processing power is good

#

And just to double check my understanding, this "worldPoint" is unique where? Is every point on the map for example unique according to the worldPoint? So x=1000, y=1000 is at exactly only one place (assuming no instances since they might have some weird logic)

glass sandal
#

You can see the 1439, 9612 worldpoint is here

buoyant pendant
#

Oh is that a specific tool you're using?

glass sandal
buoyant pendant
#

Awesome!

#

I see know what abex is writing,

                    LocalPoint localPoint = LocalPoint.fromScene(entry.getParam0(), entry.getParam1(), wv);
                    WorldPoint worldPoint = WorldPoint.fromLocal(client, localPoint);

This is what they mean. Didn't understand it :(

ember flareBOT
#

Type

Incorrect behavior

Operating System

Windows

OS Version

Windows 11

Bug description

  1. You're on profile A
  2. Click "view tag tabs" and right click top left "new tag tab"
  3. Type in a name but DON'T press enter yet
  4. Switch to profile B
  5. Press enter

You will now see that all Profile B's tag tabs are overwritten, and they all happen to be empty too.

Screenshots or videos

Here is a video demonstration & explanation of the problem:

https://github.com/user-a...

reef badger
#

my guy invented a new bug

upper valve
#

it's your favorite, no logs!

reef badger
#

yeah but this one came* with a fun video

arctic surge
#

should i attach logs to it

upper valve
#

ig that's probably an ez repro if you can do it

trail marten
#

I don't think it's my (btl's) fault fwiw

arctic surge
#

yea it's very easy to reproduce

trail marten
#

I can't replicate this

#

my new tag tab prompt just closes

arctic surge
#

do u think it could be related to having 2 runelite clients open at the same time?

trail marten
#

ok so it happens but I dont' have to hit enter

#

or at least it did when I only had 1 tag tab. not sure if that's related

#

and some of my old tag tabs contain the few items I added to that test tag tab

arctic surge
#

I just reproduced it in safemode

#

with only 1 client open

rancid marten
#

A lot of thecode which accepts input like that will do things like capture config -> wait for input -> use captured config after

#

id assume is what is happening

#

this seems so extreme edge case im not sure i care though

arctic surge
#

it's really weird - not only does it overwrite your tags, but all of them are empty too ๐Ÿ‘€

quick path
#

I can't imagine tripping this bug in any real situation

arctic surge
#

i just encountered it naturally

#

I was setting up turael skipping on my alt, and I'm like: "Oh I want to reference my ironman turael tag tab", so I switched to that profile to look at it and withdraw my custom set of items for this alt account. Then, I went to create the new tag tab so I clicked "new tag tab", but then I stopped myself. "Wait, I shouldn't create it on this profile, this is my ironman profile". So I switched profiles and hit enter.

trail marten
#

I bet the code is called at a weird time

#

since I never had to hit enter, it just closed itself (the prompt)

#

maybe the ondone is called at a very strange time during profile change somehow, without my input?

arctic surge
trail marten
#

well now mine doesn't either ๐Ÿ˜‚ (different account)

ember flareBOT
rancid marten
#

@shy pine swing question for you - why does removing contentsPanel from NotificationPanel (and making the scroll pane's view just mainPanel) cause the vertical spacing between the config options to increase?

ember flareBOT
reef badger
#

is there any visual indication of where u can drive ur boat on the world map, i'm trying to see what misc area(s) u can drive in from

#

is it this slightly darker water

glass sandal
#

Not really, different waters have different hazards which are different colors on the map

reef badger
#

mmmm

#

someone opened an issue (on the wiki xd) that u can't see misc favor if u drive in

#

which is correct since it only checks the two land regions

glass sandal
#

You can sail around all sides of the island, but you can only get to the land via the docking point

reef badger
#

thats the sailing icon right

glass sandal
#

Yep

reef badger
#

so probably just 10299

#

probably not unreasonable to add, since it's only 1, i just didn't want to add 12 new region ids to the plugin

#

i guess the issue report itself says "go past the pier" grumble

shy pine
rancid marten
#

all of contents panel is nothing but main panel

#

so it seems like i could remove the contents panel, but if i do it all breaks

shy pine
#

Oh hmm

rancid marten
#

i think the contents panel is artifically lowering the max size of main panel which is causing it to just layout stuff to be smaller

shy pine
#

Oh perhaps contentsPanel, because it lays out mainPanel as Borderlayout.North, it's not space-filling (vs BorderLayout.Center would be)

rancid marten
#

it seems like there should be a less stupid way to do this but I cant figure it out

shy pine
#

Try adding the scrollpanel with a North layout and see if it corrects?

JScrollPane scrollPane = new JScrollPane(contentsPanel);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

add(scrollPane, BorderLayout.NORTH);
rancid marten
#

topPanel is already there though i could try south maybe

shy pine
#

If that doesn't work, could have a parent panel aligned to north with both topPanel and scrollPanel as children. Though even that is scuffed.

Usually at this point I break out GridBagLayout but that's also not super clean

rancid marten
#

a bunch of our config evidently relies on this trick

ember flareBOT
tribal sparrow
#

Anyone know how I can force a music track to play again when setting client.setMusicVolume(>0) after having set client.setMusicVolume(0) previously?
(Currently fixing https://github.com/alowaniak/music-replacer after some updates, and I don't think it previously had the problem where going from an overrridden track to a "native" track didn't make it play.
Have shuffled things around a bit and also previously relied on MusicPlugin's granular sliders, although I can't find anything special in its old version regarding 0 volume)

GitHub

Replace OSRS music tracks with user defined music. Contribute to alowaniak/music-replacer development by creating an account on GitHub.

glass sandal
#

They added new varbits and varplayers on Wednesday for audio volume. Not sure if it has anything to do with your issue but may be worth looking into

tribal sparrow
#

varbits and varplayers are only readable though right? or can I write 'm to mimic/force behavior?
I'm using the VarPlayerID.OPTION_MASTER_VOLUME and VarPlayerID.OPTION_MUSIC (they're 0-100 afaict) to get the volume, and then play replaced music on that volume and set client volume to 0, and if there's no replacement I set client volume to "effectiveVolume" * 255 pretty much
But I think because when the track starts the client volume is 0, then after setting it higher it will still not play

ember flareBOT
#

@abextm this is just an initial draft for you to take a look at, I've been running it for a few hours without any issues, the pool grew up to 5 IOSurface's.

I intend to drop the IOSurfacePool debug stats logging commit before merge :)

Not sure wherever or not this change warrants another file so I don't need to shove the whole pool impl in rlawt_mac.m ?

I also wasn't 100% sure if the dynamically growing pool was worth it or wherever or not a fixed size might be good enough, my v...

jolly hearth
#

Is it possible to use the config panel elements (labelled checkbox, labelled dropdowns, etc) in my plugin panel without redefining them in my plugin?

#

Or even just the styling

prime bane
#

Do I need IntelliJ for Runelite development or can I also run it with VS Code?

glass sandal
#

You can do it with VS Code but IntelliJ will make it much easier

low hatch
#

Not important at all, but OOC why are we required to use RuneLite's Gson instance instead of initializing our own?

vernal thistle
amber rampart
#

default gson likes to reflect into the jdk which doesn't work on newer versions of java, so the gson instance we provide has a thing to make it always fail

ember flareBOT
worthy carbon
#

howdy. I reused the camera zoom slider tooltip to make the new volume controls have a dynamic tooltip. Any thoughts on this?

amber rampart
#

how is that better than the vanilla tooltip?

rugged pivot
#

vanilla isnt there while you're moving it

worthy carbon
#

there is no tooltip displayed when you drag

#

also it lags by like 200ms

thorn grotto
#

jaflex pleae

rugged pivot
worthy carbon
#

the old slider had this function and the new one PMO cuz I can't find % quickly

low hatch
thorn grotto
ember flareBOT
worthy carbon
#

in any case, if you're interested ^ ๐Ÿ˜›

upper grove
#

yes bring back the % number

#

(please)

ember flareBOT
ember flareBOT
rose void
#

they arent getting highlighted by the native slayer plugin nor better npc highlight (which just hooks into the native slayer plugin anyway) so pretty sure its upstream from me

rugged pivot
rose void
#

potentially

ember flareBOT
rugged pivot
#

mere seconds after I figure out how to check it myself ๐Ÿ˜‚

quick path
#

I'd just done that recently for the shellbane gryphon so it didn't take me long

#

though I didn't know you could just search the dbtables view like that

#

would've saved me a bit of scripting I guess

rugged pivot
#

we're all learning things today

ember flareBOT
#

Before the total additions scare the maintainers off, a quick breakdown:

  • Plugin itself is about 300 lines (plus 99 lines of imports and copyright statements)
  • 500 lines are a new UI component, DragAndDropTabbedPane, to mirror the existing dragging behavior in DragAndDropReorderPane but for JTabbedPane* (see notes)
  • 1200 lines for unit tests
  • changes to support the plugin are about 100 lines
  • All unit tests (new and old) and checkstyle passes

I finally learned eno...

hollow stratus
#

Hey all, finally wrapped up my changes for implementing draggable plugin tabs. I worked super hard to make sure I followed all the previous conversation about storing configs (or not storing them in a txt file as someone else tried), following all the patterns I could within the codebase, avoiding reinventing anything already created and using created classes/utils.

I tried to make this as robust and high-bar of an implementation as I could. I'm open to adjusting anything any maintainers have or answering any questions. I'm currently going through and leaving comments to help clarify anything for reviewers. Thanks all.

rancid marten
#

This is definitely a feature I am interested in adding, I would have to spend probably an hour+ looking at this to figure out if works like how I want it to work and I don't have the time to do that atm. Ill try and check it out later though

rugged pivot
worthy sparrow
#

That is a ridiculous amount of tests

rancid marten
#

i think the tests are just ai slop

#

like, idm them we can delete them later

#

how much of the actual impl is slop vs how much do you understand?

#

maybe I should look at 18720 too

#

i would note re 19910 - it definitely shouldnt be a plugin like this, but that is relatively easy to change

rugged pivot
#

I think that one happened around the time there was a fair amount of discussion about desired behaviour in here

#

ie what should happen re-arranging around disabled panels

sharp knot
#

Yeah I think that was the case as well

ember flareBOT
hollow stratus
# rancid marten i think the tests are just ai slop

I will admit the test are AI slop and I acknowledge in the PR body that they can be removed if unnecessary. In my day job, we don't introduce features without unit tests. I'm totally flexible on this and I'm completely open to any adjustments necessary.

I saw your comments referenced by a comment in https://github.com/runelite/runelite/pull/18406 about your desire for proper order insertion behavior when in a custom order.

how much of the actual impl is slop vs how much do you understand?
I understand everything I wrote. I started with the code from 18406 as a starting point (see my first commit) and took the feedback in that PR body to adjust this. Like not using a local txt file to store the config, so I learned what configManager is and does, how to store the custom tab order in configManager, how to serialize/deserialize looking at other 1st party plugins (ChatCommandsPlugin.java), etc. Some of the complexities around load order and event firing were very foreign to me (as I'm newer to runelite/java development patterns, as I am a python/devops/cloud dev by day).

I chose to make this a plugin so the behavior could be toggled on and off. I did this when testing it while playing when using 18406's original implementation and realized I wanted to be able to turn on and off the behavior to respect Adam's valid concerns.

I'm sure I've done some things wrong, but this is an earnest effort I spent way too much time testing troubleshooting, and pulling my hair out over and this isn't just one giant AI slop commit

rancid marten
#

I cant speak for how correct this is atm but it definitely just shouldnt be a plugin

rugged pivot
#

it can still be toggleable as part of the core runelite config

#

if that is desired

hollow stratus
rancid marten
#

at the very least it would be just a setting in the "runelite" config to enable/disable dragging, more ideally having a way to control if it is enabled or not could be like a context menu on the sidebar or something?

rugged pivot
#

looks like atm when disabled it resets to default order, which is probably not wanted

ember flareBOT
#

This seems to think there are some times when pool->front is !IOSurfaceIsInUse but also it shouldn't be picked as the next buffer and it instead picks a different buffer, why is that?

Also I don't quite get the reasoning to pick appropriately-sized buffers in prefer to non-appropriately sized buffers, what is that trying to do? It seems like it would maybe save a buffer recreation sometimes but those happen almost never, so it seems like it is not worth trying to do this?

I think a bunc...

hollow stratus
# rugged pivot looks like atm when disabled it resets to default order, which is probably not w...

I went through a few different iterations, one had it keeping the custom ordering when turning the plugin off. But I went with the current behavior because it means plugin off = custom sidebar off. Otherwise, the path to getting default tabs was to reset my custom order settings, which didn't feel intuitive. And wanting to keep my custom order when disabling the plugin didn't make sense from a user perspective.

worthy sparrow
#

it should probably be two tiers: on/off and locked/unlocked maybe

hollow stratus
#

Having a user go "I don't want custom tabs anymore, turn off" and then they stayed in custom order once turned off seemed like an antipattern

#

I also had another config option of "use custom sidebar" with just a bool, but then when consolidating my implementations, I realized that was redundant as the plugin itself is in an on/off state

rugged pivot
#

idk how sacred the default order is really, but thats just my opinion

#

maybe a reset context menu or something, but I don't see much use case for being able to go back and forth freely between re-ordered and default

hollow stratus
#

which may not be that intuitive, tbh

#

so if you do desire to reset your custom order back to default, hit the plugin's reset button

rugged pivot
#

(that said i'm 100% gonna try and see if Plugin Presets can be used to do different orders for different activities)

hollow stratus
#

I appreciate everyones thoughts and feedback. I had so many different ideas on how to implement everything that I tried it all, tested it, found which I didn't feel were right, tweaked some more, and had like 3 different branches of the implementations. If you all are interested, you can clone my original repo and try the three different branches to see which you liked better

worthy sparrow
#

there's really not any reason to have a live slider because it will destroy performance

#

drag and drop is already kind of bad when you drop it on world selector

rugged pivot
#

first op is confusing maybe

#

Disable dragging perhaps

hollow stratus
# worthy sparrow drag and drop is already kind of bad when you drop it on world selector

If you look at my PR body, I ran into that. I tried sliding like DragAndDropReorderPanel but when dragging icons of plugins with large panels like Configuration and World Hopper, it slows down. So that led me back to my first implementation of a dragged Swing Icon of the tab. It prevents reloading of the plugin's panel until dropped. I also made it prevent selecting a tab when attempting to drag and only open the tab when not dragging to drop. This keeps the behavior the same as stock, but prevents the rapid changing of the panel contents when reordering the sidebar

worthy sparrow
#

i'm telling you this because I ran into in a poc

#

even without your tests it's like 5x more code than I had so I didn't read it

neat wyvern
#

The point of ai tests is surely just a check-box, right? To say you have tests without actually testing anything. In fairness I don't think "TDD" people ever wanted to solve real problems.

#

The good thing about keeping that stuff plugin hub is that code style and lack of care doesn't enter core...

rapid granite
#

Quick Question about Model::getAABB how is it calculated/what does it represent.

Am I right to assume it should be a AABB around the vertices of the model, given a orientation?
I'm seeing weird results when using it, so want to confirm that this API is what I want or if I should Min/Max the vertices myself.
(I'm leaning towards the latter).

Note: Dynamic Renderables getAABB seem providing a more correct valid bounds

Ideally AABB needs to be conservative, since I'll be using it for occlusion queries to determine if a Zone is visible for 117 plugin.

rancid marten
#

Am I right to assume it should be a AABB around the vertices of the model, given a orientation?
yes

#

the aabbs basically aren't broken because if they were then clickboxes would be broken

rapid granite
#

Is it a potential threading issue then?
I had to do the following in drawDynamic on the RenderThreads to fix some clickboxes:

if (renderThreadId >= 0)
    client.checkClickbox(projection, m, orient, x, y, z, tileObject.getHash());
rancid marten
#

yeah you cant do that

ember flareBOT
#

Type

Incorrect behavior

Operating System

None

OS Version

No response

Bug description

I'm not 100% sure if this is a RuneLite issue, but I think it could be fixed by RuneLite.
Color replacements are not applied to stack variants for stack sizes != 1. If I recolor an item with stackable variants, say irit seeds, that color is only visible when the stack size is 1.

		ItemComposition itemComp = client.getItemDefinition(ItemID.IRIT_SEED);
		itemComp.setColorToReplace(...
ember flareBOT
ember flareBOT
#

This seems to think there are some times when pool->front is !IOSurfaceIsInUse but also it shouldn't be picked as the next buffer and it instead picks a different buffer, why is that?

We were double buffering before so I presumed to keep that, although I also wasn't sure if IOSurfaceIsInUse could return false & then later return true for the same CALayer's contents if something like the mouse moved over the area - I just tested this and it seemed safe to remove at first but I still had...

ember flareBOT
#

Type

Incorrect behavior

Operating System

Linux

OS Version

Fedora KDE Plasma 6.18.12-200.fc43.x86_64

Bug description

The indicators for the Emote / Hot and Cold / Maps clue steps, that the Clue Scroll plugin shows are a little bit inaccurate. What I mean is that the indicator is performing correctly, but the actual area where you can perform that action is bigger.

Now, I have been using tile markers to manually mark the exact area where you can do that, but it is quite ...

ember flareBOT
#

If we were to display these areas (which I'm not sure we do), we would want to be sure to have accurate areas for everything shown. While we have that information for hot-cold clues because they have a consistent area around the center--and having accurate centers is necessary for the narrowing algorithm, so we have been on top of correcting those--but the same is not at all true for emote clues and other dig area clues. Additionally, reviewing updates to clue locations on a large scale is di...

tribal sparrow
#

cs2 scripts are all only interface stuff right?
I'm trying to figure out how to start music again after having done a client.setMusicVolume(0) and then client.setMusicVolume(>0) and I found 3932 fires whenever a music track changes (and if music track changes it starts playing)
So I thought maybe doing a runScript(3932) would fix it, but doesn't seem to
Also tried ::setvarp music/master and queueChangedVarp, but they all also don't seem to start the music
kinda at a loss tbh, can't really find anything else that might trigger a restart (as if a player had muted and unmuted sound)

amber rampart
#

you have to invoke a cs2 to tell the server you want to play music again but idr which one

tribal sparrow
#

hmm I would've thought it would be 3932 then since I see that one popping up whenever mute->unmute and changing music track

#

But programmatically muting and unmuting via shell and then running runScript(3932) doesn't make it play

amber rampart
#

9238

tribal sparrow
amber rampart
#

it needs args

#

you transposed the inner 2 digits

ember flareBOT
#

So a mega-thread where everyone can contribute with the complete area of the Emote/Map clues would not be of any help, like the mega issue #9601?
I understand that it would be a really daunting task, since there is A LOT to modify, besides centering the Hot and Cold clues. But I believed that Emotes and Map clues do not have a narrowing algorithm. So wouldn't it be just a matter of hard coding the area?
So you would like something more "true", as in what the game provides as the real area (re...

ember flareBOT
#

So a mega-thread where everyone can contribute with the complete area of the Emote/Map clues would not be of any help, like the mega issue #9601?

I wouldn't think so, since centering hot-cold clues directly lead to better solutions, where finding the center of other clue areas has minimal impact on players.

So you would like something more "true", as in what the game provides as the real area (real data), instead of player driven information through trial and error, since that is not a...

native notch
#

Are all these errors an issue in the current runelite repo?

quick path
#

No, we don't have those errors

#

It looks to me like you might be missing lombok integration in your ide

native notch
#

oh my fork is still behind it seems

quick path
#

I don't think that's the issue, we've used lombok for a very long time

ember flareBOT
#

Important: I did not get the whole Runelite repository running in IntelliJ, this PR is related to my comment in the pull request to make this small feature a whole plugin (https://github.com/runelite/plugin-hub/pull/10696). I did get my own plugin-repo running in IntelliJ + was able to test it. It would seem better to just add this small functionality to the existing Runelite 'Key Remapping' plugin, but I didn't get that working in IntelliJ to properly test it, since I got all kinds of errors...

native notch
ember flareBOT
#

Please do include a setting for world hopper:

[ ] Display packet loss

So that I can have display current ping enabled but I do not want to see the packet loss (unless I check that box).

Thanks this feather would be great for when servers have alot of packet loss but are playing fine and I don't need the anxiety of staring at the number in the top right corner but I do want the other information such as ping, basically just make Display current ping only display current ping and have a sep...

feral marsh
stuck shale
#

you dont have to do anything, if there was something to be done i think some one would've commented on it

#

theres just a queue for reviews/new stuff.

worthy sparrow
#

does that plugin basically exist already

rugged pivot
#

just the tag part, not highlighting, but yes

feral marsh
#

the tag plugin is barely maintained and only half works

worthy sparrow
#

fix it maybe

feral marsh
worthy sparrow
#

take it over

ember flareBOT
#

Sorry I have no idea why that closed...

poolNextBack allocating a pool and passing it to poolEntryMatchesSize() is relying on AWTContext being calloc'd to have surface == 0. But despite this you are still zero initing most of the rest of the structure for no reason. This is confusing.

Agreed, should be should be cleaner now - thanks!

feral marsh
#

no thanks, I have a working plugin im not fixing someone else's work

lavish ice
feral marsh
#

It hits it one time not constantly and caches all ids in the category

rugged pivot
#

I think if its on manual search like that they're okay

lavish ice
#

Fair

#

The person that usually reviews new plugins is away for a bit, hence the long wait time

rugged pivot
feral marsh
lavish ice
#

But thereโ€™s no further action required from your part yet

rugged pivot
#

dupe plugins are discouraged but not disallowed

feral marsh
#

not truly dupe either My focus is on the highlighting for easier bank organization. his is the bank tag feature.

#

i added that feature so you dont need both plugins

worthy sparrow
#

The plugin is still mostly the same but it doesn't matter

upper valve
#

every time you update a submission you push it to the end of the queue, looks like this wS updated 4 days ago

#

so its kinda far down

#

think ill have some time tonight to make progress but idk

rancid marten
#

and I guess anything else you have (external displays?). and screenshots.

knotty lintel
#

thanks Adam, if anyone has any issues with it feel free to give me a ping ๐Ÿ™

solar stirrup
#

Is there a way to specify search labels for the plugin hub? Also, where does the plugin icon go for display in the plugin hub (website and search in runelite)?

Right now I have the default little plug icon and search only results in my plugin if you use one of the three words in the name

rugged pivot
#

icon.png in the root of the plugin's repo, and hub tags in runelite-plugin.properties

solar stirrup
topaz pierBOT
solid shadow
#

step 10

quick path
#

@desert fulcrum can you update ground object hider to also not work in hmt sote region?

#

apparently it's being used to cheat the maze there

snow needle
#

I noticed the PR backlog is getting pretty massive. How do you typically recruit new reviewers? Would there be any interest in adding some sort of PR static analysis to look for red flags in code to speed up reviews?

worthy sparrow
#

the more we merge, the more people pr--quite the conundrum

snow needle
#

Lol

#

It's true, I want to send more prs but I can't while I have one pending

stuck shale
#

Not everything in the pr queue needs to be core with hub existing too, wonder how much of it can be closed due to that

worthy sparrow
#

i think they mean the hub

polar crypt
#

the hub quue is also getting bigger lol

stuck shale
#

More core plugins just means more for Adam to care about outside of core making it work lol

#

Oh

snow needle
#

I was referring to hub actually, but same question for core I guess

stuck shale
#

Rikten is only one guy

#

:/

polar crypt
#

yeah it's a big job

stuck shale
#

Thankless job and he does it well

snow needle
#

I love rikten but seems like they are doing basically everything

stuck shale
#

What is wrong with a queue that takes a bit

snow needle
#

Doesn't seem very sustainable

stuck shale
#

It used to be worse before the green names helping

#

But ai has made it even harder

worthy sparrow
#

we have other people that sometimes do stuff but basically everyone has a life

snow needle
#

Well I have bug fixes waiting around for days ATM and that's been unpleasant

polar crypt
#

there seems to have been an influx of plugins lately too

#

i'm not sure if it's alwys this extreme

worthy sparrow
#

it's always like this

polar crypt
#

oh dang. the ai submissions seem really rough to sift through

polar crypt
#

i woudln't want that to be my job

snow needle
#

Yikes

stuck shale
#

You can see when rikten started but also when Claude coders showed up.

polar crypt
#

i guess y'all aren't taking an official stance against vibecoded plugins yet?

stuck shale
polar crypt
#

i know i've seen the wiki ai policy cited numerous times

snow needle
#

I'm wondering if static analysis can help find risks in vibe coded stuff to speed up stuff for the current reviewers. I would take a stab at it if there's interest from reviewers

worthy sparrow
#

we already have that at the reviewer level

#

the bot even yells at you if you are lucky enough

snow needle
#

Oh ok then. Glad I asked

ember flareBOT
worthy sparrow
#

go wild

snow needle
#

My man

ember flareBOT
upper valve
polar crypt
#

that's fair

upper valve
#

i think the pr queue is manageable i just havent had much time to touch it this month. in december/january we were super active on it

stuck shale
#

Speaking of reviewing is the duplicate plugins on hub not a thing to point out anymore on new ones

polar crypt
#

is there stuff we can do as plugin developers to make the review process easier?

stuck shale
#

So many people are just creating new of the same ones that exist with one more feature

fluid stump
fluid stump
rugged pivot
#

they do it of other hub plugins too

fluid stump
#

oh ye 100%

#

but its one of the reasons imo in terms of core / hub overlap

upper valve
#

i ask if it's obvious but 99.99% of the time they say "i don't want to contribute to existing" or they get ai to write a dietribe on why their plugin should be separate so idk how worth it that is

rugged pivot
#

everyone wants 100% control of their own thing instead of collaborating

upper valve
#

the official stance is dupes are allowed

upper valve
rugged pivot
#

well yeah we're runescape players, we don't talk like talking to strangers

fluid stump
#

i guess some people just don't want to compromise when collaborating makes a issue

upper valve
#

really the only thing i actively dislike is when people submit monster PRs that sit there for months/ years and then they get upset because they dont seem to understand the world doesn't revolve around their 20000 line plugin

#

that is just ignorant

#

but fortunately extremely rare

fluid stump
#

scared to submit one of my new plugins waiting for backlog to slow down ๐Ÿ˜†

rugged pivot
#

mhm yes me too thats definitely why i'm procrastinating on my big update

#

nothing to do with the swing work or fear of changing my data structure

stuck shale
#

Analog clockโ€™s digital format config toggle waits another year.

#

God dammit

fluid stump
#

i may need to split the plugin into so smaller feature prs tbh so big atm with all the object placing logic and ui

fluid stump
rugged pivot
snow needle
#

oh cool I'm purple now

reef badger
stuck shale
#

:< telling people to do config surgery doesnโ€™t work when the cloud sync overwrites it anyways.

snow needle
#

I'm fine to have new features sit around for as long as necessary, but bug fixes are frustrating to have to wait for. I'm learning that I need to wait to send a PR for a new feature until I have a day to resolve bugs from the previous one or I screw myself

quick path
#

Conversely, it is frustrating for us to merge a hub plugin update just for the author to realize it's buggy and needs fixing, and effectively make it our problem to review it in a hurry

#

It's quickest and easiest to just revert something that doesn't work, but that's not the route most people want to go when a rollout uncovers bugs

snow needle
#

As far as I'm aware both require the same review process, is that not right?

quick path
#

Reverts basically don't require review because they roll back to a state which was already approved

#

I'll be fair and say "hotfix" type updates usually are pretty quick to review as well since they tend to be small, but they are at least some amount, not none

snow needle
#

But it still requires review right? It won't auto approve? The fix is literally adding a png file so I'll probably leave it if it's the same

quick path
#

Yes it doesn't get automatically merged

#

I'll review your pr tonight if someone else doesn't get to it first, I've just got sick kids to look after for a few more hours until it's their bedtime

snow needle
#

Much appreciated

heady pond
#

but i'll take a look now

ember flareBOT
snow needle
#

Thanks. Sorry, I will try not to be as much of a pain in the future.

lunar yarrow
#

Is it acceptable for injected classes to subscribe to events directly, or should the main plugin class act as a mediator between events and classes?

#

The developer guide states that events "must be located in the plugin class" but I'm fairly sure that I've seen some popular plugins subscribe elsewhere.

desert fulcrum
trail marten
#

must be included is because people wouldn't know they have to explicitly register with the event bus otherwise

rancid marten
#

the developer guide says it must be included in the plugin class since you have to do a bunch of advanced stuff to make it work otherwise

#

and the developer guide is written for people who are brand new

quick path
#

Classes registered to the event bus can subscribe to events, and the plugin class is automatically registered

lunar yarrow
#

Okay got it. I'm injecting classes into the main plugin and subscribing/unsubscribing those classes from the event bus in the startup and shutdown methods.

#

Is that a sensible way to do it?

rancid marten
#

yes

lunar yarrow
#

Great, thanks everyone.

rose void
#

reading some scrollback about duplicate plugins, i noticed someone forked better npc highlight added a feature, but also changed all the metadata to make it a separate plugin. If that ever materializes in a plugin hub submission feel free to tell them they should talk to me about adding features because im happy to discuss design and review PRs. they just havent done any of that at this point

upper valve
#

we will do that but we can't exactly force them to

rose void
#

I cant tell you not to accept a 99% duplicate of an existing plugin, im just letting you know im very open to others contributing and havent told anyone they cant

snow needle
#

@upper valve why was that a thumbs down?

grizzled aspen
#

Time-to-merge for phub PRs has only gone down over time, and yet despite that it has felt like there is an increase in people complaining that their PRs take too long to get reviewed. The number of PRs opened per week has also gone up. While someone might review it ahead of others if you ask a courtesy, it can also be unfair to others who have issues in their plugins waiting to be merged to be skipped over to review yours.

ember flareBOT
random narwhal
topaz pierBOT
#

Search for Combat Achievement Exporter returned no results.

ember flareBOT
tranquil trellis
flat furnace
ember flareBOT
ember flareBOT
swift knot
#

When using --insecure-write-credentials for testing on a jagex account, is it possible to save these creds so that they dont change when loading up a different jagex account to play the game normally?

#

But keep them in that file to launch using the same account when running shadow jar's etc?

heavy bobcat
#

Just uncheck the option in the launcher

#

You only need to run it with that once and then the file is there until you delete it

swift knot
#

so just remove the arguement after it's added the info for the account you want to use?

heavy bobcat
#

Yeah

#

Dunno why I said uncheck

swift knot
#

Ok cool, because currently its overwriting with whatever account i launch in jagex first

ember flareBOT
swift knot
#

so that makes sense, cheers

#

There's a few of use playing a group plugin I made but i'm not really interested in submitting it to the plugin hub so we are just launching through a shadow jar to play, I'm assuming this isnt against any TOS as long as the plugin is clean?

heavy bobcat
#

Correct, as long as you're not breaking the rules it should be fine

knotty lintel
feral sluice
#

Hey everyone, first time working on a plugin. Can someone let me know if this seems reasonable what I have so far and if there is anything special needed when updating a default plugin?

oak rock
#

that doesnt sound reasonable to me, why would someone playing the minigame not actually want to play the minigame. Introducing a config option like that seems like bloat

feral sluice
#

To make it more AFK

oak rock
#

then turn off the dispenser notification?

stuck shale
#

They want to only get the dispenser when itโ€™s 1 jump away, but donโ€™t you need to get 2 in a row to get any rewards or is it 2nd one and beyond that give any rewards?

#

This looks like hub stuff to do tho rather than core

oak rock
#

looks like the "initializing" was removed two years ago

Players no longer need to tag two pillars back-to-back to earn tickets.

feral sluice
#

The idea is to sit beside a pillar and alert if it is right next to me. There's already an external brimhaven agility path plugin, I can see if that guy will accept the change if it shouldn't go into core agility

upper valve
#

if they dont want that change you can just make your own hub plugin

polar crypt
restive garnet
ember flareBOT
spice stirrup
#

im pretty anti-ai so my opinion is biased

upper valve
#

there are no support tickets lol

rancid marten
#

I was thinking about adiding a real agents.md to the plugin template

spice stirrup
#

lol ik i meant increased activity in the runelite/support channels

rancid marten
#

I dont think the ux has decreased noticibly from back before ai wrote everything, most people aren't good at coding either

upper valve
#

yeah

rancid marten
#

.. or ux

upper valve
#

most of the people writing plugins are not industry professionals. nothing really changed other than volume

rancid marten
#

if anything the ux might be better with ai

spice stirrup
#

fair, though overdependence leads to less comprehension but considering most plugins are tiny it's probably not an issue in that context

rancid marten
#

i think are you overestimating the average plugin/plugin author lol

#

the vast majority of the authors are basically runescape players who vaguely can sort of code. they arent software devs

spice stirrup
#

probably

#

very fair. thats my bg

#

and i always have room to improve

upper valve
#

also if a plugin is enough of a problem we can sort of just snap its neck in 2 seconds and move on with our day

rancid marten
#

weve been able to offset the problem of increased submissions just by adding more reviewers which has sort of worked

#

at least it is a lot better now than it used to be

errant linden
# restive garnet I would definitely go with retrofitting that into the existing hub plugin if tha...

Author of the Brimhaven agility plugin here; agreed my plugin is a good place for this to live since the existing pathfinding logic should make it fairly trivial to add ๐Ÿ™‚

My only concern is that if enabled, users might get double notified because of the existing notification in the core Agility plugin. But if we have this new one off by default, and have a reasonable hint on the configuration option to turn it on telling the user that they'll likely want to turn off the notification in the core Agility plugin, then I don't think that'll be much of an issue.

I can see the appeal for this; lots of people seem to sit in the Agility Arena just spam clicking the obstacle where you don't need to move your mouse, but probably wouldn't be opposed to additional XP from tickets when they're close.

@feral sluice has already reached out in an issue on GH, will orchestrate with them there

snow needle
#

I saw in some past discussion that File I/O and networking requires maintainer review. Rikten said this doesn't mean much anymore because all active reviewers are maintainers; is there any reason to avoid these APIs at this point from a PR perspective?

worthy sparrow
#

we need to make sure you aren't doing erroneous requests or using data improperly

#

in the context of reviewer vs maintainer it still requires us to look at it

snow needle
#

Will it affect the PR process in any noticeable way once it's submitted? Like if I add I/O once and then don't touch it again am I subjecting myself to longer queues or something?

worthy sparrow
#

no

snow needle
#

Ok thanks

upper valve
#

if I add I/O once and then don't touch it again
you are always in the "requires maintainer" mode once you add those APIs

rugged pivot
#

if more reviewers are later added that are not maintainers they wouldn't be able to look at it as its always gonna be flagged, but currently no

snow needle
#

ahh so no real issue now, but could be a problem later

upper valve
#

it's not a per PR thing. the scanner looks at your entire plugin every time

snow needle
#

Interesting. Thanks for the info. I had someone report that my plugin somehow wiped their config and I'm considering writing occasional backups to a separate file as an extra precaution. Has someone else done something like that before?

grizzled aspen
#

it wiped their entire config?

snow needle
#

No just one part of my plugin's specific config

#

I'm using ConfigManager instead of the standard Config system for one part of it

ember flareBOT
rugged pivot
#

you can backup to a file if you want but if you automatically use that as a source of truth you risk issues for people using multiple devices with synced runelite config

#

might be time better spent figuring out why it wiped

rugged pivot
#

what it says ๐Ÿ˜‚

snow needle
#

Basic config uses net.runelite.client.config.Config
Glamour plates use configManager.getConfiguration

oak rock
#

yea but the configmanager is the normal way to interact with the config?

rugged pivot
#

yes it is

#

well, the config panel settings can be accessed differently

oak rock
#

the user facing configurations

snow needle
#

Yeah I mean config panel stuff uses net.runelite.client.config.Config. The plugin panel uses getConfiguration and setConfiguration directly.

#

Everything in the profile properties is cloud synced, correct?

rugged pivot
#

yes (if the user is using a rl account and that profile is set to sync)

#

but yeah using configmanager is very common so in itself is not a reason for losing data

snow needle
#

Is there more info on the cloud sync lifecycle somewhere or just got to read code? I'm curious how it works in more detail?

oak rock
snow needle
grizzled aspen
#

i think writing a backup file would add a lot of complexity and potentially break others for the use case above, basically just moving the problem. you're probably best just taking the hit for now and figuring out what happened imo

amber rampart
#

how much stuff did you write to it?

#

the server will reject writes over a few hundred K iirc

ember flareBOT
upper valve
snow needle
#

I could see power users going over 100k someday. It's not exactly saving an efficient format

#

My dev config is at 9KB right now. Almost certainly a power user will cross it :/

#

I'll probably have to rework this soon and gzip it or something.

grizzled aspen
#

you could write the actual content to a separate file instead of putting it in the config

snow needle
#

Yeah it would be nice to work with cloud saves though. Any possible issues with saving entries as separate keys and loading them all by prefix?

grizzled aspen
#

you could, idk if there's still limits if you write too much overall though

worthy sparrow
#

you could also use serializer shorthands

snow needle
worthy sparrow
#

instead of serializing {"somekeyname": value} it serializes {"s": value}

snow needle
#

Oh gotcha. Yeah I can definitely serialize a more efficient format.

ember flareBOT
swift knot
#

Whats hte best say to debug a memory leak from my plugin? My plugin is sometimes spiking memory usage from 1200mb to 5000-8000mb.

upper valve
#

that is sort of an unanswerable question

swift knot
#

Ok, so theres no way to monitor whats using the memory?

amber rampart
#

take a heap dump and use visualvm or eclipse-mat

swift knot
#

Great thanks

ember flareBOT
swift knot
#

Can JDK version or anything other than plugins commonly cause memory usage spikes? It's not constantly increasing but it'll spike after 5-10mins of gameplay and stay there

#

The dump doesn't show any plugins causing a memory leak

amber rampart
#

pass -Xmx512M as a jvm arg

#

java likes to allocate a large heap if you have a lot of system memory

ember flareBOT
ember flareBOT
ember flareBOT
flat hill
#

Hi Team - sorry to be a pest or bother. Reached out to a plugin reviewer and was suggested to post here. I'm the developer of the lootbag.gg plugin. Ran into a nasty bug that starts at the plugin level. I understand there's a good bit of other PRs out there. Just wanted to see if you have time to look at a 2 liner change. The plugin is already live and was hoping to get this fix out as soon as possible.

https://github.com/runelite/plugin-hub/pull/10712

upper valve
#

nasty bug
can you elaborate

#

crashes/freezes the client or just plugin doesn't work

flat hill
ember flareBOT
native notch
#

Wow there are like 100 open pull requests. I'm curious how often it could happen that when a PR is made everything is fine, but then after a while the master branch is updated by other pull requests resulting in conflicts or that the code in the existing PR needs to be adjusted because some logic in the master branch changed or something. Anyone has experience with something like that happening?

worthy sparrow
#

all the time

glass sandal
#

Do you mean the runelite repo or the plugin-hub repo? Because with plugin-hub nobody should really modify your file so conflicts are rare

trail marten
#

(it was kind of a bad pr)

#

I wouldn't update it though

#

unless someone asked

rugged pivot
glass sandal
#

That's why I asked, I was like surely there's way more than 100 open on core

upper valve
#

well on average that's 375

#

which is still nowhere close to the 100 figure so idk

trail marten
thorn grotto
#

i'd say some AI repo but i dont know any of them

reef badger
ember flareBOT
ember flareBOT
ember flareBOT
ember flareBOT
#

Type

Incorrect behavior

Operating System

MacOS

OS Version

Tahoe 26.3

Bug description

Hi,

Iโ€™m running RuneLite on a MacBook Pro and have never had issues before, but recently Iโ€™ve been experiencing an intermittent mouse input problem.

At random times, my mouse clicks will either: Not register at all, or register in the wrong location; sometimes up to 5โ€“6 tiles away from where I actually clicked.

When this happens, the only temporary fix is fully restarting the RuneLit...

ember flareBOT
glad ermine
#

@trail marten I found a bug in tag layouts (I think?), it's been there forever. If you have two different layouts that have the same name (i.e. one contains the other), then the items from the shorter name will be shown in the same layout as the items from the one with the longer name

trail marten
#

that is a bank tags issue

glad ermine
#

sorry it's the other way around, the shorter name will display the longer name's items

worthy sparrow
#

it's not really a bug

ember flareBOT
glad ermine