/// <summary> /// Gets the texture paths from the uld file /// </summary> /// <returns>List of texture paths from the uld file</returns> public async Task <List <string> > GetTexFromUld() { var uldLock = new object(); var hashedFolder = HashGenerator.GetHash("ui/uld"); var index = new Index(_gameDirectory); var dat = new Dat(_gameDirectory); var uldStringList = new HashSet <string>(); var uldOffsetList = await index.GetAllFileOffsetsInFolder(hashedFolder, XivDataFile._06_Ui); await Task.Run(() => Parallel.ForEach(uldOffsetList, (offset) => { byte[] uldData; try { uldData = dat.GetType2Data(offset, XivDataFile._06_Ui).Result; } catch (Exception ex) { Debug.WriteLine($"Error at offset: {offset}"); Debug.WriteLine($"Message: {ex.Message}"); return; } if (uldData.Length < 10) { return; } using (var br = new BinaryReader(new MemoryStream(uldData))) { var signature = br.ReadInt32(); if (signature != 1751411829) { return; } br.ReadBytes(56); int pathCount = br.ReadByte(); br.ReadBytes(7); for (var i = 0; i < pathCount; i++) { var pathNum = br.ReadInt32(); while (pathNum != i + 1) { pathNum = br.ReadInt32(); } var path = Encoding.UTF8.GetString(br.ReadBytes(48)).Replace("\0", ""); path = new string(path.Where(c => !char.IsControl(c)).ToArray()); if (path.Length <= 2 || !path.Contains("uld")) { continue; } var uldPath = path.Substring(0, path.LastIndexOf(".", StringComparison.Ordinal) + 4); lock (uldLock) { uldStringList.Add(uldPath); } } } })); return(uldStringList.ToList()); }