diff options
Diffstat (limited to 'src/SMAPI/Framework')
| -rw-r--r-- | src/SMAPI/Framework/ContentCoordinator.cs | 7 | ||||
| -rw-r--r-- | src/SMAPI/Framework/ContentManagers/BaseContentManager.cs | 27 | ||||
| -rw-r--r-- | src/SMAPI/Framework/ContentManagers/IContentManager.cs | 11 | 
3 files changed, 25 insertions, 20 deletions
| diff --git a/src/SMAPI/Framework/ContentCoordinator.cs b/src/SMAPI/Framework/ContentCoordinator.cs index da8f0da9..dd3d2917 100644 --- a/src/SMAPI/Framework/ContentCoordinator.cs +++ b/src/SMAPI/Framework/ContentCoordinator.cs @@ -394,9 +394,14 @@ namespace StardewModdingAPI.Framework                  // cached assets                  foreach (IContentManager contentManager in this.ContentManagers)                  { -                    foreach ((string key, object asset) in contentManager.InvalidateCache((key, type) => predicate(contentManager, key, type), dispose)) +                    foreach ((string key, object asset) in contentManager.GetCachedAssets())                      { +                        if (!predicate(contentManager, key, asset.GetType())) +                            continue; +                          AssetName assetName = this.ParseAssetName(key, allowLocales: true); +                        contentManager.InvalidateCache(assetName, dispose); +                          if (!invalidatedAssets.ContainsKey(assetName))                              invalidatedAssets[assetName] = asset.GetType();                      } diff --git a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs index 575d252e..ddc02a8c 100644 --- a/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/BaseContentManager.cs @@ -231,24 +231,21 @@ namespace StardewModdingAPI.Framework.ContentManagers          ** Cache invalidation          ****/          /// <inheritdoc /> -        public IDictionary<string, object> InvalidateCache(Func<string, Type, bool> predicate, bool dispose = false) +        public IEnumerable<KeyValuePair<string, object>> GetCachedAssets()          { -            IDictionary<string, object> removeAssets = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); -            this.Cache.Remove((key, asset) => -            { -                string baseAssetName = this.Coordinator.ParseAssetName(key, allowLocales: this.TryLocalizeKeys).BaseName; +            foreach (string key in this.Cache.Keys) +                yield return new(key, this.Cache[key]); +        } -                // check if asset should be removed -                bool remove = removeAssets.ContainsKey(baseAssetName); -                if (!remove && predicate(baseAssetName, asset.GetType())) -                { -                    removeAssets[baseAssetName] = asset; -                    remove = true; -                } -                return remove; -            }, dispose); +        /// <inheritdoc /> +        public bool InvalidateCache(IAssetName assetName, bool dispose = false) +        { +            if (!this.Cache.ContainsKey(assetName.Name)) +                return false; -            return removeAssets; +            // remove from cache +            this.Cache.Remove(assetName.Name, dispose); +            return true;          }          /// <inheritdoc /> diff --git a/src/SMAPI/Framework/ContentManagers/IContentManager.cs b/src/SMAPI/Framework/ContentManagers/IContentManager.cs index ac67cad5..f2e3b9f0 100644 --- a/src/SMAPI/Framework/ContentManagers/IContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/IContentManager.cs @@ -32,7 +32,7 @@ namespace StardewModdingAPI.Framework.ContentManagers          /// <typeparam name="T">The expected asset type.</typeparam>          /// <param name="assetName">The normalized asset name.</param>          bool DoesAssetExist<T>(IAssetName assetName) -            where T: notnull; +            where T : notnull;          /// <summary>Load an asset through the content pipeline, using a localized variant of the <paramref name="assetName"/> if available.</summary>          /// <typeparam name="T">The type of asset to load.</typeparam> @@ -65,10 +65,13 @@ namespace StardewModdingAPI.Framework.ContentManagers          /// <param name="assetName">The asset path relative to the loader root directory, not including the <c>.xnb</c> extension.</param>          bool IsLoaded(IAssetName assetName); +        /// <summary>Get all assets in the cache.</summary> +        IEnumerable<KeyValuePair<string, object>> GetCachedAssets(); +          /// <summary>Purge matched assets from the cache.</summary> -        /// <param name="predicate">Matches the asset keys to invalidate.</param> +        /// <param name="assetName">The asset name to dispose.</param>          /// <param name="dispose">Whether to dispose invalidated assets. This should only be <c>true</c> when they're being invalidated as part of a dispose, to avoid crashing the game.</param> -        /// <returns>Returns the invalidated asset names and instances.</returns> -        IDictionary<string, object> InvalidateCache(Func<string, Type, bool> predicate, bool dispose = false); +        /// <returns>Returns whether the asset was in the cache.</returns> +        bool InvalidateCache(IAssetName assetName, bool dispose = false);      }  } | 
