diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2022-03-25 23:53:30 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2022-03-25 23:53:30 -0400 |
commit | 3707f481a567df5149aea00ffb14cddb7b14fccb (patch) | |
tree | a078b00dd396853ed23f4f542d1877d6a40c3482 /src/SMAPI/Framework | |
parent | 021891ff0ceb6b327bc196c336aa56ddfaf99b0e (diff) | |
download | SMAPI-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.cs | 11 | ||||
-rw-r--r-- | src/SMAPI/Framework/ContentCoordinator.cs | 2 | ||||
-rw-r--r-- | src/SMAPI/Framework/ContentManagers/GameContentManager.cs | 10 |
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 |