From 05425a39f0e2ddc73a9dfb19786e12de6649e4f9 Mon Sep 17 00:00:00 2001 From: MiTHRAL Date: Fri, 28 Aug 2026 22:33:17 -0400 Subject: [PATCH] netcode-revival: broadcast Live signin-changed so the game's sign-in manager runs The game only sets its internal 'live user exists' caches (14700/18064) when its sign-in manager processes a real Live signin notification (code 0x80000001) - which never happens without a Live backend. Broadcast XN_LIVE_SIGNINCHANGED (0x80000001) with param (state<<8)|user = 0x200 a few times at startup (from the periodic live-force) and on XamShowSigninUI, so the manager designates the profile as the live user and the Party Play / party flow gates open. --- src/kernel/xam/xam_user.cpp | 4 ++++ src/system/xnet_transport.cpp | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/kernel/xam/xam_user.cpp b/src/kernel/xam/xam_user.cpp index e99c6ea..6b9670e 100644 --- a/src/kernel/xam/xam_user.cpp +++ b/src/kernel/xam/xam_user.cpp @@ -558,6 +558,10 @@ u32 XamShowSigninUI_entry(u32 unk, u32 unk_mask) { // profile has signed in; titles observe the UI notification and then continue // along their signed-out path. kernel_state->BroadcastNotification(0x00000009, 1); + // netcode-revival: also report the sign-in as COMPLETED (Live) so the + // game's sign-in manager designates the live user; otherwise it waits for + // a real Live session that never comes. + kernel_state->BroadcastNotification(0x80000001, 0x200); ++xam_dialogs_shown_; const uint32_t close_delay_ms = REXCVAR_GET(xam_signin_ui_auto_close_ms); diff --git a/src/system/xnet_transport.cpp b/src/system/xnet_transport.cpp index 4e5ed6b..1bb3ffa 100644 --- a/src/system/xnet_transport.cpp +++ b/src/system/xnet_transport.cpp @@ -198,6 +198,17 @@ void XNetTransport::ForceLiveFlag() { }; force_byte(0x8308396C, "0x8308396C (live user exists)"); force_byte(0x83084690, "0x83084690 (online access)"); + // Broadcast the Live signin-changed event a few times at startup so the + // game's sign-in manager runs and designates the profile as the live user + // (it only does this when it processes a real signin notification, which + // never happens with no Live). Param = (signin_state<<8)|user_index. + static uint32_t signin_broadcasts = 0; + if (signin_broadcasts < 6) { + REX_KERNEL_STATE()->BroadcastNotification(0x80000001, 0x200); + ++signin_broadcasts; + REXLOG_INFO("xnet trace: broadcast Live signin-changed (0x80000001) #{}/6", + signin_broadcasts); + } } XNetTransport::GateStatus XNetTransport::GetGateStatus() const {