SDK Competitor Gap Audit
Current as of 2026-07-09. This audit compares n3Plugins' live SDK/API surface with public JavaDocs for DreamBot, Inubot/RSPeer, Storm, and Twilite. It is a planning artifact only: live source remains authoritative, and every proposed helper still needs RuneLite-revision validation before being treated as runtime-proven.
Sources Reviewed
- n3Plugins live source under
src/main/java/com/n3plugins/sdkandsrc/main/java/com/n3plugins/InteractionApi. - n3Plugins current-state references:
N3PLUGINS_SOURCE_OF_TRUTH.md,docs/agent-handbook.md, and focused SDK docs. - DreamBot JavaDocs:
https://dreambot.org/javadocs/, especially all-classes and index pages forBank,Inventory,Walking,GameObjects,NPCs,Dialogues,GrandExchange,ItemProcessing,LivePrices,Mouse,Keyboard, script frameworks, events, quests, diaries, and random solvers. - Inubot/RSPeer JavaDocs:
https://javadocs.inubot.com/, especially the all-classes/index pages for scene projection/field-of-view, query/loadout, cutscene, world, and game-state helpers. - Storm JavaDocs:
https://stormjavadocs.z6.web.core.windows.net/, especially package/class hierarchy and index pages fornet.storm.sdk.*, query results,MenuFactory,BankWornItems,Friends,Minigames,Production,Prices,Worlds,WorldMap,TransportLoader, item info, plugin task APIs, blocking events, and event models. - Twilite JavaDocs:
https://twilite.dev/javadocs/, especially package/class hierarchy fordev.twilite.game.facade,dev.twilite.game.stream,dev.twilite.game.loadout,dev.twilite.game.simulation, generated IDs, interaction scopes, menu options, prices, TOTP, and tick assumptions.
Executive Summary
n3Plugins is already strong in result-aware interactions, RuneLite-native packet dispatch, pathfinding ownership, ID-map-assisted queries, workflow builders, loadouts, and local Agent Server documentation. Since the original audit, the highest-leverage SDK gap-fill surfaces have landed: typed query snapshots, item metadata and price facades, bank worn-equipment helpers, bank state reads, world/world-map reads, menu snapshots, social snapshots, and line-of-sight helpers.
The next competitor gaps are now mostly domain breadth and ergonomics beyond the newly landed quest/diary progress reads, passive event snapshots, and caller-owned runtime loop helper. The same n3 invariants still apply: automation writes go through InteractionApi.actions.* and return InteractionResult; raw reads stay in sdk.*; long-running ownership remains with PacketUtils, ActionPacer, and Walker. Passing source tests does not prove live RuneLite parity; widget, world-map, menu, social, client-backed LOS, diary mapping, and passive event helpers remain live-verification pending until observed in-client.
Current n3 Baseline
| Area | n3 coverage today | Gap posture |
|---|---|---|
| Result-aware actions | Broad InteractionApi.actions.* coverage for bank, bank worn-equipment deposit, inventory, NPCs, objects, players, widgets, GE, trade, shop, magic, prayer, movement, production, minigames, sailing, blocking events, and utility events. | Strong; keep this as the public automation surface. |
| Queries | Inventory, bank, equipment, deposit box, GE, shop, trade, NPC, player, tile object, tile item, widget, and quick-prayer query classes, plus immutable QueryResults<T> snapshots exposed through results(). | Stronger parity with Storm/Inubot-style APIs; continue adding shared filters only when repeated plugin code proves the need. |
| Widgets/items | Widget, inventory, bank, bank state, bank worn equipment, equipment, dialogue, shop, GE inventory, rune pouch, combat, prayer, item metadata, and price helpers. | Strong for core gameplay; live verification remains pending for revision-sensitive widget-backed reads. |
| Movement | Shared walker, shortest-path data, route options, transports, requirements, reachability, navigation actions, banked route planning, and WalkerResourceApi transport/route category descriptors. | Strong; add discoverability and additional route-result introspection rather than new tick owners. |
| Workflow | Task pipeline, automation state machine, combat/production/banking/enchanting builders, inventory plan, loadouts. | Good base; competitors expose more script/task lifecycle ergonomics. |
| Client/game state | Client bridge, game vars, delays, screenshots, hint arrows, world-point/area utilities, worlds/world-map reads, menu entries, social snapshots, and line-of-sight helpers. | Camera reads, event snapshots, and script/runtime ergonomics are the main remaining gaps. |
| Developer Tooling / Testing | Session-only command console (Code Console), developer inspection panel (DevTools), and live-client action probe runner (API Tester). | Strong developer and diagnostic support; keep tests structured in the harness rather than ad-hoc. |
| Documentation/discovery | Agent Server generated SDK index plus docs/examples. | Strong; competitor mapping should become a tracked backlog. |
Implemented Since Audit
| Surface | Status | Notes |
|---|---|---|
QueryResults<T> and query results() adapters | Implemented | Immutable snapshots now cover item, equipment, NPC, player, tile item, tile object, and widget query flows while preserving legacy result() compatibility. |
ItemInfoApi, ItemInfo, PricesApi, PriceQuote | Implemented | Read-only metadata and price facades are backed by existing item-definition and market data sources; Market Alcher strategy remains plugin-local. Reference: Item Info And Prices. |
BankWornEquipmentApi, BankWornEquipmentItem, BankWornEquipmentActions | Implemented / live-pending | Rev239 live pass on 2026-07-09 saw the worn-equipment bank view expose visible deposit-capable item widgets under 983044, but n3_get_bank_status//api/v1/bank/status reported open=false after switching to that view; typed loadout/worn-state reads hit class lp declares multiple JSON fields named hr. Source now maps inventory/equipment entries to plain agent JSON and omits raw backing widgets; patched client reload/live retest is still pending. |
BankStateApi, BankStateSnapshot | Implemented / live-pending | Rev239 live pass on 2026-07-09 confirmed the main bank open read (open=true), bank item snapshot (Coins at index 0 on widget 786444), search widget action (786474 with Search), default quantity widget action (786465 with Default quantity: 10), and varbits 3958=0, 3959=0, 6590=0; placeholder/rearrange/search toggles still need explicit UI-state changes before this row leaves live-pending. |
ProductionApi, ProductionProduct, ProductionQuantityButton | Implemented / live-pending | Make-X and legacy Smithing read helpers expose visible products, action descriptions, selected-state heuristics, quantity buttons, and an adapter hook for custom quantity; the live default currently returns empty when no stable client source is exposed. |
MinigamesApi, MinigamesSnapshot, MinigameTeleportOption | Implemented / live-pending | Rev239 live pass on 2026-07-09 found a mismatch: with the visible grouping/minigame panel showing Pest Control (62324748, text Pest Control<br><col=ff0000>Requires combat level 40), both n3_get_minigames and n3_read_sdk minigames.state returned open=false, all configured destination widgets hidden, canTeleport=true, cooldownValue=0, and lastTeleportUsage=0. Source now resolves current grouping widgets by visible destination text under group 951 and routes teleport actions through that resolved widget; patched client reload/live retest is still pending. |
WorldsApi, WorldSnapshot, WorldMapApi | Implemented / live-pending | Rev239 live pass on 2026-07-09 confirmed visible world-map detection through n3_get_world_map and n3_read_sdk world-map.state: open=true, center 3209,3220, zoom 3; coordinate conversion still needs an explicit live probe before this row leaves live-pending. Reference: World SDK. |
MenuEntriesApi, MenuEntrySnapshot | Implemented / live-validated | Rev239 live pass on 2026-07-09 confirmed NPC hover/right-click snapshot parity for Man (level-2) (Examine, Pickpocket, Talk-to, Attack, identifier 2813), object parity for Bed (EXAMINE_OBJECT, identifier 424, params 27,46), inventory-item parity for Bronze pickaxe (itemId=1265, widget 9764864, slot param 1, Examine/Drop/Use/Wield ordering), ground-item parity for Bronze axe (EXAMINE_ITEM_GROUND/GROUND_ITEM_THIRD_OPTION, identifier 1351, params 25,46), and widget parity for the Prayer tab (CC_OP, identifiers 2 and 1, param0=-1, widget 35913797); n3_get_menu_entries preserved colored targets and n3_read_sdk menu.entries normalized target text. Reference: Menu Entries. |
FriendsApi, ClanApi, ChatApi and social snapshots | Implemented / live-pending | Friends chat, clan, and recent chat message reads exist for overlays and coordination. Reference: Social Snapshots. |
CameraApi, CameraSnapshot | Implemented / live-validated | Rev239 live pass on 2026-07-09 confirmed n3_get_camera and n3_read_sdk camera.snapshot parity: yaw/target 12060, pitch/target 3064, camera position 5280,7290,-2630, zoom 413, viewport 512x334, offset 4,4. |
LineOfSightApi | Implemented / live-pending | Rev239 live pass on 2026-07-09 confirmed same-tile and clear-path reads from 3206,3224,2: same tile and probes to 3207,3224,2, 3206,3225,2, 3205,3224,2, 3206,3230,2, 3212,3224,2, 3200,3224,2, 3206,3218,2, 3210,3228,2, and 3202,3220,2 all returned visible=true; blocked-path behavior still needs a known obstacle/false case before this row leaves live-pending. |
ThreatMapApi | Implemented / live-pending | Read-only tile-threat helpers cover projectile targets, graphics-object hazards, and aggressive NPC line-of-sight checks; live behavior remains pending. |
QuestProgressApi, DiaryProgressApi, and progress snapshots | Implemented / live-validated | Rev239 logged-in live pass on 2026-07-09 confirmed n3_get_progress, n3_read_sdk progress.quests, and n3_read_sdk progress.diaries return ok without must be called on client thread; the account reported Learning the Ropes as FINISHED and diary snapshots returned explicit mapped varbit task rows. Reference: Progress APIs. |
SdkEvents and passive event snapshots | Implemented / live-pending | Rev239 live pass on 2026-07-09 confirmed n3_get_recent_events and n3_read_sdk events.recent parity for buffered inventory deltas (containerId=93, item deltas including 1351, 558, 556, 321), XP gained (COOKING +30, FISHING +3170), NPC spawns/despawns with world/local locations, and animation changes with actor name, animation id, world/local location, tick, and timestamp; projectile movement remained empty and still needs a live projectile scenario. Reference: Event Snapshots. |
AutomationLoop, AutomationLoopConfig, AutomationLoopContext, LoopPulseResult | Implemented | Caller-owned loop helper provides same-tick dedupe, optional PacketUtils bootstrap gating, break-gate callbacks, status/error text, and adapters for TaskPipeline and AutomationStateMachine. |
InventoryDropPattern, InventoryDropActions | Implemented | Comparator-backed row/column/custom drop patterns and result-aware dropNext(...) issue at most one "Drop" interaction per call. |
WalkerResourceApi, WalkerRouteCategoryDescriptor, WalkerCuratedTransportNetwork, WalkerTransportResourceDescriptor | Implemented | Exposes immutable route category, shortest-path transport resource, and curated transport network descriptors to improve routing discoverability and metadata introspection. |
ApiTesterPlugin and TestRegistry | Implemented | Developer/QoL live-client harness runs individual InteractionApi action probes, collates pass/fail results, and safeguards against destructive actions with warning gates. Reference: API Tester. |
Priority Gap Backlog
Current Status
| Status | Gap | Current n3 state | Next action |
|---|---|---|---|
| Implemented | Typed query result collections | QueryResults<T> and query results() methods exist. | Add only proven specialized adapters later; do not change legacy result() returns. |
| Implemented | Shared item metadata and price facade | sdk.items.ItemInfoApi, ItemInfo, PricesApi, and PriceQuote exist; see Item Info And Prices. | Keep Market Alcher strategy and budgeting outside the shared SDK. |
| Implemented / live-pending | Bank worn-items panel | BankWornEquipmentApi reads and BankWornEquipmentActions.depositAllWornEquipment() exist. | Live-validate bank panel reads/deposit behavior on the target RuneLite revision. |
| Implemented / live-pending | Bank state details | BankStateApi and BankStateSnapshot exist. | Live-validate mode/search/placeholder/widget state reads. |
| Implemented / live-pending | World and world-map facade | WorldsApi, WorldSnapshot, and WorldMapApi exist; see World SDK. | Live-validate world-map state and coordinate conversion helpers. |
| Implemented | Walker resource metadata | WalkerResourceApi and descriptors exist. | Provide route and category metadata introspection to plugins without exposing planner internals. |
| Implemented / live-pending | Menu introspection | MenuEntriesApi and MenuEntrySnapshot exist; see Menu Entries. | Connect failed InteractionResult diagnostics to candidate menu entries only if repeated callers need it. |
| Implemented / live-pending | Social/friends/clan facade | FriendsApi, ClanApi, ChatApi, and snapshot records exist; see Social Snapshots. | Live-validate friends chat, clan, and recent chat snapshots. |
| Implemented / live-pending | Field-of-view / line-of-sight helpers | LineOfSightApi exists under sdk.client. | Live-validate collision and viewport behavior. |
| Implemented / live-pending | Production/make-X facade breadth | ProductionApi read helpers now expose visible products, action descriptions, quantity buttons, selected-state heuristics, and custom quantity availability; writes stay in ProductionActions. | Live-validate Make-X and Smithing child IDs and selected-state markers on the target RuneLite revision. |
| Implemented / live-pending | Minigame/grouping facade | MinigamesApi exposes grouping tab state, selected-destination heuristic, cooldown/status, last-usage varplayer, and destination availability; writes stay in MinigameTeleportActions. | Live-validate selected-state marker and destination widget visibility on the target RuneLite revision. |
| Implemented / live-pending | Quest/diary requirements | QuestProgressApi, DiaryProgressApi, QuestRequirement adapters, Quest Helper snapshots, and GameVars exist; see Progress APIs. | Extend diary mappings only when stable varbit or varplayer coverage is identified; do not infer unknown tasks. |
| Implemented / live-pending | Camera facade | CameraApi exposes read-only yaw, pitch, zoom, camera position, targets, viewport bounds, and viewport visibility helpers. | Live-validate zoom source and world-point projection behavior on the target RuneLite revision before adding writes. |
| Implemented | Inventory drop patterns | InventoryDropPattern and InventoryDropActions.dropNext(...) exist. | Use only one drop call per tick/workflow step; add plugin wrappers only where reuse is proven. |
| Documented | Input keyboard/mouse ergonomics | CanvasInput, KeyboardHelper, and InputLockBypass exist, with usage documented in docs/input-lock.md and docs/client-utilities.md. | Add small typed-text/key-chord/mouse-position wrappers only when repeated callers prove the need. |
| Implemented | Interactive testing harness | ApiTesterPlugin and TestRegistry exist; see API Tester. | Keep tests modular and safe; avoid background loops or bootstrap gates in harness tests. |
| Implemented / live-pending | Event observation model | SdkEvents exposes bounded passive snapshots backed by PacketUtils event-bus registration; see Event Snapshots. | Live-validate event coverage and add event kinds only when repeated callers need them. |
| Implemented | Script/runtime ergonomics | AutomationLoop adapts plain loop bodies, TaskPipeline, and AutomationStateMachine while remaining caller-owned. | Keep examples current; do not promote this to a suite-level tick owner. |
Live-Validation Checklist
Use this checklist before moving any Implemented / live-pending surface to validated. Capture the account state, target RuneLite revision, setup steps, raw observed API result, mismatch if any, source patch if needed, and the docs/Javadoc/SOT update that follows. Java tests can support a source fix, but they do not replace the in-client observation.
| Surface | Expected state to validate | In-client setup | Observed API result | Mismatch handling | Docs disposition |
|---|---|---|---|---|---|
BankWornEquipmentApi / BankWornEquipmentActions | Worn-equipment panel open/read state and deposit-all behavior match visible bank UI. | Open a bank with worn items equipped, open the bank equipment panel, then run read helpers and depositAllWornEquipment(). | 2026-07-09 live MCP: bank closed, n3_get_bank_status returned open=false; bank item snapshot returned empty. Panel read/deposit behavior not yet exercised. | Patch only proven widget ID, visibility, slot, or action mismatch. | Keep live-pending until bank panel is captured. |
BankStateApi / BankStateSnapshot | Bank mode reads match withdraw item/note, search state, placeholders, rearrange mode, requested quantity, selected tab, and core BankWidget visibility. | Open bank, toggle each bank control, use search, change quantity and tabs, then snapshot after each state. | 2026-07-09 live MCP: bank closed, open=false; no mode/search/quantity state captured. | Patch only confirmed varbit/varplayer, sprite, widget, or selected-state mismatch. | Keep live-pending until open-bank state is captured. |
WorldMapApi | Open state, map point, surface conversion, overview/minimap conversion, position, and zoom match the visible world map. | Open the world map in known locations and compare map outputs against local/world coordinates. | 2026-07-09 live MCP: closed-state read returned open=false, position (2272,1183), zoom 3.0; open map and conversion behavior not yet exercised. | Patch only confirmed coordinate conversion, zoom source, or open-state mismatch. | Keep live-pending until open-map conversion is captured. |
MenuEntriesApi | Current menu-entry snapshots preserve visible option/target/type/identifier/param ordering for diagnostics. | Hover or right-click known NPC, object, item, widget, and ground item targets, then inspect snapshots before action dispatch. | 2026-07-09 live MCP: menu read returned one normalized Cancel entry. Target-specific option ordering not yet exercised. | Patch normalization only when a visible menu entry is missing or fields are wrong. | Keep live-pending until target menus are captured. |
FriendsApi, ClanApi, ChatApi | Friends-chat, clan, guest-clan, and recent-chat snapshots match live social panels and received messages. | Join/leave friends chat and clan contexts, receive public/private/system messages, then inspect snapshots. | 2026-07-09 live MCP: social read returned an empty recent-message snapshot in the current setup. Friends/clan/member fields not yet exercised. | Patch null handling, rank/name/member normalization, or message-field mapping only when disproven live. | Keep live-pending until social state is captured. |
LineOfSightApi | Tile and actor line-of-sight checks match collision-blocked and clear paths; viewport helpers do not imply reachability. | Compare clear, wall-blocked, door, object, and out-of-viewport targets from fixed tiles. | 2026-07-09 live MCP: same-tile checks at (3215,3211,0) and (3209,3220,2) returned visible=true; broader blocked-path checks still pending. | Patch only confirmed collision-map, world-view, or projection mismatch. | Keep live-pending until blocked and clear path cases are captured. |
ProductionApi | Make-X products, selected product, selected quantity, Smithing group 312 child IDs, quantity buttons, and custom quantity behavior match visible widgets. | Open common Make-X interfaces and Smithing, change product/quantity selections, then inspect products and quantity reads. | 2026-07-09 live MCP: closed-state read returned open=false, enterInputOpen=false, no products, and hidden quantity buttons for ONE/FIVE/TEN/ALL/X. Open Make-X behavior not yet exercised. | Patch only confirmed widget ID, selected-state heuristic, product parsing, or quantity-source mismatch. | Keep live-pending until open production widgets are captured. |
MinigamesApi | Grouping-tab open state, destination visibility, selected destination, cooldown/status, and last usage match the grouping panel. | Open the grouping tab, select multiple destinations, check cooldown/availability before and after a teleport. | 2026-07-09 live MCP: closed-state read returned open=false, canTeleport=true, cooldown 0, last usage 0, and 12 hidden destination descriptors. Open-tab selected/visibility behavior not yet exercised. | Patch only confirmed destination widget, selected marker, or varplayer mapping mismatch. | Keep live-pending until open grouping-tab state is captured. |
QuestProgressApi | Quest state and lookup helpers match RuneLite quest states for complete, started, not-started, and unknown quests. | Inspect accounts with known quest states and compare helper output to the RuneLite quest panel. | 2026-07-09 live MCP: n3_get_progress and n3_read_sdk progress.quests failed with must be called on client thread; source patched to bridge these reads through ClientThreadBridge, pending reload/live retest. | Patch only confirmed lookup/state adapter mismatch. | Keep live-pending until the patched client-thread bridge is live-retested. |
DiaryProgressApi | Explicitly mapped diary tasks match known diary task completion; unmapped tasks remain absent rather than guessed. | Inspect accounts with known diary completions and compare only mapped varbit/varplayer tasks. | 2026-07-09 live MCP: n3_read_sdk progress.diaries failed with must be called on client thread; source patched to bridge these reads through ClientThreadBridge, pending reload/live retest. | Add or patch mappings only from stable verified varbit or varplayer data. | Keep live-pending until the patched client-thread bridge is live-retested. |
CameraApi | Yaw, pitch, zoom, camera position, targets, viewport bounds, and world-point viewport projection match the live client. | Rotate, zoom, and move around known world points, then compare snapshot and projection outputs. | 2026-07-09 live MCP: camera snapshot returned yaw 3604, pitch 3064, targets 3604/3064, position (3542,4995,-2636), zoom 476, viewport 512x334 offset (4,4). Projection-specific behavior not yet exercised. | Patch only confirmed zoom source, camera target, viewport bound, or projection mismatch. | Keep live-pending until projection cases are captured. |
SdkEvents | XP, item-container, NPC lifecycle, animation, and projectile snapshots include expected fields and bounded history behavior. | Trigger XP gain, inventory/bank deltas, NPC spawn/despawn, animation change, and projectile movement while PacketUtils is active. | 2026-07-09 live MCP: recent events contained NPC spawn/despawn and animation snapshots with tick, timestamp, world/local locations; XP, inventory deltas, and projectile movement were empty in the current setup. | Patch only confirmed snapshot field, ordering, capacity, or registration mismatch. | Keep live-pending until XP, inventory, and projectile events are captured. |
ThreatMapApi | Projectile target tiles, graphics-object hazard tiles, and aggressive NPC line-of-sight semantics match visible threats. | Observe targeted projectiles, ground graphics hazards, and aggressive NPCs across clear and blocked paths. | 2026-07-09 live MCP: no direct threat-map runtime read exists yet; nearby NPC snapshots and LOS reads were available, but projectile/hazard/NPC threat aggregation was not exercised. | Patch only confirmed projectile target, graphics tile, NPC reachability, or LOS mismatch. | Keep live-pending until direct threat-map or equivalent live probe output is captured. |
P1 - Domain Helpers That Improve Feature Parity
| Gap | Seen in competitors | n3 mapping | Proposed n3 addition | Notes |
|---|---|---|---|---|
| Production/make-X facade breadth | DreamBot has ItemProcessing; Storm has Production; Twilite has MakeX. | n3 has ProductionApi, ProductionActions, ProductionWorkflowBuilder, and docs. | Implemented read helpers for selected product, quantity mode, available product widgets, action descriptions, and stored Make-X quantity when exposed. Also handles legacy Smithing interface (Group 312). Avoid new write overloads until callers need chosen product metadata returned with InteractionResult. | Validate against live widgets; production interfaces vary. |
| Minigame/grouping facade | DreamBot has MinigameTeleports; Storm has Minigames; n3 has MinigameTeleportActions. | MinigamesApi read coverage and MinigameTeleportActions write coverage exist. | Use MinigamesApi for grouping tab state, selected destination, cooldown/status, last-usage varplayer, and destination availability. | Keep teleport writes in action class; selected marker remains live-pending. |
| Quest/diary requirements | DreamBot exposes quests, miniquests, diaries, and requirement classes; Storm has quest requirements; Twilite has quests and generated var IDs. | n3 has QuestProgressApi, DiaryProgressApi, QuestActions, QuestRequirement, Quest Helper snapshot, and GameVars. | Use read-only progress helpers for eligibility checks; extend diary mappings only after stable mappings exist. | Useful for route and plugin eligibility checks. |
| Camera facade | DreamBot has Camera APIs; Storm/Twilite expose input/mouse utilities and coordinate transforms. | n3 has CameraApi reads and humanizer gesture scheduling. | Use read-only yaw, pitch, zoom, viewport, and visibility helpers first. Consider result-aware camera writes only if plugins need them. | Camera writes can affect anti-ban behavior; keep opt-in. |
| Inventory drop patterns | DreamBot exposes DropPattern; n3 plugins implement one-item-per-tick policies locally. | n3 has InventoryActions, InventoryDropPattern, and InventoryDropActions. | Use comparator-backed row/column/custom patterns with dropNext(pattern, predicate) returning InteractionResult. | Preserves pacing; never bulk-clicks in a single tick. |
| Input keyboard/mouse helpers | DreamBot, Storm, and Twilite expose keyboard/mouse APIs. | n3 has documented CanvasInput, KeyboardHelper, and input-lock bypass. | Keep existing helper docs as the public guidance; add small typed-text/key-chord/mouse-position wrappers only when reusable callers appear. | Keep under input-lock rules and avoid broad public low-level automation. |
P2 - Strategic/Experimental Areas
| Gap | Seen in competitors | n3 mapping | Recommendation |
|---|---|---|---|
| Script framework ergonomics | DreamBot has tree/branch/leaf frameworks and scheduled scripts; Storm has looped/task plugins; Twilite has behavior/tick plugins and tick results. | n3 has RuneLite plugins, AutomationLoop, TaskPipeline, and AutomationStateMachine. | Keep AutomationLoop caller-owned and example-driven; do not add a suite-level scheduler. |
| Event observation model | Competitors expose event classes for animation, spawn/despawn, inventory changes, XP gained, projectiles, etc. | SdkEvents caches XP gained, inventory delta, NPC lifecycle, animation, and projectile snapshots. | Add event kinds only for repeated needs. Do not wrap every RuneLite event prematurely. |
| Simulation/threat modeling | Twilite exposes simulation rules, threat models, rollout search, line preferences, moving threats. | n3 has combat awareness, pathfinding, and read-only ThreatMapApi tile-threat helpers. | Keep ThreatMapApi narrow and live-validate projectile, hazard, and NPC semantics before broadening into a generic simulation layer. |
| Generated ID facades | Twilite exposes generated ItemId, NpcId, ObjectId, InterfaceId, VarbitId, VarpId, etc. | n3 uses RuneLite IDs, local widget parity, and ID maps. | Continue current parity approach; consider generated aliases only if docs/Agent Server need stable searchable IDs. Avoid committing huge generated surfaces without maintenance automation. |
| Random solver / login solver equivalents | DreamBot has random solvers/login utilities; Storm has blocking events. | n3 PacketUtils handles bootstrap and blocking event actions; Profiles handles login credential storage. | Keep scoped. Add explicit docs/examples for welcome screen, death, bank PIN, login/bootstrap gaps before adding solver framework. |
| Restocking automation | Twilite has Restocker; n3 Market Alcher has domain-specific GE restocking and loadout depletion listener. | Loadouts know depletion; GE actions exist. | Add generic restocking only after at least two plugins need it. Start with a pure plan object that computes missing supplies and expected costs. |
Suggested API Shape
Query Results
WorldPoint anchor = client.getLocalPlayer().getWorldLocation();
NPCs.search()
.withMappedName("Banker")
.results()
.nearestTo(anchor)
.map(npc -> NPCActions.interact(npc, "Bank"));
Rules:
result()remains source-compatible.results()returns an immutable wrapper around the current query result list.QueryResults.nearestTo(anchor)uses straight-line tile distance; use query-specific helpers such asnearestByPath()when reachability matters.
Item Metadata And Prices
Optional<ItemInfo> natureRune = ItemInfoApi.get(ItemID.NATURE_RUNE);
OptionalInt gePrice = natureRune.map(ItemInfo::getGePrice).orElse(OptionalInt.empty());
OptionalInt highAlch = ItemInfoApi.get(ItemID.RUNE_FULL_HELM)
.map(ItemInfo::getHighAlchPrice)
.orElse(OptionalInt.empty());
Optional<PriceQuote> quote = PricesApi.fetchFiveMinutePrice(ItemID.NATURE_RUNE);
Rules:
- Read-only and cache-backed.
- Return absent/unknown rather than magic sentinel values.
- Keep Market Alcher's strategy and budget logic outside the generic SDK.
Production Reads
ProductionApi.products()
.stream()
.filter(product -> product.getName().equalsIgnoreCase("Shortbow"))
.findFirst();
Optional<ProductionQuantity> selected = ProductionApi.selectedQuantity();
Rules:
- Reads belong in
sdk.widgets.ProductionApi; production writes stay inProductionActions. - Product names refer to the item/widget shown by the Make-X interface, which may differ from the produced item name on some interfaces.
- Selected product and quantity are widget-state heuristics until live-validated on the target RuneLite revision.
Minigame Reads
if (MinigamesApi.canTeleport()) {
MinigamesApi.destination(MinigameTeleport.PEST_CONTROL)
.filter(MinigameTeleportOption::isVisible);
}
Rules:
- Reads belong in
sdk.widgets.MinigamesApi; teleport writes stay inMinigameTeleportActions. - Cooldown and last usage are exposed as raw client values so callers can decide their own timing policy.
- Selected destination is a widget-state heuristic until live-validated on the target RuneLite revision.
Camera Reads
CameraSnapshot camera = CameraApi.snapshot();
boolean visible = CameraApi.isWorldPointInViewport(targetPoint);
Rules:
- Reads belong in
sdk.client.CameraApi; camera writes should only be added later as result-aware, opt-in actions. - Viewport helpers answer projection/viewport inclusion, not path reachability or line-of-sight.
- Zoom source and world-point projection remain live-pending until verified in-client.
Bank Worn Equipment
if (BankActions.isOpen() && BankWornEquipmentApi.isOpen()) {
InteractionResult result = BankWornEquipmentActions.depositAllWornEquipment();
}
Rules:
- Reads belong in
sdk.widgetsorsdk.query. - Writes belong in
InteractionApi.actionsand returnInteractionResult. - Per-slot worn-equipment deposits remain a future gap until backed by stable widget IDs and parity tests.
- Rev239 live pass on 2026-07-09 observed the worn-equipment bank view with deposit-capable visible item widgets under
983044; the same view maden3_get_bank_statusand/api/v1/bank/statusreportopen=false. - Typed loadout/worn-state reads hit
class lp declares multiple JSON fields named hr; source now serializes plain item maps instead of raw RuneLite widgets, so per-slot worn-equipment read parity is pending patched client reload/live retest.
Menu Diagnostics
MenuEntriesApi.firstMatching("Bank", "Banker");
Rules:
- Prefer diagnostics and action-resolution explanations over public raw packet builders.
- Link failed
InteractionResultdetails to candidate menu entries where possible. - Live menu snapshot behavior remains pending until verified in-client.
Integration Sequence
- Live-validate every
Implemented / live-pendingsurface in the checklist before adding new parity APIs. - Patch source behavior only when live validation proves a mismatch.
- Keep this audit synchronized with
N3PLUGINS_SOURCE_OF_TRUTH.mdas SDK gap-fill work lands. - Add one small SDK surface at a time, starting with read-only helpers that do not affect pacing or runtime ownership.
- For each new public SDK/API type, add source Javadocs and run
ApiJavadocCoverageTest. - Promote helper methods into
InteractionApi.actions.*only when they perform gameplay writes and can returnInteractionResult. - Update
N3PLUGINS_SOURCE_OF_TRUTH.mdwhen a new package, action class, workflow convention, or canonical SDK surface lands. - Add focused tests around pure parsing/filtering/selection logic; mark live-client widget/client behavior pending until observed.
Completed Implementation Tickets
- Quest/diary progress reads - implemented as read-only quest snapshots, walker
QuestRequirementadapters, and explicitly mapped diary varbit/varplayer task reads. - Event snapshots - implemented as PacketUtils-registered
sdk.eventscaches for XP gained, inventory delta, spawn/despawn, animation, and projectile movement. - Script/runtime ergonomics - implemented as caller-owned
AutomationLoopwithTaskPipelineandAutomationStateMachineadapters.
Deferred Ergonomic Follow-Ups
- Menu diagnostics on failed
InteractionResult. - Additional diary mappings beyond explicitly verified varbit or varplayer tasks.
- Typed text, key-chord, or mouse-position wrappers around the documented input helpers.
- Additional
SdkEventssnapshot kinds. - Result-aware camera writes.
- Generic restocking or broader threat simulation helpers.
Add these only after repeated caller need or a validation finding proves the current surface is insufficient.
Non-Goals
- Do not clone competitor APIs verbatim or import their naming where it conflicts with n3 conventions.
- Do not add a second walker, pacer, script loop owner, or broad raw packet builder.
- Do not move plugin-specific strategy into the shared SDK until at least two callers need the same abstraction.
- Do not claim live widget/interaction parity from JavaDocs alone; every new write helper needs RuneLite client validation.