TAG_Byte_Array
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class ByteArrayTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final byte[] value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public ByteArrayTag(String name, byte[] value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public byte[] getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder hex = new StringBuilder();
+ for(byte b : value) {
+ String hexDigits = Integer.toHexString(b).toUpperCase();
+ if(hexDigits.length() == 1) {
+ hex.append("0");
+ }
+ hex.append(hexDigits).append(" ");
+ }
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_Byte_Array" + append + ": " + hex.toString();
+ }
+
+}
diff --git a/lib/org/jnbt/ByteTag.java b/lib/org/jnbt/ByteTag.java
new file mode 100644
index 0000000..611d056
--- /dev/null
+++ b/lib/org/jnbt/ByteTag.java
@@ -0,0 +1,73 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The TAG_Byte
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class ByteTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final byte value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public ByteTag(String name, byte value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public Byte getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_Byte" + append + ": " + value;
+ }
+
+}
diff --git a/lib/org/jnbt/CompoundTag.java b/lib/org/jnbt/CompoundTag.java
new file mode 100644
index 0000000..d3119f5
--- /dev/null
+++ b/lib/org/jnbt/CompoundTag.java
@@ -0,0 +1,82 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * The TAG_Compound
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class CompoundTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final MapTAG_Double
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class DoubleTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final double value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public DoubleTag(String name, double value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public Double getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_Double" + append + ": " + value;
+ }
+
+}
diff --git a/lib/org/jnbt/EndTag.java b/lib/org/jnbt/EndTag.java
new file mode 100644
index 0000000..e0eca42
--- /dev/null
+++ b/lib/org/jnbt/EndTag.java
@@ -0,0 +1,60 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The TAG_End
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class EndTag extends Tag {
+
+ /**
+ * Creates the tag.
+ */
+ public EndTag() {
+ super("");
+ }
+
+ @Override
+ public Object getValue() {
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return "TAG_End";
+ }
+
+}
diff --git a/lib/org/jnbt/FloatTag.java b/lib/org/jnbt/FloatTag.java
new file mode 100644
index 0000000..459e710
--- /dev/null
+++ b/lib/org/jnbt/FloatTag.java
@@ -0,0 +1,73 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The TAG_Float
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class FloatTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final float value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public FloatTag(String name, float value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public Float getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_Float" + append + ": " + value;
+ }
+
+}
diff --git a/lib/org/jnbt/IntTag.java b/lib/org/jnbt/IntTag.java
new file mode 100644
index 0000000..d2b0039
--- /dev/null
+++ b/lib/org/jnbt/IntTag.java
@@ -0,0 +1,73 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The TAG_Int
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class IntTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final int value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public IntTag(String name, int value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public Integer getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_Int" + append + ": " + value;
+ }
+
+}
diff --git a/lib/org/jnbt/ListTag.java b/lib/org/jnbt/ListTag.java
new file mode 100644
index 0000000..1849f19
--- /dev/null
+++ b/lib/org/jnbt/ListTag.java
@@ -0,0 +1,97 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * The TAG_List
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class ListTag extends Tag {
+
+ /**
+ * The type.
+ */
+ private final Class extends Tag> type;
+
+ /**
+ * The value.
+ */
+ private final ListTAG_Long
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class LongTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final long value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public LongTag(String name, long value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public Long getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_Long" + append + ": " + value;
+ }
+
+}
diff --git a/lib/org/jnbt/NBTConstants.java b/lib/org/jnbt/NBTConstants.java
new file mode 100644
index 0000000..65bd622
--- /dev/null
+++ b/lib/org/jnbt/NBTConstants.java
@@ -0,0 +1,72 @@
+package org.jnbt;
+
+import java.nio.charset.Charset;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * A class which holds constant values.
+ * @author Graham Edgecombe
+ *
+ */
+public final class NBTConstants {
+
+ /**
+ * The character set used by NBT (UTF-8).
+ */
+ public static final Charset CHARSET = Charset.forName("UTF-8");
+
+ /**
+ * Tag type constants.
+ */
+ public static final int TYPE_END = 0,
+ TYPE_BYTE = 1,
+ TYPE_SHORT = 2,
+ TYPE_INT = 3,
+ TYPE_LONG = 4,
+ TYPE_FLOAT = 5,
+ TYPE_DOUBLE = 6,
+ TYPE_BYTE_ARRAY = 7,
+ TYPE_STRING = 8,
+ TYPE_LIST = 9,
+ TYPE_COMPOUND = 10;
+
+ /**
+ * Default private constructor.
+ */
+ private NBTConstants() {
+
+ }
+
+}
diff --git a/lib/org/jnbt/NBTInputStream.java b/lib/org/jnbt/NBTInputStream.java
new file mode 100644
index 0000000..7a92b87
--- /dev/null
+++ b/lib/org/jnbt/NBTInputStream.java
@@ -0,0 +1,179 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.io.Closeable;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.GZIPInputStream;
+
+/**
+ * This class reads NBT, or
+ * Named Binary Tag streams, and produces an object graph of
+ * subclasses of the Tag
object.
The NBT format was created by Markus Persson, and the specification may + * be found at + * http://www.minecraft.net/docs/NBT.txt.
+ * @author Graham Edgecombe + * + */ +public final class NBTInputStream implements Closeable { + + /** + * The data input stream. + */ + private final DataInputStream is; + + /** + * Creates a newNBTInputStream
, which will source its data
+ * from the specified input stream.
+ * @param is The input stream.
+ * @throws IOException if an I/O error occurs.
+ */
+ public NBTInputStream(InputStream is) throws IOException {
+ this.is = new DataInputStream(new GZIPInputStream(is));
+ }
+
+ /**
+ * Reads an NBT tag from the stream.
+ * @return The tag that was read.
+ * @throws IOException if an I/O error occurs.
+ */
+ public Tag readTag() throws IOException {
+ return readTag(0);
+ }
+
+ /**
+ * Reads an NBT from the stream.
+ * @param depth The depth of this tag.
+ * @return The tag that was read.
+ * @throws IOException if an I/O error occurs.
+ */
+ private Tag readTag(int depth) throws IOException {
+ int type = is.readByte() & 0xFF;
+
+ String name;
+ if(type != NBTConstants.TYPE_END) {
+ int nameLength = is.readShort() & 0xFFFF;
+ byte[] nameBytes = new byte[nameLength];
+ is.readFully(nameBytes);
+ name = new String(nameBytes, NBTConstants.CHARSET);
+ } else {
+ name = "";
+ }
+
+ return readTagPayload(type, name, depth);
+ }
+
+ /**
+ * Reads the payload of a tag, given the name and type.
+ * @param type The type.
+ * @param name The name.
+ * @param depth The depth.
+ * @return The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private Tag readTagPayload(int type, String name, int depth) throws IOException {
+ switch(type) {
+ case NBTConstants.TYPE_END:
+ if(depth == 0) {
+ throw new IOException("TAG_End found without a TAG_Compound/TAG_List tag preceding it.");
+ } else {
+ return new EndTag();
+ }
+ case NBTConstants.TYPE_BYTE:
+ return new ByteTag(name, is.readByte());
+ case NBTConstants.TYPE_SHORT:
+ return new ShortTag(name, is.readShort());
+ case NBTConstants.TYPE_INT:
+ return new IntTag(name, is.readInt());
+ case NBTConstants.TYPE_LONG:
+ return new LongTag(name, is.readLong());
+ case NBTConstants.TYPE_FLOAT:
+ return new FloatTag(name, is.readFloat());
+ case NBTConstants.TYPE_DOUBLE:
+ return new DoubleTag(name, is.readDouble());
+ case NBTConstants.TYPE_BYTE_ARRAY:
+ int length = is.readInt();
+ byte[] bytes = new byte[length];
+ is.readFully(bytes);
+ return new ByteArrayTag(name, bytes);
+ case NBTConstants.TYPE_STRING:
+ length = is.readShort();
+ bytes = new byte[length];
+ is.readFully(bytes);
+ return new StringTag(name, new String(bytes, NBTConstants.CHARSET));
+ case NBTConstants.TYPE_LIST:
+ int childType = is.readByte();
+ length = is.readInt();
+
+ ListThis class writes NBT, or
+ * Named Binary Tag Tag
objects to an underlying
+ * OutputStream
.
The NBT format was created by Markus Persson, and the specification may + * be found at + * http://www.minecraft.net/docs/NBT.txt.
+ * @author Graham Edgecombe + * + */ +public final class NBTOutputStream implements Closeable { + + /** + * The output stream. + */ + public final DataOutputStream os; + + /** + * Creates a newNBTOutputStream
, which will write data to the
+ * specified underlying output stream.
+ * @param os The output stream.
+ * @throws IOException if an I/O error occurs.
+ */
+ public NBTOutputStream(OutputStream os) throws IOException {
+ this.os = new DataOutputStream(new GZIPOutputStream(os));
+ }
+
+ /**
+ * Writes a tag.
+ * @param tag The tag to write.
+ * @throws IOException if an I/O error occurs.
+ */
+ public void writeTag(Tag tag) throws IOException {
+ int type = NBTUtils.getTypeCode(tag.getClass());
+ String name = tag.getName();
+ byte[] nameBytes = name.getBytes(NBTConstants.CHARSET);
+
+ os.writeByte(type);
+ os.writeShort(nameBytes.length);
+ os.write(nameBytes);
+
+ if(type == NBTConstants.TYPE_END) {
+ throw new IOException("Named TAG_End not permitted.");
+ }
+
+ writeTagPayload(tag);
+ }
+
+ /**
+ * Writes tag payload.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeTagPayload(Tag tag) throws IOException {
+ int type = NBTUtils.getTypeCode(tag.getClass());
+ switch(type) {
+ case NBTConstants.TYPE_END:
+ writeEndTagPayload((EndTag) tag);
+ break;
+ case NBTConstants.TYPE_BYTE:
+ writeByteTagPayload((ByteTag) tag);
+ break;
+ case NBTConstants.TYPE_SHORT:
+ writeShortTagPayload((ShortTag) tag);
+ break;
+ case NBTConstants.TYPE_INT:
+ writeIntTagPayload((IntTag) tag);
+ break;
+ case NBTConstants.TYPE_LONG:
+ writeLongTagPayload((LongTag) tag);
+ break;
+ case NBTConstants.TYPE_FLOAT:
+ writeFloatTagPayload((FloatTag) tag);
+ break;
+ case NBTConstants.TYPE_DOUBLE:
+ writeDoubleTagPayload((DoubleTag) tag);
+ break;
+ case NBTConstants.TYPE_BYTE_ARRAY:
+ writeByteArrayTagPayload((ByteArrayTag) tag);
+ break;
+ case NBTConstants.TYPE_STRING:
+ writeStringTagPayload((StringTag) tag);
+ break;
+ case NBTConstants.TYPE_LIST:
+ writeListTagPayload((ListTag) tag);
+ break;
+ case NBTConstants.TYPE_COMPOUND:
+ writeCompoundTagPayload((CompoundTag) tag);
+ break;
+ default:
+ throw new IOException("Invalid tag type: " + type + ".");
+ }
+ }
+
+ /**
+ * Writes a TAG_Byte
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeByteTagPayload(ByteTag tag) throws IOException {
+ os.writeByte(tag.getValue());
+ }
+
+ /**
+ * Writes a TAG_Byte_Array
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeByteArrayTagPayload(ByteArrayTag tag) throws IOException {
+ byte[] bytes = tag.getValue();
+ os.writeInt(bytes.length);
+ os.write(bytes);
+ }
+
+ /**
+ * Writes a TAG_Compound
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeCompoundTagPayload(CompoundTag tag) throws IOException {
+ for(Tag childTag : tag.getValue().values()) {
+ writeTag(childTag);
+ }
+ os.writeByte((byte) 0); // end tag - better way?
+ }
+
+ /**
+ * Writes a TAG_List
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeListTagPayload(ListTag tag) throws IOException {
+ Class extends Tag> clazz = tag.getType();
+ ListTAG_String
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeStringTagPayload(StringTag tag) throws IOException {
+ byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET);
+ os.writeShort(bytes.length);
+ os.write(bytes);
+ }
+
+ /**
+ * Writes a TAG_Double
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeDoubleTagPayload(DoubleTag tag) throws IOException {
+ os.writeDouble(tag.getValue());
+ }
+
+ /**
+ * Writes a TAG_Float
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeFloatTagPayload(FloatTag tag) throws IOException {
+ os.writeFloat(tag.getValue());
+ }
+
+ /**
+ * Writes a TAG_Long
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeLongTagPayload(LongTag tag) throws IOException {
+ os.writeLong(tag.getValue());
+ }
+
+ /**
+ * Writes a TAG_Int
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeIntTagPayload(IntTag tag) throws IOException {
+ os.writeInt(tag.getValue());
+ }
+
+ /**
+ * Writes a TAG_Short
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeShortTagPayload(ShortTag tag) throws IOException {
+ os.writeShort(tag.getValue());
+ }
+
+ /**
+ * Writes a TAG_Empty
tag.
+ * @param tag The tag.
+ * @throws IOException if an I/O error occurs.
+ */
+ private void writeEndTagPayload(EndTag tag) {
+ /* empty */
+ }
+
+ @Override
+ public void close() throws IOException {
+ os.close();
+ }
+
+}
diff --git a/lib/org/jnbt/NBTUtils.java b/lib/org/jnbt/NBTUtils.java
new file mode 100644
index 0000000..ff18bb4
--- /dev/null
+++ b/lib/org/jnbt/NBTUtils.java
@@ -0,0 +1,152 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * A class which contains NBT-related utility methods.
+ * @author Graham Edgecombe
+ *
+ */
+public final class NBTUtils {
+
+ /**
+ * Gets the type name of a tag.
+ * @param clazz The tag class.
+ * @return The type name.
+ */
+ public static String getTypeName(Class extends Tag> clazz) {
+ if(clazz.equals(ByteArrayTag.class)) {
+ return "TAG_Byte_Array";
+ } else if(clazz.equals(ByteTag.class)) {
+ return "TAG_Byte";
+ } else if(clazz.equals(CompoundTag.class)) {
+ return "TAG_Compound";
+ } else if(clazz.equals(DoubleTag.class)) {
+ return "TAG_Double";
+ } else if(clazz.equals(EndTag.class)) {
+ return "TAG_End";
+ } else if(clazz.equals(FloatTag.class)) {
+ return "TAG_Float";
+ } else if(clazz.equals(IntTag.class)) {
+ return "TAG_Int";
+ } else if(clazz.equals(ListTag.class)) {
+ return "TAG_List";
+ } else if(clazz.equals(LongTag.class)) {
+ return "TAG_Long";
+ } else if(clazz.equals(ShortTag.class)) {
+ return "TAG_Short";
+ } else if(clazz.equals(StringTag.class)) {
+ return "TAG_String";
+ } else {
+ throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
+ }
+ }
+
+ /**
+ * Gets the type code of a tag class.
+ * @param clazz The tag class.
+ * @return The type code.
+ * @throws IllegalArgumentException if the tag class is invalid.
+ */
+ public static int getTypeCode(Class extends Tag> clazz) {
+ if(clazz.equals(ByteArrayTag.class)) {
+ return NBTConstants.TYPE_BYTE_ARRAY;
+ } else if(clazz.equals(ByteTag.class)) {
+ return NBTConstants.TYPE_BYTE;
+ } else if(clazz.equals(CompoundTag.class)) {
+ return NBTConstants.TYPE_COMPOUND;
+ } else if(clazz.equals(DoubleTag.class)) {
+ return NBTConstants.TYPE_DOUBLE;
+ } else if(clazz.equals(EndTag.class)) {
+ return NBTConstants.TYPE_END;
+ } else if(clazz.equals(FloatTag.class)) {
+ return NBTConstants.TYPE_FLOAT;
+ } else if(clazz.equals(IntTag.class)) {
+ return NBTConstants.TYPE_INT;
+ } else if(clazz.equals(ListTag.class)) {
+ return NBTConstants.TYPE_LIST;
+ } else if(clazz.equals(LongTag.class)) {
+ return NBTConstants.TYPE_LONG;
+ } else if(clazz.equals(ShortTag.class)) {
+ return NBTConstants.TYPE_SHORT;
+ } else if(clazz.equals(StringTag.class)) {
+ return NBTConstants.TYPE_STRING;
+ } else {
+ throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
+ }
+ }
+
+ /**
+ * Gets the class of a type of tag.
+ * @param type The type.
+ * @return The class.
+ * @throws IllegalArgumentException if the tag type is invalid.
+ */
+ public static Class extends Tag> getTypeClass(int type) {
+ switch(type) {
+ case NBTConstants.TYPE_END:
+ return EndTag.class;
+ case NBTConstants.TYPE_BYTE:
+ return ByteTag.class;
+ case NBTConstants.TYPE_SHORT:
+ return ShortTag.class;
+ case NBTConstants.TYPE_INT:
+ return IntTag.class;
+ case NBTConstants.TYPE_LONG:
+ return LongTag.class;
+ case NBTConstants.TYPE_FLOAT:
+ return FloatTag.class;
+ case NBTConstants.TYPE_DOUBLE:
+ return DoubleTag.class;
+ case NBTConstants.TYPE_BYTE_ARRAY:
+ return ByteArrayTag.class;
+ case NBTConstants.TYPE_STRING:
+ return StringTag.class;
+ case NBTConstants.TYPE_LIST:
+ return ListTag.class;
+ case NBTConstants.TYPE_COMPOUND:
+ return CompoundTag.class;
+ default:
+ throw new IllegalArgumentException("Invalid tag type : " + type + ".");
+ }
+ }
+
+ /**
+ * Default private constructor.
+ */
+ private NBTUtils() {
+
+ }
+
+}
diff --git a/lib/org/jnbt/ShortTag.java b/lib/org/jnbt/ShortTag.java
new file mode 100644
index 0000000..17d06c0
--- /dev/null
+++ b/lib/org/jnbt/ShortTag.java
@@ -0,0 +1,73 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The TAG_Short
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class ShortTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final short value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public ShortTag(String name, short value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public Short getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_Short" + append + ": " + value;
+ }
+
+}
diff --git a/lib/org/jnbt/StringTag.java b/lib/org/jnbt/StringTag.java
new file mode 100644
index 0000000..99466d5
--- /dev/null
+++ b/lib/org/jnbt/StringTag.java
@@ -0,0 +1,73 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * The TAG_String
tag.
+ * @author Graham Edgecombe
+ *
+ */
+public final class StringTag extends Tag {
+
+ /**
+ * The value.
+ */
+ private final String value;
+
+ /**
+ * Creates the tag.
+ * @param name The name.
+ * @param value The value.
+ */
+ public StringTag(String name, String value) {
+ super(name);
+ this.value = value;
+ }
+
+ @Override
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ String name = getName();
+ String append = "";
+ if(name != null && !name.equals("")) {
+ append = "(\"" + this.getName() + "\")";
+ }
+ return "TAG_String" + append + ": " + value;
+ }
+
+}
diff --git a/lib/org/jnbt/Tag.java b/lib/org/jnbt/Tag.java
new file mode 100644
index 0000000..786344c
--- /dev/null
+++ b/lib/org/jnbt/Tag.java
@@ -0,0 +1,70 @@
+package org.jnbt;
+
+/*
+ * JNBT License
+ *
+ * Copyright (c) 2010 Graham Edgecombe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of the JNBT team nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * Represents a single NBT tag.
+ * @author Graham Edgecombe
+ *
+ */
+public abstract class Tag {
+
+ /**
+ * The name of this tag.
+ */
+ private final String name;
+
+ /**
+ * Creates the tag with the specified name.
+ * @param name The name.
+ */
+ public Tag(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Gets the name of this tag.
+ * @return The name of this tag.
+ */
+ public final String getName() {
+ return name;
+ }
+
+ /**
+ * Gets the value of this tag.
+ * @return The value of this tag.
+ */
+ public abstract Object getValue();
+
+}