/// <summary> /// The event handler for the add current material button clicked /// </summary> private void AddCurrentMaterialButton_Click(object sender, RoutedEventArgs e) { var dat = new Dat(_gameDirectory); var selectedItem = MaterialComboBox.SelectedItem as ModComboBox; var mod = selectedItem.SelectedMod; var includedMod = new IncludedMods { Name = $"{Path.GetFileNameWithoutExtension(mod.fullPath)} ({((Category)ModListTreeView.SelectedItem).Name})", FullPath = mod.fullPath }; var includedModsList = IncludedModsList.Items.Cast <IncludedMods>().ToList(); if (includedModsList.Any(item => item.Name.Equals(includedMod.Name))) { if (FlexibleMessageBox.Show( string.Format(UIMessages.ExistingOption, includedMod.Name), UIMessages.OverwriteTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { var rawData = dat.GetRawData(mod.data.modOffset, XivDataFiles.GetXivDataFile(mod.datFile), mod.data.modSize); if (rawData == null) { FlexibleMessageBox.Show( string.Format(UIMessages.RawDataErrorMessage, mod.data.modOffset, mod.datFile), UIMessages.ModDataReadErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _selectedModOption.Mods[mod.fullPath].ModDataBytes = rawData; } } else { var rawData = dat.GetRawData(mod.data.modOffset, XivDataFiles.GetXivDataFile(mod.datFile), mod.data.modSize); if (rawData == null) { FlexibleMessageBox.Show( string.Format(UIMessages.RawDataErrorMessage, mod.data.modOffset, mod.datFile), UIMessages.ModDataReadErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var modData = new ModData { Name = mod.name, Category = mod.category, FullPath = mod.fullPath, ModDataBytes = rawData, }; IncludedModsList.Items.Add(includedMod); _selectedModOption.Mods.Add(mod.fullPath, modData); } }
private async Task AddFile(FileEntry file, IItem item, byte[] rawData = null) { var dat = new Dat(_gameDirectory); var index = new Index(_gameDirectory); if (file == null || file.Path == null || _selectedModOption == null) return; var includedModsList = IncludedModsList.Items.Cast<FileEntry>().ToList(); if (includedModsList.Any(f => f.Path.Equals(file.Path))) { if (FlexibleMessageBox.Show( string.Format(UIMessages.ExistingOption, file.Name), UIMessages.OverwriteTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question) != System.Windows.Forms.DialogResult.Yes) { return; } } if (rawData == null) { var df = IOUtil.GetDataFileFromPath(file.Path); var offset = await index.GetDataOffset(file.Path); if (offset <= 0) { FlexibleMessageBox.Show("Cannot include file, file offset invalid.", UIMessages.ModDataReadErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var size = await dat.GetCompressedFileSize(offset, df); rawData = dat.GetRawData(offset, df, size); if (rawData == null) { FlexibleMessageBox.Show("Cannot include file, file offset invalid.", UIMessages.ModDataReadErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } if(_selectedModOption.Mods.ContainsKey(file.Path)) { _selectedModOption.Mods[file.Path].ModDataBytes = rawData; } else { IncludedModsList.Items.Add(file); var modData = new ModData { Name = item.Name, Category = item.SecondaryCategory, FullPath = file.Path, ModDataBytes = rawData, }; _selectedModOption.Mods.Add(file.Path, modData); } }
/// <summary> /// The event handler for the current model button clicked /// </summary> private void AddCurrentModelButton_Click(object sender, RoutedEventArgs e) { var dat = new Dat(_gameDirectory); var selectedItem = ModelTypeComboBox.SelectedItem as ModComboBox; var mod = selectedItem.SelectedMod; var includedMod = new IncludedMods { Name = $"{Path.GetFileNameWithoutExtension(mod.fullPath)} ({((Category)ModListTreeView.SelectedItem).Name})", FullPath = mod.fullPath }; var includedModsList = IncludedModsList.Items.Cast <IncludedMods>().ToList(); if (includedModsList.Any(item => item.Name.Equals(includedMod.Name))) { if (FlexibleMessageBox.Show( $"This Option already includes {includedMod.Name} \n\n Would you like to overwrite the existing mod for this option?", "Overwrite?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { _selectedModOption.Mods[mod.fullPath].ModDataBytes = dat.GetRawData(mod.data.modOffset, XivDataFiles.GetXivDataFile(mod.datFile), mod.data.modSize); } } else { IncludedModsList.Items.Add(includedMod); var modData = new ModData { Name = mod.name, Category = mod.category, FullPath = mod.fullPath, ModDataBytes = dat.GetRawData(mod.data.modOffset, XivDataFiles.GetXivDataFile(mod.datFile), mod.data.modSize) }; _selectedModOption.Mods.Add(mod.fullPath, modData); } }
private async void ExtractButton_Click(object sender, RoutedEventArgs e) { if (String.IsNullOrWhiteSpace(FromBox.Text)) { return; } var path = FromBox.Text; var ext = Path.GetExtension(path); var _dat = new Dat(XivCache.GameInfo.GameDirectory); var _index = new Index(XivCache.GameInfo.GameDirectory); byte[] data = null; var sd = new SaveFileDialog(); if (ext.Length > 0) { ext = ext.Substring(1); sd.Filter = $"{ext.ToUpper()} Files (*.{ext})|*.{ext}"; } sd.FileName = Path.GetFileName(path); sd.RestoreDirectory = true; if (sd.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } try { var offset = await _index.GetDataOffset(path); var df = IOUtil.GetDataFileFromPath(path); if (offset <= 0) { FlexibleMessageBox.Show("File does not exist.\n\nFile: " + path, "File Not Found", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } var type = _dat.GetFileType(offset, df); if (type < 2 || type > 4) { throw new InvalidDataException("Invalid or Unknown Data Type."); } var size = await _dat.GetCompressedFileSize(offset, df); if (type == 2) { if (DecompressType2Box.IsChecked == true) { data = await _dat.GetType2Data(offset, df); } else { data = _dat.GetRawData(offset, df, size); } } if (type == 3) { data = _dat.GetRawData(offset, df, size); } if (type == 4) { data = _dat.GetRawData(offset, df, size); } using (var stream = new BinaryWriter(sd.OpenFile())) { stream.Write(data); } FlexibleMessageBox.Show("Raw file extracted successfully to path:\n" + sd.FileName, "Extraction Success", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } catch (Exception Ex) { FlexibleMessageBox.Show("Unable to decompress or read file:\n" + path + "\n\nError: " + Ex.Message, "File Not Found", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } }
private async Task CreateAdvanced() { string modPackPath = Path.Combine(Properties.Settings.Default.ModPack_Directory, $"{ViewModel.Name}.ttmp2"); if (File.Exists(modPackPath)) { DialogResult overwriteDialogResult = FlexibleMessageBox.Show(new Wpf32Window(this), UIMessages.ModPackOverwriteMessage, UIMessages.OverwriteTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (overwriteDialogResult != System.Windows.Forms.DialogResult.Yes) { return; } } await LockUi(UIStrings.Creating_Modpack, null, null); try { TTMP texToolsModPack = new TTMP(new DirectoryInfo(Settings.Default.ModPack_Directory), XivStrings.TexTools); var index = new Index(XivCache.GameInfo.GameDirectory); var dat = new Dat(XivCache.GameInfo.GameDirectory); var modding = new Modding(XivCache.GameInfo.GameDirectory); var ModList = modding.GetModList(); var wizardData = new ModPackData() { Name = ViewModel.Name, Author = ViewModel.Author, Version = ViewModel.Version, Description = ViewModel.Description, Url = ViewModel.Url, ModPackPages = new List <ModPackData.ModPackPage>() }; var page = new ModPackData.ModPackPage() { PageIndex = 1, ModGroups = new List <ModGroup>() }; wizardData.ModPackPages.Add(page); foreach (var e in ViewModel.Entries) { var item = e.Item; var files = e.AllFiles; var group = new ModGroup() { GroupName = item.Name, SelectionType = "Multi", OptionList = new List <ModOption>() }; page.ModGroups.Add(group); var option = new ModOption { GroupName = group.GroupName, IsChecked = true, Name = GetNiceLevelName(e.Level, true, true), Description = "Item: " + item.Name + "\nInclusion Level: " + GetNiceLevelName(e.Level) + "\nPrimary Files:" + e.MainFiles.Count + "\nTotal Files:" + e.AllFiles.Count, SelectionType = "Multi", }; group.OptionList.Add(option); foreach (var file in e.AllFiles) { var exists = await index.FileExists(file); // This is a funny case where in order to create the modpack we actually have to write a default meta entry to the dats first. // If we had the right functions we could just load and serialize the data, but we don't atm. if (!exists && Path.GetExtension(file) == ".meta") { var meta = await ItemMetadata.GetMetadata(file); await ItemMetadata.SaveMetadata(meta, XivStrings.TexTools); } var offset = await index.GetDataOffset(file); var dataFile = IOUtil.GetDataFileFromPath(file); var compressedSize = await dat.GetCompressedFileSize(offset, dataFile); var modEntry = ModList.Mods.FirstOrDefault(x => x.fullPath == file); var modded = modEntry != null && modEntry.enabled == true; var fData = new ModData { Name = e.Item.Name, Category = e.Item.SecondaryCategory, FullPath = file, IsDefault = !modded, ModDataBytes = dat.GetRawData(offset, dataFile, compressedSize) }; option.Mods.Add(file, fData); } } // Okay modpack is now created internally, just need to save it. var progressIndicator = new Progress <double>(ReportProgressAdv); await texToolsModPack.CreateWizardModPack(wizardData, progressIndicator, true); FlexibleMessageBox.Show(new Wpf32Window(this), "Modpack Created Successfully.", "Modpack Created", MessageBoxButtons.OK, MessageBoxIcon.Information); await UnlockUi(this); DialogResult = true; } catch (Exception ex) { FlexibleMessageBox.Show(new Wpf32Window(this), "An Error occured while creating the modpack.\n\n" + ex.Message, "Modpack Creation Error", MessageBoxButtons.OK, MessageBoxIcon.Error); await UnlockUi(this); } }
/// <summary> /// Creates a mod pack that uses simple installation /// </summary> /// <param name="modPackData">The data that will go into the mod pack</param> /// <param name="gameDirectory">The game directory</param> /// <param name="progress">The progress of the mod pack creation</param> /// <returns>The number of mods processed for the mod pack</returns> public async Task <int> CreateSimpleModPack(SimpleModPackData modPackData, DirectoryInfo gameDirectory, IProgress <double> progress) { var processCount = await Task.Run <int>(() => { var dat = new Dat(gameDirectory); _tempMPD = Path.GetTempFileName(); _tempMPL = Path.GetTempFileName(); var modCount = 1; var modPackJson = new ModPackJson { TTMPVersion = _currentSimpleTTMPVersion, Name = modPackData.Name, Author = modPackData.Author, Version = modPackData.Version.ToString(), Description = modPackData.Description, SimpleModsList = new List <ModsJson>() }; using (var binaryWriter = new BinaryWriter(File.Open(_tempMPD, FileMode.Open))) { foreach (var simpleModData in modPackData.SimpleModDataList) { var modsJson = new ModsJson { Name = simpleModData.Name, Category = simpleModData.Category, FullPath = simpleModData.FullPath, ModSize = simpleModData.ModSize, DatFile = simpleModData.DatFile, ModOffset = binaryWriter.BaseStream.Position }; var rawData = dat.GetRawData((int)simpleModData.ModOffset, XivDataFiles.GetXivDataFile(simpleModData.DatFile), simpleModData.ModSize); binaryWriter.Write(rawData); modPackJson.SimpleModsList.Add(modsJson); progress?.Report((double)modCount / modPackData.SimpleModDataList.Count); modCount++; } } File.WriteAllText(_tempMPL, JsonConvert.SerializeObject(modPackJson)); var modPackPath = $"{_modPackDirectory}\\{modPackData.Name}.ttmp"; if (File.Exists(modPackPath)) { var fileNum = 1; modPackPath = $"{_modPackDirectory}\\{modPackData.Name}({fileNum}).ttmp"; while (File.Exists(modPackPath)) { fileNum++; modPackPath = $"{_modPackDirectory}\\{modPackData.Name}({fileNum}).ttmp"; } } using (var zip = ZipFile.Open(modPackPath, ZipArchiveMode.Create)) { zip.CreateEntryFromFile(_tempMPL, "TTMPL.mpl"); zip.CreateEntryFromFile(_tempMPD, "TTMPD.mpd"); } File.Delete(_tempMPD); File.Delete(_tempMPL); return(modCount); }); return(processCount); }