Skip to content

Commit

Permalink
FormattedTextHelper: don't produce broken json if translate is invalid
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Nov 16, 2023
1 parent 178fdd0 commit add3467
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 9 deletions.
Expand Up @@ -132,7 +132,13 @@ public static Component parseFormattedText(String text, ChatColor baseColor) {
if (text == null) {
return null;
}
return jsonToComponent(FormattedTextHelper.componentToJson(FormattedTextHelper.parse(text, baseColor)));
try {
return jsonToComponent(FormattedTextHelper.componentToJson(FormattedTextHelper.parse(text, baseColor)));
}
catch (Exception ex) {
Debug.verboseLog("Failed to parse formatted text: " + text.replace(ChatColor.COLOR_CHAR, '&'));
throw ex;
}
}

public static String stringifyComponent(Component component) {
Expand All @@ -146,7 +152,13 @@ public static Component jsonToComponent(String json) {
if (json == null) {
return null;
}
return GsonComponentSerializer.gson().deserialize(json);
try {
return GsonComponentSerializer.gson().deserialize(json);
}
catch (Exception ex) {
Debug.verboseLog("Failed to parse json to component: " + json);
throw ex;
}
}

public static String componentToJson(Component component) {
Expand Down
Expand Up @@ -446,11 +446,10 @@ public static BaseComponent[] parse(String str, ChatColor baseColor, boolean cle
return new BaseComponent[]{new TextComponent(str)};
}

private static TranslatableComponent parseTranslatable(String str, ChatColor baseColor, boolean optimize) {
TranslatableComponent component = new TranslatableComponent();
private static BaseComponent parseTranslatable(String str, ChatColor baseColor, boolean optimize) {
if (!str.startsWith("map@")) {
List<String> innardParts = CoreUtilities.split(str, ';');
component.setTranslate(unescape(innardParts.get(0)));
TranslatableComponent component = new TranslatableComponent(unescape(innardParts.get(0)));
for (int i = 1; i < innardParts.size(); i++) {
for (BaseComponent subComponent : parseInternal(unescape(innardParts.get(i)), baseColor, false, optimize)) {
component.addWith(subComponent);
Expand All @@ -460,13 +459,13 @@ private static TranslatableComponent parseTranslatable(String str, ChatColor bas
}
MapTag map = MapTag.valueOf(unescape(str), CoreUtilities.noDebugContext);
if (map == null) {
return component;
return new TextComponent(str);
}
ElementTag translationKey = map.getElement("key");
if (translationKey == null) {
return component;
return new TextComponent(str);
}
component.setTranslate(translationKey.asString());
TranslatableComponent component = new TranslatableComponent(translationKey.asString());
ElementTag fallback = map.getElement("fallback");
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20) && fallback != null) {
component.setFallback(fallback.asString());
Expand Down Expand Up @@ -506,7 +505,7 @@ public static BaseComponent[] parseInternal(String str, ChatColor baseColor, boo
}
if (str.length() > 3 && str.startsWith((ChatColor.COLOR_CHAR + "")) && hexMatcher.isMatch(str.charAt(1))
&& str.startsWith(ChatColor.COLOR_CHAR + "[translate=", 2) && str.indexOf(']') == str.length() - 1) { // eg "&6&[translate=block.minecraft.ominous_banner]"
TranslatableComponent component = parseTranslatable(str.substring("&[translate=".length() + 2, str.length() - 1), baseColor, optimize);
BaseComponent component = parseTranslatable(str.substring("&[translate=".length() + 2, str.length() - 1), baseColor, optimize);
component.setColor(ChatColor.getByChar(str.charAt(1)));
return new BaseComponent[] {component};
}
Expand Down

0 comments on commit add3467

Please sign in to comment.