Пример #1
0
 public NBTList(string name, NBTType type, int count)
 {
     Name     = name;
     Type     = NBTType.List;
     ListType = type;
     Tags     = new NBTag[count];
 }
Пример #2
0
 public NBTag(NBTType type, string name, object payload, NBTag parent)
 {
     Type    = type;
     Name    = name;
     Payload = payload;
     Parent  = parent;
 }
Пример #3
0
 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);
         }
     }
 }
Пример #4
0
        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);
            }
        }
Пример #5
0
 NBTag(NBTType type, NBTag parent)
 {
     Type   = type;
     Parent = parent;
 }
Пример #6
0
        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.");
            }
        }
Пример #7
0
        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.");
            }
        }