fix: trade gate round 4 - "The trade has been cancelled." + retail's

staged-item trading marker

- Cancel text: ClientTradeSystem::Handle_Trade__Recv_CloseTrade
  @0x0056DE30 shows "The trade has been cancelled." UNCONDITIONALLY
  (every close reason) as 0x1A ClientLocal - the yellow top-center
  SpewBox line. Wired at the router's onTradeClose beside ApplyClose;
  the string lives in ClientTextRefusals with its citation.
- Staged-item marker: retail's mechanism decoded end-to-end - the
  UIItem prototype (catalog 0x21000037) authors overlay child
  0x10000438 (sprite 0x06001DAE, the green frame + corner trade icon),
  bound @0x004E18FC and SetVisible(tradeState != 0) @0x004E2420;
  gmSecureTradeUI::AddItem @0x004CA801 sets
  ACCWeenieObject::SetTradeState(1) on YOUR staged items. Ported as:
  UiItemSlot.ShowTradeOverlay + TradeOverlaySprite (drawn over the
  icon), set on the trade window's self-grid cells; and
  RuntimeTradeState now borrows the canonical object table and
  maintains ClientObject.TradeState (1 at stage, 0 at remove/failure/
  reset/close/clear) - which also brings the ALREADY-PORTED placement
  policy's "You cannot move an item while it is being traded" refusal
  to life (its input field previously had no live producer).

Runtime 1,626, App 4,992/3 - green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-14 12:45:10 +02:00
parent ffc73f80bf
commit be3e617a2b
7 changed files with 119 additions and 6 deletions

View file

@ -292,7 +292,15 @@ public sealed class LiveSessionEventRouter : ILiveSessionEventRouting
? update => tradeRegister.ApplyRegister(update, inventory.PlayerGuid())
: null,
onTradeClose: social.Trade is { } tradeClose
? _ => tradeClose.ApplyClose()
? _ =>
{
tradeClose.ApplyClose();
// Handle_Trade__Recv_CloseTrade @ 0x0056DE30 shows
// this on EVERY close reason, 0x1A ClientLocal.
social.AddText?.Invoke(
AcDream.Core.Chat.ClientTextRefusals.TradeCancelled,
RetailLogTextType.ClientLocal);
}
: null,
onTradeAdd: social.Trade is { } tradeAdd
? tradeAdd.ApplyAdd