示例#1
0
        private static object CreateListFromNbt(NbtList list, NbtEntryType entryType)
        {
            switch (entryType.NestedType.Type)
            {
            case NbtTagType.Byte:
                if (entryType.NestedType.FwType == typeof(bool))
                {
                    return(new List <bool>(list.OfType <NbtByte>().Select(x => x.Value == 1)));
                }
                else
                {
                    return(new List <byte>(list.OfType <NbtByte>().Select(x => x.Value)));
                }

            case NbtTagType.Short:
                return(new List <short>(list.OfType <NbtShort>().Select(x => x.Value)));

            case NbtTagType.Int:
                return(new List <int>(list.OfType <NbtInt>().Select(x => x.Value)));

            case NbtTagType.Long:
                return(new List <long>(list.OfType <NbtLong>().Select(x => x.Value)));

            case NbtTagType.Float:
                return(new List <float>(list.OfType <NbtFloat>().Select(x => x.Value)));

            case NbtTagType.Double:
                return(new List <double>(list.OfType <NbtDouble>().Select(x => x.Value)));

            case NbtTagType.ByteArray:
                return(new List <byte[]>(list.OfType <NbtByteArray>().Select(x => x.Value)));

            case NbtTagType.String:
                return(new List <string>(list.OfType <NbtString>().Select(x => x.Value)));

            case NbtTagType.IntArray:
                return(new List <int[]>(list.OfType <NbtIntArray>().Select(x => x.Value)));

            case NbtTagType.LongArray:
                return(new List <long[]>(list.OfType <NbtLongArray>().Select(x => x.Value)));

            case NbtTagType.List:
            case NbtTagType.Compound:
                var inst = (IList)Activator.CreateInstance(entryType.FwType);
                foreach (var it in list.Select(t => CreateValueFromNbtTag(t, entryType.NestedType)))
                {
                    inst.Add(it);
                }
                return(inst);

            default:
                throw new NotSupportedException();
            }
        }
示例#2
0
            private void CreateFromMemberInfo(MemberInfo memberinfo, NbtEntryAttribute baseAttribute)
            {
                FieldType fieldType;
                Type      innerType;

                switch (memberinfo)
                {
                case PropertyInfo property:
                    fieldType = FieldType.Property;
                    innerType = property.PropertyType;
                    break;

                case FieldInfo field:
                    fieldType = FieldType.Field;
                    innerType = field.FieldType;
                    break;

                default:
                    throw new NotSupportedException();
                }

                var type = NbtEntryType.CreateFromFrameworkType(innerType);

                if (type == null)
                {
                    return;
                }

                _nbtEntries.Add(new NbtEntry
                {
                    Field      = memberinfo,
                    MemberKind = fieldType,
                    ValueType  = type,
                    Attribute  = baseAttribute
                });
            }
示例#3
0
        private static object CreateValueFromNbtTag(NbtTag tag, NbtEntryType entryType)
        {
            try
            {
                switch (entryType.Type)
                {
                case NbtTagType.Byte:
                    if (entryType.FwType == typeof(bool))
                    {
                        return(tag.ByteValue == 1);
                    }
                    else
                    {
                        return(tag.ByteValue);
                    }

                case NbtTagType.Short:
                    return(tag.ShortValue);

                case NbtTagType.Int:
                    return(tag.IntValue);

                case NbtTagType.Long:
                    return(tag.LongValue);

                case NbtTagType.Float:
                    return(tag.FloatValue);

                case NbtTagType.Double:
                    return(tag.DoubleValue);

                case NbtTagType.ByteArray:
                    return(tag.ByteArrayValue);

                case NbtTagType.String:
                    return(tag.StringValue);

                case NbtTagType.IntArray:
                    return(tag.IntArrayValue);

                case NbtTagType.LongArray:
                    return(tag.LongArrayValue);

                case NbtTagType.List:
                    if (!(tag is NbtList list))
                    {
                        return(null);
                    }
                    return(CreateListFromNbt(list, entryType));

                case NbtTagType.Compound:
                    if (!(tag is NbtCompound compound))
                    {
                        return(null);
                    }
                    return(CreateAndReadFromNbt(entryType.FwType, compound));

                default:
                    throw new NotSupportedException();
                }
            }
            catch (InvalidCastException)
            {
                return(null);
            }
            catch (TargetInvocationException)
            {
                return(null);
            }
        }