From 8f243762cc29d6a24ac82331ca49769af0a77880 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Sat, 9 Dec 2023 01:23:04 +0100 Subject: [PATCH] ChatGui: fix for new message sounds and interactable links (#1568) * Change PrintMessage parameters type to byte * Use Utf8String.AsSpan * Fix InteractableLinkClickedDetour using the wrong variable --- Dalamud/Game/Gui/ChatGui.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Dalamud/Game/Gui/ChatGui.cs b/Dalamud/Game/Gui/ChatGui.cs index 1214850b0..02b52ee56 100644 --- a/Dalamud/Game/Gui/ChatGui.cs +++ b/Dalamud/Game/Gui/ChatGui.cs @@ -22,6 +22,7 @@ namespace Dalamud.Game.Gui; // TODO(api10): Update IChatGui, ChatGui and XivChatEntry to use correct types and names: // "uint SenderId" should be "int Timestamp". // "IntPtr Parameters" should be something like "bool Silent". It suppresses new message sounds in certain channels. +// This has to be a 1 byte boolean, so only change it to bool if marshalling is disabled. /// /// This class handles interacting with the native chat UI. @@ -62,7 +63,7 @@ internal sealed unsafe class ChatGui : IDisposable, IServiceType, IChatGui } [UnmanagedFunctionPointer(CallingConvention.ThisCall)] - private delegate uint PrintMessageDelegate(RaptureLogModule* manager, XivChatType chatType, Utf8String* sender, Utf8String* message, int timestamp, bool silent); + private delegate uint PrintMessageDelegate(RaptureLogModule* manager, XivChatType chatType, Utf8String* sender, Utf8String* message, int timestamp, byte silent); [UnmanagedFunctionPointer(CallingConvention.ThisCall)] private delegate void PopulateItemLinkDelegate(IntPtr linkObjectPtr, IntPtr itemInfoPtr); @@ -157,7 +158,7 @@ internal sealed unsafe class ChatGui : IDisposable, IServiceType, IChatGui var sender = Utf8String.FromSequence(chat.Name.Encode()); var message = Utf8String.FromSequence(chat.Message.Encode()); - this.HandlePrintMessageDetour(RaptureLogModule.Instance(), chat.Type, sender, message, (int)chat.SenderId, chat.Parameters != 0); + this.HandlePrintMessageDetour(RaptureLogModule.Instance(), chat.Type, sender, message, (int)chat.SenderId, (byte)(chat.Parameters != 0 ? 1 : 0)); sender->Dtor(true); message->Dtor(true); @@ -278,14 +279,14 @@ internal sealed unsafe class ChatGui : IDisposable, IServiceType, IChatGui } } - private uint HandlePrintMessageDetour(RaptureLogModule* manager, XivChatType chatType, Utf8String* sender, Utf8String* message, int timestamp, bool silent) + private uint HandlePrintMessageDetour(RaptureLogModule* manager, XivChatType chatType, Utf8String* sender, Utf8String* message, int timestamp, byte silent) { var messageId = 0u; try { - var originalSenderData = sender->Span.ToArray(); - var originalMessageData = message->Span.ToArray(); + var originalSenderData = sender->AsSpan().ToArray(); + var originalMessageData = message->AsSpan().ToArray(); var parsedSender = SeString.Parse(originalSenderData); var parsedMessage = SeString.Parse(originalMessageData); @@ -374,7 +375,7 @@ internal sealed unsafe class ChatGui : IDisposable, IServiceType, IChatGui Log.Verbose($"InteractableLinkClicked: {Payload.EmbeddedInfoType.DalamudLink}"); var payloadPtr = Marshal.ReadIntPtr(messagePtr, 0x10); - var seStr = MemoryHelper.ReadSeStringNullTerminated(messagePtr); + var seStr = MemoryHelper.ReadSeStringNullTerminated(payloadPtr); var terminatorIndex = seStr.Payloads.IndexOf(RawPayload.LinkTerminator); var payloads = terminatorIndex >= 0 ? seStr.Payloads.Take(terminatorIndex + 1).ToList() : seStr.Payloads; if (payloads.Count == 0) return;