Use SeString Expressions in DalamudLinkPayload (#1856)

This commit is contained in:
Haselnussbomber 2024-06-29 00:01:57 +02:00 committed by GitHub
parent 2e3153c502
commit 1a91495159
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text;
using Lumina.Text.Payloads;
using Lumina.Text.ReadOnly;
namespace Dalamud.Game.Text.SeStringHandling.Payloads; namespace Dalamud.Game.Text.SeStringHandling.Payloads;
@ -31,27 +32,33 @@ public class DalamudLinkPayload : Payload
/// <inheritdoc/> /// <inheritdoc/>
protected override byte[] EncodeImpl() protected override byte[] EncodeImpl()
{ {
var pluginBytes = Encoding.UTF8.GetBytes(this.Plugin); return new Lumina.Text.SeStringBuilder()
var commandBytes = MakeInteger(this.CommandId); .BeginMacro(MacroCode.Link)
var chunkLen = 3 + pluginBytes.Length + commandBytes.Length; .AppendIntExpression((int)EmbeddedInfoType.DalamudLink - 1)
.AppendStringExpression(this.Plugin)
if (chunkLen > 255) .AppendUIntExpression(this.CommandId)
{ .EndMacro()
throw new Exception("Chunk is too long. Plugin name exceeds limits for DalamudLinkPayload"); .ToArray();
}
var bytes = new List<byte> { 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();
} }
/// <inheritdoc/> /// <inheritdoc/>
protected override void DecodeImpl(BinaryReader reader, long endOfStream) protected override void DecodeImpl(BinaryReader reader, long endOfStream)
{ {
this.Plugin = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadByte())); // Note: Payload.DecodeChunk already took the first int expr (DalamudLink).
this.CommandId = GetInteger(reader);
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;
} }
} }