Skip to content

Commit ad70e80

Browse files
committed
Item modifiers parser (#1287)
* Parse item modifiers * Move everything to System.Text.Json * Complete item parser * Add some more energy + health mods * Fix more mods * Output ids as hex
1 parent dcffce5 commit ad70e80

File tree

100 files changed

+2370
-1256
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+2370
-1256
lines changed

Daybreak.API/Serialization/ApiJsonSerializerContext.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Daybreak.API.Models;
22
using Daybreak.Shared.Models.Api;
3+
using Daybreak.Shared.Models.Guildwars;
34
using System.Text.Json;
45
using System.Text.Json.Serialization;
56

@@ -35,6 +36,8 @@ namespace Daybreak.API.Serialization;
3536
[JsonSerializable(typeof(LoginInfo))]
3637
[JsonSerializable(typeof(MainPlayerBuildContext))]
3738
[JsonSerializable(typeof(InventoryInformation))]
39+
[JsonSerializable(typeof(ItemProperty))]
40+
[JsonSourceGenerationOptions(UseStringEnumConverter = true)]
3841
public partial class ApiJsonSerializerContext : JsonSerializerContext
3942
{
4043
}

Daybreak.API/Services/InventoryService.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using Daybreak.API.Interop.GuildWars;
22
using Daybreak.API.Services.Interop;
33
using Daybreak.Shared.Models.Api;
4+
using Daybreak.Shared.Models.Guildwars;
45
using System.Extensions.Core;
6+
using System.Text;
57

68
namespace Daybreak.API.Services;
79

@@ -37,15 +39,15 @@ public sealed class InventoryService(
3739
return default;
3840
}
3941

40-
var itemTuples = new List<(BagType Type,List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, int Quantity, uint[] Modifiers, ItemType ItemType)>)>();
42+
var itemTuples = new List<(BagType Type,List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType)>)>();
4143
foreach (var bag in inventory.Pointer->Bags)
4244
{
4345
if (bag is null)
4446
{
4547
continue;
4648
}
4749

48-
var retBag = new List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, int Quantity, uint[] Modifiers, ItemType ItemType)>();
50+
var retBag = new List<(uint ModelId, string EncodedCompleteName, string EncodedSingleName, string EncodedName, bool Inscribable, int Quantity, uint[] Modifiers, ItemType ItemType)>();
4951
itemTuples.Add((bag->Type, retBag));
5052
if (bag->ItemsCount is 0)
5153
{
@@ -68,7 +70,7 @@ public sealed class InventoryService(
6870
modifiers[j] = item.Pointer->Modifiers[j].Mod;
6971
}
7072

71-
retBag.Add((item.Pointer->ModelId, completeNameEncoded, singleItemName, nameEncoded, item.Pointer->Quantity, modifiers, item.Pointer->Type));
73+
retBag.Add((item.Pointer->ModelId, completeNameEncoded, singleItemName, nameEncoded, item.Pointer->Inscribable, item.Pointer->Quantity, modifiers, item.Pointer->Type));
7274
}
7375
}
7476

@@ -88,7 +90,7 @@ public sealed class InventoryService(
8890
var decodedName = await this.uIService.DecodeString(item.EncodedName, Language.English, cancellationToken);
8991
var decodedCompleteName = await this.uIService.DecodeString(item.EncodedCompleteName, Language.English, cancellationToken);
9092
var decodedSingleName = await this.uIService.DecodeString(item.EncodedSingleName, Language.English, cancellationToken);
91-
return (item.ModelId, item.EncodedName, DecodedName: decodedName, item.EncodedSingleName, DecodedSingleName: decodedSingleName, item.EncodedCompleteName, DecodedCompleteName: decodedCompleteName, item.Quantity, item.Modifiers, item.ItemType);
93+
return (item.ModelId, item.EncodedName, DecodedName: decodedName, item.EncodedSingleName, DecodedSingleName: decodedSingleName, item.EncodedCompleteName, DecodedCompleteName: decodedCompleteName, item.Inscribable, item.Quantity, item.Modifiers, item.ItemType);
9294
}));
9395
return (tuple.Type, Items: decodedItems.ToList());
9496
}));
@@ -106,15 +108,15 @@ public sealed class InventoryService(
106108
DecodedSingleName: item.DecodedSingleName ?? string.Empty,
107109
EncodedCompleteName: ToBase64(item.EncodedCompleteName),
108110
DecodedCompleteName: item.DecodedCompleteName ?? string.Empty,
111+
Inscribable: item.Inscribable,
109112
Quantity: item.Quantity,
110113
Modifiers: item.Modifiers,
114+
Properties: [.. ItemProperty.ParseItemModifiers([.. item.Modifiers.Select(m => (Shared.Models.Guildwars.ItemModifier)m)])],
111115
ItemType: item.ItemType.ToString()))]))]);
112116
}
113117

