mirror of
https://github.com/ppy/osu.git
synced 2024-12-13 08:32:57 +08:00
Add ability to lookup mod from a type specification
This commit is contained in:
parent
4d0530ca9d
commit
2edb851008
@ -4,6 +4,7 @@
|
|||||||
using BenchmarkDotNet.Attributes;
|
using BenchmarkDotNet.Attributes;
|
||||||
using BenchmarkDotNet.Engines;
|
using BenchmarkDotNet.Engines;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Osu;
|
using osu.Game.Rulesets.Osu;
|
||||||
|
|
||||||
namespace osu.Game.Benchmarks
|
namespace osu.Game.Benchmarks
|
||||||
@ -45,5 +46,17 @@ namespace osu.Game.Benchmarks
|
|||||||
{
|
{
|
||||||
ruleset.GetAllModsForReference().Consume(new Consumer());
|
ruleset.GetAllModsForReference().Consume(new Consumer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void BenchmarkGetForAcronym()
|
||||||
|
{
|
||||||
|
ruleset.GetModForAcronym("DT");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void BenchmarkGetForType()
|
||||||
|
{
|
||||||
|
ruleset.GetMod<ModDoubleTime>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// 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.
|
||||||
|
|
||||||
using System.Linq;
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
|
@ -26,7 +26,7 @@ namespace osu.Game.Online.API.Requests.Responses
|
|||||||
var mods = Mods != null ? Mods.Select(acronym => rulesetInstance.GetModForAcronym(acronym)).Where(m => m != null).ToArray() : Array.Empty<Mod>();
|
var mods = Mods != null ? Mods.Select(acronym => rulesetInstance.GetModForAcronym(acronym)).Where(m => m != null).ToArray() : Array.Empty<Mod>();
|
||||||
|
|
||||||
// all API scores provided by this class are considered to be legacy.
|
// all API scores provided by this class are considered to be legacy.
|
||||||
mods = mods.Append(rulesetInstance.GetAllMods().OfType<ModClassic>().Single()).ToArray();
|
mods = mods.Append(rulesetInstance.GetMod<ModClassic>()).ToArray();
|
||||||
|
|
||||||
var scoreInfo = new ScoreInfo
|
var scoreInfo = new ScoreInfo
|
||||||
{
|
{
|
||||||
|
@ -166,7 +166,7 @@ namespace osu.Game
|
|||||||
|
|
||||||
public OsuGameBase()
|
public OsuGameBase()
|
||||||
{
|
{
|
||||||
UseDevelopmentServer = DebugUtils.IsDebugBuild;
|
UseDevelopmentServer = false;
|
||||||
Name = @"osu!";
|
Name = @"osu!";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,6 @@ using osu.Game.Scoring;
|
|||||||
using osu.Game.Skinning;
|
using osu.Game.Skinning;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using osu.Framework.Bindables;
|
|
||||||
using osu.Framework.Extensions;
|
using osu.Framework.Extensions;
|
||||||
using osu.Framework.Extensions.EnumExtensions;
|
using osu.Framework.Extensions.EnumExtensions;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
@ -86,6 +85,20 @@ namespace osu.Game.Rulesets
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a fresh instance of the mod matching the specified type.
|
||||||
|
/// </summary>
|
||||||
|
public T GetMod<T>()
|
||||||
|
where T : Mod
|
||||||
|
{
|
||||||
|
var type = GetAllModsForReference().FirstOrDefault(m => m is T)?.GetType();
|
||||||
|
|
||||||
|
if (type != null)
|
||||||
|
return (T)Activator.CreateInstance(type);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract IEnumerable<Mod> GetModsFor(ModType type);
|
public abstract IEnumerable<Mod> GetModsFor(ModType type);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -166,7 +179,7 @@ namespace osu.Game.Rulesets
|
|||||||
}
|
}
|
||||||
|
|
||||||
[CanBeNull]
|
[CanBeNull]
|
||||||
public ModAutoplay GetAutoplayMod() => GetAllMods().OfType<ModAutoplay>().FirstOrDefault();
|
public ModAutoplay GetAutoplayMod() => GetMod<ModAutoplay>();
|
||||||
|
|
||||||
public virtual ISkin CreateLegacySkinProvider([NotNull] ISkin skin, IBeatmap beatmap) => null;
|
public virtual ISkin CreateLegacySkinProvider([NotNull] ISkin skin, IBeatmap beatmap) => null;
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ namespace osu.Game.Scoring.Legacy
|
|||||||
|
|
||||||
// lazer replays get a really high version number.
|
// lazer replays get a really high version number.
|
||||||
if (version < LegacyScoreEncoder.FIRST_LAZER_VERSION)
|
if (version < LegacyScoreEncoder.FIRST_LAZER_VERSION)
|
||||||
scoreInfo.Mods = scoreInfo.Mods.Append(currentRuleset.GetAllMods().OfType<ModClassic>().Single()).ToArray();
|
scoreInfo.Mods = scoreInfo.Mods.Append(currentRuleset.GetMod<ModClassic>()).ToArray();
|
||||||
|
|
||||||
currentBeatmap = workingBeatmap.GetPlayableBeatmap(currentRuleset.RulesetInfo, scoreInfo.Mods);
|
currentBeatmap = workingBeatmap.GetPlayableBeatmap(currentRuleset.RulesetInfo, scoreInfo.Mods);
|
||||||
scoreInfo.Beatmap = currentBeatmap.BeatmapInfo;
|
scoreInfo.Beatmap = currentBeatmap.BeatmapInfo;
|
||||||
|
@ -67,7 +67,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
if (!AllowFail)
|
if (!AllowFail)
|
||||||
{
|
{
|
||||||
var noFailMod = ruleset.GetAllMods().FirstOrDefault(m => m is ModNoFail);
|
var noFailMod = ruleset.GetMod<ModNoFail>();
|
||||||
if (noFailMod != null)
|
if (noFailMod != null)
|
||||||
SelectedMods.Value = new[] { noFailMod };
|
SelectedMods.Value = new[] { noFailMod };
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user