예제 #1
0
        /// <summary>
        ///     Opens an existing NBT file from a stream.
        /// </summary>
        /// <param name="stream">The stream to get the NBT file from.</param>
        /// <param name="version">The compression version of the NBT, specify '1' for the original gzip compression, '2' for the mcregion zlib compression.</param>
        /// <returns>An opened NBT file.</returns>
        public static NbtFile OpenTag(Stream stream, int version)
        {
            var file = new NbtFile();

            Stream compressStream;

            if (version == 1)
            {
                compressStream = new GZipStream(stream, CompressionMode.Decompress);
            }
            else
            {
                stream.ReadByte();
                stream.ReadByte();

                compressStream = new DeflateStream(stream, CompressionMode.Decompress);
            }

            var reader = new BinaryReader(compressStream);
            {
                Encoding textEncoding = Encoding.UTF8;

                file.NamedNbt = reader.ReadByte() == 10;
                file.RootName = textEncoding.GetString(reader.ReadBytes(EndiannessConverter.ToInt16(reader.ReadInt16())));

                if (file.NamedNbt)
                {
                    byte type;

                    while ((type = reader.ReadByte()) != 0)
                    {
                        file.InsertTag(new NbtTag(textEncoding.GetString(reader.ReadBytes(EndiannessConverter.ToInt16(reader.ReadInt16()))), (NbtTagType)type, ReadPayload(ref reader, type)));
                    }
                }
                else
                {
                    var type = reader.ReadByte();
                    var size = EndiannessConverter.ToInt32(reader.ReadInt32());

                    for (int i = 0; i < size; i++)
                    {
                        file.InsertTag(new NbtTag("", (NbtTagType)type, ReadPayload(ref reader, type)));
                    }
                }
            }

            reader.Dispose();
            compressStream.Dispose();

            return file;
        }