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.
This commit is contained in:
Spottedleaf
2025-06-17 19:02:35 -07:00
parent e4d7178a3c
commit 8980ead7ea

View File

@@ -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) {