diff --git a/Core/Models/Eft/Common/Tables/TemplateItem.cs b/Core/Models/Eft/Common/Tables/TemplateItem.cs index 16c9e389..08f3d38d 100644 --- a/Core/Models/Eft/Common/Tables/TemplateItem.cs +++ b/Core/Models/Eft/Common/Tables/TemplateItem.cs @@ -1,4 +1,5 @@ using System.Text.Json.Serialization; +using Core.Utils.Json.Converters; namespace Core.Models.Eft.Common.Tables; @@ -76,8 +77,8 @@ public class Props [JsonPropertyName("ItemSound")] public string? ItemSound { get; set; } - [JsonPropertyName("Prefab")] - public Prefab? Prefab { get; set; } + [JsonPropertyName("Prefab")] // TODO: TYPE FUCKERY: can be a Prefab object or empty string or a string + public object? Prefab { get; set; } [JsonPropertyName("UsePrefab")] public Prefab? UsePrefab { get; set; } @@ -1344,6 +1345,12 @@ public class Props [JsonPropertyName("Body")] public string? Body { get; set; } + + [JsonPropertyName("Hands")] + public string? Hands { get; set; } + + [JsonExtensionData] + public Dictionary OtherProperties { get; set; } } public class WeaponRecoilSettings @@ -1704,4 +1711,4 @@ public enum ItemType { NODE = 1, ITEM = 2 -} \ No newline at end of file +} diff --git a/Core/Utils/Json/Converters/StringToObjectFactoryConverter.cs b/Core/Utils/Json/Converters/StringToObjectFactoryConverter.cs new file mode 100644 index 00000000..e3072fed --- /dev/null +++ b/Core/Utils/Json/Converters/StringToObjectFactoryConverter.cs @@ -0,0 +1,46 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Core.Utils.Json.Converters; + +public class StringToObjectFactoryConverter : JsonConverterFactory +{ + public override bool CanConvert(Type typeToConvert) + { + return true; + } + + public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options) + { + return (JsonConverter)Activator.CreateInstance(typeof(StringToObjectConverter<>).MakeGenericType(typeToConvert)); + } + + public class StringToObjectConverter : JsonConverter + { + public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case JsonTokenType.String: + // start array + reader.Read(); + return default; + case JsonTokenType.StartObject: + using (var jsonDocument = JsonDocument.ParseValue(ref reader)) + { + var jsonText = jsonDocument.RootElement.GetRawText(); + return JsonSerializer.Deserialize(jsonText); + } + } + + return default; + } + + public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) + { + if (value == null) + value = default; + JsonSerializer.Serialize(writer, value, options); + } + } +}