NbtTag ReadValueAsTag()
{
if (!atValue)
{
// Should never happen
throw new InvalidOperationException(NoValueToReadError);
}
atValue = false;
switch (TagType)
{
case NbtTagType.Byte:
return(new NbtByte(TagName, reader.ReadByte()));
case NbtTagType.Short:
return(new NbtShort(TagName, reader.ReadInt16()));
case NbtTagType.Int:
return(new NbtInt(TagName, reader.ReadInt32()));
case NbtTagType.Long:
return(new NbtLong(TagName, reader.ReadInt64()));
case NbtTagType.Float:
return(new NbtFloat(TagName, reader.ReadSingle()));
case NbtTagType.Double:
return(new NbtDouble(TagName, reader.ReadDouble()));
case NbtTagType.String:
return(new NbtString(TagName, reader.ReadString()));
case NbtTagType.ByteArray:
byte[] value = reader.ReadBytes(TagLength);
if (value.Length < TagLength)
{
throw new EndOfStreamException();
}
return(new NbtByteArray(TagName, value));
case NbtTagType.IntArray:
var ints = new int[TagLength];
for (int i = 0; i < TagLength; i++)
{
ints[i] = reader.ReadInt32();
}
return(new NbtIntArray(TagName, ints));
case NbtTagType.LongArray:
var longs = new long[TagLength];
for (int i = 0; i < TagLength; i++)
{
longs[i] = reader.ReadInt64();
}
return(new NbtLongArray(TagName, longs));
default:
throw new InvalidOperationException(NonValueTagError);
}
}