    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.io.DataInput;
    006    import java.io.DataOutput;
    007    import java.io.IOException;
    008    import java.util.ArrayList;
    009    import java.util.Iterator;
    010    import java.util.List;
    011
    012    public class NBTTagList extends NBTBase
    013    {
    014        /** The array list containing the tags encapsulated in this list. */
    015        private List tagList = new ArrayList();
    016
    017        /**
    018         * The type byte for the tags in the list - they must all be of the same type.
    019         */
    020        private byte tagType;
    021
    022        public NBTTagList()
    023        {
    024            super("");
    025        }
    026
    027        public NBTTagList(String par1Str)
    028        {
    029            super(par1Str);
    030        }
    031
    032        /**
    033         * Write the actual data contents of the tag, implemented in NBT extension classes
    034         */
    035        void write(DataOutput par1DataOutput) throws IOException
    036        {
    037            if (!this.tagList.isEmpty())
    038            {
    039                this.tagType = ((NBTBase)this.tagList.get(0)).getId();
    040            }
    041            else
    042            {
    043                this.tagType = 1;
    044            }
    045
    046            par1DataOutput.writeByte(this.tagType);
    047            par1DataOutput.writeInt(this.tagList.size());
    048            Iterator var2 = this.tagList.iterator();
    049
    050            while (var2.hasNext())
    051            {
    052                NBTBase var3 = (NBTBase)var2.next();
    053                var3.write(par1DataOutput);
    054            }
    055        }
    056
    057        /**
    058         * Read the actual data contents of the tag, implemented in NBT extension classes
    059         */
    060        void load(DataInput par1DataInput) throws IOException
    061        {
    062            this.tagType = par1DataInput.readByte();
    063            int var2 = par1DataInput.readInt();
    064            this.tagList = new ArrayList();
    065
    066            for (int var3 = 0; var3 < var2; ++var3)
    067            {
    068                NBTBase var4 = NBTBase.newTag(this.tagType, (String)null);
    069                var4.load(par1DataInput);
    070                this.tagList.add(var4);
    071            }
    072        }
    073
    074        /**
    075         * Gets the type byte for the tag.
    076         */
    077        public byte getId()
    078        {
    079            return (byte)9;
    080        }
    081
    082        public String toString()
    083        {
    084            return "" + this.tagList.size() + " entries of type " + NBTBase.getTagName(this.tagType);
    085        }
    086
    087        /**
    088         * Adds the provided tag to the end of the list. There is no check to verify this tag is of the same type as any
    089         * previous tag.
    090         */
    091        public void appendTag(NBTBase par1NBTBase)
    092        {
    093            this.tagType = par1NBTBase.getId();
    094            this.tagList.add(par1NBTBase);
    095        }
    096
    097        @SideOnly(Side.CLIENT)
    098
    099        /**
    100         * Removes a tag at the given index.
    101         */
    102        public NBTBase removeTag(int par1)
    103        {
    104            return (NBTBase)this.tagList.remove(par1);
    105        }
    106
    107        /**
    108         * Retrieves the tag at the specified index from the list.
    109         */
    110        public NBTBase tagAt(int par1)
    111        {
    112            return (NBTBase)this.tagList.get(par1);
    113        }
    114
    115        /**
    116         * Returns the number of tags in the list.
    117         */
    118        public int tagCount()
    119        {
    120            return this.tagList.size();
    121        }
    122
    123        /**
    124         * Creates a clone of the tag.
    125         */
    126        public NBTBase copy()
    127        {
    128            NBTTagList var1 = new NBTTagList(this.getName());
    129            var1.tagType = this.tagType;
    130            Iterator var2 = this.tagList.iterator();
    131
    132            while (var2.hasNext())
    133            {
    134                NBTBase var3 = (NBTBase)var2.next();
    135                NBTBase var4 = var3.copy();
    136                var1.tagList.add(var4);
    137            }
    138
    139            return var1;
    140        }
    141
    142        public boolean equals(Object par1Obj)
    143        {
    144            if (super.equals(par1Obj))
    145            {
    146                NBTTagList var2 = (NBTTagList)par1Obj;
    147
    148                if (this.tagType == var2.tagType)
    149                {
    150                    return this.tagList.equals(var2.tagList);
    151                }
    152            }
    153
    154            return false;
    155        }
    156
    157        public int hashCode()
    158        {
    159            return super.hashCode() ^ this.tagList.hashCode();
    160        }
    161    }