From 1003116f7f95d149b350642db8da2464d9ed9954 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Sun, 18 Aug 2019 01:00:11 -0400
Subject: fix asset changes not affecting cached asset loads in a specific case

---
 src/SMAPI/Framework/ContentManagers/GameContentManager.cs | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs
index c64e9ba9..0b563555 100644
--- a/src/SMAPI/Framework/ContentManagers/GameContentManager.cs
+++ b/src/SMAPI/Framework/ContentManagers/GameContentManager.cs
@@ -184,10 +184,20 @@ namespace StardewModdingAPI.Framework.ContentManagers
                     return;
                 }
             }
+
+            // save to cache
+            // Note: even if the asset was loaded and cached right before this method was called,
+            // we need to fully re-inject it here for two reasons:
+            //   1. So we can look up an asset by its base or localized key (the game/XNA logic
+            //      only caches by the most specific key).
+            //   2. Because a mod asset loader/editor may have changed the asset in a way that
+            //      doesn't change the instance stored in the cache, e.g. using `asset.ReplaceWith`.
+            string keyWithLocale = $"{assetName}.{this.GetLocale(language)}";
             base.Inject(assetName, value, language);
+            if (this.Cache.ContainsKey(keyWithLocale))
+                base.Inject(keyWithLocale, value, language);
 
             // track whether the injected asset is translatable for is-loaded lookups
-            string keyWithLocale = $"{assetName}.{this.GetLocale(language)}";
             if (this.Cache.ContainsKey(keyWithLocale))
             {
                 this.IsLocalizableLookup[assetName] = true;
-- 
cgit