netcode-revival: force the party struct's gate bytes (Track 1)
Some checks are pending
Lint & Format Check / Format Check (push) Waiting to run

The party state machine (sub_82A1B310) cannot leave state 1 because the
game's EA-Nation flag (party+417) is 0 - set at party-create from a
config-string comparison (sub_82F4DA40) that never matches in the recomp.
The party struct is a static object at 0x82FD9750, so the periodic live-force
now also sets +417 (EA-Nation flag), +421 (online flag) and +423 (EA
connected marker). With byte417=1 the machine advances through the signin
gate, XNetConnect and XNetGetConnectStatus==2 to the 'session ready' state,
which unlocks session advertise/join (the actual netcode path).
This commit is contained in:
MiTHRAL 2026-08-28 22:40:28 -04:00
parent 05425a39f0
commit 0da17439a7

View file

@ -198,6 +198,16 @@ void XNetTransport::ForceLiveFlag() {
}; };
force_byte(0x8308396C, "0x8308396C (live user exists)"); force_byte(0x8308396C, "0x8308396C (live user exists)");
force_byte(0x83084690, "0x83084690 (online access)"); force_byte(0x83084690, "0x83084690 (online access)");
// The party state machine (sub_82A1B310) can't leave state 1 unless the
// game's EA-Nation flag (party+417) is 1 - it is set at party-create from
// a config-string comparison that never matches in the recomp. The party
// struct is a static object at 0x82FD9750, so force its gate bytes:
// +417 = EA-Nation enabled (state 1 gate)
// +421 = online flag (set by the EA resolver alongside the online IP)
// +423 = 'EA connected' marker (state 6 target, unlocks advertise/join)
force_byte(0x82FD98F1, "party+417 (EA-Nation flag)");
force_byte(0x82FD98F5, "party+421 (online flag)");
force_byte(0x82FD98F7, "party+423 (EA connected)");
// Broadcast the Live signin-changed event a few times at startup so the // 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 // 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 // (it only does this when it processes a real signin notification, which