From 8980ead7ea8dddf4a1a37de7fc5d0d6fe7f86a37 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Tue, 17 Jun 2025 19:02:35 -0700 Subject: [PATCH] Directly walk text component after converting from JSON It's important to convert the ItemStack present inside the text component. The ItemStack nests TEXT_COMPONENT (written book pages, custom name, ...) which would otherwise not be walked since we have set a breakpoint at the version and moved the walker to the next version step. This fixes item names for hover events inside written book pages failing to convert to NBT. This issue is also present on DFU. --- .../0015-Rewrite-dataconverter-system.patch | 69 ++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/paper-server/patches/features/0015-Rewrite-dataconverter-system.patch b/paper-server/patches/features/0015-Rewrite-dataconverter-system.patch index e61722d801a..e9a7bb81231 100644 --- a/paper-server/patches/features/0015-Rewrite-dataconverter-system.patch +++ b/paper-server/patches/features/0015-Rewrite-dataconverter-system.patch @@ -24851,10 +24851,10 @@ index 0000000000000000000000000000000000000000..7d09c4218d0db8119d1681bf95900be8 +} diff --git a/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java b/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java new file mode 100644 -index 0000000000000000000000000000000000000000..ca9e3667b420f54f42b358068c102fe0cae4102d +index 0000000000000000000000000000000000000000..d5dfa9a64e2d3f9a37a5bdde60b92ed93bd89aed --- /dev/null +++ b/ca/spottedleaf/dataconverter/minecraft/versions/V4290.java -@@ -0,0 +1,247 @@ +@@ -0,0 +1,312 @@ +package ca.spottedleaf.dataconverter.minecraft.versions; + +import ca.spottedleaf.dataconverter.converters.DataConverter; @@ -24997,6 +24997,70 @@ index 0000000000000000000000000000000000000000..ca9e3667b420f54f42b358068c102fe0 + } + } + ++ private static void directWalkComponentList(final ListType list, final long fromVersion, final long toVersion) { ++ for (int i = 0, len = list.size(); i < len; ++i) { ++ directWalkComponent(list.getGeneric(i), fromVersion, toVersion); ++ } ++ } ++ ++ private static void directWalkComponent(final Object input, final long fromVersion, final long toVersion) { ++ if (input instanceof ListType listType) { ++ directWalkComponentList(listType, fromVersion, toVersion); ++ } else if (input instanceof MapType root) { ++ final ListType extra = root.getListUnchecked("extra"); ++ if (extra != null) { ++ directWalkComponentList(extra, fromVersion, toVersion); ++ } ++ ++ final Object separator = root.getGeneric("separator"); ++ if (separator != null) { ++ directWalkComponent(separator, fromVersion, toVersion); ++ } ++ ++ final MapType clickEvent = root.getMap("clickEvent"); ++ if (clickEvent != null) { ++ switch (clickEvent.getString("action", "")) { ++ case "run_command": ++ case "suggest_command": { ++ WalkerUtils.convert(MCTypeRegistry.DATACONVERTER_CUSTOM_TYPE_COMMAND, clickEvent, "value", fromVersion, toVersion); ++ break; ++ } ++ } ++ } ++ ++ final MapType hoverEvent = root.getMap("hoverEvent"); ++ if (hoverEvent != null) { ++ switch (hoverEvent.getString("action", "")) { ++ case "show_text": { ++ final Object contents = hoverEvent.getGeneric("contents"); ++ if (contents != null) { ++ directWalkComponent(contents, fromVersion, toVersion); ++ } ++ break; ++ } ++ case "show_item": { ++ if (hoverEvent.hasKey("contents", ObjectType.STRING)) { ++ WalkerUtils.convert(MCTypeRegistry.ITEM_NAME, hoverEvent, "contents", fromVersion, toVersion); ++ } else { ++ WalkerUtils.convert(MCTypeRegistry.ITEM_STACK, hoverEvent, "contents", fromVersion, toVersion); ++ } ++ break; ++ } ++ case "show_entity": { ++ WalkerUtils.convert(MCTypeRegistry.ENTITY_NAME, hoverEvent, "type", fromVersion, toVersion); ++ ++ final Object name = hoverEvent.getGeneric("name"); ++ if (name != null) { ++ directWalkComponent(name, fromVersion, toVersion); ++ } ++ break; ++ } ++ // default: do nothing ++ } ++ } ++ } // else: should only be string ++ } ++ + public static void register() { + MCTypeRegistry.TEXT_COMPONENT.addStructureConverter(new DataConverter<>(VERSION) { + @Override @@ -25043,6 +25107,7 @@ index 0000000000000000000000000000000000000000..ca9e3667b420f54f42b358068c102fe0 + }; + + convertNested(ret); ++ directWalkComponent(ret, sourceVersion, toVersion); + return ret; + } + } catch (final JsonParseException ex) {