diff --git a/osu.Game.Tests/Visual/TestCaseMatchInfo.cs b/osu.Game.Tests/Visual/TestCaseMatchInfo.cs index 0272581a8f..799b5f2526 100644 --- a/osu.Game.Tests/Visual/TestCaseMatchInfo.cs +++ b/osu.Game.Tests/Visual/TestCaseMatchInfo.cs @@ -26,7 +26,7 @@ namespace osu.Game.Tests.Visual [BackgroundDependencyLoader] private void load(RulesetStore rulesets) { - Info info = new Info(); + Info info = new Info(new Room()); Add(info); AddStep(@"set name", () => info.Name.Value = @"Room Name?"); diff --git a/osu.Game/Online/Multiplayer/Room.cs b/osu.Game/Online/Multiplayer/Room.cs index ed85e6c31c..5249870e35 100644 --- a/osu.Game/Online/Multiplayer/Room.cs +++ b/osu.Game/Online/Multiplayer/Room.cs @@ -52,6 +52,10 @@ namespace osu.Game.Online.Multiplayer set => Duration.Value = TimeSpan.FromMinutes(value); } + // Only supports retrieval for now + [JsonProperty("ends_at")] + public Bindable EndDate = new Bindable(); + // Todo: Find a better way to do this (https://github.com/ppy/osu-framework/issues/1930) [JsonProperty("max_attempts", DefaultValueHandling = DefaultValueHandling.Ignore)] private int? maxAttempts @@ -70,6 +74,7 @@ namespace osu.Game.Online.Multiplayer Type.Value = other.Type; MaxParticipants.Value = other.MaxParticipants; Participants.Value = other.Participants.Value.ToArray(); + EndDate = other.EndDate; Playlist.Clear(); Playlist.AddRange(other.Playlist); @@ -77,5 +82,6 @@ namespace osu.Game.Online.Multiplayer public bool ShouldSerializeRoomID() => false; public bool ShouldSerializeHost() => false; + public bool ShouldSerializeEndDate() => false; } } diff --git a/osu.Game/Screens/Multi/Match/Components/Info.cs b/osu.Game/Screens/Multi/Match/Components/Info.cs index 1750323486..77295a1a13 100644 --- a/osu.Game/Screens/Multi/Match/Components/Info.cs +++ b/osu.Game/Screens/Multi/Match/Components/Info.cs @@ -36,7 +36,7 @@ namespace osu.Game.Screens.Multi.Match.Components public readonly Bindable Type = new Bindable(); public readonly Bindable> Mods = new Bindable>(); - public Info() + public Info(Room room) { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; @@ -106,7 +106,7 @@ namespace osu.Game.Screens.Multi.Match.Components Children = new Drawable[] { viewBeatmapButton = new ViewBeatmapButton(), - readyButton = new ReadyButton + readyButton = new ReadyButton(room) { Action = () => OnStart?.Invoke() } diff --git a/osu.Game/Screens/Multi/Match/Components/ReadyButton.cs b/osu.Game/Screens/Multi/Match/Components/ReadyButton.cs index 61ea7cb8fa..d3726da246 100644 --- a/osu.Game/Screens/Multi/Match/Components/ReadyButton.cs +++ b/osu.Game/Screens/Multi/Match/Components/ReadyButton.cs @@ -1,11 +1,13 @@ // Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Configuration; using osu.Framework.Graphics; using osu.Game.Beatmaps; +using osu.Game.Online.Multiplayer; using osuTK; namespace osu.Game.Screens.Multi.Match.Components @@ -14,11 +16,19 @@ namespace osu.Game.Screens.Multi.Match.Components { public readonly IBindable Beatmap = new Bindable(); + private readonly Room room; + + [Resolved] + private IBindableBeatmap gameBeatmap { get; set; } + [Resolved] private BeatmapManager beatmaps { get; set; } - public ReadyButton() + private bool hasBeatmap; + + public ReadyButton(Room room) { + this.room = room; RelativeSizeAxes = Axes.Y; Size = new Vector2(200, 1); @@ -30,24 +40,43 @@ namespace osu.Game.Screens.Multi.Match.Components { beatmaps.ItemAdded += beatmapAdded; - Beatmap.BindValueChanged(updateEnabledState, true); + Beatmap.BindValueChanged(updateBeatmap, true); } - private void updateEnabledState(BeatmapInfo beatmap) + private void updateBeatmap(BeatmapInfo beatmap) { - if (beatmap?.OnlineBeatmapID == null) - { - Enabled.Value = false; - return; - } + hasBeatmap = false; - Enabled.Value = beatmaps.QueryBeatmap(b => b.OnlineBeatmapID == beatmap.OnlineBeatmapID) != null; + if (beatmap?.OnlineBeatmapID == null) + return; + + hasBeatmap = beatmaps.QueryBeatmap(b => b.OnlineBeatmapID == beatmap.OnlineBeatmapID) != null; } private void beatmapAdded(BeatmapSetInfo model, bool existing, bool silent) { if (model.Beatmaps.Any(b => b.OnlineBeatmapID == Beatmap.Value.OnlineBeatmapID)) - Schedule(() => Enabled.Value = true); + Schedule(() => hasBeatmap = true); + } + + protected override void Update() + { + base.Update(); + + updateEnabledState(); + } + + private void updateEnabledState() + { + if (gameBeatmap.Value == null) + { + Enabled.Value = false; + return; + } + + bool hasEnoughTime = DateTimeOffset.UtcNow.AddSeconds(30).AddMilliseconds(gameBeatmap.Value.Track.Length) < room.EndDate; + + Enabled.Value = hasBeatmap && hasEnoughTime; } protected override void Dispose(bool isDisposing) diff --git a/osu.Game/Screens/Multi/Match/MatchScreen.cs b/osu.Game/Screens/Multi/Match/MatchScreen.cs index da160b985c..7a21a2339a 100644 --- a/osu.Game/Screens/Multi/Match/MatchScreen.cs +++ b/osu.Game/Screens/Multi/Match/MatchScreen.cs @@ -79,7 +79,7 @@ namespace osu.Game.Screens.Multi.Match Content = new[] { new Drawable[] { header = new Components.Header { Depth = -1 } }, - new Drawable[] { info = new Info { OnStart = onStart } }, + new Drawable[] { info = new Info(room) { OnStart = onStart } }, new Drawable[] { new GridContainer