summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-01-25 21:53:11 -0500
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-01-25 21:53:11 -0500
commitf1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a (patch)
tree104d6fb0415287524dbad32431a6d6249155d93b
parentd0dc3ea6f6d03e6aabdab5f5f10a60177f0e53b6 (diff)
parent082028016993606e8deec84027c781d77e062caa (diff)
downloadSMAPI-f1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a.tar.gz
SMAPI-f1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a.tar.bz2
SMAPI-f1505b0ebe5c8fa7cf3c160231f0ed7d1bd6619a.zip
Merge branch 'develop' into stable
-rw-r--r--build/common.targets2
-rw-r--r--docs/release-notes.md9
-rw-r--r--src/SMAPI.Mods.ConsoleCommands/manifest.json4
-rw-r--r--src/SMAPI.Mods.ErrorHandler/manifest.json4
-rw-r--r--src/SMAPI.Mods.SaveBackup/manifest.json4
-rw-r--r--src/SMAPI.Tests/Core/ModResolverTests.cs3
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataField.cs1
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataFieldKey.cs3
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataRecord.cs5
-rw-r--r--src/SMAPI.Toolkit/Framework/ModData/ModDataRecordVersionedFields.cs3
-rw-r--r--src/SMAPI.Web/wwwroot/SMAPI.metadata.json22
-rw-r--r--src/SMAPI/Constants.cs2
-rw-r--r--src/SMAPI/Framework/ContentCoordinator.cs24
-rw-r--r--src/SMAPI/Framework/ModLoading/ModResolver.cs2
-rw-r--r--src/SMAPI/Metadata/CoreAssetPropagator.cs8
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);