From 0f30b8240c2cd3ba80e83c66b4b30180674c81e1 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 18:40:00 +0200 Subject: [PATCH 01/10] feat: append payloads to SeStringBuilder --- Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs index 36bb10a2d..1e3449618 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs @@ -1,3 +1,6 @@ +using System.Collections.Generic; +using System.Linq; + using Dalamud.Game.Text.SeStringHandling.Payloads; namespace Dalamud.Game.Text.SeStringHandling; @@ -30,6 +33,13 @@ public class SeStringBuilder /// The current builder. public SeStringBuilder Append(string text) => this.AddText(text); + /// + /// Append payloads to the builder. + /// + /// A list of payloads. + /// The current builder. + public SeStringBuilder Append(IEnumerable payloads) => this.Append(new SeString(payloads.ToList())); + /// /// Append raw text to the builder. /// From 982755c4a2858e9abbf662e0789884acfa050a8e Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 18:42:56 +0200 Subject: [PATCH 02/10] fix: reset colors in SeString.CreateItemLink --- Dalamud/Game/Text/SeStringHandling/SeString.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dalamud/Game/Text/SeStringHandling/SeString.cs b/Dalamud/Game/Text/SeStringHandling/SeString.cs index 6d0c8b0fb..e0cb67cff 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeString.cs @@ -211,8 +211,8 @@ public class SeString // arrow goes here new TextPayload(displayName), RawPayload.LinkTerminator, - // sometimes there is another set of uiglow/foreground off payloads here - // might be necessary when including additional text after the item name + UIGlowPayload.UIGlowOff, + UIForegroundPayload.UIForegroundOff, }); payloads.InsertRange(3, TextArrowPayloads); From 3f78df23e3a96f2118ac0801c2748c2641135f49 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 18:44:45 +0200 Subject: [PATCH 03/10] feat: item rarity color in SeString.CreateItemLink --- .../Game/Text/SeStringHandling/SeString.cs | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Dalamud/Game/Text/SeStringHandling/SeString.cs b/Dalamud/Game/Text/SeStringHandling/SeString.cs index e0cb67cff..c06cdc6b0 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeString.cs @@ -171,6 +171,7 @@ public class SeString var data = Service.Get(); var displayName = displayNameOverride; + var rarity = 1; // default: white if (displayName == null) { switch (kind) @@ -178,7 +179,9 @@ public class SeString case ItemPayload.ItemKind.Normal: case ItemPayload.ItemKind.Collectible: case ItemPayload.ItemKind.Hq: - displayName = data.GetExcelSheet()?.GetRow(itemId)?.Name; + var item = data.GetExcelSheet()?.GetRow(itemId); + displayName = item?.Name; + rarity = item.Rarity; break; case ItemPayload.ItemKind.EventItem: displayName = data.GetExcelSheet()?.GetRow(itemId)?.Name; @@ -202,21 +205,19 @@ public class SeString displayName += $" {(char)SeIconChar.Collectible}"; } - // TODO: probably a cleaner way to build these than doing the bulk+insert - var payloads = new List(new Payload[] - { - new UIForegroundPayload(0x0225), - new UIGlowPayload(0x0226), - new ItemPayload(itemId, kind), - // arrow goes here - new TextPayload(displayName), - RawPayload.LinkTerminator, - UIGlowPayload.UIGlowOff, - UIForegroundPayload.UIForegroundOff, - }); - payloads.InsertRange(3, TextArrowPayloads); + var textColor = (ushort)(549 + ((rarity - 1) * 2)); + var textGlowColor = (ushort)(textColor + 1); - return new SeString(payloads); + return new SeStringBuilder() + .Add(new ItemPayload(itemId, kind)) + .Append(TextArrowPayloads) + .AddUiForeground(textColor) + .AddUiGlow(textGlowColor) + .AddText(displayName) + .AddUiGlowOff() + .AddUiForegroundOff() + .Add(RawPayload.LinkTerminator) + .Build(); } /// From 08100ef572c46d148e5bd60f43fbaf2f0a531f89 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 18:57:00 +0200 Subject: [PATCH 04/10] fix: add a full item link to SeStringBuilder This changes the behaviour of `AddItemLink` functions. Previously it just added an `ItemPayload`. Now, it adds a full item link, as one would expect. --- Dalamud/Game/Text/SeStringHandling/SeString.cs | 1 + Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Dalamud/Game/Text/SeStringHandling/SeString.cs b/Dalamud/Game/Text/SeStringHandling/SeString.cs index c06cdc6b0..d7d1784f4 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeString.cs @@ -208,6 +208,7 @@ public class SeString var textColor = (ushort)(549 + ((rarity - 1) * 2)); var textGlowColor = (ushort)(textColor + 1); + // Note: `SeStringBuilder.AddItemLink` uses this function, so don't call it here! return new SeStringBuilder() .Add(new ItemPayload(itemId, kind)) .Append(TextArrowPayloads) diff --git a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs index 1e3449618..5b6a83f61 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs @@ -114,7 +114,7 @@ public class SeStringBuilder /// Override for the item's name. /// The current builder. public SeStringBuilder AddItemLink(uint itemId, bool isHq, string? itemNameOverride = null) => - this.Add(new ItemPayload(itemId, isHq, itemNameOverride)); + this.Append(SeString.CreateItemLink(itemId, isHq, itemNameOverride)); /// /// Add an item link to the builder. @@ -124,7 +124,7 @@ public class SeStringBuilder /// Override for the item's name. /// The current builder. public SeStringBuilder AddItemLink(uint itemId, ItemPayload.ItemKind kind, string? itemNameOverride = null) => - this.Add(new ItemPayload(itemId, kind, itemNameOverride)); + this.Append(SeString.CreateItemLink(itemId, kind, itemNameOverride)); /// /// Add an item link to the builder. From e47bfc7acaca9d6a2b4f0f6d7038f7520237ec8a Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 18:58:07 +0200 Subject: [PATCH 05/10] docs: reminder to add a LinkTerminator --- Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs index 5b6a83f61..5d7bcce1d 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs @@ -131,6 +131,7 @@ public class SeStringBuilder /// /// The raw item ID. /// The current builder. + /// To terminate this item link, add a . public SeStringBuilder AddItemLinkRaw(uint rawItemId) => this.Add(ItemPayload.FromRaw(rawItemId)); From dd845a30f0cfb7dc109846ba9bfcda313028264a Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 20:40:42 +0200 Subject: [PATCH 06/10] fix: correct order of CreateItemLink payloads --- Dalamud/Game/Text/SeStringHandling/SeString.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dalamud/Game/Text/SeStringHandling/SeString.cs b/Dalamud/Game/Text/SeStringHandling/SeString.cs index d7d1784f4..207f65287 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeString.cs @@ -210,10 +210,10 @@ public class SeString // Note: `SeStringBuilder.AddItemLink` uses this function, so don't call it here! return new SeStringBuilder() - .Add(new ItemPayload(itemId, kind)) - .Append(TextArrowPayloads) .AddUiForeground(textColor) .AddUiGlow(textGlowColor) + .Add(new ItemPayload(itemId, kind)) + .Append(TextArrowPayloads) .AddText(displayName) .AddUiGlowOff() .AddUiForegroundOff() From d6555007ce16745b538a5f960a3771c497168e14 Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 20:56:11 +0200 Subject: [PATCH 07/10] fix: adjust TextArrowPayloads based on language --- .../Game/Text/SeStringHandling/SeString.cs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Dalamud/Game/Text/SeStringHandling/SeString.cs b/Dalamud/Game/Text/SeStringHandling/SeString.cs index 207f65287..12cc94c3d 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeString.cs @@ -52,14 +52,27 @@ public class SeString /// with the appropriate glow and coloring. /// /// A list of all the payloads required to insert the link marker. - public static IEnumerable TextArrowPayloads => new List(new Payload[] + public static IEnumerable TextArrowPayloads { - new UIForegroundPayload(0x01F4), - new UIGlowPayload(0x01F5), - new TextPayload($"{(char)SeIconChar.LinkMarker}"), - UIGlowPayload.UIGlowOff, - UIForegroundPayload.UIForegroundOff, - }); + get + { + var clientState = Service.Get(); + var markerSpace = clientState.ClientLanguage switch + { + ClientLanguage.German => " ", + ClientLanguage.French => " ", + _ => string.Empty, + }; + return new List + { + new UIForegroundPayload(500), + new UIGlowPayload(501), + new TextPayload($"{(char)SeIconChar.LinkMarker}{markerSpace}"), + UIGlowPayload.UIGlowOff, + UIForegroundPayload.UIForegroundOff, + }; + } + } /// /// Gets an empty SeString. From 038de41592cb2e3cd0b43f664fb2289a227cc80d Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 21:38:33 +0200 Subject: [PATCH 08/10] fix: adjust CoordinateString based on language --- .../Game/Text/SeStringHandling/Payloads/MapLinkPayload.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Dalamud/Game/Text/SeStringHandling/Payloads/MapLinkPayload.cs b/Dalamud/Game/Text/SeStringHandling/Payloads/MapLinkPayload.cs index 50945a7ce..667b52e36 100644 --- a/Dalamud/Game/Text/SeStringHandling/Payloads/MapLinkPayload.cs +++ b/Dalamud/Game/Text/SeStringHandling/Payloads/MapLinkPayload.cs @@ -130,7 +130,13 @@ public class MapLinkPayload : Payload var y = Math.Truncate((this.YCoord + fudge) * 10.0f) / 10.0f; // the formatting and spacing the game uses - return $"( {x:0.0} , {y:0.0} )"; + var clientState = Service.Get(); + return clientState.ClientLanguage switch + { + ClientLanguage.German => $"( {x:0.0}, {y:0.0} )", + ClientLanguage.Japanese => $"({x:0.0}, {y:0.0})", + _ => $"( {x:0.0} , {y:0.0} )", + }; } } From 5b6c90f122da0cf3b7bf3f20d103a2752fbf3e3b Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Tue, 1 Aug 2023 21:55:51 +0200 Subject: [PATCH 09/10] feat: default ItemKind param for AddItemLink --- Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs index 5d7bcce1d..1fda9f9ae 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeStringBuilder.cs @@ -123,7 +123,7 @@ public class SeStringBuilder /// Kind of item to encode. /// Override for the item's name. /// The current builder. - public SeStringBuilder AddItemLink(uint itemId, ItemPayload.ItemKind kind, string? itemNameOverride = null) => + public SeStringBuilder AddItemLink(uint itemId, ItemPayload.ItemKind kind = ItemPayload.ItemKind.Normal, string? itemNameOverride = null) => this.Append(SeString.CreateItemLink(itemId, kind, itemNameOverride)); /// From a78007b05d92bf0713672ce5dfebc5619b12334d Mon Sep 17 00:00:00 2001 From: Haselnussbomber Date: Thu, 3 Aug 2023 00:35:43 +0200 Subject: [PATCH 10/10] fix: null check item rarity --- Dalamud/Game/Text/SeStringHandling/SeString.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dalamud/Game/Text/SeStringHandling/SeString.cs b/Dalamud/Game/Text/SeStringHandling/SeString.cs index 12cc94c3d..2ddb73f12 100644 --- a/Dalamud/Game/Text/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Text/SeStringHandling/SeString.cs @@ -194,7 +194,7 @@ public class SeString case ItemPayload.ItemKind.Hq: var item = data.GetExcelSheet()?.GetRow(itemId); displayName = item?.Name; - rarity = item.Rarity; + rarity = item?.Rarity ?? 1; break; case ItemPayload.ItemKind.EventItem: displayName = data.GetExcelSheet()?.GetRow(itemId)?.Name;