1.20.4: Update NBT chat parser to handle text color

This commit is contained in:
ReinforceZwei 2024-02-11 18:14:14 +08:00
parent 4546e6946e
commit 6d016332fb

View file

@ -426,13 +426,14 @@ namespace MinecraftClient.Protocol.Message
private static string NbtToString(Dictionary<string, object> nbt) private static string NbtToString(Dictionary<string, object> nbt)
{ {
if (nbt.Count == 1 && nbt.TryGetValue("", out object rootMessage)) if (nbt.Count == 1 && nbt.TryGetValue("", out object? rootMessage))
{ {
// Nameless root tag // Nameless root tag
return (string)rootMessage; return (string)rootMessage;
} }
string message = string.Empty; string message = string.Empty;
string colorCode = string.Empty;
StringBuilder extraBuilder = new StringBuilder(); StringBuilder extraBuilder = new StringBuilder();
foreach (var kvp in nbt) foreach (var kvp in nbt)
{ {
@ -452,35 +453,40 @@ namespace MinecraftClient.Protocol.Message
for (int i = 0; i < extras.Length; i++) for (int i = 0; i < extras.Length; i++)
{ {
var extraDict = (Dictionary<string, object>)extras[i]; var extraDict = (Dictionary<string, object>)extras[i];
if (extraDict.TryGetValue("text", out object extraText)) extraBuilder.Append(NbtToString(extraDict) + "§r");
{
extraBuilder.Append(extraText);
}
} }
} }
break; break;
case "with": case "translate":
{ {
if (nbt.TryGetValue("translate", out object translate)) if (nbt.TryGetValue("translate", out object translate))
{ {
var translateKey = (string)translate; var translateKey = (string)translate;
List<string> translateString = new(); List<string> translateString = new();
var withs = (object[])value; if (nbt.TryGetValue("with", out object withComponent))
for (int i = 0; i < withs.Length; i++)
{ {
var withDict = (Dictionary<string, object>)withs[i]; var withs = (object[])withComponent;
if (withDict.TryGetValue("text", out object withText)) for (int i = 0; i < withs.Length; i++)
{ {
translateString.Add((string)withText); var withDict = (Dictionary<string, object>)withs[i];
translateString.Add(NbtToString(withDict));
} }
} }
message = TranslateString(translateKey, translateString); message = TranslateString(translateKey, translateString);
} }
} }
break; break;
case "color":
{
if (nbt.TryGetValue("color", out object color))
{
colorCode = Color2tag((string)color);
}
}
break;
} }
} }
return message + extraBuilder.ToString(); return colorCode + message + extraBuilder.ToString();
} }
} }
} }