using System; using System.Globalization; using Microsoft.Xna.Framework.Graphics; using StardewModdingAPI.Framework.Reflection; using StardewValley; namespace StardewModdingAPI.Framework.ContentManagers { /// An extension of specifically optimized for asset propagation. /// This avoids sharing an asset cache with or mods, so that assets can be safely disposed when the vanilla game no longer references them. internal class GameContentManagerForAssetPropagation : GameContentManager { /********* ** Fields *********/ /// A unique value used in to identify assets loaded through this instance. private readonly string Tag = $"Pathoschild.SMAPI/LoadedBy:{nameof(GameContentManagerForAssetPropagation)}"; /********* ** Public methods *********/ /// public GameContentManagerForAssetPropagation(string name, IServiceProvider serviceProvider, string rootDirectory, CultureInfo currentCulture, ContentCoordinator coordinator, IMonitor monitor, Reflector reflection, Action onDisposing, Action onLoadingFirstAsset, Action onAssetLoaded, bool aggressiveMemoryOptimizations) : base(name, serviceProvider, rootDirectory, currentCulture, coordinator, monitor, reflection, onDisposing, onLoadingFirstAsset, onAssetLoaded, aggressiveMemoryOptimizations) { } /// public override T LoadExact(IAssetName assetName, bool useCache) { T data = base.LoadExact(assetName, useCache); if (data is Texture2D texture) texture.Tag = this.Tag; return data; } /// Get whether a texture was loaded by this content manager. /// The texture to check. public bool IsResponsibleFor(Texture2D? texture) { return texture?.Tag is string tag && tag.Contains(this.Tag); } } }