private void ItemList_ItemSelected(object sender, IItem item) { if (item == null) { return; } SelectedItem = item; var root = item.GetRoot(); TextureMapComboBox.Items.Clear(); ModelTypeComboBox.Items.Clear(); MaterialComboBox.Items.Clear(); if (OptionList.SelectedItem == null) { return; } var modding = new Modding(_gameDirectory); //var modList = modding.GetModList(); var _imc = new Imc(_gameDirectory); int mSet = -1; string metadataFile = null; var models = new List <string>(); var materials = new List <string>(); var textures = new List <string>(); Task.Run(async() => { if (root != null) { // Get ALL THE THINGS // Meta Entries, Models, Materials, Textures, Icons, and VFX Elements. var im = (IItemModel)item; var df = IOUtil.GetDataFileFromPath(root.Info.GetRootFile()); metadataFile = root.Info.GetRootFile(); mSet = await _imc.GetMaterialSetId(im); models = await root.GetModelFiles(); materials = await root.GetMaterialFiles(mSet); textures = await root.GetTextureFiles(mSet); var _tex = new Tex(XivCache.GameInfo.GameDirectory); var icons = await _tex.GetItemIcons(im); foreach (var icon in icons) { textures.Add(icon.Path); } var _atex = new ATex(XivCache.GameInfo.GameDirectory, df); var paths = await _atex.GetAtexPaths(im); foreach (var path in paths) { textures.Add(path.Path); } } else { if (item.GetType() == typeof(XivCharacter)) { // Face Paint/Equipment Decals jank-items. Ugh. if (item.SecondaryCategory == XivStrings.Face_Paint) { var _character = new Character(XivCache.GameInfo.GameDirectory, XivCache.GameInfo.GameLanguage); var paths = await _character.GetDecalPaths(Character.XivDecalType.FacePaint); foreach (var path in paths) { textures.Add(path); } } else if (item.SecondaryCategory == XivStrings.Equipment_Decals) { var _character = new Character(XivCache.GameInfo.GameDirectory, XivCache.GameInfo.GameLanguage); var paths = await _character.GetDecalPaths(Character.XivDecalType.Equipment); foreach (var path in paths) { textures.Add(path); } } } else { // This is a UI item or otherwise an item which has no root, and only has textures. var uiItem = (XivUi)item; var paths = await uiItem.GetTexPaths(); foreach (var kv in paths) { textures.Add(kv.Value); } } } }).Wait(); MetadataPathBox.Text = metadataFile; foreach (var file in models) { var fe = new FileEntry(); fe.Path = file; fe.Name = MakeFriendlyFileName(file); ModelTypeComboBox.Items.Add(fe); } foreach (var file in materials) { var fe = new FileEntry(); fe.Path = file; fe.Name = MakeFriendlyFileName(file); MaterialComboBox.Items.Add(fe); } foreach (var file in textures) { var fe = new FileEntry(); fe.Path = file; fe.Name = MakeFriendlyFileName(file); TextureMapComboBox.Items.Add(fe); } if (String.IsNullOrEmpty(metadataFile)) { AddMetadataButton.IsEnabled = false; } else { AddMetadataButton.IsEnabled = true; } if (TextureMapComboBox.Items.Count > 0) { AddCurrentTextureButton.IsEnabled = true; AddCustomTextureButton.IsEnabled = true; TextureMapComboBox.SelectedIndex = 0; } else { AddCurrentTextureButton.IsEnabled = false; AddCustomTextureButton.IsEnabled = false; } if (ModelTypeComboBox.Items.Count > 0) { AddCurrentModelButton.IsEnabled = true; AdvOptionsButton.IsEnabled = true; ModelTypeComboBox.SelectedIndex = 0; } else { AddCurrentModelButton.IsEnabled = false; AdvOptionsButton.IsEnabled = false; } if (MaterialComboBox.Items.Count > 0) { AddCurrentMaterialButton.IsEnabled = true; MaterialComboBox.SelectedIndex = 0; } else { AddCurrentMaterialButton.IsEnabled = false; } SelectModGroup.IsEnabled = true; }
public async Task AsyncInit() { var root = _item.GetRoot(); if (root == null) { return; } var gd = XivCache.GameInfo.GameDirectory; var lang = XivCache.GameInfo.GameLanguage; var df = IOUtil.GetDataFileFromPath(root.Info.GetRootFile()); var _index = new Index(gd); var _mtrl = new Mtrl(XivCache.GameInfo.GameDirectory); var _mdl = new Mdl(gd, df); var _imc = new Imc(gd); var raceRegex = new Regex("c([0-9]{4})[^b]"); ItemNameBox.Text = _item.Name; var setName = root.Info.GetBaseFileName(false); SetLabel.Text = "Set: " + setName; if (!String.IsNullOrWhiteSpace(root.Info.Slot)) { var niceSlot = Mdl.SlotAbbreviationDictionary.FirstOrDefault(x => x.Value == root.Info.Slot); if (niceSlot.Key != null) { SlotLabel.Text = "Slot: " + niceSlot.Key + " (" + root.Info.Slot + ")"; } else { SlotLabel.Text = "Slot: Unknown (" + root.Info.Slot + ")"; } } else { SlotLabel.Text = "Slot: --"; } var usesImc = Imc.UsesImc(_item); if (usesImc) { VariantLabel.Text = "Variant: " + _item.ModelInfo.ImcSubsetID; } else { VariantLabel.Text = "Variant: --"; } var mSet = await _imc.GetMaterialSetId(_item); if (mSet > 0) { MaterialSetLabel.Text = "Material Set: " + mSet; } else { MaterialSetLabel.Text = "Material Set: --"; } var races = XivRaces.PlayableRaces; var models = await root.GetModelFiles(); var materials = await root.GetMaterialFiles(mSet); #region Race Chart var rowIdx = 1; foreach (var race in races) { var rCode = race.GetRaceCode(); var row = new RowDefinition(); row.Height = new GridLength(30); RacialGrid.RowDefinitions.Add(row); var lBase = new Label(); lBase.Content = race.GetDisplayName(); lBase.SetValue(Grid.RowProperty, rowIdx); RacialGrid.Children.Add(lBase); XivRace?usedMdlRace = race; string usedMdl = null;; if (race != XivRace.All_Races) { // Check if the race has a model. var mdl = models.FirstOrDefault(x => x.Contains("c" + rCode)); if (mdl == null) { // Gotta see which race they're shared from. var node = XivRaceTree.GetNode(race); var parent = node.Parent; while (parent != null) { var code = parent.Race.GetRaceCode(); mdl = models.FirstOrDefault(x => x.Contains("c" + code)); if (mdl != null) { usedMdlRace = parent.Race; usedMdl = mdl; break; } parent = parent.Parent; } if (mdl == null) { // No model exists for this item. usedMdlRace = null; } } else { usedMdl = mdl; } } var mdlRaceString = "None"; if (usedMdlRace == race) { mdlRaceString = "Own"; } else { if (usedMdlRace != null) { mdlRaceString = ((XivRace)usedMdlRace).GetDisplayName(); } } XivRace?usedMtrlRace = usedMdlRace; if (race != XivRace.All_Races) { if (usedMdlRace == null) { usedMtrlRace = null; } else { // Get the materials used by this racial's model. var mdl = usedMdl; var mdlMaterials = await XivCache.GetChildFiles(mdl); var mtrl = mdlMaterials.FirstOrDefault(x => raceRegex.IsMatch(x)); if (mtrl == null) { usedMtrlRace = null; } else { var code = raceRegex.Match(mtrl).Groups[1].Value; usedMtrlRace = XivRaces.GetXivRace(code); if (usedMtrlRace == XivRace.All_Races) { usedMtrlRace = null; } } } } var mtrlRaceString = "None"; if (usedMtrlRace == race) { mtrlRaceString = "Own"; } else { if (usedMtrlRace != null) { mtrlRaceString = ((XivRace)usedMtrlRace).GetDisplayName(); } } var lMdl = new Label(); lMdl.Content = mdlRaceString; lMdl.SetValue(Grid.RowProperty, rowIdx); lMdl.SetValue(Grid.ColumnProperty, 1); RacialGrid.Children.Add(lMdl); var lMtrl = new Label(); lMtrl.Content = mtrlRaceString; lMtrl.SetValue(Grid.RowProperty, rowIdx); lMtrl.SetValue(Grid.ColumnProperty, 2); RacialGrid.Children.Add(lMtrl); rowIdx++; } #endregion if (Imc.UsesImc(_item) && _item.ModelInfo != null) { var myImcSubsetId = _item.ModelInfo.ImcSubsetID; var allItems = await root.GetAllItems(); var fInfo = await _imc.GetFullImcInfo(_item); var entries = fInfo.GetAllEntries(_item.GetItemSlotAbbreviation(), true); foreach (var item in allItems) { SameModelItems.Add(new KeyValuePair <string, IItem>(item.Name, item)); if (entries.Count > item.ModelInfo.ImcSubsetID) { var imSet = entries[item.ModelInfo.ImcSubsetID].MaterialSet; if (mSet == imSet) { SameMSetItems.Add(new KeyValuePair <string, IItem>(item.Name, item)); } } if (item.ModelInfo.ImcSubsetID == myImcSubsetId) { SameVariantItems.Add(new KeyValuePair <string, IItem>(item.Name, item)); } } } }