Support complex components in written book builder (#6337)
The previously existing toBuilder method defined on the CraftMetaBook would, no matter if called on a writable or written book, return a builder targetting a writable book, in which complex components, such as hover or click text are not allowed. The builer hence serializes the page components using LEGACY_UXRC to ensure only colour may be passed. While this works as intented for writable books, the builder fails to fully support the complex components that may be used in a written book. This commit implemements a child class of the CraftMetaBookBuilder, the CraftMetaBookSignedBuilder, which builds to a CraftMetaBookSigned instance and hence serializes the pages to json. This builder instance is automatically supplied when calling toBuilder on a CraftMetaBookSigned instance. Resolves: #6296
This commit is contained in:
parent
f261419fd5
commit
b33b63908e
|
@ -2698,7 +2698,7 @@ index b7cb3c94d88b2753fd1fc17c2842607576fd7874..f40d6a0048ad5b3f6e31d83894ee89f5
|
||||||
@Override
|
@Override
|
||||||
public CraftMerchant getCraftMerchant() {
|
public CraftMerchant getCraftMerchant() {
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
|
||||||
index ca359cb1ac5f48d4f75d33946fcddedb270407c2..a33dd184ea51df7e59ed08e5e2b0ea4ed9dadff5 100644
|
index ca359cb1ac5f48d4f75d33946fcddedb270407c2..0f753f4868141ecc383877ea3a666a383f2e3339 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
|
||||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
|
||||||
@@ -1,8 +1,9 @@
|
@@ -1,8 +1,9 @@
|
||||||
|
@ -2724,7 +2724,7 @@ index ca359cb1ac5f48d4f75d33946fcddedb270407c2..a33dd184ea51df7e59ed08e5e2b0ea4e
|
||||||
import java.util.AbstractList;
|
import java.util.AbstractList;
|
||||||
import net.md_5.bungee.api.chat.BaseComponent;
|
import net.md_5.bungee.api.chat.BaseComponent;
|
||||||
import net.md_5.bungee.chat.ComponentSerializer;
|
import net.md_5.bungee.chat.ComponentSerializer;
|
||||||
@@ -269,6 +272,141 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
|
@@ -269,6 +272,145 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
|
||||||
this.generation = (generation == null) ? null : generation.ordinal();
|
this.generation = (generation == null) ? null : generation.ordinal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2816,7 +2816,7 @@ index ca359cb1ac5f48d4f75d33946fcddedb270407c2..a33dd184ea51df7e59ed08e5e2b0ea4e
|
||||||
+ this.pages = pages.subList(0, Math.min(MAX_PAGES, pages.size())).stream().map(io.papermc.paper.adventure.PaperAdventure.LEGACY_SECTION_UXRC::serialize).collect(java.util.stream.Collectors.toList());
|
+ this.pages = pages.subList(0, Math.min(MAX_PAGES, pages.size())).stream().map(io.papermc.paper.adventure.PaperAdventure.LEGACY_SECTION_UXRC::serialize).collect(java.util.stream.Collectors.toList());
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ static final class CraftMetaBookBuilder implements BookMetaBuilder {
|
+ static class CraftMetaBookBuilder implements BookMetaBuilder {
|
||||||
+ private net.kyori.adventure.text.Component title = null;
|
+ private net.kyori.adventure.text.Component title = null;
|
||||||
+ private net.kyori.adventure.text.Component author = null;
|
+ private net.kyori.adventure.text.Component author = null;
|
||||||
+ private final List<net.kyori.adventure.text.Component> pages = new java.util.ArrayList<>();
|
+ private final List<net.kyori.adventure.text.Component> pages = new java.util.ArrayList<>();
|
||||||
|
@ -2853,6 +2853,10 @@ index ca359cb1ac5f48d4f75d33946fcddedb270407c2..a33dd184ea51df7e59ed08e5e2b0ea4e
|
||||||
+
|
+
|
||||||
+ @Override
|
+ @Override
|
||||||
+ public BookMeta build() {
|
+ public BookMeta build() {
|
||||||
|
+ return this.build(title, author, pages);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ protected BookMeta build(net.kyori.adventure.text.Component title, net.kyori.adventure.text.Component author, java.util.List<net.kyori.adventure.text.Component> pages) {
|
||||||
+ return new CraftMetaBook(title, author, pages);
|
+ return new CraftMetaBook(title, author, pages);
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
|
@ -2866,7 +2870,7 @@ index ca359cb1ac5f48d4f75d33946fcddedb270407c2..a33dd184ea51df7e59ed08e5e2b0ea4e
|
||||||
@Override
|
@Override
|
||||||
public String getPage(final int page) {
|
public String getPage(final int page) {
|
||||||
Validate.isTrue(this.isValidPage(page), "Invalid page number");
|
Validate.isTrue(this.isValidPage(page), "Invalid page number");
|
||||||
@@ -413,7 +551,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
|
@@ -413,7 +555,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2876,7 +2880,7 @@ index ca359cb1ac5f48d4f75d33946fcddedb270407c2..a33dd184ea51df7e59ed08e5e2b0ea4e
|
||||||
|
|
||||||
if (this.hasTitle()) {
|
if (this.hasTitle()) {
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
|
||||||
index 00445fc7373c70f4cecc4114f9bcfb4b6f27c0e8..0cf60eb9b6ba1a79c9b603c4349debd478101f9a 100644
|
index 00445fc7373c70f4cecc4114f9bcfb4b6f27c0e8..b132c151e4fb6c64b633a0712100c3ae5adb81a9 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
|
||||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
|
||||||
@@ -1,6 +1,6 @@
|
@@ -1,6 +1,6 @@
|
||||||
|
@ -2887,7 +2891,7 @@ index 00445fc7373c70f4cecc4114f9bcfb4b6f27c0e8..0cf60eb9b6ba1a79c9b603c4349debd4
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@@ -84,7 +84,7 @@ class CraftMetaBookSigned extends CraftMetaBook implements BookMeta {
|
@@ -84,8 +84,29 @@ class CraftMetaBookSigned extends CraftMetaBook implements BookMeta {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2896,6 +2900,28 @@ index 00445fc7373c70f4cecc4114f9bcfb4b6f27c0e8..0cf60eb9b6ba1a79c9b603c4349debd4
|
||||||
super.serialize(builder);
|
super.serialize(builder);
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
+
|
||||||
|
+ // Paper start - adventure
|
||||||
|
+ private CraftMetaBookSigned(net.kyori.adventure.text.Component title, net.kyori.adventure.text.Component author, java.util.List<net.kyori.adventure.text.Component> pages) {
|
||||||
|
+ super((org.bukkit.craftbukkit.inventory.CraftMetaItem) org.bukkit.Bukkit.getItemFactory().getItemMeta(Material.WRITABLE_BOOK));
|
||||||
|
+ this.title = title == null ? null : io.papermc.paper.adventure.PaperAdventure.LEGACY_SECTION_UXRC.serialize(title);
|
||||||
|
+ this.author = author == null ? null : io.papermc.paper.adventure.PaperAdventure.LEGACY_SECTION_UXRC.serialize(author);
|
||||||
|
+ this.pages = io.papermc.paper.adventure.PaperAdventure.asJson(pages.subList(0, Math.min(MAX_PAGES, pages.size())));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ static final class CraftMetaBookSignedBuilder extends CraftMetaBookBuilder {
|
||||||
|
+ @Override
|
||||||
|
+ protected BookMeta build(net.kyori.adventure.text.Component title, net.kyori.adventure.text.Component author, java.util.List<net.kyori.adventure.text.Component> pages) {
|
||||||
|
+ return new CraftMetaBookSigned(title, author, pages);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ @Override
|
||||||
|
+ public BookMetaBuilder toBuilder() {
|
||||||
|
+ return new CraftMetaBookSignedBuilder();
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
}
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
||||||
index a096c9f7fb459200f8d1f2c797a29bc1222c86af..86163b56d10689aa512953c8df869aa45ebac735 100644
|
index a096c9f7fb459200f8d1f2c797a29bc1222c86af..86163b56d10689aa512953c8df869aa45ebac735 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
||||||
|
|
Loading…
Reference in New Issue