From 766b777f744c99dc66ddea7912fa8552fa596109 Mon Sep 17 00:00:00 2001 From: meli <57847713+ff-meli@users.noreply.github.com> Date: Thu, 21 Nov 2019 15:11:27 -0800 Subject: [PATCH] improve payload parsing of item links --- Dalamud/Game/Chat/SeString.cs | 45 ++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/Dalamud/Game/Chat/SeString.cs b/Dalamud/Game/Chat/SeString.cs index 8b777ddd5..c2cbaaed3 100644 --- a/Dalamud/Game/Chat/SeString.cs +++ b/Dalamud/Game/Chat/SeString.cs @@ -14,29 +14,42 @@ namespace Dalamud.Game.Chat { PlayerLink = 0x27 } + // in all likelihood these are flags of some kind, but these are the only 2 values I've noticed + public enum ItemQuality { + NormalQuality = 0xF2, + HighQuality = 0xF6 + } + private const int START_BYTE = 0x02; private const int END_BYTE = 0x03; - public static (string Output, List Payloads) Parse(string input) { + public static (string Output, List Payloads) Parse(byte[] bytes) + { var output = new List(); var payloads = new List(); - var bytes = Encoding.UTF8.GetBytes(input); using (var stream = new MemoryStream(bytes)) - using (var reader = new BinaryReader(stream)) { - while (stream.Position < bytes.Length) { + using (var reader = new BinaryReader(stream)) + { + while (stream.Position < bytes.Length) + { var b = stream.ReadByte(); if (b == START_BYTE) ProcessPacket(reader, output, payloads); else - output.Add((byte) b); + output.Add((byte)b); } } return (Encoding.UTF8.GetString(output.ToArray()), payloads); } + public static (string Output, List Payloads) Parse(string input) { + var bytes = Encoding.UTF8.GetBytes(input); + return Parse(bytes); + } + private static void ProcessPacket(BinaryReader reader, List output, List payloads) { var type = reader.ReadByte(); @@ -54,11 +67,27 @@ namespace Dalamud.Game.Chat { switch ((SeStringPayloadType) type) { case SeStringPayloadType.PlayerLink: - if (payload[0] == (byte) PlayerLinkType.ItemLink) - payloads.Add(new SeStringPayloadContainer { + if (payload[0] == (byte)PlayerLinkType.ItemLink) + { + int itemId; + if ((ItemQuality)payload[1] == ItemQuality.HighQuality) + { + // hq items have an extra 0x0F byte before the ID, and the ID is 0x4240 above the actual item ID + // This _seems_ consistent but I really don't know + itemId = (payload[3] << 8 | payload[4]) - 0x4240; + } + else + { + itemId = (payload[2] << 8 | payload[3]); + } + + payloads.Add(new SeStringPayloadContainer + { Type = SeStringPayloadType.PlayerLink, - Param1 = BitConverter.ToInt16(payload, 4) + Param1 = itemId }); + } + break; } }