diff --git a/osu.Game/Screens/Multi/Match/MatchScreen.cs b/osu.Game/Screens/Multi/Match/MatchScreen.cs index 5fcbc3a669..abcec16089 100644 --- a/osu.Game/Screens/Multi/Match/MatchScreen.cs +++ b/osu.Game/Screens/Multi/Match/MatchScreen.cs @@ -32,6 +32,9 @@ public class MatchScreen : MultiplayerScreen protected override Drawable TransitionContent => participants; + public override bool AllowBeatmapRulesetChange => allowBeatmapRulesetChange; + private bool allowBeatmapRulesetChange; + public override string Title => room.Name.Value; public override string ShortTitle => "room"; @@ -140,10 +143,19 @@ private void setFromPlaylist() info.Beatmap.Value = item.Beatmap; info.Mods.Value = item.RequiredMods; + allowBeatmapRulesetChange = true; + // Todo: item.Beatmap can be null here... var localBeatmap = beatmapManager.QueryBeatmap(b => b.OnlineBeatmapID == item.BeatmapID) ?? item.Beatmap; - Beatmap.Value = beatmapManager.GetWorkingBeatmap(localBeatmap); - Beatmap.Value.Mods.Value = item.RequiredMods.ToArray(); + + Schedule(() => + { + Beatmap.Value = beatmapManager.GetWorkingBeatmap(localBeatmap); + Beatmap.Value.Mods.Value = item.RequiredMods.ToArray(); + Ruleset.Value = item.Ruleset; + + allowBeatmapRulesetChange = false; + }); } private void onStart() diff --git a/osu.Game/Screens/Multi/Multiplayer.cs b/osu.Game/Screens/Multi/Multiplayer.cs index 0150452677..0169d32c75 100644 --- a/osu.Game/Screens/Multi/Multiplayer.cs +++ b/osu.Game/Screens/Multi/Multiplayer.cs @@ -19,6 +19,10 @@ public class Multiplayer : OsuScreen { private readonly MultiplayerWaveContainer waves; + public override bool AllowBeatmapRulesetChange => currentScreen?.AllowBeatmapRulesetChange ?? base.AllowBeatmapRulesetChange; + + private OsuScreen currentScreen; + public Multiplayer() { Child = waves = new MultiplayerWaveContainer @@ -58,6 +62,8 @@ public Multiplayer() new Header(loungeScreen) }); + screenAdded(loungeScreen); + loungeScreen.Exited += s => Exit(); } @@ -96,6 +102,19 @@ protected override void LogoExiting(OsuLogo logo) base.LogoExiting(logo); } + private void screenAdded(Screen newScreen) + { + currentScreen = (OsuScreen)newScreen; + + newScreen.ModePushed += screenAdded; + newScreen.Exited += screenRemoved; + } + + private void screenRemoved(Screen newScreen) + { + currentScreen = (OsuScreen)newScreen; + } + private class MultiplayerWaveContainer : WaveContainer { protected override bool StartHidden => true;