diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-03-14 14:17:09 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-03-14 14:17:09 -0400 |
commit | 6805c90e2cdac734341b692298670b0beb50faa6 (patch) | |
tree | fad2c0fc89c5338a8b231da28e3237b2a4ddf9bb | |
parent | 04388fe7e3b721358de25d64607d47d5f6113eda (diff) | |
download | SMAPI-6805c90e2cdac734341b692298670b0beb50faa6.tar.gz SMAPI-6805c90e2cdac734341b692298670b0beb50faa6.tar.bz2 SMAPI-6805c90e2cdac734341b692298670b0beb50faa6.zip |
add asset propagation for interior door sprites
-rw-r--r-- | docs/release-notes.md | 1 | ||||
-rw-r--r-- | src/SMAPI/Metadata/CoreAssetPropagator.cs | 32 |
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> |