From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Nassim Jahnke <jahnke.nassim@gmail.com>
Date: Thu, 2 Jun 2022 20:35:58 +0200
Subject: [PATCH] Disable component selector resolving in books by default


diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
index fafbebbb5e8c1a381b673f97f1fa210687b52823..8379c6313f06ab3eeaf02bad41d8b835d50e093f 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
@@ -693,4 +693,9 @@ public class PaperConfig {
     private static void useProxyProtocol() {
         useProxyProtocol = getBoolean("settings.proxy-protocol", false);
     }
+
+    public static boolean resolveSelectorsInBooks;
+    private static void resolveSelectorsInBooks() {
+        resolveSelectorsInBooks = getBoolean("settings.resolve-selectors-in-books", false);
+    }
 }
diff --git a/src/main/java/net/minecraft/world/item/WrittenBookItem.java b/src/main/java/net/minecraft/world/item/WrittenBookItem.java
index 0600bfcc3a4f9043324c046b6c0d2b579ab151cb..26a9a15cc630113cd8d2c8287c6b0f1067ce53f0 100644
--- a/src/main/java/net/minecraft/world/item/WrittenBookItem.java
+++ b/src/main/java/net/minecraft/world/item/WrittenBookItem.java
@@ -113,25 +113,42 @@ public class WrittenBookItem extends Item {
 
     public static boolean resolveBookComponents(ItemStack book, @Nullable CommandSourceStack commandSource, @Nullable Player player) {
         CompoundTag compoundTag = book.getTag();
-        if (compoundTag != null && !compoundTag.getBoolean("resolved")) {
+        if (com.destroystokyo.paper.PaperConfig.resolveSelectorsInBooks && compoundTag != null && !compoundTag.getBoolean("resolved")) { // Paper
             compoundTag.putBoolean("resolved", true);
             if (!makeSureTagIsValid(compoundTag)) {
                 return false;
             } else {
                 ListTag listTag = compoundTag.getList("pages", 8);
+                // Paper start - backport length limit
+                ListTag newPages = new ListTag();
 
                 for(int i = 0; i < listTag.size(); ++i) {
-                    listTag.set(i, (Tag)StringTag.valueOf(resolvePage(commandSource, player, listTag.getString(i))));
+                    String resolvedPage = resolvePage(commandSource, player, listTag.getString(i));
+                    if (resolvedPage.length() > 32767) {
+                        return false;
+                    }
+
+                    newPages.add(i, StringTag.valueOf(resolvedPage));
                 }
 
                 if (compoundTag.contains("filtered_pages", 10)) {
                     CompoundTag compoundTag2 = compoundTag.getCompound("filtered_pages");
+                    CompoundTag newFilteredPages = new CompoundTag();
 
                     for(String string : compoundTag2.getAllKeys()) {
-                        compoundTag2.putString(string, resolvePage(commandSource, player, compoundTag2.getString(string)));
+                        String resolvedPage = resolvePage(commandSource, player, compoundTag2.getString(string));
+                        if (resolvedPage.length() > 32767) {
+                            return false;
+                        }
+
+                        newFilteredPages.putString(string, resolvedPage);
                     }
+
+                    compoundTag.put("filtered_pages", newFilteredPages);
                 }
 
+                compoundTag.put("pages", newPages);
+                // Paper end
                 return true;
             }
         } else {