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