public NBTList(string name, NBTType type, int count) { Name = name; Type = NBTType.List; ListType = type; Tags = new NBTag[count]; }
public NBTag(NBTType type, string name, object payload, NBTag parent) { Type = type; Name = name; Payload = payload; Parent = parent; }
public NBTList(string name, NBTType type, Array payloads) { if (payloads == null) { throw new ArgumentNullException("payloads"); } Name = name; Type = NBTType.List; ListType = type; if (ListType == NBTType.Compound) { if (!(payloads is NBTCompound[])) { throw new ArgumentException("Expected NBTCompound[]", "payloads"); } Tags = (NBTCompound[])payloads.Clone(); } else if (ListType == NBTType.List) { if (!(payloads is NBTList[])) { throw new ArgumentException("Expected NBTList[]", "payloads"); } Tags = (NBTList[])payloads.Clone(); } else { Tags = new NBTag[payloads.Length]; for (int i = 0; i < Tags.Length; i++) { Tags[i] = new NBTag(ListType, null, payloads.GetValue(i), this); } } }
public NBTList(string name, NBTType type, ICollection payloads) { Name = name; Type = NBTType.List; ListType = type; Tags = new NBTag[payloads.Count]; int i = 0; foreach (object payload in payloads) { Tags[i++] = new NBTag(ListType, null, payload, this); } }
NBTag(NBTType type, NBTag parent) { Type = type; Parent = parent; }
public static NBTag ReadTag([NotNull] BinaryReader reader, NBTType type, string name, NBTag parent) { if (reader == null) { throw new ArgumentNullException("reader"); } if (name == null && type != NBTType.End) { name = ReadString(reader); } switch (type) { case NBTType.End: return(new NBTag(NBTType.End, parent)); case NBTType.Byte: return(new NBTag(NBTType.Byte, name, reader.ReadByte(), parent)); case NBTType.Short: return(new NBTag(NBTType.Short, name, IPAddress.NetworkToHostOrder(reader.ReadInt16()), parent)); case NBTType.Int: return(new NBTag(NBTType.Int, name, IPAddress.NetworkToHostOrder(reader.ReadInt32()), parent)); case NBTType.Long: return(new NBTag(NBTType.Long, name, IPAddress.NetworkToHostOrder(reader.ReadInt64()), parent)); case NBTType.Float: return(new NBTag(NBTType.Float, name, reader.ReadSingle(), parent)); case NBTType.Double: return(new NBTag(NBTType.Double, name, reader.ReadDouble(), parent)); case NBTType.Bytes: int bytesLength = IPAddress.NetworkToHostOrder(reader.ReadInt32()); return(new NBTag(NBTType.Bytes, name, reader.ReadBytes(bytesLength), parent)); case NBTType.String: return(new NBTag(NBTType.String, name, ReadString(reader), parent)); case NBTType.List: NBTList list = new NBTList { Type = NBTType.List, Name = name, Parent = parent, ListType = (NBTType)reader.ReadByte() }; int listLength = IPAddress.NetworkToHostOrder(reader.ReadInt32()); list.Tags = new NBTag[listLength]; for (int i = 0; i < listLength; i++) { list.Tags[i] = ReadTag(reader, list.ListType, "", list); } return(list); case NBTType.Compound: NBTCompound compound = new NBTCompound { Type = NBTType.Compound, Name = name, Parent = parent }; while (true) { NBTag childTag = ReadTag(reader, (NBTType)reader.ReadByte(), null, compound); if (childTag.Type == NBTType.End) { break; } if (childTag.Name == null) { continue; } if (compound.Tags.ContainsKey(childTag.Name)) { throw new IOException("NBT parsing error: null names and duplicate names are not allowed within a compound tags."); } else { compound.Tags.Add(childTag.Name, childTag); } } return(compound); default: throw new IOException("NBT parsing error: unknown tag type."); } }
public static NBTag ReadTag(BinaryReader reader, NBTType type, string name, NBTag parent) { if (name == null && type != NBTType.End) { name = ReadString(reader); } switch (type) { case NBTType.End: return(new NBTag(NBTType.End, parent)); case NBTType.Byte: return(new NBTag(NBTType.Byte, name, reader.ReadByte(), parent)); case NBTType.Short: return(new NBTag(NBTType.Short, name, reader.ReadInt16(), parent)); case NBTType.Int: return(new NBTag(NBTType.Int, name, reader.ReadInt32(), parent)); case NBTType.Long: return(new NBTag(NBTType.Long, name, reader.ReadInt64(), parent)); case NBTType.Float: return(new NBTag(NBTType.Float, name, reader.ReadSingle(), parent)); case NBTType.Double: return(new NBTag(NBTType.Double, name, reader.ReadDouble(), parent)); case NBTType.Bytes: int bytesLength = reader.ReadInt32(); return(new NBTag(NBTType.Bytes, name, reader.ReadBytes(bytesLength), parent)); case NBTType.String: return(new NBTag(NBTType.String, name, ReadString(reader), parent)); case NBTType.Bool: return(new NBTag(NBTType.Bool, name, reader.ReadBoolean(), parent)); case NBTType.Color: return(new NBTag(NBTType.Color, name, Color.FromArgb(reader.ReadInt32()), parent)); case NBTType.Point: int iX = reader.ReadInt32(); int iY = reader.ReadInt32(); return(new NBTag(NBTType.Point, name, new Point(iX, iY), parent)); case NBTType.PointF: float fX = reader.ReadSingle(); float fY = reader.ReadSingle(); return(new NBTag(NBTType.PointF, name, new PointF(fX, fY), parent)); case NBTType.List: NBTList list = new NBTList { Type = NBTType.List, Name = name, Parent = parent, ListType = (NBTType)reader.ReadByte() }; int listLength = reader.ReadInt32(); list.Tags = new NBTag[listLength]; for (int i = 0; i < listLength; i++) { list.Tags[i] = ReadTag(reader, list.ListType, "", list); } return(list); case NBTType.Compound: NBTCompound compound = new NBTCompound(name) { Parent = parent }; while (true) { NBTag childTag = ReadTag(reader, (NBTType)reader.ReadByte(), null, compound); if (childTag.Type == NBTType.End) { break; } if (childTag.Name == null) { continue; } if (compound.Tags.ContainsKey(childTag.Name)) { throw new IOException( "NBT parsing error: null names and duplicate names are not allowed within a compound tags."); } else { compound.Tags.Add(childTag.Name, childTag); } } return(compound); default: throw new IOException("NBT parsing error: unknown tag type."); } }