    001    package net.minecraft.src;
    002
    003    import java.io.DataInput;
    004    import java.io.DataOutput;
    005    import java.io.IOException;
    006
    007    public abstract class NBTBase
    008    {
    009        public static final String[] NBTTypes = new String[] {"END", "BYTE", "SHORT", "INT", "LONG", "FLOAT", "DOUBLE", "BYTE[]", "STRING", "LIST", "COMPOUND", "INT[]"};
    010
    011        /** The UTF string key used to lookup values. */
    012        private String name;
    013
    014        /**
    015         * Write the actual data contents of the tag, implemented in NBT extension classes
    016         */
    017        abstract void write(DataOutput var1) throws IOException;
    018
    019        /**
    020         * Read the actual data contents of the tag, implemented in NBT extension classes
    021         */
    022        abstract void load(DataInput var1) throws IOException;
    023
    024        /**
    025         * Gets the type byte for the tag.
    026         */
    027        public abstract byte getId();
    028
    029        protected NBTBase(String par1Str)
    030        {
    031            if (par1Str == null)
    032            {
    033                this.name = "";
    034            }
    035            else
    036            {
    037                this.name = par1Str;
    038            }
    039        }
    040
    041        /**
    042         * Sets the name for this tag and returns this for convenience.
    043         */
    044        public NBTBase setName(String par1Str)
    045        {
    046            if (par1Str == null)
    047            {
    048                this.name = "";
    049            }
    050            else
    051            {
    052                this.name = par1Str;
    053            }
    054
    055            return this;
    056        }
    057
    058        /**
    059         * Gets the name corresponding to the tag, or an empty string if none set.
    060         */
    061        public String getName()
    062        {
    063            return this.name == null ? "" : this.name;
    064        }
    065
    066        /**
    067         * Reads and returns a tag from the given DataInput, or the End tag if no tag could be read.
    068         */
    069        public static NBTBase readNamedTag(DataInput par0DataInput) throws IOException
    070        {
    071            byte var1 = par0DataInput.readByte();
    072
    073            if (var1 == 0)
    074            {
    075                return new NBTTagEnd();
    076            }
    077            else
    078            {
    079                String var2 = par0DataInput.readUTF();
    080                NBTBase var3 = newTag(var1, var2);
    081
    082                try
    083                {
    084                    var3.load(par0DataInput);
    085                    return var3;
    086                }
    087                catch (IOException var6)
    088                {
    089                    CrashReport var5 = new CrashReport("loading nbt data", var6);
    090                    var5.addCrashSection("Tag name", var2);
    091                    var5.addCrashSection("Tag type", Byte.valueOf(var1));
    092                    throw new ReportedException(var5);
    093                }
    094            }
    095        }
    096
    097        /**
    098         * Writes the specified tag to the given DataOutput, writing the type byte, the UTF string key and then calling the
    099         * tag to write its data.
    100         */
    101        public static void writeNamedTag(NBTBase par0NBTBase, DataOutput par1DataOutput) throws IOException
    102        {
    103            par1DataOutput.writeByte(par0NBTBase.getId());
    104
    105            if (par0NBTBase.getId() != 0)
    106            {
    107                par1DataOutput.writeUTF(par0NBTBase.getName());
    108                par0NBTBase.write(par1DataOutput);
    109            }
    110        }
    111
    112        /**
    113         * Creates and returns a new tag of the specified type, or null if invalid.
    114         */
    115        public static NBTBase newTag(byte par0, String par1Str)
    116        {
    117            switch (par0)
    118            {
    119                case 0:
    120                    return new NBTTagEnd();
    121                case 1:
    122                    return new NBTTagByte(par1Str);
    123                case 2:
    124                    return new NBTTagShort(par1Str);
    125                case 3:
    126                    return new NBTTagInt(par1Str);
    127                case 4:
    128                    return new NBTTagLong(par1Str);
    129                case 5:
    130                    return new NBTTagFloat(par1Str);
    131                case 6:
    132                    return new NBTTagDouble(par1Str);
    133                case 7:
    134                    return new NBTTagByteArray(par1Str);
    135                case 8:
    136                    return new NBTTagString(par1Str);
    137                case 9:
    138                    return new NBTTagList(par1Str);
    139                case 10:
    140                    return new NBTTagCompound(par1Str);
    141                case 11:
    142                    return new NBTTagIntArray(par1Str);
    143                default:
    144                    return null;
    145            }
    146        }
    147
    148        /**
    149         * Returns the string name of a tag with the specified type, or 'UNKNOWN' if invalid.
    150         */
    151        public static String getTagName(byte par0)
    152        {
    153            switch (par0)
    154            {
    155                case 0:
    156                    return "TAG_End";
    157                case 1:
    158                    return "TAG_Byte";
    159                case 2:
    160                    return "TAG_Short";
    161                case 3:
    162                    return "TAG_Int";
    163                case 4:
    164                    return "TAG_Long";
    165                case 5:
    166                    return "TAG_Float";
    167                case 6:
    168                    return "TAG_Double";
    169                case 7:
    170                    return "TAG_Byte_Array";
    171                case 8:
    172                    return "TAG_String";
    173                case 9:
    174                    return "TAG_List";
    175                case 10:
    176                    return "TAG_Compound";
    177                case 11:
    178                    return "TAG_Int_Array";
    179                default:
    180                    return "UNKNOWN";
    181            }
    182        }
    183
    184        /**
    185         * Creates a clone of the tag.
    186         */
    187        public abstract NBTBase copy();
    188
    189        public boolean equals(Object par1Obj)
    190        {
    191            if (!(par1Obj instanceof NBTBase))
    192            {
    193                return false;
    194            }
    195            else
    196            {
    197                NBTBase var2 = (NBTBase)par1Obj;
    198                return this.getId() != var2.getId() ? false : ((this.name != null || var2.name == null) && (this.name == null || var2.name != null) ? this.name == null || this.name.equals(var2.name) : false);
    199            }
    200        }
    201
    202        public int hashCode()
    203        {
    204            return this.name.hashCode() ^ this.getId();
    205        }
    206    }