Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 4
0
        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
            });
        }
Exemplo n.º 7
0
        // 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.");
            }
        }