| commit | 5310f6e9f07b82bc0c4f6385c7666e454bf451c6 | [log] [download] |
|---|---|---|
| author | Querz <Querz@users.noreply.github.com> | Wed Apr 05 16:36:52 2017 +0200 |
| committer | GitHub <noreply@github.com> | Wed Apr 05 16:36:52 2017 +0200 |
| tree | ed8cf7180e4fb944af58580b6d632a97dc9885f9 | |
| parent | d1dabb67f27964b5c5ebcc21d6cf7451490a204b [diff] | |
| parent | 7d4ef9283981a35a275c21fb1ef40a8118345172 [diff] |
Merge pull request #4 from Querz/readme Update README.md
According to the specification, there are currently 12 different types of tags:
| Tag class | Superclass | ID | Payload |
|---|---|---|---|
| EndTag | Tag | 0 | None |
| ByteTag | NumberTag | 1 | 1 byte / 8 bits, signed |
| ShortTag | NumberTag | 2 | 2 bytes / 16 bits, signed, big endian |
| IntTag | NumberTag | 3 | 4 bytes / 32 bits, signed, big endian |
| LongTag | NumberTag | 4 | 8 bytes / 64 bits, signed, big endian |
| FloatTag | NumberTag | 5 | 4 bytes / 32 bits, signed, big endian, IEEE 754-2008, binary32 |
| DoubleTag | NumberTag | 6 | 8 bytes / 64 bits, signed, big endian, IEEE 754-2008, binary64 |
| ByteArrayTag | ArrayTag | 7 | IntTag‘s payload size, then size ByteTag’s payloads |
| StringTag | Tag | 8 | ShortTag's payload length, then a UTF-8 string with size length |
| ListTag | Tag | 9 | ByteTag‘s payload tagId, then IntTag’s payload size, then size tags' payloads, all of type tagId |
| CompoundTag | Tag | 10 | Fully formed tags, followed by an EndTag |
| IntArrayTag | ArrayTag | 11 | IntTag‘s payload size, then size IntTag’s payloads |
The EndTag is only used to mark the end of a CompoundTag in its serialized state or an empty ListTag.
The maximum depth of the NBT structure is 512. If the depth exceeds this restriction during serialization, deserialization or String conversion, a MaxDepthReachedException is thrown. This usually happens when a circular reference exists in the NBT structure. The NBT specification does not allow circular references, as there is no tag to represent this.
ByteTag bt = new ByteTag("8bitNumber", (byte) 1);
DoubleTag dt = new DoubleTag("64bitFloatingPointNumber", 1.234);
CompoundTag ct = new CompoundTag("compound");
ct.set(bt);
ct.set(dt);
There are several utility classes that make your life easier using this library.
The NBTFileWriter lets you write a Tag into a gzip compressed or uncompressed file in one line. Files are gzip compressed by default. Example usage:
new NBTFileWriter("filename.dat").write(tag);
The NBTFileReader reads any file containing NBT data. No worry about compression, it will automatically uncompress gzip compressed files. Example usage:
Tag tag = new NBTFileReader("filename.dat").read();
Each tag can be converted into a JSON-like NBT String used in Minecraft commands. Example usage:
CompoundTag c = new CompoundTag("compound");
c.setByte("byte", (byte) 5);
c.setString("string", "test");
String s = c.toTagString();
//output: c:{byte:5b,string:"test"}
Interested in more advanced features, and the default NBT protocol just isn't enough? Simply create your own tags! There are 3 example classes in net.querz.nbt.custom that show how to implement custom tags:
| Class | ID | Description |
|---|---|---|
| CharTag | 110 | Character (char) tag. |
| ShortArrayTag | 100 | In addition to the already existing ByteArrayTag and IntArrayTag. |
| StructTag | 120 | Similar to the ListTag, but with the ability to store multiple types. |
To be able to use a custom tag, it must be registered during runtime with TagType#registerCustomTag(int, Class).