public ImportWizardModPackControl(ModPackPageJson modPackPage, Dictionary <string, Image> imageDictionary) { InitializeComponent(); MainWindow.MakeHighlander(); _imageDictionary = imageDictionary; OptionsList.ItemsSource = new List <ModOptionJson>(); foreach (var modGroupJson in modPackPage.ModGroups) { if (modGroupJson.SelectionType.Equals("Single")) { var checkedOption = modGroupJson.OptionList.SingleOrDefault(it => it.IsChecked); if (checkedOption == null) { modGroupJson.OptionList[0].IsChecked = true; } } ((List <ModOptionJson>)OptionsList.ItemsSource).AddRange(modGroupJson.OptionList); } var view = (CollectionView)CollectionViewSource.GetDefaultView(OptionsList.ItemsSource); var groupDescription = new PropertyGroupDescription("GroupName"); view.GroupDescriptions.Clear(); view.GroupDescriptions.Add(groupDescription); OptionsList.SelectedIndex = 0; }
public ImportWizardModPackControl(ModPackPageJson modPackPage, Dictionary <string, Image> imageDictionary) { InitializeComponent(); MainWindow.MakeHighlander(); // Just immediately save all the images to the temp folder, because the loading times from ImageSharp are absolutely // awful, and/or leak RAM all over the place otherwise. var tempFolder = Path.GetTempPath(); foreach (var kv in imageDictionary) { try { var newfName = Path.Combine(tempFolder, Guid.NewGuid().ToString()); using (var fstream = new FileStream(newfName, FileMode.OpenOrCreate)) { kv.Value.SaveAsBmp(fstream); } _imgageTempFileDictionary.Add(kv.Key, newfName); } catch (Exception ex) { // No-Op } } OptionsList.ItemsSource = new List <ModOptionJson>(); foreach (var modGroupJson in modPackPage.ModGroups) { if (modGroupJson.SelectionType.Equals("Single")) { var checkedOption = modGroupJson.OptionList.SingleOrDefault(it => it.IsChecked); if (checkedOption == null) { modGroupJson.OptionList[0].IsChecked = true; } } ((List <ModOptionJson>)OptionsList.ItemsSource).AddRange(modGroupJson.OptionList); } var view = (CollectionView)CollectionViewSource.GetDefaultView(OptionsList.ItemsSource); var groupDescription = new PropertyGroupDescription("GroupName"); view.GroupDescriptions.Clear(); view.GroupDescriptions.Add(groupDescription); OptionsList.SelectedIndex = 0; }
/// <summary> /// Creates a mod pack that uses a wizard for installation /// </summary> /// <param name="modPackData">The data that will go into the mod pack</param> /// <param name="progress">The progress of the mod pack creation</param> /// <returns>The number of pages created for the mod pack</returns> public async Task <int> CreateWizardModPack(ModPackData modPackData, IProgress <double> progress, bool overwriteModpack) { var processCount = await Task.Run <int>(() => { _tempMPD = Path.GetTempFileName(); _tempMPL = Path.GetTempFileName(); var imageList = new Dictionary <string, string>(); var pageCount = 1; var modPackJson = new ModPackJson { TTMPVersion = _currentWizardTTMPVersion, Name = modPackData.Name, Author = modPackData.Author, Version = modPackData.Version.ToString(), Description = modPackData.Description, ModPackPages = new List <ModPackPageJson>() }; using (var binaryWriter = new BinaryWriter(File.Open(_tempMPD, FileMode.Open))) { foreach (var modPackPage in modPackData.ModPackPages) { var modPackPageJson = new ModPackPageJson { PageIndex = modPackPage.PageIndex, ModGroups = new List <ModGroupJson>() }; modPackJson.ModPackPages.Add(modPackPageJson); foreach (var modGroup in modPackPage.ModGroups) { var modGroupJson = new ModGroupJson { GroupName = modGroup.GroupName, SelectionType = modGroup.SelectionType, OptionList = new List <ModOptionJson>() }; modPackPageJson.ModGroups.Add(modGroupJson); foreach (var modOption in modGroup.OptionList) { var randomFileName = ""; if (modOption.Image != null) { randomFileName = $"{Path.GetRandomFileName()}.png"; imageList.Add(randomFileName, modOption.ImageFileName); } var modOptionJson = new ModOptionJson { Name = modOption.Name, Description = modOption.Description, ImagePath = randomFileName, GroupName = modOption.GroupName, SelectionType = modOption.SelectionType, IsChecked = modOption.IsChecked, ModsJsons = new List <ModsJson>() }; modGroupJson.OptionList.Add(modOptionJson); foreach (var modOptionMod in modOption.Mods) { var dataFile = GetDataFileFromPath(modOptionMod.Key); var modsJson = new ModsJson { Name = modOptionMod.Value.Name, Category = modOptionMod.Value.Category.GetEnDisplayName(), FullPath = modOptionMod.Key, ModSize = modOptionMod.Value.ModDataBytes.Length, ModOffset = binaryWriter.BaseStream.Position, DatFile = dataFile.GetDataFileName(), }; binaryWriter.Write(modOptionMod.Value.ModDataBytes); modOptionJson.ModsJsons.Add(modsJson); } } } progress?.Report((double)pageCount / modPackData.ModPackPages.Count); pageCount++; } } File.WriteAllText(_tempMPL, JsonConvert.SerializeObject(modPackJson)); var modPackPath = Path.Combine(_modPackDirectory.FullName, $"{modPackData.Name}.ttmp2"); if (File.Exists(modPackPath) && !overwriteModpack) { var fileNum = 1; modPackPath = Path.Combine(_modPackDirectory.FullName, $"{modPackData.Name}({fileNum}).ttmp2"); while (File.Exists(modPackPath)) { fileNum++; modPackPath = Path.Combine(_modPackDirectory.FullName, $"{modPackData.Name}({fileNum}).ttmp2"); } } else if (File.Exists(modPackPath) && overwriteModpack) { File.Delete(modPackPath); } using (var zip = ZipFile.Open(modPackPath, ZipArchiveMode.Create)) { zip.CreateEntryFromFile(_tempMPL, "TTMPL.mpl"); zip.CreateEntryFromFile(_tempMPD, "TTMPD.mpd"); foreach (var image in imageList) { zip.CreateEntryFromFile(image.Value, image.Key); } } File.Delete(_tempMPD); File.Delete(_tempMPL); return(pageCount); }); return(processCount); }
/// <summary> /// Creates a mod pack that uses a wizard for installation /// </summary> /// <param name="modPackData">The data that will go into the mod pack</param> /// <param name="progress">The progress of the mod pack creation</param> /// <returns>The number of pages created for the mod pack</returns> public async Task <int> CreateWizardModPack(ModPackData modPackData, IProgress <double> progress, bool overwriteModpack) { var processCount = await Task.Run <int>(() => { var guid = Guid.NewGuid(); var dir = Path.Combine(Path.GetTempPath(), guid.ToString()); Directory.CreateDirectory(dir); _tempMPD = Path.Combine(dir, "TTMPD.mpd"); _tempMPL = Path.Combine(dir, "TTMPL.mpl"); var imageList = new HashSet <string>(); var pageCount = 1; Version version = modPackData.Version == null ? new Version(1, 0, 0, 0) : modPackData.Version; var modPackJson = new ModPackJson { TTMPVersion = _currentWizardTTMPVersion, MinimumFrameworkVersion = _minimumAssembly, Name = modPackData.Name, Author = modPackData.Author, Version = version.ToString(), Description = modPackData.Description, Url = modPackData.Url, ModPackPages = new List <ModPackPageJson>() }; using (var binaryWriter = new BinaryWriter(File.Open(_tempMPD, FileMode.Create))) { foreach (var modPackPage in modPackData.ModPackPages) { var modPackPageJson = new ModPackPageJson { PageIndex = modPackPage.PageIndex, ModGroups = new List <ModGroupJson>() }; modPackJson.ModPackPages.Add(modPackPageJson); foreach (var modGroup in modPackPage.ModGroups) { var modGroupJson = new ModGroupJson { GroupName = modGroup.GroupName, SelectionType = modGroup.SelectionType, OptionList = new List <ModOptionJson>() }; modPackPageJson.ModGroups.Add(modGroupJson); foreach (var modOption in modGroup.OptionList) { var imageFileName = ""; if (modOption.Image != null) { var fname = Path.GetFileName(modOption.ImageFileName); imageFileName = Path.Combine(dir, fname); File.Copy(modOption.ImageFileName, imageFileName, true); imageList.Add(imageFileName); } var fn = imageFileName == "" ? "" : "images/" + Path.GetFileName(imageFileName); var modOptionJson = new ModOptionJson { Name = modOption.Name, Description = modOption.Description, ImagePath = fn, GroupName = modOption.GroupName, SelectionType = modOption.SelectionType, IsChecked = modOption.IsChecked, ModsJsons = new List <ModsJson>() }; modGroupJson.OptionList.Add(modOptionJson); foreach (var modOptionMod in modOption.Mods) { var dataFile = GetDataFileFromPath(modOptionMod.Key); if (ForbiddenModTypes.Contains(Path.GetExtension(modOptionMod.Key))) { continue; } var modsJson = new ModsJson { Name = modOptionMod.Value.Name, Category = modOptionMod.Value.Category.GetEnDisplayName(), FullPath = modOptionMod.Key, IsDefault = modOptionMod.Value.IsDefault, ModSize = modOptionMod.Value.ModDataBytes.Length, ModOffset = binaryWriter.BaseStream.Position, DatFile = dataFile.GetDataFileName(), }; binaryWriter.Write(modOptionMod.Value.ModDataBytes); modOptionJson.ModsJsons.Add(modsJson); } } } progress?.Report((double)pageCount / modPackData.ModPackPages.Count); pageCount++; } } File.WriteAllText(_tempMPL, JsonConvert.SerializeObject(modPackJson)); var modPackPath = Path.Combine(_modPackDirectory.FullName, $"{modPackData.Name}.ttmp2"); if (File.Exists(modPackPath) && !overwriteModpack) { var fileNum = 1; modPackPath = Path.Combine(_modPackDirectory.FullName, $"{modPackData.Name}({fileNum}).ttmp2"); while (File.Exists(modPackPath)) { fileNum++; modPackPath = Path.Combine(_modPackDirectory.FullName, $"{modPackData.Name}({fileNum}).ttmp2"); } } else if (File.Exists(modPackPath) && overwriteModpack) { File.Delete(modPackPath); } var zf = new ZipFile(); zf.UseZip64WhenSaving = Zip64Option.AsNecessary; zf.CompressionLevel = Ionic.Zlib.CompressionLevel.None; zf.AddFile(_tempMPL, ""); zf.AddFile(_tempMPD, ""); zf.Save(modPackPath); foreach (var image in imageList) { zf.AddFile(image, "images"); } zf.Save(modPackPath); File.Delete(_tempMPD); File.Delete(_tempMPL); return(pageCount); }); return(processCount); }