diff --git a/patches/api/0006-Adventure.patch b/patches/api/0006-Adventure.patch
index e21cf7abfb..771be7112c 100644
--- a/patches/api/0006-Adventure.patch
+++ b/patches/api/0006-Adventure.patch
@@ -4358,10 +4358,182 @@ index cf1733bc76d1e29ad0f533f6e49818f83e8e3358..f2a6f62f0344684668febc0999b81748
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/inventory/meta/BookMeta.java b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
-index 9bab73c3c2ca759b8e1c7d07d98cc593c961666a..7cc66e5dd6f19295728d3c0e6c0898338281b8a7 100644
+index 9bab73c3c2ca759b8e1c7d07d98cc593c961666a..f0c6943da3f783101ca647b75b3230fae3a310da 100644
--- a/src/main/java/org/bukkit/inventory/meta/BookMeta.java
+++ b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
-@@ -124,8 +124,10 @@ public interface BookMeta extends WritableBookMeta {
+@@ -7,10 +7,15 @@ import org.jetbrains.annotations.NotNull;
+ import org.jetbrains.annotations.Nullable;
+
+ /**
+- * Represents a {@link Material#WRITTEN_BOOK}) that can have a title, an author,
++ * Represents a {@link Material#WRITTEN_BOOK} that can have a title, an author,
+ * and pages.
++ *
++ * Before using this type, make sure to check the itemstack's material with
++ * {@link org.bukkit.inventory.ItemStack#getType()}. {@code instanceof} on
++ * the meta instance is not sufficient due to unusual inheritance
++ * with relation to {@link WritableBookMeta}.
+ */
+-public interface BookMeta extends WritableBookMeta {
++public interface BookMeta extends WritableBookMeta, net.kyori.adventure.inventory.Book { // Paper - adventure
+
+ /**
+ * Represents the generation (or level of copying) of a written book
+@@ -116,6 +121,153 @@ public interface BookMeta extends WritableBookMeta {
+ @NotNull
+ BookMeta clone();
+
++ // Paper start - adventure
++ //
++ /**
++ * @deprecated use {@link #page(int)}
++ */
++ @Deprecated
++ @Override
++ @NotNull String getPage(int page);
++
++ /**
++ * @deprecated use {@link #page(int, net.kyori.adventure.text.Component)}
++ */
++ @Deprecated
++ @Override
++ void setPage(int page, @NotNull String data);
++
++ /**
++ * @deprecated use {@link #pages()}
++ */
++ @Deprecated
++ @Override
++ @NotNull List getPages();
++
++ /**
++ * @deprecated use {@link #pages(List)}
++ */
++ @Deprecated
++ @Override
++ void setPages(@NotNull List pages);
++
++ /**
++ * @deprecated use {@link #pages(net.kyori.adventure.text.Component...)}
++ */
++ @Deprecated
++ @Override
++ void setPages(@NotNull String... pages);
++
++ /**
++ * @deprecated use {@link #addPages(net.kyori.adventure.text.Component...)}
++ */
++ @Deprecated
++ @Override
++ void addPage(@NotNull String... pages);
++ //
++
++ /**
++ * Gets the title of the book.
++ *
++ * Plugins should check that hasTitle() returns true before calling this
++ * method.
++ *
++ * @return the title of the book
++ */
++ @Override
++ net.kyori.adventure.text.@Nullable Component title();
++
++ /**
++ * Sets the title of the book.
++ *
++ * Limited to 32 characters. Removes title when given null.
++ *
++ * @param title the title to set
++ * @return the same {@link BookMeta} instance
++ */
++ @org.jetbrains.annotations.Contract(value = "_ -> this", pure = false)
++ @Override
++ @NotNull BookMeta title(net.kyori.adventure.text.@Nullable Component title);
++
++ /**
++ * Gets the author of the book.
++ *
++ * Plugins should check that hasAuthor() returns true before calling this
++ * method.
++ *
++ * @return the author of the book
++ */
++ @Override
++ net.kyori.adventure.text.@Nullable Component author();
++
++ /**
++ * Sets the author of the book. Removes author when given null.
++ *
++ * @param author the author to set
++ * @return the same {@link BookMeta} instance
++ */
++ @org.jetbrains.annotations.Contract(value = "_ -> this", pure = false)
++ @Override
++ @NotNull BookMeta author(net.kyori.adventure.text.@Nullable Component author);
++
++
++ /**
++ * Gets the specified page in the book. The page must exist.
++ *
++ * Pages are 1-indexed.
++ *
++ * @param page the page number to get, in range [1, getPageCount()]
++ * @return the page from the book
++ */
++ net.kyori.adventure.text.@NotNull Component page(int page);
++
++ /**
++ * Sets the specified page in the book. Pages of the book must be
++ * contiguous.
++ *
++ * The data can be up to 1024 characters in length, additional characters
++ * are truncated.
++ *
++ * Pages are 1-indexed.
++ *
++ * @param page the page number to set, in range [1, getPageCount()]
++ * @param data the data to set for that page
++ */
++ void page(int page, net.kyori.adventure.text.@NotNull Component data);
++
++ /**
++ * Adds new pages to the end of the book. Up to a maximum of 100 pages with
++ * 1024 characters per page.
++ *
++ * @param pages A list of strings, each being a page
++ */
++ void addPages(net.kyori.adventure.text.@NotNull Component @NotNull ... pages);
++
++ interface BookMetaBuilder extends net.kyori.adventure.inventory.Book.Builder {
++
++ @Override
++ @NotNull BookMetaBuilder title(net.kyori.adventure.text.@Nullable Component title);
++
++ @Override
++ @NotNull BookMetaBuilder author(net.kyori.adventure.text.@Nullable Component author);
++
++ @Override
++ @NotNull BookMetaBuilder addPage(net.kyori.adventure.text.@NotNull Component page);
++
++ @Override
++ @NotNull BookMetaBuilder pages(net.kyori.adventure.text.@NotNull Component @NotNull ... pages);
++
++ @Override
++ @NotNull BookMetaBuilder pages(java.util.@NotNull Collection pages);
++
++ @Override
++ @NotNull BookMeta build();
++ }
++
++ @Override
++ @NotNull BookMetaBuilder toBuilder();
++ // Paper end
++
+ // Spigot start
+ public class Spigot {
+
+@@ -124,8 +276,10 @@ public interface BookMeta extends WritableBookMeta {
*
* @param page the page number to get
* @return the page from the book
@@ -4372,7 +4544,7 @@ index 9bab73c3c2ca759b8e1c7d07d98cc593c961666a..7cc66e5dd6f19295728d3c0e6c089833
public BaseComponent[] getPage(int page) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -139,7 +141,9 @@ public interface BookMeta extends WritableBookMeta {
+@@ -139,7 +293,9 @@ public interface BookMeta extends WritableBookMeta {
*
* @param page the page number to set
* @param data the data to set for that page
@@ -4382,7 +4554,7 @@ index 9bab73c3c2ca759b8e1c7d07d98cc593c961666a..7cc66e5dd6f19295728d3c0e6c089833
public void setPage(int page, @Nullable BaseComponent... data) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -148,8 +152,10 @@ public interface BookMeta extends WritableBookMeta {
+@@ -148,8 +304,10 @@ public interface BookMeta extends WritableBookMeta {
* Gets all the pages in the book.
*
* @return list of all the pages in the book
@@ -4393,7 +4565,7 @@ index 9bab73c3c2ca759b8e1c7d07d98cc593c961666a..7cc66e5dd6f19295728d3c0e6c089833
public List getPages() {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -159,7 +165,9 @@ public interface BookMeta extends WritableBookMeta {
+@@ -159,7 +317,9 @@ public interface BookMeta extends WritableBookMeta {
* pages. Maximum 50 pages with 256 characters per page.
*
* @param pages A list of pages to set the book to use
@@ -4403,7 +4575,7 @@ index 9bab73c3c2ca759b8e1c7d07d98cc593c961666a..7cc66e5dd6f19295728d3c0e6c089833
public void setPages(@NotNull List pages) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -169,7 +177,9 @@ public interface BookMeta extends WritableBookMeta {
+@@ -169,7 +329,9 @@ public interface BookMeta extends WritableBookMeta {
* pages. Maximum 50 pages with 256 characters per page.
*
* @param pages A list of component arrays, each being a page
@@ -4413,7 +4585,7 @@ index 9bab73c3c2ca759b8e1c7d07d98cc593c961666a..7cc66e5dd6f19295728d3c0e6c089833
public void setPages(@NotNull BaseComponent[]... pages) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -179,7 +189,9 @@ public interface BookMeta extends WritableBookMeta {
+@@ -179,7 +341,9 @@ public interface BookMeta extends WritableBookMeta {
* with 256 characters per page.
*
* @param pages A list of component arrays, each being a page
@@ -4518,188 +4690,26 @@ index 255f79d5bca15620cb17d7b54ffebb6ff00bff6b..d7c178b3584db5866a5a21c6ddaab876
/**
diff --git a/src/main/java/org/bukkit/inventory/meta/WritableBookMeta.java b/src/main/java/org/bukkit/inventory/meta/WritableBookMeta.java
-index 12595536080ffe09df2b6ecdb83d846f50100d38..dec77fc3aff1baf21aeff8d8d681a46f597935c9 100644
+index 12595536080ffe09df2b6ecdb83d846f50100d38..9fc47c879ee6b8edf2503f20e4736c2997d2de2e 100644
--- a/src/main/java/org/bukkit/inventory/meta/WritableBookMeta.java
+++ b/src/main/java/org/bukkit/inventory/meta/WritableBookMeta.java
-@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
- * Represents a book ({@link Material#WRITABLE_BOOK} or {@link
- * Material#WRITTEN_BOOK}) that can have pages.
+@@ -5,8 +5,14 @@ import org.bukkit.Material;
+ import org.jetbrains.annotations.NotNull;
+
+ /**
+- * Represents a book ({@link Material#WRITABLE_BOOK} or {@link
+- * Material#WRITTEN_BOOK}) that can have pages.
++ * Represents a book ({@link Material#WRITABLE_BOOK}) that can have pages.
++ *
++ * For {@link Material#WRITTEN_BOOK}, use {@link BookMeta}.
++ *
++ * Before using this type, make sure to check the itemstack's material with
++ * {@link org.bukkit.inventory.ItemStack#getType()}. {@code instanceof} on
++ * the meta instance is not sufficient due to unusual inheritance
++ * with relation to {@link BookMeta}.
*/
--public interface WritableBookMeta extends ItemMeta {
-+public interface WritableBookMeta extends ItemMeta, net.kyori.adventure.inventory.Book { // Paper
+ public interface WritableBookMeta extends ItemMeta {
- /**
- * Checks for the existence of pages in the book.
-@@ -17,6 +17,108 @@ public interface WritableBookMeta extends ItemMeta {
- */
- boolean hasPages();
-
-+ // Paper start
-+ /**
-+ * Gets the title of the book.
-+ *
-+ * Plugins should check that hasTitle() returns true before calling this
-+ * method.
-+ *
-+ * @return the title of the book
-+ */
-+ @Override
-+ net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component title();
-+
-+ /**
-+ * Sets the title of the book.
-+ *
-+ * Limited to 32 characters. Removes title when given null.
-+ *
-+ * @param title the title to set
-+ * @return the same {@link BookMeta} instance
-+ */
-+ @org.jetbrains.annotations.Contract(value = "_ -> this", pure = false)
-+ @Override
-+ @NotNull BookMeta title(net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component title);
-+
-+ /**
-+ * Gets the author of the book.
-+ *
-+ * Plugins should check that hasAuthor() returns true before calling this
-+ * method.
-+ *
-+ * @return the author of the book
-+ */
-+ @Override
-+ net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component author();
-+
-+ /**
-+ * Sets the author of the book. Removes author when given null.
-+ *
-+ * @param author the author to set
-+ * @return the same {@link BookMeta} instance
-+ */
-+ @org.jetbrains.annotations.Contract(value = "_ -> this", pure = false)
-+ @Override
-+ @NotNull BookMeta author(net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component author);
-+
-+ /**
-+ * Gets the specified page in the book. The page must exist.
-+ *
-+ * Pages are 1-indexed.
-+ *
-+ * @param page the page number to get, in range [1, getPageCount()]
-+ * @return the page from the book
-+ */
-+ net.kyori.adventure.text.@NotNull Component page(int page);
-+
-+ /**
-+ * Sets the specified page in the book. Pages of the book must be
-+ * contiguous.
-+ *
-+ * The data can be up to 1024 characters in length, additional characters
-+ * are truncated.
-+ *
-+ * Pages are 1-indexed.
-+ *
-+ * @param page the page number to set, in range [1, getPageCount()]
-+ * @param data the data to set for that page
-+ */
-+ void page(int page, net.kyori.adventure.text.@NotNull Component data);
-+
-+ /**
-+ * Adds new pages to the end of the book. Up to a maximum of 100 pages with
-+ * 1024 characters per page.
-+ *
-+ * @param pages A list of strings, each being a page
-+ */
-+ void addPages(net.kyori.adventure.text.@NotNull Component @NotNull ... pages);
-+
-+ interface BookMetaBuilder extends net.kyori.adventure.inventory.Book.Builder {
-+
-+ @Override
-+ @NotNull BookMetaBuilder title(net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component title);
-+
-+ @Override
-+ @NotNull BookMetaBuilder author(net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component author);
-+
-+ @Override
-+ @NotNull BookMetaBuilder addPage(net.kyori.adventure.text.@NotNull Component page);
-+
-+ @Override
-+ @NotNull BookMetaBuilder pages(net.kyori.adventure.text.@NotNull Component @NotNull ... pages);
-+
-+ @Override
-+ @NotNull BookMetaBuilder pages(java.util.@NotNull Collection pages);
-+
-+ @Override
-+ @NotNull BookMeta build();
-+ }
-+
-+ @Override
-+ @NotNull BookMetaBuilder toBuilder();
-+ // Paper end
-+
- /**
- * Gets the specified page in the book. The given page must exist.
- *
-@@ -24,8 +126,10 @@ public interface WritableBookMeta extends ItemMeta {
- *
- * @param page the page number to get, in range [1, getPageCount()]
- * @return the page from the book
-+ * @deprecated in favour of {@link #page(int)}
- */
- @NotNull
-+ @Deprecated // Paper
- String getPage(int page);
-
- /**
-@@ -39,15 +143,19 @@ public interface WritableBookMeta extends ItemMeta {
- *
- * @param page the page number to set, in range [1, getPageCount()]
- * @param data the data to set for that page
-+ * @deprecated in favour of {@link #page(int, net.kyori.adventure.text.Component)}
- */
-+ @Deprecated // Paper
- void setPage(int page, @NotNull String data);
-
- /**
- * Gets all the pages in the book.
- *
- * @return list of all the pages in the book
-+ * @deprecated in favour of {@link #pages()}
- */
- @NotNull
-+ @Deprecated // Paper
- List getPages();
-
- /**
-@@ -55,7 +163,9 @@ public interface WritableBookMeta extends ItemMeta {
- * pages. Maximum 100 pages with 1024 characters per page.
- *
- * @param pages A list of pages to set the book to use
-+ * @deprecated in favour of {@link #pages(List)}
- */
-+ @Deprecated // Paper
- void setPages(@NotNull List pages);
-
- /**
-@@ -63,7 +173,9 @@ public interface WritableBookMeta extends ItemMeta {
- * pages. Maximum 100 pages with 1024 characters per page.
- *
- * @param pages A list of strings, each being a page
-+ * @deprecated in favour of {@link #pages(net.kyori.adventure.text.Component...)}
- */
-+ @Deprecated // Paper
- void setPages(@NotNull String... pages);
-
- /**
-@@ -71,7 +183,9 @@ public interface WritableBookMeta extends ItemMeta {
- * 1024 characters per page.
- *
- * @param pages A list of strings, each being a page
-+ * @deprecated in favour of {@link #addPages(net.kyori.adventure.text.Component...)}
- */
-+ @Deprecated // Paper
- void addPage(@NotNull String... pages);
-
- /**
diff --git a/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java b/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java
index eb80f24da65918a21a2fa6691eeb64b621febaf4..941fac4eee338870d8c30cb1f64cab572cf54548 100644
--- a/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java
@@ -5028,7 +5038,7 @@ index 78fd35e6115072c6bc2ff5a899ffc2edb8f45801..22b1dc5fd4d453161a5ee520072f8e8f
/**
diff --git a/src/main/java/org/bukkit/scoreboard/Scoreboard.java b/src/main/java/org/bukkit/scoreboard/Scoreboard.java
-index bf52375e9ed9ec172eca1d27c06c379e3fc216bc..e6aeb01e80fb63a4ebd6a7cbda1815e49775246d 100644
+index bf52375e9ed9ec172eca1d27c06c379e3fc216bc..3377511e1a6dd4aeb78871e47169d5bd9456c1aa 100644
--- a/src/main/java/org/bukkit/scoreboard/Scoreboard.java
+++ b/src/main/java/org/bukkit/scoreboard/Scoreboard.java
@@ -26,6 +26,71 @@ public interface Scoreboard {
@@ -5103,7 +5113,7 @@ index bf52375e9ed9ec172eca1d27c06c379e3fc216bc..e6aeb01e80fb63a4ebd6a7cbda1815e4
/**
* Registers an Objective on this Scoreboard
*
-@@ -37,10 +102,11 @@ public interface Scoreboard {
+@@ -37,7 +102,7 @@ public interface Scoreboard {
* characters.
* @throws IllegalArgumentException if an objective by that name already
* exists
@@ -5112,11 +5122,7 @@ index bf52375e9ed9ec172eca1d27c06c379e3fc216bc..e6aeb01e80fb63a4ebd6a7cbda1815e4
*/
@Deprecated
@NotNull
-+ @Deprecated // Paper
- Objective registerNewObjective(@NotNull String name, @NotNull String criteria, @NotNull String displayName);
-
- /**
-@@ -55,10 +121,11 @@ public interface Scoreboard {
+@@ -55,7 +120,7 @@ public interface Scoreboard {
* characters.
* @throws IllegalArgumentException if an objective by that name already
* exists
@@ -5125,11 +5131,7 @@ index bf52375e9ed9ec172eca1d27c06c379e3fc216bc..e6aeb01e80fb63a4ebd6a7cbda1815e4
*/
@Deprecated
@NotNull
-+ @Deprecated // Paper
- Objective registerNewObjective(@NotNull String name, @NotNull String criteria, @NotNull String displayName, @NotNull RenderType renderType);
-
- /**
-@@ -72,8 +139,10 @@ public interface Scoreboard {
+@@ -72,8 +137,10 @@ public interface Scoreboard {
* characters.
* @throws IllegalArgumentException if an objective by that name already
* exists
@@ -5140,7 +5142,7 @@ index bf52375e9ed9ec172eca1d27c06c379e3fc216bc..e6aeb01e80fb63a4ebd6a7cbda1815e4
Objective registerNewObjective(@NotNull String name, @NotNull Criteria criteria, @NotNull String displayName);
/**
-@@ -88,8 +157,10 @@ public interface Scoreboard {
+@@ -88,8 +155,10 @@ public interface Scoreboard {
* characters.
* @throws IllegalArgumentException if an objective by that name already
* exists
diff --git a/patches/api/0172-Fix-Spigot-annotation-mistakes.patch b/patches/api/0172-Fix-Spigot-annotation-mistakes.patch
index 9176711cf2..2c1b71987a 100644
--- a/patches/api/0172-Fix-Spigot-annotation-mistakes.patch
+++ b/patches/api/0172-Fix-Spigot-annotation-mistakes.patch
@@ -968,7 +968,7 @@ index 53119742beda00a38111063243665bb995ae2188..2d084214e991fecc51f8e18e3d733e43
private static final HandlerList handlers = new HandlerList();
diff --git a/src/main/java/org/bukkit/event/enchantment/PrepareItemEnchantEvent.java b/src/main/java/org/bukkit/event/enchantment/PrepareItemEnchantEvent.java
-index f2edd4a9357832e9dec3fb0aafa006335d7b289b..378b44c3df1612283c7f993b32fc7b329ec01a9a 100644
+index f2edd4a9357832e9dec3fb0aafa006335d7b289b..f05ce4fd6c4bbd79edc5f65e7edd1e4a63e93fb8 100644
--- a/src/main/java/org/bukkit/event/enchantment/PrepareItemEnchantEvent.java
+++ b/src/main/java/org/bukkit/event/enchantment/PrepareItemEnchantEvent.java
@@ -23,7 +23,7 @@ public class PrepareItemEnchantEvent extends InventoryEvent implements Cancellab
@@ -980,15 +980,7 @@ index f2edd4a9357832e9dec3fb0aafa006335d7b289b..378b44c3df1612283c7f993b32fc7b32
super(view);
this.enchanter = enchanter;
this.table = table;
-@@ -68,6 +68,7 @@ public class PrepareItemEnchantEvent extends InventoryEvent implements Cancellab
- * @return experience level costs offered
- * @deprecated Use {@link #getOffers()} instead of this method
- */
-+ @Deprecated // Paper
- @NotNull
- @Deprecated
- public int[] getExpLevelCostsOffered() {
-@@ -86,8 +87,7 @@ public class PrepareItemEnchantEvent extends InventoryEvent implements Cancellab
+@@ -86,8 +86,7 @@ public class PrepareItemEnchantEvent extends InventoryEvent implements Cancellab
*
* @return list of available enchantment offers
*/
@@ -1851,18 +1843,6 @@ index 3e46603f8cd38041394e0e1baf788d9009b3ffc7..b15c141f1db07296bb349f11c6f39b0f
public interface Redstone {
/**
-diff --git a/src/main/java/org/bukkit/material/Step.java b/src/main/java/org/bukkit/material/Step.java
-index ea94222120ddd4e692b67cf48b029af9ed0e5835..7e49f254032a8a1cf864372a246a49dda6f773c7 100644
---- a/src/main/java/org/bukkit/material/Step.java
-+++ b/src/main/java/org/bukkit/material/Step.java
-@@ -78,6 +78,7 @@ public class Step extends TexturedMaterial {
- *
- * @deprecated Magic value
- */
-+ @Deprecated // Paper
- @Override
- @Deprecated
- protected int getTextureIndex() {
diff --git a/src/main/java/org/bukkit/material/types/MushroomBlockTexture.java b/src/main/java/org/bukkit/material/types/MushroomBlockTexture.java
index 0ea9c6b2420a0f990bd1fdf50fc015e37a7060d8..e99644eae1c662b117aa19060d2484aca19fe0a4 100644
--- a/src/main/java/org/bukkit/material/types/MushroomBlockTexture.java
diff --git a/patches/api/0325-Improve-scoreboard-entries.patch b/patches/api/0325-Improve-scoreboard-entries.patch
index 242c0cca46..d6e077bd86 100644
--- a/patches/api/0325-Improve-scoreboard-entries.patch
+++ b/patches/api/0325-Improve-scoreboard-entries.patch
@@ -37,10 +37,10 @@ index a625bcab8e77b05b3341a52c708fae1542b7e3d5..a193ffabb05160b462dee1ba8f687fdb
+ // Paper end - improve scoreboard entries
}
diff --git a/src/main/java/org/bukkit/scoreboard/Scoreboard.java b/src/main/java/org/bukkit/scoreboard/Scoreboard.java
-index e6aeb01e80fb63a4ebd6a7cbda1815e49775246d..51bc41ed8ea46a20372065e1e29488dffef796c1 100644
+index 3377511e1a6dd4aeb78871e47169d5bd9456c1aa..4a59f2734833cf39800b9aafbc1c5c6953c2d8f3 100644
--- a/src/main/java/org/bukkit/scoreboard/Scoreboard.java
+++ b/src/main/java/org/bukkit/scoreboard/Scoreboard.java
-@@ -217,9 +217,8 @@ public interface Scoreboard {
+@@ -215,9 +215,8 @@ public interface Scoreboard {
* @param player the player whose scores are being retrieved
* @return immutable set of all scores tracked for the player
* @see #getScores(String)
@@ -51,7 +51,7 @@ index e6aeb01e80fb63a4ebd6a7cbda1815e49775246d..51bc41ed8ea46a20372065e1e29488df
@NotNull
Set getScores(@NotNull OfflinePlayer player);
-@@ -237,9 +236,8 @@ public interface Scoreboard {
+@@ -235,9 +234,8 @@ public interface Scoreboard {
*
* @param player the player to drop all current scores for
* @see #resetScores(String)
@@ -62,7 +62,7 @@ index e6aeb01e80fb63a4ebd6a7cbda1815e49775246d..51bc41ed8ea46a20372065e1e29488df
void resetScores(@NotNull OfflinePlayer player);
/**
-@@ -255,9 +253,8 @@ public interface Scoreboard {
+@@ -253,9 +251,8 @@ public interface Scoreboard {
* @param player the player to search for
* @return the player's Team or null if the player is not on a team
* @see #getEntryTeam(String)
@@ -73,7 +73,7 @@ index e6aeb01e80fb63a4ebd6a7cbda1815e49775246d..51bc41ed8ea46a20372065e1e29488df
@Nullable
Team getPlayerTeam(@NotNull OfflinePlayer player);
-@@ -322,4 +319,35 @@ public interface Scoreboard {
+@@ -320,4 +317,35 @@ public interface Scoreboard {
* @param slot the slot to remove objectives
*/
void clearSlot(@NotNull DisplaySlot slot);
diff --git a/patches/server/0010-Adventure.patch b/patches/server/0010-Adventure.patch
index bd24346fbd..a9cff2ccf8 100644
--- a/patches/server/0010-Adventure.patch
+++ b/patches/server/0010-Adventure.patch
@@ -4806,7 +4806,7 @@ index 9e05a8515c5f6f340182e91150fcad8bbf80a22b..adf22ce4f0bcd3bd57dc2030c6c92d3d
@Override
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
-index 61ad00c38cfef8a1de61b4597ec1042428feccf4..4c308de19e26b228151dc05606dd6339649e1765 100644
+index 61ad00c38cfef8a1de61b4597ec1042428feccf4..4da38ebb7fdbdb0f8fa422ebcd2e3eec2b2be846 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
@@ -2,8 +2,9 @@ package org.bukkit.craftbukkit.inventory;
@@ -4820,13 +4820,213 @@ index 61ad00c38cfef8a1de61b4597ec1042428feccf4..4c308de19e26b228151dc05606dd6339
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-@@ -170,6 +171,148 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta, WritableBo
+@@ -170,6 +171,130 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta, WritableBo
public void setGeneration(Generation generation) {
}
+ // Paper start
+ @Override
+ public net.kyori.adventure.text.Component title() {
++ return null;
++ }
++
++ @Override
++ public org.bukkit.inventory.meta.BookMeta title(net.kyori.adventure.text.Component title) {
++ return this;
++ }
++
++ @Override
++ public net.kyori.adventure.text.Component author() {
++ return null;
++ }
++
++ @Override
++ public org.bukkit.inventory.meta.BookMeta author(net.kyori.adventure.text.Component author) {
++ return this;
++ }
++
++ @Override
++ public net.kyori.adventure.text.Component page(final int page) {
++ Preconditions.checkArgument(this.isValidPage(page), "Invalid page number");
++ return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(this.pages.get(page - 1));
++ }
++
++ @Override
++ public void page(final int page, net.kyori.adventure.text.Component data) {
++ if (!this.isValidPage(page)) {
++ throw new IllegalArgumentException("Invalid page number " + page + "/" + this.pages.size());
++ }
++ if (data == null) {
++ data = net.kyori.adventure.text.Component.empty();
++ }
++ this.pages.set(page - 1, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(data));
++ }
++
++ @Override
++ public List pages() {
++ if (this.pages == null) return ImmutableList.of();
++ return this.pages.stream().map(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection()::deserialize).collect(ImmutableList.toImmutableList());
++ }
++
++ @Override
++ public BookMeta pages(List pages) {
++ if (this.pages != null) this.pages.clear();
++ for (net.kyori.adventure.text.Component page : pages) {
++ this.addPages(page);
++ }
++ return this;
++ }
++
++ @Override
++ public BookMeta pages(net.kyori.adventure.text.Component... pages) {
++ if (this.pages != null) this.pages.clear();
++ this.addPages(pages);
++ return this;
++ }
++
++ @Override
++ public void addPages(net.kyori.adventure.text.Component... pages) {
++ if (this.pages == null) this.pages = new ArrayList<>();
++ for (net.kyori.adventure.text.Component page : pages) {
++ if (this.pages.size() >= MAX_PAGES) {
++ return;
++ }
++
++ if (page == null) {
++ page = net.kyori.adventure.text.Component.empty();
++ }
++
++ this.pages.add(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(page));
++ }
++ }
++
++ private CraftMetaBook(List pages) {
++ super((org.bukkit.craftbukkit.inventory.CraftMetaItem) org.bukkit.Bukkit.getItemFactory().getItemMeta(org.bukkit.Material.WRITABLE_BOOK));
++ this.pages = pages.subList(0, Math.min(MAX_PAGES, pages.size())).stream().map(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection()::serialize).collect(java.util.stream.Collectors.toList());
++ }
++
++ static class CraftMetaBookBuilder implements BookMetaBuilder {
++ protected final List pages = new java.util.ArrayList<>();
++
++ @Override
++ public BookMetaBuilder title(net.kyori.adventure.text.Component title) {
++ return this;
++ }
++
++ @Override
++ public BookMetaBuilder author(net.kyori.adventure.text.Component author) {
++ return this;
++ }
++
++ @Override
++ public BookMetaBuilder addPage(net.kyori.adventure.text.Component page) {
++ this.pages.add(page);
++ return this;
++ }
++
++ @Override
++ public BookMetaBuilder pages(net.kyori.adventure.text.Component... pages) {
++ java.util.Collections.addAll(this.pages, pages);
++ return this;
++ }
++
++ @Override
++ public BookMetaBuilder pages(java.util.Collection pages) {
++ this.pages.addAll(pages);
++ return this;
++ }
++
++ @Override
++ public BookMeta build() {
++ return new CraftMetaBook(this.pages);
++ }
++ }
++
++ @Override
++ public BookMetaBuilder toBuilder() {
++ return new CraftMetaBookBuilder();
++ }
++
++ // Paper end
+ @Override
+ public String getPage(final int page) {
+ Preconditions.checkArgument(this.isValidPage(page), "Invalid page number (%s)", page);
+@@ -286,7 +411,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta, WritableBo
+ }
+
+ @Override
+- Builder serialize(Builder builder) {
++ ImmutableMap.Builder serialize(ImmutableMap.Builder builder) {
+ super.serialize(builder);
+
+ if (this.pages != null) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
+index 9c57b883783145ad4483481a2c2e7f0f188cd174..b653c2c80e8e8524ea6d7625c6a86f8204c50709 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
+@@ -2,7 +2,7 @@ package org.bukkit.craftbukkit.inventory;
+
+ import com.google.common.base.Preconditions;
+ import com.google.common.collect.ImmutableList;
+-import com.google.common.collect.ImmutableMap.Builder;
++import com.google.common.collect.ImmutableMap; // Paper
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.List;
+@@ -346,7 +346,7 @@ public class CraftMetaBookSigned extends CraftMetaItem implements BookMeta {
+ }
+
+ @Override
+- Builder serialize(Builder builder) {
++ ImmutableMap.Builder serialize(ImmutableMap.Builder builder) {
+ super.serialize(builder);
+
+ if (this.hasTitle()) {
+@@ -459,4 +459,113 @@ public class CraftMetaBookSigned extends CraftMetaItem implements BookMeta {
+ return this.spigot;
+ }
+ // Spigot end
++
++ // Paper start - adventure
++ public static final net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.builder()
++ .character(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.SECTION_CHAR)
++ .build();
++ private CraftMetaBookSigned(net.kyori.adventure.text.Component title, net.kyori.adventure.text.Component author, java.util.List pages) {
++ super((org.bukkit.craftbukkit.inventory.CraftMetaItem) org.bukkit.Bukkit.getItemFactory().getItemMeta(Material.WRITABLE_BOOK));
++ this.title = title == null ? null : LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.serialize(title);
++ this.author = author == null ? null : LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.serialize(author);
++ this.pages = io.papermc.paper.adventure.PaperAdventure.asVanilla(pages.subList(0, Math.min(MAX_PAGES, pages.size())));
++ }
++
++ static final class CraftMetaBookSignedBuilder extends CraftMetaBook.CraftMetaBookBuilder {
++ private net.kyori.adventure.text.Component title;
++ private net.kyori.adventure.text.Component author;
++
++ @Override
++ public org.bukkit.inventory.meta.BookMeta.BookMetaBuilder title(final net.kyori.adventure.text.Component title) {
++ this.title = title;
++ return this;
++ }
++
++ @Override
++ public org.bukkit.inventory.meta.BookMeta.BookMetaBuilder author(final net.kyori.adventure.text.Component author) {
++ this.author = author;
++ return this;
++ }
++
++ @Override
++ public org.bukkit.inventory.meta.BookMeta build() {
++ return new CraftMetaBookSigned(this.title, this.author, this.pages);
++ }
++ }
++
++ @Override
++ public BookMetaBuilder toBuilder() {
++ return new CraftMetaBookSignedBuilder();
++ }
++
++ @Override
++ public net.kyori.adventure.text.Component title() {
+ return this.title == null ? null : LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.deserialize(this.title);
+ }
+
@@ -4849,35 +5049,29 @@ index 61ad00c38cfef8a1de61b4597ec1042428feccf4..4c308de19e26b228151dc05606dd6339
+
+ @Override
+ public net.kyori.adventure.text.Component page(final int page) {
-+ Preconditions.checkArgument(isValidPage(page), "Invalid page number");
-+ return this instanceof CraftMetaBookSigned ? net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().deserialize(pages.get(page - 1)) : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(pages.get(page - 1));
++ Preconditions.checkArgument(this.isValidPage(page), "Invalid page number");
++ return io.papermc.paper.adventure.PaperAdventure.asAdventure(this.pages.get(page - 1));
+ }
+
+ @Override
+ public void page(final int page, net.kyori.adventure.text.Component data) {
-+ if (!isValidPage(page)) {
-+ throw new IllegalArgumentException("Invalid page number " + page + "/" + pages.size());
++ if (!this.isValidPage(page)) {
++ throw new IllegalArgumentException("Invalid page number " + page + "/" + this.pages.size());
+ }
-+ if (data == null) {
-+ data = net.kyori.adventure.text.Component.empty();
-+ }
-+ pages.set(page - 1, this instanceof CraftMetaBookSigned ? net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().serialize(data) : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(data));
++ this.pages.set(page - 1, io.papermc.paper.adventure.PaperAdventure.asVanillaNullToEmpty(data));
+ }
+
+ @Override
+ public List pages() {
+ if (this.pages == null) return ImmutableList.of();
-+ if (this instanceof CraftMetaBookSigned)
-+ return pages.stream().map(net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson()::deserialize).collect(ImmutableList.toImmutableList());
-+ else
-+ return pages.stream().map(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection()::deserialize).collect(ImmutableList.toImmutableList());
++ return this.pages.stream().map(io.papermc.paper.adventure.PaperAdventure::asAdventure).collect(ImmutableList.toImmutableList());
+ }
+
+ @Override
+ public BookMeta pages(List pages) {
+ if (this.pages != null) this.pages.clear();
+ for (net.kyori.adventure.text.Component page : pages) {
-+ addPages(page);
++ this.addPages(page);
+ }
+ return this;
+ }
@@ -4885,7 +5079,7 @@ index 61ad00c38cfef8a1de61b4597ec1042428feccf4..4c308de19e26b228151dc05606dd6339
+ @Override
+ public BookMeta pages(net.kyori.adventure.text.Component... pages) {
+ if (this.pages != null) this.pages.clear();
-+ addPages(pages);
++ this.addPages(pages);
+ return this;
+ }
+
@@ -4897,133 +5091,9 @@ index 61ad00c38cfef8a1de61b4597ec1042428feccf4..4c308de19e26b228151dc05606dd6339
+ return;
+ }
+
-+ if (page == null) {
-+ page = net.kyori.adventure.text.Component.empty();
-+ }
-+
-+ this.pages.add(this instanceof CraftMetaBookSigned ? net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().serialize(page) : net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().serialize(page));
++ this.pages.add(io.papermc.paper.adventure.PaperAdventure.asVanillaNullToEmpty(page));
+ }
+ }
-+
-+ public static final net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.builder()
-+ .character(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.SECTION_CHAR)
-+ .build();
-+ private CraftMetaBook(net.kyori.adventure.text.Component title, net.kyori.adventure.text.Component author, List pages) {
-+ super((org.bukkit.craftbukkit.inventory.CraftMetaItem) org.bukkit.Bukkit.getItemFactory().getItemMeta(org.bukkit.Material.WRITABLE_BOOK));
-+ this.title = title == null ? null : LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.serialize(title);
-+ this.author = author == null ? null : LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.serialize(author);
-+ this.pages = pages.subList(0, Math.min(MAX_PAGES, pages.size())).stream().map(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection()::serialize).collect(java.util.stream.Collectors.toList());
-+ }
-+
-+ static class CraftMetaBookBuilder implements BookMetaBuilder {
-+ private net.kyori.adventure.text.Component title = null;
-+ private net.kyori.adventure.text.Component author = null;
-+ private final List pages = new java.util.ArrayList<>();
-+
-+ @Override
-+ public BookMetaBuilder title(net.kyori.adventure.text.Component title) {
-+ this.title = title;
-+ return this;
-+ }
-+
-+ @Override
-+ public BookMetaBuilder author(net.kyori.adventure.text.Component author) {
-+ this.author = author;
-+ return this;
-+ }
-+
-+ @Override
-+ public BookMetaBuilder addPage(net.kyori.adventure.text.Component page) {
-+ this.pages.add(page);
-+ return this;
-+ }
-+
-+ @Override
-+ public BookMetaBuilder pages(net.kyori.adventure.text.Component... pages) {
-+ java.util.Collections.addAll(this.pages, pages);
-+ return this;
-+ }
-+
-+ @Override
-+ public BookMetaBuilder pages(java.util.Collection pages) {
-+ this.pages.addAll(pages);
-+ return this;
-+ }
-+
-+ @Override
-+ 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 pages) {
-+ return new CraftMetaBook(title, author, pages);
-+ }
-+ }
-+
-+ @Override
-+ public BookMetaBuilder toBuilder() {
-+ return new CraftMetaBookBuilder();
-+ }
-+
-+ // Paper end
- @Override
- public String getPage(final int page) {
- Preconditions.checkArgument(this.isValidPage(page), "Invalid page number (%s)", page);
-@@ -286,7 +429,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta, WritableBo
- }
-
- @Override
-- Builder serialize(Builder builder) {
-+ ImmutableMap.Builder serialize(ImmutableMap.Builder builder) {
- super.serialize(builder);
-
- if (this.pages != null) {
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
-index 9c57b883783145ad4483481a2c2e7f0f188cd174..3795207a024ddf2e93baa09bcce56a1253eec8ed 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
-@@ -2,7 +2,7 @@ package org.bukkit.craftbukkit.inventory;
-
- import com.google.common.base.Preconditions;
- import com.google.common.collect.ImmutableList;
--import com.google.common.collect.ImmutableMap.Builder;
-+import com.google.common.collect.ImmutableMap; // Paper
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
-@@ -346,7 +346,7 @@ public class CraftMetaBookSigned extends CraftMetaItem implements BookMeta {
- }
-
- @Override
-- Builder serialize(Builder builder) {
-+ ImmutableMap.Builder serialize(ImmutableMap.Builder builder) {
- super.serialize(builder);
-
- if (this.hasTitle()) {
-@@ -459,4 +459,25 @@ public class CraftMetaBookSigned extends CraftMetaItem implements BookMeta {
- return this.spigot;
- }
- // Spigot end
-+
-+ // Paper start - adventure
-+ private CraftMetaBookSigned(net.kyori.adventure.text.Component title, net.kyori.adventure.text.Component author, java.util.List pages) {
-+ super((org.bukkit.craftbukkit.inventory.CraftMetaItem) org.bukkit.Bukkit.getItemFactory().getItemMeta(Material.WRITABLE_BOOK));
-+ this.title = title == null ? null : CraftMetaBook.LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.serialize(title);
-+ this.author = author == null ? null : CraftMetaBook.LEGACY_DOWNSAMPLING_COMPONENT_SERIALIZER.serialize(author);
-+ this.pages = io.papermc.paper.adventure.PaperAdventure.asVanilla(pages.subList(0, Math.min(MAX_PAGES, pages.size())));
-+ }
-+
-+ static final class CraftMetaBookSignedBuilder extends CraftMetaBook.CraftMetaBookBuilder {
-+ @Override
-+ protected BookMeta build(net.kyori.adventure.text.Component title, net.kyori.adventure.text.Component author, java.util.List 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