public List<L2Property> readProperties( DataInput dataInput, String objClass, UnrealPackageReadOnly up) throws UnrealException { List<L2Property> properties = new ArrayList<>(); List<Property> classTemplate = unrealClassLoader.getStructProperties(objClass); Collections.reverse(classTemplate); try { String name; while (!(name = up.getNameTable().get(dataInput.readCompactInt()).getName()).equals("None")) { int info = dataInput.readUnsignedByte(); Type propertyType = Type.values()[info & 0b1111]; // TODO int sizeType = (info >> 4) & 0b111; boolean array = info >> 7 == 1; String structName = propertyType.equals(Type.STRUCT) ? up.getNameTable().get(dataInput.readCompactInt()).getName() : null; int size = readPropertySize(sizeType, dataInput); int arrayIndex = array && !propertyType.equals(Type.BOOL) ? dataInput.readCompactInt() : 0; byte[] objBytes = new byte[size]; dataInput.readFully(objBytes); final String n = name; PropertiesUtil.getAt(properties, n); L2Property property = PropertiesUtil.getAt(properties, n); if (property == null) { Property template = classTemplate .stream() .filter(pt -> pt.getEntry().getObjectName().getName().equalsIgnoreCase((n))) .findAny() .orElse(null); if (template == null) throw new UnrealException(objClass + ": Property template not found: " + name); property = new L2Property(template, up); properties.add(property); } if (structName != null && !"Vector".equals(structName) && !"Rotator".equals(structName) && !"Color".equals(structName)) { StructProperty structProperty = (StructProperty) property.getTemplate(); structName = structProperty.getStructType().getObjectFullName(); } UnrealPackageReadOnly.ExportEntry arrayInner = null; if (propertyType.equals(Type.ARRAY)) { ArrayProperty arrayProperty = (ArrayProperty) property.getTemplate(); arrayInner = (UnrealPackageReadOnly.ExportEntry) arrayProperty.getInner(); } DataInput objBuffer = new DataInputStream(new ByteArrayInputStream(objBytes), dataInput.getCharset()); property.putAt( arrayIndex, read( objBuffer, propertyType, array, arrayInner, structName, up, objClass, property.getName())); property.setType(propertyType); } } catch (IOException e) { throw new UnrealException(e); } return properties; }