Compare commits
7 Commits
82b3015fcc
...
2025.1213.
| Author | SHA1 | Date | |
|---|---|---|---|
| b6f845d99c | |||
| a1d6bda63e | |||
| 547d22a4b5 | |||
| b4c530ac04 | |||
| 5af05d2479 | |||
| 43ab18ffea | |||
| 9f59259a40 |
@@ -257,7 +257,11 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
|
|
||||||
public override string ShortName => SHORT_NAME;
|
public override string ShortName => SHORT_NAME;
|
||||||
|
|
||||||
|
#if !DEBUG
|
||||||
public override string PlayingVerb => "Clicking circles";
|
public override string PlayingVerb => "Clicking circles";
|
||||||
|
#else
|
||||||
|
public override string PlayingVerb => "Debugging circles";
|
||||||
|
#endif
|
||||||
|
|
||||||
public override RulesetSettingsSubsection CreateSettings() => new OsuSettingsSubsection(this);
|
public override RulesetSettingsSubsection CreateSettings() => new OsuSettingsSubsection(this);
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ namespace osu.Game.Audio
|
|||||||
Logger.Log($"A {nameof(PreviewTrack)} was created without a containing {nameof(IPreviewTrackOwner)}. An owner should be added for correct behaviour.");
|
Logger.Log($"A {nameof(PreviewTrack)} was created without a containing {nameof(IPreviewTrackOwner)}. An owner should be added for correct behaviour.");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Track GetTrack() => trackManager.Get($"https://b.ppy.sh/preview/{beatmapSetInfo.OnlineID}.mp3");
|
protected override Track GetTrack() => trackManager.Get($"https://osu.jvnko.boats/uploads/preview/{beatmapSetInfo.OnlineID}.mp3");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ namespace osu.Game.Database
|
|||||||
#if !DEBUG
|
#if !DEBUG
|
||||||
// in the lazer. straight up "migrating it". and by "it", haha, well. let's just say. My realm .
|
// in the lazer. straight up "migrating it". and by "it", haha, well. let's just say. My realm .
|
||||||
string altFilename = filename;
|
string altFilename = filename;
|
||||||
applyFilenameSchemaSuffix(ref altFilename); // it also migrates older versions automagically! (sorry, I only used that word for irony...)
|
applyFilenameSchemaSuffix(ref altFilename);
|
||||||
if (storage.Exists(altFilename) && !storage.Exists(Filename))
|
if (storage.Exists(altFilename) && !storage.Exists(Filename))
|
||||||
{
|
{
|
||||||
using (var previous = storage.GetStream(altFilename))
|
using (var previous = storage.GetStream(altFilename))
|
||||||
@@ -222,6 +222,7 @@ namespace osu.Game.Database
|
|||||||
{
|
{
|
||||||
Logger.Log($@"Migrating production build DB: {altFilename} -> {Filename}");
|
Logger.Log($@"Migrating production build DB: {altFilename} -> {Filename}");
|
||||||
previous.CopyTo(current);
|
previous.CopyTo(current);
|
||||||
|
Logger.Log("Sucessfully migrated local database!", level: LogLevel.Important);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -124,10 +124,10 @@ namespace osu.Game.Graphics.Backgrounds
|
|||||||
api.PerformAsync(request);
|
api.PerformAsync(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SeasonalBackground LoadNextBackground()
|
public Background LoadNextBackground()
|
||||||
{
|
{
|
||||||
if (!shouldShowCustomBackgrounds || !shouldFetchCustomBackgrounds || currentBackgrounds.Value?.Backgrounds?.Any() != true)
|
if (!shouldShowCustomBackgrounds || !shouldFetchCustomBackgrounds || currentBackgrounds.Value?.Backgrounds?.Any() != true)
|
||||||
return (SeasonalBackground)(new Background($@"Menu/menu-background-{RNG.Next(1, 9)}"));
|
return new Background($@"Menu/menu-background-{RNG.Next(1, 9)}");
|
||||||
|
|
||||||
var backgrounds = currentBackgrounds.Value.Backgrounds;
|
var backgrounds = currentBackgrounds.Value.Backgrounds;
|
||||||
currentBackgroundIndex = (currentBackgroundIndex + 1) % backgrounds.Count;
|
currentBackgroundIndex = (currentBackgroundIndex + 1) % backgrounds.Count;
|
||||||
|
|||||||
@@ -438,7 +438,9 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
foreach (var modState in AllAvailableMods)
|
foreach (var modState in AllAvailableMods)
|
||||||
{
|
{
|
||||||
var matchingSelectedMod = SelectedMods.Value.SingleOrDefault(selected => selected.GetType() == modState.Mod.GetType());
|
// BUG: when trying to switch ruleset in a multiplayer room this was previously throwing an InvalidOperationException.
|
||||||
|
// If it still throws, then I guess it's not good
|
||||||
|
var matchingSelectedMod = SelectedMods.Value.FirstOrDefault(selected => selected.GetType() == modState.Mod.GetType());
|
||||||
|
|
||||||
if (matchingSelectedMod != null)
|
if (matchingSelectedMod != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace osu.Game.Overlays.Profile.Sections.Recent
|
|||||||
private readonly string slug;
|
private readonly string slug;
|
||||||
private readonly Sprite sprite;
|
private readonly Sprite sprite;
|
||||||
|
|
||||||
private string url => $@"https://s.ppy.sh/images/medals-client/{slug}@2x.png";
|
private string url => $@"https://osu.jvnko.boats/images/medals-client/{slug}@2x.png";
|
||||||
|
|
||||||
public MedalIcon(string slug)
|
public MedalIcon(string slug)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -256,18 +256,15 @@ namespace osu.Game.Overlays.Volume
|
|||||||
|
|
||||||
displayVolumeInt = intValue;
|
displayVolumeInt = intValue;
|
||||||
|
|
||||||
text.WireframeTemplate = new string('#', intValue.ToString().Length);
|
text.WireframeTemplate = new string('#', intValue.ToString(CultureInfo.CurrentCulture).Length);
|
||||||
|
text.Text = intValue.ToString(CultureInfo.CurrentCulture);
|
||||||
|
|
||||||
if (displayVolume >= 0.995f)
|
if (displayVolume >= 0.995f)
|
||||||
{
|
maxGlow.EffectColour = meterColour.Opacity(5f);
|
||||||
text.Text = "100";
|
else if (displayVolume < 0.01f)
|
||||||
maxGlow.EffectColour = meterColour.Opacity(2f);
|
maxGlow.EffectColour = meterColour.Opacity(0f);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
maxGlow.EffectColour = meterColour.Opacity((float)displayVolume * 3f + 1f);
|
||||||
maxGlow.EffectColour = Color4.Transparent;
|
|
||||||
text.Text = intValue.ToString(CultureInfo.CurrentCulture);
|
|
||||||
}
|
|
||||||
|
|
||||||
volumeCircle.Progress = displayVolume * 0.75f;
|
volumeCircle.Progress = displayVolume * 0.75f;
|
||||||
volumeCircleGlow.Progress = displayVolume * 0.75f;
|
volumeCircleGlow.Progress = displayVolume * 0.75f;
|
||||||
|
|||||||
@@ -159,8 +159,9 @@ namespace osu.Game.Rulesets.UI
|
|||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
Font = OsuFont.Numeric.With(size: 22f, weight: FontWeight.Black),
|
Font = OsuFont.TorusAlternate.With(size: 36, weight: FontWeight.SemiBold),
|
||||||
UseFullGlyphHeight = false,
|
Margin = new MarginPadding { Bottom = 5 },
|
||||||
|
UseFullGlyphHeight = true,
|
||||||
Text = mod.Acronym
|
Text = mod.Acronym
|
||||||
},
|
},
|
||||||
modIcon = new SpriteIcon
|
modIcon = new SpriteIcon
|
||||||
|
|||||||
@@ -91,11 +91,12 @@ namespace osu.Game.Rulesets.UI
|
|||||||
Anchor = Anchor.Centre,
|
Anchor = Anchor.Centre,
|
||||||
Origin = Anchor.Centre,
|
Origin = Anchor.Centre,
|
||||||
Shadow = false,
|
Shadow = false,
|
||||||
Font = OsuFont.Numeric.With(size: 24, weight: FontWeight.Black),
|
Font = OsuFont.TorusAlternate.With(size: 36, weight: FontWeight.Bold),
|
||||||
Text = mod.Acronym,
|
Text = mod.Acronym,
|
||||||
Margin = new MarginPadding
|
Margin = new MarginPadding
|
||||||
{
|
{
|
||||||
Top = 4
|
Top = 3,
|
||||||
|
Bottom = 6
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -18,14 +18,12 @@ using osu.Game.Graphics;
|
|||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Graphics.UserInterfaceV2;
|
|
||||||
using osu.Game.Input.Bindings;
|
using osu.Game.Input.Bindings;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Resources.Localisation.Web;
|
using osu.Game.Resources.Localisation.Web;
|
||||||
using osu.Game.Utils;
|
using osu.Game.Utils;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace osu.Game.Screens.Play
|
namespace osu.Game.Screens.Play
|
||||||
{
|
{
|
||||||
@@ -73,8 +71,6 @@ namespace osu.Game.Screens.Play
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private GlobalActionContainer globalAction { get; set; } = null!;
|
private GlobalActionContainer globalAction { get; set; } = null!;
|
||||||
|
|
||||||
private ShearedButton saveReplay { get; set; } = null!;
|
|
||||||
|
|
||||||
protected GameplayMenuOverlay()
|
protected GameplayMenuOverlay()
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.Both;
|
||||||
@@ -124,15 +120,20 @@ namespace osu.Game.Screens.Play
|
|||||||
Radius = 50
|
Radius = 50
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
saveReplay = new ShearedButton
|
|
||||||
{
|
// XXX: I have mixed feelings about this, but it works at least
|
||||||
Text = "Quit and save replay",
|
(OnQuitReplay != null)
|
||||||
Origin = Anchor.TopCentre,
|
? new ShearedButton
|
||||||
Anchor = Anchor.TopCentre,
|
{
|
||||||
Height = 32,
|
Text = "Quit and save replay",
|
||||||
Colour = colours.PurpleLight,
|
Origin = Anchor.TopCentre,
|
||||||
// Visibility = false
|
Anchor = Anchor.TopCentre,
|
||||||
},
|
Height = 32,
|
||||||
|
Colour = colours.PurpleLight,
|
||||||
|
Action = () => OnQuitReplay.Invoke()
|
||||||
|
}
|
||||||
|
: [],
|
||||||
|
|
||||||
playInfoText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.GetFont(size: 18))
|
playInfoText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.GetFont(size: 18))
|
||||||
{
|
{
|
||||||
Origin = Anchor.TopCentre,
|
Origin = Anchor.TopCentre,
|
||||||
@@ -153,12 +154,6 @@ namespace osu.Game.Screens.Play
|
|||||||
if (OnQuit != null)
|
if (OnQuit != null)
|
||||||
AddButton(GameplayMenuOverlayStrings.Quit, new Color4(170, 27, 39, 255), () => OnQuit.Invoke());
|
AddButton(GameplayMenuOverlayStrings.Quit, new Color4(170, 27, 39, 255), () => OnQuit.Invoke());
|
||||||
|
|
||||||
if (OnQuitReplay != null)
|
|
||||||
{
|
|
||||||
// saveReplay.Visibility = true;
|
|
||||||
saveReplay.Action = () => OnQuitReplay.Invoke();
|
|
||||||
}
|
|
||||||
|
|
||||||
State.ValueChanged += _ => InternalButtons.Deselect();
|
State.ValueChanged += _ => InternalButtons.Deselect();
|
||||||
|
|
||||||
updateInfoText();
|
updateInfoText();
|
||||||
|
|||||||
@@ -519,7 +519,7 @@ namespace osu.Game.Screens.Play
|
|||||||
Retries = RestartCount,
|
Retries = RestartCount,
|
||||||
OnRetry = () => Restart(),
|
OnRetry = () => Restart(),
|
||||||
OnQuit = () => PerformExitWithConfirmation(),
|
OnQuit = () => PerformExitWithConfirmation(),
|
||||||
OnQuitReplay = () => PerformExitReplay()
|
OnQuitReplay = (this is not SoloPlayer) ? null : PerformExitReplay
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -998,13 +998,10 @@ namespace osu.Game.Screens.Play
|
|||||||
PauseOverlay.Hide();
|
PauseOverlay.Hide();
|
||||||
|
|
||||||
bool exitOnFail = GameplayState.Mods.OfType<IApplicableFailExit>().Any(m => m.ExitOnFail)
|
bool exitOnFail = GameplayState.Mods.OfType<IApplicableFailExit>().Any(m => m.ExitOnFail)
|
||||||
&& Score.ScoreInfo.User.Username == config.Get<string>(OsuSetting.Username); // TODO: do more concrete checks
|
&& Score.ScoreInfo.User.Username == config.Get<string>(OsuSetting.Username)
|
||||||
|
&& this is SoloPlayer;
|
||||||
if (exitOnFail)
|
if (exitOnFail)
|
||||||
{
|
game.Exit(); // we're done here
|
||||||
// game.AttemptExit();
|
|
||||||
game.Exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool restartOnFail = GameplayState.Mods.OfType<IApplicableFailOverride>().Any(m => m.RestartOnFail);
|
bool restartOnFail = GameplayState.Mods.OfType<IApplicableFailOverride>().Any(m => m.RestartOnFail);
|
||||||
if (!restartOnFail)
|
if (!restartOnFail)
|
||||||
|
|||||||
@@ -122,9 +122,9 @@ namespace osu.Game.Screens.Ranking.Expanded
|
|||||||
FillMode = FillMode.Fit,
|
FillMode = FillMode.Fit,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
scoreCounter = new TotalScoreCounter(!withFlair)
|
scoreCounter = new TotalScoreCounter(!withFlair, score)
|
||||||
{
|
{
|
||||||
Margin = new MarginPadding { Top = 0, Bottom = 5 },
|
Margin = new MarginPadding { Top = 10, Bottom = 5 },
|
||||||
Current = { Value = 0 },
|
Current = { Value = 0 },
|
||||||
Alpha = 0,
|
Alpha = 0,
|
||||||
AlwaysPresent = true
|
AlwaysPresent = true
|
||||||
|
|||||||
@@ -1,17 +1,23 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
#nullable disable
|
#nullable enable
|
||||||
|
|
||||||
|
using System.Globalization;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Audio;
|
using osu.Framework.Audio;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Audio;
|
using osu.Framework.Graphics.Audio;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Sprites;
|
using osu.Game.Graphics.Sprites;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
using osu.Game.Scoring;
|
||||||
|
using osu.Game.Scoring.Legacy;
|
||||||
|
using osu.Game.Screens.Play.HUD;
|
||||||
using osu.Game.Screens.Ranking.Expanded.Accuracy;
|
using osu.Game.Screens.Ranking.Expanded.Accuracy;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
@@ -30,43 +36,65 @@ namespace osu.Game.Screens.Ranking.Expanded
|
|||||||
|
|
||||||
private readonly Bindable<double> tickPlaybackRate = new Bindable<double>();
|
private readonly Bindable<double> tickPlaybackRate = new Bindable<double>();
|
||||||
|
|
||||||
|
private ScoreInfo score;
|
||||||
|
private Bindable<ScoringMode> scoringMode = new Bindable<ScoringMode>(ScoringMode.Standardised);
|
||||||
|
private ScoringMode mode => scoringMode.Value;
|
||||||
|
|
||||||
private double lastSampleTime;
|
private double lastSampleTime;
|
||||||
|
|
||||||
private DrawableSample sampleTick;
|
private DrawableSample sampleTick = null!;
|
||||||
|
private ArgonCounterTextComponent counter = null!;
|
||||||
|
|
||||||
public TotalScoreCounter(bool playSamples = false)
|
public TotalScoreCounter(bool playSamples = false, ScoreInfo? score = null)
|
||||||
{
|
{
|
||||||
// Todo: AutoSize X removed here due to https://github.com/ppy/osu-framework/issues/3369
|
// Todo: AutoSize X removed here due to https://github.com/ppy/osu-framework/issues/3369
|
||||||
AutoSizeAxes = Axes.Y;
|
AutoSizeAxes = Axes.Y;
|
||||||
RelativeSizeAxes = Axes.X;
|
RelativeSizeAxes = Axes.X;
|
||||||
|
|
||||||
this.playSamples = playSamples;
|
this.playSamples = playSamples;
|
||||||
|
this.score = score ?? new ScoreInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(AudioManager audio)
|
private void load(AudioManager audio, OsuConfigManager? config)
|
||||||
{
|
{
|
||||||
AddInternal(sampleTick = new DrawableSample(audio.Samples.Get(@"Results/score-tick-lesser")));
|
AddInternal(sampleTick = new DrawableSample(audio.Samples.Get(@"Results/score-tick-lesser")));
|
||||||
|
scoringMode.BindTo(
|
||||||
|
config?.GetBindable<ScoringMode>(OsuSetting.ScoreDisplayMode)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
|
scoringMode.BindValueChanged(_ => updateWireframe(), true);
|
||||||
|
|
||||||
|
|
||||||
if (playSamples)
|
if (playSamples)
|
||||||
Current.BindValueChanged(_ => startTicking());
|
Current.BindValueChanged(_ => startTicking());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override LocalisableString FormatCount(long count) => count.ToString("N0");
|
protected override LocalisableString FormatCount(long count) => count.ToString("N0", CultureInfo.CreateSpecificCulture("en-US")).Replace(',', '.'); // XXX: make this look okay
|
||||||
|
|
||||||
protected override OsuSpriteText CreateSpriteText() => base.CreateSpriteText().With(s =>
|
private void updateWireframe()
|
||||||
{
|
{
|
||||||
s.Anchor = Anchor.TopCentre;
|
string getWireframe(long sc) => (sc >= 100000)
|
||||||
s.Origin = Anchor.TopCentre;
|
? FormatCount(sc).ToString()
|
||||||
|
: "###.###";
|
||||||
|
|
||||||
s.Font = OsuFont.Torus.With(size: 60, weight: FontWeight.Light, fixedWidth: true);
|
long dispScore = Scoring.Legacy.ScoreInfoExtensions.GetDisplayScore(score, mode);
|
||||||
s.Spacing = new Vector2(-5, 0);
|
counter.WireframeTemplate = getWireframe(dispScore);
|
||||||
});
|
}
|
||||||
|
|
||||||
|
protected override ArgonCounterTextComponent CreateText()
|
||||||
|
{
|
||||||
|
counter = new ArgonCounterTextComponent(Anchor.Centre);
|
||||||
|
counter.WireframeOpacity.BindTo(new BindableFloat(0.25f));
|
||||||
|
counter.WireframeTemplate = "###.###";
|
||||||
|
|
||||||
|
return counter;
|
||||||
|
}
|
||||||
|
|
||||||
public override long DisplayedCount
|
public override long DisplayedCount
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ namespace osu.Game.Screens.Select
|
|||||||
TextSize = 11,
|
TextSize = 11,
|
||||||
TextPadding = new MarginPadding { Horizontal = 8, Vertical = 2 },
|
TextPadding = new MarginPadding { Horizontal = 8, Vertical = 2 },
|
||||||
Status = beatmapInfo.Status,
|
Status = beatmapInfo.Status,
|
||||||
ShowUnknownStatus = true,
|
ShowUnknownStatus = working is not DummyWorkingBeatmap,
|
||||||
Alpha = string.IsNullOrEmpty(beatmapInfo.DifficultyName) ? 0 : 1
|
Alpha = string.IsNullOrEmpty(beatmapInfo.DifficultyName) ? 0 : 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ namespace osu.Game.Screens.SelectV2
|
|||||||
new ShearAligningWrapper(statusPill = new BeatmapSetOnlineStatusPill
|
new ShearAligningWrapper(statusPill = new BeatmapSetOnlineStatusPill
|
||||||
{
|
{
|
||||||
Shear = -OsuGame.SHEAR,
|
Shear = -OsuGame.SHEAR,
|
||||||
ShowUnknownStatus = true,
|
ShowUnknownStatus = working is not DummyWorkingBeatmap,
|
||||||
TextSize = OsuFont.Style.Caption1.Size,
|
TextSize = OsuFont.Style.Caption1.Size,
|
||||||
TextPadding = new MarginPadding { Horizontal = 6, Vertical = 1 },
|
TextPadding = new MarginPadding { Horizontal = 6, Vertical = 1 },
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace osu.Game.Users
|
|||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string InternalName { get; set; }
|
public string InternalName { get; set; }
|
||||||
public string ImageUrl => $@"https://s.ppy.sh/images/medals-client/{InternalName}@2x.png";
|
public string ImageUrl => $@"https://osu.jvnko.boats/images/medals/{InternalName}@2x.png";
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user