summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-02-06 13:03:37 -0500
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-02-06 13:03:37 -0500
commitefec87065780426db15c51a7e68315ff488a89c0 (patch)
treeb7649aee21a4ac6dbf4756892acd4a59a5a0eb29 /src/SMAPI/Framework
parent54e7b5b846dfd542af3c8a904a57fc5ccc44ecb5 (diff)
downloadSMAPI-efec87065780426db15c51a7e68315ff488a89c0.tar.gz
SMAPI-efec87065780426db15c51a7e68315ff488a89c0.tar.bz2
SMAPI-efec87065780426db15c51a7e68315ff488a89c0.zip
fix edge case in non-English asset cache after returning to title screen
Diffstat (limited to 'src/SMAPI/Framework')
-rw-r--r--src/SMAPI/Framework/ContentCoordinator.cs26
-rw-r--r--src/SMAPI/Framework/SCore.cs1
2 files changed, 27 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/ContentCoordinator.cs b/src/SMAPI/Framework/ContentCoordinator.cs
index 6a7385c3..b7c15526 100644
--- a/src/SMAPI/Framework/ContentCoordinator.cs
+++ b/src/SMAPI/Framework/ContentCoordinator.cs
@@ -203,6 +203,32 @@ namespace StardewModdingAPI.Framework
});
}
+ /// <summary>Clean up when the player is returning to the title screen.</summary>
+ /// <remarks>This is called after the player returns to the title screen, but before <see cref="Game1.CleanupReturningToTitle"/> runs.</remarks>
+ public void OnReturningToTitleScreen()
+ {
+ // The game clears LocalizedContentManager.localizedAssetNames after returning to the title screen. That
+ // causes an inconsistency in the SMAPI asset cache, which leads to an edge case where assets already
+ // provided by mods via IAssetLoader when playing in non-English are ignored.
+ //
+ // For example, let's say a mod provides the 'Data\mail' asset through IAssetLoader when playing in
+ // Portuguese. Here's the normal load process after it's loaded:
+ // 1. The game requests Data\mail.
+ // 2. SMAPI sees that it's already cached, and calls LoadRaw to bypass asset interception.
+ // 3. LoadRaw sees that there's a localized key mapping, and gets the mapped key.
+ // 4. In this case "Data\mail" is mapped to "Data\mail" since it was loaded by a mod, so it loads that
+ // asset.
+ //
+ // When the game clears localizedAssetNames, that process goes wrong in step 4:
+ // 3. LoadRaw sees that there's no localized key mapping *and* the locale is non-English, so it attempts
+ // to load from the localized key format.
+ // 4. In this case that's 'Data\mail.pt-BR', so it successfully loads that asset.
+ // 5. Since we've bypassed asset interception at this point, it's loaded directly from the base content
+ // manager without mod changes.
+
+ this.InvalidateCache(asset => true);
+ }
+
/// <summary>Get whether this asset is mapped to a mod folder.</summary>
/// <param name="key">The asset key.</param>
public bool IsManagedAssetKey(string key)
diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs
index 0ae69f0f..2d783eb2 100644
--- a/src/SMAPI/Framework/SCore.cs
+++ b/src/SMAPI/Framework/SCore.cs
@@ -1118,6 +1118,7 @@ namespace StardewModdingAPI.Framework
{
// perform cleanup
this.Multiplayer.CleanupOnMultiplayerExit();
+ this.ContentCore.OnReturningToTitleScreen();
this.JustReturnedToTitle = true;
}