fix(ui): port retail partial stack transfers

Route the selected stack quantity through retail GetObjectSplitSize semantics, send exact split-to-container and split-to-ground actions, and keep the original object in place until the server publishes the newly guided stack. Cover selection scoping, wire bytes, container placement, and world drops with conformance tests.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-11 10:34:13 +02:00
parent 6005c51c4d
commit ea72c395c9
14 changed files with 280 additions and 19 deletions

View file

@ -509,8 +509,9 @@ server confirmation despite its name. Release build is warning-free and 4,660 te
pass. The compatible-stack live gate passed 2026-07-11 and exposed the expected
Wave 4.4/AP-101 selected-stack gap. Wave 4.4a now implements that gap: exact count-first
name formatting, authored entry/slider media, one Core split-quantity owner, live
stack-size refresh, and selected-source merge amount. The inventory-button and
selected-stack visual gates remain pending.
stack-size refresh, and selected-source item-holder amounts. Controls/polish passed
the live gate. Partial container/ground transfers now send retail `0x0055/0x0056`;
their live action gate remains pending. The inventory-button gate remains pending.
### 4.4 Finish toolbar controls
@ -526,7 +527,7 @@ selected-stack visual gates remain pending.
- [ ] Replace the PWD-only health gate with the exact attackable/player/pet policy.
- [ ] Add item-mana query/cancel state and health query cancellation.
- [x] Add one shared split-quantity owner for the entry, slider, and selected-source
item-holder merge payload.
item-holder merge, container-split, and ground-split payloads.
**Wave 4.4a implementation (2026-07-11):** static cdb against the matching retail
binary pinned stack-name `"%d %hs"`, numeric entry `"%d"`, and the slider's exact
@ -535,11 +536,16 @@ binary pinned stack-name `"%d %hs"`, numeric entry `"%d"`, and the slider's exac
`InventoryController` consumes the value only when the dragged source is selected.
The horizontal scrollbar remains the generic retained `UiScrollbar` in scalar mode,
using the DAT track/thumb rather than panel-local drawing. The warning-free App Release
build and 4,691-test suite are green. Gate polish preserves CreateObject
build and 4,697-test suite are green. Gate polish preserves CreateObject
`PluralName` through Core.Net into `ClientObject.GetAppropriateName`, honors the
entry's authored right alignment, and lets the pointer-owned thumb remain at exact
minimum/maximum endpoints instead of snapping back from the quantized amount. The
live visual gate follows.
controls/polish live gate passed. `ItemHolder::GetObjectSplitSize @ 0x00586F00`
now scopes that quantity to the selected object for all transfers. Partial inventory
moves send `StackableSplitToContainer 0x0055`; partial drag-out drops send
`StackableSplitTo3D 0x0056`; neither path moves the original object optimistically
because the authoritative destination stack receives a server-assigned guid. The
partial-transfer live action gate follows.
**Wave 4.1 implementation (2026-07-11):** bare `1..9` now use slots 0..8,
Ctrl+`1..9` selects them, Alt+`5..9` uses slots 13..17, and `0` creates a