diff --git a/README.md b/README.md
index 63adcf78..349916cc 100644
--- a/README.md
+++ b/README.md
@@ -85,7 +85,6 @@ folder containing `src`).
StardewModdingAPI
StardewModdingAPI.AssemblyRewriters.dll
StardewModdingAPI.config.json
- StardewModdingAPI.data.json
StardewModdingAPI.exe
StardewModdingAPI.exe.mdb
steam_appid.txt
@@ -97,7 +96,6 @@ folder containing `src`).
Newtonsoft.Json.dll
StardewModdingAPI.AssemblyRewriters.dll
StardewModdingAPI.config.json
- StardewModdingAPI.data.json
StardewModdingAPI.exe
StardewModdingAPI.pdb
StardewModdingAPI.xml
diff --git a/src/StardewModdingAPI/Constants.cs b/src/StardewModdingAPI/Constants.cs
index 76003b69..8b085eac 100644
--- a/src/StardewModdingAPI/Constants.cs
+++ b/src/StardewModdingAPI/Constants.cs
@@ -62,9 +62,6 @@ namespace StardewModdingAPI
/// The file path for the SMAPI configuration file.
internal static string ApiConfigPath => Path.Combine(Constants.ExecutionPath, $"{typeof(Program).Assembly.GetName().Name}.config.json");
- /// The file path for the SMAPI data file containing metadata about known mods.
- internal static string ApiModMetadataPath => Path.Combine(Constants.ExecutionPath, $"{typeof(Program).Assembly.GetName().Name}.data.json");
-
/// The file path to the log where the latest output should be saved.
internal static string LogPath => Path.Combine(Constants.LogDir, "SMAPI-latest.txt");
diff --git a/src/StardewModdingAPI/Framework/Models/UserSettings.cs b/src/StardewModdingAPI/Framework/Models/SConfig.cs
similarity index 56%
rename from src/StardewModdingAPI/Framework/Models/UserSettings.cs
rename to src/StardewModdingAPI/Framework/Models/SConfig.cs
index a0074f77..558da82a 100644
--- a/src/StardewModdingAPI/Framework/Models/UserSettings.cs
+++ b/src/StardewModdingAPI/Framework/Models/SConfig.cs
@@ -1,15 +1,18 @@
namespace StardewModdingAPI.Framework.Models
{
- /// Contains user settings from SMAPI's JSON configuration file.
- internal class UserSettings
+ /// The SMAPI configuration settings.
+ internal class SConfig
{
- /*********
+ /********
** Accessors
- *********/
+ ********/
/// Whether to enable development features.
public bool DeveloperMode { get; set; }
/// Whether to check if a newer version of SMAPI is available on startup.
public bool CheckForUpdates { get; set; } = true;
+
+ /// A list of mod versions which should be considered incompatible.
+ public IncompatibleMod[] IncompatibleMods { get; set; }
}
}
diff --git a/src/StardewModdingAPI/Program.cs b/src/StardewModdingAPI/Program.cs
index b8a16e79..eadbaaeb 100644
--- a/src/StardewModdingAPI/Program.cs
+++ b/src/StardewModdingAPI/Program.cs
@@ -47,8 +47,8 @@ namespace StardewModdingAPI
/// The core logger for SMAPI.
private readonly Monitor Monitor;
- /// The user settings for SMAPI.
- private UserSettings Settings;
+ /// The SMAPI configuration settings.
+ private readonly SConfig Settings;
/// Tracks whether the game should exit immediately and any pending initialisation should be cancelled.
private readonly CancellationTokenSource CancellationTokenSource = new CancellationTokenSource();
@@ -87,6 +87,10 @@ namespace StardewModdingAPI
/// Construct an instance.
internal Program(bool writeToConsole)
{
+ // load settings
+ this.Settings = JsonConvert.DeserializeObject(File.ReadAllText(Constants.ApiConfigPath));
+
+ // initialise
this.Monitor = new Monitor("SMAPI", this.ConsoleManager, this.LogFile, this.ExitGameImmediately) { WriteToConsole = writeToConsole };
this.DeprecationManager = new DeprecationManager(this.Monitor, this.ModRegistry);
}
@@ -99,20 +103,6 @@ namespace StardewModdingAPI
this.Monitor.Log($"SMAPI {Constants.ApiVersion} with Stardew Valley {Game1.version} on {Environment.OSVersion}", LogLevel.Info);
Console.Title = $"SMAPI {Constants.ApiVersion} - running Stardew Valley {Game1.version}";
- // read settings
- {
- string settingsPath = Constants.ApiConfigPath;
- if (File.Exists(settingsPath))
- {
- string json = File.ReadAllText(settingsPath);
- this.Settings = JsonConvert.DeserializeObject(json);
- }
- else
- this.Settings = new UserSettings();
-
- File.WriteAllText(settingsPath, JsonConvert.SerializeObject(this.Settings, Formatting.Indented));
- }
-
// inject compatibility shims
#pragma warning disable 618
Command.Shim(this.CommandManager, this.DeprecationManager, this.ModRegistry);
@@ -341,20 +331,6 @@ namespace StardewModdingAPI
AssemblyLoader modAssemblyLoader = new AssemblyLoader(this.TargetPlatform, this.Monitor);
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => modAssemblyLoader.ResolveAssembly(e.Name);
- // get known incompatible mods
- IDictionary incompatibleMods;
- try
- {
- incompatibleMods = File.Exists(Constants.ApiModMetadataPath)
- ? JsonConvert.DeserializeObject(File.ReadAllText(Constants.ApiModMetadataPath)).ToDictionary(p => p.ID, p => p)
- : new Dictionary(0);
- }
- catch (Exception ex)
- {
- incompatibleMods = new Dictionary();
- this.Monitor.Log($"Couldn't read metadata file at {Constants.ApiModMetadataPath}. SMAPI will still run, but some features may be disabled.\n{ex}", LogLevel.Warn);
- }
-
// load mod assemblies
int modsLoaded = 0;
List deprecationWarnings = new List(); // queue up deprecation warnings to show after mod list
@@ -413,23 +389,26 @@ namespace StardewModdingAPI
}
// validate known incompatible mods
- IncompatibleMod compatibility;
- if (incompatibleMods.TryGetValue(!string.IsNullOrWhiteSpace(manifest.UniqueID) ? manifest.UniqueID : manifest.EntryDll, out compatibility))
{
- if (!compatibility.IsCompatible(manifest.Version))
+ string modKey = !string.IsNullOrWhiteSpace(manifest.UniqueID) ? manifest.UniqueID : manifest.EntryDll;
+ IncompatibleMod compatibility = this.Settings.IncompatibleMods.FirstOrDefault(p => p.ID == modKey);
+ if(compatibility != null)
{
- bool hasOfficialUrl = !string.IsNullOrWhiteSpace(compatibility.UpdateUrl);
- bool hasUnofficialUrl = !string.IsNullOrWhiteSpace(compatibility.UnofficialUpdateUrl);
+ if (!compatibility.IsCompatible(manifest.Version))
+ {
+ bool hasOfficialUrl = !string.IsNullOrWhiteSpace(compatibility.UpdateUrl);
+ bool hasUnofficialUrl = !string.IsNullOrWhiteSpace(compatibility.UnofficialUpdateUrl);
- string reasonPhrase = compatibility.ReasonPhrase ?? "it isn't compatible with the latest version of the game";
- string warning = $"Skipped {compatibility.Name} because {reasonPhrase}. Please check for a version newer than {compatibility.UpperVersion} here:";
- if (hasOfficialUrl)
- warning += !hasUnofficialUrl ? $" {compatibility.UpdateUrl}" : $"{Environment.NewLine}- official mod: {compatibility.UpdateUrl}";
- if (hasUnofficialUrl)
- warning += $"{Environment.NewLine}- unofficial update: {compatibility.UnofficialUpdateUrl}";
+ string reasonPhrase = compatibility.ReasonPhrase ?? "it isn't compatible with the latest version of the game";
+ string warning = $"Skipped {compatibility.Name} because {reasonPhrase}. Please check for a version newer than {compatibility.UpperVersion} here:";
+ if (hasOfficialUrl)
+ warning += !hasUnofficialUrl ? $" {compatibility.UpdateUrl}" : $"{Environment.NewLine}- official mod: {compatibility.UpdateUrl}";
+ if (hasUnofficialUrl)
+ warning += $"{Environment.NewLine}- unofficial update: {compatibility.UnofficialUpdateUrl}";
- this.Monitor.Log(warning, LogLevel.Error);
- continue;
+ this.Monitor.Log(warning, LogLevel.Error);
+ continue;
+ }
}
}
diff --git a/src/StardewModdingAPI/StardewModdingAPI.config.json b/src/StardewModdingAPI/StardewModdingAPI.config.json
index 2abaf73a..e971c324 100644
--- a/src/StardewModdingAPI/StardewModdingAPI.config.json
+++ b/src/StardewModdingAPI/StardewModdingAPI.config.json
@@ -1,4 +1,241 @@
-{
+/*
+
+
+This file contains advanced configuration for SMAPI. You
+generally shouldn't change this file unless necessary.
+
+
+*/
+{
"DeveloperMode": true,
- "CheckForUpdates": true
+ "CheckForUpdates": true,
+ "IncompatibleMods": [
+ /* versions which crash the game */
+ {
+ "Name": "NPC Map Locations",
+ "ID": "NPCMapLocationsMod",
+ "LowerVersion": "1.42",
+ "UpperVersion": "1.43",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/239",
+ "ReasonPhrase": "this version has an update check error which crashes the game"
+ },
+
+ /* versions not compatible with Stardew Valley 1.1+ */
+ {
+ "Name": "Chest Label System",
+ "ID": "SPDChestLabel",
+ "UpperVersion": "1.5",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/242",
+ "UnofficialUpdateUrl": "http://community.playstarbound.com/threads/125031",
+ "ForceCompatibleVersion": "^1.5-EntoPatch"
+ },
+
+ /* versions not compatible with Stardew Valley 1.2+ */
+ {
+ "Name": "AccessChestAnywhere",
+ "ID": "AccessChestAnywhere",
+ "UpperVersion": "1.1",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/257",
+ "UnofficialUpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/518",
+ "Notes": "Crashes with 'Method not found: Void StardewValley.Item.set_Name(System.String)'."
+ },
+ {
+ "Name": "Almighty Tool",
+ "ID": "AlmightyTool.dll",
+ "UpperVersion": "1.1.1",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/439",
+ "Notes": "Uses obsolete StardewModdingAPI.Extensions."
+ },
+ {
+ "Name": "Better Sprinklers",
+ "ID": "SPDSprinklersMod",
+ "UpperVersion": "2.1",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/41",
+ "UnofficialUpdateUrl": "http://community.playstarbound.com/threads/125031",
+ "ForceCompatibleVersion": "^2.1-EntoPatch.7",
+ "Notes": "Uses obsolete StardewModdingAPI.Extensions."
+ },
+ {
+ "Name": "Casks Anywhere",
+ "ID": "CasksAnywhere",
+ "UpperVersion": "1.1",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/878",
+ "Notes": "Uses obsolete StardewModdingAPI.Inheritance.ItemStackChange."
+ },
+ {
+ "Name": "Chests Anywhere",
+ "ID": "ChestsAnywhere",
+ "UpperVersion": "1.8.2",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/518",
+ "Notes": "Crashes with 'Method not found: Void StardewValley.Menus.TextBox.set_Highlighted(Boolean)'."
+ },
+ {
+ "Name": "Chests Anywhere",
+ "ID": "Pathoschild.ChestsAnywhere",
+ "UpperVersion": "1.9-beta",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/518",
+ "Notes": "ID changed in 1.9. Crashes with InvalidOperationException: 'The menu doesn't seem to have a player inventory'."
+ },
+ {
+ "Name": "CJB Automation",
+ "ID": "CJBAutomation",
+ "UpperVersion": "1.4",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/211",
+ "Notes": "Crashes with 'Method not found: Void StardewValley.Item.set_Name(System.String)'."
+ },
+ {
+ "Name": "CJB Cheats Menu",
+ "ID": "CJBCheatsMenu",
+ "UpperVersion": "1.13",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/4",
+ "Notes": "Uses removed Game1.borderFont."
+ },
+ {
+ "Name": "CJB Item Spawner",
+ "ID": "CJBItemSpawner",
+ "UpperVersion": "1.6",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/93",
+ "Notes": "Uses removed Game1.borderFont."
+ },
+ {
+ "Name": "Cooking Skill",
+ "ID": "CookingSkill",
+ "UpperVersion": "1.0.3",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/522",
+ "Notes": "Crashes with 'Method not found: Void StardewValley.Buff..ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.String)'."
+ },
+ {
+ "Name": "Enemy Health Bars",
+ "ID": "SPDHealthBar",
+ "UpperVersion": "1.7",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/193",
+ "Notes": "Uses obsolete GraphicsEvents.DrawTick."
+ },
+ {
+ "Name": "Entoarox Framework",
+ "ID": "eacdb74b-4080-4452-b16b-93773cda5cf9",
+ "UpperVersion": "1.6.5",
+ "UpdateUrl": "http://community.playstarbound.com/resources/4228",
+ "Notes": "Uses obsolete StardewModdingAPI.Inheritance.SObject until 1.6.1; then crashes until 1.6.4 ('Entoarox Framework requested an immediate game shutdown: Fatal error attempting to update player tick properties System.NullReferenceException: Object reference not set to an instance of an object. at Entoarox.Framework.PlayerHelper.Update(Object s, EventArgs e)')."
+ },
+ {
+ "Name": "Extended Fridge",
+ "ID": "Mystra007ExtendedFridge",
+ "UpperVersion": "1.0",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/485",
+ "Notes": "Actual upper version is 0.94, but mod incorrectly sets it to 1.0 in the manifest. Crashes with 'Field not found: StardewValley.Game1.mouseCursorTransparency'."
+ },
+ {
+ "Name": "Get Dressed",
+ "ID": "GetDressed.dll",
+ "UpperVersion": "3.2",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/331",
+ "Notes": "Crashes with NullReferenceException in GameEvents.UpdateTick."
+ },
+ {
+ "Name": "Lookup Anything",
+ "ID": "LookupAnything",
+ "UpperVersion": "1.10",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/541",
+ "Notes": "Crashes with FormatException when looking up NPCs."
+ },
+ {
+ "Name": "Lookup Anything",
+ "ID": "Pathoschild.LookupAnything",
+ "UpperVersion": "1.10.1",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/541",
+ "Notes": "ID changed in 1.10.1. Crashes with FormatException when looking up NPCs."
+ },
+ {
+ "Name": "Makeshift Multiplayer",
+ "ID": "StardewValleyMP",
+ "UpperVersion": "0.2.10",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/501",
+ "Notes": "Uses obsolete GraphicsEvents.OnPreRenderHudEventNoCheck."
+ },
+ {
+ "Name": "NoSoilDecay",
+ "ID": "289dee03-5f38-4d8e-8ffc-e440198e8610",
+ "UpperVersion": "0.5",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/237",
+ "Notes": "Uses Assembly.GetExecutingAssembly().Location."
+ },
+ {
+ "Name": "Point-and-Plant",
+ "ID": "PointAndPlant.dll",
+ "UpperVersion": "1.0.2",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/572",
+ "Notes": "Uses obsolete StardewModdingAPI.Extensions."
+ },
+ {
+ "Name": "Reusable Wallpapers",
+ "ID": "dae1b553-2e39-43e7-8400-c7c5c836134b",
+ "UpperVersion": "1.5",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/356",
+ "Notes": "Uses obsolete StardewModdingAPI.Inheritance.ItemStackChange."
+ },
+ {
+ "Name": "Save Anywhere",
+ "ID": "SaveAnywhere",
+ "UpperVersion": "2.0",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/444",
+ "Notes": "Depends on StarDustCore."
+ },
+ {
+ "Name": "StackSplitX",
+ "ID": "StackSplitX.dll",
+ "UpperVersion": "1.0",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/798",
+ "Notes": "Uses SMAPI's internal SGame class."
+ },
+ {
+ "Name": "StarDustCore",
+ "ID": "StarDustCore",
+ "UpperVersion": "1.0",
+ "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/683",
+ "Notes": "Crashes with 'Method not found: Void StardewModdingAPI.Command.CallCommand(System.String)'."
+ },
+ {
+ "Name": "Teleporter",
+ "ID": "Teleporter",
+ "UpperVersion": "1.0.2",
+ "UpdateUrl": "http://community.playstarbound.com/resources/4374",
+ "Notes": "Crashes with 'InvalidOperationException: The StardewValley.Menus.MapPage object doesn't have a private 'points' instance field'."
+ },
+ {
+ "Name": "Zoryn's Better RNG",
+ "ID": "76b6d1e1-f7ba-4d72-8c32-5a1e6d2716f6",
+ "UpperVersion": "1.5",
+ "UpdateUrl": "http://community.playstarbound.com/threads/108756",
+ "Notes": "Uses SMAPI's internal SGame class."
+ },
+ {
+ "Name": "Zoryn's Calendar Anywhere",
+ "ID": "a41c01cd-0437-43eb-944f-78cb5a53002a",
+ "UpperVersion": "1.5",
+ "UpdateUrl": "http://community.playstarbound.com/threads/108756",
+ "Notes": "Uses SMAPI's internal SGame class."
+ },
+ {
+ "Name": "Zoryn's Health Bars",
+ "ID": "HealthBars.dll",
+ "UpperVersion": "1.5",
+ "UpdateUrl": "http://community.playstarbound.com/threads/108756",
+ "Notes": "Uses SMAPI's internal SGame class."
+ },
+ {
+ "Name": "Zoryn's Movement Mod",
+ "ID": "8a632929-8335-484f-87dd-c29d2ba3215d",
+ "UpperVersion": "1.5",
+ "UpdateUrl": "http://community.playstarbound.com/threads/108756",
+ "Notes": "Uses SMAPI's internal SGame class."
+ },
+ {
+ "Name": "Zoryn's Regen Mod",
+ "ID": "dfac4383-1b6b-4f33-ae4e-37fc23e5252e",
+ "UpperVersion": "1.5",
+ "UpdateUrl": "http://community.playstarbound.com/threads/108756",
+ "Notes": "Uses SMAPI's internal SGame class."
+ }
+ ]
}
diff --git a/src/StardewModdingAPI/StardewModdingAPI.csproj b/src/StardewModdingAPI/StardewModdingAPI.csproj
index 796980cb..72cc1ed2 100644
--- a/src/StardewModdingAPI/StardewModdingAPI.csproj
+++ b/src/StardewModdingAPI/StardewModdingAPI.csproj
@@ -150,6 +150,7 @@
+
@@ -182,7 +183,6 @@
-
@@ -209,9 +209,6 @@
Always
-
- Always
-
Always
@@ -255,7 +252,6 @@
-
diff --git a/src/StardewModdingAPI/StardewModdingAPI.data.json b/src/StardewModdingAPI/StardewModdingAPI.data.json
deleted file mode 100644
index a28dc3e8..00000000
--- a/src/StardewModdingAPI/StardewModdingAPI.data.json
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
-
-
-This file contains advanced metadata for SMAPI. You shouldn't change this file.
-
-
-*/
-[
- /* versions which crash the game */
- {
- "Name": "NPC Map Locations",
- "ID": "NPCMapLocationsMod",
- "LowerVersion": "1.42",
- "UpperVersion": "1.43",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/239",
- "ReasonPhrase": "this version has an update check error which crashes the game"
- },
-
- /* versions not compatible with Stardew Valley 1.1+ */
- {
- "Name": "Chest Label System",
- "ID": "SPDChestLabel",
- "UpperVersion": "1.5",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/242",
- "UnofficialUpdateUrl": "http://community.playstarbound.com/threads/125031",
- "ForceCompatibleVersion": "^1.5-EntoPatch"
- },
-
- /* versions not compatible with Stardew Valley 1.2+ */
- {
- "Name": "AccessChestAnywhere",
- "ID": "AccessChestAnywhere",
- "UpperVersion": "1.1",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/257",
- "UnofficialUpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/518",
- "Notes": "Crashes with 'Method not found: Void StardewValley.Item.set_Name(System.String)'."
- },
- {
- "Name": "Almighty Tool",
- "ID": "AlmightyTool.dll",
- "UpperVersion": "1.1.1",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/439",
- "Notes": "Uses obsolete StardewModdingAPI.Extensions."
- },
- {
- "Name": "Better Sprinklers",
- "ID": "SPDSprinklersMod",
- "UpperVersion": "2.1",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/41",
- "UnofficialUpdateUrl": "http://community.playstarbound.com/threads/125031",
- "ForceCompatibleVersion": "^2.1-EntoPatch.7",
- "Notes": "Uses obsolete StardewModdingAPI.Extensions."
- },
- {
- "Name": "Casks Anywhere",
- "ID": "CasksAnywhere",
- "UpperVersion": "1.1",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/878",
- "Notes": "Uses obsolete StardewModdingAPI.Inheritance.ItemStackChange."
- },
- {
- "Name": "Chests Anywhere",
- "ID": "ChestsAnywhere",
- "UpperVersion": "1.8.2",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/518",
- "Notes": "Crashes with 'Method not found: Void StardewValley.Menus.TextBox.set_Highlighted(Boolean)'."
- },
- {
- "Name": "Chests Anywhere",
- "ID": "Pathoschild.ChestsAnywhere",
- "UpperVersion": "1.9-beta",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/518",
- "Notes": "ID changed in 1.9. Crashes with InvalidOperationException: 'The menu doesn't seem to have a player inventory'."
- },
- {
- "Name": "CJB Automation",
- "ID": "CJBAutomation",
- "UpperVersion": "1.4",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/211",
- "Notes": "Crashes with 'Method not found: Void StardewValley.Item.set_Name(System.String)'."
- },
- {
- "Name": "CJB Cheats Menu",
- "ID": "CJBCheatsMenu",
- "UpperVersion": "1.13",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/4",
- "Notes": "Uses removed Game1.borderFont."
- },
- {
- "Name": "CJB Item Spawner",
- "ID": "CJBItemSpawner",
- "UpperVersion": "1.6",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/93",
- "Notes": "Uses removed Game1.borderFont."
- },
- {
- "Name": "Cooking Skill",
- "ID": "CookingSkill",
- "UpperVersion": "1.0.3",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/522",
- "Notes": "Crashes with 'Method not found: Void StardewValley.Buff..ctor(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, System.String)'."
- },
- {
- "Name": "Enemy Health Bars",
- "ID": "SPDHealthBar",
- "UpperVersion": "1.7",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/193",
- "Notes": "Uses obsolete GraphicsEvents.DrawTick."
- },
- {
- "Name": "Entoarox Framework",
- "ID": "eacdb74b-4080-4452-b16b-93773cda5cf9",
- "UpperVersion": "1.6.5",
- "UpdateUrl": "http://community.playstarbound.com/resources/4228",
- "Notes": "Uses obsolete StardewModdingAPI.Inheritance.SObject until 1.6.1; then crashes until 1.6.4 ('Entoarox Framework requested an immediate game shutdown: Fatal error attempting to update player tick properties System.NullReferenceException: Object reference not set to an instance of an object. at Entoarox.Framework.PlayerHelper.Update(Object s, EventArgs e)')."
- },
- {
- "Name": "Extended Fridge",
- "ID": "Mystra007ExtendedFridge",
- "UpperVersion": "1.0",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/485",
- "Notes": "Actual upper version is 0.94, but mod incorrectly sets it to 1.0 in the manifest. Crashes with 'Field not found: StardewValley.Game1.mouseCursorTransparency'."
- },
- {
- "Name": "Get Dressed",
- "ID": "GetDressed.dll",
- "UpperVersion": "3.2",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/331",
- "Notes": "Crashes with NullReferenceException in GameEvents.UpdateTick."
- },
- {
- "Name": "Lookup Anything",
- "ID": "LookupAnything",
- "UpperVersion": "1.10",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/541",
- "Notes": "Crashes with FormatException when looking up NPCs."
- },
- {
- "Name": "Lookup Anything",
- "ID": "Pathoschild.LookupAnything",
- "UpperVersion": "1.10.1",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/541",
- "Notes": "ID changed in 1.10.1. Crashes with FormatException when looking up NPCs."
- },
- {
- "Name": "Makeshift Multiplayer",
- "ID": "StardewValleyMP",
- "UpperVersion": "0.2.10",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/501",
- "Notes": "Uses obsolete GraphicsEvents.OnPreRenderHudEventNoCheck."
- },
- {
- "Name": "NoSoilDecay",
- "ID": "289dee03-5f38-4d8e-8ffc-e440198e8610",
- "UpperVersion": "0.5",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/237",
- "Notes": "Uses Assembly.GetExecutingAssembly().Location."
- },
- {
- "Name": "Point-and-Plant",
- "ID": "PointAndPlant.dll",
- "UpperVersion": "1.0.2",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/572",
- "Notes": "Uses obsolete StardewModdingAPI.Extensions."
- },
- {
- "Name": "Reusable Wallpapers",
- "ID": "dae1b553-2e39-43e7-8400-c7c5c836134b",
- "UpperVersion": "1.5",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/356",
- "Notes": "Uses obsolete StardewModdingAPI.Inheritance.ItemStackChange."
- },
- {
- "Name": "Save Anywhere",
- "ID": "SaveAnywhere",
- "UpperVersion": "2.0",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/444",
- "Notes": "Depends on StarDustCore."
- },
- {
- "Name": "StackSplitX",
- "ID": "StackSplitX.dll",
- "UpperVersion": "1.0",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/798",
- "Notes": "Uses SMAPI's internal SGame class."
- },
- {
- "Name": "StarDustCore",
- "ID": "StarDustCore",
- "UpperVersion": "1.0",
- "UpdateUrl": "http://www.nexusmods.com/stardewvalley/mods/683",
- "Notes": "Crashes with 'Method not found: Void StardewModdingAPI.Command.CallCommand(System.String)'."
- },
- {
- "Name": "Teleporter",
- "ID": "Teleporter",
- "UpperVersion": "1.0.2",
- "UpdateUrl": "http://community.playstarbound.com/resources/4374",
- "Notes": "Crashes with 'InvalidOperationException: The StardewValley.Menus.MapPage object doesn't have a private 'points' instance field'."
- },
- {
- "Name": "Zoryn's Better RNG",
- "ID": "76b6d1e1-f7ba-4d72-8c32-5a1e6d2716f6",
- "UpperVersion": "1.5",
- "UpdateUrl": "http://community.playstarbound.com/threads/108756",
- "Notes": "Uses SMAPI's internal SGame class."
- },
- {
- "Name": "Zoryn's Calendar Anywhere",
- "ID": "a41c01cd-0437-43eb-944f-78cb5a53002a",
- "UpperVersion": "1.5",
- "UpdateUrl": "http://community.playstarbound.com/threads/108756",
- "Notes": "Uses SMAPI's internal SGame class."
- },
- {
- "Name": "Zoryn's Health Bars",
- "ID": "HealthBars.dll",
- "UpperVersion": "1.5",
- "UpdateUrl": "http://community.playstarbound.com/threads/108756",
- "Notes": "Uses SMAPI's internal SGame class."
- },
- {
- "Name": "Zoryn's Movement Mod",
- "ID": "8a632929-8335-484f-87dd-c29d2ba3215d",
- "UpperVersion": "1.5",
- "UpdateUrl": "http://community.playstarbound.com/threads/108756",
- "Notes": "Uses SMAPI's internal SGame class."
- },
- {
- "Name": "Zoryn's Regen Mod",
- "ID": "dfac4383-1b6b-4f33-ae4e-37fc23e5252e",
- "UpperVersion": "1.5",
- "UpdateUrl": "http://community.playstarbound.com/threads/108756",
- "Notes": "Uses SMAPI's internal SGame class."
- }
-]
diff --git a/src/prepare-install-package.targets b/src/prepare-install-package.targets
index bd9287f1..709bd8d4 100644
--- a/src/prepare-install-package.targets
+++ b/src/prepare-install-package.targets
@@ -28,7 +28,6 @@
-
@@ -43,7 +42,6 @@
-