コード例 #1
0
ファイル: ModService.cs プロジェクト: vengefire/ModTechMaster
        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);
        }