netcode-revival: broadcast Live signin-changed so the game's sign-in manager runs
Some checks are pending
Lint & Format Check / Format Check (push) Waiting to run

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.
This commit is contained in:
MiTHRAL 2026-08-28 22:33:17 -04:00
parent 6db6674892
commit 05425a39f0
2 changed files with 15 additions and 0 deletions

View file

@ -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);

View file

@ -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 {