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();
            }
        }
Beispiel #2
0
        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();
 }