コード例 #1
0
ファイル: ModpackRead.cs プロジェクト: seiggy/Automaton
        public bool LoadModpack(string modpackPath)
        {
            var modpackEntries       = _archiveContents.GetArchiveEntries(modpackPath);
            var isValidateSuccessful = _modpackValidate.ValidateCorrectModpackStructure(modpackEntries);

            if (!isValidateSuccessful)
            {
                _logger.WriteLine("Validate failure");

                return(false);
            }

            var header = modpackEntries.First(x => x.Key == _modpackStructure.HeaderOffset);

            if (header is null)
            {
                _logger.WriteLine("Header is null");

                return(false);
            }

            // Load modpack header
            var headerMemoryStream = new MemoryStream();

            header.OpenEntryStream().CopyTo(headerMemoryStream);

            var headerObject = ConsumeModpackJsonFile <Header>(headerMemoryStream);

            if (headerObject.ModpackVersion != "1.0b")
            {
                _logger.WriteLine("ModpackVersion mismatch");

                return(false);
            }

            _installBase.ModpackHeader = headerObject;

            // Load in load order config files
            LoadLoadOrderFiles(modpackEntries.ToList());

            // Load each modpack config file
            var modDirectory   = _installBase.ModpackHeader.ModInstallFolders.First();
            var modFileEntries = modpackEntries.Where(x => x.Key.StartsWith(modDirectory) && !x.IsDirectory).ToList();

            foreach (var modFile in modFileEntries)
            {
                var modFileMemoryStream = new MemoryStream();
                modFile.OpenEntryStream().CopyTo(modFileMemoryStream);

                var mod         = ConsumeModpackJsonFile <Mod>(modFileMemoryStream);
                var extendedMod = _classExtensions.ToDerived <Mod, ExtendedMod>(mod);

                extendedMod.DisplayName = extendedMod.NexusFileName;

                if (string.IsNullOrEmpty(extendedMod.NexusFileName))
                {
                    extendedMod.DisplayName = extendedMod.ModName;
                }

                if (string.IsNullOrEmpty(extendedMod.Version))
                {
                    extendedMod.Version = "?";
                }

                _installBase.ModpackMods.Add(extendedMod);
            }

            var test = Assembly.GetExecutingAssembly().GetManifestResourceNames();

            // Load an extended mod object for the specified mod organizer item
            var assembly = Assembly.GetExecutingAssembly();
            var fileName = assembly.GetName().Name + ".ModOrganizer.ModOrganizer" + headerObject.ModOrganizerVersion.ToString() + ".json";

            using (var fileStream = assembly.GetManifestResourceStream(fileName))
            {
                var memoryStream = new MemoryStream();
                fileStream.CopyTo(memoryStream);

                memoryStream.Position = 0;

                var modOrganizerObject         = ConsumeModpackJsonFile <Mod>(memoryStream);
                var extendedModOrganizerObject = _classExtensions.ToDerived <Mod, ExtendedMod>(modOrganizerObject);

                extendedModOrganizerObject.IsModOrganizer = true;

                extendedModOrganizerObject.DisplayName = extendedModOrganizerObject.NexusFileName;

                _installBase.ModpackMods.Add(extendedModOrganizerObject);
            }

            foreach (var entry in modpackEntries.Where(x => !x.IsDirectory))
            {
                if (!entry.IsDirectory && entry.Key.StartsWith("Resources/header."))
                {
                    var memoryStream = new MemoryStream();
                    entry.WriteTo(memoryStream);

                    var bitmapImage = InjectBitmapImages(memoryStream);

                    _installBase.HeaderImage = bitmapImage;
                }
            }

            _logger.WriteLine("Modpack loaded");

            return(true);
        }