Added duplicate package filtering to cs loader. Prioritizes loading LocalMods packages.

This commit is contained in:
MapleWheels
2023-09-23 02:00:08 -04:00
committed by Evil Factory
parent a62b62185f
commit 3708e837e7
@@ -332,10 +332,58 @@ public sealed class CsPackageManager : IDisposable
.ToDictionary(p => p.Key, p=> p.Value)); .ToDictionary(p => p.Key, p=> p.Value));
// filter not to be loaded // filter not to be loaded
var cpToRun = _packageRunConfigs var cpToRunA = _packageRunConfigs
.Where(kvp => ShouldRunPackage(kvp.Key, kvp.Value)) .Where(kvp => ShouldRunPackage(kvp.Key, kvp.Value))
.Select(kvp => kvp.Key) .Select(kvp => kvp.Key)
.ToImmutableList(); .ToHashSet();
//-- filter and remove duplicate mods, prioritize /LocalMods/
HashSet<string> cpNames = new();
HashSet<string> duplicateNames = new();
// search
foreach (ContentPackage package in cpToRunA)
{
if (cpNames.Contains(package.Name))
{
if (!duplicateNames.Contains(package.Name))
{
duplicateNames.Add(package.Name);
}
}
else
{
cpNames.Add(package.Name);
}
}
// remove
foreach (string name in duplicateNames)
{
var duplCpList = cpToRunA
.Where(p => p.Name.Equals(name))
.ToHashSet();
if (duplCpList.Count < 2) // one or less found
continue;
ContentPackage toKeep = null;
foreach (ContentPackage package in duplCpList)
{
if (package.Dir.Contains("LocalMods"))
{
toKeep = package;
break;
}
}
toKeep ??= duplCpList.First();
duplCpList.Remove(toKeep); // remove all but this one
cpToRunA.RemoveWhere(p => duplCpList.Contains(p));
}
var cpToRun = cpToRunA.ToImmutableList();
// build dependencies map // build dependencies map
bool reliableMap = TryBuildDependenciesMap(cpToRun, out var packDeps); bool reliableMap = TryBuildDependenciesMap(cpToRun, out var packDeps);