internal override void WriteData(Stream writeStream) { // Figure out the type of this list, then check // to make sure all elements are that type. if (Tags.Count > 0) { NbtTagType listType = Tags[0].GetTagType(); foreach (NbtTag tag in Tags) { if (tag.GetTagType() != listType) { throw new Exception("All list items must be the same tag type."); } } Type = listType; } else { Type = ListType; } var tagType = new NbtByte("", (byte)Type); tagType.WriteData(writeStream); var length = new NbtInt("", Tags.Count); length.WriteData(writeStream); foreach (NbtTag tag in Tags) { tag.WriteData(writeStream); } }
internal override void ReadTag(Stream readStream, bool readName) { // First read the name of this tag Name = ""; if (readName) { var name = new NbtString(); name.ReadTag(readStream, false); Name = name.Value; } Tags.Clear(); bool foundEnd = false; while (!foundEnd) { int nextTag = readStream.ReadByte(); switch ((NbtTagType)nextTag) { case NbtTagType.TAG_End: foundEnd = true; break; case NbtTagType.TAG_Byte: var nextByte = new NbtByte(); nextByte.ReadTag(readStream); Tags.Add(nextByte); break; case NbtTagType.TAG_Short: var nextShort = new NbtShort(); nextShort.ReadTag(readStream); Tags.Add(nextShort); break; case NbtTagType.TAG_Int: var nextInt = new NbtInt(); nextInt.ReadTag(readStream); Tags.Add(nextInt); break; case NbtTagType.TAG_Long: var nextLong = new NbtLong(); nextLong.ReadTag(readStream); Tags.Add(nextLong); break; case NbtTagType.TAG_Float: var nextFloat = new NbtFloat(); nextFloat.ReadTag(readStream); Tags.Add(nextFloat); break; case NbtTagType.TAG_Double: var nextDouble = new NbtDouble(); nextDouble.ReadTag(readStream); Tags.Add(nextDouble); break; case NbtTagType.TAG_Byte_Array: var nextByteArray = new NbtByteArray(); nextByteArray.ReadTag(readStream); Tags.Add(nextByteArray); break; case NbtTagType.TAG_String: var nextString = new NbtString(); nextString.ReadTag(readStream); Tags.Add(nextString); break; case NbtTagType.TAG_List: var nextList = new NbtList(); nextList.ReadTag(readStream); Tags.Add(nextList); break; case NbtTagType.TAG_Compound: var nextCompound = new NbtCompound(); nextCompound.ReadTag(readStream); Tags.Add(nextCompound); break; default: Console.WriteLine(string.Format("Unsupported Tag Found: {0}", nextTag)); break; } } }
internal override void ReadTag(Stream readStream, bool readName) { // First read the name of this tag Name = ""; if (readName) { var name = new NbtString(); name.ReadTag(readStream, false); Name = name.Value; } var tagId = new NbtByte(); tagId.ReadTag(readStream, false); Type = (NbtTagType)tagId.Value; ListType = Type; var length = new NbtInt(); length.ReadTag(readStream, false); Tags.Clear(); for (int idx = 0; idx < length.Value; idx++) { switch ((NbtTagType)tagId.Value) { case NbtTagType.TAG_Byte: var nextByte = new NbtByte(); nextByte.ReadTag(readStream, false); Tags.Add(nextByte); break; case NbtTagType.TAG_Short: var nextShort = new NbtShort(); nextShort.ReadTag(readStream, false); Tags.Add(nextShort); break; case NbtTagType.TAG_Int: var nextInt = new NbtInt(); nextInt.ReadTag(readStream, false); Tags.Add(nextInt); break; case NbtTagType.TAG_Long: var nextLong = new NbtLong(); nextLong.ReadTag(readStream, false); Tags.Add(nextLong); break; case NbtTagType.TAG_Float: var nextFloat = new NbtFloat(); nextFloat.ReadTag(readStream, false); Tags.Add(nextFloat); break; case NbtTagType.TAG_Double: var nextDouble = new NbtDouble(); nextDouble.ReadTag(readStream, false); Tags.Add(nextDouble); break; case NbtTagType.TAG_Byte_Array: var nextByteArray = new NbtByteArray(); nextByteArray.ReadTag(readStream, false); Tags.Add(nextByteArray); break; case NbtTagType.TAG_String: var nextString = new NbtString(); nextString.ReadTag(readStream, false); Tags.Add(nextString); break; case NbtTagType.TAG_List: var nextList = new NbtList(); nextList.ReadTag(readStream, false); Tags.Add(nextList); break; case NbtTagType.TAG_Compound: var nextCompound = new NbtCompound(); nextCompound.ReadTag(readStream, false); Tags.Add(nextCompound); break; } } }