feat(inventory): port retail item giving (#216)

Preserve SmartBox drag-release coordinates, route the picked 3-D target through the retail AttemptPlaceIn3D policy, and send authoritative GiveObject requests with the selected stack quantity. Honor PlayerDescription's player secure-trade option and document the remaining trade-system boundary.

Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
Erik 2026-07-13 20:28:38 +02:00
parent a944e49b9c
commit 30d294506c
13 changed files with 421 additions and 10 deletions

View file

@ -44,6 +44,41 @@ Copy this block when adding a new issue:
---
## #216 — Inventory drags into the 3-D world could only drop items
**Status:** IN-PROGRESS
**Severity:** HIGH
**Filed:** 2026-07-13
**Component:** retained UI / inventory / interaction / net
**Description:** Releasing a physical inventory item over an NPC always sent
the ground-drop path. A starter-dungeon character therefore could not hand the
exit token to the exit NPC and could not complete the dungeon.
**Root cause / status:** Implementation complete; connected live gate pending.
The exact `AttemptPlaceIn3D` policy and the `0x00CD`
packet builder already existed, but `GameWindow.OnUiDragReleasedOutside`
discarded the release coordinates and always called `DropToWorld`, hard-coding
`TargetId=0`. The release path now world-picks at the actual release point,
the controller executes its existing `GiveToTarget` action without optimistic
mutation, `WorldSession` sends the exact request, and PlayerDescription drives
the retail player secure-trade preference.
**Files:** `src/AcDream.App/UI/ItemInteractionController.cs`;
`src/AcDream.App/Rendering/GameWindow.cs`;
`src/AcDream.Core.Net/WorldSession.cs`.
**Research:** `docs/research/2026-07-13-retail-give-item-pseudocode.md`;
`ItemHolder::AttemptPlaceIn3D @ 0x00588600`;
`ACCWeenieObject::UIAttemptGive @ 0x0058D620`;
`CM_Inventory::Event_GiveObjectRequest @ 0x006ABB00`.
**Acceptance:** Drag the starter-dungeon exit token from the backpack onto the
exit NPC. ACE accepts the token, the inventory removes/decrements it only from
the authoritative server response, and the quest teleport exits the dungeon.
---
## #213 — Retail client commands were sent to ACE as chat text
**Status:** IN-PROGRESS — command-family gate passed except two corrective fixes, pending re-gate