public static XmbDocument ParseXmb(XmbFile xmb) { var xml = xmb.RootNode.ToXml(xmb.ElementNames, xmb.AttributeNames); xml = XmlFileUtils.PrettyXml(xml); return(new XmbDocument(XDocument.Parse(xml, LoadOptions.SetBaseUri | LoadOptions.SetLineInfo | LoadOptions.PreserveWhitespace))); }
public byte[] GetXmb() { using var ms = new MemoryStream(); using (var bw = new BinaryWriter(ms)) { bw.Write(XmbFile.Deserialize(_xDocument).ToByteArray()); } return(ms.ToArray()); }
public static XmbDocument ParseXmb(BinaryReader reader) { var xmb = XmbFile.Deserialize(reader); return(ParseXmb(xmb)); }
public static void CreateBarFile(IReadOnlyCollection <FileInfo> fileInfos, string inputPath, string outputFileName, string rootDir, bool ignoreLastWriteTime = true, bool xmlToXmb = true) { if (inputPath.EndsWith(Path.DirectorySeparatorChar.ToString())) { inputPath = inputPath.Substring(0, inputPath.Length - 1); } var folder = Path.GetDirectoryName(outputFileName); if (folder != null && !Directory.Exists(folder)) { Directory.CreateDirectory(folder); } var newFilesInfos = new List <FileInfo>(); foreach (var file in fileInfos.ToArray()) { if (file.FullName.EndsWith(".age4scn", StringComparison.OrdinalIgnoreCase)) { if (L33TZipUtils.IsL33TZip(file.FullName)) { var data = L33TZipUtils.DecompressL33TZip(file.FullName); File.Delete(file.FullName); File.WriteAllBytes(file.FullName, data); newFilesInfos.Add(new FileInfo(file.FullName)); } else { newFilesInfos.Add(file); } } else if (xmlToXmb && file.FullName.EndsWith(".quest", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".region", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".tactics", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".character", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".dataset", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".empire", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".spawneritem", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".groupingset", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".set", StringComparison.OrdinalIgnoreCase) || file.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) { if (XmbFile.IsXmlFile(file.FullName)) { XmbFileUtils.XmlFileToXmbFile(file.FullName, file.FullName + ".xmb"); File.Delete(file.FullName); newFilesInfos.Add(new FileInfo(file.FullName + ".xmb")); } else { newFilesInfos.Add(file); } } else { newFilesInfos.Add(file); } } using var fileStream = File.Open(outputFileName, FileMode.Create, FileAccess.Write, FileShare.None); using var writer = new BinaryWriter(fileStream); //Write Bar Header var header = new BarFileHeader(Path.GetFileName(outputFileName), newFilesInfos); writer.Write(header.ToByteArray()); //Write Files var barEntrys = new List <BarEntry>(); foreach (var file in newFilesInfos) { var filePath = file.FullName; barEntrys.Add(new BarEntry(inputPath, file, (int)writer.BaseStream.Position, ignoreLastWriteTime)); using var fileStream2 = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); using var binReader = new BinaryReader(fileStream2); var buffer = new byte[4096]; int read; while ((read = binReader.Read(buffer, 0, buffer.Length)) > 0) { writer.Write(buffer, 0, read); } } //Write Bar Entrys var end = new BarFileBody(rootDir, barEntrys); writer.Write(end.ToByteArray()); }