private void writeToStream(Stream writeStream) { fireDebug("Writing U8 File..."); //Update Rootnode fireDebug(" Updating Rootnode..."); rootNode.SizeOfData = (uint)u8Nodes.Count + 1; MemoryStream u8Stream = new MemoryStream(); //Write Stringtable u8Stream.Seek(u8Header.OffsetToRootNode + ((u8Nodes.Count + 1) * 12), SeekOrigin.Begin); fireDebug(" Writing String Table... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper()); u8Stream.WriteByte(0x00); int stringTablePosition = (int)u8Stream.Position - 1; for (int i = 0; i < u8Nodes.Count; i++) { fireDebug(" -> Entry #{1} of {2}: \"{3}\"... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper(), i + 1, u8Nodes.Count, stringTable[i]); u8Nodes[i].OffsetToName = (ushort)(u8Stream.Position - stringTablePosition); byte[] stringBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(stringTable[i]); u8Stream.Write(stringBytes, 0, stringBytes.Length); u8Stream.WriteByte(0x00); } u8Header.HeaderSize = (uint)(u8Stream.Position - u8Header.OffsetToRootNode); u8Header.OffsetToData = 0; //Write Data for (int i = 0; i < u8Nodes.Count; i++) { fireProgress((i + 1) * 100 / u8Nodes.Count); if (u8Nodes[i].Type == U8_NodeType.File) { u8Stream.Seek(Shared.AddPadding((int)u8Stream.Position, dataPadding), SeekOrigin.Begin); fireDebug(" Writing Data #{1} of {2}... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper(), i + 1, u8Nodes.Count); if (u8Header.OffsetToData == 0) { u8Header.OffsetToData = (uint)u8Stream.Position; } u8Nodes[i].OffsetToData = (uint)u8Stream.Position; u8Nodes[i].SizeOfData = (uint)data[i].Length; u8Stream.Write(data[i], 0, data[i].Length); } else { fireDebug(" Node #{0} of {1} is a Directory...", i + 1, u8Nodes.Count); } } //Pad End to 16 bytes while (u8Stream.Position % 16 != 0) { u8Stream.WriteByte(0x00); } //Write Header + Nodes u8Stream.Seek(0, SeekOrigin.Begin); fireDebug(" Writing Header... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper()); u8Header.Write(u8Stream); fireDebug(" Writing Rootnode... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper()); rootNode.Write(u8Stream); for (int i = 0; i < u8Nodes.Count; i++) { fireDebug(" Writing Node Entry #{1} of {2}... (Offset: 0x{0})", u8Stream.Position.ToString("x8").ToUpper(), i + 1, u8Nodes.Count); u8Nodes[i].Write(u8Stream); } byte[] u8Array = u8Stream.ToArray(); u8Stream.Dispose(); if (lz77) { fireDebug(" Lz77 Compressing U8 File..."); Lz77 l = new Lz77(); u8Array = l.Compress(u8Array); } //Write File Header if (headerType == Headers.HeaderType.IMD5) { fireDebug(" Adding IMD5 Header..."); writeStream.Seek(0, SeekOrigin.Begin); Headers.IMD5 h = Headers.IMD5.Create(u8Array); h.Write(writeStream); } else if (headerType == Headers.HeaderType.IMET || headerType == Headers.HeaderType.ShortIMET) { fireDebug(" Adding IMET Header..."); ((Headers.IMET)header).IconSize = (uint)iconSize; ((Headers.IMET)header).BannerSize = (uint)bannerSize; ((Headers.IMET)header).SoundSize = (uint)soundSize; writeStream.Seek(0, SeekOrigin.Begin); ((Headers.IMET)header).Write(writeStream); } writeStream.Write(u8Array, 0, u8Array.Length); fireDebug("Writing U8 File Finished..."); }