public static UEStructProperty[] Read(BinaryReader reader, long valueLength, int count) { var type = reader.ReadUEString(); var id = new Guid(reader.ReadBytes(16)); if (id != Guid.Empty) { throw new FormatException($"Offset: 0x{reader.BaseStream.Position - 16:x8}. Expected struct ID {Guid.Empty}, but was {id}"); } 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})"); } var result = new UEStructProperty[Math.Max(count, 1)]; if (count == 0) { result[0] = new UEGenericStructProperty(); result[0].StructType = type; return(result); } for (var i = 0; i < count; i++) { result[i] = ReadStructValue(type, reader, valueLength); } return(result); }
protected static UEStructProperty ReadStructValue(string type, BinaryReader reader) { UEStructProperty result; switch (type) { case "DateTime": result = new UEDateTimeStructProperty(reader); break; case "Guid": result = new UEGuidStructProperty(reader); break; case "Vector": case "Rotator": result = new UEVectorStructProperty(reader); break; case "Rotation": result = new UEVectorStructProperty(reader); break; case "LinearColor": result = new UELinearColorStructProperty(reader); break; case "Quat": // TODO: Implement Quat parser, GUID parser as placeholder, results are currently invalid result = new UEGuidStructProperty(reader); break; default: var tmp = new UEGenericStructProperty(); while (Read(reader) is UEProperty prop) { tmp.Properties.Add(prop); if (prop is UENoneProperty) { break; } } result = tmp; break; } result.Type = type; return(result); }
protected static UEStructProperty ReadStructValue(string type, BinaryReader reader) { UEStructProperty result; switch (type) { case "DateTime": result = new UEDateTimeStructProperty(reader); break; case "Guid": result = new UEGuidStructProperty(reader); break; case "Vector": case "Rotator": result = new UEVectorStructProperty(reader); break; case "LinearColor": result = new UELinearColorStructProperty(reader); break; case "Quat": result = new UEQuatStructProperty(reader); break; default: var tmp = new UEGenericStructProperty(); while (Read(reader) is { } prop) { tmp.Properties.Add(prop); if (prop is UENoneProperty) { break; } } result = tmp; break; } result.Type = type; return(result); }
protected static UEStructProperty ReadStructValue(string type, BinaryReader reader, long valueLength) { UEStructProperty result; switch (type) { case "DateTime": result = new UEDateTimeStructProperty(reader); break; case "Guid": result = new UEGuidStructProperty(reader); break; case "Vector": case "Rotator": result = new UEVectorStructProperty(reader); break; case "LinearColor": result = new UELinearColorStructProperty(reader); break; /*case "Transform": * result = new UETransformStructProperty(reader); * break;*/ case "Quat": result = new UEQuaternionStructProperty(reader); break; default: result = new UEGenericStructProperty(reader); break; } result.StructType = type; result.ValueLength = valueLength; return(result); }