Enables the pf4j [development mode](https://pf4j.org/doc/development-mode.html)
to support loading external plugins from sources, which enables java's
hotswap functionality.
To use this feature set the `plugin.development.path` property or
`PLUGIN_DEVELOPMENT_PATH` environment variable to the directories
containing your plugins, e.g. `../plugins;../my-custom-plugins`
Once set the `ExternalPluginManager` will ignore the configured
repositories and externalmanager directory, and instead load all
the built plugins from the specified directories.
Utilizing this feature does require some additional configuration
of the build of the plugins `build.gradle.kts`. Within the `subprojects`
section add:
```
tasks.register<Copy>("copyDeps") {
into("./build/deps/")
from(configurations["runtimeClasspath"])
}
```
See https://github.com/open-osrs/plugins/pull/260 for the `openosrs/plugins` change
This enables the following workflow:
0. Optional tip: Set the `external.system.substitute.library.dependencies` registry value to `true` to force classpath resolution within the project
1. Open the `runelite-client` project in IntelliJ
2. Add the `plugins` repository as a module (Gradle -> Plus symbol ->
`plugins/build.gradle.kts`)
3. Gradle build the client with: `build publishToMavenLocal :runelite-client:publishToMavenLocal :runelite-api:publishToMavenLocal :http-api:publishToMavenLocal`
4. Gradle build the plugins with: `build copyDeps`
5. Add the `PLUGIN_DEVELOPMENT_PATH` environment variable to the run
configuration
Once the above is done the edit -> reload -> edit cycle can begin:
1. Start the client in debug mode using the run goal
2. Edit the external plugin
3. Perform Build > Build Module
4. Observe hotswapping in action!
5. If hotswapping failed, or your change requires a plugin restart,
click the hotswap button in the plugin list to instantly restart it
Because itemManager#getItemPrice() canonicalizes the passed item ID, it
is no longer necessary to get noted items' base IDs or otherwise
canonicalize item IDs before interacting with the method.
Historically price lookup was done by sending a web request on price
lookups, which required calls to be done on an executor. As of
a1ae397e11, client prices are loaded periodically and cached, thus no
longer imposing any thread requirement on price lookup.
This fixes an issue where the tab would reactivate if you clicked the active tab while the withdraw-x dialog was open. This was caused by the handling for withdraw-x, which activates the tab again a tick after the withdraw-x dialog is closed.
Gives you the ability to put a screen marker around a widget that has a menu option attached to it
Co-authored-by: Jasper Ketelaar <Jasperketelaar@kpnmail.nl>
Co-authored-by: Tomas Slusny <slusnucky@gmail.com>
Instead of fixed color offsets for outer and inner border colors switch
to multiplicative offsets. This also makes overlay color alpha
recoloring work properly with background component border.
Signed-off-by: Tomas Slusny <slusnucky@gmail.com>