fix(items): dispatch carried use without world approach

This commit is contained in:
Erik 2026-07-23 09:50:28 +02:00
parent f71f947475
commit 19e8863f4e
7 changed files with 99 additions and 18 deletions

View file

@ -10,6 +10,7 @@ Date: 2026-07-23
- `PublicWeenieDesc::UnPack @ 0x005AD470`
- `ItemHolder::DetermineUseResult @ 0x00588460`
- `ItemHolder::UseObject @ 0x00588A80`
- `CPlayerSystem::UsingItem @ 0x00562F70`
- `CPlayerSystem::AutoWearIsLegal @ 0x0055EF40`
- `CPlayerSystem::AutoWear @ 0x005601C0`
- `ACCWeenieObject::GetObjectAtLocation @ 0x0058CE00`
@ -52,6 +53,14 @@ when the optional useability word is present. Consequently an absent wire word
and an explicitly packed zero both have retail `USEABLE_UNDEF` value zero and
both pass `IsUseable`.
For a direct-use item, `ItemHolder::UseObject` then sends
`CM_Inventory::Event_UseEvent`, increments the UI busy count, and calls
`CPlayerSystem::UsingItem`. That latter presentation function handles local
pickup/wield/container state; it does not require a carried source to have a
world position. Therefore an owned inventory object must cross the wire
directly. Only world objects participate in acdream's registered AD-27 local
approach compatibility seam.
```text
AutoWearIsLegal(itemId, out alreadyWorn, silent):
alreadyWorn = false
@ -101,8 +110,12 @@ AutoWear(itemId, out alreadyWorn, silent):
rule. Toolbar enablement, item activation, and world interaction consume it.
- `ItemInteractionController` remains the shared double-click and toolbar-hand
path. A zero-valued carried gem such as Blackmoor's Favor therefore emits the
ordinary Use request; ACE remains authoritative for its spell and
consumption outcome.
ordinary Use request directly from its inventory identity; it is never sent
through the world-approach query. ACE remains authoritative for its spell
and consumption outcome.
- `SelectionInteractionController` keeps the AD-27 turn/approach seam only for
non-owned spatial objects. Owned self, equipped, and nested-container sources
have no live world pose and send immediately.
- `AutoWieldController` remains the shared inventory/paperdoll equip owner. It
resolves AutoWear blockers from `ClientObjectTable`'s retail-ordered
equipment projection and emits the retail literal through system chat.

View file

@ -58,7 +58,16 @@ BeginAcceptedUse(object):
RequestUse(object, reservation)
RequestUse(object, reservation):
if session/identity/approach is invalid:
if session is invalid:
reservation.CancelBeforeDispatch()
return
if object is carried or equipped by the player:
send Use immediately
transfer reservation to UseDone
return
if world identity/approach is invalid:
reservation.CancelBeforeDispatch()
return