Ejemplo n.º 1
0
        public override void readPacketData(DataInputStream datainputstream)
        {
            xPosition = datainputstream.readInt();
            yPosition = datainputstream.readShort();
            zPosition = datainputstream.readInt();
            xSize     = datainputstream.read() + 1;
            ySize     = datainputstream.read() + 1;
            zSize     = datainputstream.read() + 1;
            chunkSize = datainputstream.readInt();
            var abyte0 = new byte[chunkSize];

            datainputstream.readFully(abyte0);
            chunk = new byte[(xSize * ySize * zSize * 5) / 2];
            var inflater = new Inflater();

            inflater.setInput(abyte0);
            try
            {
                inflater.inflate(chunk);
            }
            catch (DataFormatException dataformatexception)
            {
                throw new IOException("Bad compressed data format");
            }
            finally
            {
                inflater.end();
            }
        }
        public NbtNode Read(int x, int z)
        {
            lock (this)
            {
                MoveToHeaderPosition(x, z);

                var index = _filePointer.ReadInt32();
                if (index == 0)
                {
                    return(null);            // Not yet generated
                }
                int usedSectors  = index & 0xFF;
                int sectorOffset = index >> 8;

                _filePointer.Seek(sectorOffset * 4096, SeekOrigin.Begin);

                int chunkLength = _filePointer.ReadInt32();
                if (chunkLength == -1)
                {
                    return(null);                   // Not yet generated
                }
                byte compressionMode = _filePointer.ReadByte();

                MemoryStream decompressStream;
                if (compressionMode == 0)
                {
                }
                if (compressionMode == 1)
                {
                    byte[] buffer = new byte[chunkLength];
                    _filePointer.Read(buffer, 0, buffer.Length);
                    buffer           = Decompress(buffer);
                    decompressStream = new MemoryStream(buffer);
                }
                else
                {
                    byte[] buffer = new byte[chunkLength];
                    _filePointer.Read(buffer, 0, buffer.Length);
                    var def = new Inflater();
                    decompressStream = new MemoryStream();
                    def.setInput(buffer);
                    int i = 0;
                    buffer = new byte[1024 * 1024];
                    try
                    {
                        while (!def.finished() && (i = def.inflate(buffer)) > 0)
                        {
                            decompressStream.Write(buffer, 0, i);
                        }
                    }
                    catch
                    {
                        return(null);
                    }
                    decompressStream.Seek(0, SeekOrigin.Begin);
                }
                return(new NbtReader().ReadNbtFile(decompressStream));
            }
        }