private void updateGameplayState(int userId) { lock (stateLock) { Debug.Assert(userMap.ContainsKey(userId)); // The user may have stopped playing. if (!spectatorClient.TryGetPlayingUserState(userId, out var spectatorState)) { return; } var user = userMap[userId]; var resolvedRuleset = rulesets.AvailableRulesets.FirstOrDefault(r => r.ID == spectatorState.RulesetID)?.CreateInstance(); if (resolvedRuleset == null) { return; } var resolvedBeatmap = beatmaps.QueryBeatmap(b => b.OnlineBeatmapID == spectatorState.BeatmapID); if (resolvedBeatmap == null) { return; } var score = new Score { ScoreInfo = new ScoreInfo { Beatmap = resolvedBeatmap, User = user, Mods = spectatorState.Mods.Select(m => m.ToMod(resolvedRuleset)).ToArray(), Ruleset = resolvedRuleset.RulesetInfo, }, Replay = new Replay { HasReceivedAllFrames = false }, }; var gameplayState = new GameplayState(score, resolvedRuleset, beatmaps.GetWorkingBeatmap(resolvedBeatmap)); gameplayStates[userId] = gameplayState; Schedule(() => StartGameplay(userId, gameplayState)); } }
/// <summary> /// Starts gameplay for a user. /// </summary> /// <param name="userId">The user to start gameplay for.</param> /// <param name="gameplayState">The gameplay state.</param> protected abstract void StartGameplay(int userId, [NotNull] GameplayState gameplayState);