Skip to content

fix(ValeTotem): correct bow selection and withdraw race#400

Merged
chsami merged 1 commit intochsami:developmentfrom
runsonmypc:pr/valetotems-fixes
Apr 18, 2026
Merged

fix(ValeTotem): correct bow selection and withdraw race#400
chsami merged 1 commit intochsami:developmentfrom
runsonmypc:pr/valetotems-fixes

Conversation

@runsonmypc
Copy link
Copy Markdown
Contributor

Summary

Two independent bug fixes in the Vale Totems plugin.

1. Bow selection presses wrong hotkey

FletchingHandler.selectBow resolved the bow option through hardcoded child IDs (15 for shortbow, 16 for longbow), then read a hotkey from widget 270,13.getChild(1) / getChild(2). Widget.getChild(int) returns a sparse dynamic child, so for some log-type layouts the child at that index carried text "3" even when the plugin intended shortbow — pressing 3 selects longbow, which fails for players without the fletching level. Fixed by selecting the option by name via Rs2Widget.handleProcessingInterface("shortbow" | "longbow"), which walks the static children to find the matching option and uses the paired dynamic-child hotkey.

2. Withdraw race reports false "no knife" right after withdraw

Rs2Bank.withdrawOne / withdrawX return true as soon as the menu click is queued — not when the item lands in the inventory. BankingHandler was using Rs2Inventory.waitForInventoryChanges(3000) followed by InventoryUtils.hasKnife(), which races: under server lag, the generic wait times out or fires on some other change, the subsequent hasKnife() reads stale state, and the code falls through to a second withdraw path, declaring a "no knife available" critical shortage on a knife that was in flight.

Each withdraw path now sleepUntils on the concrete predicate (hasKnife, hasLogBasket, getLogCount() ≥ before + requested) and no longer falls through to an alternate withdraw once the first was fired.

Applied in ensureKnifeInInventory, ensureKnifeAndLogBasketInInventory, ensureLogBasketAvailable, withdrawRequiredItems, and both log withdrawals in performLogBasketFillingOperation.

Bumps plugin to 1.0.10.

Test plan

  • Built ./gradlew runDebug locally and ran Vale Totems start-to-finish with yew logs + shortbow config; previously pressed 3 (longbow), now correctly fletches yew shortbows.
  • Banking cycle completes without spurious "no knife available" on fletching knife withdraw.
  • Extended-route (log basket) path not re-tested after the rebase onto current development — banking race fix follows the same pattern as the standard route and matches existing logic shape.

- Select the configured bow option by name via
  Rs2Widget.handleProcessingInterface so the hotkey is resolved from the
  live fletching interface rather than a hardcoded child ID. The previous
  scheme mapped SHORTBOW → child 15 with hotkey-index 1, but widget 270,13's
  sparse dynamic children could produce "3" at that slot for some log types,
  causing shortbow selection to press the longbow key.
- Bank withdraws now sleepUntil on the concrete predicate (hasKnife,
  hasLogBasket, log count reaches requested target) instead of the generic
  waitForInventoryChanges + re-check. Rs2Bank.withdrawOne/withdrawX return
  immediately after queueing the menu click, so under server lag the
  follow-up check would read stale state and spuriously report "no knife
  available" right after the knife was withdrawn.

Bumps plugin to 1.0.10.
@runsonmypc runsonmypc marked this pull request as draft April 17, 2026 17:30
@runsonmypc runsonmypc marked this pull request as ready for review April 17, 2026 17:41
@chsami chsami merged commit 585f604 into chsami:development Apr 18, 2026
1 check passed
chsami added a commit that referenced this pull request Apr 18, 2026
- Select the configured bow option by name via
  Rs2Widget.handleProcessingInterface so the hotkey is resolved from the
  live fletching interface rather than a hardcoded child ID. The previous
  scheme mapped SHORTBOW → child 15 with hotkey-index 1, but widget 270,13's
  sparse dynamic children could produce "3" at that slot for some log types,
  causing shortbow selection to press the longbow key.
- Bank withdraws now sleepUntil on the concrete predicate (hasKnife,
  hasLogBasket, log count reaches requested target) instead of the generic
  waitForInventoryChanges + re-check. Rs2Bank.withdrawOne/withdrawX return
  immediately after queueing the menu click, so under server lag the
  follow-up check would read stale state and spuriously report "no knife
  available" right after the knife was withdrawn.

Bumps plugin to 1.0.10.

Co-authored-by: runsonmypc <45095641+runsonmypc@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants