示例#1
0
        /// <summary>
        ///     Saves this NBT file to a stream.
        /// </summary>
        /// <param name="stream">The output stream this NBT file will write onto.</param>
        /// <param name="version">The compression version of the NBT, specify '1' for the original gzip compression, '2' for the mcregion zlib compression.</param>
        /// <param name="file">The NBT file to save</param>
        public static void SaveTag(Stream stream, int version, NbtFile file)
        {
            Stream compressStream;

            if (version == 1)
            {
                compressStream = new GZipStream(stream, CompressionMode.Compress);
            }
            else
            {
                stream.WriteByte(0);
                stream.WriteByte(0);

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

            var writer = new BinaryWriter(compressStream);
            {
                writer.Write((byte)(file.NamedNbt ? 10 : 9));
                writer.Write(EndiannessConverter.ToInt16((short)file.RootName.Length));

                byte[] oString = Encoding.UTF8.GetBytes(file.RootName);

                foreach (byte t in oString)
                {
                    writer.Write(t);
                }

                if (file.NamedNbt)
                {
                    foreach (var tag in file.dict)
                    {
                        writer.Write((byte)tag.Value.Type);
                        writer.Write(EndiannessConverter.ToInt16((short)tag.Value.Name.Length));

                        oString = Encoding.UTF8.GetBytes(tag.Value.Name);

                        foreach (byte t in oString)
                        {
                            writer.Write(t);
                        }

                        SavePayload(ref writer, tag.Value.Type, tag.Value.Payload);
                    }
                    writer.Write((byte)0);
                }
                else
                {
                    writer.Write((byte)file.list[0].Type);
                    writer.Write(EndiannessConverter.ToInt32(file.list.Count));

                    foreach (NbtTag t in file.list)
                    {
                        SavePayload(ref writer, file.list[0].Type, t.Payload);
                    }
                }
            }
            writer.Dispose();
            compressStream.Dispose();
        }
示例#2
0
 /// <summary>
 ///     Inserts/replaces a new chunk on a specified location.
 /// </summary>
 /// <param name="location">The region location of the chunk.</param>
 /// <param name="chunk">The chunk to be added.</param>
 public void InsertChunk(Point location, NbtFile chunk)
 {
     Content[location.X + (location.Y * 32)] = chunk;
 }
示例#3
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;
        }