001 package net.minecraft.nbt; 002 003 import java.io.DataInput; 004 import java.io.DataOutput; 005 import java.io.IOException; 006 import net.minecraft.crash.CrashReport; 007 import net.minecraft.crash.CrashReportCategory; 008 import net.minecraft.util.ReportedException; 009 010 public abstract class NBTBase 011 { 012 public static final String[] NBTTypes = new String[] {"END", "BYTE", "SHORT", "INT", "LONG", "FLOAT", "DOUBLE", "BYTE[]", "STRING", "LIST", "COMPOUND", "INT[]"}; 013 014 /** The UTF string key used to lookup values. */ 015 private String name; 016 017 /** 018 * Write the actual data contents of the tag, implemented in NBT extension classes 019 */ 020 abstract void write(DataOutput var1) throws IOException; 021 022 /** 023 * Read the actual data contents of the tag, implemented in NBT extension classes 024 */ 025 abstract void load(DataInput var1) throws IOException; 026 027 /** 028 * Gets the type byte for the tag. 029 */ 030 public abstract byte getId(); 031 032 protected NBTBase(String par1Str) 033 { 034 if (par1Str == null) 035 { 036 this.name = ""; 037 } 038 else 039 { 040 this.name = par1Str; 041 } 042 } 043 044 /** 045 * Sets the name for this tag and returns this for convenience. 046 */ 047 public NBTBase setName(String par1Str) 048 { 049 if (par1Str == null) 050 { 051 this.name = ""; 052 } 053 else 054 { 055 this.name = par1Str; 056 } 057 058 return this; 059 } 060 061 /** 062 * Gets the name corresponding to the tag, or an empty string if none set. 063 */ 064 public String getName() 065 { 066 return this.name == null ? "" : this.name; 067 } 068 069 /** 070 * Reads and returns a tag from the given DataInput, or the End tag if no tag could be read. 071 */ 072 public static NBTBase readNamedTag(DataInput par0DataInput) throws IOException 073 { 074 byte var1 = par0DataInput.readByte(); 075 076 if (var1 == 0) 077 { 078 return new NBTTagEnd(); 079 } 080 else 081 { 082 String var2 = par0DataInput.readUTF(); 083 NBTBase var3 = newTag(var1, var2); 084 085 try 086 { 087 var3.load(par0DataInput); 088 return var3; 089 } 090 catch (IOException var7) 091 { 092 CrashReport var5 = CrashReport.makeCrashReport(var7, "Loading NBT data"); 093 CrashReportCategory var6 = var5.makeCategory("NBT Tag"); 094 var6.addCrashSection("Tag name", var2); 095 var6.addCrashSection("Tag type", Byte.valueOf(var1)); 096 throw new ReportedException(var5); 097 } 098 } 099 } 100 101 /** 102 * Writes the specified tag to the given DataOutput, writing the type byte, the UTF string key and then calling the 103 * tag to write its data. 104 */ 105 public static void writeNamedTag(NBTBase par0NBTBase, DataOutput par1DataOutput) throws IOException 106 { 107 par1DataOutput.writeByte(par0NBTBase.getId()); 108 109 if (par0NBTBase.getId() != 0) 110 { 111 par1DataOutput.writeUTF(par0NBTBase.getName()); 112 par0NBTBase.write(par1DataOutput); 113 } 114 } 115 116 /** 117 * Creates and returns a new tag of the specified type, or null if invalid. 118 */ 119 public static NBTBase newTag(byte par0, String par1Str) 120 { 121 switch (par0) 122 { 123 case 0: 124 return new NBTTagEnd(); 125 case 1: 126 return new NBTTagByte(par1Str); 127 case 2: 128 return new NBTTagShort(par1Str); 129 case 3: 130 return new NBTTagInt(par1Str); 131 case 4: 132 return new NBTTagLong(par1Str); 133 case 5: 134 return new NBTTagFloat(par1Str); 135 case 6: 136 return new NBTTagDouble(par1Str); 137 case 7: 138 return new NBTTagByteArray(par1Str); 139 case 8: 140 return new NBTTagString(par1Str); 141 case 9: 142 return new NBTTagList(par1Str); 143 case 10: 144 return new NBTTagCompound(par1Str); 145 case 11: 146 return new NBTTagIntArray(par1Str); 147 default: 148 return null; 149 } 150 } 151 152 /** 153 * Returns the string name of a tag with the specified type, or 'UNKNOWN' if invalid. 154 */ 155 public static String getTagName(byte par0) 156 { 157 switch (par0) 158 { 159 case 0: 160 return "TAG_End"; 161 case 1: 162 return "TAG_Byte"; 163 case 2: 164 return "TAG_Short"; 165 case 3: 166 return "TAG_Int"; 167 case 4: 168 return "TAG_Long"; 169 case 5: 170 return "TAG_Float"; 171 case 6: 172 return "TAG_Double"; 173 case 7: 174 return "TAG_Byte_Array"; 175 case 8: 176 return "TAG_String"; 177 case 9: 178 return "TAG_List"; 179 case 10: 180 return "TAG_Compound"; 181 case 11: 182 return "TAG_Int_Array"; 183 default: 184 return "UNKNOWN"; 185 } 186 } 187 188 /** 189 * Creates a clone of the tag. 190 */ 191 public abstract NBTBase copy(); 192 193 public boolean equals(Object par1Obj) 194 { 195 if (!(par1Obj instanceof NBTBase)) 196 { 197 return false; 198 } 199 else 200 { 201 NBTBase var2 = (NBTBase)par1Obj; 202 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); 203 } 204 } 205 206 public int hashCode() 207 { 208 return this.name.hashCode() ^ this.getId(); 209 } 210 }