diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-01-25 21:53:11 -0500 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-01-25 21:53:11 -0500 |
commit | f1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a (patch) | |
tree | 104d6fb0415287524dbad32431a6d6249155d93b | |
parent | d0dc3ea6f6d03e6aabdab5f5f10a60177f0e53b6 (diff) | |
parent | 082028016993606e8deec84027c781d77e062caa (diff) | |
download | SMAPI-f1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a.tar.gz SMAPI-f1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a.tar.bz2 SMAPI-f1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a.zip |
Merge branch 'develop' into stable
-rw-r--r-- | build/common.targets | 2 | ||||
-rw-r--r-- | docs/release-notes.md | 9 | ||||
-rw-r--r-- | src/SMAPI.Mods.ConsoleCommands/manifest.json | 4 | ||||
-rw-r--r-- | src/SMAPI.Mods.ErrorHandler/manifest.json | 4 | ||||
-rw-r--r-- | src/SMAPI.Mods.SaveBackup/manifest.json | 4 | ||||
-rw-r--r-- | src/SMAPI.Tests/Core/ModResolverTests.cs | 3 | ||||
-rw-r--r-- | src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs | 1 | ||||
-rw-r--r-- | src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs | 3 | ||||
-rw-r--r-- | src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs | 5 | ||||
-rw-r--r-- | src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs | 3 | ||||
-rw-r--r-- | src/SMAPI.Web/wwwroot/SMAPI.metadata.json | 22 | ||||
-rw-r--r-- | src/SMAPI/Constants.cs | 2 | ||||
-rw-r--r-- | src/SMAPI/Framework/ContentCoordinator.cs | 24 | ||||
-rw-r--r-- | src/SMAPI/Framework/ModLoading/ModResolver.cs | 2 | ||||
-rw-r--r-- | src/SMAPI/Metadata/CoreAssetPropagator.cs | 8 |
15 files changed, 60 insertions, 36 deletions
diff --git a/build/common.targets b/build/common.targets index 30c059a3..a38f15a6 100644 --- a/build/common.targets +++ b/build/common.targets @@ -4,7 +4,7 @@ <!--set properties --> <PropertyGroup> - <Version>3.9.0</Version> + <Version>3.9.1</Version> <Product>SMAPI</Product> <LangVersion>latest</LangVersion> diff --git a/docs/release-notes.md b/docs/release-notes.md index 0f83e044..dabdada1 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -7,8 +7,15 @@ * Migrated to Harmony 2.0 (see [_migrate to Harmony 2.0_](https://stardewvalleywiki.com/Modding:Migrate_to_Harmony_2.0) for more info). --> +## 3.9.1 +Released 25 January 2021 for Stardew Valley 1.5.4 or later. + +* For players: + * Fixed _tile contains an invalid TileSheet reference_ crash after mods change certain maps. + * Fixed _patched game code_ issue shown for the bundled Error Handler mod. + ## 3.9 -Released 22 January 2021 for Stardew Valley 1.5.4 or later. +Released 22 January 2021 for Stardew Valley 1.5.4 or later. See [release highlights](https://www.patreon.com/posts/46553874). * For players: * Updated for Stardew Valley 1.5.4. diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json index f2340638..10611e08 100644 --- a/src/SMAPI.Mods.ConsoleCommands/manifest.json +++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json @@ -1,9 +1,9 @@ { "Name": "Console Commands", "Author": "SMAPI", - "Version": "3.9.0", + "Version": "3.9.1", "Description": "Adds SMAPI console commands that let you manipulate the game.", "UniqueID": "SMAPI.ConsoleCommands", "EntryDll": "ConsoleCommands.dll", - "MinimumApiVersion": "3.9.0" + "MinimumApiVersion": "3.9.1" } diff --git a/src/SMAPI.Mods.ErrorHandler/manifest.json b/src/SMAPI.Mods.ErrorHandler/manifest.json index bc0a7294..bb9942d1 100644 --- a/src/SMAPI.Mods.ErrorHandler/manifest.json +++ b/src/SMAPI.Mods.ErrorHandler/manifest.json @@ -1,9 +1,9 @@ { "Name": "Error Handler", "Author": "SMAPI", - "Version": "3.9.0", + "Version": "3.9.1", "Description": "Handles some common vanilla errors to log more useful info or avoid breaking the game.", "UniqueID": "SMAPI.ErrorHandler", "EntryDll": "ErrorHandler.dll", - "MinimumApiVersion": "3.9.0" + "MinimumApiVersion": "3.9.1" } diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json index 79727fad..95ee5144 100644 --- a/src/SMAPI.Mods.SaveBackup/manifest.json +++ b/src/SMAPI.Mods.SaveBackup/manifest.json @@ -1,9 +1,9 @@ { "Name": "Save Backup", "Author": "SMAPI", - "Version": "3.9.0", + "Version": "3.9.1", "Description": "Automatically backs up all your saves once per day into its folder.", "UniqueID": "SMAPI.SaveBackup", "EntryDll": "SaveBackup.dll", - "MinimumApiVersion": "3.9.0" + "MinimumApiVersion": "3.9.1" } diff --git a/src/SMAPI.Tests/Core/ModResolverTests.cs b/src/SMAPI.Tests/Core/ModResolverTests.cs index 78056ef7..28262111 100644 --- a/src/SMAPI.Tests/Core/ModResolverTests.cs +++ b/src/SMAPI.Tests/Core/ModResolverTests.cs @@ -146,8 +146,7 @@ namespace SMAPI.Tests.Core Mock<IModMetadata> mock = this.GetMetadata("Mod A", new string[0], allowStatusChange: true); this.SetupMetadataForValidation(mock, new ModDataRecordVersionedFields { - Status = ModStatus.AssumeBroken, - AlternativeUrl = "https://example.org" + Status = ModStatus.AssumeBroken }); // act diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs index 44422f01..6658d219 100644 --- a/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs +++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs @@ -69,7 +69,6 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData return manifest.UpdateKeys != null && manifest.UpdateKeys.Any(p => !string.IsNullOrWhiteSpace(p)); // non-manifest fields - case ModDataFieldKey.AlternativeUrl: case ModDataFieldKey.StatusReasonPhrase: case ModDataFieldKey.StatusReasonDetails: case ModDataFieldKey.Status: diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs index 068291aa..2b59096d 100644 --- a/src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs +++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs @@ -6,9 +6,6 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData /// <summary>A manifest update key.</summary> UpdateKey, - /// <summary>An alternative URL the player can check for an updated version.</summary> - AlternativeUrl, - /// <summary>The mod's predefined compatibility status.</summary> Status, diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs index f28f6afe..5dd32acf 100644 --- a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs +++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs @@ -92,11 +92,6 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData parsed.UpdateKey = field.Value; break; - // alternative URL - case ModDataFieldKey.AlternativeUrl: - parsed.AlternativeUrl = field.Value; - break; - // status case ModDataFieldKey.Status: parsed.Status = (ModStatus)Enum.Parse(typeof(ModStatus), field.Value, ignoreCase: true); diff --git a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs index f0282eb4..5aaabd51 100644 --- a/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs +++ b/src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs @@ -15,9 +15,6 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData /// <summary>The update key to apply.</summary> public string UpdateKey { get; set; } - /// <summary>The alternative URL the player can check for an updated version.</summary> - public string AlternativeUrl { get; set; } - /// <summary>The predefined compatibility status.</summary> public ModStatus Status { get; set; } = ModStatus.None; diff --git a/src/SMAPI.Web/wwwroot/SMAPI.metadata.json b/src/SMAPI.Web/wwwroot/SMAPI.metadata.json index e75a6bc0..8cc60a73 100644 --- a/src/SMAPI.Web/wwwroot/SMAPI.metadata.json +++ b/src/SMAPI.Web/wwwroot/SMAPI.metadata.json @@ -3,6 +3,7 @@ * Metadata about some SMAPI mods used in compatibility, update, and dependency checks. This * field shouldn't be edited by players in most cases. * + * * Standard fields * =============== * The predefined fields are documented below (only 'ID' is required). Each entry's key is the @@ -14,6 +15,10 @@ * other fields if no ID was specified. This doesn't include the latest ID, if any. Multiple * variants can be separated with '|'. * + * - SuppressWarnings: the mod warnings to suppress, even if they'd normally be shown. This + * should match the ModWarning enum. + * + * * Versioned metadata * ================== * Each record can also specify extra metadata using the field keys below. @@ -44,12 +49,17 @@ * * - StatusReasonDetails: a technical reason shown in TRACE logs, indicating why the status * was overridden. If not provided, it defaults to the StatusReasonPhrase or 'no reason given'. - * - * - AlternativeUrl: a URL where the player can find an unofficial update or alternative if the - * mod is no longer compatible. */ "ModData": { /********* + ** Mods bundles with SMAPI + *********/ + "Error Handler": { + "ID": "SMAPI.ErrorHandler", + "SuppressWarnings": "PatchesGame" + }, + + /********* ** Common dependencies for friendly errors *********/ "Advanced Location Loader": { @@ -186,7 +196,7 @@ "~0.11.2 | Status": "AssumeBroken", "~0.11.2 | StatusReasonDetails": "causes errors and custom furniture no longer work in Stardew Valley 1.5" }, - + "Custom Localization": { "ID": "ZaneYork.CustomLocalization", "FormerIDs": "SMAPI.CustomLocalization", // changed in 1.0.1 @@ -427,13 +437,13 @@ "Fishing Adjust": { "ID": "shuaiz.FishingAdjustMod", "~2.0.1 | Status": "AssumeBroken", - "~2.0.1 | StatusReasonDetails": "fails with 'method not found' error for 'Void Harmony.HarmonyInstance.Patch(System.Reflection.MethodBase, Harmony.HarmonyMethod, Harmony.HarmonyMethod, Harmony.HarmonyMethod)'" + "~2.0.1 | StatusReasonDetails": "fails with 'method not found' error for 'Void Harmony.HarmonyInstance.Patch(System.Reflection.MethodBase, Harmony.HarmonyMethod, Harmony.HarmonyMethod, Harmony.HarmonyMethod)'" }, "Fishing Automaton": { "ID": "Drynwynn.FishingAutomaton", "~1.1 | Status": "AssumeBroken", - "~1.1 | StatusReasonDetails": "runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+" + "~1.1 | StatusReasonDetails": "runtime errors with Harmony 1.2.0.1 in SMAPI 2.8+" }, "More Silo Storage": { diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs index 2adafbbf..57c40bbf 100644 --- a/src/SMAPI/Constants.cs +++ b/src/SMAPI/Constants.cs @@ -54,7 +54,7 @@ namespace StardewModdingAPI ** Public ****/ /// <summary>SMAPI's current semantic version.</summary> - public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("3.9.0"); + public static ISemanticVersion ApiVersion { get; } = new Toolkit.SemanticVersion("3.9.1"); /// <summary>The minimum supported version of Stardew Valley.</summary> public static ISemanticVersion MinimumGameVersion { get; } = new GameVersion("1.5.4"); diff --git a/src/SMAPI/Framework/ContentCoordinator.cs b/src/SMAPI/Framework/ContentCoordinator.cs index 27fb3dbb..77dd6c72 100644 --- a/src/SMAPI/Framework/ContentCoordinator.cs +++ b/src/SMAPI/Framework/ContentCoordinator.cs @@ -99,7 +99,17 @@ namespace StardewModdingAPI.Framework this.OnLoadingFirstAsset = onLoadingFirstAsset; this.FullRootDirectory = Path.Combine(Constants.ExecutionPath, rootDirectory); this.ContentManagers.Add( - this.MainContentManager = new GameContentManager("Game1.content", serviceProvider, rootDirectory, currentCulture, this, monitor, reflection, this.OnDisposing, onLoadingFirstAsset) + this.MainContentManager = new GameContentManager( + name: "Game1.content", + serviceProvider: serviceProvider, + rootDirectory: rootDirectory, + currentCulture: currentCulture, + coordinator: this, + monitor: monitor, + reflection: reflection, + onDisposing: this.OnDisposing, + onLoadingFirstAsset: onLoadingFirstAsset + ) ); this.VanillaContentManager = new LocalizedContentManager(serviceProvider, rootDirectory); this.CoreAssets = new CoreAssetPropagator(this.MainContentManager.AssertAndNormalizeAssetName, reflection); @@ -111,7 +121,17 @@ namespace StardewModdingAPI.Framework { return this.ContentManagerLock.InWriteLock(() => { - GameContentManager manager = new GameContentManager(name, this.MainContentManager.ServiceProvider, this.MainContentManager.RootDirectory, this.MainContentManager.CurrentCulture, this, this.Monitor, this.Reflection, this.OnDisposing, this.OnLoadingFirstAsset); + GameContentManager manager = new GameContentManager( + name: name, + serviceProvider: this.MainContentManager.ServiceProvider, + rootDirectory: this.MainContentManager.RootDirectory, + currentCulture: this.MainContentManager.CurrentCulture, + coordinator: this, + monitor: this.Monitor, + reflection: this.Reflection, + onDisposing: this.OnDisposing, + onLoadingFirstAsset: this.OnLoadingFirstAsset + ); this.ContentManagers.Add(manager); return manager; }); diff --git a/src/SMAPI/Framework/ModLoading/ModResolver.cs b/src/SMAPI/Framework/ModLoading/ModResolver.cs index af7d90f6..c70820e4 100644 --- a/src/SMAPI/Framework/ModLoading/ModResolver.cs +++ b/src/SMAPI/Framework/ModLoading/ModResolver.cs @@ -88,8 +88,6 @@ namespace StardewModdingAPI.Framework.ModLoading if (url != null) updateUrls.Add(url); } - if (mod.DataRecord.AlternativeUrl != null) - updateUrls.Add(mod.DataRecord.AlternativeUrl); // default update URL updateUrls.Add("https://smapi.io/mods"); diff --git a/src/SMAPI/Metadata/CoreAssetPropagator.cs b/src/SMAPI/Metadata/CoreAssetPropagator.cs index 4b911a83..063804e0 100644 --- a/src/SMAPI/Metadata/CoreAssetPropagator.cs +++ b/src/SMAPI/Metadata/CoreAssetPropagator.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using Microsoft.Xna.Framework.Graphics; @@ -79,7 +80,7 @@ namespace StardewModdingAPI.Metadata }); // reload assets - IDictionary<string, bool> propagated = assets.ToDictionary(p => p.Key, p => false, StringComparer.OrdinalIgnoreCase); + IDictionary<string, bool> propagated = assets.ToDictionary(p => p.Key, _ => false, StringComparer.OrdinalIgnoreCase); foreach (var bucket in buckets) { switch (bucket.Key) @@ -110,6 +111,7 @@ namespace StardewModdingAPI.Metadata /// <param name="key">The asset key to reload.</param> /// <param name="type">The asset type to reload.</param> /// <returns>Returns whether an asset was loaded. The return value may be true or false, or a non-null value for true.</returns> + [SuppressMessage("ReSharper", "StringLiteralTypo", Justification = "These deliberately match the asset names.")] private bool PropagateOther(LocalizedContentManager content, string key, Type type) { key = this.AssertAndNormalizeAssetName(key); @@ -492,8 +494,7 @@ namespace StardewModdingAPI.Metadata return true; case "terrainfeatures\\grass": // from Grass - this.ReloadGrassTextures(content, key); - return true; + return this.ReloadGrassTextures(content, key); case "terrainfeatures\\hoedirt": // from HoeDirt HoeDirt.lightTexture = content.Load<Texture2D>(key); @@ -785,6 +786,7 @@ namespace StardewModdingAPI.Metadata private void ReloadMap(GameLocation location) { // reload map + location.interiorDoors.Clear(); // prevent errors when doors try to update tiles which no longer exist location.reloadMap(); location.updateWarps(); location.MakeMapModifications(force: true); |