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

@ -73,11 +73,16 @@ public sealed class MapHousePanelController : IRetainedPanelController
_map = map;
_house = house;
// House's outbound query is a fire-when-shown convenience (see
// HousePageController.Bindings.OnShown's own doc — not a ported
// retail trigger, an acdream one), gated the same "window shown AND
// my tab active" conjunction the social panel's Fellowship/
// Allegiance pages use for their own declarations.
// Night-round review F2 (2026-08-17): this used to be House's
// outbound-HouseQuery fire-when-shown trigger; that trigger is
// REMOVED (former register row AD-107) now that HouseQuery is
// byte-decoded confirmed to fire once at retail's login-complete
// edge instead (see HousePageController.Bindings.OnShown's own
// updated doc). The "window shown AND my tab active" plumbing stays
// — it mirrors the social panel's Fellowship/Allegiance page-shown
// convention and remains available for a genuinely page-shown
// concern — but HousePageController.Bindings.OnShown is unwired
// (null) in production, so this call chain is currently a no-op.
_onActivePageChanged = (_, _) => FireHouseShownIfActive();
_tabPanel.ActivePageChanged += _onActivePageChanged;
}