From 059a59a7bcb560b938f0baf54575719e57962e0c Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 16 Jun 2019 14:12:54 -0400 Subject: fix error when loading a mod asset through a translated content manager (#647) --- src/SMAPI/Constants.cs | 3 +++ src/SMAPI/Framework/ContentCoordinator.cs | 9 +++++---- src/SMAPI/Framework/ContentManagers/GameContentManager.cs | 2 +- src/SMAPI/Framework/ContentManagers/ModContentManager.cs | 8 ++++---- src/SMAPI/Framework/ModHelpers/ContentHelper.cs | 2 +- 5 files changed, 14 insertions(+), 10 deletions(-) (limited to 'src/SMAPI') diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs index f58722a0..e02c9265 100644 --- a/src/SMAPI/Constants.cs +++ b/src/SMAPI/Constants.cs @@ -97,6 +97,9 @@ namespace StardewModdingAPI /// The game's assembly name. internal static string GameAssemblyName => Constants.Platform == Platform.Windows ? "Stardew Valley" : "StardewValley"; + /// The language code for non-translated mod assets. + internal static LocalizedContentManager.LanguageCode DefaultLanguage { get; } = LocalizedContentManager.LanguageCode.en; + /********* ** Internal methods diff --git a/src/SMAPI/Framework/ContentCoordinator.cs b/src/SMAPI/Framework/ContentCoordinator.cs index 2dfe1f1c..39bebdd1 100644 --- a/src/SMAPI/Framework/ContentCoordinator.cs +++ b/src/SMAPI/Framework/ContentCoordinator.cs @@ -42,6 +42,9 @@ namespace StardewModdingAPI.Framework /// The loaded content managers (including the ). private readonly IList ContentManagers = new List(); + /// The language code for language-agnostic mod assets. + private readonly LocalizedContentManager.LanguageCode DefaultLanguage = Constants.DefaultLanguage; + /// Whether the content coordinator has been disposed. private bool IsDisposed; @@ -172,11 +175,9 @@ namespace StardewModdingAPI.Framework /// Get a copy of an asset from a mod folder. /// The asset type. - /// The internal asset key. /// The unique name for the content manager which should load this asset. /// The internal SMAPI asset key. - /// The language code for which to load content. - public T LoadManagedAsset(string internalKey, string contentManagerID, string relativePath, LocalizedContentManager.LanguageCode language) + public T LoadManagedAsset(string contentManagerID, string relativePath) { // get content manager IContentManager contentManager = this.ContentManagers.FirstOrDefault(p => p.IsNamespaced && p.Name == contentManagerID); @@ -184,7 +185,7 @@ namespace StardewModdingAPI.Framework throw new InvalidOperationException($"The '{contentManagerID}' prefix isn't handled by any mod."); // get fresh asset - return contentManager.Load(relativePath, language, useCache: false); + return contentManager.Load(relativePath, this.DefaultLanguage, useCache: false); } /// Purge assets from the cache that match one of the interceptors. diff --git a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs index ecabcaca..488ec245 100644 --- a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs @@ -82,7 +82,7 @@ namespace StardewModdingAPI.Framework.ContentManagers // get managed asset if (this.Coordinator.TryParseManagedAssetKey(assetName, out string contentManagerID, out string relativePath)) { - T managedAsset = this.Coordinator.LoadManagedAsset(assetName, contentManagerID, relativePath, language); + T managedAsset = this.Coordinator.LoadManagedAsset(contentManagerID, relativePath); if (useCache) this.Inject(assetName, managedAsset, language); return managedAsset; diff --git a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs index 1d015138..2c73e861 100644 --- a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs @@ -30,7 +30,7 @@ namespace StardewModdingAPI.Framework.ContentManagers private readonly IContentManager GameContentManager; /// The language code for language-agnostic mod assets. - private const LanguageCode NoLanguage = LanguageCode.en; + private readonly LanguageCode DefaultLanguage = Constants.DefaultLanguage; /********* @@ -59,7 +59,7 @@ namespace StardewModdingAPI.Framework.ContentManagers /// The asset path relative to the loader root directory, not including the .xnb extension. public override T Load(string assetName) { - return this.Load(assetName, ModContentManager.NoLanguage, useCache: false); + return this.Load(assetName, this.DefaultLanguage, useCache: false); } /// Load an asset that has been processed by the content pipeline. @@ -90,8 +90,8 @@ namespace StardewModdingAPI.Framework.ContentManagers // disable language handling // Mod files don't support automatic translation logic, so this should never happen. - if (language != ModContentManager.NoLanguage) - throw new InvalidOperationException("Caching is not supported by the mod content manager."); + if (language != this.DefaultLanguage) + throw new InvalidOperationException("Localised assets aren't supported by the mod content manager."); // resolve managed asset key { diff --git a/src/SMAPI/Framework/ModHelpers/ContentHelper.cs b/src/SMAPI/Framework/ModHelpers/ContentHelper.cs index 0be9aea5..15b164b1 100644 --- a/src/SMAPI/Framework/ModHelpers/ContentHelper.cs +++ b/src/SMAPI/Framework/ModHelpers/ContentHelper.cs @@ -94,7 +94,7 @@ namespace StardewModdingAPI.Framework.ModHelpers return this.GameContentManager.Load(key, this.CurrentLocaleConstant, useCache: false); case ContentSource.ModFolder: - return this.ModContentManager.Load(key, this.CurrentLocaleConstant, useCache: false); + return this.ModContentManager.Load(key, Constants.DefaultLanguage, useCache: false); default: throw new SContentLoadException($"{this.ModName} failed loading content asset '{key}' from {source}: unknown content source '{source}'."); -- cgit