public static UEProperty Read(BinaryReader reader) { if (reader.PeekChar() < 0) { return(null); } var name = reader.ReadUEString(); if (name == null) { return(null); } if (name == "None") { return new UENoneProperty { Name = name } } ; var type = reader.ReadUEString(); var valueLength = reader.ReadInt64(); return(UESerializer.Deserialize(name, type, valueLength, reader)); }
public UEArrayProperty(BinaryReader reader, long valueLength) { ItemType = reader.ReadUEString(); 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; default: { for (var i = 0; i < count; i++) { Items[i] = UESerializer.Deserialize(null, ItemType, -1, reader); } break; } } }
public static UEProperty[] Read(BinaryReader reader, int count) { if (reader.PeekChar() < 0) { return(null); } var name = reader.ReadUEString(); var type = reader.ReadUEString(); var valueLength = reader.ReadInt64(); return(UESerializer.Deserialize(name, type, valueLength, count, reader)); }
public UEMapProperty(BinaryReader reader, long valueLength) { KeyType = reader.ReadUEString(); ValueType = reader.ReadUEString(); 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>(); do { if (ValueType == "StructProperty") { value = Read(reader); } else { value = UESerializer.Deserialize(null, ValueType, -1, reader); } values.Add(value); } while (!(value is UENoneProperty)); Map.Add(new UEKeyValuePair { Key = key, Values = values }); } if (count == 0) { //Read(reader); Read(reader); } }
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 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 }); } }