示例#1
0
        public void AddNode <T>(string name, T value)
        {
            NbtNode node = null;

            if (typeof(T) == typeof(string))
            {
                node = new NbtString {
                    Value = (string)(object)value
                }
            }
            ;
            if (typeof(T) == typeof(byte))
            {
                node = new NbtByte {
                    Value = (byte)(object)value
                }
            }
            ;
            if (typeof(T) == typeof(int))
            {
                node = new NbtInt {
                    Value = (int)(object)value
                }
            }
            ;
            if (typeof(T) == typeof(byte[]))
            {
                node = new NbtBytes {
                    Value = (byte[])(object)value
                }
            }
            ;
            if (typeof(T) == typeof(double))
            {
                node = new NbtDouble {
                    Value = (double)(object)value
                }
            }
            ;
            if (typeof(T) == typeof(float))
            {
                node = new NbtFloat {
                    Value = (float)(object)value
                }
            }
            ;
            if (typeof(T) == typeof(int[]))
            {
                node = new NbtInts {
                    Value = (int[])(object)value
                }
            }
            ;
            if (typeof(T) == typeof(long))
            {
                node = new NbtLong {
                    Value = (long)(object)value
                }
            }
            ;
            if (typeof(T) == typeof(short))
            {
                node = new NbtShort {
                    Value = (short)(object)value
                }
            }
            ;
            if (typeof(T) == typeof(NbtList))
            {
                node = (NbtNode)(object)value;
            }
            if (typeof(T) == typeof(NbtCompound))
            {
                node = (NbtNode)(object)value;
            }
            if (node == null)
            {
                throw new Exception("Wrong Typ: " + typeof(T));
            }
            node.Name = name;
            Childs.Add(node);
        }
    }
        private NbtNode ReadNode(BigEndianStream zipped)
        {
            byte    type = (byte)zipped.ReadByte();
            NbtNode node = null;

            switch (type)
            {
            case 0:
                return(new NbtStop());

            case 1:
                node = new NbtByte
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadByte()
                };
                break;

            case 2:
                node = new NbtShort
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadInt16()
                };
                break;

            case 3:
                node = new NbtInt
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadInt32()
                };
                break;

            case 4:
                node = new NbtLong
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadInt64()
                };
                break;

            case 5:
                node = new NbtFloat
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadSingle()
                };
                break;

            case 6:
                node = new NbtDouble
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadDouble()
                };
                break;

            case 7:
                node = new NbtBytes
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadBytes(zipped.ReadInt32())
                };
                break;

            case 8:
                node = new NbtString
                {
                    Name  = zipped.ReadString8(),
                    Value = zipped.ReadString8()
                };
                break;

            case 9:
                node = new NbtList();
                ((NbtList)node).Name   = zipped.ReadString8();
                ((NbtList)node).Childs = new List <object>();
                byte tagId = zipped.ReadByte();
                ((NbtList)node).TagId = tagId;
                int length = zipped.ReadInt32();

                for (int i = 0; i < length; i++)
                {
                    ((NbtList)node).Childs.Add(ReadRaw(zipped, tagId));
                }
                break;

            case 10:
                node = new NbtCompound();
                ((NbtCompound)node).Name   = zipped.ReadString8();
                ((NbtCompound)node).Childs = new List <NbtNode>();
                NbtNode subNode;
                while ((subNode = ReadNode(zipped)).Type != 0)
                {
                    ((NbtCompound)node).Childs.Add(subNode);
                }
                break;

            case 11:
                node = new NbtInts
                {
                    Name  = zipped.ReadString8(),
                    Value = ByteToIntArray(zipped.ReadBytes(zipped.ReadInt32() * sizeof(int)))
                };
                break;
            }
            //string str = zipped.ReadString8(100);
            if (node == null)
            {
                throw new Exception();
            }
            return(node);
        }