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 }