fix(ui): night-round review — F2 HouseQuery fires at login, not tab-open

CM_House::Event_QueryHouse @0x006aaa00 (opcode 0x21e) tail-calls
unconditionally from the end of CPlayerSystem::InitializePlayer
@0x00563570 — the same once-per-session function
AttemptSendLoginCompleteNotification lives in (both guarded by the
player_initialized flag), right after that notification. Retail never
sends it from gmHouseUI::PostInit or gmMapUI::PostInit on House-tab
activation.

Moved WorldSession.SendHouseQuery() to the direct (non-portal)
first-entry completion edges — the same places acdream already sends
the analogous "initial session bootstrap" LoginComplete:
  - graphical: LiveSessionRuntimeFactory's RuntimeFirstEntryDriveController
    localPlayerCompleted callback
  - headless: HeadlessSessionHost's equivalent callback
  - headless content-less direct host: RuntimeLiveEntitySessionController.OnSpawned

Portal-space re-entries (LocalPlayerTeleportController's F751 path,
RuntimeLiveEntitySessionController.TryAdvancePortalCompletion) do NOT
resend it, matching retail's single-shot guard.

Removed the invented House-tab-open -> SendHouseQuery trigger
(InteractionRetainedUiComposition's HouseShown binding) and retired
register row AD-107, which had documented that adaptation.

Updated RuntimeLiveEntitySessionControllerTests' exact game-action
assertions for the content-less path, which now also captures the
HouseQuery send alongside LoginComplete.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-17 04:28:46 +02:00
parent 6ee3d88863
commit 353ae3bb0c
8 changed files with 89 additions and 35 deletions

View file

@ -978,22 +978,24 @@ internal sealed class RetailInteractionRetainedUiCompositionFactory
AllegianceSetUpdateSubscription: on =>
late.GameRuntime.AllegianceSetUpdateSubscription(on),
Trade: d.Runtime.Trade),
// Batch C (overnight hover/UI round, 2026-08-17): HouseLines/
// HouseShown now wired to the minimal RuntimeHouseState
// owner (see its class doc) — HousePosition (the Map tab's
// house marker) is deferred to #413's remaining owned-house
// work, since it needs HouseData's Position field, not yet
// consumed here.
// Batch C (overnight hover/UI round, 2026-08-17): HouseLines
// now wired to the minimal RuntimeHouseState owner (see its
// class doc) — HousePosition (the Map tab's house marker) is
// deferred to #413's remaining owned-house work, since it
// needs HouseData's Position field, not yet consumed here.
// Night-round review F2: the tab-open HouseShown ->
// SendHouseQuery trigger (former AD-107) is REMOVED — retail
// sends HouseQuery once, unconditionally, at
// CM_House::Event_QueryHouse @0x006aaa00 (tail-called from
// CPlayerSystem::InitializePlayer's login-complete path), not
// on House-tab activation; neither gmHouseUI::PostInit nor
// gmMapUI::PostInit sends one on tab-open. HouseShown now
// defaults to null (HousePageController.OnShown's
// _bindings.OnShown?.Invoke() no-ops).
MapHouse: new MapHouseRuntimeBindings(
CurrentCalendar: d.CurrentCalendar,
PlayerCellId: () => d.PlayerController.Controller?.CellId ?? 0u,
HouseLines: () => d.Runtime.HouseOwner.Lines,
// Not a ported retail call site — neither gmHouseUI::
// PostInit nor gmMapUI::PostInit sends an outbound
// HouseQuery; this is the acdream "fire when the House
// tab is shown" convenience HousePageController.Bindings.
// OnShown's own doc already documents.
HouseShown: () => late.Session.CurrentSession?.SendHouseQuery()),
HouseLines: () => d.Runtime.HouseOwner.Lines),
StackSplitQuantity: d.StackSplitQuantity,
Plugins: d.UiRegistry,
Persistence: persistence,