The overlay was storing the previous frames tooltip width and height in
the overlay bounds, to use for the next frame to position the overlay
correctly so that it did not get pushed off canvas.
This requires the tooltip overlay to have a non-empty bounds, which is
not something dynamic/tooltip overlays usually support. The overlay
renderer translates the g2d to the given bounds prior to rendering.
The reason this worked was it always kept x/y=0, causing the translation
to not happen.
However this incorrectly caused the overlay to be picked when testing
overlay bounds against the mouse position when up near the corner of the
screen. This would then cause the player to pick the tooltip overlay,
despite the overlay not being rendered there.
This fixes an issue where the xp drop recoloring would incorrectly
recolor the xpdrop if the prayer was flicked on client side in between
when the server tick happens and when the xp drop is created
This switches party and member ids to also be 64bit ints. This uses
considerably less data and cpu due to being able to use binary websocket
frames, and the server can avoid json deserialization completely.
Also hold member ids instead of party member references in the party
plugin, since the members can be reset if connection is lost, causing it
hold refs to old party members.
Encode location update points into a single int, since the updates are
so frequent.
If the server expires the membership before the client in the party
reconnects, it will falsely assume it is in a party when it isn't.
Additionally since users are resynced on reconnect, this was duplicating
members as it would get joins for already joined members.
The command could not work before because the capitalize in
longBossName would produce a capital Of causing the hiscore
skill name to not match.
This normalizes from the hiscore name by removing : to compare
it to our internal boss names.
debug mode aggressively checks and throws whenever a gl error occurs.
The glBlitFramebuffer call is bizzare because with the alpha channel
enabled on the renderbuffer it appears to work correctly despite
causing an INVALID_OPERATION error. We have no use for the alpha channel
since the dst alpha value is always 1, so it can just be disabled on macos.
Orginally the only way to form a party was via Discord invites. This has
changed semi-recently to allow sharing party ids instead.
The Discord invite system is finnicky since it doesn't work unless
Discord is detected, doesn't work right with multiple clients, or
multiple Discords. And, discord_rpc is deprecated without a suitable
replacement.
This changes the party system to instead always require sharing party
ids instead.
It can't be assumed the array passed to setModIcons is still correct in
the async image callbacks. Instead, fetch the current modicons array in
the callback and use that.
The inventory can be moved pre-interface tick by the tli subchange
listener, as well as post-our client tick event from script events
running.
This makes it difficult to correctly and generically move the interface,
since it would have to be moved pre-interface tick and also pre-frame.
Currently the code moves the interface pre-frame, which looks okay, but
since it is ticking the interface when it is a different position,
clicks on it do not work correctly.
We do not have events for pre-interface tick, so use forced position to
reliably set the position
Hovered overlay already accounts for render order, with the exception of
the vanilla WidgetOverlays which are drawn prior to any of our overlays
being drawn. Instead we order them in render-order, which works for the
dynamic-layer ones.
The minimap must be top_right so that our overlays layout around it
correctly, which currently causes it to be picked up first over dynamic
overlays due to the way overlay sorting is done.
This redudces the memory consumption significantly since it requires
less of the image to be in memory at one time
Co-authored-by: Explv <explv@osbot.org>
If the request has its own UA set, don't overwrite it with the default
RuneLite one. This has to be an interceptor and not a network
interceptor so that it runs prior to the okhttp BridgeInteceptor, which
is what sets the default okhttp ua.