diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3c52802cf6..ec3816d541 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,10 +20,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- - name: Install .NET 5.0.x
+ - name: Install .NET 6.0.x
uses: actions/setup-dotnet@v1
with:
- dotnet-version: "5.0.x"
+ dotnet-version: "6.0.x"
# FIXME: libavformat is not included in Ubuntu. Let's fix that.
# https://github.com/ppy/osu-framework/issues/4349
@@ -65,10 +65,10 @@ jobs:
run: |
$VM_ASSETS/select-xamarin-sdk-v2.sh --mono=6.12 --android=11.2
- - name: Install .NET 5.0.x
+ - name: Install .NET 6.0.x
uses: actions/setup-dotnet@v1
with:
- dotnet-version: "5.0.x"
+ dotnet-version: "6.0.x"
# Contrary to seemingly any other msbuild, msbuild running on macOS/Mono
# cannot accept .sln(f) files as arguments.
@@ -84,10 +84,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- - name: Install .NET 5.0.x
+ - name: Install .NET 6.0.x
uses: actions/setup-dotnet@v1
with:
- dotnet-version: "5.0.x"
+ dotnet-version: "6.0.x"
# Contrary to seemingly any other msbuild, msbuild running on macOS/Mono
# cannot accept .sln(f) files as arguments.
@@ -102,17 +102,17 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- # FIXME: Tools won't run in .NET 5.0 unless you install 3.1.x LTS side by side.
+ # FIXME: Tools won't run in .NET 6.0 unless you install 3.1.x LTS side by side.
# https://itnext.io/how-to-support-multiple-net-sdks-in-github-actions-workflows-b988daa884e
- name: Install .NET 3.1.x LTS
uses: actions/setup-dotnet@v1
with:
dotnet-version: "3.1.x"
- - name: Install .NET 5.0.x
+ - name: Install .NET 6.0.x
uses: actions/setup-dotnet@v1
with:
- dotnet-version: "5.0.x"
+ dotnet-version: "6.0.x"
- name: Restore Tools
run: dotnet tool restore
diff --git a/.run/osu! (Second Client).run.xml b/.run/osu! (Second Client).run.xml
index 599b4b986b..9a471df902 100644
--- a/.run/osu! (Second Client).run.xml
+++ b/.run/osu! (Second Client).run.xml
@@ -1,8 +1,8 @@
-
+
-
+
@@ -12,9 +12,9 @@
-
+
-
\ No newline at end of file
+
diff --git a/Directory.Build.props b/Directory.Build.props
index 894ea25c8b..c1682638c2 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -18,7 +18,7 @@
-
+
$(MSBuildThisFileDirectory)CodeAnalysis\osu.ruleset
@@ -32,13 +32,8 @@
NU1701:
DeepEqual is not netstandard-compatible. This is fine since we run tests with .NET Framework anyway.
This is required due to https://github.com/NuGet/Home/issues/5740
-
- CA9998:
- Microsoft.CodeAnalysis.FxCopAnalyzers has been deprecated.
- The entire package will be able to be removed after migrating to .NET 5,
- as analysers are shipped as part of the .NET 5 SDK anyway.
-->
- $(NoWarn);NU1701;CA9998
+ $(NoWarn);NU1701
false
diff --git a/README.md b/README.md
index b1dfcab416..7ace47a74f 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@ You can see some examples of custom rulesets by visiting the [custom ruleset dir
Please make sure you have the following prerequisites:
-- A desktop platform with the [.NET 5.0 SDK](https://dotnet.microsoft.com/download) installed.
+- A desktop platform with the [.NET 6.0 SDK](https://dotnet.microsoft.com/download) installed.
- When developing with mobile, [Xamarin](https://docs.microsoft.com/en-us/xamarin/) is required, which is shipped together with Visual Studio or [Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/).
- When working with the codebase, we recommend using an IDE with intelligent code completion and syntax highlighting, such as [Visual Studio 2019+](https://visualstudio.microsoft.com/vs/), [JetBrains Rider](https://www.jetbrains.com/rider/) or [Visual Studio Code](https://code.visualstudio.com/).
- When running on Linux, please have a system-wide FFmpeg installation available to support video decoding.
diff --git a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
index 3c6aaa39ca..cb922c5a58 100644
--- a/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
+++ b/Templates/Rulesets/ruleset-empty/osu.Game.Rulesets.EmptyFreeform.Tests/osu.Game.Rulesets.EmptyFreeform.Tests.csproj
@@ -20,7 +20,7 @@
WinExe
- net5.0
+ net6.0
osu.Game.Rulesets.EmptyFreeform.Tests
-
\ No newline at end of file
+
diff --git a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
index 0719dd30df..5ecd9cc675 100644
--- a/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
+++ b/Templates/Rulesets/ruleset-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
@@ -20,7 +20,7 @@
WinExe
- net5.0
+ net6.0
osu.Game.Rulesets.Pippidon.Tests
-
\ No newline at end of file
+
diff --git a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
index d0db43cc81..33ad0ac4f7 100644
--- a/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
+++ b/Templates/Rulesets/ruleset-scrolling-empty/osu.Game.Rulesets.EmptyScrolling.Tests/osu.Game.Rulesets.EmptyScrolling.Tests.csproj
@@ -20,7 +20,7 @@
WinExe
- net5.0
+ net6.0
osu.Game.Rulesets.EmptyScrolling.Tests
-
\ No newline at end of file
+
diff --git a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
index 0719dd30df..5ecd9cc675 100644
--- a/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
+++ b/Templates/Rulesets/ruleset-scrolling-example/osu.Game.Rulesets.Pippidon.Tests/osu.Game.Rulesets.Pippidon.Tests.csproj
@@ -20,7 +20,7 @@
WinExe
- net5.0
+ net6.0
osu.Game.Rulesets.Pippidon.Tests
-
\ No newline at end of file
+
diff --git a/osu.Android.props b/osu.Android.props
index 1a2859c851..eab2be1b72 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,10 +52,10 @@
-
+
-
+
diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj
index 89b9ffb94b..b1117bf796 100644
--- a/osu.Desktop/osu.Desktop.csproj
+++ b/osu.Desktop/osu.Desktop.csproj
@@ -1,6 +1,6 @@
- net5.0
+ net6.0
WinExe
true
A free-to-win rhythm game. Rhythm is just a *click* away!
@@ -26,10 +26,13 @@
-
+
-
-
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
diff --git a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj
index 57b914bee6..434c0e0367 100644
--- a/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj
+++ b/osu.Game.Benchmarks/osu.Game.Benchmarks.csproj
@@ -1,7 +1,7 @@
- net5.0
+ net6.0
Exe
false
diff --git a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
index 13f2e25f05..fc6d900567 100644
--- a/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
+++ b/osu.Game.Rulesets.Catch.Tests/osu.Game.Rulesets.Catch.Tests.csproj
@@ -9,9 +9,9 @@
WinExe
- net5.0
+ net6.0
-
\ No newline at end of file
+
diff --git a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
index d51a6da4f9..ddad2adfea 100644
--- a/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
+++ b/osu.Game.Rulesets.Mania.Tests/osu.Game.Rulesets.Mania.Tests.csproj
@@ -9,9 +9,9 @@
WinExe
- net5.0
+ net6.0
-
\ No newline at end of file
+
diff --git a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
index fea2e408f6..bd4c3d3345 100644
--- a/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
+++ b/osu.Game.Rulesets.Osu.Tests/osu.Game.Rulesets.Osu.Tests.csproj
@@ -10,9 +10,9 @@
WinExe
- net5.0
+ net6.0
-
\ No newline at end of file
+
diff --git a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
index ad3713e047..a6b8eb8651 100644
--- a/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
+++ b/osu.Game.Rulesets.Taiko.Tests/osu.Game.Rulesets.Taiko.Tests.csproj
@@ -9,9 +9,9 @@
WinExe
- net5.0
+ net6.0
-
\ No newline at end of file
+
diff --git a/osu.Game.Tests/NonVisual/Multiplayer/StatefulMultiplayerClientTest.cs b/osu.Game.Tests/NonVisual/Multiplayer/StatefulMultiplayerClientTest.cs
index 0c49a18c8f..4adb7002a0 100644
--- a/osu.Game.Tests/NonVisual/Multiplayer/StatefulMultiplayerClientTest.cs
+++ b/osu.Game.Tests/NonVisual/Multiplayer/StatefulMultiplayerClientTest.cs
@@ -21,8 +21,8 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
{
var user = new APIUser { Id = 33 };
- AddRepeatStep("add user multiple times", () => Client.AddUser(user), 3);
- AddAssert("room has 2 users", () => Client.Room?.Users.Count == 2);
+ AddRepeatStep("add user multiple times", () => MultiplayerClient.AddUser(user), 3);
+ AddAssert("room has 2 users", () => MultiplayerClient.Room?.Users.Count == 2);
}
[Test]
@@ -30,11 +30,11 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
{
var user = new APIUser { Id = 44 };
- AddStep("add user", () => Client.AddUser(user));
- AddAssert("room has 2 users", () => Client.Room?.Users.Count == 2);
+ AddStep("add user", () => MultiplayerClient.AddUser(user));
+ AddAssert("room has 2 users", () => MultiplayerClient.Room?.Users.Count == 2);
- AddRepeatStep("remove user multiple times", () => Client.RemoveUser(user), 3);
- AddAssert("room has 1 user", () => Client.Room?.Users.Count == 1);
+ AddRepeatStep("remove user multiple times", () => MultiplayerClient.RemoveUser(user), 3);
+ AddAssert("room has 1 user", () => MultiplayerClient.Room?.Users.Count == 1);
}
[Test]
@@ -42,7 +42,7 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
{
int id = 2000;
- AddRepeatStep("add some users", () => Client.AddUser(new APIUser { Id = id++ }), 5);
+ AddRepeatStep("add some users", () => MultiplayerClient.AddUser(new APIUser { Id = id++ }), 5);
checkPlayingUserCount(0);
changeState(3, MultiplayerUserState.WaitingForLoad);
@@ -57,17 +57,17 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
changeState(6, MultiplayerUserState.WaitingForLoad);
checkPlayingUserCount(6);
- AddStep("another user left", () => Client.RemoveUser((Client.Room?.Users.Last().User).AsNonNull()));
+ AddStep("another user left", () => MultiplayerClient.RemoveUser((MultiplayerClient.Room?.Users.Last().User).AsNonNull()));
checkPlayingUserCount(5);
- AddStep("leave room", () => Client.LeaveRoom());
+ AddStep("leave room", () => MultiplayerClient.LeaveRoom());
checkPlayingUserCount(0);
}
[Test]
public void TestPlayingUsersUpdatedOnJoin()
{
- AddStep("leave room", () => Client.LeaveRoom());
+ AddStep("leave room", () => MultiplayerClient.LeaveRoom());
AddUntilStep("wait for room part", () => !RoomJoined);
AddStep("create room initially in gameplay", () =>
@@ -76,7 +76,7 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
newRoom.CopyFrom(SelectedRoom.Value);
newRoom.RoomID.Value = null;
- Client.RoomSetupAction = room =>
+ MultiplayerClient.RoomSetupAction = room =>
{
room.State = MultiplayerRoomState.Playing;
room.Users.Add(new MultiplayerRoomUser(PLAYER_1_ID)
@@ -94,15 +94,15 @@ namespace osu.Game.Tests.NonVisual.Multiplayer
}
private void checkPlayingUserCount(int expectedCount)
- => AddAssert($"{"user".ToQuantity(expectedCount)} playing", () => Client.CurrentMatchPlayingUserIds.Count == expectedCount);
+ => AddAssert($"{"user".ToQuantity(expectedCount)} playing", () => MultiplayerClient.CurrentMatchPlayingUserIds.Count == expectedCount);
private void changeState(int userCount, MultiplayerUserState state)
=> AddStep($"{"user".ToQuantity(userCount)} in {state}", () =>
{
for (int i = 0; i < userCount; ++i)
{
- int userId = Client.Room?.Users[i].UserID ?? throw new AssertionException("Room cannot be null!");
- Client.ChangeUserState(userId, state);
+ int userId = MultiplayerClient.Room?.Users[i].UserID ?? throw new AssertionException("Room cannot be null!");
+ MultiplayerClient.ChangeUserState(userId, state);
}
});
}
diff --git a/osu.Game.Tests/Visual/Editing/TestSceneEditorBeatmapCreation.cs b/osu.Game.Tests/Visual/Editing/TestSceneEditorBeatmapCreation.cs
index a14c9aded3..0a2f622da1 100644
--- a/osu.Game.Tests/Visual/Editing/TestSceneEditorBeatmapCreation.cs
+++ b/osu.Game.Tests/Visual/Editing/TestSceneEditorBeatmapCreation.cs
@@ -6,15 +6,23 @@ using System.IO;
using System.Linq;
using NUnit.Framework;
using osu.Framework.Allocation;
+using osu.Framework.Extensions.ObjectExtensions;
+using osu.Framework.Graphics;
using osu.Framework.Screens;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
+using osu.Game.Beatmaps.ControlPoints;
+using osu.Game.Database;
using osu.Game.Rulesets;
+using osu.Game.Rulesets.Catch;
using osu.Game.Rulesets.Osu;
+using osu.Game.Rulesets.Osu.Objects;
+using osu.Game.Rulesets.Osu.UI;
using osu.Game.Screens.Edit;
using osu.Game.Screens.Edit.Setup;
using osu.Game.Storyboards;
using osu.Game.Tests.Resources;
+using osuTK;
using SharpCompress.Archives;
using SharpCompress.Archives.Zip;
@@ -92,12 +100,27 @@ namespace osu.Game.Tests.Visual.Editing
}
[Test]
- public void TestCreateNewDifficulty()
+ public void TestCreateNewDifficulty([Values] bool sameRuleset)
{
string firstDifficultyName = Guid.NewGuid().ToString();
string secondDifficultyName = Guid.NewGuid().ToString();
AddStep("set unique difficulty name", () => EditorBeatmap.BeatmapInfo.DifficultyName = firstDifficultyName);
+ AddStep("add timing point", () => EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 1000 }));
+ AddStep("add hitobjects", () => EditorBeatmap.AddRange(new[]
+ {
+ new HitCircle
+ {
+ Position = new Vector2(0),
+ StartTime = 0
+ },
+ new HitCircle
+ {
+ Position = OsuPlayfield.BASE_SIZE,
+ StartTime = 1000
+ }
+ }));
+
AddStep("save beatmap", () => Editor.Save());
AddAssert("new beatmap persisted", () =>
{
@@ -111,13 +134,27 @@ namespace osu.Game.Tests.Visual.Editing
});
AddAssert("can save again", () => Editor.Save());
- AddStep("create new difficulty", () => Editor.CreateNewDifficulty(new OsuRuleset().RulesetInfo));
+ AddStep("create new difficulty", () => Editor.CreateNewDifficulty(sameRuleset ? new OsuRuleset().RulesetInfo : new CatchRuleset().RulesetInfo));
+
+ if (sameRuleset)
+ {
+ AddUntilStep("wait for dialog", () => DialogOverlay.CurrentDialog is CreateNewDifficultyDialog);
+ AddStep("confirm creation with no objects", () => DialogOverlay.CurrentDialog.PerformOkAction());
+ }
+
AddUntilStep("wait for created", () =>
{
string difficultyName = Editor.ChildrenOfType().SingleOrDefault()?.BeatmapInfo.DifficultyName;
return difficultyName != null && difficultyName != firstDifficultyName;
});
+ AddAssert("created difficulty has timing point", () =>
+ {
+ var timingPoint = EditorBeatmap.ControlPointInfo.TimingPoints.Single();
+ return timingPoint.Time == 0 && timingPoint.BeatLength == 1000;
+ });
+ AddAssert("created difficulty has no objects", () => EditorBeatmap.HitObjects.Count == 0);
+
AddStep("set unique difficulty name", () => EditorBeatmap.BeatmapInfo.DifficultyName = secondDifficultyName);
AddStep("save beatmap", () => Editor.Save());
AddAssert("new beatmap persisted", () =>
@@ -132,6 +169,105 @@ namespace osu.Game.Tests.Visual.Editing
});
}
+ [Test]
+ public void TestCopyDifficulty()
+ {
+ string originalDifficultyName = Guid.NewGuid().ToString();
+ string copyDifficultyName = $"{originalDifficultyName} (copy)";
+
+ AddStep("set unique difficulty name", () => EditorBeatmap.BeatmapInfo.DifficultyName = originalDifficultyName);
+ AddStep("add timing point", () => EditorBeatmap.ControlPointInfo.Add(0, new TimingControlPoint { BeatLength = 1000 }));
+ AddStep("add hitobjects", () => EditorBeatmap.AddRange(new[]
+ {
+ new HitCircle
+ {
+ Position = new Vector2(0),
+ StartTime = 0
+ },
+ new HitCircle
+ {
+ Position = OsuPlayfield.BASE_SIZE,
+ StartTime = 1000
+ }
+ }));
+ AddStep("set approach rate", () => EditorBeatmap.Difficulty.ApproachRate = 4);
+ AddStep("set combo colours", () =>
+ {
+ var beatmapSkin = EditorBeatmap.BeatmapSkin.AsNonNull();
+ beatmapSkin.ComboColours.Clear();
+ beatmapSkin.ComboColours.AddRange(new[]
+ {
+ new Colour4(255, 0, 0, 255),
+ new Colour4(0, 0, 255, 255)
+ });
+ });
+ AddStep("set status & online ID", () =>
+ {
+ EditorBeatmap.BeatmapInfo.OnlineID = 123456;
+ EditorBeatmap.BeatmapInfo.Status = BeatmapOnlineStatus.WIP;
+ });
+
+ AddStep("save beatmap", () => Editor.Save());
+ AddAssert("new beatmap persisted", () =>
+ {
+ var beatmap = beatmapManager.QueryBeatmap(b => b.DifficultyName == originalDifficultyName);
+ var set = beatmapManager.QueryBeatmapSet(s => s.ID == EditorBeatmap.BeatmapInfo.BeatmapSet.ID);
+
+ return beatmap != null
+ && beatmap.DifficultyName == originalDifficultyName
+ && set != null
+ && set.PerformRead(s => s.Beatmaps.Single().ID == beatmap.ID);
+ });
+ AddAssert("can save again", () => Editor.Save());
+
+ AddStep("create new difficulty", () => Editor.CreateNewDifficulty(new OsuRuleset().RulesetInfo));
+
+ AddUntilStep("wait for dialog", () => DialogOverlay.CurrentDialog is CreateNewDifficultyDialog);
+ AddStep("confirm creation as a copy", () => DialogOverlay.CurrentDialog.Buttons.ElementAt(1).TriggerClick());
+
+ AddUntilStep("wait for created", () =>
+ {
+ string difficultyName = Editor.ChildrenOfType().SingleOrDefault()?.BeatmapInfo.DifficultyName;
+ return difficultyName != null && difficultyName != originalDifficultyName;
+ });
+
+ AddAssert("created difficulty has copy suffix in name", () => EditorBeatmap.BeatmapInfo.DifficultyName == copyDifficultyName);
+ AddAssert("created difficulty has timing point", () =>
+ {
+ var timingPoint = EditorBeatmap.ControlPointInfo.TimingPoints.Single();
+ return timingPoint.Time == 0 && timingPoint.BeatLength == 1000;
+ });
+ AddAssert("created difficulty has objects", () => EditorBeatmap.HitObjects.Count == 2);
+ AddAssert("approach rate correctly copied", () => EditorBeatmap.Difficulty.ApproachRate == 4);
+ AddAssert("combo colours correctly copied", () => EditorBeatmap.BeatmapSkin.AsNonNull().ComboColours.Count == 2);
+
+ AddAssert("status not copied", () => EditorBeatmap.BeatmapInfo.Status == BeatmapOnlineStatus.None);
+ AddAssert("online ID not copied", () => EditorBeatmap.BeatmapInfo.OnlineID == -1);
+
+ AddStep("save beatmap", () => Editor.Save());
+
+ BeatmapInfo refetchedBeatmap = null;
+ Live refetchedBeatmapSet = null;
+
+ AddStep("refetch from database", () =>
+ {
+ refetchedBeatmap = beatmapManager.QueryBeatmap(b => b.DifficultyName == copyDifficultyName);
+ refetchedBeatmapSet = beatmapManager.QueryBeatmapSet(s => s.ID == EditorBeatmap.BeatmapInfo.BeatmapSet.ID);
+ });
+
+ AddAssert("new beatmap persisted", () =>
+ {
+ return refetchedBeatmap != null
+ && refetchedBeatmap.DifficultyName == copyDifficultyName
+ && refetchedBeatmapSet != null
+ && refetchedBeatmapSet.PerformRead(s =>
+ s.Beatmaps.Count == 2
+ && s.Beatmaps.Any(b => b.DifficultyName == originalDifficultyName)
+ && s.Beatmaps.Any(b => b.DifficultyName == copyDifficultyName));
+ });
+ AddAssert("old beatmap file not deleted", () => refetchedBeatmapSet.AsNonNull().PerformRead(s => s.Files.Count == 2));
+ }
+
[Test]
public void TestCreateNewBeatmapFailsWithBlankNamedDifficulties()
{
@@ -154,7 +290,7 @@ namespace osu.Game.Tests.Visual.Editing
}
[Test]
- public void TestCreateNewBeatmapFailsWithSameNamedDifficulties()
+ public void TestCreateNewBeatmapFailsWithSameNamedDifficulties([Values] bool sameRuleset)
{
Guid setId = Guid.Empty;
const string duplicate_difficulty_name = "duplicate";
@@ -168,7 +304,14 @@ namespace osu.Game.Tests.Visual.Editing
return set != null && set.PerformRead(s => s.Beatmaps.Count == 1 && s.Files.Count == 1);
});
- AddStep("create new difficulty", () => Editor.CreateNewDifficulty(new OsuRuleset().RulesetInfo));
+ AddStep("create new difficulty", () => Editor.CreateNewDifficulty(sameRuleset ? new OsuRuleset().RulesetInfo : new CatchRuleset().RulesetInfo));
+
+ if (sameRuleset)
+ {
+ AddUntilStep("wait for dialog", () => DialogOverlay.CurrentDialog is CreateNewDifficultyDialog);
+ AddStep("confirm creation with no objects", () => DialogOverlay.CurrentDialog.PerformOkAction());
+ }
+
AddUntilStep("wait for created", () =>
{
string difficultyName = Editor.ChildrenOfType().SingleOrDefault()?.BeatmapInfo.DifficultyName;
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs
index 6dca256d31..d47ebf9f0d 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs
@@ -39,7 +39,7 @@ namespace osu.Game.Tests.Visual.Gameplay
[Resolved]
private OsuGameBase game { get; set; }
- private TestSpectatorClient spectatorClient => dependenciesScreen.Client;
+ private TestSpectatorClient spectatorClient => dependenciesScreen.SpectatorClient;
private DependenciesScreen dependenciesScreen;
private SoloSpectator spectatorScreen;
@@ -57,7 +57,7 @@ namespace osu.Game.Tests.Visual.Gameplay
Children = new Drawable[]
{
dependenciesScreen.UserLookupCache,
- dependenciesScreen.Client,
+ dependenciesScreen.SpectatorClient,
};
});
@@ -336,7 +336,7 @@ namespace osu.Game.Tests.Visual.Gameplay
private class DependenciesScreen : OsuScreen
{
[Cached(typeof(SpectatorClient))]
- public readonly TestSpectatorClient Client = new TestSpectatorClient();
+ public readonly TestSpectatorClient SpectatorClient = new TestSpectatorClient();
[Cached(typeof(UserLookupCache))]
public readonly TestUserLookupCache UserLookupCache = new TestUserLookupCache();
diff --git a/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs b/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs
index 5a211e7bec..99ecf02a92 100644
--- a/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs
@@ -38,7 +38,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
private TestMultiplayerComponents multiplayerComponents;
- protected TestMultiplayerClient Client => multiplayerComponents.Client;
+ protected TestMultiplayerClient MultiplayerClient => multiplayerComponents.MultiplayerClient;
[BackgroundDependencyLoader]
private void load(GameHost host, AudioManager audio)
@@ -83,21 +83,21 @@ namespace osu.Game.Tests.Visual.Multiplayer
ClickButtonWhenEnabled();
- AddUntilStep("wait for join", () => Client.RoomJoined);
+ AddUntilStep("wait for join", () => MultiplayerClient.RoomJoined);
}
[Test]
public void TestCreatedWithCorrectMode()
{
- AddAssert("room created with correct mode", () => Client.APIRoom?.QueueMode.Value == Mode);
+ AddAssert("room created with correct mode", () => MultiplayerClient.APIRoom?.QueueMode.Value == Mode);
}
protected void RunGameplay()
{
- AddUntilStep("wait for idle", () => Client.LocalUser?.State == MultiplayerUserState.Idle);
+ AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
ClickButtonWhenEnabled();
- AddUntilStep("wait for ready", () => Client.LocalUser?.State == MultiplayerUserState.Ready);
+ AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
ClickButtonWhenEnabled();
AddUntilStep("wait for player", () => multiplayerComponents.CurrentScreen is Player player && player.IsLoaded);
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs
index ad60ac824d..0785315b26 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs
@@ -31,19 +31,19 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestFirstItemSelectedByDefault()
{
- AddAssert("first item selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[0].ID);
+ AddAssert("first item selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[0].ID);
}
[Test]
public void TestItemAddedToTheEndOfQueue()
{
addItem(() => OtherBeatmap);
- AddAssert("playlist has 2 items", () => Client.APIRoom?.Playlist.Count == 2);
+ AddAssert("playlist has 2 items", () => MultiplayerClient.APIRoom?.Playlist.Count == 2);
addItem(() => InitialBeatmap);
- AddAssert("playlist has 3 items", () => Client.APIRoom?.Playlist.Count == 3);
+ AddAssert("playlist has 3 items", () => MultiplayerClient.APIRoom?.Playlist.Count == 3);
- AddAssert("first item still selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[0].ID);
+ AddAssert("first item still selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[0].ID);
}
[Test]
@@ -51,9 +51,9 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
RunGameplay();
- AddAssert("playlist has only one item", () => Client.APIRoom?.Playlist.Count == 1);
- AddAssert("playlist item is expired", () => Client.APIRoom?.Playlist[0].Expired == true);
- AddAssert("last item selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[0].ID);
+ AddAssert("playlist has only one item", () => MultiplayerClient.APIRoom?.Playlist.Count == 1);
+ AddAssert("playlist item is expired", () => MultiplayerClient.APIRoom?.Playlist[0].Expired == true);
+ AddAssert("last item selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[0].ID);
}
[Test]
@@ -64,13 +64,13 @@ namespace osu.Game.Tests.Visual.Multiplayer
RunGameplay();
- AddAssert("first item expired", () => Client.APIRoom?.Playlist[0].Expired == true);
- AddAssert("next item selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[1].ID);
+ AddAssert("first item expired", () => MultiplayerClient.APIRoom?.Playlist[0].Expired == true);
+ AddAssert("next item selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[1].ID);
RunGameplay();
- AddAssert("second item expired", () => Client.APIRoom?.Playlist[1].Expired == true);
- AddAssert("next item selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[2].ID);
+ AddAssert("second item expired", () => MultiplayerClient.APIRoom?.Playlist[1].Expired == true);
+ AddAssert("next item selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[2].ID);
}
[Test]
@@ -82,10 +82,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
// Move to the "other" beatmap.
RunGameplay();
- AddStep("change queue mode", () => Client.ChangeSettings(queueMode: QueueMode.HostOnly));
- AddAssert("playlist has 3 items", () => Client.APIRoom?.Playlist.Count == 3);
- AddAssert("item 2 is not expired", () => Client.APIRoom?.Playlist[1].Expired == false);
- AddAssert("current item is the other beatmap", () => Client.Room?.Settings.PlaylistItemId == 2);
+ AddStep("change queue mode", () => MultiplayerClient.ChangeSettings(queueMode: QueueMode.HostOnly));
+ AddAssert("playlist has 3 items", () => MultiplayerClient.APIRoom?.Playlist.Count == 3);
+ AddAssert("item 2 is not expired", () => MultiplayerClient.APIRoom?.Playlist[1].Expired == false);
+ AddAssert("current item is the other beatmap", () => MultiplayerClient.Room?.Settings.PlaylistItemId == 2);
}
[Test]
@@ -101,10 +101,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
addItem(() => OtherBeatmap, new CatchRuleset().RulesetInfo);
AddUntilStep("selected beatmap is initial beatmap", () => Beatmap.Value.BeatmapInfo.OnlineID == InitialBeatmap.OnlineID);
- AddUntilStep("wait for idle", () => Client.LocalUser?.State == MultiplayerUserState.Idle);
+ AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
ClickButtonWhenEnabled();
- AddUntilStep("wait for ready", () => Client.LocalUser?.State == MultiplayerUserState.Ready);
+ AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
ClickButtonWhenEnabled();
AddUntilStep("wait for player", () => CurrentScreen is Player player && player.IsLoaded);
@@ -118,10 +118,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
addItem(() => OtherBeatmap, mods: new Mod[] { new OsuModDoubleTime() });
AddUntilStep("selected beatmap is initial beatmap", () => Beatmap.Value.BeatmapInfo.OnlineID == InitialBeatmap.OnlineID);
- AddUntilStep("wait for idle", () => Client.LocalUser?.State == MultiplayerUserState.Idle);
+ AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
ClickButtonWhenEnabled();
- AddUntilStep("wait for ready", () => Client.LocalUser?.State == MultiplayerUserState.Ready);
+ AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
ClickButtonWhenEnabled();
AddUntilStep("wait for player", () => CurrentScreen is Player player && player.IsLoaded);
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneCreateMultiplayerMatchButton.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneCreateMultiplayerMatchButton.cs
index 2f0398c6ef..0674fc7a39 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneCreateMultiplayerMatchButton.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneCreateMultiplayerMatchButton.cs
@@ -37,10 +37,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("end joining room", () => joiningRoomOperation.Dispose());
assertButtonEnableState(true);
- AddStep("disconnect client", () => Client.Disconnect());
+ AddStep("disconnect client", () => MultiplayerClient.Disconnect());
assertButtonEnableState(false);
- AddStep("re-connect client", () => Client.Connect());
+ AddStep("re-connect client", () => MultiplayerClient.Connect());
assertButtonEnableState(true);
}
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs
index 7614e52218..c3ec7a5369 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs
@@ -4,6 +4,7 @@
using System;
using System.Linq;
using NUnit.Framework;
+using osu.Framework.Extensions;
using osu.Framework.Testing;
using osu.Game.Beatmaps;
using osu.Game.Online.Multiplayer;
@@ -21,7 +22,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestFirstItemSelectedByDefault()
{
- AddAssert("first item selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[0].ID);
+ AddAssert("first item selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[0].ID);
}
[Test]
@@ -29,7 +30,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
selectNewItem(() => InitialBeatmap);
- AddAssert("playlist item still selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[0].ID);
+ AddAssert("playlist item still selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[0].ID);
}
[Test]
@@ -37,7 +38,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
selectNewItem(() => OtherBeatmap);
- AddAssert("playlist item still selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[0].ID);
+ AddAssert("playlist item still selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[0].ID);
}
[Test]
@@ -45,10 +46,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
RunGameplay();
- AddAssert("playlist contains two items", () => Client.APIRoom?.Playlist.Count == 2);
- AddAssert("first playlist item expired", () => Client.APIRoom?.Playlist[0].Expired == true);
- AddAssert("second playlist item not expired", () => Client.APIRoom?.Playlist[1].Expired == false);
- AddAssert("second playlist item selected", () => Client.Room?.Settings.PlaylistItemId == Client.APIRoom?.Playlist[1].ID);
+ AddAssert("playlist contains two items", () => MultiplayerClient.APIRoom?.Playlist.Count == 2);
+ AddAssert("first playlist item expired", () => MultiplayerClient.APIRoom?.Playlist[0].Expired == true);
+ AddAssert("second playlist item not expired", () => MultiplayerClient.APIRoom?.Playlist[1].Expired == false);
+ AddAssert("second playlist item selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == MultiplayerClient.APIRoom?.Playlist[1].ID);
}
[Test]
@@ -57,23 +58,23 @@ namespace osu.Game.Tests.Visual.Multiplayer
RunGameplay();
IBeatmapInfo firstBeatmap = null;
- AddStep("get first playlist item beatmap", () => firstBeatmap = Client.APIRoom?.Playlist[0].Beatmap);
+ AddStep("get first playlist item beatmap", () => firstBeatmap = MultiplayerClient.APIRoom?.Playlist[0].Beatmap);
selectNewItem(() => OtherBeatmap);
- AddAssert("first playlist item hasn't changed", () => Client.APIRoom?.Playlist[0].Beatmap == firstBeatmap);
- AddAssert("second playlist item changed", () => Client.APIRoom?.Playlist[1].Beatmap != firstBeatmap);
+ AddAssert("first playlist item hasn't changed", () => MultiplayerClient.APIRoom?.Playlist[0].Beatmap == firstBeatmap);
+ AddAssert("second playlist item changed", () => MultiplayerClient.APIRoom?.Playlist[1].Beatmap != firstBeatmap);
}
[Test]
public void TestSettingsUpdatedWhenChangingQueueMode()
{
- AddStep("change queue mode", () => Client.ChangeSettings(new MultiplayerRoomSettings
+ AddStep("change queue mode", () => MultiplayerClient.ChangeSettings(new MultiplayerRoomSettings
{
QueueMode = QueueMode.AllPlayers
- }));
+ }).WaitSafely());
- AddUntilStep("api room updated", () => Client.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
+ AddUntilStep("api room updated", () => MultiplayerClient.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
}
[Test]
@@ -81,7 +82,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
addItem(() => OtherBeatmap);
- AddAssert("playlist contains two items", () => Client.APIRoom?.Playlist.Count == 2);
+ AddAssert("playlist contains two items", () => MultiplayerClient.APIRoom?.Playlist.Count == 2);
}
private void selectNewItem(Func beatmap)
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorLeaderboard.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorLeaderboard.cs
index 543e6a91d0..6b3573b3cb 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorLeaderboard.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorLeaderboard.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
foreach ((int userId, var _) in clocks)
{
SpectatorClient.StartPlay(userId, 0);
- OnlinePlayDependencies.Client.AddUser(new APIUser { Id = userId });
+ OnlinePlayDependencies.MultiplayerClient.AddUser(new APIUser { Id = userId });
}
});
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs
index 56cb6036c7..7ce0c6a94d 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiSpectatorScreen.cs
@@ -60,8 +60,8 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("start players silently", () =>
{
- OnlinePlayDependencies.Client.AddUser(new APIUser { Id = PLAYER_1_ID }, true);
- OnlinePlayDependencies.Client.AddUser(new APIUser { Id = PLAYER_2_ID }, true);
+ OnlinePlayDependencies.MultiplayerClient.AddUser(new APIUser { Id = PLAYER_1_ID }, true);
+ OnlinePlayDependencies.MultiplayerClient.AddUser(new APIUser { Id = PLAYER_2_ID }, true);
playingUsers.Add(new MultiplayerRoomUser(PLAYER_1_ID));
playingUsers.Add(new MultiplayerRoomUser(PLAYER_2_ID));
@@ -121,13 +121,13 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("start players", () =>
{
- var player1 = OnlinePlayDependencies.Client.AddUser(new APIUser { Id = PLAYER_1_ID }, true);
+ var player1 = OnlinePlayDependencies.MultiplayerClient.AddUser(new APIUser { Id = PLAYER_1_ID }, true);
player1.MatchState = new TeamVersusUserState
{
TeamID = 0,
};
- var player2 = OnlinePlayDependencies.Client.AddUser(new APIUser { Id = PLAYER_2_ID }, true);
+ var player2 = OnlinePlayDependencies.MultiplayerClient.AddUser(new APIUser { Id = PLAYER_2_ID }, true);
player2.MatchState = new TeamVersusUserState
{
TeamID = 1,
@@ -396,7 +396,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
User = new APIUser { Id = id },
};
- OnlinePlayDependencies.Client.AddUser(user.User, true);
+ OnlinePlayDependencies.MultiplayerClient.AddUser(user.User, true);
SpectatorClient.StartPlay(id, beatmapId ?? importedBeatmapId);
playingUsers.Add(user);
@@ -410,7 +410,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
var user = playingUsers.Single(u => u.UserID == userId);
- OnlinePlayDependencies.Client.RemoveUser(user.User.AsNonNull());
+ OnlinePlayDependencies.MultiplayerClient.RemoveUser(user.User.AsNonNull());
SpectatorClient.EndPlay(userId);
playingUsers.Remove(user);
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs
index 4d87480841..211bcfeab2 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayer.cs
@@ -52,7 +52,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
private TestMultiplayerComponents multiplayerComponents;
- private TestMultiplayerClient client => multiplayerComponents.Client;
+ private TestMultiplayerClient multiplayerClient => multiplayerComponents.MultiplayerClient;
private TestMultiplayerRoomManager roomManager => multiplayerComponents.RoomManager;
[BackgroundDependencyLoader]
@@ -108,66 +108,66 @@ namespace osu.Game.Tests.Visual.Multiplayer
// all ready
AddUntilStep("all players ready", () =>
{
- var nextUnready = client.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Idle);
+ var nextUnready = multiplayerClient.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Idle);
if (nextUnready != null)
- client.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Ready);
+ multiplayerClient.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Ready);
- return client.Room?.Users.All(u => u.State == MultiplayerUserState.Ready) == true;
+ return multiplayerClient.Room?.Users.All(u => u.State == MultiplayerUserState.Ready) == true;
});
AddStep("unready all players at once", () =>
{
- Debug.Assert(client.Room != null);
+ Debug.Assert(multiplayerClient.Room != null);
- foreach (var u in client.Room.Users) client.ChangeUserState(u.UserID, MultiplayerUserState.Idle);
+ foreach (var u in multiplayerClient.Room.Users) multiplayerClient.ChangeUserState(u.UserID, MultiplayerUserState.Idle);
});
AddStep("ready all players at once", () =>
{
- Debug.Assert(client.Room != null);
+ Debug.Assert(multiplayerClient.Room != null);
- foreach (var u in client.Room.Users) client.ChangeUserState(u.UserID, MultiplayerUserState.Ready);
+ foreach (var u in multiplayerClient.Room.Users) multiplayerClient.ChangeUserState(u.UserID, MultiplayerUserState.Ready);
});
}
private void addRandomPlayer()
{
int randomUser = RNG.Next(200000, 500000);
- client.AddUser(new APIUser { Id = randomUser, Username = $"user {randomUser}" });
+ multiplayerClient.AddUser(new APIUser { Id = randomUser, Username = $"user {randomUser}" });
}
private void removeLastUser()
{
- APIUser lastUser = client.Room?.Users.Last().User;
+ APIUser lastUser = multiplayerClient.Room?.Users.Last().User;
- if (lastUser == null || lastUser == client.LocalUser?.User)
+ if (lastUser == null || lastUser == multiplayerClient.LocalUser?.User)
return;
- client.RemoveUser(lastUser);
+ multiplayerClient.RemoveUser(lastUser);
}
private void kickLastUser()
{
- APIUser lastUser = client.Room?.Users.Last().User;
+ APIUser lastUser = multiplayerClient.Room?.Users.Last().User;
- if (lastUser == null || lastUser == client.LocalUser?.User)
+ if (lastUser == null || lastUser == multiplayerClient.LocalUser?.User)
return;
- client.KickUser(lastUser.Id);
+ multiplayerClient.KickUser(lastUser.Id);
}
private void markNextPlayerReady()
{
- var nextUnready = client.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Idle);
+ var nextUnready = multiplayerClient.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Idle);
if (nextUnready != null)
- client.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Ready);
+ multiplayerClient.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Ready);
}
private void markNextPlayerIdle()
{
- var nextUnready = client.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Ready);
+ var nextUnready = multiplayerClient.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Ready);
if (nextUnready != null)
- client.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Idle);
+ multiplayerClient.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Idle);
}
private void performRandomAction()
@@ -217,7 +217,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("Press select", () => InputManager.Key(Key.Enter));
AddUntilStep("wait for room open", () => this.ChildrenOfType().FirstOrDefault()?.IsLoaded == true);
- AddUntilStep("wait for join", () => client.RoomJoined);
+ AddUntilStep("wait for join", () => multiplayerClient.RoomJoined);
}
[Test]
@@ -235,8 +235,8 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddAssert("Check participant count correct", () => client.APIRoom?.ParticipantCount.Value == 1);
- AddAssert("Check participant list contains user", () => client.APIRoom?.RecentParticipants.Count(u => u.Id == API.LocalUser.Value.Id) == 1);
+ AddAssert("Check participant count correct", () => multiplayerClient.APIRoom?.ParticipantCount.Value == 1);
+ AddAssert("Check participant list contains user", () => multiplayerClient.APIRoom?.RecentParticipants.Count(u => u.Id == API.LocalUser.Value.Id) == 1);
}
[Test]
@@ -293,10 +293,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("join room", () => InputManager.Key(Key.Enter));
AddUntilStep("wait for room open", () => this.ChildrenOfType().FirstOrDefault()?.IsLoaded == true);
- AddUntilStep("wait for join", () => client.RoomJoined);
+ AddUntilStep("wait for join", () => multiplayerClient.RoomJoined);
- AddAssert("Check participant count correct", () => client.APIRoom?.ParticipantCount.Value == 1);
- AddAssert("Check participant list contains user", () => client.APIRoom?.RecentParticipants.Count(u => u.Id == API.LocalUser.Value.Id) == 1);
+ AddAssert("Check participant count correct", () => multiplayerClient.APIRoom?.ParticipantCount.Value == 1);
+ AddAssert("Check participant list contains user", () => multiplayerClient.APIRoom?.RecentParticipants.Count(u => u.Id == API.LocalUser.Value.Id) == 1);
}
[Test]
@@ -315,7 +315,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddAssert("room has password", () => client.APIRoom?.Password.Value == "password");
+ AddAssert("room has password", () => multiplayerClient.APIRoom?.Password.Value == "password");
}
[Test]
@@ -349,7 +349,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("press join room button", () => passwordEntryPopover.ChildrenOfType().First().TriggerClick());
AddUntilStep("wait for room open", () => this.ChildrenOfType().FirstOrDefault()?.IsLoaded == true);
- AddUntilStep("wait for join", () => client.RoomJoined);
+ AddUntilStep("wait for join", () => multiplayerClient.RoomJoined);
}
[Test]
@@ -368,8 +368,8 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddStep("change password", () => client.ChangeSettings(password: "password2"));
- AddUntilStep("local password changed", () => client.APIRoom?.Password.Value == "password2");
+ AddStep("change password", () => multiplayerClient.ChangeSettings(password: "password2"));
+ AddUntilStep("local password changed", () => multiplayerClient.APIRoom?.Password.Value == "password2");
}
[Test]
@@ -390,7 +390,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
pressReadyButton();
AddStep("delete beatmap", () => beatmaps.Delete(importedSet));
- AddUntilStep("user state is idle", () => client.LocalUser?.State == MultiplayerUserState.Idle);
+ AddUntilStep("user state is idle", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
}
[Test]
@@ -413,22 +413,22 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("Enter song select", () =>
{
var currentSubScreen = ((Screens.OnlinePlay.Multiplayer.Multiplayer)multiplayerComponents.CurrentScreen).CurrentSubScreen;
- ((MultiplayerMatchSubScreen)currentSubScreen).OpenSongSelection(client.Room?.Settings.PlaylistItemId);
+ ((MultiplayerMatchSubScreen)currentSubScreen).OpenSongSelection(multiplayerClient.Room?.Settings.PlaylistItemId);
});
AddUntilStep("wait for song select", () => this.ChildrenOfType().FirstOrDefault()?.BeatmapSetsLoaded == true);
- AddAssert("Beatmap matches current item", () => Beatmap.Value.BeatmapInfo.OnlineID == client.Room?.Playlist.First().BeatmapID);
+ AddAssert("Beatmap matches current item", () => Beatmap.Value.BeatmapInfo.OnlineID == multiplayerClient.Room?.Playlist.First().BeatmapID);
AddStep("Select next beatmap", () => InputManager.Key(Key.Down));
- AddUntilStep("Beatmap doesn't match current item", () => Beatmap.Value.BeatmapInfo.OnlineID != client.Room?.Playlist.First().BeatmapID);
+ AddUntilStep("Beatmap doesn't match current item", () => Beatmap.Value.BeatmapInfo.OnlineID != multiplayerClient.Room?.Playlist.First().BeatmapID);
- AddStep("start match externally", () => client.StartMatch());
+ AddStep("start match externally", () => multiplayerClient.StartMatch());
AddUntilStep("play started", () => multiplayerComponents.CurrentScreen is Player);
- AddAssert("Beatmap matches current item", () => Beatmap.Value.BeatmapInfo.OnlineID == client.Room?.Playlist.First().BeatmapID);
+ AddAssert("Beatmap matches current item", () => Beatmap.Value.BeatmapInfo.OnlineID == multiplayerClient.Room?.Playlist.First().BeatmapID);
}
[Test]
@@ -451,22 +451,22 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("Enter song select", () =>
{
var currentSubScreen = ((Screens.OnlinePlay.Multiplayer.Multiplayer)multiplayerComponents.CurrentScreen).CurrentSubScreen;
- ((MultiplayerMatchSubScreen)currentSubScreen).OpenSongSelection(client.Room?.Settings.PlaylistItemId);
+ ((MultiplayerMatchSubScreen)currentSubScreen).OpenSongSelection(multiplayerClient.Room?.Settings.PlaylistItemId);
});
AddUntilStep("wait for song select", () => this.ChildrenOfType().FirstOrDefault()?.BeatmapSetsLoaded == true);
- AddAssert("Ruleset matches current item", () => Ruleset.Value.OnlineID == client.Room?.Playlist.First().RulesetID);
+ AddAssert("Ruleset matches current item", () => Ruleset.Value.OnlineID == multiplayerClient.Room?.Playlist.First().RulesetID);
AddStep("Switch ruleset", () => ((MultiplayerMatchSongSelect)multiplayerComponents.MultiplayerScreen.CurrentSubScreen).Ruleset.Value = new CatchRuleset().RulesetInfo);
- AddUntilStep("Ruleset doesn't match current item", () => Ruleset.Value.OnlineID != client.Room?.Playlist.First().RulesetID);
+ AddUntilStep("Ruleset doesn't match current item", () => Ruleset.Value.OnlineID != multiplayerClient.Room?.Playlist.First().RulesetID);
- AddStep("start match externally", () => client.StartMatch());
+ AddStep("start match externally", () => multiplayerClient.StartMatch());
AddUntilStep("play started", () => multiplayerComponents.CurrentScreen is Player);
- AddAssert("Ruleset matches current item", () => Ruleset.Value.OnlineID == client.Room?.Playlist.First().RulesetID);
+ AddAssert("Ruleset matches current item", () => Ruleset.Value.OnlineID == multiplayerClient.Room?.Playlist.First().RulesetID);
}
[Test]
@@ -489,22 +489,22 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("Enter song select", () =>
{
var currentSubScreen = ((Screens.OnlinePlay.Multiplayer.Multiplayer)multiplayerComponents.CurrentScreen).CurrentSubScreen;
- ((MultiplayerMatchSubScreen)currentSubScreen).OpenSongSelection(client.Room?.Settings.PlaylistItemId);
+ ((MultiplayerMatchSubScreen)currentSubScreen).OpenSongSelection(multiplayerClient.Room?.Settings.PlaylistItemId);
});
AddUntilStep("wait for song select", () => this.ChildrenOfType().FirstOrDefault()?.BeatmapSetsLoaded == true);
- AddAssert("Mods match current item", () => SelectedMods.Value.Select(m => m.Acronym).SequenceEqual(client.Room.AsNonNull().Playlist.First().RequiredMods.Select(m => m.Acronym)));
+ AddAssert("Mods match current item", () => SelectedMods.Value.Select(m => m.Acronym).SequenceEqual(multiplayerClient.Room.AsNonNull().Playlist.First().RequiredMods.Select(m => m.Acronym)));
AddStep("Switch required mods", () => ((MultiplayerMatchSongSelect)multiplayerComponents.MultiplayerScreen.CurrentSubScreen).Mods.Value = new Mod[] { new OsuModDoubleTime() });
- AddAssert("Mods don't match current item", () => !SelectedMods.Value.Select(m => m.Acronym).SequenceEqual(client.Room.AsNonNull().Playlist.First().RequiredMods.Select(m => m.Acronym)));
+ AddAssert("Mods don't match current item", () => !SelectedMods.Value.Select(m => m.Acronym).SequenceEqual(multiplayerClient.Room.AsNonNull().Playlist.First().RequiredMods.Select(m => m.Acronym)));
- AddStep("start match externally", () => client.StartMatch());
+ AddStep("start match externally", () => multiplayerClient.StartMatch());
AddUntilStep("play started", () => multiplayerComponents.CurrentScreen is Player);
- AddAssert("Mods match current item", () => SelectedMods.Value.Select(m => m.Acronym).SequenceEqual(client.Room.AsNonNull().Playlist.First().RequiredMods.Select(m => m.Acronym)));
+ AddAssert("Mods match current item", () => SelectedMods.Value.Select(m => m.Acronym).SequenceEqual(multiplayerClient.Room.AsNonNull().Playlist.First().RequiredMods.Select(m => m.Acronym)));
}
[Test]
@@ -524,18 +524,18 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("join other user (ready, host)", () =>
{
- client.AddUser(new APIUser { Id = MultiplayerTestScene.PLAYER_1_ID, Username = "Other" });
- client.TransferHost(MultiplayerTestScene.PLAYER_1_ID);
- client.ChangeUserState(MultiplayerTestScene.PLAYER_1_ID, MultiplayerUserState.Ready);
+ multiplayerClient.AddUser(new APIUser { Id = MultiplayerTestScene.PLAYER_1_ID, Username = "Other" });
+ multiplayerClient.TransferHost(MultiplayerTestScene.PLAYER_1_ID);
+ multiplayerClient.ChangeUserState(MultiplayerTestScene.PLAYER_1_ID, MultiplayerUserState.Ready);
});
AddStep("delete beatmap", () => beatmaps.Delete(importedSet));
ClickButtonWhenEnabled();
- AddUntilStep("wait for spectating user state", () => client.LocalUser?.State == MultiplayerUserState.Spectating);
+ AddUntilStep("wait for spectating user state", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
- AddStep("start match externally", () => client.StartMatch());
+ AddStep("start match externally", () => multiplayerClient.StartMatch());
AddAssert("play not started", () => multiplayerComponents.IsCurrentScreen());
}
@@ -559,16 +559,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("join other user (ready, host)", () =>
{
- client.AddUser(new APIUser { Id = MultiplayerTestScene.PLAYER_1_ID, Username = "Other" });
- client.TransferHost(MultiplayerTestScene.PLAYER_1_ID);
- client.ChangeUserState(MultiplayerTestScene.PLAYER_1_ID, MultiplayerUserState.Ready);
+ multiplayerClient.AddUser(new APIUser { Id = MultiplayerTestScene.PLAYER_1_ID, Username = "Other" });
+ multiplayerClient.TransferHost(MultiplayerTestScene.PLAYER_1_ID);
+ multiplayerClient.ChangeUserState(MultiplayerTestScene.PLAYER_1_ID, MultiplayerUserState.Ready);
});
ClickButtonWhenEnabled();
- AddUntilStep("wait for spectating user state", () => client.LocalUser?.State == MultiplayerUserState.Spectating);
+ AddUntilStep("wait for spectating user state", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
- AddStep("start match externally", () => client.StartMatch());
+ AddStep("start match externally", () => multiplayerClient.StartMatch());
AddStep("restore beatmap", () =>
{
@@ -594,7 +594,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddStep("disconnect", () => client.Disconnect());
+ AddStep("disconnect", () => multiplayerClient.Disconnect());
AddUntilStep("back in lounge", () => this.ChildrenOfType().FirstOrDefault()?.IsCurrentScreen() == true);
}
@@ -700,7 +700,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("join room", () => InputManager.Key(Key.Enter));
AddUntilStep("wait for room open", () => this.ChildrenOfType().FirstOrDefault()?.IsLoaded == true);
- AddUntilStep("wait for join", () => client.RoomJoined);
+ AddUntilStep("wait for join", () => multiplayerClient.RoomJoined);
AddAssert("local room has correct settings", () =>
{
@@ -726,11 +726,11 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddStep("set spectating state", () => client.ChangeUserState(API.LocalUser.Value.OnlineID, MultiplayerUserState.Spectating));
- AddUntilStep("state set to spectating", () => client.LocalUser?.State == MultiplayerUserState.Spectating);
+ AddStep("set spectating state", () => multiplayerClient.ChangeUserState(API.LocalUser.Value.OnlineID, MultiplayerUserState.Spectating));
+ AddUntilStep("state set to spectating", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
- AddStep("join other user", () => client.AddUser(new APIUser { Id = 1234 }));
- AddStep("set other user ready", () => client.ChangeUserState(1234, MultiplayerUserState.Ready));
+ AddStep("join other user", () => multiplayerClient.AddUser(new APIUser { Id = 1234 }));
+ AddStep("set other user ready", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Ready));
pressReadyButton(1234);
AddUntilStep("wait for gameplay", () => (multiplayerComponents.CurrentScreen as MultiSpectatorScreen)?.IsLoaded == true);
@@ -742,7 +742,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
});
AddUntilStep("wait for return to match subscreen", () => multiplayerComponents.MultiplayerScreen.IsCurrentScreen());
- AddUntilStep("user state is idle", () => client.LocalUser?.State == MultiplayerUserState.Idle);
+ AddUntilStep("user state is idle", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
}
[Test]
@@ -761,16 +761,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddStep("set spectating state", () => client.ChangeUserState(API.LocalUser.Value.OnlineID, MultiplayerUserState.Spectating));
- AddUntilStep("state set to spectating", () => client.LocalUser?.State == MultiplayerUserState.Spectating);
+ AddStep("set spectating state", () => multiplayerClient.ChangeUserState(API.LocalUser.Value.OnlineID, MultiplayerUserState.Spectating));
+ AddUntilStep("state set to spectating", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
- AddStep("join other user", () => client.AddUser(new APIUser { Id = 1234 }));
- AddStep("set other user ready", () => client.ChangeUserState(1234, MultiplayerUserState.Ready));
+ AddStep("join other user", () => multiplayerClient.AddUser(new APIUser { Id = 1234 }));
+ AddStep("set other user ready", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Ready));
pressReadyButton(1234);
AddUntilStep("wait for gameplay", () => (multiplayerComponents.CurrentScreen as MultiSpectatorScreen)?.IsLoaded == true);
- AddStep("set other user loaded", () => client.ChangeUserState(1234, MultiplayerUserState.Loaded));
- AddStep("set other user finished play", () => client.ChangeUserState(1234, MultiplayerUserState.FinishedPlay));
+ AddStep("set other user loaded", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Loaded));
+ AddStep("set other user finished play", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.FinishedPlay));
AddStep("press back button and exit", () =>
{
@@ -780,7 +780,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddUntilStep("wait for return to match subscreen", () => multiplayerComponents.MultiplayerScreen.IsCurrentScreen());
AddWaitStep("wait for possible state change", 5);
- AddUntilStep("user state is spectating", () => client.LocalUser?.State == MultiplayerUserState.Spectating);
+ AddUntilStep("user state is spectating", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
}
[Test]
@@ -800,15 +800,14 @@ namespace osu.Game.Tests.Visual.Multiplayer
});
enterGameplay();
-
- AddStep("join other user", () => client.AddUser(new APIUser { Id = 1234 }));
- AddStep("add item as other user", () => client.AddUserPlaylistItem(1234, new MultiplayerPlaylistItem(
+ AddStep("join other user", () => multiplayerClient.AddUser(new APIUser { Id = 1234 }));
+ AddStep("add item as other user", () => multiplayerClient.AddUserPlaylistItem(1234, new MultiplayerPlaylistItem(
new PlaylistItem(beatmaps.GetWorkingBeatmap(importedSet.Beatmaps.First(b => b.Ruleset.OnlineID == 0)).BeatmapInfo)
{
RulesetID = new OsuRuleset().RulesetInfo.OnlineID,
- })));
+ })).WaitSafely());
- AddUntilStep("item arrived in playlist", () => client.Room?.Playlist.Count == 2);
+ AddUntilStep("item arrived in playlist", () => multiplayerClient.Room?.Playlist.Count == 2);
AddStep("exit gameplay as initial user", () => multiplayerComponents.MultiplayerScreen.MakeCurrent());
AddUntilStep("queue contains item", () => this.ChildrenOfType().Single().Items.Single().ID == 2);
@@ -832,17 +831,17 @@ namespace osu.Game.Tests.Visual.Multiplayer
enterGameplay();
- AddStep("join other user", () => client.AddUser(new APIUser { Id = 1234 }));
- AddStep("add item as other user", () => client.AddUserPlaylistItem(1234, new MultiplayerPlaylistItem(
+ AddStep("join other user", () => multiplayerClient.AddUser(new APIUser { Id = 1234 }));
+ AddStep("add item as other user", () => multiplayerClient.AddUserPlaylistItem(1234, new MultiplayerPlaylistItem(
new PlaylistItem(beatmaps.GetWorkingBeatmap(importedSet.Beatmaps.First(b => b.Ruleset.OnlineID == 0)).BeatmapInfo)
{
RulesetID = new OsuRuleset().RulesetInfo.OnlineID,
- })));
+ })).WaitSafely());
- AddUntilStep("item arrived in playlist", () => client.Room?.Playlist.Count == 2);
+ AddUntilStep("item arrived in playlist", () => multiplayerClient.Room?.Playlist.Count == 2);
- AddStep("delete item as other user", () => client.RemoveUserPlaylistItem(1234, 2));
- AddUntilStep("item removed from playlist", () => client.Room?.Playlist.Count == 1);
+ AddStep("delete item as other user", () => multiplayerClient.RemoveUserPlaylistItem(1234, 2).WaitSafely());
+ AddUntilStep("item removed from playlist", () => multiplayerClient.Room?.Playlist.Count == 1);
AddStep("exit gameplay as initial user", () => multiplayerComponents.MultiplayerScreen.MakeCurrent());
AddUntilStep("queue is empty", () => this.ChildrenOfType().Single().Items.Count == 0);
@@ -865,17 +864,17 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("join other user and make host", () =>
{
- client.AddUser(new APIUser { Id = 1234 });
- client.TransferHost(1234);
+ multiplayerClient.AddUser(new APIUser { Id = 1234 });
+ multiplayerClient.TransferHost(1234);
});
- AddStep("set local user spectating", () => client.ChangeUserState(API.LocalUser.Value.OnlineID, MultiplayerUserState.Spectating));
- AddUntilStep("wait for spectating state", () => client.LocalUser?.State == MultiplayerUserState.Spectating);
+ AddStep("set local user spectating", () => multiplayerClient.ChangeUserState(API.LocalUser.Value.OnlineID, MultiplayerUserState.Spectating));
+ AddUntilStep("wait for spectating state", () => multiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
runGameplay();
- AddStep("exit gameplay for other user", () => client.ChangeUserState(1234, MultiplayerUserState.Idle));
- AddUntilStep("wait for room to be idle", () => client.Room?.State == MultiplayerRoomState.Open);
+ AddStep("exit gameplay for other user", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Idle));
+ AddUntilStep("wait for room to be idle", () => multiplayerClient.Room?.State == MultiplayerRoomState.Open);
runGameplay();
@@ -883,13 +882,13 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("start match by other user", () =>
{
- client.ChangeUserState(1234, MultiplayerUserState.Ready);
- client.StartMatch();
+ multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Ready);
+ multiplayerClient.StartMatch();
});
- AddUntilStep("wait for loading", () => client.Room?.State == MultiplayerRoomState.WaitingForLoad);
- AddStep("set player loaded", () => client.ChangeUserState(1234, MultiplayerUserState.Loaded));
- AddUntilStep("wait for gameplay to start", () => client.Room?.State == MultiplayerRoomState.Playing);
+ AddUntilStep("wait for loading", () => multiplayerClient.Room?.State == MultiplayerRoomState.WaitingForLoad);
+ AddStep("set player loaded", () => multiplayerClient.ChangeUserState(1234, MultiplayerUserState.Loaded));
+ AddUntilStep("wait for gameplay to start", () => multiplayerClient.Room?.State == MultiplayerRoomState.Playing);
AddUntilStep("wait for local user to enter spectator", () => multiplayerComponents.CurrentScreen is MultiSpectatorScreen);
}
}
@@ -914,7 +913,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("click ready button", () =>
{
- user = playingUserId == null ? client.LocalUser : client.Room?.Users.Single(u => u.UserID == playingUserId);
+ user = playingUserId == null ? multiplayerClient.LocalUser : multiplayerClient.Room?.Users.Single(u => u.UserID == playingUserId);
lastState = user?.State ?? MultiplayerUserState.Idle;
InputManager.MoveMouseTo(readyButton);
@@ -934,7 +933,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
ClickButtonWhenEnabled();
- AddUntilStep("wait for join", () => client.RoomJoined);
+ AddUntilStep("wait for join", () => multiplayerClient.RoomJoined);
}
}
}
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboard.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboard.cs
index 437f4e3308..6605f82d5c 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboard.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboard.cs
@@ -59,7 +59,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
foreach (int user in users)
{
SpectatorClient.StartPlay(user, Beatmap.Value.BeatmapInfo.OnlineID);
- multiplayerUsers.Add(OnlinePlayDependencies.Client.AddUser(new APIUser { Id = user }, true));
+ multiplayerUsers.Add(OnlinePlayDependencies.MultiplayerClient.AddUser(new APIUser { Id = user }, true));
}
Children = new Drawable[]
@@ -77,7 +77,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
});
AddUntilStep("wait for load", () => leaderboard.IsLoaded);
- AddUntilStep("wait for user population", () => Client.CurrentMatchPlayingUserIds.Count > 0);
+ AddUntilStep("wait for user population", () => MultiplayerClient.CurrentMatchPlayingUserIds.Count > 0);
}
[Test]
@@ -91,7 +91,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
public void TestUserQuit()
{
foreach (int user in users)
- AddStep($"mark user {user} quit", () => Client.RemoveUser(UserLookupCache.GetUserAsync(user).GetResultSafely().AsNonNull()));
+ AddStep($"mark user {user} quit", () => MultiplayerClient.RemoveUser(UserLookupCache.GetUserAsync(user).GetResultSafely().AsNonNull()));
}
[Test]
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboardTeams.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboardTeams.cs
index cd3ae50dab..dabc1c1e5a 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboardTeams.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerGameplayLeaderboardTeams.cs
@@ -63,7 +63,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
foreach (int user in users)
{
SpectatorClient.StartPlay(user, Beatmap.Value.BeatmapInfo.OnlineID);
- var roomUser = OnlinePlayDependencies.Client.AddUser(new APIUser { Id = user }, true);
+ var roomUser = OnlinePlayDependencies.MultiplayerClient.AddUser(new APIUser { Id = user }, true);
roomUser.MatchState = new TeamVersusUserState
{
@@ -105,7 +105,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
});
AddUntilStep("wait for load", () => leaderboard.IsLoaded);
- AddUntilStep("wait for user population", () => Client.CurrentMatchPlayingUserIds.Count > 0);
+ AddUntilStep("wait for user population", () => MultiplayerClient.CurrentMatchPlayingUserIds.Count > 0);
}
[Test]
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs
index e137bf83e4..12c1757c86 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs
@@ -100,7 +100,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddUntilStep("wait for join", () => RoomJoined);
- AddStep("select swap mod", () => Client.ChangeUserMods(API.LocalUser.Value.OnlineID, new[] { new TaikoModSwap() }));
+ AddStep("select swap mod", () => MultiplayerClient.ChangeUserMods(API.LocalUser.Value.OnlineID, new[] { new TaikoModSwap() }));
AddUntilStep("participant panel has mod", () => this.ChildrenOfType().Any(p => p.ChildrenOfType().Any(m => m.Mod is TaikoModSwap)));
}
@@ -137,17 +137,17 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("join other user (ready)", () =>
{
- Client.AddUser(new APIUser { Id = PLAYER_1_ID });
- Client.ChangeUserState(PLAYER_1_ID, MultiplayerUserState.Ready);
+ MultiplayerClient.AddUser(new APIUser { Id = PLAYER_1_ID });
+ MultiplayerClient.ChangeUserState(PLAYER_1_ID, MultiplayerUserState.Ready);
});
ClickButtonWhenEnabled();
- AddUntilStep("wait for spectating user state", () => Client.LocalUser?.State == MultiplayerUserState.Spectating);
+ AddUntilStep("wait for spectating user state", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
ClickButtonWhenEnabled();
- AddUntilStep("match started", () => Client.Room?.State == MultiplayerRoomState.WaitingForLoad);
+ AddUntilStep("match started", () => MultiplayerClient.Room?.State == MultiplayerRoomState.WaitingForLoad);
}
[Test]
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerParticipantsList.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerParticipantsList.cs
index 671b85164b..292319171d 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerParticipantsList.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerParticipantsList.cs
@@ -35,7 +35,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddAssert("one unique panel", () => this.ChildrenOfType().Select(p => p.User).Distinct().Count() == 1);
- AddStep("add user", () => Client.AddUser(new APIUser
+ AddStep("add user", () => MultiplayerClient.AddUser(new APIUser
{
Id = 3,
Username = "Second",
@@ -50,15 +50,15 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddAssert("one unique panel", () => this.ChildrenOfType().Select(p => p.User).Distinct().Count() == 1);
- AddStep("add non-resolvable user", () => Client.TestAddUnresolvedUser());
- AddAssert("null user added", () => Client.Room.AsNonNull().Users.Count(u => u.User == null) == 1);
+ AddStep("add non-resolvable user", () => MultiplayerClient.TestAddUnresolvedUser());
+ AddAssert("null user added", () => MultiplayerClient.Room.AsNonNull().Users.Count(u => u.User == null) == 1);
AddUntilStep("two unique panels", () => this.ChildrenOfType().Select(p => p.User).Distinct().Count() == 2);
AddStep("kick null user", () => this.ChildrenOfType().Single(p => p.User.User == null)
.ChildrenOfType().Single().TriggerClick());
- AddAssert("null user kicked", () => Client.Room.AsNonNull().Users.Count == 1);
+ AddAssert("null user kicked", () => MultiplayerClient.Room.AsNonNull().Users.Count == 1);
}
[Test]
@@ -68,7 +68,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("add a user", () =>
{
- Client.AddUser(secondUser = new APIUser
+ MultiplayerClient.AddUser(secondUser = new APIUser
{
Id = 3,
Username = "Second",
@@ -76,7 +76,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
});
});
- AddStep("remove host", () => Client.RemoveUser(API.LocalUser.Value));
+ AddStep("remove host", () => MultiplayerClient.RemoveUser(API.LocalUser.Value));
AddAssert("single panel is for second user", () => this.ChildrenOfType().Single().User.User == secondUser);
}
@@ -84,21 +84,21 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestGameStateHasPriorityOverDownloadState()
{
- AddStep("set to downloading map", () => Client.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
+ AddStep("set to downloading map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
checkProgressBarVisibility(true);
- AddStep("make user ready", () => Client.ChangeState(MultiplayerUserState.Results));
+ AddStep("make user ready", () => MultiplayerClient.ChangeState(MultiplayerUserState.Results));
checkProgressBarVisibility(false);
AddUntilStep("ready mark visible", () => this.ChildrenOfType().Single().IsPresent);
- AddStep("make user ready", () => Client.ChangeState(MultiplayerUserState.Idle));
+ AddStep("make user ready", () => MultiplayerClient.ChangeState(MultiplayerUserState.Idle));
checkProgressBarVisibility(true);
}
[Test]
public void TestCorrectInitialState()
{
- AddStep("set to downloading map", () => Client.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
+ AddStep("set to downloading map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
createNewParticipantsList();
checkProgressBarVisibility(true);
}
@@ -106,23 +106,23 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestBeatmapDownloadingStates()
{
- AddStep("set to no map", () => Client.ChangeBeatmapAvailability(BeatmapAvailability.NotDownloaded()));
- AddStep("set to downloading map", () => Client.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
+ AddStep("set to no map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.NotDownloaded()));
+ AddStep("set to downloading map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
checkProgressBarVisibility(true);
AddRepeatStep("increment progress", () =>
{
float progress = this.ChildrenOfType().Single().User.BeatmapAvailability.DownloadProgress ?? 0;
- Client.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(progress + RNG.NextSingle(0.1f)));
+ MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(progress + RNG.NextSingle(0.1f)));
}, 25);
AddAssert("progress bar increased", () => this.ChildrenOfType().Single().Current.Value > 0);
- AddStep("set to importing map", () => Client.ChangeBeatmapAvailability(BeatmapAvailability.Importing()));
+ AddStep("set to importing map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Importing()));
checkProgressBarVisibility(false);
- AddStep("set to available", () => Client.ChangeBeatmapAvailability(BeatmapAvailability.LocallyAvailable()));
+ AddStep("set to available", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.LocallyAvailable()));
}
[Test]
@@ -130,24 +130,24 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddAssert("ready mark invisible", () => !this.ChildrenOfType().Single().IsPresent);
- AddStep("make user ready", () => Client.ChangeState(MultiplayerUserState.Ready));
+ AddStep("make user ready", () => MultiplayerClient.ChangeState(MultiplayerUserState.Ready));
AddUntilStep("ready mark visible", () => this.ChildrenOfType().Single().IsPresent);
- AddStep("make user idle", () => Client.ChangeState(MultiplayerUserState.Idle));
+ AddStep("make user idle", () => MultiplayerClient.ChangeState(MultiplayerUserState.Idle));
AddUntilStep("ready mark invisible", () => !this.ChildrenOfType().Single().IsPresent);
}
[Test]
public void TestToggleSpectateState()
{
- AddStep("make user spectating", () => Client.ChangeState(MultiplayerUserState.Spectating));
- AddStep("make user idle", () => Client.ChangeState(MultiplayerUserState.Idle));
+ AddStep("make user spectating", () => MultiplayerClient.ChangeState(MultiplayerUserState.Spectating));
+ AddStep("make user idle", () => MultiplayerClient.ChangeState(MultiplayerUserState.Idle));
}
[Test]
public void TestCrownChangesStateWhenHostTransferred()
{
- AddStep("add user", () => Client.AddUser(new APIUser
+ AddStep("add user", () => MultiplayerClient.AddUser(new APIUser
{
Id = 3,
Username = "Second",
@@ -157,7 +157,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddUntilStep("first user crown visible", () => this.ChildrenOfType().ElementAt(0).ChildrenOfType().First().Alpha == 1);
AddUntilStep("second user crown hidden", () => this.ChildrenOfType().ElementAt(1).ChildrenOfType().First().Alpha == 0);
- AddStep("make second user host", () => Client.TransferHost(3));
+ AddStep("make second user host", () => MultiplayerClient.TransferHost(3));
AddUntilStep("first user crown hidden", () => this.ChildrenOfType().ElementAt(0).ChildrenOfType().First().Alpha == 0);
AddUntilStep("second user crown visible", () => this.ChildrenOfType().ElementAt(1).ChildrenOfType().First().Alpha == 1);
@@ -166,7 +166,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestKickButtonOnlyPresentWhenHost()
{
- AddStep("add user", () => Client.AddUser(new APIUser
+ AddStep("add user", () => MultiplayerClient.AddUser(new APIUser
{
Id = 3,
Username = "Second",
@@ -175,11 +175,11 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddUntilStep("kick buttons visible", () => this.ChildrenOfType().Count(d => d.IsPresent) == 1);
- AddStep("make second user host", () => Client.TransferHost(3));
+ AddStep("make second user host", () => MultiplayerClient.TransferHost(3));
AddUntilStep("kick buttons not visible", () => this.ChildrenOfType().Count(d => d.IsPresent) == 0);
- AddStep("make local user host again", () => Client.TransferHost(API.LocalUser.Value.Id));
+ AddStep("make local user host again", () => MultiplayerClient.TransferHost(API.LocalUser.Value.Id));
AddUntilStep("kick buttons visible", () => this.ChildrenOfType().Count(d => d.IsPresent) == 1);
}
@@ -187,7 +187,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestKickButtonKicks()
{
- AddStep("add user", () => Client.AddUser(new APIUser
+ AddStep("add user", () => MultiplayerClient.AddUser(new APIUser
{
Id = 3,
Username = "Second",
@@ -196,7 +196,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("kick second user", () => this.ChildrenOfType().Single(d => d.IsPresent).TriggerClick());
- AddAssert("second user kicked", () => Client.Room?.Users.Single().UserID == API.LocalUser.Value.Id);
+ AddAssert("second user kicked", () => MultiplayerClient.Room?.Users.Single().UserID == API.LocalUser.Value.Id);
}
[Test]
@@ -206,7 +206,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
for (int i = 0; i < 20; i++)
{
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = i,
Username = $"User {i}",
@@ -220,7 +220,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
});
- Client.ChangeUserState(i, (MultiplayerUserState)RNG.Next(0, (int)MultiplayerUserState.Results + 1));
+ MultiplayerClient.ChangeUserState(i, (MultiplayerUserState)RNG.Next(0, (int)MultiplayerUserState.Results + 1));
if (RNG.NextBool())
{
@@ -229,15 +229,15 @@ namespace osu.Game.Tests.Visual.Multiplayer
switch (beatmapState)
{
case DownloadState.NotDownloaded:
- Client.ChangeUserBeatmapAvailability(i, BeatmapAvailability.NotDownloaded());
+ MultiplayerClient.ChangeUserBeatmapAvailability(i, BeatmapAvailability.NotDownloaded());
break;
case DownloadState.Downloading:
- Client.ChangeUserBeatmapAvailability(i, BeatmapAvailability.Downloading(RNG.NextSingle()));
+ MultiplayerClient.ChangeUserBeatmapAvailability(i, BeatmapAvailability.Downloading(RNG.NextSingle()));
break;
case DownloadState.Importing:
- Client.ChangeUserBeatmapAvailability(i, BeatmapAvailability.Importing());
+ MultiplayerClient.ChangeUserBeatmapAvailability(i, BeatmapAvailability.Importing());
break;
}
}
@@ -250,7 +250,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add user", () =>
{
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 0,
Username = "User 0",
@@ -264,7 +264,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
});
- Client.ChangeUserMods(0, new Mod[]
+ MultiplayerClient.ChangeUserMods(0, new Mod[]
{
new OsuModHardRock(),
new OsuModDifficultyAdjust { ApproachRate = { Value = 1 } }
@@ -274,12 +274,12 @@ namespace osu.Game.Tests.Visual.Multiplayer
for (var i = MultiplayerUserState.Idle; i < MultiplayerUserState.Results; i++)
{
var state = i;
- AddStep($"set state: {state}", () => Client.ChangeUserState(0, state));
+ AddStep($"set state: {state}", () => MultiplayerClient.ChangeUserState(0, state));
}
- AddStep("set state: downloading", () => Client.ChangeUserBeatmapAvailability(0, BeatmapAvailability.Downloading(0)));
+ AddStep("set state: downloading", () => MultiplayerClient.ChangeUserBeatmapAvailability(0, BeatmapAvailability.Downloading(0)));
- AddStep("set state: locally available", () => Client.ChangeUserBeatmapAvailability(0, BeatmapAvailability.LocallyAvailable()));
+ AddStep("set state: locally available", () => MultiplayerClient.ChangeUserBeatmapAvailability(0, BeatmapAvailability.LocallyAvailable()));
}
[Test]
@@ -287,7 +287,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add dummy mods", () =>
{
- Client.ChangeUserMods(new Mod[]
+ MultiplayerClient.ChangeUserMods(new Mod[]
{
new OsuModNoFail(),
new OsuModDoubleTime()
@@ -296,7 +296,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("add user with mods", () =>
{
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 0,
Username = "Baka",
@@ -309,34 +309,34 @@ namespace osu.Game.Tests.Visual.Multiplayer
},
CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
});
- Client.ChangeUserMods(0, new Mod[]
+ MultiplayerClient.ChangeUserMods(0, new Mod[]
{
new OsuModHardRock(),
new OsuModDoubleTime()
});
});
- AddStep("set 0 ready", () => Client.ChangeState(MultiplayerUserState.Ready));
+ AddStep("set 0 ready", () => MultiplayerClient.ChangeState(MultiplayerUserState.Ready));
- AddStep("set 1 spectate", () => Client.ChangeUserState(0, MultiplayerUserState.Spectating));
+ AddStep("set 1 spectate", () => MultiplayerClient.ChangeUserState(0, MultiplayerUserState.Spectating));
// Have to set back to idle due to status priority.
AddStep("set 0 no map, 1 ready", () =>
{
- Client.ChangeState(MultiplayerUserState.Idle);
- Client.ChangeBeatmapAvailability(BeatmapAvailability.NotDownloaded());
- Client.ChangeUserState(0, MultiplayerUserState.Ready);
+ MultiplayerClient.ChangeState(MultiplayerUserState.Idle);
+ MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.NotDownloaded());
+ MultiplayerClient.ChangeUserState(0, MultiplayerUserState.Ready);
});
- AddStep("set 0 downloading", () => Client.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
+ AddStep("set 0 downloading", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));
- AddStep("set 0 spectate", () => Client.ChangeUserState(0, MultiplayerUserState.Spectating));
+ AddStep("set 0 spectate", () => MultiplayerClient.ChangeUserState(0, MultiplayerUserState.Spectating));
AddStep("make both default", () =>
{
- Client.ChangeBeatmapAvailability(BeatmapAvailability.LocallyAvailable());
- Client.ChangeUserState(0, MultiplayerUserState.Idle);
- Client.ChangeState(MultiplayerUserState.Idle);
+ MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.LocallyAvailable());
+ MultiplayerClient.ChangeUserState(0, MultiplayerUserState.Idle);
+ MultiplayerClient.ChangeState(MultiplayerUserState.Idle);
});
}
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs
index c402aff771..312281ac18 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlayer.cs
@@ -28,14 +28,14 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddStep("initialise gameplay", () =>
{
- Stack.Push(player = new MultiplayerPlayer(Client.APIRoom, new PlaylistItem(Beatmap.Value.BeatmapInfo)
+ Stack.Push(player = new MultiplayerPlayer(MultiplayerClient.APIRoom, new PlaylistItem(Beatmap.Value.BeatmapInfo)
{
RulesetID = Beatmap.Value.BeatmapInfo.Ruleset.OnlineID,
- }, Client.Room?.Users.ToArray()));
+ }, MultiplayerClient.Room?.Users.ToArray()));
});
AddUntilStep("wait for player to be current", () => player.IsCurrentScreen() && player.IsLoaded);
- AddStep("start gameplay", () => ((IMultiplayerClient)Client).MatchStarted());
+ AddStep("start gameplay", () => ((IMultiplayerClient)MultiplayerClient).MatchStarted());
}
[Test]
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlaylist.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlaylist.cs
index 57f1c31589..2b53e7ca87 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlaylist.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerPlaylist.cs
@@ -60,7 +60,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
importedBeatmap = importedSet.Beatmaps.First(b => b.Ruleset.OnlineID == 0);
});
- AddStep("change to all players mode", () => Client.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }));
+ AddStep("change to all players mode", () => MultiplayerClient.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }).WaitSafely());
}
[Test]
@@ -97,19 +97,19 @@ namespace osu.Game.Tests.Visual.Multiplayer
addItemStep();
addItemStep();
- AddStep("finish current item", () => Client.FinishCurrentItem());
+ AddStep("finish current item", () => MultiplayerClient.FinishCurrentItem().WaitSafely());
assertItemInHistoryListStep(1, 0);
assertItemInQueueListStep(2, 0);
assertItemInQueueListStep(3, 1);
- AddStep("finish current item", () => Client.FinishCurrentItem());
+ AddStep("finish current item", () => MultiplayerClient.FinishCurrentItem().WaitSafely());
assertItemInHistoryListStep(2, 0);
assertItemInHistoryListStep(1, 1);
assertItemInQueueListStep(3, 0);
- AddStep("finish current item", () => Client.FinishCurrentItem());
+ AddStep("finish current item", () => MultiplayerClient.FinishCurrentItem().WaitSafely());
assertItemInHistoryListStep(3, 0);
assertItemInHistoryListStep(2, 1);
@@ -120,7 +120,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
public void TestListsClearedWhenRoomLeft()
{
addItemStep();
- AddStep("finish current item", () => Client.FinishCurrentItem());
+ AddStep("finish current item", () => MultiplayerClient.FinishCurrentItem().WaitSafely());
AddStep("leave room", () => RoomManager.PartRoom());
AddUntilStep("wait for room part", () => !RoomJoined);
@@ -165,7 +165,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
///
/// Adds a step to create a new playlist item.
///
- private void addItemStep(bool expired = false) => AddStep("add item", () => Client.AddPlaylistItem(new MultiplayerPlaylistItem(new PlaylistItem(importedBeatmap)
+ private void addItemStep(bool expired = false) => AddStep("add item", () => MultiplayerClient.AddPlaylistItem(new MultiplayerPlaylistItem(new PlaylistItem(importedBeatmap)
{
Expired = expired,
PlayedAt = DateTimeOffset.Now
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs
index 02bd93ed28..be9b317788 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerQueueList.cs
@@ -50,7 +50,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Size = new Vector2(500, 300),
- Items = { BindTarget = Client.APIRoom!.Playlist }
+ Items = { BindTarget = MultiplayerClient.APIRoom!.Playlist }
};
});
@@ -61,14 +61,14 @@ namespace osu.Game.Tests.Visual.Multiplayer
importedBeatmap = importedSet.Beatmaps.First(b => b.Ruleset.OnlineID == 0);
});
- AddStep("change to all players mode", () => Client.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }));
+ AddStep("change to all players mode", () => MultiplayerClient.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }).WaitSafely());
}
[Test]
public void TestDeleteButtonAlwaysVisibleForHost()
{
- AddStep("set all players queue mode", () => Client.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }));
- AddUntilStep("wait for queue mode change", () => Client.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
+ AddStep("set all players queue mode", () => MultiplayerClient.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }).WaitSafely());
+ AddUntilStep("wait for queue mode change", () => MultiplayerClient.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
addPlaylistItem(() => API.LocalUser.Value.OnlineID);
assertDeleteButtonVisibility(1, true);
@@ -79,18 +79,18 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestDeleteButtonOnlyVisibleForItemOwnerIfNotHost()
{
- AddStep("set all players queue mode", () => Client.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }));
- AddUntilStep("wait for queue mode change", () => Client.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
+ AddStep("set all players queue mode", () => MultiplayerClient.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }).WaitSafely());
+ AddUntilStep("wait for queue mode change", () => MultiplayerClient.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
- AddStep("join other user", () => Client.AddUser(new APIUser { Id = 1234 }));
- AddStep("set other user as host", () => Client.TransferHost(1234));
+ AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 1234 }));
+ AddStep("set other user as host", () => MultiplayerClient.TransferHost(1234));
addPlaylistItem(() => API.LocalUser.Value.OnlineID);
assertDeleteButtonVisibility(1, true);
addPlaylistItem(() => 1234);
assertDeleteButtonVisibility(2, false);
- AddStep("set local user as host", () => Client.TransferHost(API.LocalUser.Value.OnlineID));
+ AddStep("set local user as host", () => MultiplayerClient.TransferHost(API.LocalUser.Value.OnlineID));
assertDeleteButtonVisibility(1, true);
assertDeleteButtonVisibility(2, true);
}
@@ -98,16 +98,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestCurrentItemDoesNotHaveDeleteButton()
{
- AddStep("set all players queue mode", () => Client.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }));
- AddUntilStep("wait for queue mode change", () => Client.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
+ AddStep("set all players queue mode", () => MultiplayerClient.ChangeSettings(new MultiplayerRoomSettings { QueueMode = QueueMode.AllPlayers }).WaitSafely());
+ AddUntilStep("wait for queue mode change", () => MultiplayerClient.APIRoom?.QueueMode.Value == QueueMode.AllPlayers);
addPlaylistItem(() => API.LocalUser.Value.OnlineID);
assertDeleteButtonVisibility(0, false);
assertDeleteButtonVisibility(1, true);
- AddStep("finish current item", () => Client.FinishCurrentItem());
- AddUntilStep("wait for next item to be selected", () => Client.Room?.Settings.PlaylistItemId == 2);
+ AddStep("finish current item", () => MultiplayerClient.FinishCurrentItem().WaitSafely());
+ AddUntilStep("wait for next item to be selected", () => MultiplayerClient.Room?.Settings.PlaylistItemId == 2);
AddUntilStep("wait for two items in playlist", () => playlist.ChildrenOfType().Count() == 2);
assertDeleteButtonVisibility(0, false);
@@ -122,7 +122,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
MultiplayerPlaylistItem item = new MultiplayerPlaylistItem(new PlaylistItem(importedBeatmap));
- Client.AddUserPlaylistItem(userId(), item);
+ MultiplayerClient.AddUserPlaylistItem(userId(), item).WaitSafely();
itemId = item.ID;
});
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerReadyButton.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerReadyButton.cs
index d486a69061..d941f50c4b 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerReadyButton.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerReadyButton.cs
@@ -73,13 +73,13 @@ namespace osu.Game.Tests.Visual.Multiplayer
Task.Run(async () =>
{
- if (Client.IsHost && Client.LocalUser?.State == MultiplayerUserState.Ready)
+ if (MultiplayerClient.IsHost && MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready)
{
- await Client.StartMatch();
+ await MultiplayerClient.StartMatch();
return;
}
- await Client.ToggleReady();
+ await MultiplayerClient.ToggleReady();
readyClickOperation.Dispose();
});
@@ -109,15 +109,15 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add second user as host", () =>
{
- Client.AddUser(new APIUser { Id = 2, Username = "Another user" });
- Client.TransferHost(2);
+ MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
+ MultiplayerClient.TransferHost(2);
});
ClickButtonWhenEnabled();
- AddUntilStep("user is ready", () => Client.Room?.Users[0].State == MultiplayerUserState.Ready);
+ AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
ClickButtonWhenEnabled();
- AddUntilStep("user is idle", () => Client.Room?.Users[0].State == MultiplayerUserState.Idle);
+ AddUntilStep("user is idle", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
}
[TestCase(true)]
@@ -126,14 +126,14 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("setup", () =>
{
- Client.TransferHost(Client.Room?.Users[0].UserID ?? 0);
+ MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0);
if (!allReady)
- Client.AddUser(new APIUser { Id = 2, Username = "Another user" });
+ MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
});
ClickButtonWhenEnabled();
- AddUntilStep("user is ready", () => Client.Room?.Users[0].State == MultiplayerUserState.Ready);
+ AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
verifyGameplayStartFlow();
}
@@ -143,12 +143,12 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add host", () =>
{
- Client.AddUser(new APIUser { Id = 2, Username = "Another user" });
- Client.TransferHost(2);
+ MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
+ MultiplayerClient.TransferHost(2);
});
ClickButtonWhenEnabled();
- AddStep("make user host", () => Client.TransferHost(Client.Room?.Users[0].UserID ?? 0));
+ AddStep("make user host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0));
verifyGameplayStartFlow();
}
@@ -158,17 +158,17 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("setup", () =>
{
- Client.TransferHost(Client.Room?.Users[0].UserID ?? 0);
- Client.AddUser(new APIUser { Id = 2, Username = "Another user" });
+ MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0);
+ MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
});
ClickButtonWhenEnabled();
- AddUntilStep("user is ready", () => Client.Room?.Users[0].State == MultiplayerUserState.Ready);
+ AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
- AddStep("transfer host", () => Client.TransferHost(Client.Room?.Users[1].UserID ?? 0));
+ AddStep("transfer host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[1].UserID ?? 0));
ClickButtonWhenEnabled();
- AddUntilStep("user is idle (match not started)", () => Client.Room?.Users[0].State == MultiplayerUserState.Idle);
+ AddUntilStep("user is idle (match not started)", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
AddAssert("ready button enabled", () => button.ChildrenOfType().Single().Enabled.Value);
}
@@ -179,42 +179,42 @@ namespace osu.Game.Tests.Visual.Multiplayer
const int users = 10;
AddStep("setup", () =>
{
- Client.TransferHost(Client.Room?.Users[0].UserID ?? 0);
+ MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0);
for (int i = 0; i < users; i++)
- Client.AddUser(new APIUser { Id = i, Username = "Another user" });
+ MultiplayerClient.AddUser(new APIUser { Id = i, Username = "Another user" });
});
if (!isHost)
- AddStep("transfer host", () => Client.TransferHost(2));
+ AddStep("transfer host", () => MultiplayerClient.TransferHost(2));
ClickButtonWhenEnabled();
AddRepeatStep("change user ready state", () =>
{
- Client.ChangeUserState(RNG.Next(0, users), RNG.NextBool() ? MultiplayerUserState.Ready : MultiplayerUserState.Idle);
+ MultiplayerClient.ChangeUserState(RNG.Next(0, users), RNG.NextBool() ? MultiplayerUserState.Ready : MultiplayerUserState.Idle);
}, 20);
AddRepeatStep("ready all users", () =>
{
- var nextUnready = Client.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Idle);
+ var nextUnready = MultiplayerClient.Room?.Users.FirstOrDefault(c => c.State == MultiplayerUserState.Idle);
if (nextUnready != null)
- Client.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Ready);
+ MultiplayerClient.ChangeUserState(nextUnready.UserID, MultiplayerUserState.Ready);
}, users);
}
private void verifyGameplayStartFlow()
{
- AddUntilStep("user is ready", () => Client.Room?.Users[0].State == MultiplayerUserState.Ready);
+ AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
ClickButtonWhenEnabled();
- AddUntilStep("user waiting for load", () => Client.Room?.Users[0].State == MultiplayerUserState.WaitingForLoad);
+ AddUntilStep("user waiting for load", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.WaitingForLoad);
AddAssert("ready button disabled", () => !button.ChildrenOfType().Single().Enabled.Value);
AddStep("transitioned to gameplay", () => readyClickOperation.Dispose());
AddStep("finish gameplay", () =>
{
- Client.ChangeUserState(Client.Room?.Users[0].UserID ?? 0, MultiplayerUserState.Loaded);
- Client.ChangeUserState(Client.Room?.Users[0].UserID ?? 0, MultiplayerUserState.FinishedPlay);
+ MultiplayerClient.ChangeUserState(MultiplayerClient.Room?.Users[0].UserID ?? 0, MultiplayerUserState.Loaded);
+ MultiplayerClient.ChangeUserState(MultiplayerClient.Room?.Users[0].UserID ?? 0, MultiplayerUserState.FinishedPlay);
});
AddUntilStep("ready button enabled", () => button.ChildrenOfType().Single().Enabled.Value);
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerSpectateButton.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerSpectateButton.cs
index c8077a49dc..03daeaab64 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerSpectateButton.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerSpectateButton.cs
@@ -77,7 +77,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
Task.Run(async () =>
{
- await Client.ToggleSpectate();
+ await MultiplayerClient.ToggleSpectate();
readyClickOperation.Dispose();
});
}
@@ -93,13 +93,13 @@ namespace osu.Game.Tests.Visual.Multiplayer
Task.Run(async () =>
{
- if (Client.IsHost && Client.LocalUser?.State == MultiplayerUserState.Ready)
+ if (MultiplayerClient.IsHost && MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready)
{
- await Client.StartMatch();
+ await MultiplayerClient.StartMatch();
return;
}
- await Client.ToggleReady();
+ await MultiplayerClient.ToggleReady();
readyClickOperation.Dispose();
});
@@ -114,7 +114,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
[TestCase(MultiplayerRoomState.Playing)]
public void TestEnabledWhenRoomOpenOrInGameplay(MultiplayerRoomState roomState)
{
- AddStep($"change room to {roomState}", () => Client.ChangeRoomState(roomState));
+ AddStep($"change room to {roomState}", () => MultiplayerClient.ChangeRoomState(roomState));
assertSpectateButtonEnablement(true);
}
@@ -123,16 +123,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
public void TestToggleWhenIdle(MultiplayerUserState initialState)
{
ClickButtonWhenEnabled();
- AddUntilStep("user is spectating", () => Client.Room?.Users[0].State == MultiplayerUserState.Spectating);
+ AddUntilStep("user is spectating", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Spectating);
ClickButtonWhenEnabled();
- AddUntilStep("user is idle", () => Client.Room?.Users[0].State == MultiplayerUserState.Idle);
+ AddUntilStep("user is idle", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
}
[TestCase(MultiplayerRoomState.Closed)]
public void TestDisabledWhenClosed(MultiplayerRoomState roomState)
{
- AddStep($"change room to {roomState}", () => Client.ChangeRoomState(roomState));
+ AddStep($"change room to {roomState}", () => MultiplayerClient.ChangeRoomState(roomState));
assertSpectateButtonEnablement(false);
}
@@ -146,8 +146,8 @@ namespace osu.Game.Tests.Visual.Multiplayer
[Test]
public void TestReadyButtonEnabledWhenHostAndUsersReady()
{
- AddStep("add user", () => Client.AddUser(new APIUser { Id = PLAYER_1_ID }));
- AddStep("set user ready", () => Client.ChangeUserState(PLAYER_1_ID, MultiplayerUserState.Ready));
+ AddStep("add user", () => MultiplayerClient.AddUser(new APIUser { Id = PLAYER_1_ID }));
+ AddStep("set user ready", () => MultiplayerClient.ChangeUserState(PLAYER_1_ID, MultiplayerUserState.Ready));
ClickButtonWhenEnabled();
assertReadyButtonEnablement(true);
@@ -158,11 +158,11 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add user and transfer host", () =>
{
- Client.AddUser(new APIUser { Id = PLAYER_1_ID });
- Client.TransferHost(PLAYER_1_ID);
+ MultiplayerClient.AddUser(new APIUser { Id = PLAYER_1_ID });
+ MultiplayerClient.TransferHost(PLAYER_1_ID);
});
- AddStep("set user ready", () => Client.ChangeUserState(PLAYER_1_ID, MultiplayerUserState.Ready));
+ AddStep("set user ready", () => MultiplayerClient.ChangeUserState(PLAYER_1_ID, MultiplayerUserState.Ready));
ClickButtonWhenEnabled();
assertReadyButtonEnablement(false);
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneRankRangePill.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneRankRangePill.cs
index 823ac07cf7..f95e73ff3c 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneRankRangePill.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneRankRangePill.cs
@@ -25,14 +25,14 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add user", () =>
{
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 2,
Statistics = { GlobalRank = 1234 }
});
// Remove the local user so only the one above is displayed.
- Client.RemoveUser(API.LocalUser.Value);
+ MultiplayerClient.RemoveUser(API.LocalUser.Value);
});
}
@@ -41,26 +41,26 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add users", () =>
{
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 2,
Statistics = { GlobalRank = 1234 }
});
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 3,
Statistics = { GlobalRank = 3333 }
});
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 4,
Statistics = { GlobalRank = 4321 }
});
// Remove the local user so only the ones above are displayed.
- Client.RemoveUser(API.LocalUser.Value);
+ MultiplayerClient.RemoveUser(API.LocalUser.Value);
});
}
@@ -75,20 +75,20 @@ namespace osu.Game.Tests.Visual.Multiplayer
{
AddStep("add users", () =>
{
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 2,
Statistics = { GlobalRank = min }
});
- Client.AddUser(new APIUser
+ MultiplayerClient.AddUser(new APIUser
{
Id = 3,
Statistics = { GlobalRank = max }
});
// Remove the local user so only the ones above are displayed.
- Client.RemoveUser(API.LocalUser.Value);
+ MultiplayerClient.RemoveUser(API.LocalUser.Value);
});
}
}
diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneTeamVersus.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneTeamVersus.cs
index bd57c8afa5..002ae3141a 100644
--- a/osu.Game.Tests/Visual/Multiplayer/TestSceneTeamVersus.cs
+++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneTeamVersus.cs
@@ -33,7 +33,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
private TestMultiplayerComponents multiplayerComponents;
- private TestMultiplayerClient client => multiplayerComponents.Client;
+ private TestMultiplayerClient multiplayerClient => multiplayerComponents.MultiplayerClient;
[BackgroundDependencyLoader]
private void load(GameHost host, AudioManager audio)
@@ -74,8 +74,8 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddUntilStep("room type is team vs", () => client.Room?.Settings.MatchType == MatchType.TeamVersus);
- AddAssert("user state arrived", () => client.Room?.Users.FirstOrDefault()?.MatchState is TeamVersusUserState);
+ AddUntilStep("room type is team vs", () => multiplayerClient.Room?.Settings.MatchType == MatchType.TeamVersus);
+ AddAssert("user state arrived", () => multiplayerClient.Room?.Users.FirstOrDefault()?.MatchState is TeamVersusUserState);
}
[Test]
@@ -94,25 +94,25 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddAssert("user on team 0", () => (client.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 0);
- AddStep("add another user", () => client.AddUser(new APIUser { Username = "otheruser", Id = 44 }));
+ AddAssert("user on team 0", () => (multiplayerClient.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 0);
+ AddStep("add another user", () => multiplayerClient.AddUser(new APIUser { Username = "otheruser", Id = 44 }));
AddStep("press own button", () =>
{
InputManager.MoveMouseTo(multiplayerComponents.ChildrenOfType().First());
InputManager.Click(MouseButton.Left);
});
- AddAssert("user on team 1", () => (client.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 1);
+ AddAssert("user on team 1", () => (multiplayerClient.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 1);
AddStep("press own button again", () => InputManager.Click(MouseButton.Left));
- AddAssert("user on team 0", () => (client.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 0);
+ AddAssert("user on team 0", () => (multiplayerClient.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 0);
AddStep("press other user's button", () =>
{
InputManager.MoveMouseTo(multiplayerComponents.ChildrenOfType().ElementAt(1));
InputManager.Click(MouseButton.Left);
});
- AddAssert("user still on team 0", () => (client.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 0);
+ AddAssert("user still on team 0", () => (multiplayerClient.Room?.Users.FirstOrDefault()?.MatchState as TeamVersusUserState)?.TeamID == 0);
}
[Test]
@@ -131,14 +131,14 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddUntilStep("match type head to head", () => client.APIRoom?.Type.Value == MatchType.HeadToHead);
+ AddUntilStep("match type head to head", () => multiplayerClient.APIRoom?.Type.Value == MatchType.HeadToHead);
- AddStep("change match type", () => client.ChangeSettings(new MultiplayerRoomSettings
+ AddStep("change match type", () => multiplayerClient.ChangeSettings(new MultiplayerRoomSettings
{
MatchType = MatchType.TeamVersus
- }));
+ }).WaitSafely());
- AddUntilStep("api room updated to team versus", () => client.APIRoom?.Type.Value == MatchType.TeamVersus);
+ AddUntilStep("api room updated to team versus", () => multiplayerClient.APIRoom?.Type.Value == MatchType.TeamVersus);
}
[Test]
@@ -156,13 +156,13 @@ namespace osu.Game.Tests.Visual.Multiplayer
}
});
- AddUntilStep("room type is head to head", () => client.Room?.Settings.MatchType == MatchType.HeadToHead);
+ AddUntilStep("room type is head to head", () => multiplayerClient.Room?.Settings.MatchType == MatchType.HeadToHead);
AddUntilStep("team displays are not displaying teams", () => multiplayerComponents.ChildrenOfType().All(d => d.DisplayedTeam == null));
- AddStep("change to team vs", () => client.ChangeSettings(matchType: MatchType.TeamVersus));
+ AddStep("change to team vs", () => multiplayerClient.ChangeSettings(matchType: MatchType.TeamVersus));
- AddUntilStep("room type is team vs", () => client.Room?.Settings.MatchType == MatchType.TeamVersus);
+ AddUntilStep("room type is team vs", () => multiplayerClient.Room?.Settings.MatchType == MatchType.TeamVersus);
AddUntilStep("team displays are displaying teams", () => multiplayerComponents.ChildrenOfType().All(d => d.DisplayedTeam != null));
}
@@ -181,7 +181,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
InputManager.Click(MouseButton.Left);
});
- AddUntilStep("wait for join", () => client.RoomJoined);
+ AddUntilStep("wait for join", () => multiplayerClient.RoomJoined);
}
}
}
diff --git a/osu.Game.Tests/Visual/TestMultiplayerComponents.cs b/osu.Game.Tests/Visual/TestMultiplayerComponents.cs
index 2e551947b6..c43ed744bd 100644
--- a/osu.Game.Tests/Visual/TestMultiplayerComponents.cs
+++ b/osu.Game.Tests/Visual/TestMultiplayerComponents.cs
@@ -39,7 +39,7 @@ namespace osu.Game.Tests.Visual
public new bool IsLoaded => base.IsLoaded && MultiplayerScreen.IsLoaded;
[Cached(typeof(MultiplayerClient))]
- public readonly TestMultiplayerClient Client;
+ public readonly TestMultiplayerClient MultiplayerClient;
[Cached(typeof(UserLookupCache))]
private readonly UserLookupCache userLookupCache = new TestUserLookupCache();
@@ -61,7 +61,7 @@ namespace osu.Game.Tests.Visual
{
userLookupCache,
beatmapLookupCache,
- Client = new TestMultiplayerClient(RoomManager),
+ MultiplayerClient = new TestMultiplayerClient(RoomManager),
screenStack = new OsuScreenStack
{
Name = nameof(TestMultiplayerComponents),
diff --git a/osu.Game.Tests/osu.Game.Tests.csproj b/osu.Game.Tests/osu.Game.Tests.csproj
index 3b115d43e5..acf1e8470b 100644
--- a/osu.Game.Tests/osu.Game.Tests.csproj
+++ b/osu.Game.Tests/osu.Game.Tests.csproj
@@ -12,7 +12,7 @@
WinExe
- net5.0
+ net6.0
tests.ruleset
diff --git a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj
index 130fcfaca1..c7314a4969 100644
--- a/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj
+++ b/osu.Game.Tournament.Tests/osu.Game.Tournament.Tests.csproj
@@ -11,7 +11,7 @@
WinExe
- net5.0
+ net6.0
@@ -20,4 +20,4 @@
-
\ No newline at end of file
+
diff --git a/osu.Game/Beatmaps/BeatmapManager.cs b/osu.Game/Beatmaps/BeatmapManager.cs
index 633eb8f15e..777d5db2ad 100644
--- a/osu.Game/Beatmaps/BeatmapManager.cs
+++ b/osu.Game/Beatmaps/BeatmapManager.cs
@@ -108,39 +108,73 @@ namespace osu.Game.Beatmaps
}
///
- /// Add a new difficulty to the beatmap set represented by the provided .
+ /// Add a new difficulty to the provided based on the provided .
/// The new difficulty will be backed by a model
/// and represented by the returned .
///
- public virtual WorkingBeatmap CreateNewBlankDifficulty(BeatmapSetInfo beatmapSetInfo, RulesetInfo rulesetInfo)
+ ///
+ /// Contrary to , this method does not preserve hitobjects and beatmap-level settings from .
+ /// The created beatmap will have zero hitobjects and will have default settings (including difficulty settings), but will preserve metadata and existing timing points.
+ ///
+ /// The to add the new difficulty to.
+ /// The to use as a baseline reference when creating the new difficulty.
+ /// The ruleset with which the new difficulty should be created.
+ public virtual WorkingBeatmap CreateNewDifficulty(BeatmapSetInfo targetBeatmapSet, WorkingBeatmap referenceWorkingBeatmap, RulesetInfo rulesetInfo)
{
- // fetch one of the existing difficulties to copy timing points and metadata from,
- // so that the user doesn't have to fill all of that out again.
- // this silently assumes that all difficulties have the same timing points and metadata,
- // but cases where this isn't true seem rather rare / pathological.
- var referenceBeatmap = GetWorkingBeatmap(beatmapSetInfo.Beatmaps.First());
+ var playableBeatmap = referenceWorkingBeatmap.GetPlayableBeatmap(rulesetInfo);
- var newBeatmapInfo = new BeatmapInfo(rulesetInfo, new BeatmapDifficulty(), referenceBeatmap.Metadata.DeepClone());
+ var newBeatmapInfo = new BeatmapInfo(rulesetInfo, new BeatmapDifficulty(), playableBeatmap.Metadata.DeepClone());
+ var newBeatmap = new Beatmap { BeatmapInfo = newBeatmapInfo };
+ foreach (var timingPoint in playableBeatmap.ControlPointInfo.TimingPoints)
+ newBeatmap.ControlPointInfo.Add(timingPoint.Time, timingPoint.DeepClone());
+ return addDifficultyToSet(targetBeatmapSet, newBeatmap, referenceWorkingBeatmap.Skin);
+ }
+
+ ///
+ /// Add a copy of the provided to the provided .
+ /// The new difficulty will be backed by a model
+ /// and represented by the returned .
+ ///
+ ///
+ /// Contrary to , this method creates a nearly-exact copy of
+ /// (with the exception of a few key properties that cannot be copied under any circumstance, like difficulty name, beatmap hash, or online status).
+ ///
+ /// The to add the copy to.
+ /// The to be copied.
+ public virtual WorkingBeatmap CopyExistingDifficulty(BeatmapSetInfo targetBeatmapSet, WorkingBeatmap referenceWorkingBeatmap)
+ {
+ var newBeatmap = referenceWorkingBeatmap.GetPlayableBeatmap(referenceWorkingBeatmap.BeatmapInfo.Ruleset).Clone();
+ BeatmapInfo newBeatmapInfo;
+
+ newBeatmap.BeatmapInfo = newBeatmapInfo = referenceWorkingBeatmap.BeatmapInfo.Clone();
+ // assign a new ID to the clone.
+ newBeatmapInfo.ID = Guid.NewGuid();
+ // add "(copy)" suffix to difficulty name to avoid clashes on save.
+ newBeatmapInfo.DifficultyName += " (copy)";
+ // clear the hash, as that's what is used to match .osu files with their corresponding realm beatmaps.
+ newBeatmapInfo.Hash = string.Empty;
+ // clear online properties.
+ newBeatmapInfo.OnlineID = -1;
+ newBeatmapInfo.Status = BeatmapOnlineStatus.None;
+
+ return addDifficultyToSet(targetBeatmapSet, newBeatmap, referenceWorkingBeatmap.Skin);
+ }
+
+ private WorkingBeatmap addDifficultyToSet(BeatmapSetInfo targetBeatmapSet, IBeatmap newBeatmap, ISkin beatmapSkin)
+ {
// populate circular beatmap set info <-> beatmap info references manually.
// several places like `BeatmapModelManager.Save()` or `GetWorkingBeatmap()`
// rely on them being freely traversable in both directions for correct operation.
- beatmapSetInfo.Beatmaps.Add(newBeatmapInfo);
- newBeatmapInfo.BeatmapSet = beatmapSetInfo;
+ targetBeatmapSet.Beatmaps.Add(newBeatmap.BeatmapInfo);
+ newBeatmap.BeatmapInfo.BeatmapSet = targetBeatmapSet;
- var newBeatmap = new Beatmap { BeatmapInfo = newBeatmapInfo };
- foreach (var timingPoint in referenceBeatmap.Beatmap.ControlPointInfo.TimingPoints)
- newBeatmap.ControlPointInfo.Add(timingPoint.Time, timingPoint.DeepClone());
+ beatmapModelManager.Save(newBeatmap.BeatmapInfo, newBeatmap, beatmapSkin);
- beatmapModelManager.Save(newBeatmapInfo, newBeatmap);
-
- workingBeatmapCache.Invalidate(beatmapSetInfo);
+ workingBeatmapCache.Invalidate(targetBeatmapSet);
return GetWorkingBeatmap(newBeatmap.BeatmapInfo);
}
- // TODO: add back support for making a copy of another difficulty
- // (likely via a separate `CopyDifficulty()` method).
-
///
/// Delete a beatmap difficulty.
///
diff --git a/osu.Game/Database/EFToRealmMigrator.cs b/osu.Game/Database/EFToRealmMigrator.cs
index 0bb5388d55..c9deee19fe 100644
--- a/osu.Game/Database/EFToRealmMigrator.cs
+++ b/osu.Game/Database/EFToRealmMigrator.cs
@@ -215,7 +215,8 @@ namespace osu.Game.Database
.Include(s => s.Beatmaps).ThenInclude(b => b.Metadata)
.Include(s => s.Beatmaps).ThenInclude(b => b.BaseDifficulty)
.Include(s => s.Files).ThenInclude(f => f.FileInfo)
- .Include(s => s.Metadata);
+ .Include(s => s.Metadata)
+ .AsSplitQuery();
log("Beginning beatmaps migration to realm");
@@ -344,7 +345,8 @@ namespace osu.Game.Database
.Include(s => s.Ruleset)
.Include(s => s.BeatmapInfo)
.Include(s => s.Files)
- .ThenInclude(f => f.FileInfo);
+ .ThenInclude(f => f.FileInfo)
+ .AsSplitQuery();
log("Beginning scores migration to realm");
@@ -434,6 +436,7 @@ namespace osu.Game.Database
var existingSkins = db.SkinInfo
.Include(s => s.Files)
.ThenInclude(f => f.FileInfo)
+ .AsSplitQuery()
.ToList();
// previous entries in EF are removed post migration.
diff --git a/osu.Game/Database/ImportTask.cs b/osu.Game/Database/ImportTask.cs
index cd9e396d13..d75c1a73e6 100644
--- a/osu.Game/Database/ImportTask.cs
+++ b/osu.Game/Database/ImportTask.cs
@@ -4,6 +4,7 @@
#nullable enable
using System.IO;
+using osu.Framework.Extensions;
using osu.Game.IO.Archives;
using osu.Game.Stores;
using osu.Game.Utils;
@@ -63,9 +64,7 @@ namespace osu.Game.Database
if (!(stream is MemoryStream memoryStream))
{
// This isn't used in any current path. May need to reconsider for performance reasons (ie. if we don't expect the incoming stream to be copied out).
- byte[] buffer = new byte[stream.Length];
- stream.Read(buffer, 0, (int)stream.Length);
- memoryStream = new MemoryStream(buffer);
+ memoryStream = new MemoryStream(stream.ReadAllBytesToArray());
}
if (ZipUtils.IsZipArchive(memoryStream))
diff --git a/osu.Game/Database/OsuDbContext.cs b/osu.Game/Database/OsuDbContext.cs
index 441b090a6e..79183b6f0e 100644
--- a/osu.Game/Database/OsuDbContext.cs
+++ b/osu.Game/Database/OsuDbContext.cs
@@ -3,7 +3,6 @@
using System;
using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using osu.Framework.Logging;
using osu.Framework.Statistics;
@@ -12,8 +11,9 @@ using osu.Game.Configuration;
using osu.Game.IO;
using osu.Game.Rulesets;
using osu.Game.Scoring;
-using LogLevel = Microsoft.Extensions.Logging.LogLevel;
using osu.Game.Skinning;
+using SQLitePCL;
+using LogLevel = Microsoft.Extensions.Logging.LogLevel;
namespace osu.Game.Database
{
@@ -40,10 +40,10 @@ namespace osu.Game.Database
static OsuDbContext()
{
// required to initialise native SQLite libraries on some platforms.
- SQLitePCL.Batteries_V2.Init();
+ Batteries_V2.Init();
// https://github.com/aspnet/EntityFrameworkCore/issues/9994#issuecomment-508588678
- SQLitePCL.raw.sqlite3_config(2 /*SQLITE_CONFIG_MULTITHREAD*/);
+ raw.sqlite3_config(2 /*SQLITE_CONFIG_MULTITHREAD*/);
}
///
@@ -116,7 +116,6 @@ namespace osu.Game.Database
optionsBuilder
// this is required for the time being due to the way we are querying in places like BeatmapStore.
// if we ever move to having consumers file their own .Includes, or get eager loading support, this could be re-enabled.
- .ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.IncludeIgnoredWarning))
.UseSqlite(connectionString, sqliteOptions => sqliteOptions.CommandTimeout(10))
.UseLoggerFactory(logger.Value);
}
diff --git a/osu.Game/Graphics/UserInterfaceV2/SwitchButton.cs b/osu.Game/Graphics/UserInterfaceV2/SwitchButton.cs
index deb2e6baf6..c6477d1781 100644
--- a/osu.Game/Graphics/UserInterfaceV2/SwitchButton.cs
+++ b/osu.Game/Graphics/UserInterfaceV2/SwitchButton.cs
@@ -114,7 +114,7 @@ namespace osu.Game.Graphics.UserInterfaceV2
private class CircularBorderContainer : CircularContainer
{
- public void TransformBorderTo(SRGBColour colour)
+ public void TransformBorderTo(ColourInfo colour)
=> this.TransformTo(nameof(BorderColour), colour, 250, Easing.OutQuint);
}
}
diff --git a/osu.Game/IO/Archives/ArchiveReader.cs b/osu.Game/IO/Archives/ArchiveReader.cs
index 1d8da16c72..dab70eaf70 100644
--- a/osu.Game/IO/Archives/ArchiveReader.cs
+++ b/osu.Game/IO/Archives/ArchiveReader.cs
@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
+using osu.Framework.Extensions;
using osu.Framework.IO.Stores;
namespace osu.Game.IO.Archives
@@ -35,14 +36,7 @@ namespace osu.Game.IO.Archives
public virtual byte[] Get(string name)
{
using (Stream input = GetStream(name))
- {
- if (input == null)
- return null;
-
- byte[] buffer = new byte[input.Length];
- input.Read(buffer);
- return buffer;
- }
+ return input?.ReadAllBytesToArray();
}
public async Task GetAsync(string name, CancellationToken cancellationToken = default)
@@ -52,9 +46,7 @@ namespace osu.Game.IO.Archives
if (input == null)
return null;
- byte[] buffer = new byte[input.Length];
- await input.ReadAsync(buffer, cancellationToken).ConfigureAwait(false);
- return buffer;
+ return await input.ReadAllBytesToArrayAsync(cancellationToken).ConfigureAwait(false);
}
}
}
diff --git a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
index e92bcd9769..7e62908ecd 100644
--- a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
+++ b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
@@ -4,6 +4,7 @@
#nullable enable
using System.Collections.Generic;
+using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR.Client;
@@ -74,6 +75,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.FromCanceled(new CancellationToken(true));
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.JoinRoomWithPassword), roomId, password ?? string.Empty);
}
@@ -82,6 +85,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.FromCanceled(new CancellationToken(true));
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.LeaveRoom));
}
@@ -90,6 +95,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.TransferHost), userId);
}
@@ -98,6 +105,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.KickUser), userId);
}
@@ -106,6 +115,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.ChangeSettings), settings);
}
@@ -114,6 +125,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.ChangeState), newState);
}
@@ -122,6 +135,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.ChangeBeatmapAvailability), newBeatmapAvailability);
}
@@ -130,6 +145,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.ChangeUserMods), newMods);
}
@@ -138,6 +155,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.SendMatchRequest), request);
}
@@ -146,6 +165,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.StartMatch));
}
@@ -154,6 +175,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.AbortGameplay));
}
@@ -162,6 +185,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.AddPlaylistItem), item);
}
@@ -170,6 +195,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.EditPlaylistItem), item);
}
@@ -178,6 +205,8 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.InvokeAsync(nameof(IMultiplayerServer.RemovePlaylistItem), playlistItemId);
}
diff --git a/osu.Game/Online/Spectator/OnlineSpectatorClient.cs b/osu.Game/Online/Spectator/OnlineSpectatorClient.cs
index 753796158e..ddde69c627 100644
--- a/osu.Game/Online/Spectator/OnlineSpectatorClient.cs
+++ b/osu.Game/Online/Spectator/OnlineSpectatorClient.cs
@@ -3,6 +3,7 @@
#nullable enable
+using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR.Client;
using osu.Framework.Allocation;
@@ -51,6 +52,8 @@ namespace osu.Game.Online.Spectator
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.SendAsync(nameof(ISpectatorServer.BeginPlaySession), state);
}
@@ -59,6 +62,8 @@ namespace osu.Game.Online.Spectator
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.SendAsync(nameof(ISpectatorServer.SendFrameData), data);
}
@@ -67,6 +72,8 @@ namespace osu.Game.Online.Spectator
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.SendAsync(nameof(ISpectatorServer.EndPlaySession), state);
}
@@ -75,6 +82,8 @@ namespace osu.Game.Online.Spectator
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.SendAsync(nameof(ISpectatorServer.StartWatchingUser), userId);
}
@@ -83,6 +92,8 @@ namespace osu.Game.Online.Spectator
if (!IsConnected.Value)
return Task.CompletedTask;
+ Debug.Assert(connection != null);
+
return connection.SendAsync(nameof(ISpectatorServer.EndWatchingUser), userId);
}
}
diff --git a/osu.Game/Overlays/Login/LoginPanel.cs b/osu.Game/Overlays/Login/LoginPanel.cs
index d1e5bfe809..481abd48ab 100644
--- a/osu.Game/Overlays/Login/LoginPanel.cs
+++ b/osu.Game/Overlays/Login/LoginPanel.cs
@@ -183,7 +183,8 @@ namespace osu.Game.Overlays.Login
break;
}
- if (form != null) GetContainingInputManager()?.ChangeFocus(form);
+ if (form != null)
+ ScheduleAfterChildren(() => GetContainingInputManager()?.ChangeFocus(form));
});
public override bool AcceptsFocus => true;
diff --git a/osu.Game/Overlays/LoginOverlay.cs b/osu.Game/Overlays/LoginOverlay.cs
index f3562aa6d9..9b2d7ca1ee 100644
--- a/osu.Game/Overlays/LoginOverlay.cs
+++ b/osu.Game/Overlays/LoginOverlay.cs
@@ -78,7 +78,7 @@ namespace osu.Game.Overlays
panel.Bounding = true;
this.FadeIn(transition_time, Easing.OutQuint);
- GetContainingInputManager().ChangeFocus(panel);
+ ScheduleAfterChildren(() => GetContainingInputManager().ChangeFocus(panel));
}
protected override void PopOut()
diff --git a/osu.Game/Overlays/Volume/MuteButton.cs b/osu.Game/Overlays/Volume/MuteButton.cs
index bcc9394aba..e9d3b31207 100644
--- a/osu.Game/Overlays/Volume/MuteButton.cs
+++ b/osu.Game/Overlays/Volume/MuteButton.cs
@@ -79,13 +79,13 @@ namespace osu.Game.Overlays.Volume
protected override bool OnHover(HoverEvent e)
{
- Content.TransformTo, SRGBColour>("BorderColour", hoveredColour, 500, Easing.OutQuint);
+ Content.TransformTo, ColourInfo>("BorderColour", hoveredColour, 500, Easing.OutQuint);
return false;
}
protected override void OnHoverLost(HoverLostEvent e)
{
- Content.TransformTo, SRGBColour>("BorderColour", unhoveredColour, 500, Easing.OutQuint);
+ Content.TransformTo, ColourInfo>("BorderColour", unhoveredColour, 500, Easing.OutQuint);
}
}
}
diff --git a/osu.Game/Screens/Edit/CreateNewDifficultyDialog.cs b/osu.Game/Screens/Edit/CreateNewDifficultyDialog.cs
new file mode 100644
index 0000000000..aa6ca280ee
--- /dev/null
+++ b/osu.Game/Screens/Edit/CreateNewDifficultyDialog.cs
@@ -0,0 +1,45 @@
+// 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.Sprites;
+using osu.Game.Overlays.Dialog;
+
+namespace osu.Game.Screens.Edit
+{
+ public class CreateNewDifficultyDialog : PopupDialog
+ {
+ ///
+ /// Delegate used to create new difficulties.
+ /// A value of in the createCopy parameter
+ /// indicates that the new difficulty should be an exact copy of an existing one;
+ /// otherwise, the new difficulty should have its hitobjects and beatmap-level settings cleared.
+ ///
+ public delegate void CreateNewDifficulty(bool createCopy);
+
+ public CreateNewDifficultyDialog(CreateNewDifficulty createNewDifficulty)
+ {
+ HeaderText = "Would you like to create a blank difficulty?";
+
+ Icon = FontAwesome.Regular.Clone;
+
+ Buttons = new PopupDialogButton[]
+ {
+ new PopupDialogOkButton
+ {
+ Text = "Yeah, let's start from scratch!",
+ Action = () => createNewDifficulty.Invoke(false)
+ },
+ new PopupDialogCancelButton
+ {
+ Text = "No, create an exact copy of this difficulty",
+ Action = () => createNewDifficulty.Invoke(true)
+ },
+ new PopupDialogCancelButton
+ {
+ Text = "I changed my mind, I want to keep editing this difficulty",
+ Action = () => { }
+ }
+ };
+ }
+ }
+}
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index 2aec63fa65..c2775ae101 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -358,14 +358,14 @@ namespace osu.Game.Screens.Edit
///
/// Creates an instance representing the current state of the editor.
///
- ///
- /// The next beatmap to be shown, in the case of difficulty switch.
+ ///
+ /// The ruleset of the next beatmap to be shown, in the case of difficulty switch.
/// indicates that the beatmap will not be changing.
///
- public EditorState GetState([CanBeNull] BeatmapInfo nextBeatmap = null) => new EditorState
+ public EditorState GetState([CanBeNull] RulesetInfo nextRuleset = null) => new EditorState
{
Time = clock.CurrentTimeAccurate,
- ClipboardContent = nextBeatmap == null || editorBeatmap.BeatmapInfo.Ruleset.ShortName == nextBeatmap.Ruleset.ShortName ? Clipboard.Content.Value : string.Empty
+ ClipboardContent = nextRuleset == null || editorBeatmap.BeatmapInfo.Ruleset.ShortName == nextRuleset.ShortName ? Clipboard.Content.Value : string.Empty
};
///
@@ -841,7 +841,18 @@ namespace osu.Game.Screens.Edit
}
protected void CreateNewDifficulty(RulesetInfo rulesetInfo)
- => loader?.ScheduleSwitchToNewDifficulty(editorBeatmap.BeatmapInfo.BeatmapSet, rulesetInfo, GetState());
+ {
+ if (!rulesetInfo.Equals(editorBeatmap.BeatmapInfo.Ruleset))
+ {
+ switchToNewDifficulty(rulesetInfo, false);
+ return;
+ }
+
+ dialogOverlay.Push(new CreateNewDifficultyDialog(createCopy => switchToNewDifficulty(rulesetInfo, createCopy)));
+ }
+
+ private void switchToNewDifficulty(RulesetInfo rulesetInfo, bool createCopy)
+ => loader?.ScheduleSwitchToNewDifficulty(editorBeatmap.BeatmapInfo, rulesetInfo, createCopy, GetState(rulesetInfo));
private EditorMenuItem createDifficultySwitchMenu()
{
@@ -866,7 +877,7 @@ namespace osu.Game.Screens.Edit
return new EditorMenuItem("Change difficulty") { Items = difficultyItems };
}
- protected void SwitchToDifficulty(BeatmapInfo nextBeatmap) => loader?.ScheduleSwitchToExistingDifficulty(nextBeatmap, GetState(nextBeatmap));
+ protected void SwitchToDifficulty(BeatmapInfo nextBeatmap) => loader?.ScheduleSwitchToExistingDifficulty(nextBeatmap, GetState(nextBeatmap.Ruleset));
private void cancelExit()
{
diff --git a/osu.Game/Screens/Edit/EditorLoader.cs b/osu.Game/Screens/Edit/EditorLoader.cs
index de47411fdc..0a2b8437fa 100644
--- a/osu.Game/Screens/Edit/EditorLoader.cs
+++ b/osu.Game/Screens/Edit/EditorLoader.cs
@@ -4,6 +4,7 @@
using System;
using JetBrains.Annotations;
using osu.Framework.Allocation;
+using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Logging;
@@ -80,12 +81,18 @@ namespace osu.Game.Screens.Edit
}
}
- public void ScheduleSwitchToNewDifficulty(BeatmapSetInfo beatmapSetInfo, RulesetInfo rulesetInfo, EditorState editorState)
+ public void ScheduleSwitchToNewDifficulty(BeatmapInfo referenceBeatmapInfo, RulesetInfo rulesetInfo, bool createCopy, EditorState editorState)
=> scheduleDifficultySwitch(() =>
{
try
{
- return beatmapManager.CreateNewBlankDifficulty(beatmapSetInfo, rulesetInfo);
+ // fetch a fresh detached reference from database to avoid polluting model instances attached to cached working beatmaps.
+ var targetBeatmapSet = beatmapManager.QueryBeatmap(b => b.ID == referenceBeatmapInfo.ID).AsNonNull().BeatmapSet.AsNonNull();
+ var referenceWorkingBeatmap = beatmapManager.GetWorkingBeatmap(referenceBeatmapInfo);
+
+ return createCopy
+ ? beatmapManager.CopyExistingDifficulty(targetBeatmapSet, referenceWorkingBeatmap)
+ : beatmapManager.CreateNewDifficulty(targetBeatmapSet, referenceWorkingBeatmap, rulesetInfo);
}
catch (Exception ex)
{
diff --git a/osu.Game/Screens/Edit/Setup/MetadataSection.cs b/osu.Game/Screens/Edit/Setup/MetadataSection.cs
index f0ca3e1bbc..571dfb3f6f 100644
--- a/osu.Game/Screens/Edit/Setup/MetadataSection.cs
+++ b/osu.Game/Screens/Edit/Setup/MetadataSection.cs
@@ -71,7 +71,7 @@ namespace osu.Game.Screens.Edit.Setup
base.LoadComplete();
if (string.IsNullOrEmpty(ArtistTextBox.Current.Value))
- GetContainingInputManager().ChangeFocus(ArtistTextBox);
+ ScheduleAfterChildren(() => GetContainingInputManager().ChangeFocus(ArtistTextBox));
ArtistTextBox.Current.BindValueChanged(artist => transferIfRomanised(artist.NewValue, RomanisedArtistTextBox));
TitleTextBox.Current.BindValueChanged(title => transferIfRomanised(title.NewValue, RomanisedTitleTextBox));
diff --git a/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs b/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
index 3fd56ece58..27743e709f 100644
--- a/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
+++ b/osu.Game/Screens/OnlinePlay/Lounge/DrawableLoungeRoom.cs
@@ -246,7 +246,7 @@ namespace osu.Game.Screens.OnlinePlay.Lounge
{
base.LoadComplete();
- Schedule(() => GetContainingInputManager().ChangeFocus(passwordTextBox));
+ ScheduleAfterChildren(() => GetContainingInputManager().ChangeFocus(passwordTextBox));
passwordTextBox.OnCommit += (_, __) => performJoin();
}
diff --git a/osu.Game/Tests/Visual/EditorTestScene.cs b/osu.Game/Tests/Visual/EditorTestScene.cs
index 331bf04644..24015590e2 100644
--- a/osu.Game/Tests/Visual/EditorTestScene.cs
+++ b/osu.Game/Tests/Visual/EditorTestScene.cs
@@ -136,7 +136,13 @@ namespace osu.Game.Tests.Visual
return new TestWorkingBeatmapCache(this, audioManager, resources, storage, defaultBeatmap, host);
}
- public override WorkingBeatmap CreateNewBlankDifficulty(BeatmapSetInfo beatmapSetInfo, RulesetInfo rulesetInfo)
+ public override WorkingBeatmap CreateNewDifficulty(BeatmapSetInfo targetBeatmapSet, WorkingBeatmap referenceWorkingBeatmap, RulesetInfo rulesetInfo)
+ {
+ // don't actually care about properly creating a difficulty for this context.
+ return TestBeatmap;
+ }
+
+ public override WorkingBeatmap CopyExistingDifficulty(BeatmapSetInfo targetBeatmapSet, WorkingBeatmap referenceWorkingBeatmap)
{
// don't actually care about properly creating a difficulty for this context.
return TestBeatmap;
diff --git a/osu.Game/Tests/Visual/Multiplayer/IMultiplayerTestSceneDependencies.cs b/osu.Game/Tests/Visual/Multiplayer/IMultiplayerTestSceneDependencies.cs
index f166154103..62d1c9ceca 100644
--- a/osu.Game/Tests/Visual/Multiplayer/IMultiplayerTestSceneDependencies.cs
+++ b/osu.Game/Tests/Visual/Multiplayer/IMultiplayerTestSceneDependencies.cs
@@ -1,7 +1,6 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-using osu.Game.Online.Multiplayer;
using osu.Game.Screens.OnlinePlay;
using osu.Game.Tests.Visual.OnlinePlay;
using osu.Game.Tests.Visual.Spectator;
@@ -14,9 +13,9 @@ namespace osu.Game.Tests.Visual.Multiplayer
public interface IMultiplayerTestSceneDependencies : IOnlinePlayTestSceneDependencies
{
///
- /// The cached .
+ /// The cached .
///
- TestMultiplayerClient Client { get; }
+ TestMultiplayerClient MultiplayerClient { get; }
///
/// The cached .
diff --git a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs
index 2fecf0a4cc..6c40546325 100644
--- a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs
+++ b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestScene.cs
@@ -17,13 +17,13 @@ namespace osu.Game.Tests.Visual.Multiplayer
public const int PLAYER_1_ID = 55;
public const int PLAYER_2_ID = 56;
- public TestMultiplayerClient Client => OnlinePlayDependencies.Client;
+ public TestMultiplayerClient MultiplayerClient => OnlinePlayDependencies.MultiplayerClient;
public new TestMultiplayerRoomManager RoomManager => OnlinePlayDependencies.RoomManager;
public TestSpectatorClient SpectatorClient => OnlinePlayDependencies?.SpectatorClient;
protected new MultiplayerTestSceneDependencies OnlinePlayDependencies => (MultiplayerTestSceneDependencies)base.OnlinePlayDependencies;
- public bool RoomJoined => Client.RoomJoined;
+ public bool RoomJoined => MultiplayerClient.RoomJoined;
private readonly bool joinRoom;
diff --git a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestSceneDependencies.cs b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestSceneDependencies.cs
index d9fe77ae44..6b4e01b673 100644
--- a/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestSceneDependencies.cs
+++ b/osu.Game/Tests/Visual/Multiplayer/MultiplayerTestSceneDependencies.cs
@@ -14,16 +14,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
///
public class MultiplayerTestSceneDependencies : OnlinePlayTestSceneDependencies, IMultiplayerTestSceneDependencies
{
- public TestMultiplayerClient Client { get; }
+ public TestMultiplayerClient MultiplayerClient { get; }
public TestSpectatorClient SpectatorClient { get; }
public new TestMultiplayerRoomManager RoomManager => (TestMultiplayerRoomManager)base.RoomManager;
public MultiplayerTestSceneDependencies()
{
- Client = new TestMultiplayerClient(RoomManager);
+ MultiplayerClient = new TestMultiplayerClient(RoomManager);
SpectatorClient = CreateSpectatorClient();
- CacheAs(Client);
+ CacheAs(MultiplayerClient);
CacheAs(SpectatorClient);
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index a9c0226951..7b50c804ff 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -18,27 +18,27 @@
-
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 5e0b264834..03a105673c 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -60,10 +60,10 @@
-
+
-
+
$(NoWarn);NU1605
@@ -79,15 +79,15 @@
-
-
-
+
+
+
-
-
+
+
-
-
+
+