public void Write(int x, short y, int z, NbtNode node) { lock (this) { NbtWriter writer = new NbtWriter(); MemoryStream stream = new MemoryStream(); writer.WriteFile(stream, node); byte[] buffer = Compress(stream.ToArray()); _sizes.Add(buffer.Length); int usedSectors = ((buffer.Length + 5)%_sectorSize) == 0 ? (buffer.Length + 5) / _sectorSize : (buffer.Length + 5) / _sectorSize + 1; MoveToHeaderPosition(x, y, z); _filePointer.Write(0); int sectorPostion = FindFreeSector(usedSectors); int sector = (sectorPostion << 9) | usedSectors; MoveToHeaderPosition(x,y, z); _filePointer.Write(sector); _filePointer.Seek(_headerSize + sectorPostion*_sectorSize, SeekOrigin.Begin); _filePointer.Write(buffer.Length); _filePointer.Write((byte) 2); //Zlib Compression _filePointer.Write(buffer); _filePointer.Flush(); } }
public void Write(int x, short y, int z, NbtNode node) { lock (this) { NbtWriter writer = new NbtWriter(); MemoryStream stream = new MemoryStream(); writer.WriteFile(stream, node); byte[] buffer = Compress(stream.ToArray()); _sizes.Add(buffer.Length); int usedSectors = ((buffer.Length + 5) % _sectorSize) == 0 ? (buffer.Length + 5) / _sectorSize : (buffer.Length + 5) / _sectorSize + 1; MoveToHeaderPosition(x, y, z); _filePointer.Write(0); int sectorPostion = FindFreeSector(usedSectors); int sector = (sectorPostion << 9) | usedSectors; MoveToHeaderPosition(x, y, z); _filePointer.Write(sector); _filePointer.Seek(_headerSize + sectorPostion * _sectorSize, SeekOrigin.Begin); _filePointer.Write(buffer.Length); _filePointer.Write((byte)2); //Zlib Compression _filePointer.Write(buffer); _filePointer.Flush(); } }
private void WriteNode(BigEndianStream zipped, NbtNode node) { zipped.Write(node.Type); if (node.Type == 0) return; zipped.Write8(node.Name); switch (node.Type) { case 1: zipped.Write(((NbtByte)node).Value); break; case 2: zipped.Write(((NbtShort)node).Value); break; case 3: zipped.Write(((NbtInt)node).Value); break; case 4: zipped.Write(((NbtLong)node).Value); break; case 5: zipped.Write(((NbtFloat)node).Value); break; case 6: zipped.Write(((NbtDouble)node).Value); break; case 7: zipped.Write(((NbtBytes)node).Value.Length); zipped.Write(((NbtBytes)node).Value); break; case 8: zipped.Write8(((NbtString)node).Value); break; case 9: var list = (NbtList) node; zipped.Write(list.TagId); zipped.Write(list.Childs.Count); foreach (var child in list.Childs) { WriteRaw(zipped, list.TagId, child); } break; case 10: var compount = (NbtCompound) node; foreach (var item in compount.Childs) { WriteNode(zipped, item); } WriteNode(zipped, new NbtStop()); break; case 11: zipped.Write(((NbtInts)node).Value.Length); zipped.Write(IntToByteArray(((NbtInts)node).Value)); break; } }
public void Write(int x, int z, NbtNode node) { lock (this) { NbtWriter writer = new NbtWriter(); MemoryStream stream = new MemoryStream(); writer.WriteFile(stream, node); byte[] buffer = Compress(stream.ToArray()); int usedSectors = ((buffer.Length + 5)%4096) == 0 ? (buffer.Length + 5)/4096 : (buffer.Length + 5)/4096 + 1; MoveToHeaderPosition(x, z); _filePointer.Write(0); int sectorPostion = FindFreeSector(usedSectors); Console.WriteLine("Saving chunk {0},{1} at position {2}.", x, z, sectorPostion); int sector = (sectorPostion << 8) | usedSectors; MoveToHeaderPosition(x, z); _filePointer.Write(sector); _filePointer.Seek(sectorPostion*4096, SeekOrigin.Begin); _filePointer.Write(buffer.Length); _filePointer.Write((byte) 1); //GZip Compression _filePointer.Write(buffer); _filePointer.Flush(); } }
public void WriteFile(Stream decompressStream, NbtNode node) { BigEndianStream stream; WriteNode(stream = new BigEndianStream(decompressStream), node); //stream.Flush(); }