authored gmSecureTradeUI window, and both retail open paths
Three-lane research first (docs/research/2026-08-14-trade-lane{A,B,C}):
retail gmSecureTradeUI decode, the byte-exact ACE/decomp/holtburger
three-way wire agreement, and the acdream seam map (which found both
open paths ALREADY classified by the ported policy - OpenSecureTrade on
Use-a-player, StartSecureTrade on drag-item-onto-player with the
DragItemOnPlayerOpensSecureTrade option - dead-ending at a stub toast).
- Core.Net: TradeRequests builders (0x1F6-0x204, retail's CM_Trade
senders byte-checked against ACE's readers; the ACE-discarded
AcceptTrade echo carries zero-count item lists - AD-94), corrected +
completed inbound parsers (0x1FD-0x208; the old AddToTrade parser
missed the SIDE dword, TradeFailure missed the reason), delegate-hole
registrars, six WorldSession sends. 10 golden-byte tests.
- Runtime: RuntimeTradeState, the third sibling J-owner (fellowship/
allegiance shape): session-scoped, clears at generation reset (new
stage Trade=14), staged teardown stage 11 (Identity/EntityObjects
shift 12/13, TeardownStageCount 14 - the FA2-era per-stage-flag test
caught the mapping exactly as designed), combined ownership ledger,
event routing with ACE's wrong-initiator RegisterTrade landmine
honored (partner = whichever guid is not mine). 7 conformance tests.
- App: SecureTradeUiController binds the dedicated authored LayoutDesc
0x2100000D (root 0x1000007A - gmSecureTradeUI::PostInit's exact ids):
partner name/status/count/grid, the authored 'Trade' accept toggle
(accept <-> decline withdraw), 'Clear All' (ACE clears BOTH sides -
surfaced honestly), the X close, drop-on-your-grid staging, per-mode
accept cues (partner icon's authored Highlight state + Trade button
Selected latch). Mounted via the vendor recipe (nine-slice chrome,
hidden until RegisterTrade). ItemInteractionController's two policy
arms now raise SecureTradeRequested instead of the stub toast; the
drag path queues the dragged item until the window registers
(ClientTradeSystem::AttemptToTradeItem @0x0056DF80's shape).
Register: AD-94 (accept-echo zero-count lists), AD-95 (numeric-only
count texts pending template verification).
Suites: App 4,990/3, Core.Net 905, Runtime 1,626 - all green. The
panel itself is user-gate acceptance (two-client connected trade), the
#372-class lesson: fixture-green alone is not acceptance for a mount.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
50 lines
1.7 KiB
C#
50 lines
1.7 KiB
C#
using AcDream.Runtime.Entities;
|
|
using AcDream.Runtime.Gameplay;
|
|
using AcDream.Runtime.Physics;
|
|
|
|
namespace AcDream.Runtime;
|
|
|
|
/// <summary>
|
|
/// One allocation-free terminal ownership ledger for the complete J5
|
|
/// presentation-independent simulation graph. It owns no mutable state.
|
|
/// Graphical and no-window hosts inspect the same canonical owners.
|
|
/// </summary>
|
|
public readonly record struct RuntimeSimulationOwnershipSnapshot(
|
|
RuntimeEntityObjectOwnershipSnapshot EntityObjects,
|
|
RuntimePhysicsOwnershipSnapshot Physics,
|
|
RuntimeGameplayOwnershipSnapshot Gameplay)
|
|
{
|
|
public bool IsConverged =>
|
|
EntityObjects.IsConverged
|
|
&& Physics.IsConverged
|
|
&& Gameplay.IsConverged;
|
|
}
|
|
|
|
public static class RuntimeSimulationOwnership
|
|
{
|
|
public static RuntimeSimulationOwnershipSnapshot Capture(
|
|
RuntimeEntityObjectLifetime entityObjects,
|
|
RuntimeInventoryState inventory,
|
|
RuntimeCharacterState character,
|
|
RuntimeCommunicationState communication,
|
|
RuntimeActionState actions,
|
|
RuntimeLocalPlayerMovementState movement,
|
|
RuntimeFellowshipState fellowship,
|
|
RuntimeAllegianceState allegiance,
|
|
RuntimeTradeState trade)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(entityObjects);
|
|
return new RuntimeSimulationOwnershipSnapshot(
|
|
entityObjects.CaptureOwnership(),
|
|
entityObjects.Physics.CaptureOwnership(),
|
|
RuntimeGameplayOwnership.Capture(
|
|
inventory,
|
|
character,
|
|
communication,
|
|
actions,
|
|
movement,
|
|
fellowship,
|
|
allegiance,
|
|
trade));
|
|
}
|
|
}
|