public UEMapProperty(BinaryReader reader, long valueLength) { var keyType = reader.ReadUEString(); var valueType = reader.ReadUEString(); if (valueType == "IntProperty") { valueType += "Array"; } var unknown = reader.ReadBytes(5); if (unknown.Any(b => b != 0)) { throw new InvalidOperationException($"Offset: 0x{reader.BaseStream.Position-5:x8}. Expected ??? to be 0, but was 0x{unknown.AsHex()}"); } var count = reader.ReadInt32(); for (var i = 0; i < count; i++) { UEProperty key, value; if (keyType == "StructProperty") { key = Read(reader); } else { key = UESerializer.Deserialize(null, keyType, -1, reader); } var values = new List <UEProperty>(); switch (valueType) { case "StructProperty": value = Read(reader); break; case "BoolProperty": value = new UEBoolProperty() { Value = reader.ReadBoolean() }; Debug.WriteLine(String.Format(" {0}: {1}", ((UEStringProperty)key).Value, ((UEBoolProperty)value).Value)); break; case "FloatProperty": var bytes = reader.ReadBytes(4); value = new UEFloatProperty() { Value = System.BitConverter.ToSingle(bytes, 0) }; Debug.WriteLine(String.Format(" {0}: {1}", ((UEStringProperty)key).Value, ((UEFloatProperty)value).Value)); break; case "EnumProperty": var length = reader.ReadInt32(); var valueBytes = reader.ReadBytes(length); Encoding Utf8 = new UTF8Encoding(false); if (length > 0) { value = new UEEnumProperty() { Value = Utf8.GetString(valueBytes, 0, valueBytes.Length - 1) }; Debug.WriteLine(String.Format(" {0}: {1}", ((UEStringProperty)key).Value, ((UEFloatProperty)value).Value)); } else { value = new UEEnumProperty(); Debug.WriteLine(String.Format(" {0}: {1}", ((UEStringProperty)key).Value, "")); } break; default: value = UESerializer.Deserialize(null, valueType, -1, reader); break; } values.Add(value); Map.Add(new UEKeyValuePair { Key = key, Values = values }); } }
public UESetProperty(BinaryReader reader, long valueLength) { var ItemType = reader.ReadUEString(); if (ItemType == "IntProperty") { ItemType += "Array"; } var terminator = reader.ReadByte(); if (terminator != 0) { throw new FormatException($"Offset: 0x{reader.BaseStream.Position - 1:x8}. Expected terminator (0x00), but was (0x{terminator:x2})"); } reader.ReadInt32(); var count = reader.ReadInt32(); Address = $"0x{ reader.BaseStream.Position - 1:x8}"; Items = new UEProperty[count]; switch (ItemType) { case "StructProperty": Items = Read(reader, count); break; case "ByteProperty": Items = UEByteProperty.Read(reader, valueLength, count); break; case "IntPropertyArray": for (var i = 0; i < count; i++) { var value = reader.ReadInt32(); Items[i] = new UEIntProperty() { Value = value }; Debug.WriteLine(String.Format(" {0} {1}", ((UEIntProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}")); } break; case "EnumProperty": for (var i = 0; i < count; i++) { Items[i] = new UEEnumProperty() { Value = reader.ReadUEString(), }; Debug.WriteLine(String.Format(" {0} ({1}) {2}", ((UEEnumProperty)Items[i]).EnumType, ((UEEnumProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}")); } break; case "SoftObjectProperty": for (var i = 0; i < count; i++) { Items[i] = new UEStringProperty() { Value = reader.ReadUEString(), }; Debug.WriteLine(String.Format(" {0} {1}", ((UEStringProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}")); } break; default: { for (var i = 0; i < count; i++) { Items[i] = UESerializer.Deserialize(null, ItemType, -1, reader); } break; } } }
public UEArrayProperty(BinaryReader reader, long valueLength) { ItemType = reader.ReadUEString(); if (ItemType == "IntProperty") { ItemType += "Array"; } var terminator = reader.ReadByte(); if (terminator != 0) { throw new FormatException($"Offset: 0x{reader.BaseStream.Position - 1:x8}. Expected terminator (0x00), but was (0x{terminator:x2})"); } // valueLength starts here var count = reader.ReadInt32(); Items = new UEProperty[count]; switch (ItemType) { case "StructProperty": Items = Read(reader, count); break; case "ByteProperty": Items = UEByteProperty.Read(reader, valueLength, count); break; case "IntPropertyArray": for (var i = 0; i < count; i++) { var value = reader.ReadInt32(); Items[i] = new UEIntProperty() { Value = value }; } break; case "EnumProperty": for (var i = 0; i < count; i++) { Items[i] = new UEEnumProperty() { Value = reader.ReadUEString(), }; } break; case "SoftObjectProperty": for (var i = 0; i < count; i++) { Items[i] = new UEStringProperty() { Value = reader.ReadUEString(), }; reader.ReadBytes(4); } break; default: { for (var i = 0; i < count; i++) { Items[i] = UESerializer.Deserialize(null, ItemType, -1, reader); } break; } } }