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 {