diff --git a/src/main/java/qowyn/ark/ArkCloudInventory.java b/src/main/java/qowyn/ark/ArkCloudInventory.java index 29f5b84..14b74ea 100644 --- a/src/main/java/qowyn/ark/ArkCloudInventory.java +++ b/src/main/java/qowyn/ark/ArkCloudInventory.java @@ -61,7 +61,7 @@ public ArkCloudInventory(JsonObject object) { public void readBinary(ArkArchive archive) { inventoryVersion = archive.getInt(); - if (inventoryVersion != 1) { + if (inventoryVersion != 1 && inventoryVersion != 3) { throw new UnsupportedOperationException("Unknown Cloud Inventory Version " + inventoryVersion); } diff --git a/src/main/java/qowyn/ark/ArkContainer.java b/src/main/java/qowyn/ark/ArkContainer.java index c770081..051c992 100644 --- a/src/main/java/qowyn/ark/ArkContainer.java +++ b/src/main/java/qowyn/ark/ArkContainer.java @@ -16,6 +16,7 @@ import javax.json.JsonValue.ValueType; import javax.json.stream.JsonGenerator; +import qowyn.ark.arrays.ArkArrayInt8; import qowyn.ark.arrays.ArkArrayUInt8; public class ArkContainer implements GameObjectContainer { @@ -62,6 +63,17 @@ public ArkContainer(ArkArrayUInt8 source) { readBinary(archive); } + public ArkContainer(ArkArrayInt8 source) { + ByteBuffer buffer = ByteBuffer.allocateDirect(source.size()); + + source.forEach(buffer::put); + + buffer.clear(); + + ArkArchive archive = new ArkArchive(buffer); + readBinary(archive); + } + public ArkContainer(JsonArray jsonObjects) { readJson(jsonObjects); } @@ -169,7 +181,7 @@ public ArrayList getObjects() { return objects; } - public ArkArrayUInt8 toByteArray() { + private ByteBuffer toBuffer() { int size = Integer.BYTES; size += objects.stream().mapToInt(object -> object.getSize(false)).sum(); @@ -191,11 +203,32 @@ public ArkArrayUInt8 toByteArray() { object.writeProperties(archive, 0); } + return buffer; + + } + + public ArkArrayUInt8 toByteArray() { + ByteBuffer buffer = toBuffer(); + ArkArrayUInt8 result = new ArkArrayUInt8(); buffer.clear(); - for (int n = 0; n < size; n++) { + for (int n = 0; n < buffer.capacity(); n++) { + result.add(buffer.get()); + } + + return result; + } + + public ArkArrayInt8 toSignedByteArray() { + ByteBuffer buffer = toBuffer(); + + ArkArrayInt8 result = new ArkArrayInt8(); + + buffer.clear(); + + for (int n = 0; n < buffer.capacity(); n++) { result.add(buffer.get()); } diff --git a/src/main/java/qowyn/ark/arrays/ArkArrayStruct.java b/src/main/java/qowyn/ark/arrays/ArkArrayStruct.java index eb3200e..0af6d90 100644 --- a/src/main/java/qowyn/ark/arrays/ArkArrayStruct.java +++ b/src/main/java/qowyn/ark/arrays/ArkArrayStruct.java @@ -48,7 +48,7 @@ public ArkArrayStruct(ArkArchive archive, PropertyArray property) { } public ArkArrayStruct(JsonArray a, PropertyArray property) { - int size = a.size(); + int size = property.getDataSize(); ArkName structType = StructRegistry.mapArrayNameToTypeName(property.getName()); if (structType == null) {