public IModCollection LoadCollectionFromPath(string battleTechPath, string modsPath, string name) { this.ModCollection.Name = name; this.ModCollection.Path = modsPath; if (!DirectoryUtils.Exists(modsPath)) { throw new Exception($@"The specified Mods directory [{modsPath}] does not exist."); } var gameDirectoryValid = true; if (!DirectoryUtils.Exists(battleTechPath)) { this.logger.Warn($"The Battle Tech Path [{battleTechPath}] could not be found."); gameDirectoryValid = false; } if (gameDirectoryValid) { var gameDirectoryInfo = new DirectoryInfo(battleTechPath); this.logger.Info($"Processing BattleTech from [{gameDirectoryInfo.FullName}]"); var battleTechMod = this.TryLoadFromPath(gameDirectoryInfo.FullName, true); this.ModCollection.AddModToCollection(battleTechMod); } // find all sub-directories that have a mod.json file var modDirectories = Directory.GetDirectories(modsPath).Where(x => File.Exists(Path.Combine(x, "mod.json"))).ToArray(); // create ModDef objects for each mod.json file HashSet <string> FailedToLoadMods = new HashSet <string>(); Dictionary <string, ModDef> ModDefs = new Dictionary <string, ModDef>(); foreach (var modDirectory in modDirectories) { ModDef modDef; var modDefPath = Path.Combine(modDirectory, "mod.json"); try { modDef = ModDef.CreateFromPath(modDefPath); } catch (Exception e) { FailedToLoadMods.Add(modDefPath); continue; } if (!modDef.ShouldTryLoad(ModDefs.Keys.ToList(), out var reason)) { if (!modDef.IgnoreLoadFailure) { FailedToLoadMods.Add(modDef.Name); } continue; } ModDefs.Add(modDef.Name, modDef); } // get a load order and remove mods that won't be loaded var ModLoadOrder = LoadOrder.CreateLoadOrder(ModDefs, out var notLoaded, new List <string>(), this.logger); var modsDirectoryInfo = new DirectoryInfo(modsPath); this.logger.Info($"Processing mods from [{modsDirectoryInfo.FullName}]"); /*modsDirectoryInfo.GetDirectories() * //.AsParallel().ForAll( * .ToList().ForEach( * sub => * { * this.logger.Debug("."); * var mod = this.TryLoadFromPath(sub.FullName, false); * this.ModCollection.AddModToCollection(mod); * });*/ ModLoadOrder.ForEach( s => { var def = ModDefs.First(pair => pair.Key == s).Value; var mod = this.TryLoadFromPath(def.Directory, false); this.ModCollection.AddModToCollection(mod); }); /*this.ModCollection.Mods.Sort( * (mod, mod1) => mod.IsBattleTech ? 1 : string.Compare(mod.Name, mod1.Name, StringComparison.OrdinalIgnoreCase));*/ this.OnPropertyChanged(nameof(this.ModCollection)); return(this.ModCollection); }