summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-03-25 23:53:30 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-03-25 23:53:30 -0400
commit3707f481a567df5149aea00ffb14cddb7b14fccb (patch)
treea078b00dd396853ed23f4f542d1877d6a40c3482 /src/SMAPI/Framework
parent021891ff0ceb6b327bc196c336aa56ddfaf99b0e (diff)
downloadSMAPI-3707f481a567df5149aea00ffb14cddb7b14fccb.tar.gz
SMAPI-3707f481a567df5149aea00ffb14cddb7b14fccb.tar.bz2
SMAPI-3707f481a567df5149aea00ffb14cddb7b14fccb.zip
extend load conflict resolution into load priority (#766)
Diffstat (limited to 'src/SMAPI/Framework')
-rw-r--r--src/SMAPI/Framework/Content/AssetLoadOperation.cs11
-rw-r--r--src/SMAPI/Framework/ContentCoordinator.cs2
-rw-r--r--src/SMAPI/Framework/ContentManagers/GameContentManager.cs10
3 files changed, 12 insertions, 11 deletions
diff --git a/src/SMAPI/Framework/Content/AssetLoadOperation.cs b/src/SMAPI/Framework/Content/AssetLoadOperation.cs
index 36baf1aa..b12958d6 100644
--- a/src/SMAPI/Framework/Content/AssetLoadOperation.cs
+++ b/src/SMAPI/Framework/Content/AssetLoadOperation.cs
@@ -1,4 +1,5 @@
using System;
+using StardewModdingAPI.Events;
namespace StardewModdingAPI.Framework.Content
{
@@ -14,8 +15,8 @@ namespace StardewModdingAPI.Framework.Content
/// <summary>The content pack on whose behalf the asset is being loaded, if any.</summary>
public IModMetadata OnBehalfOf { get; }
- /// <summary>Whether to allow skipping this operation to resolve a load conflict.</summary>
- public bool AllowSkipOnConflict { get; }
+ /// <summary>If there are multiple loads that apply to the same asset, the priority with which this one should be applied.</summary>
+ public AssetLoadPriority Priority { get; }
/// <summary>Load the initial value for an asset.</summary>
public Func<IAssetInfo, object> GetData { get; }
@@ -26,13 +27,13 @@ namespace StardewModdingAPI.Framework.Content
*********/
/// <summary>Construct an instance.</summary>
/// <param name="mod">The mod applying the edit.</param>
- /// <param name="allowSkipOnConflict">Whether to allow skipping this operation to resolve a load conflict.</param>
+ /// <param name="priority">If there are multiple loads that apply to the same asset, the priority with which this one should be applied.</param>
/// <param name="onBehalfOf">The content pack on whose behalf the asset is being loaded, if any.</param>
/// <param name="getData">Load the initial value for an asset.</param>
- public AssetLoadOperation(IModMetadata mod, bool allowSkipOnConflict, IModMetadata onBehalfOf, Func<IAssetInfo, object> getData)
+ public AssetLoadOperation(IModMetadata mod, AssetLoadPriority priority, IModMetadata onBehalfOf, Func<IAssetInfo, object> getData)
{
this.Mod = mod;
- this.AllowSkipOnConflict = allowSkipOnConflict;
+ this.Priority = priority;
this.OnBehalfOf = onBehalfOf;
this.GetData = getData;
}
diff --git a/src/SMAPI/Framework/ContentCoordinator.cs b/src/SMAPI/Framework/ContentCoordinator.cs
index 43cebcbe..144832b2 100644
--- a/src/SMAPI/Framework/ContentCoordinator.cs
+++ b/src/SMAPI/Framework/ContentCoordinator.cs
@@ -608,7 +608,7 @@ namespace StardewModdingAPI.Framework
{
new AssetLoadOperation(
mod: loader.Mod,
- allowSkipOnConflict: false,
+ priority: AssetLoadPriority.Exclusive,
onBehalfOf: null,
getData: assetInfo => loader.Data.Load<T>(assetInfo)
)
diff --git a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs
index b3e98648..16eddb00 100644
--- a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs
+++ b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs
@@ -6,6 +6,7 @@ using System.Linq;
using System.Reflection;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
+using StardewModdingAPI.Events;
using StardewModdingAPI.Framework.Content;
using StardewModdingAPI.Framework.Exceptions;
using StardewModdingAPI.Framework.Reflection;
@@ -275,7 +276,7 @@ namespace StardewModdingAPI.Framework.ContentManagers
// find matching loader
AssetLoadOperation loader;
{
- AssetLoadOperation[] loaders = this.GetLoaders<T>(info).ToArray();
+ AssetLoadOperation[] loaders = this.GetLoaders<T>(info).OrderByDescending(p => p.Priority).ToArray();
if (!this.AssertMaxOneRequiredLoader(info, loaders, out string error))
{
@@ -283,9 +284,7 @@ namespace StardewModdingAPI.Framework.ContentManagers
return null;
}
- loader =
- loaders.FirstOrDefault(p => !p.AllowSkipOnConflict)
- ?? loaders.FirstOrDefault();
+ loader = loaders.FirstOrDefault();
}
// no loader found
@@ -396,7 +395,7 @@ namespace StardewModdingAPI.Framework.ContentManagers
/// <returns>Returns true if only one loader will apply, else false.</returns>
private bool AssertMaxOneRequiredLoader(IAssetInfo info, AssetLoadOperation[] loaders, out string error)
{
- AssetLoadOperation[] required = loaders.Where(p => !p.AllowSkipOnConflict).ToArray();
+ AssetLoadOperation[] required = loaders.Where(p => p.Priority == AssetLoadPriority.Exclusive).ToArray();
if (required.Length <= 1)
{
error = null;
@@ -405,6 +404,7 @@ namespace StardewModdingAPI.Framework.ContentManagers
string[] loaderNames = required
.Select(p => p.Mod.DisplayName + this.GetOnBehalfOfLabel(p.OnBehalfOf))
+ .OrderBy(p => p)
.Distinct()
.ToArray();
string errorPhrase = loaderNames.Length > 1