/// <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(); }
/// <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; }
/// <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; }