The requirement for pickpocketing an elf is to have started Mourning's
End Part I for access to Lletya, not to have completed Mourning's End
Part II.
Fixesrunelite/runelite#8806
As described in 5bebd34bb, HIGH_RISK is not a PVP world type.
Note: this will not affect the world hopper plugin, as it both
explicitly references the high risk world type, and references the
http-api WorldType implementation, not the runelite-api WorldType which
is being modified in this commit.
Fixesrunelite/runelite#8605Fixesrunelite/runelite#8624
This world type is not specifically a PVP world type; at the time of
this commit, world 365 is a non-PVP high-risk world, where the world is
the same as a regular members' world, except that the Protect Item
prayer is disabled.
As described in 5bebd34bb, HIGH_RISK is not a PVP world type.
Note: this will not affect the world hopper plugin, as it both
explicitly references the high risk world type, and references the
http-api WorldType implementation, not the runelite-api WorldType which
is being modified in this commit.
Fixesrunelite/runelite#8605Fixesrunelite/runelite#8624
This world type is not specifically a PVP world type; at the time of
this commit, world 365 is a non-PVP high-risk world, where the world is
the same as a regular members' world, except that the Protect Item
prayer is disabled.
This commit adds a PVP-world-like combat level range text to the
wilderness level in non-PVP worlds, displaying the range of combats you
can attack at any given wilderness level.
Closesrunelite/runelite#3103Closesrunelite/runelite#3318
This adds a color indicator per marker, saved to config, allowing
multiple markers to be different colors. In addition, a configuration
option is added to switch between per-tile color display or current
configured color display. (that is, new or existing behavior)
This change will set a color in config for old markers with null colors
when those markers are loaded.
Fixesrunelite/runelite#3395
When logging in to the game with the plugin disabled, enabling it will
not cause points to be filled, as the game state trigger will not be
reached. This commit properly loads points on plugin startup and clears
them on shutdown.
This includes various code quality improvements such as stronger access
control, enforcing newlines at EOF, naming magic numbers and strings,
and utilizing higher efficiency methods and class constructors.
This fixes the bug introduced in runelite/runelite#5890 where attempting
to mark a non-marked tile while having the "Remember color per tile"
config disabled would prevent new tiles from being marked. Instead, it
properly ensures that unmarking tiles with that config disabled will not
re-mark it with an updated color, causing a second unmark to be needed.
This adds a color indicator per marker, saved to config, allowing
multiple markers to be different colors. In addition, a configuration
option is added to switch between per-tile color display or current
configured color display. (that is, new or existing behavior)
This change will set a color in config for old markers with null colors
when those markers are loaded.
Fixesrunelite/runelite#3395
When logging in to the game with the plugin disabled, enabling it will
not cause points to be filled, as the game state trigger will not be
reached. This commit properly loads points on plugin startup and clears
them on shutdown.
This includes various code quality improvements such as stronger access
control, enforcing newlines at EOF, naming magic numbers and strings,
and utilizing higher efficiency methods and class constructors.
Particularly since exposing StatBoosts and StatChanges through the item
stats service, it has become evident that storing stat change data as a
human-readable string is not especially useful for consumers of the
service as they must handle string processing, particularly for special
cases such as range stat boosts or spicy stews. This patch changes
StatChanges to expose their relative, theoretical, and absolute change
values as ints instead for ease of consumption, and adds methods to get
human-readable versions of these relative and theoretical values for
display purposes.
Fixesrunelite/runelite#6594
This allows players to select from a number of positions where they
would like highlighted player's names to be drawn relative to the
player's model.
Closesrunelite/runelite#878
After the introduction of the new ABOVE_MAP layer, the dev tools overlay
was no longer able to draw above the map, which is needed for the widget
inspector.
Prior to this commit, hitpoints exp drops (and combined exp drops
containing hitpoints) would be highlighted for any combat prayer. This
commit corrects this behavior so combined drops will only be highlighted
when containing the proper combat style prayer, and split exp drops will
only highlight hitpoints when the correct prayer type was active for the
experience drops which precede it.
Fixesrunelite/runelite#1697
This adds a test which exposes an edge case where the needed prayer
levels to next combat level had been calculated to be 3 instead of 1,
and fixes that calculation.
Fixesrunelite/runelite#7103
This commit moves constants from the test to the overlay, and replaces
instances of magic numbers with them. It additionally fixes the odd
check in `correctPrayer()` and fixes some minor whitespace issues.
This commit fixes the occasional issue of xp drops not being highlighted
while flicking prayer from the prayer menu; that is, before this commit
it was possible to select or deselect a prayer between xp drop widgets
being spawned, causing different highlighting for them. This commit
saves the active prayer at the beginning of each tick and uses that
tick's prayer for all widgets unhidden during that tick.
Fixesrunelite/runelite#1280Closesrunelite/runelite#6679
[Per the updates for the upcoming
seasonal](https://www.runescape.com/oldschool/deadman/season), similar
to previous tournaments:
> Teleblock will now last for 150 seconds, or for 75 seconds with Protect from Magic active.
When becoming affected by an ice spell, such as Ice Barrage, when moving
prior to the effect's start, the previous code had a subtle bug where
the freeze timer would be applied in the chat message subscriber, but
the `client` would update the player's position before the onGameTick
subscriber was executed, meaning any movement on the same tick the
player became frozen would be registered as "movement", thus removing
that timer.
This fix sidesteps that issue by also ensuring that the client's tick
is different than the freeze tick, since that value appears to remain
unmodified between execution of these two methods.
Fixesrunelite/runelite#6658
In side stones view, going through the spell autocast selection process
will cause the combat widget to become unloaded and reloaded, rather
than triggering the previous code path where the widget would change
hidden state. This commit adds a second subscriber to handle this path
as well.
Fixesrunelite/runelite#6557
This patch updates the inventory tags plugin to utilize the MenuManager
util to better add menu options to the inventory tab.
Fixesrunelite/runelite#6132
VarClientInt(2) is set to `1` whenever a tooltip is present, meaning we
should never render a tooltip when it is set that way. Some menu options
(world map dungeon links) have a null widget associated with them, and
do not utilize the TOOLTIP_TIMEOUT VarClientInt, so this check is
necessary to avoid adding a duplicate tooltip.
Fixesrunelite/runelite#3278
This updates the fairy ring icon to more closely resemble existing
travel icons and be less busy-looking than the current "sparkly" icon.
Closesrunelite/runelite#2940
The effects of the Tele Block spell expire on three possible conditions:
1. When a player leaves the wilderness on a non-PVP/DMM world
2. When a player enters a PVP/DMM world safe zone
3. When a player logs out
Leaving the wilderness can be detected via Varbits changes, entering
safe zones in PVP/DMM worlds can be detected via WidgetHiddenChanged
events, and logging out is already detected via GameStateChanged events.
With that said, addressing the first two cases is not a trvial effort as
there are certain race conditions that must be handled. The
WidgetHiddenChanged event triggers upon login to PVP worlds regardless
of where you log in, and the PVP widgets all initially load in a state
which would be reflective of being in a safe zone, and are later set to
the proper state before the first display frame is rendered. Similarly,
during world hops, GameStateChanged and VarbitChanged events trigger in
a pattern which causes the client to think that a player is always
outside the wilderness upon reaching a `LOGGED_IN` game state; that is,
the following events occur on world hopping:
1. Game state changes to `HOPPING`
2. Varbits are all reset to default values. In the case of the
wilderness varbit, it is set to 0--the value representing being
outside the wilderness.
3. Game state changes to `LOGGED_IN`
4. Varbits are set based on player information. Only at this point is
the IN_WILDERNESS varbit set to its proper value.
To handle these race conditions, the event subscribers for game state
change and widget hidden events only set a flag which is checked once
per game tick to handle PVP safe zone (and wilderness varbit) checks.
Fixesrunelite/runelite#2384
This plugin displays the virtual level in the denominator of given
skills, and the virtual total level on the skills tab.
Fixesrunelite/runelite#375
Co-authored-by: Joshua Filby <joshua@filby.me>
The plugin is initialized with `lastTime` as null, meaning that if
`onGameTick` is called before `onInteractingChanged`, you can encounter
a case where after starting the client or plugin, `lastTime` has not yet
been set while `client.getLocalPlayer().getInteracting` is null (because
`onGameTick` gets sequenced before `onInteractingChanged` per tick),
causing an NPE when trying to compare a null Duration.
Fixesrunelite/runelite#5451
If a file is expected but not found, an IllegalArgumentException will be
thrown as a result of `null` being passed to the `ImageIO.read` call.
This commit adds better logging for this error case.
In Seasonal Deadman mode, protect from magic does not half the duration
of normal spellbook freeze spells (bind, snare, entangle) unlike
normal worlds and the permanent Deadman mode world.
Source: https://www.runescape.com/oldschool/deadman/season
This replaces invocations of `Class.getResourceAsStream(path)` in order
to relieve plugin/client code from managing synchronization and handling
exceptions.