How kolief/solace works
Purpose and Runtime Entry Points
Solace is a Java/Gradle desktop client built atop a pinned RuneLite version, providing automation-oriented APIs, an SDK, bundled plugins, and loadable external PF4J plugins. Production starts from client/loader/src/main/java/net/solace/loader/SolaceLauncher.java (packaged as a fat JAR); development uses SolaceLoaderDev.java. SolaceInitializer.java wires client services during RuneLite startup.
Module Boundaries
The public automation contract is api/src/main/java/net/solace/api/Solace.java, with interfaces for game state, entities, items, movement, widgets, interaction, events, and plugins. Concrete RuneLite-backed implementations live separately in client/bindings/src/main/java/net/solace/impl/, rooted by ApiModule.java. This interface/implementation boundary isolates scripts and plugins from RuneLite internals and version-specific reflection.
Client Bootstrap and Service Composition
The loader initializes shared state and dependency modules, then integrates interaction, external-plugin, UI, and event facilities:
• client/loader/src/main/java/net/solace/loader/SolaceLoader.java
• client/loader/src/main/java/net/solace/loader/modules/LoaderModule.java
• client/loader/src/main/java/net/solace/loader/modules/InteractionModule.java
• client/loader/src/main/java/net/solace/loader/events/EventManager.java
Control flow is launcher → loader/initializer → dependency injection/modules → RuneLite client and plugin managers. Shared local directories and loader state are represented in common/src/main/java/net/solace/loader/Directories.java and SolaceManager.java.
Game Observation and Automation
Bindings wrap RuneLite actors, tiles, items, widgets, and game state, while API providers and queries expose filtered script-facing views. Representative paths:
• api/src/main/java/net/solace/api/query/Query.java
• api/src/main/java/net/solace/api/interact/Automation.java
• client/bindings/src/main/java/net/solace/impl/domain/game/ClientImpl.java
An interaction request is built for an actor/item/tile/widget, queued through the loader interaction manager, executed as automated menu/mouse activity, and surfaced through pre/post automation events. Mouse execution is configurable via MouseManager.java and movement strategies under api/.../interact/mouse/.
Movement and World Data
Movement combines local collision, global collision maps, teleports, and transports to produce walking behavior:
• client/bindings/src/main/java/net/solace/impl/movement/pathfinder/Pathfinder.java
• client/bindings/src/main/java/net/solace/impl/movement/WalkerManager.java
• api/src/main/java/net/solace/api/movement/pathfinder/GlobalCollisionMap.java
Offline cache tooling generates collision-map data from the RuneScape cache in data/cache-tools/src/main/java/net/solace/rscache/map/MapGenerator.java; generated artifacts are consumed by the data/collision-maps module. Teleport/transport decisions are constrained by item, quest, skill, variable, and charge requirements.
Plugin Ecosystem and UI
Built-in automation plugins are compiled in plugins/bundled, using looped/task plugin abstractions from api/.../plugins; loader-side managers schedule and isolate their execution:
• client/loader/src/main/java/net/solace/loader/plugins/PluginManagerImpl.java
• client/loader/src/main/java/net/solace/loader/plugins/DefaultLoopedPluginExecutor.java
• plugins/bundled/src/main/java/net/solace/loader/plugins/fighter/SolaceFighterPlugin.java
External JARs from ~/.solace/plugins/ are discovered and loaded through PF4J-based SDN support in plugins/hub/src/main/java/net/solace/sdn/pf4j/SdnPf4jPluginManager.java. Swing-based configuration, profile, plugin-list, loadout, and external-plugin panels are provided by the ui module, notably ui/src/main/java/net/solace/ui/module/UiModule.java.
SDK and Version-Mapping Infrastructure
SDK offers ergonomic static façades over API services for third-party script authors, e.g. sdk/src/main/java/net/solace/sdk/game/Client.java and sdk/src/main/java/net/solace/sdk/movement/Walker.java. RuneLite updates require canonical/version mappings, generated and applied through mappings/generator/.../MappingGenerator.java and mappings/tool/.../GenerateVersionPackage.java; these mappings are a critical compatibility boundary between Solace bindings and obfuscated RuneLite code.
Main entry points: SolaceLoader.java Loader and initializer · ApiModule.java RuneLite bindings · Solace.java Public Solace API · PluginManagerImpl.java Bundled plugin manager
Components 21
Client Runtime
- Solace launcher · Production startup entry point.
client/loader/src/main/java/net/solace/loader/SolaceLauncher.java - Loader and initializer · Wires Solace into RuneLite startup.
client/loader/src/main/java/net/solace/loader/SolaceLoader.java - Loader module
client/loader/src/main/java/net/solace/loader/modules/LoaderModule.java - Interaction module
client/loader/src/main/java/net/solace/loader/modules/InteractionModule.java - Directories and manager · Owns local directories and loader state.
- Pinned RuneLite client · Provides client and native plugin managers.
- Automation events · Publishes pre/post automation events.
client/loader/src/main/java/net/solace/loader/events/EventManager.java
Automation API
- Public Solace API · Stable script and plugin interfaces over game facilities.
api/src/main/java/net/solace/api/Solace.java - Queries · Provides filtered script-facing game views.
api/src/main/java/net/solace/api/query/Query.java - RuneLite bindings · Version-isolating implementations of API interfaces.
client/bindings/src/main/java/net/solace/impl/ApiModule.java - Game client binding
client/bindings/src/main/java/net/solace/impl/domain/game/ClientImpl.java - Automation requests · Builds actor, item, tile, and widget actions.
api/src/main/java/net/solace/api/interact/Automation.java - SDK façades · Ergonomic static access to API services.
sdk/src/main/java/net/solace/sdk/game/Client.java
Movement Data
- Pathfinder and walker · Combines collision, teleports, and transports into walking behavior.
client/bindings/src/main/java/net/solace/impl/movement/pathfinder/Pathfinder.java - Collision maps · Global collision data consumed by pathfinding.
api/src/main/java/net/solace/api/movement/pathfinder/GlobalCollisionMap.java - Map generator · Generates collision data from the RuneScape cache.
data/cache-tools/src/main/java/net/solace/rscache/map/MapGenerator.java
Plugin Ecosystem
- Bundled plugin manager · Schedules and isolates built-in automation plugins.
client/loader/src/main/java/net/solace/loader/plugins/PluginManagerImpl.java - Bundled plugins
plugins/bundled/src/main/java/net/solace/loader/plugins/fighter/SolaceFighterPlugin.java - PF4J external plugins · Discovers external JARs from ~/.solace/plugins/.
plugins/hub/src/main/java/net/solace/sdn/pf4j/SdnPf4jPluginManager.java - Swing UI · Provides profiles, plugin lists, loadouts, and external-plugin panels.
ui/src/main/java/net/solace/ui/module/UiModule.java
Compatibility Tooling
- Version mappings · Maintains bindings against obfuscated RuneLite versions.
Connections 22
- Solace launcher → Loader and initializer: starts
- Loader and initializer → Loader module: installs
- Loader and initializer → Interaction module: installs
- Loader and initializer → Directories and manager: initializes
- Loader and initializer → Pinned RuneLite client: integrates with
- Loader module → RuneLite bindings: composes
- RuneLite bindings → Public Solace API: implements
- Game client binding → Pinned RuneLite client: wraps
- RuneLite bindings → Game client binding: includes
- Queries → Public Solace API: extends
- SDK façades → Public Solace API: facades over
- Automation requests → Interaction module: queues actions through
- Interaction module → Automation events: emits
- Pathfinder and walker → Collision maps: uses
- Map generator → Collision maps: generates
- RuneLite bindings → Pathfinder and walker: provides movement
- Bundled plugin manager → Bundled plugins: schedules
- Bundled plugins → Public Solace API: automates through
- PF4J external plugins → Bundled plugin manager: loads into
- Swing UI → PF4J external plugins: manages
- Version mappings → RuneLite bindings: maintains compatibility for
- Bundled plugin manager → Pinned RuneLite client: coordinates plugins with