diff --git a/docs/release-notes.md b/docs/release-notes.md
index c2e76b56..9835dd64 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -12,6 +12,7 @@
* Aggressive memory optimization (added in 3.9.2) is now disabled by default. The option reduces errors for a subset of players who use certain mods, but may cause crashes for farmhands in multiplayer. You can edit `smapi-internal/config.json` to enable it if you experience frequent `OutOfMemoryException` errors.
* For mod authors:
+ * Added asset propagation for interior door sprites.
* Fixed assets changed by a mod not reapplied if playing in non-English, the changes are only applicable after the save is loaded, the player returns to title and reloads a save, and the game reloads the target asset before the save is loaded.
## 3.9.4
diff --git a/src/SMAPI/Metadata/CoreAssetPropagator.cs b/src/SMAPI/Metadata/CoreAssetPropagator.cs
index 8b591bc1..ae56dc9c 100644
--- a/src/SMAPI/Metadata/CoreAssetPropagator.cs
+++ b/src/SMAPI/Metadata/CoreAssetPropagator.cs
@@ -366,6 +366,8 @@ namespace StardewModdingAPI.Metadata
foreach (ClickableTextureComponent button in new[] { menu.questButton, menu.zoomInButton, menu.zoomOutButton })
button.texture = Game1.mouseCursors;
}
+
+ this.ReloadDoorSprites(content, key);
return true;
case "loosesprites\\cursors2": // Game1.LoadContent
@@ -739,6 +741,36 @@ namespace StardewModdingAPI.Metadata
return critters.Length;
}
+ /// Reload the sprites for interior doors.
+ /// The content manager through which to reload the asset.
+ /// The asset key to reload.
+ /// Returns whether any doors were affected.
+ private bool ReloadDoorSprites(LocalizedContentManager content, string key)
+ {
+ Lazy texture = new Lazy(() => content.Load(key));
+
+ foreach (GameLocation location in this.GetLocations())
+ {
+ IEnumerable doors = location.interiorDoors?.Doors;
+ if (doors == null)
+ continue;
+
+ foreach (InteriorDoor door in doors)
+ {
+ if (door?.Sprite == null)
+ continue;
+
+ string textureName = this.NormalizeAssetNameIgnoringEmpty(this.Reflection.GetField(door.Sprite, "textureName").GetValue());
+ if (textureName != key)
+ continue;
+
+ door.Sprite.texture = texture.Value;
+ }
+ }
+
+ return texture.IsValueCreated;
+ }
+
/// Reload the data for matching farm animals.
/// Returns whether any farm animals were affected.
/// Derived from the constructor.