From 5f5c81b926e56c84c047284bb84a5535f9ca7b60 Mon Sep 17 00:00:00 2001 From: Paul Hebble Date: Wed, 6 Nov 2024 20:26:40 -0600 Subject: [PATCH] Sort dependencies first in modpacks --- Core/Registry/RegistryManager.cs | 30 +++++++++++++++++++----------- GUI/Controls/EditModpack.cs | 2 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Core/Registry/RegistryManager.cs b/Core/Registry/RegistryManager.cs index c0a694e5c..e43c9d31f 100644 --- a/Core/Registry/RegistryManager.cs +++ b/Core/Registry/RegistryManager.cs @@ -501,12 +501,20 @@ public CkanModule GenerateModpack(bool recommends = false, bool with_versions = release_date = DateTime.Now, }; - var rels = registry.InstalledModules - .Where(inst => !inst.Module.IsDLC && !inst.AutoInstalled && IsAvailable(inst)) - .OrderBy(inst => inst.identifier, StringComparer.OrdinalIgnoreCase) - .Select(with_versions ? (Func) RelationshipWithVersion - : RelationshipWithoutVersion) - .ToList(); + var mods = registry.InstalledModules + .Where(inst => !inst.Module.IsDLC && !inst.AutoInstalled && IsAvailable(inst)) + .Select(inst => inst.Module) + .ToHashSet(); + // Sort dependencies before dependers + var resolver = new RelationshipResolver(mods, null, + RelationshipResolverOptions.ConflictsOpts(), + registry, gameInstance.game, gameInstance.VersionCriteria()); + var rels = resolver.ModList() + .Intersect(mods) + .Select(with_versions ? (Func) + RelationshipWithVersion + : RelationshipWithoutVersion) + .ToList(); if (recommends) { @@ -535,17 +543,17 @@ private bool IsAvailable(InstalledModule inst) } } - private RelationshipDescriptor RelationshipWithVersion(InstalledModule inst) + private RelationshipDescriptor RelationshipWithVersion(CkanModule mod) => new ModuleRelationshipDescriptor() { - name = inst.identifier, - version = inst.Module.version, + name = mod.identifier, + version = mod.version, }; - private RelationshipDescriptor RelationshipWithoutVersion(InstalledModule inst) + private RelationshipDescriptor RelationshipWithoutVersion(CkanModule mod) => new ModuleRelationshipDescriptor() { - name = inst.identifier, + name = mod.identifier, }; /// diff --git a/GUI/Controls/EditModpack.cs b/GUI/Controls/EditModpack.cs index 767764c99..b706ee1b2 100644 --- a/GUI/Controls/EditModpack.cs +++ b/GUI/Controls/EditModpack.cs @@ -103,6 +103,7 @@ private void LoadRelationships(CkanModule module, IRegistryQuerier registry) && !module.recommends.Any(rel => rel.ContainsAny(ids)) && !module.suggests.Any(rel => rel.ContainsAny(ids)); }) + .OrderBy(kvp => kvp.Key) .Select(kvp => (RelationshipDescriptor) new ModuleRelationshipDescriptor() { name = kvp.Key, @@ -141,7 +142,6 @@ private void AddGroup(List relationships, { RelationshipsListView.Items.AddRange( relationships.OfType() - .OrderBy(r => r.name) .Select(r => new ListViewItem(new string[] { r.name,