From 58a6020c8ba8b5c570831917285cf71a8d891340 Mon Sep 17 00:00:00 2001 From: Infi Date: Sat, 14 Dec 2024 18:23:18 +0100 Subject: [PATCH] - Add status linking (completes #66) - Preview status links --- ChatTwo/GameFunctions/Context.cs | 5 +++ ChatTwo/Message.cs | 34 ++++++++++++++--- ChatTwo/PayloadHandler.cs | 65 +++++++++++++++++++++++++------- ChatTwo/Sheets.cs | 2 + 4 files changed, 87 insertions(+), 19 deletions(-) diff --git a/ChatTwo/GameFunctions/Context.cs b/ChatTwo/GameFunctions/Context.cs index 67e2b63..aabac62 100755 --- a/ChatTwo/GameFunctions/Context.cs +++ b/ChatTwo/GameFunctions/Context.cs @@ -25,6 +25,11 @@ internal sealed unsafe class Context AgentChatLog.Instance()->LinkItem(itemId); } + internal static void LinkStatus(uint statusId) + { + AgentChatLog.Instance()->ContextStatusId = statusId; + } + internal static void OpenItemComparison(uint itemId) { AgentItemComp.Instance()->CompareItem(0x4D, itemId, 0, 0); diff --git a/ChatTwo/Message.cs b/ChatTwo/Message.cs index 6c4b9aa..4ba93fa 100755 --- a/ChatTwo/Message.cs +++ b/ChatTwo/Message.cs @@ -5,6 +5,7 @@ using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; using System.Text.RegularExpressions; using Dalamud.Game.Text; +using Dalamud.Utility; using FFXIVClientStructs.FFXIV.Client.UI.Agent; using Lumina.Excel.Sheets; @@ -265,14 +266,15 @@ internal partial class Message continue; } - if (!text.Content.Contains("") && !text.Content.Contains("")) + var splits = TextParamRegex().Split(text.Content); + if (splits.Length == 1) { newChunks.Add(chunk); continue; } var nextIsMatch = false; - foreach (var split in TextParamRegex().Split(text.Content)) + foreach (var split in splits) { if (split == "" || !nextIsMatch) { @@ -304,13 +306,33 @@ internal partial class Message }; var name = kind != ItemPayload.ItemKind.EventItem - ? Plugin.DataManager.GetExcelSheet()!.GetRow(item.ItemId)!.Name.ToString() - : Plugin.DataManager.GetExcelSheet()!.GetRow(item.ItemId)!.Name.ToString(); + ? Plugin.DataManager.GetExcelSheet().GetRow(item.ItemId).Name.ToString() + : Plugin.DataManager.GetExcelSheet().GetRow(item.ItemId).Name.ToString(); var link = new ItemPayload(item.ItemId, kind, $"{SeIconChar.LinkMarker.ToIconChar()}{name}"); AddChunkWithMessage(text.NewWithStyle(chunk.Source, link, link.DisplayName ?? "Unknown")); } - else + else if (split == "") + { + var statusId = AgentChatLog.Instance()->ContextStatusId; + if (statusId == 0 || !Sheets.StatusSheet.TryGetRow(statusId, out var statusRow)) + { + AddChunkWithMessage(text.NewWithStyle(chunk.Source, chunk.Link, split)); + continue; + } + + var nameValue = statusRow.Name.ToDalamudString().TextValue; + var content = statusRow.StatusCategory switch + { + 1 => $"{SeIconChar.Buff.ToIconString()}{nameValue}", + 2 => $"{SeIconChar.Debuff.ToIconString()}{nameValue}", + _ => nameValue + }; + + var link = new StatusPayload(statusId); + AddChunkWithMessage(text.NewWithStyle(chunk.Source, link, content)); + } + else if (split == "") { var agentMap = AgentMap.Instance(); if (agentMap->IsFlagMarkerSet == 0) @@ -339,6 +361,6 @@ internal partial class Message Content = newChunks; } - [GeneratedRegex("(|)")] + [GeneratedRegex("(||)")] private static partial Regex TextParamRegex(); } diff --git a/ChatTwo/PayloadHandler.cs b/ChatTwo/PayloadHandler.cs index 39165b1..ac61e4d 100755 --- a/ChatTwo/PayloadHandler.cs +++ b/ChatTwo/PayloadHandler.cs @@ -7,6 +7,7 @@ using Dalamud.Game.Addon.Lifecycle; using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.Config; +using Dalamud.Game.Text; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Interface.ImGuiNotification; @@ -15,7 +16,6 @@ using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; using Dalamud.Utility; -using FFXIVClientStructs.FFXIV.Client.LayoutEngine; using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Component.GUI; using ImGuiNET; @@ -89,6 +89,10 @@ public sealed class PayloadHandler DrawUriPopup(uri); drawn = true; break; + case StatusPayload status: + DrawStatusPopup(status); + drawn = true; + break; } ContextFooter(drawn, chunk); @@ -293,26 +297,31 @@ public sealed class PayloadHandler ImGui.SetCursorPos(cursor + new Vector2(size.X + 4, size.Y - ImGui.GetTextLineHeightWithSpacing())); } - private static unsafe SeString ResolveRsv(SeString input) - { - var txt = input.TextValue; - if (txt.StartsWith("_rsv_")) - input = SeString.Parse(LayoutWorld.Instance()->ResolveRsvString(txt)); - - return input; - } - private void HoverStatus(StatusPayload status) { if (Plugin.TextureProvider.GetFromGameIcon(status.Status.Value.Icon).GetWrapOrDefault() is { } icon) InlineIcon(icon); - var nameString = ResolveRsv(status.Status.Value.Name.ToDalamudString()); - var name = ChunkUtil.ToChunks(nameString, ChunkSource.None, null); + var builder = new SeStringBuilder(); + var nameValue = status.Status.Value.Name.ToDalamudString().TextValue; + switch (status.Status.Value.StatusCategory) + { + case 1: + builder.AddUiForeground($"{SeIconChar.Buff.ToIconString()}{nameValue}", 517); + break; + case 2: + builder.AddUiForeground($"{SeIconChar.Debuff.ToIconString()}{nameValue}", 518); + break; + default: + builder.AddUiForeground(nameValue, 1); + break; + }; + + var name = ChunkUtil.ToChunks(builder.BuiltString, ChunkSource.None, null); LogWindow.DrawChunks(name.ToList()); ImGui.Separator(); - var descString = ResolveRsv(status.Status.Value.Description.ToDalamudString()); + var descString = status.Status.Value.Description.ToDalamudString(); var desc = ChunkUtil.ToChunks(descString, ChunkSource.None, null); LogWindow.DrawChunks(desc.ToList()); } @@ -652,4 +661,34 @@ public sealed class PayloadHandler WrapperUtil.AddNotification(Language.Context_CopyLinkNotification, NotificationType.Info); } } + + private void DrawStatusPopup(StatusPayload status) + { + if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(status.Status.Value.Icon)).GetWrapOrDefault() is { } icon) + InlineIcon(icon); + + var builder = new SeStringBuilder(); + var nameValue = status.Status.Value.Name.ToDalamudString().TextValue; + switch (status.Status.Value.StatusCategory) + { + case 1: + builder.AddUiForeground($"{SeIconChar.Buff.ToIconString()}{nameValue}", 517); + break; + case 2: + builder.AddUiForeground($"{SeIconChar.Debuff.ToIconString()}{nameValue}", 518); + break; + default: + builder.AddUiForeground(nameValue, 1); + break; + }; + + LogWindow.DrawChunks(ChunkUtil.ToChunks(builder.BuiltString, ChunkSource.None, null).ToList(), false); + ImGui.Separator(); + + if (ImGui.Selectable(Language.Context_Link)) + { + GameFunctions.Context.LinkStatus(status.Status.RowId); + LogWindow.Chat += " "; + } + } } diff --git a/ChatTwo/Sheets.cs b/ChatTwo/Sheets.cs index 9bea4ee..8468548 100644 --- a/ChatTwo/Sheets.cs +++ b/ChatTwo/Sheets.cs @@ -7,6 +7,7 @@ public static class Sheets { public static readonly ExcelSheet ItemSheet; public static readonly ExcelSheet WorldSheet; + public static readonly ExcelSheet StatusSheet; public static readonly ExcelSheet LogFilterSheet; public static readonly ExcelSheet EventItemSheet; public static readonly ExcelSheet CompletionSheet; @@ -18,6 +19,7 @@ public static class Sheets { ItemSheet = Plugin.DataManager.GetExcelSheet(); WorldSheet = Plugin.DataManager.GetExcelSheet(); + StatusSheet = Plugin.DataManager.GetExcelSheet(); EventItemSheet = Plugin.DataManager.GetExcelSheet(); LogFilterSheet = Plugin.DataManager.GetExcelSheet(); CompletionSheet = Plugin.DataManager.GetExcelSheet();