Skip to main content

Power Skiller

PowerSkillerPlugin is a native n3 port of PiggyPlugins PowerSkiller under com.n3plugins.powerskiller (config group n3powerskiller, disabled by default).

Architecture

  • PowerSkillerPlugin owns RuneLite lifecycle, hotkey toggle, overlay, bootstrap gate, Break Handler registration, and input-lock request/release.
  • PowerSkillerController is the pure per-tick state machine.
  • PowerSkillerRuntime keeps RuneLite and SDK access out of the controller.
  • RuneLitePowerSkillerRuntime adapts to InteractionApi.actions.* and sdk.query.
  • PowerSkillerItemPolicy handles tag-stripped, case-insensitive substring matching for required tools and keep-list items.

State priority

  1. Stopped by hotkey -> STOPPED
  2. Account bootstrap or login unavailable -> WAITING
  3. Required tools missing -> MISSING_TOOLS
  4. Moving or animating -> ANIMATING
  5. Inventory full + banking enabled + bank closed → OPEN_BANK
  6. Banking enabled + bank open + depositables present → DEPOSIT_ITEMS
  7. Banking enabled + bank open + no more depositables → CLOSE_BANK
  8. Banking disabled + droppable items present → DROP_ITEMS
  9. Otherwise interact with configured object or NPC → FIND_TARGET
  10. Missing target or hard action failure → TIMEOUT

Each active state issues at most one interaction per game tick.

Behavior

  • searchNpc switches target lookup between NPCs and tile objects.
  • objectToInteract is the configured object or NPC name.
  • expectedAction is passed directly to the action class.
  • toolsToUse and itemsToKeep are comma-separated substring policies after HTML tag stripping and lower-casing.
  • shouldBank opens the nearest bank with BankActions.openNearest() and deposits each unprotected bank-inventory widget with Deposit-All one per tick until none remain, then closes the bank with BankActions.close() before resuming skilling.
  • When banking is disabled, drops one eligible inventory item per tick with InventoryActions.use(widget, "Drop") until no droppable items remain, then resumes skilling.
  • useForestryTreeNotClosest restricts object targeting to known tree names and ranks nearest supported trees. True multi-drop batching remains pending live RuneLite validation.
  • While the hotkey-controlled loop is running, the plugin is active in Break Handler. A due or active break releases the input lock and skips the action tick before the controller can interact with objects, NPCs, inventory, or bank.

Validation

.\gradlew.bat test --tests com.n3plugins.powerskiller.* --console plain
.\gradlew.bat test --tests com.n3plugins.NativeManifestTest --tests com.n3plugins.PacketUtils.InputLockWiringTest --console plain
.\gradlew.bat compileJava --console plain

Live validation pending

Hotkey behavior, target interaction timing, bank-inventory Deposit-All, one-item drop cadence, and forestry target ranking still require in-client RuneLite observation.