feat(ui): complete retail item drop branches
Give retained buttons a reusable item-drop seam, wire the toolbar backpack target, and port retail stack-merge legality, capacity clamping, wire dispatch, destination selection, and immediate shortcut rekey notice. Record the live ACE merge gate and keep split quantity under AP-101. Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
parent
3281e0acb4
commit
dc1649c493
19 changed files with 479 additions and 28 deletions
|
|
@ -401,7 +401,7 @@ All rows are `outbound` direction (GameActions are client→server only).
|
|||
| 0x0048 | outbound | CastUntargetedSpell | `CM_Magic::Event_CastUntargetedSpell` | W | H | B | B+W | CastSpellRequest builder dead [^a-1] |
|
||||
| 0x004A | outbound | CastTargetedSpell | `CM_Magic::Event_CastTargetedSpell` | W | H | B | B+W | CastSpellRequest builder dead [^a-1] |
|
||||
| 0x0053 | outbound | ChangeCombatMode | `CM_Combat::Event_ChangeCombatMode` | W | H | W | B+W | Wired in WorldSession.SendChangeCombatMode |
|
||||
| 0x0054 | outbound | StackableMerge | `CM_Inventory::Event_StackableMerge` | W | H | B | B+W | InventoryActions builder dead [^a-1] |
|
||||
| 0x0054 | outbound | StackableMerge | `CM_Inventory::Event_StackableMerge` | W | H | W | B+W | Wired through `StackMergePlanner` → inventory drop → `WorldSession.SendStackableMerge` |
|
||||
| 0x0055 | outbound | StackableSplitToContainer | `CM_Inventory::Event_StackableSplitToContainer` | W | H | B | B+W | InventoryActions builder dead [^a-1] |
|
||||
| 0x0056 | outbound | StackableSplitTo3D | `CM_Inventory::Event_StackableSplitTo3D` | – | H | B | B+W | InventoryActions builder dead [^a-1] |
|
||||
| 0x0058 | outbound | ModifyCharacterSquelch | `CM_Communication::Event_ModifyCharacterSquelch` | – | H | – | B | Mute one player |
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ where I cite holtburger it is `inventory/actions.rs` or `inventory/events.rs`
|
|||
| `0x001B` | DropItem | C→S | drop an item on the ground | `GameActionDropItem.Handle` | `u32 itemGuid` (holtburger `actions.rs:140`) | **MISSING** (no builder; acdream reuses 0x0019 for moves only) |
|
||||
| `0x0035` | UseWithTarget | C→S | use src item on target (key→door) | (Interact) | `u32 sourceGuid, u32 targetGuid` | **parsed** — `InteractRequests.BuildUseWithTarget` |
|
||||
| `0x0036` | UseItem | C→S | use/equip-by-doubleclick a single item | `GameActionUseItem` | `u32 targetGuid` | **parsed** — `InteractRequests.BuildUse` |
|
||||
| `0x0054` | StackableMerge | C→S | drop stack A onto compatible stack B | `GameActionStackableMerge.Handle` | `u32 mergeFromGuid, u32 mergeToGuid, i32 amount` | **parsed** — `InventoryActions.BuildStackableMerge` |
|
||||
| `0x0054` | StackableMerge | C→S | drop stack A onto compatible stack B | `GameActionStackableMerge.Handle` | `u32 mergeFromGuid, u32 mergeToGuid, i32 amount` | **wired** — `StackMergePlanner` → `InventoryController` → `WorldSession.SendStackableMerge` |
|
||||
| `0x0055` | StackableSplitToContainer | C→S | split N off a stack into a pack slot | `GameActionStackableSplitToContainer.Handle` | `u32 stackGuid, u32 containerGuid, i32 place, i32 amount` | **parsed** — `InventoryActions.BuildStackableSplitToContainer` |
|
||||
| `0x0056` | StackableSplitTo3D | C→S | split N off a stack onto the ground | `GameActionStackableSplitTo3D.Handle` | `u32 stackGuid, i32 amount` | **parsed** — `InventoryActions.BuildStackableSplitTo3D` |
|
||||
| `0x019B` | StackableSplitToWield | C→S | split N off a stack into an equip slot (e.g. arrows) | `GameActionStackableSplitToWield` | `u32 stackGuid, u32 equipMask, i32 amount` | **parsed** — `InventoryActions.BuildStackableSplitToWield` |
|
||||
|
|
|
|||
|
|
@ -422,7 +422,7 @@ an occupied slot sends the displaced item to the first empty slot cyclically to
|
|||
the right of the target. Only a dragged shortcut alias attempts to restore the
|
||||
displaced item to `m_lastShortcutNumDragged`.
|
||||
|
||||
### 4.6 Full-stack merge rekey
|
||||
### 4.6 Stack-merge attempt rekey
|
||||
|
||||
```text
|
||||
RecvNotice_FullMergingItem(oldId, newId): // 0x004BE9B0
|
||||
|
|
@ -435,6 +435,39 @@ This body updates the first matching shortcut returned by `RemoveShortcut`.
|
|||
Whether duplicate object shortcuts can exist through external player-description
|
||||
data is unresolved; `CreateShortcutToItem` normally prevents duplicates.
|
||||
|
||||
The notice name is misleading: `ItemHolder::AttemptMerge @ 0x005878F0` broadcasts
|
||||
`SendNotice_FullMergingItem(oldId, newId)` immediately after `UIAttemptMerge`, for
|
||||
every legal merge request. It is not an ACE confirmation and is not conditional on
|
||||
the source stack being exhausted. `CreateShortcutToItem` also removes any existing
|
||||
`newId` shortcut before adding it at the old source shortcut's slot.
|
||||
|
||||
```text
|
||||
IsMergeAttemptLegal(sourceId, targetId, quiet): // 0x00586F30
|
||||
if player not ready for inventory request: return false
|
||||
if sourceId == targetId: return false
|
||||
source = lookup sourceId; target = lookup targetId
|
||||
if either missing: return false
|
||||
if source.maxStackSize <= 1 or target.maxStackSize <= 1: return false
|
||||
if source.tradeState == 1 or target.tradeState == 1: return false
|
||||
if source.wcid != target.wcid: return false
|
||||
return target.stackSize < target.maxStackSize
|
||||
|
||||
AttemptMerge(sourceId, targetId, quiet): // 0x005878F0
|
||||
if not IsMergeAttemptLegal(...): return false
|
||||
requested = sourceId == selectedId ? splitSize : max(1, source.stackSize)
|
||||
available = target.maxStackSize - max(1, target.stackSize)
|
||||
amount = min(requested, available)
|
||||
source.UIAttemptMerge(targetId, amount) // sends 0x0054
|
||||
SendNotice_FullMergingItem(sourceId, targetId) // immediate local notice
|
||||
Select(targetId)
|
||||
return true
|
||||
```
|
||||
|
||||
acdream's selected-object stack entry/slider is still absent under AP-101, so the
|
||||
current inventory merge path requests the whole source stack and lets the same
|
||||
retail capacity clamp limit the transfer. Once the shared split-quantity owner
|
||||
lands, it supplies `requested` without changing legality or wire ordering.
|
||||
|
||||
---
|
||||
|
||||
## 5. Selected-object health, mana, and stack behavior
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue