Skip to main content

GE Flipper

Verification boundary

This page describes the committed source and automated regression tests. Live acceptance on the current RuneLite and Flipping Copilot builds remains pending.

GE Flipper is a disabled-by-default automation plugin registered as com.n3plugins.geflipper.FlipperPlugin with config group geflipper. Install and enable Flipping Copilot, sign in to it, and resume its suggestions before enabling GE Flipper.

Flipping Copilot does not expose a public service for its current suggestion. CopilotOverlayReader therefore reads the active Copilot widget and NPC overlay payloads through a package-local reflection boundary. A Copilot update can change those private fields and stop highlight discovery without affecting RuneLite or the n3 interaction APIs.

Workflow

FlipperPlugin.onGameTick(...) supplies the only GE Flipper event subscription. It checks Break Handler state and pulses one AutomationLoop on the RuneLite client thread. The loop rejects a second pulse for the same game tick. Startup and shutdown create and clear that loop without a background scheduler.

Each accepted tick follows this order:

  1. Confirm a visible GE high- or low-price warning when its text contains both much and price.
  2. Prepare the inventory when enabled. The controller deposits non-coins, withdraws all available coins, and closes the bank across separate ticks.
  3. Read Copilot quantity or price text from the chatbox and submit it through Grand Exchange price and quantity widget actions (GrandExchange.trySetItemPrice and GrandExchange.trySetItemQuantity).
  4. Resolve each Copilot highlight to the visible widget that owns its semantic action. Dispatch that action through WidgetActions; dispatch clerk and banker highlights through NPCActions.
  5. Open or walk toward the Grand Exchange when no actionable Copilot highlight exists and the corresponding configuration permits it.

The controller performs at most one gameplay action per tick. It retries an unchanged highlight after highlightRetryDelay. InteractionResult.accepted() means the interaction layer accepted the request; the next overlay, widget, or GE offer state establishes progress.

Configuration

SettingDefaultBehavior
Prepare inventoryEnabledDeposits non-coins and withdraws all coins before following suggestions
Walk to Grand ExchangeEnabledWalks to the Grand Exchange when no clerk or Copilot highlight is available
Minimum action delay350 msSets the lower random delay between accepted actions
Maximum action delay700 msSets the upper random delay between accepted actions
Highlight retry delay2500 msControls when an unchanged highlight becomes eligible for another attempt
Debug loggingDisabledLogs GE Flipper decisions and actions

The plugin registers with Break Handler at startup. While the plugin remains enabled and the client remains logged in, it marks its workflow active and skips gameplay actions during a planned or active break. Shutdown stops Break Handler tracking and clears the workflow state.

Caution

GE Flipper can place, modify, abort, and collect offers highlighted by Flipping Copilot. Start with low-value offers and verify the item, quantity, price, and offer direction in the visible Grand Exchange before enabling it.

Validation

The regression tests cover same-tick deduplication, stop/restart lifecycle, semantic widget resolution, withdraw-all inventory preparation, price-warning confirmation, and refusal to confirm unrelated destroy dialogs.

.\gradlew.bat test --tests 'com.n3plugins.geflipper.*' --console plain
.\gradlew.bat test --tests 'com.n3plugins.breakhandler.AutomationBreakHandlerRegistrationTest' --console plain

Live validation must compare accepted actions with the resulting Copilot overlay, widget, inventory, and GE offer state. See the live interaction catalog for the PLUG-011 acceptance scope.