summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI
diff options
context:
space:
mode:
Diffstat (limited to 'src/StardewModdingAPI')
-rw-r--r--src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs44
-rw-r--r--src/StardewModdingAPI/Framework/Models/ManifestDependency.cs9
-rw-r--r--src/StardewModdingAPI/Framework/Serialisation/ManifestFieldConverter.cs3
-rw-r--r--src/StardewModdingAPI/IManifestDependency.cs3
4 files changed, 41 insertions, 18 deletions
diff --git a/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs b/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs
index e8308f3e..dc140483 100644
--- a/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs
+++ b/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs
@@ -205,20 +205,40 @@ namespace StardewModdingAPI.Framework.ModLoading
return states[mod] = ModDependencyStatus.Sorted;
}
+ // get dependencies
+ var dependencies =
+ (
+ from entry in mod.Manifest.Dependencies
+ let dependencyMod = mods.FirstOrDefault(m => string.Equals(m.Manifest?.UniqueID, entry.UniqueID, StringComparison.InvariantCultureIgnoreCase))
+ orderby entry.UniqueID
+ select (ID: entry.UniqueID, MinVersion: entry.MinimumVersion, Mod: dependencyMod)
+ )
+ .ToArray();
+
// missing required dependencies, mark failed
{
- string[] missingModIDs =
+ string[] failedIDs = (from entry in dependencies where entry.Mod == null select entry.ID).ToArray();
+ if (failedIDs.Any())
+ {
+ sortedMods.Push(mod);
+ mod.SetStatus(ModMetadataStatus.Failed, $"it requires mods which aren't installed ({string.Join(", ", failedIDs)}).");
+ return states[mod] = ModDependencyStatus.Failed;
+ }
+ }
+
+ // dependency min version not met, mark failed
+ {
+ string[] failedLabels =
(
- from dependency in mod.Manifest.Dependencies
- where mods.All(m => m.Manifest?.UniqueID != dependency.UniqueID)
- orderby dependency.UniqueID
- select dependency.UniqueID
+ from entry in dependencies
+ where entry.MinVersion != null && entry.MinVersion.IsNewerThan(entry.Mod.Manifest.Version)
+ select $"{entry.Mod.DisplayName} (needs {entry.MinVersion} or later)"
)
.ToArray();
- if (missingModIDs.Any())
+ if (failedLabels.Any())
{
sortedMods.Push(mod);
- mod.SetStatus(ModMetadataStatus.Failed, $"it requires mods which aren't installed ({string.Join(", ", missingModIDs)}).");
+ mod.SetStatus(ModMetadataStatus.Failed, $"it needs newer versions of some mods: {string.Join(", ", failedLabels)}.");
return states[mod] = ModDependencyStatus.Failed;
}
}
@@ -227,16 +247,8 @@ namespace StardewModdingAPI.Framework.ModLoading
{
states[mod] = ModDependencyStatus.Checking;
- // get mods to load first
- IModMetadata[] modsToLoadFirst =
- (
- from other in mods
- where mod.Manifest.Dependencies.Any(required => required.UniqueID == other.Manifest?.UniqueID)
- select other
- )
- .ToArray();
-
// recursively sort dependencies
+ IModMetadata[] modsToLoadFirst = dependencies.Select(p => p.Mod).ToArray();
foreach (IModMetadata requiredMod in modsToLoadFirst)
{
var subchain = new List<IModMetadata>(currentChain) { mod };
diff --git a/src/StardewModdingAPI/Framework/Models/ManifestDependency.cs b/src/StardewModdingAPI/Framework/Models/ManifestDependency.cs
index 2f580c1d..a0ff0c90 100644
--- a/src/StardewModdingAPI/Framework/Models/ManifestDependency.cs
+++ b/src/StardewModdingAPI/Framework/Models/ManifestDependency.cs
@@ -9,15 +9,22 @@
/// <summary>The unique mod ID to require.</summary>
public string UniqueID { get; set; }
+ /// <summary>The minimum required version (if any).</summary>
+ public ISemanticVersion MinimumVersion { get; set; }
+
/*********
** Public methods
*********/
/// <summary>Construct an instance.</summary>
/// <param name="uniqueID">The unique mod ID to require.</param>
- public ManifestDependency(string uniqueID)
+ /// <param name="minimumVersion">The minimum required version (if any).</param>
+ public ManifestDependency(string uniqueID, string minimumVersion)
{
this.UniqueID = uniqueID;
+ this.MinimumVersion = !string.IsNullOrWhiteSpace(minimumVersion)
+ ? new SemanticVersion(minimumVersion)
+ : null;
}
}
}
diff --git a/src/StardewModdingAPI/Framework/Serialisation/ManifestFieldConverter.cs b/src/StardewModdingAPI/Framework/Serialisation/ManifestFieldConverter.cs
index 6b5a6aaa..7acb5fd0 100644
--- a/src/StardewModdingAPI/Framework/Serialisation/ManifestFieldConverter.cs
+++ b/src/StardewModdingAPI/Framework/Serialisation/ManifestFieldConverter.cs
@@ -51,7 +51,8 @@ namespace StardewModdingAPI.Framework.Serialisation
foreach (JObject obj in JArray.Load(reader).Children<JObject>())
{
string uniqueID = obj.Value<string>(nameof(IManifestDependency.UniqueID));
- result.Add(new ManifestDependency(uniqueID));
+ string minVersion = obj.Value<string>(nameof(IManifestDependency.MinimumVersion));
+ result.Add(new ManifestDependency(uniqueID, minVersion));
}
return result.ToArray();
}
diff --git a/src/StardewModdingAPI/IManifestDependency.cs b/src/StardewModdingAPI/IManifestDependency.cs
index 7bd2e8b6..ebb1140e 100644
--- a/src/StardewModdingAPI/IManifestDependency.cs
+++ b/src/StardewModdingAPI/IManifestDependency.cs
@@ -8,5 +8,8 @@
*********/
/// <summary>The unique mod ID to require.</summary>
string UniqueID { get; }
+
+ /// <summary>The minimum required version (if any).</summary>
+ ISemanticVersion MinimumVersion { get; }
}
}