diff --git a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs
index 62ca8bf831..474d2ee6e3 100644
--- a/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs
+++ b/osu.Game.Tests/Visual/SongSelect/TestSceneBeatmapLeaderboard.cs
@@ -201,6 +201,7 @@ namespace osu.Game.Tests.Visual.SongSelect
AddStep("ensure no scores displayed", () => leaderboard.SetScores(null));
AddStep(@"Network failure", () => leaderboard.SetErrorState(LeaderboardState.NetworkFailure));
+ AddStep(@"No team", () => leaderboard.SetErrorState(LeaderboardState.NoTeam));
AddStep(@"No supporter", () => leaderboard.SetErrorState(LeaderboardState.NotSupporter));
AddStep(@"Not logged in", () => leaderboard.SetErrorState(LeaderboardState.NotLoggedIn));
AddStep(@"Ruleset unavailable", () => leaderboard.SetErrorState(LeaderboardState.RulesetUnavailable));
diff --git a/osu.Game/Extensions/ModelExtensions.cs b/osu.Game/Extensions/ModelExtensions.cs
index eef9b63b62..ec6b5ac6de 100644
--- a/osu.Game/Extensions/ModelExtensions.cs
+++ b/osu.Game/Extensions/ModelExtensions.cs
@@ -9,6 +9,7 @@ using osu.Game.IO;
using osu.Game.Online.API.Requests.Responses;
using osu.Game.Rulesets;
using osu.Game.Scoring;
+using osu.Game.Screens.Select.Leaderboards;
using osu.Game.Users;
namespace osu.Game.Extensions
@@ -164,5 +165,20 @@ namespace osu.Game.Extensions
/// that function does not have per-platform considerations (and is only made to work on windows).
///
public static string GetValidFilename(this string filename) => invalid_filename_chars.Replace(filename, "_");
+
+ public static bool RequiresSupporter(this BeatmapLeaderboardScope scope, bool filterMods)
+ {
+ switch (scope)
+ {
+ case BeatmapLeaderboardScope.Local:
+ return false;
+
+ case BeatmapLeaderboardScope.Country:
+ case BeatmapLeaderboardScope.Friend:
+ return true;
+ }
+
+ return filterMods;
+ }
}
}
diff --git a/osu.Game/Localisation/LeaderboardStrings.cs b/osu.Game/Localisation/LeaderboardStrings.cs
index 8e53f8e88c..816406bf31 100644
--- a/osu.Game/Localisation/LeaderboardStrings.cs
+++ b/osu.Game/Localisation/LeaderboardStrings.cs
@@ -44,6 +44,11 @@ namespace osu.Game.Localisation
///
public static LocalisableString PleaseInvestInAnOsuSupporterTagToViewThisLeaderboard => new TranslatableString(getKey(@"please_invest_in_an_osu_supporter_tag_to_view_this_leaderboard"), @"Please invest in an osu!supporter tag to view this leaderboard!");
+ ///
+ /// "You are not on a team. Maybe you should join one!"
+ ///
+ public static LocalisableString NoTeam => new TranslatableString(getKey(@"no_team"), @"You are not on a team. Maybe you should join one!");
+
private static string getKey(string key) => $@"{prefix}:{key}";
}
}
diff --git a/osu.Game/Online/Leaderboards/Leaderboard.cs b/osu.Game/Online/Leaderboards/Leaderboard.cs
index 3c25d6f789..021a2b3959 100644
--- a/osu.Game/Online/Leaderboards/Leaderboard.cs
+++ b/osu.Game/Online/Leaderboards/Leaderboard.cs
@@ -356,6 +356,9 @@ namespace osu.Game.Online.Leaderboards
case LeaderboardState.NotSupporter:
return new MessagePlaceholder(LeaderboardStrings.PleaseInvestInAnOsuSupporterTagToViewThisLeaderboard);
+ case LeaderboardState.NoTeam:
+ return new MessagePlaceholder(LeaderboardStrings.NoTeam);
+
case LeaderboardState.Retrieving:
return null;
diff --git a/osu.Game/Online/Leaderboards/LeaderboardState.cs b/osu.Game/Online/Leaderboards/LeaderboardState.cs
index 6b07500a98..dbd982acf2 100644
--- a/osu.Game/Online/Leaderboards/LeaderboardState.cs
+++ b/osu.Game/Online/Leaderboards/LeaderboardState.cs
@@ -14,5 +14,6 @@ namespace osu.Game.Online.Leaderboards
NoScores,
NotLoggedIn,
NotSupporter,
+ NoTeam
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/LeaderboardScopeSelector.cs b/osu.Game/Overlays/BeatmapSet/LeaderboardScopeSelector.cs
index 5cfe4a35b3..12fbc4c790 100644
--- a/osu.Game/Overlays/BeatmapSet/LeaderboardScopeSelector.cs
+++ b/osu.Game/Overlays/BeatmapSet/LeaderboardScopeSelector.cs
@@ -22,6 +22,7 @@ namespace osu.Game.Overlays.BeatmapSet
AddItem(BeatmapLeaderboardScope.Global);
AddItem(BeatmapLeaderboardScope.Country);
AddItem(BeatmapLeaderboardScope.Friend);
+ AddItem(BeatmapLeaderboardScope.Team);
}
[BackgroundDependencyLoader]
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/NoScoresPlaceholder.cs b/osu.Game/Overlays/BeatmapSet/Scores/NoScoresPlaceholder.cs
index 29a696593d..b161ee49c6 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/NoScoresPlaceholder.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/NoScoresPlaceholder.cs
@@ -41,6 +41,10 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
case BeatmapLeaderboardScope.Country:
text.Text = BeatmapsetsStrings.ShowScoreboardNoScoresCountry;
break;
+
+ case BeatmapLeaderboardScope.Team:
+ text.Text = BeatmapsetsStrings.ShowScoreboardNoScoresTeam;
+ break;
}
}
}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/NoTeamPlaceholder.cs b/osu.Game/Overlays/BeatmapSet/Scores/NoTeamPlaceholder.cs
new file mode 100644
index 0000000000..0bd4a1334f
--- /dev/null
+++ b/osu.Game/Overlays/BeatmapSet/Scores/NoTeamPlaceholder.cs
@@ -0,0 +1,34 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using osu.Framework.Graphics;
+using osu.Framework.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
+using osu.Game.Localisation;
+using osuTK;
+
+namespace osu.Game.Overlays.BeatmapSet.Scores
+{
+ public partial class NoTeamPlaceholder : Container
+ {
+ public NoTeamPlaceholder()
+ {
+ AutoSizeAxes = Axes.Both;
+ Child = new FillFlowContainer
+ {
+ AutoSizeAxes = Axes.Both,
+ Direction = FillDirection.Vertical,
+ Spacing = new Vector2(0, 20),
+ Children = new Drawable[]
+ {
+ new OsuSpriteText
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ Text = LeaderboardStrings.NoTeam,
+ },
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/NotSupporterPlaceholder.cs b/osu.Game/Overlays/BeatmapSet/Scores/NotSupporterPlaceholder.cs
index 7cb119bf32..36f71be606 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/NotSupporterPlaceholder.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/NotSupporterPlaceholder.cs
@@ -3,11 +3,10 @@
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
-using osu.Game.Graphics.Sprites;
-using osuTK;
-using osu.Game.Graphics;
using osu.Game.Graphics.Containers;
+using osu.Game.Graphics.Sprites;
using osu.Game.Resources.Localisation.Web;
+using osuTK;
namespace osu.Game.Overlays.BeatmapSet.Scores
{
@@ -30,7 +29,6 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
Text = BeatmapsetsStrings.ShowScoreboardSupporterOnly,
- Font = OsuFont.GetFont(size: 14, weight: FontWeight.Bold),
},
text = new LinkFlowContainer(t => t.Font = t.Font.With(size: 11))
{
diff --git a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
index b53b7826f3..9b9661f83d 100644
--- a/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
+++ b/osu.Game/Overlays/BeatmapSet/Scores/ScoresContainer.cs
@@ -12,6 +12,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
using osu.Game.Beatmaps;
+using osu.Game.Extensions;
using osu.Game.Graphics.UserInterface;
using osu.Game.Online.API;
using osu.Game.Online.API.Requests;
@@ -40,6 +41,7 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
private readonly LeaderboardModSelector modSelector;
private readonly NoScoresPlaceholder noScoresPlaceholder;
private readonly NotSupporterPlaceholder notSupporterPlaceholder;
+ private readonly NoTeamPlaceholder noTeamPlaceholder;
[Resolved]
private IAPIProvider api { get; set; }
@@ -154,10 +156,18 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
AlwaysPresent = true,
Margin = new MarginPadding { Vertical = 10 }
},
+ noTeamPlaceholder = new NoTeamPlaceholder
+ {
+ Anchor = Anchor.TopCentre,
+ Origin = Anchor.TopCentre,
+ Margin = new MarginPadding { Vertical = 10 },
+ Alpha = 0,
+ },
notSupporterPlaceholder = new NotSupporterPlaceholder
{
Anchor = Anchor.TopCentre,
Origin = Anchor.TopCentre,
+ Margin = new MarginPadding { Vertical = 10 },
Alpha = 0,
},
new FillFlowContainer
@@ -247,13 +257,21 @@ namespace osu.Game.Overlays.BeatmapSet.Scores
return;
}
- if ((scope.Value != BeatmapLeaderboardScope.Global || modSelector.SelectedMods.Count > 0) && !userIsSupporter)
+ if ((scope.Value == BeatmapLeaderboardScope.Team) && user.Value.Team == null)
+ {
+ Scores = null;
+ noTeamPlaceholder.Show();
+ return;
+ }
+
+ if (scope.Value.RequiresSupporter(modSelector.SelectedMods.Count > 0) && !userIsSupporter)
{
Scores = null;
notSupporterPlaceholder.Show();
return;
}
+ noTeamPlaceholder.Hide();
notSupporterPlaceholder.Hide();
Show();
diff --git a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
index 57fe22aa59..46705aaa28 100644
--- a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
+++ b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboard.cs
@@ -138,12 +138,18 @@ namespace osu.Game.Screens.Select.Leaderboards
return null;
}
- if (!api.LocalUser.Value.IsSupporter && (Scope != BeatmapLeaderboardScope.Global || filterMods))
+ if (Scope.RequiresSupporter(filterMods) && !api.LocalUser.Value.IsSupporter)
{
SetErrorState(LeaderboardState.NotSupporter);
return null;
}
+ if (Scope == BeatmapLeaderboardScope.Team && api.LocalUser.Value.Team == null)
+ {
+ SetErrorState(LeaderboardState.NoTeam);
+ return null;
+ }
+
IReadOnlyList? requestMods = null;
if (filterMods && !mods.Value.Any())
diff --git a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboardScope.cs b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboardScope.cs
index e2e3404877..a3687d9586 100644
--- a/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboardScope.cs
+++ b/osu.Game/Screens/Select/Leaderboards/BeatmapLeaderboardScope.cs
@@ -20,5 +20,8 @@ namespace osu.Game.Screens.Select.Leaderboards
[LocalisableDescription(typeof(BeatmapsetsStrings), nameof(BeatmapsetsStrings.ShowScoreboardFriend))]
Friend,
+
+ [LocalisableDescription(typeof(BeatmapsetsStrings), nameof(BeatmapsetsStrings.ShowScoreboardTeam))]
+ Team,
}
}
diff --git a/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs b/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs
index deb1100dfc..5b62d5e8d7 100644
--- a/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs
+++ b/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs
@@ -83,6 +83,7 @@ namespace osu.Game.Screens.Select
new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Global),
new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Country),
new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Friend),
+ new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Team),
}).ToArray();
private BeatmapDetailAreaTabItem getTabItemFromTabType(TabType type)
@@ -104,6 +105,9 @@ namespace osu.Game.Screens.Select
case TabType.Friends:
return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Friend);
+ case TabType.Team:
+ return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Team);
+
default:
throw new ArgumentOutOfRangeException(nameof(type));
}
@@ -131,6 +135,9 @@ namespace osu.Game.Screens.Select
case BeatmapLeaderboardScope.Friend:
return TabType.Friends;
+ case BeatmapLeaderboardScope.Team:
+ return TabType.Team;
+
default:
throw new ArgumentOutOfRangeException(nameof(item));
}
@@ -146,7 +153,8 @@ namespace osu.Game.Screens.Select
Local,
Country,
Global,
- Friends
+ Friends,
+ Team
}
}
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 21a3ddad0e..5b5482b3c7 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -36,7 +36,7 @@
-
+