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));
            }
        }
        private object ReadRaw(BigEndianStream zipped, byte tagId)
        {
            switch (tagId)
            {
            case 1:
                return(zipped.ReadByte());

            case 2:
                return(zipped.ReadInt16());

            case 3:
                return(zipped.ReadInt32());

            case 4:
                return(zipped.ReadInt64());

            case 5:
                return(zipped.ReadSingle());

            case 6:
                return(zipped.ReadDouble());

            case 10:
                var     subNodes = new List <NbtNode>();
                NbtNode subNode;
                while ((subNode = ReadNode(zipped)).Type != 0)
                {
                    subNodes.Add(subNode);
                }
                return(subNodes);
            }
            throw new Exception();
        }
示例#3
0
        private int FindFreeSector(int usedSectors)
        {
            var sectors = new List <int>();

            for (int i = 0; i < 32 * 16 * 32; i++)
            {
                _filePointer.Seek(2 + i * sizeof(int), SeekOrigin.Begin);
                int sectorInfo = _filePointer.ReadInt32();
                if (sectorInfo != 0)
                {
                    sectors.Add(sectorInfo);
                }
            }
            if (!sectors.Contains(0))
            {
                sectors.Add(0);
            }
            sectors.Sort();
            int tail = int.MaxValue;

            for (int i = 0; i < sectors.Count; i++)
            {
                int num          = sectors[i];
                int usedS        = num & 0x1FF;
                int sectorOffset = num >> 9;
                if (sectorOffset - tail >= usedSectors)
                {
                    //Found a piece of memory which is big enough
                    return(tail);
                }
                tail = sectorOffset + usedS;
            }

            return(tail);
        }
        private NbtNode ReadNode(BigEndianStream zipped)
        {
            byte    type = (byte)zipped.ReadByte();
            NbtNode node = null;

            switch (type)
            {
            case 0:
                return(new NbtStop());

            case 1:
                node = new NbtByte
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadByte()
                };
                break;

            case 2:
                node = new NbtShort
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadInt16()
                };
                break;

            case 3:
                node = new NbtInt
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadInt32()
                };
                break;

            case 4:
                node = new NbtLong
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadInt64()
                };
                break;

            case 5:
                node = new NbtFloat
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadSingle()
                };
                break;

            case 6:
                node = new NbtDouble
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadDouble()
                };
                break;

            case 7:
                node = new NbtBytes
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadBytes(zipped.ReadInt32())
                };
                break;

            case 8:
                node = new NbtString
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadString8()
                };
                break;

            case 9:
                node = new NbtList();
                ((NbtList)node).Name   = zipped.ReadString8();
                ((NbtList)node).Childs = new List <object>();
                byte tagId = zipped.ReadByte();
                ((NbtList)node).TagId = tagId;
                int length = zipped.ReadInt32();

                for (int i = 0; i < length; i++)
                {
                    ((NbtList)node).Childs.Add(ReadRaw(zipped, tagId));
                }
                break;

            case 10:
                node = new NbtCompound();
                ((NbtCompound)node).Name   = zipped.ReadString8();
                ((NbtCompound)node).Childs = new List <NbtNode>();
                NbtNode subNode;
                while ((subNode = ReadNode(zipped)).Type != 0)
                {
                    ((NbtCompound)node).Childs.Add(subNode);
                }
                break;

            case 11:
                node = new NbtInts
                {
                    Name  = zipped.ReadString8(),
                    Value = ByteToIntArray(zipped.ReadBytes(zipped.ReadInt32() * sizeof(int)))
                };
                break;
            }
            //string str = zipped.ReadString8(100);
            if (node == null)
            {
                throw new Exception();
            }
            return(node);
        }