mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 10:52:53 +08:00
Merge branch 'master' into osr-scoreinfo-data
This commit is contained in:
commit
061f7d4857
@ -51,11 +51,14 @@
|
|||||||
<Reference Include="Java.Interop" />
|
<Reference Include="Java.Interop" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2022.1127.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2022.1207.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework.Android" Version="2022.1204.0" />
|
<PackageReference Include="ppy.osu.Framework.Android" Version="2022.1208.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Label="Transitive Dependencies">
|
<ItemGroup Label="Transitive Dependencies">
|
||||||
<!-- Realm needs to be directly referenced in all Xamarin projects, as it will not pull in its transitive dependencies otherwise. -->
|
<!-- Realm needs to be directly referenced in all Xamarin projects, as it will not pull in its transitive dependencies otherwise. -->
|
||||||
<PackageReference Include="Realm" Version="10.18.0" />
|
<PackageReference Include="Realm" Version="10.18.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<LinkDescription Include="$(MSBuildThisFileDirectory)\osu.Android\Linker.xml"/>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
7
osu.Android/Linker.xml
Normal file
7
osu.Android/Linker.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<linker>
|
||||||
|
<assembly fullname="mscorlib">
|
||||||
|
<!-- see https://github.com/ppy/osu/issues/21516 -->
|
||||||
|
<type fullname="System.Globalization.*Calendar"/>
|
||||||
|
</assembly>
|
||||||
|
</linker>
|
@ -0,0 +1,91 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
|
using osu.Game.Rulesets.Osu.UI;
|
||||||
|
using osu.Game.Rulesets.Osu.Utils;
|
||||||
|
using osuTK;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class OsuHitObjectGenerationUtilsTest
|
||||||
|
{
|
||||||
|
private static Slider createTestSlider()
|
||||||
|
{
|
||||||
|
var slider = new Slider
|
||||||
|
{
|
||||||
|
Position = new Vector2(128, 128),
|
||||||
|
Path = new SliderPath
|
||||||
|
{
|
||||||
|
ControlPoints =
|
||||||
|
{
|
||||||
|
new PathControlPoint(new Vector2(), PathType.Linear),
|
||||||
|
new PathControlPoint(new Vector2(-64, -128), PathType.Linear), // absolute position: (64, 0)
|
||||||
|
new PathControlPoint(new Vector2(-128, 0), PathType.Linear) // absolute position: (0, 128)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
RepeatCount = 1
|
||||||
|
};
|
||||||
|
slider.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty());
|
||||||
|
return slider;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestReflectSliderHorizontallyAlongPlayfield()
|
||||||
|
{
|
||||||
|
var slider = createTestSlider();
|
||||||
|
|
||||||
|
OsuHitObjectGenerationUtils.ReflectHorizontallyAlongPlayfield(slider);
|
||||||
|
|
||||||
|
Assert.That(slider.Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 128, 128)));
|
||||||
|
Assert.That(slider.NestedHitObjects.OfType<SliderRepeat>().Single().Position, Is.EqualTo(new Vector2(OsuPlayfield.BASE_SIZE.X - 0, 128)));
|
||||||
|
Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[]
|
||||||
|
{
|
||||||
|
new Vector2(),
|
||||||
|
new Vector2(64, -128),
|
||||||
|
new Vector2(128, 0)
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestReflectSliderVerticallyAlongPlayfield()
|
||||||
|
{
|
||||||
|
var slider = createTestSlider();
|
||||||
|
|
||||||
|
OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(slider);
|
||||||
|
|
||||||
|
Assert.That(slider.Position, Is.EqualTo(new Vector2(128, OsuPlayfield.BASE_SIZE.Y - 128)));
|
||||||
|
Assert.That(slider.NestedHitObjects.OfType<SliderRepeat>().Single().Position, Is.EqualTo(new Vector2(0, OsuPlayfield.BASE_SIZE.Y - 128)));
|
||||||
|
Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[]
|
||||||
|
{
|
||||||
|
new Vector2(),
|
||||||
|
new Vector2(-64, 128),
|
||||||
|
new Vector2(-128, 0)
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestFlipSliderInPlaceHorizontally()
|
||||||
|
{
|
||||||
|
var slider = createTestSlider();
|
||||||
|
|
||||||
|
OsuHitObjectGenerationUtils.FlipSliderInPlaceHorizontally(slider);
|
||||||
|
|
||||||
|
Assert.That(slider.Position, Is.EqualTo(new Vector2(128, 128)));
|
||||||
|
Assert.That(slider.NestedHitObjects.OfType<SliderRepeat>().Single().Position, Is.EqualTo(new Vector2(256, 128)));
|
||||||
|
Assert.That(slider.Path.ControlPoints.Select(point => point.Position), Is.EquivalentTo(new[]
|
||||||
|
{
|
||||||
|
new Vector2(),
|
||||||
|
new Vector2(64, -128),
|
||||||
|
new Vector2(128, 0)
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -20,7 +20,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
{
|
{
|
||||||
var osuObject = (OsuHitObject)hitObject;
|
var osuObject = (OsuHitObject)hitObject;
|
||||||
|
|
||||||
OsuHitObjectGenerationUtils.ReflectVertically(osuObject);
|
OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(osuObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,16 +27,16 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
switch (Reflection.Value)
|
switch (Reflection.Value)
|
||||||
{
|
{
|
||||||
case MirrorType.Horizontal:
|
case MirrorType.Horizontal:
|
||||||
OsuHitObjectGenerationUtils.ReflectHorizontally(osuObject);
|
OsuHitObjectGenerationUtils.ReflectHorizontallyAlongPlayfield(osuObject);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MirrorType.Vertical:
|
case MirrorType.Vertical:
|
||||||
OsuHitObjectGenerationUtils.ReflectVertically(osuObject);
|
OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(osuObject);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MirrorType.Both:
|
case MirrorType.Both:
|
||||||
OsuHitObjectGenerationUtils.ReflectHorizontally(osuObject);
|
OsuHitObjectGenerationUtils.ReflectHorizontallyAlongPlayfield(osuObject);
|
||||||
OsuHitObjectGenerationUtils.ReflectVertically(osuObject);
|
OsuHitObjectGenerationUtils.ReflectVerticallyAlongPlayfield(osuObject);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,11 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
flowDirection = !flowDirection;
|
flowDirection = !flowDirection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (positionInfos[i].HitObject is Slider slider && random.NextDouble() < 0.5)
|
||||||
|
{
|
||||||
|
OsuHitObjectGenerationUtils.FlipSliderInPlaceHorizontally(slider);
|
||||||
|
}
|
||||||
|
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
positionInfos[i].DistanceFromPrevious = (float)(random.NextDouble() * OsuPlayfield.BASE_SIZE.Y / 2);
|
positionInfos[i].DistanceFromPrevious = (float)(random.NextDouble() * OsuPlayfield.BASE_SIZE.Y / 2);
|
||||||
|
@ -112,44 +112,46 @@ namespace osu.Game.Rulesets.Osu.Utils
|
|||||||
/// Reflects the position of the <see cref="OsuHitObject"/> in the playfield horizontally.
|
/// Reflects the position of the <see cref="OsuHitObject"/> in the playfield horizontally.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="osuObject">The object to reflect.</param>
|
/// <param name="osuObject">The object to reflect.</param>
|
||||||
public static void ReflectHorizontally(OsuHitObject osuObject)
|
public static void ReflectHorizontallyAlongPlayfield(OsuHitObject osuObject)
|
||||||
{
|
{
|
||||||
osuObject.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - osuObject.X, osuObject.Position.Y);
|
osuObject.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - osuObject.X, osuObject.Position.Y);
|
||||||
|
|
||||||
if (!(osuObject is Slider slider))
|
if (osuObject is not Slider slider)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// No need to update the head and tail circles, since slider handles that when the new slider path is set
|
void reflectNestedObject(OsuHitObject nested) => nested.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - nested.Position.X, nested.Position.Y);
|
||||||
slider.NestedHitObjects.OfType<SliderTick>().ForEach(h => h.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - h.Position.X, h.Position.Y));
|
static void reflectControlPoint(PathControlPoint point) => point.Position = new Vector2(-point.Position.X, point.Position.Y);
|
||||||
slider.NestedHitObjects.OfType<SliderRepeat>().ForEach(h => h.Position = new Vector2(OsuPlayfield.BASE_SIZE.X - h.Position.X, h.Position.Y));
|
|
||||||
|
|
||||||
var controlPoints = slider.Path.ControlPoints.Select(p => new PathControlPoint(p.Position, p.Type)).ToArray();
|
modifySlider(slider, reflectNestedObject, reflectControlPoint);
|
||||||
foreach (var point in controlPoints)
|
|
||||||
point.Position = new Vector2(-point.Position.X, point.Position.Y);
|
|
||||||
|
|
||||||
slider.Path = new SliderPath(controlPoints, slider.Path.ExpectedDistance.Value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reflects the position of the <see cref="OsuHitObject"/> in the playfield vertically.
|
/// Reflects the position of the <see cref="OsuHitObject"/> in the playfield vertically.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="osuObject">The object to reflect.</param>
|
/// <param name="osuObject">The object to reflect.</param>
|
||||||
public static void ReflectVertically(OsuHitObject osuObject)
|
public static void ReflectVerticallyAlongPlayfield(OsuHitObject osuObject)
|
||||||
{
|
{
|
||||||
osuObject.Position = new Vector2(osuObject.Position.X, OsuPlayfield.BASE_SIZE.Y - osuObject.Y);
|
osuObject.Position = new Vector2(osuObject.Position.X, OsuPlayfield.BASE_SIZE.Y - osuObject.Y);
|
||||||
|
|
||||||
if (!(osuObject is Slider slider))
|
if (osuObject is not Slider slider)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// No need to update the head and tail circles, since slider handles that when the new slider path is set
|
void reflectNestedObject(OsuHitObject nested) => nested.Position = new Vector2(nested.Position.X, OsuPlayfield.BASE_SIZE.Y - nested.Position.Y);
|
||||||
slider.NestedHitObjects.OfType<SliderTick>().ForEach(h => h.Position = new Vector2(h.Position.X, OsuPlayfield.BASE_SIZE.Y - h.Position.Y));
|
static void reflectControlPoint(PathControlPoint point) => point.Position = new Vector2(point.Position.X, -point.Position.Y);
|
||||||
slider.NestedHitObjects.OfType<SliderRepeat>().ForEach(h => h.Position = new Vector2(h.Position.X, OsuPlayfield.BASE_SIZE.Y - h.Position.Y));
|
|
||||||
|
|
||||||
var controlPoints = slider.Path.ControlPoints.Select(p => new PathControlPoint(p.Position, p.Type)).ToArray();
|
modifySlider(slider, reflectNestedObject, reflectControlPoint);
|
||||||
foreach (var point in controlPoints)
|
}
|
||||||
point.Position = new Vector2(point.Position.X, -point.Position.Y);
|
|
||||||
|
|
||||||
slider.Path = new SliderPath(controlPoints, slider.Path.ExpectedDistance.Value);
|
/// <summary>
|
||||||
|
/// Flips the position of the <see cref="Slider"/> around its start position horizontally.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="slider">The slider to be flipped.</param>
|
||||||
|
public static void FlipSliderInPlaceHorizontally(Slider slider)
|
||||||
|
{
|
||||||
|
void flipNestedObject(OsuHitObject nested) => nested.Position = new Vector2(slider.X - (nested.X - slider.X), nested.Y);
|
||||||
|
static void flipControlPoint(PathControlPoint point) => point.Position = new Vector2(-point.Position.X, point.Position.Y);
|
||||||
|
|
||||||
|
modifySlider(slider, flipNestedObject, flipControlPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -160,14 +162,20 @@ namespace osu.Game.Rulesets.Osu.Utils
|
|||||||
public static void RotateSlider(Slider slider, float rotation)
|
public static void RotateSlider(Slider slider, float rotation)
|
||||||
{
|
{
|
||||||
void rotateNestedObject(OsuHitObject nested) => nested.Position = rotateVector(nested.Position - slider.Position, rotation) + slider.Position;
|
void rotateNestedObject(OsuHitObject nested) => nested.Position = rotateVector(nested.Position - slider.Position, rotation) + slider.Position;
|
||||||
|
void rotateControlPoint(PathControlPoint point) => point.Position = rotateVector(point.Position, rotation);
|
||||||
|
|
||||||
|
modifySlider(slider, rotateNestedObject, rotateControlPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void modifySlider(Slider slider, Action<OsuHitObject> modifyNestedObject, Action<PathControlPoint> modifyControlPoint)
|
||||||
|
{
|
||||||
// No need to update the head and tail circles, since slider handles that when the new slider path is set
|
// No need to update the head and tail circles, since slider handles that when the new slider path is set
|
||||||
slider.NestedHitObjects.OfType<SliderTick>().ForEach(rotateNestedObject);
|
slider.NestedHitObjects.OfType<SliderTick>().ForEach(modifyNestedObject);
|
||||||
slider.NestedHitObjects.OfType<SliderRepeat>().ForEach(rotateNestedObject);
|
slider.NestedHitObjects.OfType<SliderRepeat>().ForEach(modifyNestedObject);
|
||||||
|
|
||||||
var controlPoints = slider.Path.ControlPoints.Select(p => new PathControlPoint(p.Position, p.Type)).ToArray();
|
var controlPoints = slider.Path.ControlPoints.Select(p => new PathControlPoint(p.Position, p.Type)).ToArray();
|
||||||
foreach (var point in controlPoints)
|
foreach (var point in controlPoints)
|
||||||
point.Position = rotateVector(point.Position, rotation);
|
modifyControlPoint(point);
|
||||||
|
|
||||||
slider.Path = new SliderPath(controlPoints, slider.Path.ExpectedDistance.Value);
|
slider.Path = new SliderPath(controlPoints, slider.Path.ExpectedDistance.Value);
|
||||||
}
|
}
|
||||||
|
@ -126,6 +126,21 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
checkBindableAtValue("Circle Size", 9);
|
checkBindableAtValue("Circle Size", 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestExtendedLimitsRetainedAfterBoundCopyCreation()
|
||||||
|
{
|
||||||
|
setExtendedLimits(true);
|
||||||
|
setSliderValue("Circle Size", 11);
|
||||||
|
|
||||||
|
checkSliderAtValue("Circle Size", 11);
|
||||||
|
checkBindableAtValue("Circle Size", 11);
|
||||||
|
|
||||||
|
AddStep("create bound copy", () => _ = modDifficultyAdjust.CircleSize.GetBoundCopy());
|
||||||
|
|
||||||
|
checkSliderAtValue("Circle Size", 11);
|
||||||
|
checkBindableAtValue("Circle Size", 11);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestResetToDefault()
|
public void TestResetToDefault()
|
||||||
{
|
{
|
||||||
|
@ -42,8 +42,8 @@ namespace osu.Game.Database
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private RealmAccess realmAccess { get; set; } = null!;
|
private RealmAccess realmAccess { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved(canBeNull: true)] // canBeNull required while we remain on mono for mobile platforms.
|
[Resolved]
|
||||||
private DesktopGameHost? desktopGameHost { get; set; }
|
private GameHost gameHost { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private INotificationOverlay? notifications { get; set; }
|
private INotificationOverlay? notifications { get; set; }
|
||||||
@ -52,7 +52,7 @@ namespace osu.Game.Database
|
|||||||
|
|
||||||
public bool SupportsImportFromStable => RuntimeInfo.IsDesktop;
|
public bool SupportsImportFromStable => RuntimeInfo.IsDesktop;
|
||||||
|
|
||||||
public void UpdateStorage(string stablePath) => cachedStorage = new StableStorage(stablePath, desktopGameHost);
|
public void UpdateStorage(string stablePath) => cachedStorage = new StableStorage(stablePath, gameHost as DesktopGameHost);
|
||||||
|
|
||||||
public virtual async Task<int> GetImportCount(StableContent content, CancellationToken cancellationToken)
|
public virtual async Task<int> GetImportCount(StableContent content, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
@ -240,7 +240,9 @@ namespace osu.Game.Graphics.Containers
|
|||||||
headerBackgroundContainer.Height = expandableHeaderSize + fixedHeaderSize;
|
headerBackgroundContainer.Height = expandableHeaderSize + fixedHeaderSize;
|
||||||
headerBackgroundContainer.Y = ExpandableHeader?.Y ?? 0;
|
headerBackgroundContainer.Y = ExpandableHeader?.Y ?? 0;
|
||||||
|
|
||||||
float smallestSectionHeight = Children.Count > 0 ? Children.Min(d => d.Height) : 0;
|
var flowChildren = scrollContentContainer.FlowingChildren.OfType<T>();
|
||||||
|
|
||||||
|
float smallestSectionHeight = flowChildren.Any() ? flowChildren.Min(d => d.Height) : 0;
|
||||||
|
|
||||||
// scroll offset is our fixed header height if we have it plus 10% of content height
|
// scroll offset is our fixed header height if we have it plus 10% of content height
|
||||||
// plus 5% to fix floating point errors and to not have a section instantly unselect when scrolling upwards
|
// plus 5% to fix floating point errors and to not have a section instantly unselect when scrolling upwards
|
||||||
@ -249,7 +251,7 @@ namespace osu.Game.Graphics.Containers
|
|||||||
|
|
||||||
float scrollCentre = fixedHeaderSize + scrollContainer.DisplayableContent * scroll_y_centre + selectionLenienceAboveSection;
|
float scrollCentre = fixedHeaderSize + scrollContainer.DisplayableContent * scroll_y_centre + selectionLenienceAboveSection;
|
||||||
|
|
||||||
var presentChildren = Children.Where(c => c.IsPresent);
|
var presentChildren = flowChildren.Where(c => c.IsPresent);
|
||||||
|
|
||||||
if (lastClickedSection != null)
|
if (lastClickedSection != null)
|
||||||
SelectedSection.Value = lastClickedSection;
|
SelectedSection.Value = lastClickedSection;
|
||||||
|
@ -32,6 +32,7 @@ namespace osu.Game.Online.API.Requests
|
|||||||
Loved,
|
Loved,
|
||||||
Pending,
|
Pending,
|
||||||
Guest,
|
Guest,
|
||||||
Graveyard
|
Graveyard,
|
||||||
|
Nominated,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,6 +164,9 @@ namespace osu.Game.Online.API.Requests.Responses
|
|||||||
[JsonProperty(@"guest_beatmapset_count")]
|
[JsonProperty(@"guest_beatmapset_count")]
|
||||||
public int GuestBeatmapsetCount;
|
public int GuestBeatmapsetCount;
|
||||||
|
|
||||||
|
[JsonProperty(@"nominated_beatmapset_count")]
|
||||||
|
public int NominatedBeatmapsetCount;
|
||||||
|
|
||||||
[JsonProperty(@"scores_best_count")]
|
[JsonProperty(@"scores_best_count")]
|
||||||
public int ScoresBestCount;
|
public int ScoresBestCount;
|
||||||
|
|
||||||
|
@ -529,6 +529,10 @@ namespace osu.Game.Online.Chat
|
|||||||
{
|
{
|
||||||
Logger.Log($"Joined public channel {channel}");
|
Logger.Log($"Joined public channel {channel}");
|
||||||
joinChannel(channel, fetchInitialMessages);
|
joinChannel(channel, fetchInitialMessages);
|
||||||
|
|
||||||
|
// Required after joining public channels to mark the user as online in them.
|
||||||
|
// Todo: Temporary workaround for https://github.com/ppy/osu-web/issues/9602
|
||||||
|
SendAck();
|
||||||
};
|
};
|
||||||
req.Failure += e =>
|
req.Failure += e =>
|
||||||
{
|
{
|
||||||
|
@ -150,7 +150,7 @@ namespace osu.Game.Online
|
|||||||
await disconnect(true);
|
await disconnect(true);
|
||||||
|
|
||||||
if (ex != null)
|
if (ex != null)
|
||||||
await handleErrorAndDelay(ex, cancellationToken).ConfigureAwait(false);
|
await handleErrorAndDelay(ex, CancellationToken.None).ConfigureAwait(false);
|
||||||
else
|
else
|
||||||
Logger.Log($"{ClientName} disconnected", LoggingTarget.Network);
|
Logger.Log($"{ClientName} disconnected", LoggingTarget.Network);
|
||||||
|
|
||||||
|
@ -58,6 +58,9 @@ namespace osu.Game.Overlays.Profile.Sections.Beatmaps
|
|||||||
case BeatmapSetType.Guest:
|
case BeatmapSetType.Guest:
|
||||||
return user.GuestBeatmapsetCount;
|
return user.GuestBeatmapsetCount;
|
||||||
|
|
||||||
|
case BeatmapSetType.Nominated:
|
||||||
|
return user.NominatedBeatmapsetCount;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,8 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
new PaginatedBeatmapContainer(BeatmapSetType.Loved, User, UsersStrings.ShowExtraBeatmapsLovedTitle),
|
new PaginatedBeatmapContainer(BeatmapSetType.Loved, User, UsersStrings.ShowExtraBeatmapsLovedTitle),
|
||||||
new PaginatedBeatmapContainer(BeatmapSetType.Guest, User, UsersStrings.ShowExtraBeatmapsGuestTitle),
|
new PaginatedBeatmapContainer(BeatmapSetType.Guest, User, UsersStrings.ShowExtraBeatmapsGuestTitle),
|
||||||
new PaginatedBeatmapContainer(BeatmapSetType.Pending, User, UsersStrings.ShowExtraBeatmapsPendingTitle),
|
new PaginatedBeatmapContainer(BeatmapSetType.Pending, User, UsersStrings.ShowExtraBeatmapsPendingTitle),
|
||||||
new PaginatedBeatmapContainer(BeatmapSetType.Graveyard, User, UsersStrings.ShowExtraBeatmapsGraveyardTitle)
|
new PaginatedBeatmapContainer(BeatmapSetType.Graveyard, User, UsersStrings.ShowExtraBeatmapsGraveyardTitle),
|
||||||
|
new PaginatedBeatmapContainer(BeatmapSetType.Nominated, User, UsersStrings.ShowExtraBeatmapsNominatedTitle),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,9 @@ namespace osu.Game.Overlays
|
|||||||
|
|
||||||
protected override UserTrackingScrollContainer CreateScrollContainer() => new OverlayScrollContainer();
|
protected override UserTrackingScrollContainer CreateScrollContainer() => new OverlayScrollContainer();
|
||||||
|
|
||||||
protected override FlowContainer<ProfileSection> CreateScrollContentContainer() => new FillFlowContainer<ProfileSection>
|
// Reverse child ID is required so expanding beatmap panels can appear above sections below them.
|
||||||
|
// This can also be done by setting Depth when adding new sections above if using ReverseChildID turns out to have any issues.
|
||||||
|
protected override FlowContainer<ProfileSection> CreateScrollContentContainer() => new ReverseChildIDFillFlowContainer<ProfileSection>
|
||||||
{
|
{
|
||||||
Direction = FillDirection.Vertical,
|
Direction = FillDirection.Vertical,
|
||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
|
@ -118,11 +118,18 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
if (!(them is DifficultyBindable otherDifficultyBindable))
|
if (!(them is DifficultyBindable otherDifficultyBindable))
|
||||||
throw new InvalidOperationException($"Cannot bind to a non-{nameof(DifficultyBindable)}.");
|
throw new InvalidOperationException($"Cannot bind to a non-{nameof(DifficultyBindable)}.");
|
||||||
|
|
||||||
|
// ensure that MaxValue and ExtendedMaxValue are copied across first before continuing.
|
||||||
|
// not doing so may cause the value of CurrentNumber to be truncated to 10.
|
||||||
|
otherDifficultyBindable.CopyTo(this);
|
||||||
|
|
||||||
|
// set up mutual binding for ExtendedLimits to correctly set the upper bound of CurrentNumber.
|
||||||
ExtendedLimits.BindTarget = otherDifficultyBindable.ExtendedLimits;
|
ExtendedLimits.BindTarget = otherDifficultyBindable.ExtendedLimits;
|
||||||
|
|
||||||
// the actual values need to be copied after the max value constraints.
|
// set up mutual binding for CurrentNumber. this must happen after all of the above.
|
||||||
CurrentNumber.BindTarget = otherDifficultyBindable.CurrentNumber;
|
CurrentNumber.BindTarget = otherDifficultyBindable.CurrentNumber;
|
||||||
|
|
||||||
|
// finish up the binding by setting up weak references via the base call.
|
||||||
|
// unfortunately this will call `.CopyTo()` again, but fixing that is problematic and messy.
|
||||||
base.BindTo(them);
|
base.BindTo(them);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ namespace osu.Game.Screens.Menu
|
|||||||
"New features are coming online every update. Make sure to stay up-to-date!",
|
"New features are coming online every update. Make sure to stay up-to-date!",
|
||||||
"If you find the UI too large or small, try adjusting UI scale in settings!",
|
"If you find the UI too large or small, try adjusting UI scale in settings!",
|
||||||
"Try adjusting the \"Screen Scaling\" mode to change your gameplay or UI area, even in fullscreen!",
|
"Try adjusting the \"Screen Scaling\" mode to change your gameplay or UI area, even in fullscreen!",
|
||||||
"What used to be \"osu!direct\" is available to all users just like on the website. You can access it anywhere using Ctrl-D!",
|
"What used to be \"osu!direct\" is available to all users just like on the website. You can access it anywhere using Ctrl-B!",
|
||||||
"Seeking in replays is available by dragging on the difficulty bar at the bottom of the screen!",
|
"Seeking in replays is available by dragging on the difficulty bar at the bottom of the screen!",
|
||||||
"Multithreading support means that even with low \"FPS\" your input and judgements will be accurate!",
|
"Multithreading support means that even with low \"FPS\" your input and judgements will be accurate!",
|
||||||
"Try scrolling down in the mod select panel to find a bunch of new fun mods!",
|
"Try scrolling down in the mod select panel to find a bunch of new fun mods!",
|
||||||
|
@ -47,6 +47,8 @@ namespace osu.Game.Screens.Utility
|
|||||||
Height = 100;
|
Height = 100;
|
||||||
SpriteText.Colour = overlayColourProvider.Background6;
|
SpriteText.Colour = overlayColourProvider.Background6;
|
||||||
SpriteText.Font = OsuFont.TorusAlternate.With(size: 34);
|
SpriteText.Font = OsuFont.TorusAlternate.With(size: 34);
|
||||||
|
|
||||||
|
Triangles?.Hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,14 +29,14 @@
|
|||||||
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="6.0.10" />
|
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="6.0.10" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
|
||||||
<PackageReference Include="Microsoft.Toolkit.HighPerformance" Version="7.1.2" />
|
<PackageReference Include="Microsoft.Toolkit.HighPerformance" Version="7.1.2" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||||
<PackageReference Include="ppy.LocalisationAnalyser" Version="2022.809.0">
|
<PackageReference Include="ppy.LocalisationAnalyser" Version="2022.809.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Realm" Version="10.18.0" />
|
<PackageReference Include="Realm" Version="10.18.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2022.1204.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2022.1208.0" />
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2022.1127.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2022.1207.0" />
|
||||||
<PackageReference Include="Sentry" Version="3.23.1" />
|
<PackageReference Include="Sentry" Version="3.23.1" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.32.2" />
|
<PackageReference Include="SharpCompress" Version="0.32.2" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||||
|
@ -61,8 +61,8 @@
|
|||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup Label="Package References">
|
<ItemGroup Label="Package References">
|
||||||
<PackageReference Include="ppy.osu.Game.Resources" Version="2022.1127.0" />
|
<PackageReference Include="ppy.osu.Game.Resources" Version="2022.1207.0" />
|
||||||
<PackageReference Include="ppy.osu.Framework.iOS" Version="2022.1204.0" />
|
<PackageReference Include="ppy.osu.Framework.iOS" Version="2022.1208.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- See https://github.com/dotnet/runtime/issues/35988 (can be removed after Xamarin uses net6.0) -->
|
<!-- See https://github.com/dotnet/runtime/issues/35988 (can be removed after Xamarin uses net6.0) -->
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
@ -82,7 +82,7 @@
|
|||||||
<PackageReference Include="DiffPlex" Version="1.7.1" />
|
<PackageReference Include="DiffPlex" Version="1.7.1" />
|
||||||
<PackageReference Include="Humanizer" Version="2.14.1" />
|
<PackageReference Include="Humanizer" Version="2.14.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
<PackageReference Include="ppy.osu.Framework" Version="2022.1204.0" />
|
<PackageReference Include="ppy.osu.Framework" Version="2022.1208.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.32.2" />
|
<PackageReference Include="SharpCompress" Version="0.32.2" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||||
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
||||||
|
@ -24,4 +24,8 @@
|
|||||||
<assembly fullname="osu.Game.Rulesets.Osu">
|
<assembly fullname="osu.Game.Rulesets.Osu">
|
||||||
<type fullname="*" />
|
<type fullname="*" />
|
||||||
</assembly>
|
</assembly>
|
||||||
|
<assembly fullname="mscorlib">
|
||||||
|
<!-- see https://github.com/ppy/osu/issues/21516 -->
|
||||||
|
<type fullname="System.Globalization.*Calendar"/>
|
||||||
|
</assembly>
|
||||||
</linker>
|
</linker>
|
||||||
|
Loading…
Reference in New Issue
Block a user