summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/SCore.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-09-04 22:02:59 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-09-04 22:02:59 -0400
commit4088f4cb2bfe777cf6f86ac5fbf64f7d67565057 (patch)
tree859199135d654f7bf6b356a8b20ff5259bf51025 /src/SMAPI/Framework/SCore.cs
parentf57feb7319725513fadde8b14d55f4e8e4b82c24 (diff)
downloadSMAPI-4088f4cb2bfe777cf6f86ac5fbf64f7d67565057.tar.gz
SMAPI-4088f4cb2bfe777cf6f86ac5fbf64f7d67565057.tar.bz2
SMAPI-4088f4cb2bfe777cf6f86ac5fbf64f7d67565057.zip
simplify error shown for duplicate mods
Diffstat (limited to 'src/SMAPI/Framework/SCore.cs')
-rw-r--r--src/SMAPI/Framework/SCore.cs21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs
index bfe6e277..52b4b9cf 100644
--- a/src/SMAPI/Framework/SCore.cs
+++ b/src/SMAPI/Framework/SCore.cs
@@ -1339,9 +1339,10 @@ namespace StardewModdingAPI.Framework
// load mods
foreach (IModMetadata mod in mods)
{
- if (!this.TryLoadMod(mod, mods, modAssemblyLoader, proxyFactory, jsonHelper, contentCore, modDatabase, suppressUpdateChecks, out string errorPhrase, out string errorDetails))
+ if (!this.TryLoadMod(mod, mods, modAssemblyLoader, proxyFactory, jsonHelper, contentCore, modDatabase, suppressUpdateChecks, out ModFailReason? failReason, out string errorPhrase, out string errorDetails))
{
- mod.SetStatus(ModMetadataStatus.Failed, errorPhrase, errorDetails);
+ failReason ??= ModFailReason.LoadFailed;
+ mod.SetStatus(ModMetadataStatus.Failed, failReason.Value, errorPhrase, errorDetails);
skippedMods.Add(mod);
}
}
@@ -1437,16 +1438,17 @@ namespace StardewModdingAPI.Framework
/// <summary>Load a given mod.</summary>
/// <param name="mod">The mod to load.</param>
/// <param name="mods">The mods being loaded.</param>
- /// <param name="assemblyLoader">Preprocesses and loads mod assemblies</param>
+ /// <param name="assemblyLoader">Preprocesses and loads mod assemblies.</param>
/// <param name="proxyFactory">Generates proxy classes to access mod APIs through an arbitrary interface.</param>
/// <param name="jsonHelper">The JSON helper with which to read mods' JSON files.</param>
/// <param name="contentCore">The content manager to use for mod content.</param>
/// <param name="modDatabase">Handles access to SMAPI's internal mod metadata list.</param>
/// <param name="suppressUpdateChecks">The mod IDs to ignore when validating update keys.</param>
+ /// <param name="failReason">The reason the mod couldn't be loaded, if applicable.</param>
/// <param name="errorReasonPhrase">The user-facing reason phrase explaining why the mod couldn't be loaded (if applicable).</param>
/// <param name="errorDetails">More detailed details about the error intended for developers (if any).</param>
/// <returns>Returns whether the mod was successfully loaded.</returns>
- private bool TryLoadMod(IModMetadata mod, IModMetadata[] mods, AssemblyLoader assemblyLoader, InterfaceProxyFactory proxyFactory, JsonHelper jsonHelper, ContentCoordinator contentCore, ModDatabase modDatabase, HashSet<string> suppressUpdateChecks, out string errorReasonPhrase, out string errorDetails)
+ private bool TryLoadMod(IModMetadata mod, IModMetadata[] mods, AssemblyLoader assemblyLoader, InterfaceProxyFactory proxyFactory, JsonHelper jsonHelper, ContentCoordinator contentCore, ModDatabase modDatabase, HashSet<string> suppressUpdateChecks, out ModFailReason? failReason, out string errorReasonPhrase, out string errorDetails)
{
errorDetails = null;
@@ -1469,6 +1471,7 @@ namespace StardewModdingAPI.Framework
if (mod.Status == ModMetadataStatus.Failed)
{
this.Monitor.Log($" Failed: {mod.Error}");
+ failReason = mod.FailReason;
errorReasonPhrase = mod.Error;
return false;
}
@@ -1485,6 +1488,7 @@ namespace StardewModdingAPI.Framework
.FirstOrDefault(otherMod => otherMod.HasID(dependency.UniqueID))
?.DisplayName ?? dependency.UniqueID;
errorReasonPhrase = $"it needs the '{dependencyName}' mod, which couldn't be loaded.";
+ failReason = ModFailReason.MissingDependencies;
return false;
}
}
@@ -1502,6 +1506,7 @@ namespace StardewModdingAPI.Framework
this.ModRegistry.Add(mod);
errorReasonPhrase = null;
+ failReason = null;
return true;
}
@@ -1524,17 +1529,20 @@ namespace StardewModdingAPI.Framework
{
string[] updateUrls = new[] { modDatabase.GetModPageUrlFor(manifest.UniqueID), "https://smapi.io/mods" }.Where(p => p != null).ToArray();
errorReasonPhrase = $"it's no longer compatible. Please check for a new version at {string.Join(" or ", updateUrls)}";
+ failReason = ModFailReason.Incompatible;
return false;
}
catch (SAssemblyLoadFailedException ex)
{
errorReasonPhrase = $"its DLL couldn't be loaded: {ex.Message}";
+ failReason = ModFailReason.LoadFailed;
return false;
}
catch (Exception ex)
{
errorReasonPhrase = "its DLL couldn't be loaded.";
errorDetails = $"Error: {ex.GetLogSummary()}";
+ failReason = ModFailReason.LoadFailed;
return false;
}
@@ -1543,7 +1551,10 @@ namespace StardewModdingAPI.Framework
{
// get mod instance
if (!this.TryLoadModEntry(modAssembly, out Mod modEntry, out errorReasonPhrase))
+ {
+ failReason = ModFailReason.LoadFailed;
return false;
+ }
// get content packs
IContentPack[] GetContentPacks()
@@ -1591,11 +1602,13 @@ namespace StardewModdingAPI.Framework
// track mod
mod.SetMod(modEntry, translationHelper);
this.ModRegistry.Add(mod);
+ failReason = null;
return true;
}
catch (Exception ex)
{
errorReasonPhrase = $"initialization failed:\n{ex.GetLogSummary()}";
+ failReason = ModFailReason.LoadFailed;
return false;
}
}