summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-03-14 14:17:09 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-03-14 14:17:09 -0400
commit6805c90e2cdac734341b692298670b0beb50faa6 (patch)
treefad2c0fc89c5338a8b231da28e3237b2a4ddf9bb
parent04388fe7e3b721358de25d64607d47d5f6113eda (diff)
downloadSMAPI-6805c90e2cdac734341b692298670b0beb50faa6.tar.gz
SMAPI-6805c90e2cdac734341b692298670b0beb50faa6.tar.bz2
SMAPI-6805c90e2cdac734341b692298670b0beb50faa6.zip
add asset propagation for interior door sprites
-rw-r--r--docs/release-notes.md1
-rw-r--r--src/SMAPI/Metadata/CoreAssetPropagator.cs32
2 files changed, 33 insertions, 0 deletions
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;
}
+ /// <summary>Reload the sprites for interior doors.</summary>
+ /// <param name="content">The content manager through which to reload the asset.</param>
+ /// <param name="key">The asset key to reload.</param>
+ /// <returns>Returns whether any doors were affected.</returns>
+ private bool ReloadDoorSprites(LocalizedContentManager content, string key)
+ {
+ Lazy<Texture2D> texture = new Lazy<Texture2D>(() => content.Load<Texture2D>(key));
+
+ foreach (GameLocation location in this.GetLocations())
+ {
+ IEnumerable<InteriorDoor> 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<string>(door.Sprite, "textureName").GetValue());
+ if (textureName != key)
+ continue;
+
+ door.Sprite.texture = texture.Value;
+ }
+ }
+
+ return texture.IsValueCreated;
+ }
+
/// <summary>Reload the data for matching farm animals.</summary>
/// <returns>Returns whether any farm animals were affected.</returns>
/// <remarks>Derived from the <see cref="FarmAnimal"/> constructor.</remarks>