    001package net.minecraft.nbt;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.io.DataInput;
    006import java.io.DataOutput;
    007import java.io.IOException;
    008import java.util.ArrayList;
    009import java.util.Iterator;
    010import java.util.List;
    011
    012public 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
    049        for (int i = 0; i < this.tagList.size(); ++i)
    050        {
    051            ((NBTBase)this.tagList.get(i)).write(par1DataOutput);
    052        }
    053    }
    054
    055    /**
    056     * Read the actual data contents of the tag, implemented in NBT extension classes
    057     */
    058    void load(DataInput par1DataInput) throws IOException
    059    {
    060        this.tagType = par1DataInput.readByte();
    061        int i = par1DataInput.readInt();
    062        this.tagList = new ArrayList();
    063
    064        for (int j = 0; j < i; ++j)
    065        {
    066            NBTBase nbtbase = NBTBase.newTag(this.tagType, (String)null);
    067            nbtbase.load(par1DataInput);
    068            this.tagList.add(nbtbase);
    069        }
    070    }
    071
    072    /**
    073     * Gets the type byte for the tag.
    074     */
    075    public byte getId()
    076    {
    077        return (byte)9;
    078    }
    079
    080    public String toString()
    081    {
    082        return "" + this.tagList.size() + " entries of type " + NBTBase.getTagName(this.tagType);
    083    }
    084
    085    /**
    086     * 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
    087     * previous tag.
    088     */
    089    public void appendTag(NBTBase par1NBTBase)
    090    {
    091        this.tagType = par1NBTBase.getId();
    092        this.tagList.add(par1NBTBase);
    093    }
    094
    095    @SideOnly(Side.CLIENT)
    096
    097    /**
    098     * Removes a tag at the given index.
    099     */
    100    public NBTBase removeTag(int par1)
    101    {
    102        return (NBTBase)this.tagList.remove(par1);
    103    }
    104
    105    /**
    106     * Retrieves the tag at the specified index from the list.
    107     */
    108    public NBTBase tagAt(int par1)
    109    {
    110        return (NBTBase)this.tagList.get(par1);
    111    }
    112
    113    /**
    114     * Returns the number of tags in the list.
    115     */
    116    public int tagCount()
    117    {
    118        return this.tagList.size();
    119    }
    120
    121    /**
    122     * Creates a clone of the tag.
    123     */
    124    public NBTBase copy()
    125    {
    126        NBTTagList nbttaglist = new NBTTagList(this.getName());
    127        nbttaglist.tagType = this.tagType;
    128        Iterator iterator = this.tagList.iterator();
    129
    130        while (iterator.hasNext())
    131        {
    132            NBTBase nbtbase = (NBTBase)iterator.next();
    133            NBTBase nbtbase1 = nbtbase.copy();
    134            nbttaglist.tagList.add(nbtbase1);
    135        }
    136
    137        return nbttaglist;
    138    }
    139
    140    public boolean equals(Object par1Obj)
    141    {
    142        if (super.equals(par1Obj))
    143        {
    144            NBTTagList nbttaglist = (NBTTagList)par1Obj;
    145
    146            if (this.tagType == nbttaglist.tagType)
    147            {
    148                return this.tagList.equals(nbttaglist.tagList);
    149            }
    150        }
    151
    152        return false;
    153    }
    154
    155    public int hashCode()
    156    {
    157        return super.hashCode() ^ this.tagList.hashCode();
    158    }
    159}