From 6d016332fb438be5ea6259d090b0c12a459dd939 Mon Sep 17 00:00:00 2001 From: ReinforceZwei <39955851+ReinforceZwei@users.noreply.github.com> Date: Sun, 11 Feb 2024 18:14:14 +0800 Subject: [PATCH] 1.20.4: Update NBT chat parser to handle text color --- .../Protocol/Message/ChatParser.cs | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/MinecraftClient/Protocol/Message/ChatParser.cs b/MinecraftClient/Protocol/Message/ChatParser.cs index 2c613f5b..3551e4ba 100644 --- a/MinecraftClient/Protocol/Message/ChatParser.cs +++ b/MinecraftClient/Protocol/Message/ChatParser.cs @@ -426,13 +426,14 @@ namespace MinecraftClient.Protocol.Message private static string NbtToString(Dictionary nbt) { - if (nbt.Count == 1 && nbt.TryGetValue("", out object rootMessage)) + if (nbt.Count == 1 && nbt.TryGetValue("", out object? rootMessage)) { // Nameless root tag return (string)rootMessage; } string message = string.Empty; + string colorCode = string.Empty; StringBuilder extraBuilder = new StringBuilder(); foreach (var kvp in nbt) { @@ -452,35 +453,40 @@ namespace MinecraftClient.Protocol.Message for (int i = 0; i < extras.Length; i++) { var extraDict = (Dictionary)extras[i]; - if (extraDict.TryGetValue("text", out object extraText)) - { - extraBuilder.Append(extraText); - } + extraBuilder.Append(NbtToString(extraDict) + "§r"); } } break; - case "with": + case "translate": { if (nbt.TryGetValue("translate", out object translate)) { var translateKey = (string)translate; List translateString = new(); - var withs = (object[])value; - for (int i = 0; i < withs.Length; i++) + if (nbt.TryGetValue("with", out object withComponent)) { - var withDict = (Dictionary)withs[i]; - if (withDict.TryGetValue("text", out object withText)) + var withs = (object[])withComponent; + for (int i = 0; i < withs.Length; i++) { - translateString.Add((string)withText); + var withDict = (Dictionary)withs[i]; + translateString.Add(NbtToString(withDict)); } } message = TranslateString(translateKey, translateString); } } break; + case "color": + { + if (nbt.TryGetValue("color", out object color)) + { + colorCode = Color2tag((string)color); + } + } + break; } } - return message + extraBuilder.ToString(); + return colorCode + message + extraBuilder.ToString(); } } }