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 var7) 088 { 089 CrashReport var5 = CrashReport.func_85055_a(var7, "Loading NBT data"); 090 CrashReportCategory var6 = var5.func_85058_a("NBT Tag"); 091 var6.addCrashSection("Tag name", var2); 092 var6.addCrashSection("Tag type", Byte.valueOf(var1)); 093 throw new ReportedException(var5); 094 } 095 } 096 } 097 098 /** 099 * Writes the specified tag to the given DataOutput, writing the type byte, the UTF string key and then calling the 100 * tag to write its data. 101 */ 102 public static void writeNamedTag(NBTBase par0NBTBase, DataOutput par1DataOutput) throws IOException 103 { 104 par1DataOutput.writeByte(par0NBTBase.getId()); 105 106 if (par0NBTBase.getId() != 0) 107 { 108 par1DataOutput.writeUTF(par0NBTBase.getName()); 109 par0NBTBase.write(par1DataOutput); 110 } 111 } 112 113 /** 114 * Creates and returns a new tag of the specified type, or null if invalid. 115 */ 116 public static NBTBase newTag(byte par0, String par1Str) 117 { 118 switch (par0) 119 { 120 case 0: 121 return new NBTTagEnd(); 122 case 1: 123 return new NBTTagByte(par1Str); 124 case 2: 125 return new NBTTagShort(par1Str); 126 case 3: 127 return new NBTTagInt(par1Str); 128 case 4: 129 return new NBTTagLong(par1Str); 130 case 5: 131 return new NBTTagFloat(par1Str); 132 case 6: 133 return new NBTTagDouble(par1Str); 134 case 7: 135 return new NBTTagByteArray(par1Str); 136 case 8: 137 return new NBTTagString(par1Str); 138 case 9: 139 return new NBTTagList(par1Str); 140 case 10: 141 return new NBTTagCompound(par1Str); 142 case 11: 143 return new NBTTagIntArray(par1Str); 144 default: 145 return null; 146 } 147 } 148 149 /** 150 * Returns the string name of a tag with the specified type, or 'UNKNOWN' if invalid. 151 */ 152 public static String getTagName(byte par0) 153 { 154 switch (par0) 155 { 156 case 0: 157 return "TAG_End"; 158 case 1: 159 return "TAG_Byte"; 160 case 2: 161 return "TAG_Short"; 162 case 3: 163 return "TAG_Int"; 164 case 4: 165 return "TAG_Long"; 166 case 5: 167 return "TAG_Float"; 168 case 6: 169 return "TAG_Double"; 170 case 7: 171 return "TAG_Byte_Array"; 172 case 8: 173 return "TAG_String"; 174 case 9: 175 return "TAG_List"; 176 case 10: 177 return "TAG_Compound"; 178 case 11: 179 return "TAG_Int_Array"; 180 default: 181 return "UNKNOWN"; 182 } 183 } 184 185 /** 186 * Creates a clone of the tag. 187 */ 188 public abstract NBTBase copy(); 189 190 public boolean equals(Object par1Obj) 191 { 192 if (!(par1Obj instanceof NBTBase)) 193 { 194 return false; 195 } 196 else 197 { 198 NBTBase var2 = (NBTBase)par1Obj; 199 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); 200 } 201 } 202 203 public int hashCode() 204 { 205 return this.name.hashCode() ^ this.getId(); 206 } 207 }