Removing user triggers `playingUsers.Remove`, but doing so before updating the state leads to `EndGameplay` being called with `State == Playing` rather than `Quit`.
Also improves general test coverage to test more realisticly, in order to produce accurate results.
startFromSkipTarget
gameplayStartTime
TestSpectatorClient
Send
RulesetID
Ruleset.ID
Ruleset.OnlineID
OnlineID
.Result
.WaitSafelyForResult
BeatmapInfo.OnlineBeatmapID
User
APIUser
var
end
Enumerable.Range(PLAYER_1_ID, ...)
MultiplayerRoomUser
int