114118
private static string ToBase64(string encoded)
115119
{
116-
var bytes = new byte[encoded.Length * sizeof(char)];
117-
Buffer.BlockCopy(encoded.ToCharArray(), 0, bytes, 0, bytes.Length);
118-
return Convert.ToBase64String(bytes);
120+
return Convert.ToBase64String(Encoding.Unicode.GetBytes(encoded));
119121
}
120122
}

Daybreak.Shared/Converters/AttributeJsonConverter.cs

Lines changed: 0 additions & 50 deletions
This file was deleted.

Daybreak.Shared/Converters/CampaignJsonConverter.cs

Lines changed: 0 additions & 51 deletions
This file was deleted.

Daybreak.Shared/Converters/ContinentJsonConverter.cs

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace Daybreak.Shared.Converters;
5+
6+
public sealed class HexIntConverter : JsonConverter<int>
7+
{
8+
public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
9+
{
10+
if (reader.TokenType == JsonTokenType.String)
11+
{
12+
var hexString = reader.GetString();
13+
if (hexString is not null && hexString.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
14+
{
15+
return Convert.ToInt32(hexString[2..], 16);
16+
}
17+
}
18+
19+
return reader.GetInt32();
20+
}
21+
22+
public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
23+
{
24+
writer.WriteStringValue($"0x{value:X4}");
25+
}
26+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace Daybreak.Shared.Converters;
5+
6+
public sealed class HexUIntArrayJsonConverter : JsonConverter<uint[]>
7+
{
8+
private static readonly HexUintConverter ElementConverter = new();
9+
10+
public override uint[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
11+
{
12+
if (reader.TokenType != JsonTokenType.StartArray)
13+
{
14+
throw new JsonException();
15+
}
16+
17+
var list = new List<uint>();
18+
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
19+
{
20+
list.Add(ElementConverter.Read(ref reader, typeof(uint), options));
21+
}
22+
23+
return [.. list];
24+
}
25+
26+
public override void Write(Utf8JsonWriter writer, uint[] value, JsonSerializerOptions options)
27+
{
28+
writer.WriteStartArray();
29+
foreach (var item in value)
30+
{
31+
ElementConverter.Write(writer, item, options);
32+
}
33+
34+
writer.WriteEndArray();
35+
}
36+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
4+
namespace Daybreak.Shared.Converters;
5+
6+
public sealed class HexUintConverter : JsonConverter<uint>
7+
{
8+
public override uint Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
9+
{
10+
if (reader.TokenType == JsonTokenType.String)
11+
{
12+
var hexString = reader.GetString();
13+
if (hexString is not null && hexString.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
14+
{
15+
return Convert.ToUInt32(hexString[2..], 16);
16+
}
17+
}
18+
19+
return reader.GetUInt32();
20+
}
21+
22+
public override void Write(Utf8JsonWriter writer, uint value, JsonSerializerOptions options)
23+
{
24+
writer.WriteStringValue($"0x{value:X4}");
25+
}
26+
}

Daybreak.Shared/Converters/ItemBaseJsonConverter.cs

Lines changed: 0 additions & 51 deletions
This file was deleted.

0 commit comments

Comments
 (0)