From 1a91495159c3b01cd20153414dcc77c53c6974c0 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Sat, 29 Jun 2024 00:01:57 +0200 Subject: [PATCH] Use SeString Expressions in DalamudLinkPayload (#1856) --- .../Payloads/DalamudLinkPayload.cs | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/Dalamud/Game/Text/SeStringHandling/Payloads/DalamudLinkPayload.cs b/Dalamud/Game/Text/SeStringHandling/Payloads/DalamudLinkPayload.cs index 0310372bb..d069be30d 100644 --- a/Dalamud/Game/Text/SeStringHandling/Payloads/DalamudLinkPayload.cs +++ b/Dalamud/Game/Text/SeStringHandling/Payloads/DalamudLinkPayload.cs @@ -1,6 +1,7 @@ -using System.Collections.Generic; using System.IO; -using System.Text; + +using Lumina.Text.Payloads; +using Lumina.Text.ReadOnly; namespace Dalamud.Game.Text.SeStringHandling.Payloads; @@ -31,27 +32,33 @@ public class DalamudLinkPayload : Payload /// protected override byte[] EncodeImpl() { - var pluginBytes = Encoding.UTF8.GetBytes(this.Plugin); - var commandBytes = MakeInteger(this.CommandId); - var chunkLen = 3 + pluginBytes.Length + commandBytes.Length; - - if (chunkLen > 255) - { - throw new Exception("Chunk is too long. Plugin name exceeds limits for DalamudLinkPayload"); - } - - var bytes = new List { START_BYTE, (byte)SeStringChunkType.Interactable, (byte)chunkLen, (byte)EmbeddedInfoType.DalamudLink }; - bytes.Add((byte)pluginBytes.Length); - bytes.AddRange(pluginBytes); - bytes.AddRange(commandBytes); - bytes.Add(END_BYTE); - return bytes.ToArray(); + return new Lumina.Text.SeStringBuilder() + .BeginMacro(MacroCode.Link) + .AppendIntExpression((int)EmbeddedInfoType.DalamudLink - 1) + .AppendStringExpression(this.Plugin) + .AppendUIntExpression(this.CommandId) + .EndMacro() + .ToArray(); } /// protected override void DecodeImpl(BinaryReader reader, long endOfStream) { - this.Plugin = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadByte())); - this.CommandId = GetInteger(reader); + // Note: Payload.DecodeChunk already took the first int expr (DalamudLink). + + var body = reader.ReadBytes((int)(endOfStream - reader.BaseStream.Position)); + var rosps = new ReadOnlySePayloadSpan(ReadOnlySePayloadType.Macro, MacroCode.Link, body.AsSpan()); + + if (!rosps.TryGetExpression(out var pluginExpression, out var commandIdExpression)) + return; + + if (!pluginExpression.TryGetString(out var pluginString)) + return; + + if (!commandIdExpression.TryGetUInt(out var commandId)) + return; + + this.Plugin = pluginString.ExtractText(); + this.CommandId = commandId; } }