diff --git a/osu.Android.props b/osu.Android.props
index aa4d9fa4ee..9d99218f88 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -51,7 +51,7 @@
-
+
diff --git a/osu.Game.Rulesets.Catch/Objects/Banana.cs b/osu.Game.Rulesets.Catch/Objects/Banana.cs
index 7734ebed12..a274f25200 100644
--- a/osu.Game.Rulesets.Catch/Objects/Banana.cs
+++ b/osu.Game.Rulesets.Catch/Objects/Banana.cs
@@ -1,6 +1,8 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+#nullable enable
+
using System;
using System.Collections.Generic;
using osu.Framework.Utils;
@@ -8,6 +10,7 @@ using osu.Game.Audio;
using osu.Game.Rulesets.Catch.Judgements;
using osu.Game.Rulesets.Judgements;
using osu.Game.Rulesets.Objects.Types;
+using osu.Game.Utils;
using osuTK.Graphics;
namespace osu.Game.Rulesets.Catch.Objects
@@ -53,19 +56,22 @@ namespace osu.Game.Rulesets.Catch.Objects
private class BananaHitSampleInfo : HitSampleInfo, IEquatable
{
- private static readonly string[] lookup_names = { "metronomelow", "catch-banana" };
+ private static readonly string[] lookup_names = { "Gameplay/metronomelow", "Gameplay/catch-banana" };
public override IEnumerable LookupNames => lookup_names;
- public BananaHitSampleInfo()
- : base(string.Empty)
+ public BananaHitSampleInfo(int volume = 0)
+ : base(string.Empty, volume: volume)
{
}
- public bool Equals(BananaHitSampleInfo other)
+ public sealed override HitSampleInfo With(Optional newName = default, Optional newBank = default, Optional newSuffix = default, Optional newVolume = default)
+ => new BananaHitSampleInfo(newVolume.GetOr(Volume));
+
+ public bool Equals(BananaHitSampleInfo? other)
=> other != null;
- public override bool Equals(object obj)
+ public override bool Equals(object? obj)
=> obj is BananaHitSampleInfo other && Equals(other);
public override int GetHashCode() => lookup_names.GetHashCode();
diff --git a/osu.Game/Online/Spectator/SpectatorStreamingClient.cs b/osu.Game/Online/Spectator/SpectatorStreamingClient.cs
index 9ba81720d8..08b524087a 100644
--- a/osu.Game/Online/Spectator/SpectatorStreamingClient.cs
+++ b/osu.Game/Online/Spectator/SpectatorStreamingClient.cs
@@ -36,6 +36,8 @@ namespace osu.Game.Online.Spectator
private readonly List watchingUsers = new List();
+ private readonly object userLock = new object();
+
public IBindableList PlayingUsers => playingUsers;
private readonly BindableList playingUsers = new BindableList();
@@ -144,12 +146,19 @@ namespace osu.Game.Online.Spectator
await connection.StartAsync();
Logger.Log("Spectator client connected!", LoggingTarget.Network);
+ // get all the users that were previously being watched
+ int[] users;
+
+ lock (userLock)
+ {
+ users = watchingUsers.ToArray();
+ watchingUsers.Clear();
+ }
+
// success
isConnected = true;
// resubscribe to watched users
- var users = watchingUsers.ToArray();
- watchingUsers.Clear();
foreach (var userId in users)
WatchUser(userId);
@@ -238,21 +247,29 @@ namespace osu.Game.Online.Spectator
public virtual void WatchUser(int userId)
{
- if (watchingUsers.Contains(userId))
- return;
+ lock (userLock)
+ {
+ if (watchingUsers.Contains(userId))
+ return;
- watchingUsers.Add(userId);
+ watchingUsers.Add(userId);
- if (!isConnected) return;
+ if (!isConnected)
+ return;
+ }
connection.SendAsync(nameof(ISpectatorServer.StartWatchingUser), userId);
}
public void StopWatchingUser(int userId)
{
- watchingUsers.Remove(userId);
+ lock (userLock)
+ {
+ watchingUsers.Remove(userId);
- if (!isConnected) return;
+ if (!isConnected)
+ return;
+ }
connection.SendAsync(nameof(ISpectatorServer.EndWatchingUser), userId);
}
diff --git a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
index f0d51a0d37..b54ad9a641 100644
--- a/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
+++ b/osu.Game/Overlays/Settings/Sections/Input/MouseSettings.cs
@@ -18,7 +18,7 @@ namespace osu.Game.Overlays.Settings.Sections.Input
private readonly BindableBool rawInputToggle = new BindableBool();
private Bindable sensitivityBindable = new BindableDouble();
- private Bindable ignoredInputHandler;
+ private Bindable ignoredInputHandlers;
[BackgroundDependencyLoader]
private void load(OsuConfigManager osuConfig, FrameworkConfigManager config)
@@ -75,20 +75,20 @@ namespace osu.Game.Overlays.Settings.Sections.Input
{
// this is temporary until we support per-handler settings.
const string raw_mouse_handler = @"OsuTKRawMouseHandler";
- const string standard_mouse_handler = @"OsuTKMouseHandler";
+ const string standard_mouse_handlers = @"OsuTKMouseHandler MouseHandler";
- ignoredInputHandler.Value = enabled.NewValue ? standard_mouse_handler : raw_mouse_handler;
+ ignoredInputHandlers.Value = enabled.NewValue ? standard_mouse_handlers : raw_mouse_handler;
};
- ignoredInputHandler = config.GetBindable(FrameworkSetting.IgnoredInputHandlers);
- ignoredInputHandler.ValueChanged += handler =>
+ ignoredInputHandlers = config.GetBindable(FrameworkSetting.IgnoredInputHandlers);
+ ignoredInputHandlers.ValueChanged += handler =>
{
bool raw = !handler.NewValue.Contains("Raw");
rawInputToggle.Value = raw;
sensitivityBindable.Disabled = !raw;
};
- ignoredInputHandler.TriggerChange();
+ ignoredInputHandlers.TriggerChange();
}
}
diff --git a/osu.Game/Screens/Edit/Editor.cs b/osu.Game/Screens/Edit/Editor.cs
index 3d5c0ddad4..ca7e5fbf20 100644
--- a/osu.Game/Screens/Edit/Editor.cs
+++ b/osu.Game/Screens/Edit/Editor.cs
@@ -106,6 +106,12 @@ namespace osu.Game.Screens.Edit
[BackgroundDependencyLoader]
private void load(OsuColour colours, GameHost host, OsuConfigManager config)
{
+ if (Beatmap.Value is DummyWorkingBeatmap)
+ {
+ isNewBeatmap = true;
+ Beatmap.Value = beatmapManager.CreateNew(Ruleset.Value, api.LocalUser.Value);
+ }
+
beatDivisor.Value = Beatmap.Value.BeatmapInfo.BeatDivisor;
beatDivisor.BindValueChanged(divisor => Beatmap.Value.BeatmapInfo.BeatDivisor = divisor.NewValue);
@@ -122,12 +128,6 @@ namespace osu.Game.Screens.Edit
// todo: remove caching of this and consume via editorBeatmap?
dependencies.Cache(beatDivisor);
- if (Beatmap.Value is DummyWorkingBeatmap)
- {
- isNewBeatmap = true;
- Beatmap.Value = beatmapManager.CreateNew(Ruleset.Value, api.LocalUser.Value);
- }
-
try
{
playableBeatmap = Beatmap.Value.GetPlayableBeatmap(Beatmap.Value.BeatmapInfo.Ruleset);
diff --git a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs
index e25c6932cf..b3c5d458d6 100644
--- a/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs
+++ b/osu.Game/Screens/Select/Carousel/DrawableCarouselBeatmapSet.cs
@@ -100,8 +100,14 @@ namespace osu.Game.Screens.Select.Carousel
background = new DelayedLoadWrapper(() => new SetPanelBackground(manager.GetWorkingBeatmap(beatmapSet.Beatmaps.FirstOrDefault()))
{
RelativeSizeAxes = Axes.Both,
- }, 300),
- mainFlow = new DelayedLoadWrapper(() => new SetPanelContent((CarouselBeatmapSet)Item), 100),
+ }, 300)
+ {
+ RelativeSizeAxes = Axes.Both
+ },
+ mainFlow = new DelayedLoadWrapper(() => new SetPanelContent((CarouselBeatmapSet)Item), 100)
+ {
+ RelativeSizeAxes = Axes.Both
+ },
};
background.DelayedLoadComplete += fadeContentIn;
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 53b854caa3..4b931726e0 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -27,7 +27,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index b32d3f900a..3a47b77820 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -71,7 +71,7 @@
-
+