package net.minecraft.nbt;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Iterator;
public abstract class NBTBase
{
public static final String[] NBT_TYPES = new String[] { "END", "BYTE", "SHORT", "INT", "LONG", "FLOAT", "DOUBLE", "BYTE[]", "STRING", "LIST", "COMPOUND", "INT[]" };
private static final String __OBFID = "CL_00001229";
/**
* Write the actual data contents of the tag, implemented in NBT extension classes
*/
abstract void write(DataOutput output) throws IOException;
abstract void read(DataInput input, int depth, NBTSizeTracker sizeTracker) throws IOException;
@Override
public abstract String toString();
/**
* Gets the type byte for the tag.
*/
public abstract byte getId();
/**
* Creates a new NBTBase object that corresponds with the passed in id.
*/
protected static NBTBase createNewByType(final byte id)
{
switch (id)
{
case 0:
return new NBTTagEnd();
case 1:
return new NBTTagByte();
case 2:
return new NBTTagShort();
case 3:
return new NBTTagInt();
case 4:
return new NBTTagLong();
case 5:
return new NBTTagFloat();
case 6:
return new NBTTagDouble();
case 7:
return new NBTTagByteArray();
case 8:
return new NBTTagString();
case 9:
return new NBTTagList();
case 10:
return new NBTTagCompound();
case 11:
return new NBTTagIntArray();
default:
return null;
}
}
/**
* Creates a clone of the tag.
*/
public abstract NBTBase copy();
/**
* Return whether this compound has no tags.
*/
public boolean hasNoTags()
{
return false;
}
@Override
public boolean equals(final Object p_equals_1_)
{
if (!(p_equals_1_ instanceof NBTBase))
return false;
else
{
final NBTBase var2 = (NBTBase) p_equals_1_;
return this.getId() == var2.getId();
}
}
@Override
public int hashCode()
{
return this.getId();
}
protected String getString()
{
return this.toString();
}
public abstract static class NBTPrimitive extends NBTBase
{
private static final String __OBFID = "CL_00001230";
public abstract long getLong();
public abstract int getInt();
public abstract short getShort();
public abstract byte getByte();
public abstract double getDouble();
public abstract float getFloat();
}
public static boolean compareTags(final NBTBase p_175775_0_, final NBTBase p_175775_1_, final boolean p_175775_2_)
{
if (p_175775_0_ == p_175775_1_)
return true;
else if (p_175775_0_ == null)
return true;
else if (p_175775_1_ == null)
return false;
else if (!p_175775_0_.getClass().equals(p_175775_1_.getClass()))
return false;
else if (p_175775_0_ instanceof NBTTagCompound)
{
final NBTTagCompound var9 = (NBTTagCompound) p_175775_0_;
final NBTTagCompound var10 = (NBTTagCompound) p_175775_1_;
final Iterator var11 = var9.getKeySet().iterator();
String var12;
NBTBase var13;
do
{
if (!var11.hasNext())
return true;
var12 = (String) var11.next();
var13 = var9.getTag(var12);
} while (compareTags(var13, var10.getTag(var12), p_175775_2_));
return false;
}
else if (p_175775_0_ instanceof NBTTagList && p_175775_2_)
{
final NBTTagList var3 = (NBTTagList) p_175775_0_;
final NBTTagList var4 = (NBTTagList) p_175775_1_;
if (var3.tagCount() == 0)
return var4.tagCount() == 0;
else
{
int var5 = 0;
while (var5 < var3.tagCount())
{
final NBTBase var6 = var3.get(var5);
boolean var7 = false;
int var8 = 0;
while (true)
{
if (var8 < var4.tagCount())
{
if (!compareTags(var6, var4.get(var8), p_175775_2_))
{
++var8;
continue;
}
var7 = true;
}
if (!var7)
return false;
++var5;
break;
}
}
return true;
}
}
else
return p_175775_0_.equals(p_175775_1_);
}
}