| | | 1 | | using System.Globalization; |
| | | 2 | | using System.Text.Json; |
| | | 3 | | using System.Text.Json.Serialization; |
| | | 4 | | |
| | | 5 | | namespace RaidLoop.Core; |
| | | 6 | | |
| | | 7 | | internal sealed class ItemJsonConverter : JsonConverter<Item> |
| | | 8 | | { |
| | | 9 | | public override Item Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) |
| | | 10 | | { |
| | 24 | 11 | | using var document = JsonDocument.ParseValue(ref reader); |
| | 24 | 12 | | var root = document.RootElement; |
| | | 13 | | |
| | 24 | 14 | | var itemDefId = TryGetInt(root, "itemDefId"); |
| | 24 | 15 | | var itemKey = TryGetString(root, "itemKey"); |
| | 24 | 16 | | var itemName = TryGetString(root, "name"); |
| | | 17 | | |
| | 24 | 18 | | if (ItemCatalog.TryResolveAuthoredItem(itemDefId, itemKey, itemName, out var authoredItem) && authoredItem is no |
| | | 19 | | { |
| | 21 | 20 | | return authoredItem with { }; |
| | | 21 | | } |
| | | 22 | | |
| | 3 | 23 | | return new Item( |
| | 3 | 24 | | Name: itemName ?? itemKey ?? (itemDefId > 0 ? itemDefId.ToString(CultureInfo.InvariantCulture) : string.Empt |
| | 3 | 25 | | Type: TryGetInt(root, "type", TryGetInt(root, "Type")) is var typeValue ? (ItemType)typeValue : ItemType.Wea |
| | 3 | 26 | | Weight: TryGetInt(root, "weight", TryGetInt(root, "Weight")), |
| | 3 | 27 | | Value: TryGetInt(root, "value", TryGetInt(root, "Value", 1)), |
| | 3 | 28 | | Slots: TryGetInt(root, "slots", TryGetInt(root, "Slots", 1)), |
| | 3 | 29 | | Rarity: (Rarity)TryGetInt(root, "rarity", TryGetInt(root, "Rarity")), |
| | 3 | 30 | | DisplayRarity: (DisplayRarity)TryGetInt(root, "displayRarity", TryGetInt(root, "DisplayRarity"))) |
| | 3 | 31 | | { |
| | 3 | 32 | | ItemDefId = itemDefId, |
| | 3 | 33 | | Key = itemKey ?? string.Empty |
| | 3 | 34 | | }; |
| | 24 | 35 | | } |
| | | 36 | | |
| | | 37 | | public override void Write(Utf8JsonWriter writer, Item value, JsonSerializerOptions options) |
| | | 38 | | { |
| | 16 | 39 | | writer.WriteStartObject(); |
| | 16 | 40 | | writer.WriteNumber("itemDefId", value.ItemDefId); |
| | 16 | 41 | | writer.WriteNumber("type", (int)value.Type); |
| | 16 | 42 | | writer.WriteNumber("value", value.Value); |
| | 16 | 43 | | writer.WriteNumber("slots", value.Slots); |
| | 16 | 44 | | writer.WriteNumber("rarity", (int)value.Rarity); |
| | 16 | 45 | | writer.WriteNumber("displayRarity", (int)value.DisplayRarity); |
| | 16 | 46 | | writer.WriteNumber("weight", value.Weight); |
| | 16 | 47 | | writer.WriteEndObject(); |
| | 16 | 48 | | } |
| | | 49 | | |
| | | 50 | | private static string? TryGetString(JsonElement root, string propertyName) |
| | | 51 | | { |
| | 48 | 52 | | if (TryGetProperty(root, propertyName, out var value) && value.ValueKind == JsonValueKind.String) |
| | | 53 | | { |
| | 15 | 54 | | return value.GetString(); |
| | | 55 | | } |
| | | 56 | | |
| | 33 | 57 | | return null; |
| | | 58 | | } |
| | | 59 | | |
| | | 60 | | private static int TryGetInt(JsonElement root, string propertyName, int defaultValue = 0) |
| | | 61 | | { |
| | 60 | 62 | | if (TryGetProperty(root, propertyName, out var value) && value.ValueKind == JsonValueKind.Number && value.TryGet |
| | | 63 | | { |
| | 37 | 64 | | return number; |
| | | 65 | | } |
| | | 66 | | |
| | 23 | 67 | | return defaultValue; |
| | | 68 | | } |
| | | 69 | | |
| | | 70 | | private static bool TryGetProperty(JsonElement root, string propertyName, out JsonElement value) |
| | | 71 | | { |
| | 1038 | 72 | | foreach (var property in root.EnumerateObject()) |
| | | 73 | | { |
| | 437 | 74 | | if (string.Equals(property.Name, propertyName, StringComparison.OrdinalIgnoreCase)) |
| | | 75 | | { |
| | 52 | 76 | | value = property.Value; |
| | 52 | 77 | | return true; |
| | | 78 | | } |
| | | 79 | | } |
| | | 80 | | |
| | 56 | 81 | | value = default; |
| | 56 | 82 | | return false; |
| | 52 | 83 | | } |
| | | 84 | | } |