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(); } }
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 }); }
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); } }