/// <summary> /// Updates the mod group after an edit /// </summary> /// <param name="modGroup">The mod group</param> public void UpdateModGroup(ModGroup modGroup) { var selectionType = "Single"; if (MultiSelectRadioButton.IsChecked == true) { selectionType = "Multi"; } foreach (var modOption in _modOptions) { modOption.GroupName = ModGroupTitle.Text; modOption.SelectionType = selectionType; } modGroup.GroupName = ModGroupTitle.Text; modGroup.SelectionType = selectionType; modGroup.OptionList = _modOptions; }
/// <summary> /// Sets up the wizard page for edit mode /// </summary> /// <param name="modGroup">The mod group that will be edited</param> public void EditMode(ModGroup modGroup) { ModGroupTitle.Text = modGroup.GroupName; _editGroupName = modGroup.GroupName; _editMode = true; if (modGroup.SelectionType.Equals("Single")) { SingleSelectRadioButton.IsChecked = true; } else { MultiSelectRadioButton.IsChecked = true; } _modOptions.AddRange(modGroup.OptionList); foreach (var modOption in modGroup.OptionList) { OptionList.Items.Add(modOption.Name); } }
/// <summary> /// Gets the resulting mod group /// </summary> /// <returns>The mod group</returns> public ModGroup GetResults() { var selectionType = "Single"; if (MultiSelectRadioButton.IsChecked == true) { selectionType = "Multi"; } var modOptionsToRemove = new List <ModOption>(); foreach (var modOption in _modOptions) { if (modOption.Mods.Count < 1) { modOptionsToRemove.Add(modOption); continue; } modOption.GroupName = ModGroupTitle.Text; modOption.SelectionType = selectionType; } foreach (var modOption in modOptionsToRemove) { _modOptions.Remove(modOption); } var modGroup = new ModGroup { GroupName = ModGroupTitle.Text, SelectionType = selectionType, OptionList = _modOptions }; return(modGroup); }
private static void AddMeta(DirectoryInfo baseFolder, DirectoryInfo groupFolder, ModGroup group, ModMeta meta) { var inf = new OptionGroup { SelectionType = group.SelectionType, GroupName = group.GroupName !, Options = new List <Option>(), }; foreach (var opt in group.OptionList !) { var option = new Option { OptionName = opt.Name !, OptionDesc = string.IsNullOrEmpty(opt.Description) ? "" : opt.Description !, OptionFiles = new Dictionary <RelPath, HashSet <GamePath> >(), }; var optDir = new DirectoryInfo(Path.Combine(groupFolder.FullName, opt.Name !.ReplaceInvalidPathSymbols())); if (optDir.Exists) { foreach (var file in optDir.EnumerateFiles("*.*", SearchOption.AllDirectories)) { option.AddFile(new RelPath(file, baseFolder), new GamePath(file, optDir)); } } inf.Options.Add(option); } meta.Groups.Add(inf.GroupName, inf); }
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); } }
private async void LoadFromButton_Click(object sender, System.Windows.RoutedEventArgs e) { var openFileDialog = new OpenFileDialog { Filter = "Texture Files(*.ttmp2)|*.ttmp2", InitialDirectory = Settings.Default.ModPack_Directory }; if (openFileDialog.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } var ttmp = new TTMP(new DirectoryInfo(Settings.Default.ModPack_Directory), XivStrings.TexTools); var ttmpData = await ttmp.GetModPackJsonData(new DirectoryInfo(openFileDialog.FileName)); if (!ttmpData.ModPackJson.TTMPVersion.Contains("w")) { FlexibleMessageBox.Show(new Wpf32Window(this), UIMessages.NotWizardModPack, UIMessages.ModPackLoadingTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var tempMPD = Path.GetTempFileName(); using (var archive = ZipFile.OpenRead(openFileDialog.FileName)) { using (var zipStream = archive.GetEntry("TTMPD.mpd").Open()) { using (var fileStream = new FileStream(tempMPD, FileMode.OpenOrCreate)) { await zipStream.CopyToAsync(fileStream); } } } this.ModPackAuthor.Text = ttmpData.ModPackJson.Author; this.ModPackName.Text = ttmpData.ModPackJson.Name; this.ModPackVersion.Text = ttmpData.ModPackJson.Version; this.ModPackDescription.Text = ttmpData.ModPackJson.Description; for (var i = modPackWizard.Items.Count - 1; i > 0; i--) { modPackWizard.Items.RemoveAt(i); } //var previousPage = modPackWizard.CurrentPage; foreach (var wizPageItemJson in ttmpData.ModPackJson.ModPackPages) { var wizPage = new WizardPage(); wizPage.Background = null; wizPage.HeaderBackground = null; var wizModPackControl = new WizardModPackControl(); wizPage.Content = wizModPackControl; wizPage.PageType = WizardPageType.Blank; foreach (var groupJson in wizPageItemJson.ModGroups) { var modGroup = new ModGroup(); modGroup.OptionList = new List <ModOption>(); modGroup.GroupName = groupJson.GroupName; modGroup.SelectionType = groupJson.SelectionType; wizModPackControl.ModGroupList.Add(modGroup); wizModPackControl.ModGroupNames.Add(modGroup.GroupName); foreach (var optionJson in groupJson.OptionList) { var modOption = new ModOption(); modGroup.OptionList.Add(modOption); modOption.Name = optionJson.Name; modOption.GroupName = optionJson.GroupName; modOption.IsChecked = optionJson.IsChecked; modOption.SelectionType = optionJson.SelectionType; modOption.Description = optionJson.Description; if (optionJson.ImagePath.Length > 0) { using (var zipFile = ZipFile.OpenRead(openFileDialog.FileName)) { using (var stream = zipFile.GetEntry(optionJson.ImagePath).Open()) { var tmpImage = Path.GetTempFileName(); using (var imageStream = File.Open(tmpImage, FileMode.OpenOrCreate)) { await stream.CopyToAsync(imageStream); imageStream.Position = 0; } var fileNameBak = openFileDialog.FileName; openFileDialog.FileName = tmpImage; modOption.Image = Image.Load(openFileDialog.FileName); modOption.ImageFileName = openFileDialog.FileName; openFileDialog.FileName = fileNameBak; } } } foreach (var modJson in optionJson.ModsJsons) { var modData = new ModData(); modData.Category = modJson.Category; modData.FullPath = modJson.FullPath; modData.Name = modJson.Name; using (var br = new BinaryReader(File.OpenRead(tempMPD))) { br.BaseStream.Seek(modJson.ModOffset, SeekOrigin.Begin); modData.ModDataBytes = br.ReadBytes(modJson.ModSize); } modOption.Mods.Add(modData.FullPath, modData); } ((List <ModOption>)wizModPackControl.OptionsList.ItemsSource).Add(modOption); var view = (CollectionView)CollectionViewSource.GetDefaultView(wizModPackControl.OptionsList.ItemsSource); var groupDescription = new PropertyGroupDescription("GroupName"); view.GroupDescriptions.Clear(); view.GroupDescriptions.Add(groupDescription); } if (modGroup.OptionList.Count > 0 && modGroup.OptionList.Count(it => it.IsChecked) == 0) { modGroup.OptionList[0].IsChecked = true; } } modPackWizard.Items.Add(wizPage); modPackWizard.CanHelp = true; } modPackWizard.Items.Add(new WizardPage() { Content = new WizardModPackControl(), PageType = WizardPageType.Blank, Background = null, HeaderBackground = null }); }
// Returns true if property/mod is local, false otherwise. private static bool DetermineLocal(ItemType itemType, ModGroup modGroup, string attr) { if (modGroup == ModGroup.Property || modGroup == ModGroup.Requirement) { // local or not doesn't really apply to properties and requirements return(true); } if (attr == "#% reduced Attribute Requirements" || attr.Contains("+# to Level of Socketed ")) { return(true); } var group = itemType.Group(); // Chance to Block is only local on shields. if (attr == "+#% Chance to Block") { return(group == ItemGroup.Shield); } switch (group) { case ItemGroup.Amulet: case ItemGroup.Ring: case ItemGroup.Belt: case ItemGroup.Unknown: case ItemGroup.Quiver: case ItemGroup.Jewel: case ItemGroup.Gem: // These item types have no local mods. return(false); case ItemGroup.OneHandedWeapon: case ItemGroup.TwoHandedWeapon: if (attr == "#% increased Physical Damage") { // Implicit increased physical damage is global return(modGroup != ModGroup.Implicit); } if (attr == "+# to Accuracy Rating") { // Crafted accuracy is global return(modGroup != ModGroup.Crafted); } return(attr == "#% increased Attack Speed" || attr == "#% increased Accuracy Rating" || attr.StartsWith("Adds ") && (attr.EndsWith(" Damage") || attr.EndsWith(" Damage in Main Hand") || attr.EndsWith(" Damage in Off Hand")) || attr == "#% increased Critical Strike Chance" || attr.Contains("Damage Leeched as") || attr.Contains("Critical Strike Chance with this Weapon") || attr.Contains("Critical Strike Damage Multiplier with this Weapon") || attr == "+# to Weapon range"); case ItemGroup.Shield: case ItemGroup.BodyArmour: case ItemGroup.Boots: case ItemGroup.Gloves: case ItemGroup.Helmet: return((attr.Contains("Armour") && !attr.EndsWith("Armour against Projectiles")) || attr.Contains("Evasion Rating") || (attr.Contains("Energy Shield") && !attr.EndsWith("Energy Shield Recharge"))); default: throw new NotSupportedException("Someone forgot to add a switch case."); } }