diff --git a/patches/api/0001-Convert-project-to-Gradle.patch b/patches/api/0001-Convert-project-to-Gradle.patch
index 509ab41f15f0..4bcaee929525 100644
--- a/patches/api/0001-Convert-project-to-Gradle.patch
+++ b/patches/api/0001-Convert-project-to-Gradle.patch
@@ -124,7 +124,7 @@ index 0000000000000000000000000000000000000000..4311f6dde7372a069f462158fba76d9d
+}
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
-index 741ea21a1ccd141d065f5e12349af38f097a8915..0000000000000000000000000000000000000000
+index 0861b44936958613beba670b0d82e21d3aaf388b..0000000000000000000000000000000000000000
--- a/pom.xml
+++ /dev/null
@@ -1,277 +0,0 @@
@@ -144,8 +144,8 @@ index 741ea21a1ccd141d065f5e12349af38f097a8915..00000000000000000000000000000000
-
-
- true
-- 1.8
-- 1.8
+- 17
+- 17
- UTF-8
-
-
diff --git a/patches/api/0006-Adventure.patch b/patches/api/0006-Adventure.patch
index 1dbe87620276..eb57e4f25e3e 100644
--- a/patches/api/0006-Adventure.patch
+++ b/patches/api/0006-Adventure.patch
@@ -779,10 +779,10 @@ index 0000000000000000000000000000000000000000..6e94562d79206d88b74b53814f9423f1
+ }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad29dc438f 100644
+index 2e619279cb06cbe26bb4933a0312b245f8691d0b..bd1a010bb4e18a16d02549d64333ce7641be7910 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -400,7 +400,9 @@ public final class Bukkit {
+@@ -420,7 +420,9 @@ public final class Bukkit {
*
* @param message the message
* @return the number of players
@@ -792,7 +792,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
public static int broadcastMessage(@NotNull String message) {
return server.broadcastMessage(message);
}
-@@ -1191,6 +1193,19 @@ public final class Bukkit {
+@@ -1211,6 +1213,19 @@ public final class Bukkit {
server.shutdown();
}
@@ -812,7 +812,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
/**
* Broadcasts the specified message to every user with the given
* permission name.
-@@ -1200,6 +1215,21 @@ public final class Bukkit {
+@@ -1220,6 +1235,21 @@ public final class Bukkit {
* permissibles} must have to receive the broadcast
* @return number of message recipients
*/
@@ -834,7 +834,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
public static int broadcast(@NotNull String message, @NotNull String permission) {
return server.broadcast(message, permission);
}
-@@ -1461,6 +1491,7 @@ public final class Bukkit {
+@@ -1481,6 +1511,7 @@ public final class Bukkit {
return server.createInventory(owner, type);
}
@@ -842,7 +842,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
/**
* Creates an empty inventory with the specified type and title. If the type
* is {@link InventoryType#CHEST}, the new inventory has a size of 27;
-@@ -1486,6 +1517,38 @@ public final class Bukkit {
+@@ -1506,6 +1537,38 @@ public final class Bukkit {
* @see InventoryType#isCreatable()
*/
@NotNull
@@ -881,7 +881,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
public static Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type, @NotNull String title) {
return server.createInventory(owner, type, title);
}
-@@ -1504,6 +1567,7 @@ public final class Bukkit {
+@@ -1524,6 +1587,7 @@ public final class Bukkit {
return server.createInventory(owner, size);
}
@@ -889,7 +889,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
/**
* Creates an empty inventory of type {@link InventoryType#CHEST} with the
* specified size and title.
-@@ -1516,10 +1580,30 @@ public final class Bukkit {
+@@ -1536,10 +1600,30 @@ public final class Bukkit {
* @throws IllegalArgumentException if the size is not a multiple of 9
*/
@NotNull
@@ -920,7 +920,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
/**
* Creates an empty merchant.
*
-@@ -1527,7 +1611,20 @@ public final class Bukkit {
+@@ -1547,7 +1631,20 @@ public final class Bukkit {
* when the merchant inventory is viewed
* @return a new merchant
*/
@@ -941,7 +941,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
public static Merchant createMerchant(@Nullable String title) {
return server.createMerchant(title);
}
-@@ -1644,12 +1741,43 @@ public final class Bukkit {
+@@ -1664,12 +1761,43 @@ public final class Bukkit {
return server.isPrimaryThread();
}
@@ -985,7 +985,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
public static String getMotd() {
return server.getMotd();
}
-@@ -1658,7 +1786,9 @@ public final class Bukkit {
+@@ -1678,7 +1806,9 @@ public final class Bukkit {
* Set the message that is displayed on the server list.
*
* @param motd The message to be displayed
@@ -995,7 +995,7 @@ index 5680a77cc98cdb4b4c002d1366e775acaf747e51..a0fce496d2b90f484d2723c4ea4099ad
public static void setMotd(@NotNull String motd) {
server.setMotd(motd);
}
-@@ -1667,8 +1797,10 @@ public final class Bukkit {
+@@ -1687,8 +1817,10 @@ public final class Bukkit {
* Gets the default message that is displayed when the server is stopped.
*
* @return the shutdown message
@@ -1177,10 +1177,10 @@ index ae7b51341fb66c41b8a7c4604fd273d876e311be..4034fcb9abc39b12f0de47c4b679f2ef
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcdc62a5c01 100644
+index 76b365f98b81234ae1c35014387b0e44f722d5ea..6aed59819cc3d70f1b5975c3c7df40cc0b0afd8a 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -62,13 +62,13 @@ import org.jetbrains.annotations.Nullable;
+@@ -63,13 +63,13 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents a server implementation.
*/
@@ -1196,7 +1196,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
*/
public static final String BROADCAST_CHANNEL_ADMINISTRATIVE = "bukkit.broadcast.admin";
-@@ -76,7 +76,7 @@ public interface Server extends PluginMessageRecipient {
+@@ -77,7 +77,7 @@ public interface Server extends PluginMessageRecipient {
* Used for all announcement messages, such as informing users that a
* player has joined.
*
@@ -1205,7 +1205,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
*/
public static final String BROADCAST_CHANNEL_USERS = "bukkit.broadcast.user";
-@@ -337,7 +337,9 @@ public interface Server extends PluginMessageRecipient {
+@@ -353,7 +353,9 @@ public interface Server extends PluginMessageRecipient {
*
* @param message the message
* @return the number of players
@@ -1215,7 +1215,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
public int broadcastMessage(@NotNull String message);
/**
-@@ -1023,8 +1025,33 @@ public interface Server extends PluginMessageRecipient {
+@@ -1039,8 +1041,33 @@ public interface Server extends PluginMessageRecipient {
* @param permission the required permission {@link Permissible
* permissibles} must have to receive the broadcast
* @return number of message recipients
@@ -1249,7 +1249,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
/**
* Gets the player by the given name, regardless if they are offline or
-@@ -1241,6 +1268,35 @@ public interface Server extends PluginMessageRecipient {
+@@ -1257,6 +1284,35 @@ public interface Server extends PluginMessageRecipient {
@NotNull
Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type);
@@ -1285,7 +1285,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
/**
* Creates an empty inventory with the specified type and title. If the type
* is {@link InventoryType#CHEST}, the new inventory has a size of 27;
-@@ -1262,9 +1318,11 @@ public interface Server extends PluginMessageRecipient {
+@@ -1278,9 +1334,11 @@ public interface Server extends PluginMessageRecipient {
* @return The new inventory.
* @throws IllegalArgumentException if the {@link InventoryType} cannot be
* viewed.
@@ -1297,7 +1297,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
@NotNull
Inventory createInventory(@Nullable InventoryHolder owner, @NotNull InventoryType type, @NotNull String title);
-@@ -1280,6 +1338,22 @@ public interface Server extends PluginMessageRecipient {
+@@ -1296,6 +1354,22 @@ public interface Server extends PluginMessageRecipient {
@NotNull
Inventory createInventory(@Nullable InventoryHolder owner, int size) throws IllegalArgumentException;
@@ -1320,7 +1320,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
/**
* Creates an empty inventory of type {@link InventoryType#CHEST} with the
* specified size and title.
-@@ -1290,18 +1364,32 @@ public interface Server extends PluginMessageRecipient {
+@@ -1306,18 +1380,32 @@ public interface Server extends PluginMessageRecipient {
* viewed
* @return a new inventory
* @throws IllegalArgumentException if the size is not a multiple of 9
@@ -1353,7 +1353,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
Merchant createMerchant(@Nullable String title);
/**
-@@ -1397,27 +1485,56 @@ public interface Server extends PluginMessageRecipient {
+@@ -1413,27 +1501,56 @@ public interface Server extends PluginMessageRecipient {
*/
boolean isPrimaryThread();
@@ -1410,7 +1410,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
String getShutdownMessage();
/**
-@@ -1799,7 +1916,9 @@ public interface Server extends PluginMessageRecipient {
+@@ -1815,7 +1932,9 @@ public interface Server extends PluginMessageRecipient {
* Sends the component to the player
*
* @param component the components to send
@@ -1420,7 +1420,7 @@ index c394954cab8213bd1073356524cdd5705ef54d12..83ae1490f6c48d931541e13f76950fcd
public void broadcast(@NotNull net.md_5.bungee.api.chat.BaseComponent component) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -1808,7 +1927,9 @@ public interface Server extends PluginMessageRecipient {
+@@ -1824,7 +1943,9 @@ public interface Server extends PluginMessageRecipient {
* Sends an array of components as a single message to the player
*
* @param components the components to send
@@ -1492,10 +1492,10 @@ index ac5e263d737973af077e3406a84a84baca4370db..2d91924b7f5ef16a91d40cdc1bfc3d68
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 4a9a82540e40685d2b837c76c431827a00cf4ba3..a3ee6f2f588bc9c87e49378359f450820b9af1b9 100644
+index 6ca5f7a85087ca1c7e5e2d940bd3c65b84d2d356..0f902aec66ec550f80709f7f314ca90d374ebb53 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -26,6 +26,15 @@ import org.jetbrains.annotations.Nullable;
+@@ -30,6 +30,15 @@ import org.jetbrains.annotations.Nullable;
*/
@Deprecated
public interface UnsafeValues {
@@ -1524,10 +1524,10 @@ index efb97712cc9dc7c1e12a59f5b94e4f2ad7c6b7d8..3024468af4c073324e536c1cb26beffb
return warning == null || warning.value();
}
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index d453a9753620e23e93e24b0c62bec5515d11dbcc..4c878531d9d8d0aee6832fd10b339a32f219fa9a 100644
+index 0fd2e9ee1a8cf4456a1e5fe6579d767c5dcb4d9a..d76db156a7eeefaac3c96d2d547fddecefbd863e 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -45,7 +45,7 @@ import org.jetbrains.annotations.Nullable;
+@@ -47,7 +47,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents a world, which may contain entities, chunks and blocks
*/
@@ -1536,7 +1536,7 @@ index d453a9753620e23e93e24b0c62bec5515d11dbcc..4c878531d9d8d0aee6832fd10b339a32
/**
* Gets the {@link Block} at the given coordinates
-@@ -606,6 +606,14 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -608,6 +608,14 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public List getPlayers();
@@ -2116,7 +2116,7 @@ index 7ad7bcf9a9333c8d6d1d7cab53a6d457ec20bbf6..c4f86ba1037f3f0e5d697a0962d71d6f
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 8532b8484d5a493c1c37ad7508597f624f1831c8..978431fd88cfb7d42fcdea8c904633df5c64daed 100644
+index cc577b5af6832ea9c98aceb587de378095277ada..0025139f403cfc80ace9f8584ccf42d3a5cbb718 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -30,7 +30,7 @@ import org.jetbrains.annotations.Nullable;
@@ -2128,7 +2128,7 @@ index 8532b8484d5a493c1c37ad7508597f624f1831c8..978431fd88cfb7d42fcdea8c904633df
/**
* Gets the entity's current position
-@@ -768,4 +768,20 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -763,4 +763,20 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
@Override
Spigot spigot();
// Spigot end
@@ -2150,10 +2150,10 @@ index 8532b8484d5a493c1c37ad7508597f624f1831c8..978431fd88cfb7d42fcdea8c904633df
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e87ca26dec 100644
+index 764390e5b258ab3cadedb14be00d0c0d601b8a1f..5c55715c8cdd79f2214b265a81d94a8904c998ea 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -52,7 +52,41 @@ import org.jetbrains.annotations.Nullable;
+@@ -54,7 +54,41 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents a player, connected or not
*/
@@ -2196,7 +2196,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
/**
* {@inheritDoc}
-@@ -69,7 +103,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -71,7 +105,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* places defined by plugins.
*
* @return the friendly name
@@ -2206,7 +2206,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
@NotNull
public String getDisplayName();
-@@ -81,15 +117,50 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -83,15 +119,50 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* places defined by plugins.
*
* @param name The new display name.
@@ -2257,7 +2257,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public String getPlayerListName();
/**
-@@ -98,14 +169,18 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -100,14 +171,18 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* If the value is null, the name will be identical to {@link #getName()}.
*
* @param name new player list name
@@ -2276,7 +2276,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
@Nullable
public String getPlayerListHeader();
-@@ -113,7 +188,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -115,7 +190,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* Gets the currently displayed player list footer for this player.
*
* @return player list header or null
@@ -2286,7 +2286,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
@Nullable
public String getPlayerListFooter();
-@@ -121,14 +198,18 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -123,14 +200,18 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* Sets the currently displayed player list header for this player.
*
* @param header player list header, null for empty
@@ -2305,7 +2305,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void setPlayerListFooter(@Nullable String footer);
/**
-@@ -137,7 +218,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -139,7 +220,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* @param header player list header, null for empty
* @param footer player list footer, null for empty
@@ -2315,7 +2315,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void setPlayerListHeaderFooter(@Nullable String header, @Nullable String footer);
/**
-@@ -175,9 +258,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -177,9 +260,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* Kicks player with custom kick message.
*
* @param message kick message
@@ -2341,7 +2341,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
/**
* Adds this user to the {@link ProfileBanList}. If a previous ban exists, this will
* update the entry.
-@@ -840,6 +939,106 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -842,6 +941,106 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public void sendEquipmentChange(@NotNull LivingEntity entity, @NotNull Map items);
@@ -2448,7 +2448,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
/**
* Send a sign change. This fakes a sign change packet for a user at
* a certain location. This will not actually change the world in any way.
-@@ -857,7 +1056,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -859,7 +1058,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param lines the new text on the sign or null to clear it
* @throws IllegalArgumentException if location is null
* @throws IllegalArgumentException if lines is non-null and has a length less than 4
@@ -2460,7 +2460,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void sendSignChange(@NotNull Location loc, @Nullable String[] lines) throws IllegalArgumentException;
/**
-@@ -879,7 +1082,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -881,7 +1084,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @throws IllegalArgumentException if location is null
* @throws IllegalArgumentException if dyeColor is null
* @throws IllegalArgumentException if lines is non-null and has a length less than 4
@@ -2472,7 +2472,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void sendSignChange(@NotNull Location loc, @Nullable String[] lines, @NotNull DyeColor dyeColor) throws IllegalArgumentException;
/**
-@@ -902,7 +1109,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -904,7 +1111,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @throws IllegalArgumentException if location is null
* @throws IllegalArgumentException if dyeColor is null
* @throws IllegalArgumentException if lines is non-null and has a length less than 4
@@ -2484,7 +2484,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void sendSignChange(@NotNull Location loc, @Nullable String[] lines, @NotNull DyeColor dyeColor, boolean hasGlowingText) throws IllegalArgumentException;
/**
-@@ -1350,7 +1561,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1372,7 +1583,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @throws IllegalArgumentException Thrown if the URL is null.
* @throws IllegalArgumentException Thrown if the URL is too long.
* @deprecated Minecraft no longer uses textures packs. Instead you
@@ -2493,7 +2493,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
*/
@Deprecated
public void setTexturePack(@NotNull String url);
-@@ -1386,7 +1597,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1408,7 +1619,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @throws IllegalArgumentException Thrown if the URL is null.
* @throws IllegalArgumentException Thrown if the URL is too long. The
* length restriction is an implementation specific arbitrary value.
@@ -2503,7 +2503,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void setResourcePack(@NotNull String url);
/**
-@@ -1418,6 +1631,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1440,6 +1653,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* pack correctly.
*
*
@@ -2511,7 +2511,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
* @param url The URL from which the client will download the resource
* pack. The string must contain only US-ASCII characters and should
* be encoded as per RFC 1738.
-@@ -1430,6 +1644,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1452,6 +1666,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @throws IllegalArgumentException Thrown if the hash is not 20 bytes
* long.
*/
@@ -2519,7 +2519,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void setResourcePack(@NotNull String url, @Nullable byte[] hash);
/**
-@@ -1454,12 +1669,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1476,12 +1691,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack!
* To remove a resource pack you can use
@@ -2534,7 +2534,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
* @param url The URL from which the client will download the resource
* pack. The string must contain only US-ASCII characters and should
* be encoded as per RFC 1738.
-@@ -1473,8 +1689,57 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1495,8 +1711,10 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @throws IllegalArgumentException Thrown if the hash is not 20 bytes
* long.
*/
@@ -2542,28 +2542,14 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void setResourcePack(@NotNull String url, @Nullable byte[] hash, @Nullable String prompt);
+ // Paper start
-+ /**
-+ * Request that the player's client download and switch resource packs.
-+ *
-+ * The player's client will download the new resource pack asynchronously
-+ * in the background, and will automatically switch to it once the
-+ * download is complete. If the client has downloaded and cached a
-+ * resource pack with the same hash in the past it will not download but
-+ * directly apply the cached pack. If the hash is null and the client has
-+ * downloaded and cached the same resource pack in the past, it will
-+ * perform a file size check against the response content to determine if
-+ * the resource pack has changed and needs to be downloaded again. When
-+ * this request is sent for the very first time from a given server, the
-+ * client will first display a confirmation GUI to the player before
-+ * proceeding with the download.
-+ *
-+ * Notes:
-+ *
-+ * - Players can disable server resources on their client, in which
-+ * case this method will have no affect on them. Use the
-+ * {@link PlayerResourcePackStatusEvent} to figure out whether or not
-+ * the player loaded the pack!
-+ *
- To remove a resource pack you can use
+ /**
+ * Request that the player's client download and switch resource packs.
+ *
+@@ -1519,7 +1737,54 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+ * {@link PlayerResourcePackStatusEvent} to figure out whether or not
+ * the player loaded the pack!
+ *
- To remove a resource pack you can use
+- * {@link #removeResourcePack(UUID)} or {@link #removeResourcePacks()}.
+ * {@link #removeResourcePacks(UUID, UUID...)} or {@link #clearResourcePacks()}.
+ *
- The request is sent with empty string as the hash when the hash is
+ * not provided. This might result in newer versions not loading the
@@ -2589,19 +2575,33 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
+ }
+ // Paper end
+
- /**
- * Request that the player's client download and switch resource packs.
- *
-@@ -1497,7 +1762,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
- * {@link PlayerResourcePackStatusEvent} to figure out whether or not
- * the player loaded the pack!
- *
- To remove a resource pack you can use
-- * {@link #removeResourcePack(UUID)} or {@link #removeResourcePacks()}.
++ /**
++ * Request that the player's client download and switch resource packs.
++ *
++ * The player's client will download the new resource pack asynchronously
++ * in the background, and will automatically switch to it once the
++ * download is complete. If the client has downloaded and cached a
++ * resource pack with the same hash in the past it will not download but
++ * directly apply the cached pack. If the hash is null and the client has
++ * downloaded and cached the same resource pack in the past, it will
++ * perform a file size check against the response content to determine if
++ * the resource pack has changed and needs to be downloaded again. When
++ * this request is sent for the very first time from a given server, the
++ * client will first display a confirmation GUI to the player before
++ * proceeding with the download.
++ *
++ * Notes:
++ *
++ * - Players can disable server resources on their client, in which
++ * case this method will have no affect on them. Use the
++ * {@link PlayerResourcePackStatusEvent} to figure out whether or not
++ * the player loaded the pack!
++ *
- To remove a resource pack you can use
+ * {@link #removeResourcePacks(UUID, UUID...)} or {@link #clearResourcePacks()}.
*
- The request is sent with empty string as the hash when the hash is
* not provided. This might result in newer versions not loading the
* pack correctly.
-@@ -1516,7 +1781,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1538,7 +1803,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* length restriction is an implementation specific arbitrary value.
* @throws IllegalArgumentException Thrown if the hash is not 20 bytes
* long.
@@ -2611,7 +2611,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void setResourcePack(@NotNull String url, @Nullable byte[] hash, boolean force);
/**
-@@ -1541,7 +1808,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1563,7 +1830,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack!
*
- To remove a resource pack you can use
@@ -2620,7 +2620,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
*
- The request is sent with empty string as the hash when the hash is
* not provided. This might result in newer versions not loading the
* pack correctly.
-@@ -1561,9 +1828,61 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1583,9 +1850,61 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* length restriction is an implementation specific arbitrary value.
* @throws IllegalArgumentException Thrown if the hash is not 20 bytes
* long.
@@ -2682,7 +2682,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
/**
* Request that the player's client download and switch resource packs.
*
-@@ -1586,7 +1905,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1608,7 +1927,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack!
*
- To remove a resource pack you can use
@@ -2691,7 +2691,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
*
- The request is sent with empty string as the hash when the hash is
* not provided. This might result in newer versions not loading the
* pack correctly.
-@@ -1607,21 +1926,74 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1629,9 +1948,60 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* length restriction is an implementation specific arbitrary value.
* @throws IllegalArgumentException Thrown if the hash is not 20 bytes
* long.
@@ -2750,8 +2750,9 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
+ // Paper end
+
/**
- * Request that the player's client remove a resource pack sent by the
- * server.
+ * Request that the player's client download and include another resource pack.
+ *
+@@ -1684,12 +2054,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* @param id the id of the resource pack.
* @throws IllegalArgumentException If the ID is null.
@@ -2766,7 +2767,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
*/
public void removeResourcePacks();
-@@ -1759,7 +2131,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1827,7 +2199,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* @param title Title text
* @param subtitle Subtitle text
@@ -2775,7 +2776,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
*/
@Deprecated
public void sendTitle(@Nullable String title, @Nullable String subtitle);
-@@ -1778,7 +2150,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1846,7 +2218,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param fadeIn time in ticks for titles to fade in. Defaults to 10.
* @param stay time in ticks for titles to stay. Defaults to 70.
* @param fadeOut time in ticks for titles to fade out. Defaults to 20.
@@ -2785,7 +2786,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void sendTitle(@Nullable String title, @Nullable String subtitle, int fadeIn, int stay, int fadeOut);
/**
-@@ -2005,6 +2379,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2073,6 +2447,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public int getClientViewDistance();
@@ -2800,7 +2801,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
/**
* Gets the player's estimated ping in milliseconds.
*
-@@ -2030,8 +2412,10 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2098,8 +2480,10 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* they wish.
*
* @return the player's locale
@@ -2811,7 +2812,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public String getLocale();
/**
-@@ -2083,6 +2467,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2151,6 +2535,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public boolean isAllowingServerListings();
@@ -2826,7 +2827,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
// Spigot start
public class Spigot extends Entity.Spigot {
-@@ -2114,11 +2506,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2182,11 +2574,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -2840,7 +2841,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
@Override
public void sendMessage(@NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
throw new UnsupportedOperationException("Not supported yet.");
-@@ -2129,7 +2523,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2197,7 +2591,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* @param position the screen position
* @param component the components to send
@@ -2850,7 +2851,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @NotNull net.md_5.bungee.api.chat.BaseComponent component) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -2139,7 +2535,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2207,7 +2603,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* @param position the screen position
* @param components the components to send
@@ -2860,7 +2861,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -2150,7 +2548,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2218,7 +2616,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param position the screen position
* @param sender the sender of the message
* @param component the components to send
@@ -2870,7 +2871,7 @@ index b2925af90c531f0e8a5c39a915834f25d0015460..696efe5b86346209e9780b73229236e8
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent component) {
throw new UnsupportedOperationException("Not supported yet.");
}
-@@ -2161,7 +2561,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2229,7 +2629,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param position the screen position
* @param sender the sender of the message
* @param components the components to send
diff --git a/patches/api/0009-Paper-Plugins.patch b/patches/api/0009-Paper-Plugins.patch
index caeceff81777..b4178cbec8b2 100644
--- a/patches/api/0009-Paper-Plugins.patch
+++ b/patches/api/0009-Paper-Plugins.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Paper Plugins
diff --git a/build.gradle.kts b/build.gradle.kts
-index ea121fd0ea193410c3e44cf097a10a6d53d5bcbd..863833e05e2363b2e4ba4937f96ecbeac03a1ede 100644
+index af6c528ccc4356f5bba3ce0b9bf6de237d77376e..f9ff7e3692d448e2a1e38d0aa26c2d934442e247 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -52,7 +52,7 @@ dependencies {
@@ -1347,14 +1347,13 @@ index 0000000000000000000000000000000000000000..6bf3d212a6156ad9ab0e82d1ca0a04f8
+
+}
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index a3ee6f2f588bc9c87e49378359f450820b9af1b9..0743592273cc1c5f4ab6935349941bf25b438448 100644
+index 0f902aec66ec550f80709f7f314ca90d374ebb53..20efbec3eabb21806a532422130f7904d2c0967e 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -109,4 +109,14 @@ public interface UnsafeValues {
- * @return an internal potion data
- */
- PotionType.InternalPotionData getInternalPotionData(NamespacedKey key);
-+
+@@ -127,4 +127,13 @@ public interface UnsafeValues {
+ @ApiStatus.Internal
+ @NotNull
+ DamageSource.Builder createDamageSourceBuilder(@NotNull DamageType damageType);
+ // Paper start
+ @Deprecated(forRemoval = true)
+ boolean isSupportedApiVersion(String apiVersion);
diff --git a/patches/api/0011-Timings-v2.patch b/patches/api/0011-Timings-v2.patch
index 69aac0e5ba3e..143dd1027a92 100644
--- a/patches/api/0011-Timings-v2.patch
+++ b/patches/api/0011-Timings-v2.patch
@@ -2854,10 +2854,10 @@ index 0000000000000000000000000000000000000000..3e61a926620a67daec3af54b72a1b911
+ }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index a0fce496d2b90f484d2723c4ea4099ad29dc438f..f9360200c3f96018b3bd1d73b5336a78486cfaea 100644
+index bd1a010bb4e18a16d02549d64333ce7641be7910..07d393152320270e38f495120dd19e35ece73149 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -844,7 +844,6 @@ public final class Bukkit {
+@@ -864,7 +864,6 @@ public final class Bukkit {
*/
public static void reload() {
server.reload();
@@ -2866,10 +2866,10 @@ index a0fce496d2b90f484d2723c4ea4099ad29dc438f..f9360200c3f96018b3bd1d73b5336a78
/**
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 83ae1490f6c48d931541e13f76950fcdc62a5c01..f6fbf2ae2bb48a9edbb199b9a421fa388b2b99a6 100644
+index 6aed59819cc3d70f1b5975c3c7df40cc0b0afd8a..baa02b5223769755670c611ca4d6acc7bf202116 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1912,6 +1912,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1928,6 +1928,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -2897,10 +2897,10 @@ index 83ae1490f6c48d931541e13f76950fcdc62a5c01..f6fbf2ae2bb48a9edbb199b9a421fa38
* Sends the component to the player
*
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 0743592273cc1c5f4ab6935349941bf25b438448..659405d84b5a61618576e930805da5cd3a054b4c 100644
+index 20efbec3eabb21806a532422130f7904d2c0967e..853ef6f7f0cd2e5679688c40ce715b30473c3ce3 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -36,6 +36,7 @@ public interface UnsafeValues {
+@@ -40,6 +40,7 @@ public interface UnsafeValues {
net.kyori.adventure.text.Component resolveWithContext(net.kyori.adventure.text.Component component, org.bukkit.command.CommandSender context, org.bukkit.entity.Entity scoreboardSubject, boolean bypassPermissions) throws java.io.IOException;
// Paper end
@@ -2908,7 +2908,7 @@ index 0743592273cc1c5f4ab6935349941bf25b438448..659405d84b5a61618576e930805da5cd
Material toLegacy(Material material);
Material fromLegacy(Material material);
-@@ -119,4 +120,12 @@ public interface UnsafeValues {
+@@ -136,4 +137,12 @@ public interface UnsafeValues {
return !Bukkit.getUnsafe().isSupportedApiVersion(plugin.getDescription().getAPIVersion());
}
// Paper end
@@ -3455,10 +3455,10 @@ index 516d7fc7812aac343782861d0d567f54aa578c2a..00000000000000000000000000000000
- // Spigot end
-}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 696efe5b86346209e9780b73229236e87ca26dec..cec658bc1489b7b6ee76cc7d62d0d474c8972b2b 100644
+index 5c55715c8cdd79f2214b265a81d94a8904c998ea..a714877c44e6a6c5e90d0e0c5bf6eb30937e1037 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2566,7 +2566,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2634,7 +2634,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@Deprecated // Paper
public void sendMessage(@NotNull net.md_5.bungee.api.ChatMessageType position, @Nullable java.util.UUID sender, @NotNull net.md_5.bungee.api.chat.BaseComponent... components) {
throw new UnsupportedOperationException("Not supported yet.");
diff --git a/patches/api/0012-Add-command-line-option-to-load-extra-plugin-jars-no.patch b/patches/api/0012-Add-command-line-option-to-load-extra-plugin-jars-no.patch
index a70be177318a..a9ee212a3ca7 100644
--- a/patches/api/0012-Add-command-line-option-to-load-extra-plugin-jars-no.patch
+++ b/patches/api/0012-Add-command-line-option-to-load-extra-plugin-jars-no.patch
@@ -7,10 +7,10 @@ Subject: [PATCH] Add command line option to load extra plugin jars not in the
ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 7300bba67cfd4d312c59b0f81f597ea0f8a54fcd..3a8b07a870d334296e3865598741dc3e6fcf9b62 100644
+index 07d393152320270e38f495120dd19e35ece73149..026c1accb03bdd42981a2eaf9189d7b2fe6e7339 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -79,6 +79,20 @@ public final class Bukkit {
+@@ -80,6 +80,20 @@ public final class Bukkit {
return server;
}
@@ -32,10 +32,10 @@ index 7300bba67cfd4d312c59b0f81f597ea0f8a54fcd..3a8b07a870d334296e3865598741dc3e
* Attempts to set the {@link Server} singleton.
*
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 31227e818b624d641bb7562ac3de8a821815d33a..d3917c514f0e1d4343aed0738bea1625f63fcb92 100644
+index baa02b5223769755670c611ca4d6acc7bf202116..523f5ac54f7662c7c96182a352236732d2d3b122 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -64,6 +64,18 @@ import org.jetbrains.annotations.Nullable;
+@@ -65,6 +65,18 @@ import org.jetbrains.annotations.Nullable;
*/
public interface Server extends PluginMessageRecipient, net.kyori.adventure.audience.ForwardingAudience { // Paper
diff --git a/patches/api/0013-Player-affects-spawning-API.patch b/patches/api/0013-Player-affects-spawning-API.patch
index b864b43cb907..7ec789cb0984 100644
--- a/patches/api/0013-Player-affects-spawning-API.patch
+++ b/patches/api/0013-Player-affects-spawning-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Player affects spawning API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index cec658bc1489b7b6ee76cc7d62d0d474c8972b2b..f08dc4b58e7b3298bf12dc510c95ee7e644a19e4 100644
+index a714877c44e6a6c5e90d0e0c5bf6eb30937e1037..35de65a773146c4b4162df777a8ec594a22ca62c 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2418,6 +2418,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2486,6 +2486,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@Deprecated // Paper
public String getLocale();
diff --git a/patches/api/0014-Add-getTPS-method.patch b/patches/api/0014-Add-getTPS-method.patch
index 19d33368c1e5..3a5b0bf7b585 100644
--- a/patches/api/0014-Add-getTPS-method.patch
+++ b/patches/api/0014-Add-getTPS-method.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add getTPS method
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index f9545a52bc822af03182f8d18231e02b7348c90f..cb6433792786540e7bf667e466d6642e73ca8df0 100644
+index 026c1accb03bdd42981a2eaf9189d7b2fe6e7339..d640d6e8e919e410b54920502d7e26f2519d9e3c 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2050,6 +2050,17 @@ public final class Bukkit {
+@@ -2070,6 +2070,17 @@ public final class Bukkit {
return server.getEntity(uuid);
}
@@ -27,10 +27,10 @@ index f9545a52bc822af03182f8d18231e02b7348c90f..cb6433792786540e7bf667e466d6642e
* Get the advancement specified by this key.
*
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 9b887115c90ed80b391f414b1b9db85b2b9e85ee..b8871820aab10f5d8d167e661e73b671204e9b4f 100644
+index 523f5ac54f7662c7c96182a352236732d2d3b122..7ae7db87b8507e726b6c28400bd3e7eb9413ffb0 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1749,6 +1749,16 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1765,6 +1765,16 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@Nullable
Entity getEntity(@NotNull UUID uuid);
diff --git a/patches/api/0015-Version-Command-2.0.patch b/patches/api/0015-Version-Command-2.0.patch
index 99c72a7b3d9e..e2ef50e5555a 100644
--- a/patches/api/0015-Version-Command-2.0.patch
+++ b/patches/api/0015-Version-Command-2.0.patch
@@ -56,10 +56,10 @@ index 0000000000000000000000000000000000000000..a736d7bcdc5861a01b66ba36158db1c7
+ }
+}
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 659405d84b5a61618576e930805da5cd3a054b4c..4604392831d19a789e4906cf1a5f0197105fd6f2 100644
+index 853ef6f7f0cd2e5679688c40ce715b30473c3ce3..688fccdbc5cf831008ef2f27db9d15b0921a7561 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -127,5 +127,12 @@ public interface UnsafeValues {
+@@ -144,5 +144,12 @@ public interface UnsafeValues {
* @return name
*/
String getTimingsServerName();
diff --git a/patches/api/0016-Entity-Origin-API.patch b/patches/api/0016-Entity-Origin-API.patch
index 0c88ffbc114a..6b50aee01c90 100644
--- a/patches/api/0016-Entity-Origin-API.patch
+++ b/patches/api/0016-Entity-Origin-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entity Origin API
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 978431fd88cfb7d42fcdea8c904633df5c64daed..24341516dd7d358b391f5e895cd837b5a10a8802 100644
+index 0025139f403cfc80ace9f8584ccf42d3a5cbb718..fd3b707893ba59aa6f6e4009113c5a94be5d7536 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -783,5 +783,15 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -778,5 +778,15 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
default net.kyori.adventure.text.event.HoverEvent asHoverEvent(final @NotNull java.util.function.UnaryOperator op) {
return net.kyori.adventure.text.event.HoverEvent.showEntity(op.apply(net.kyori.adventure.text.event.HoverEvent.ShowEntity.of(this.getType().getKey(), this.getUniqueId(), this.customName())));
}
diff --git a/patches/api/0018-Add-view-distance-API.patch b/patches/api/0018-Add-view-distance-API.patch
index b4da0f99b525..5500519c96a7 100644
--- a/patches/api/0018-Add-view-distance-API.patch
+++ b/patches/api/0018-Add-view-distance-API.patch
@@ -8,10 +8,10 @@ Add per player no-tick, tick, and send view distances.
Also add send/no-tick view distance to World.
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 4c878531d9d8d0aee6832fd10b339a32f219fa9a..1ea851c658243aa3bfcdbffca3df5ded9386da98 100644
+index d76db156a7eeefaac3c96d2d547fddecefbd863e..41a181b890e029f99e52ae9aad28a86f28005f9e 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -2875,6 +2875,66 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2916,6 +2916,66 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public Set getFeatureFlags();
@@ -76,13 +76,13 @@ index 4c878531d9d8d0aee6832fd10b339a32f219fa9a..1ea851c658243aa3bfcdbffca3df5ded
+ // Paper end - view distance api
+
/**
- * Represents various map environment types that a world may be
- */
+ * Gets all generated structures that intersect the chunk at the given
+ * coordinates.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index f08dc4b58e7b3298bf12dc510c95ee7e644a19e4..fde2096830c966df902ade38c709dfb7506b551b 100644
+index 35de65a773146c4b4162df777a8ec594a22ca62c..b66f9264ceb38677d7422b47e379a0e860bcac07 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2432,6 +2432,82 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2500,6 +2500,82 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param affects Whether the player can affect mob spawning
*/
public void setAffectsSpawning(boolean affects);
diff --git a/patches/api/0021-Expose-server-CommandMap.patch b/patches/api/0021-Expose-server-CommandMap.patch
index 4f48f5782623..697a4cca7cb5 100644
--- a/patches/api/0021-Expose-server-CommandMap.patch
+++ b/patches/api/0021-Expose-server-CommandMap.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expose server CommandMap
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index cb6433792786540e7bf667e466d6642e73ca8df0..6c5ded00ddf2c5e991baac73f63d5fd6444ccbda 100644
+index d640d6e8e919e410b54920502d7e26f2519d9e3c..3d6c51fdd549a94a73fa3d19c0937aa2ec72b42e 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2251,6 +2251,19 @@ public final class Bukkit {
+@@ -2271,6 +2271,19 @@ public final class Bukkit {
return server.getUnsafe();
}
@@ -29,10 +29,10 @@ index cb6433792786540e7bf667e466d6642e73ca8df0..6c5ded00ddf2c5e991baac73f63d5fd6
public static Server.Spigot spigot() {
return server.spigot();
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index b8871820aab10f5d8d167e661e73b671204e9b4f..f95fbfa29f3926847c78b218037cac601c7d9419 100644
+index 7ae7db87b8507e726b6c28400bd3e7eb9413ffb0..95c9016e67c6c17ae8bac35fd01f62eae96ecf6a 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1759,6 +1759,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1775,6 +1775,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
public double[] getTPS();
// Paper end
diff --git a/patches/api/0022-Graduate-bungeecord-chat-API-from-spigot-subclasses.patch b/patches/api/0022-Graduate-bungeecord-chat-API-from-spigot-subclasses.patch
index 2f440acc020b..73014012bc7f 100644
--- a/patches/api/0022-Graduate-bungeecord-chat-API-from-spigot-subclasses.patch
+++ b/patches/api/0022-Graduate-bungeecord-chat-API-from-spigot-subclasses.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Graduate bungeecord chat API from spigot subclasses
Change Javadoc to be accurate
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 6c5ded00ddf2c5e991baac73f63d5fd6444ccbda..5c6d52f707905f9c60dd2a5097084e97a31806f4 100644
+index 3d6c51fdd549a94a73fa3d19c0937aa2ec72b42e..bafbb72996cb0cacf17b5741a7efbb1583277c6e 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -421,6 +421,30 @@ public final class Bukkit {
+@@ -441,6 +441,30 @@ public final class Bukkit {
return server.broadcastMessage(message);
}
@@ -41,10 +41,10 @@ index 6c5ded00ddf2c5e991baac73f63d5fd6444ccbda..5c6d52f707905f9c60dd2a5097084e97
* Gets the name of the update folder. The update folder is used to safely
* update plugins at the right moment on a plugin load.
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index f95fbfa29f3926847c78b218037cac601c7d9419..979028265db05a8a97c2dc10138075eaa15b2472 100644
+index 95c9016e67c6c17ae8bac35fd01f62eae96ecf6a..7edac90aa6f37c9c3ebbe7260186ae3e279cea0b 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -354,6 +354,30 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -370,6 +370,30 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@Deprecated // Paper
public int broadcastMessage(@NotNull String message);
@@ -76,10 +76,10 @@ index f95fbfa29f3926847c78b218037cac601c7d9419..979028265db05a8a97c2dc10138075ea
* Gets the name of the update folder. The update folder is used to safely
* update plugins at the right moment on a plugin load.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index fde2096830c966df902ade38c709dfb7506b551b..3077db3156cdbf25b93f5fa8a24568ba73b53f68 100644
+index b66f9264ceb38677d7422b47e379a0e860bcac07..0ffe5812e2d59d3fbf56061eea0a2f391cde6758 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1144,6 +1144,42 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1172,6 +1172,42 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public void sendMap(@NotNull MapView map);
diff --git a/patches/api/0026-Player-Tab-List-and-Title-APIs.patch b/patches/api/0026-Player-Tab-List-and-Title-APIs.patch
index d9c2b55aedee..f91823439261 100644
--- a/patches/api/0026-Player-Tab-List-and-Title-APIs.patch
+++ b/patches/api/0026-Player-Tab-List-and-Title-APIs.patch
@@ -432,10 +432,10 @@ index 0000000000000000000000000000000000000000..9e90c3df567a65b48a0b9341f784eb90
+ }
+}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 3077db3156cdbf25b93f5fa8a24568ba73b53f68..f89d04a7bcc69523da9d702b19e29190ca048e9b 100644
+index 0ffe5812e2d59d3fbf56061eea0a2f391cde6758..ba58936116ce1e2e805a03251bb19484058e4f0f 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1178,6 +1178,131 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1206,6 +1206,131 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
public default void sendMessage(net.md_5.bungee.api.ChatMessageType position, net.md_5.bungee.api.chat.BaseComponent... components) {
spigot().sendMessage(position, components);
}
diff --git a/patches/api/0028-Complete-resource-pack-API.patch b/patches/api/0028-Complete-resource-pack-API.patch
index 0dac369463a6..3a19d1416513 100644
--- a/patches/api/0028-Complete-resource-pack-API.patch
+++ b/patches/api/0028-Complete-resource-pack-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Complete resource pack API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index f89d04a7bcc69523da9d702b19e29190ca048e9b..0526e1149cf4cd2ab3ee2ac9eafbaeab0c99c5ee 100644
+index ba58936116ce1e2e805a03251bb19484058e4f0f..6a8f5720ef33b54b3a89d4299462827ab304e0d9 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2141,6 +2141,180 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2163,6 +2163,180 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void setResourcePack(@NotNull UUID uuid, @NotNull String url, byte @Nullable [] hash, net.kyori.adventure.text.@Nullable Component prompt, boolean force);
// Paper end
@@ -187,8 +187,8 @@ index f89d04a7bcc69523da9d702b19e29190ca048e9b..0526e1149cf4cd2ab3ee2ac9eafbaeab
+ // Paper end - more resource pack API
+
/**
- * Request that the player's client remove a resource pack sent by the
- * server.
+ * Request that the player's client download and include another resource pack.
+ *
diff --git a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java b/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java
index e2c4f9a0456cef345772d57b4d9c6e7d9598dd53..e4c32b21ab013703a6a1b07a1ad564d914ebe83f 100644
--- a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java
diff --git a/patches/api/0031-Add-command-to-reload-permissions.yml-and-require-co.patch b/patches/api/0031-Add-command-to-reload-permissions.yml-and-require-co.patch
index e9b686dec3aa..b3773538b850 100644
--- a/patches/api/0031-Add-command-to-reload-permissions.yml-and-require-co.patch
+++ b/patches/api/0031-Add-command-to-reload-permissions.yml-and-require-co.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Add command to reload permissions.yml and require confirm to
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 5c6d52f707905f9c60dd2a5097084e97a31806f4..ba2bdb4dda26370aa1ad2425cc2d9e4e05344650 100644
+index bafbb72996cb0cacf17b5741a7efbb1583277c6e..0ce6fda182e4d87b1ef7abe4d8bd9e3a06891412 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2286,6 +2286,13 @@ public final class Bukkit {
+@@ -2306,6 +2306,13 @@ public final class Bukkit {
public static org.bukkit.command.CommandMap getCommandMap() {
return server.getCommandMap();
}
@@ -24,10 +24,10 @@ index 5c6d52f707905f9c60dd2a5097084e97a31806f4..ba2bdb4dda26370aa1ad2425cc2d9e4e
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 979028265db05a8a97c2dc10138075eaa15b2472..c061146ac6c6bee2b865e32580e577168d61ea87 100644
+index 7edac90aa6f37c9c3ebbe7260186ae3e279cea0b..f9dcb6728afb646f9c27e6642bb3b0d91e4448e9 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2020,4 +2020,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2036,4 +2036,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
Spigot spigot();
// Spigot end
diff --git a/patches/api/0044-Allow-Reloading-of-Command-Aliases.patch b/patches/api/0044-Allow-Reloading-of-Command-Aliases.patch
index 22196422e521..2c0c9c2344cd 100644
--- a/patches/api/0044-Allow-Reloading-of-Command-Aliases.patch
+++ b/patches/api/0044-Allow-Reloading-of-Command-Aliases.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Allow Reloading of Command Aliases
Reload the aliases stored in commands.yml
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index ba2bdb4dda26370aa1ad2425cc2d9e4e05344650..b89c38ca48df446ea97217e5031d1c70dd01d8d9 100644
+index 0ce6fda182e4d87b1ef7abe4d8bd9e3a06891412..cf5cf4375f3a0bd68bb00dc061a039c9c1de0b5e 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2293,6 +2293,15 @@ public final class Bukkit {
+@@ -2313,6 +2313,15 @@ public final class Bukkit {
public static void reloadPermissions() {
server.reloadPermissions();
}
@@ -26,10 +26,10 @@ index ba2bdb4dda26370aa1ad2425cc2d9e4e05344650..b89c38ca48df446ea97217e5031d1c70
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index c061146ac6c6bee2b865e32580e577168d61ea87..f13e254395c942082dc426615e215e3f3eb0b1c5 100644
+index f9dcb6728afb646f9c27e6642bb3b0d91e4448e9..d15b926de36f29ced80e0cfef7594ce0646b988e 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2022,4 +2022,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2038,4 +2038,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
// Spigot end
void reloadPermissions(); // Paper
diff --git a/patches/api/0047-Add-String-based-Action-Bar-API.patch b/patches/api/0047-Add-String-based-Action-Bar-API.patch
index c43ff6dccc92..fd2181f8a01a 100644
--- a/patches/api/0047-Add-String-based-Action-Bar-API.patch
+++ b/patches/api/0047-Add-String-based-Action-Bar-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add String based Action Bar API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 0526e1149cf4cd2ab3ee2ac9eafbaeab0c99c5ee..c1ab6640003ec02f8e8f9ebd4060854c68d46baa 100644
+index 6a8f5720ef33b54b3a89d4299462827ab304e0d9..83f9026e86223bc763990a90da5fda26dec2785f 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1145,6 +1145,39 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1173,6 +1173,39 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
public void sendMap(@NotNull MapView map);
// Paper start
@@ -48,7 +48,7 @@ index 0526e1149cf4cd2ab3ee2ac9eafbaeab0c99c5ee..c1ab6640003ec02f8e8f9ebd4060854c
/**
* Sends the component to the player
*
-@@ -1172,9 +1205,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1200,9 +1233,11 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/**
* Sends an array of components as a single message to the specified screen position of this player
*
diff --git a/patches/api/0052-Provide-E-TE-Chunk-count-stat-methods.patch b/patches/api/0052-Provide-E-TE-Chunk-count-stat-methods.patch
index 85d8b5eb6825..54af8d0c41a0 100644
--- a/patches/api/0052-Provide-E-TE-Chunk-count-stat-methods.patch
+++ b/patches/api/0052-Provide-E-TE-Chunk-count-stat-methods.patch
@@ -7,10 +7,10 @@ Provides counts without the ineffeciency of using .getEntities().size()
which creates copy of the collections.
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 2867faf0acbbbb2e99c5b503f0c6bc83f3bfe80f..f5a398aa5f7a7e6280167fd723f78f4d72e2b1dd 100644
+index 41a181b890e029f99e52ae9aad28a86f28005f9e..fa6f6c8eccd680a4e83443e472f37650e7cd05c5 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -47,6 +47,33 @@ import org.jetbrains.annotations.Nullable;
+@@ -49,6 +49,33 @@ import org.jetbrains.annotations.Nullable;
*/
public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient, Metadatable, PersistentDataHolder, Keyed, net.kyori.adventure.audience.ForwardingAudience { // Paper
diff --git a/patches/api/0055-Add-configuration-option-to-prevent-player-names-fro.patch b/patches/api/0055-Add-configuration-option-to-prevent-player-names-fro.patch
index 7532ee5c3227..a04f9b446fc2 100644
--- a/patches/api/0055-Add-configuration-option-to-prevent-player-names-fro.patch
+++ b/patches/api/0055-Add-configuration-option-to-prevent-player-names-fro.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Add configuration option to prevent player names from being
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index b89c38ca48df446ea97217e5031d1c70dd01d8d9..ff83383c3fcbf4de3e6be0a0a950f132b6c47807 100644
+index cf5cf4375f3a0bd68bb00dc061a039c9c1de0b5e..5f758640ae71bca8c5e532af21362011a0aafb89 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2302,6 +2302,16 @@ public final class Bukkit {
+@@ -2322,6 +2322,16 @@ public final class Bukkit {
public static boolean reloadCommandAliases() {
return server.reloadCommandAliases();
}
@@ -27,10 +27,10 @@ index b89c38ca48df446ea97217e5031d1c70dd01d8d9..ff83383c3fcbf4de3e6be0a0a950f132
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index f13e254395c942082dc426615e215e3f3eb0b1c5..1c088886add66f1e99bee42f70e5bc742c912e88 100644
+index d15b926de36f29ced80e0cfef7594ce0646b988e..e3136651ce083e67a1a7cb976d27df5666843401 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2024,4 +2024,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2040,4 +2040,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
void reloadPermissions(); // Paper
boolean reloadCommandAliases(); // Paper
diff --git a/patches/api/0056-Fix-upstream-javadocs.patch b/patches/api/0056-Fix-upstream-javadocs.patch
index 93c118684d66..4205834c36f1 100644
--- a/patches/api/0056-Fix-upstream-javadocs.patch
+++ b/patches/api/0056-Fix-upstream-javadocs.patch
@@ -49,10 +49,10 @@ index a04cde615f8c4bc593f8d9f8f6f1438008aaa707..548f6d28c28d74bed8b58ee828759093
* @param target the target to remove from this list
*/
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index ff83383c3fcbf4de3e6be0a0a950f132b6c47807..22d63e82c3c7d54e90c5cd7adef09882f01c7da2 100644
+index 5f758640ae71bca8c5e532af21362011a0aafb89..2bdba56855d3427a1c48bfada0e6416085386cdb 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -1474,6 +1474,8 @@ public final class Bukkit {
+@@ -1494,6 +1494,8 @@ public final class Bukkit {
/**
* Gets every player that has ever played on this server.
@@ -114,10 +114,10 @@ index 4c9fd558fbf7f57a948fbb7f80f4651048c0fb57..458119a9ef7ce8e1f59bd47caa5b4bc6
* @param statePredicate The predicate which should get used to test if a block should be set or not.
* @return true if the tree was created successfully, otherwise false
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 1c088886add66f1e99bee42f70e5bc742c912e88..5a8f15195b0a87bb7a49983e5ee0dee6d2ce242c 100644
+index e3136651ce083e67a1a7cb976d27df5666843401..50e8c25cc378b02b09ef57643cc753fa58ec1166 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -552,13 +552,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -568,13 +568,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*
*
* Note: If set to 0, {@link SpawnCategory} mobs spawning will be disabled.
@@ -132,7 +132,7 @@ index 1c088886add66f1e99bee42f70e5bc742c912e88..5a8f15195b0a87bb7a49983e5ee0dee6
*/
public int getTicksPerSpawns(@NotNull SpawnCategory spawnCategory);
-@@ -1258,6 +1255,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1274,6 +1271,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
/**
* Gets every player that has ever played on this server.
@@ -142,10 +142,10 @@ index 1c088886add66f1e99bee42f70e5bc742c912e88..5a8f15195b0a87bb7a49983e5ee0dee6
* @return an array containing all previous players
*/
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index fe94aeb95297877c8e4d8fbeb6f0e27aaaa23b44..de174d381b4917a66f68715a21431e167434201d 100644
+index fa6f6c8eccd680a4e83443e472f37650e7cd05c5..6decacdf85827305dbee9d34dadef4bc7c69e20a 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -2673,7 +2673,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2714,7 +2714,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
/**
* Find the closest nearby structure of a given {@link StructureType}.
* Finding unexplored structures can, and will, block if the world is
@@ -154,7 +154,7 @@ index fe94aeb95297877c8e4d8fbeb6f0e27aaaa23b44..de174d381b4917a66f68715a21431e16
* temporarily freezing while locating an unexplored structure.
*
* The {@code radius} is not a rigid square radius. Each structure may alter
-@@ -2707,7 +2707,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2748,7 +2748,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
/**
* Find the closest nearby structure of a given {@link StructureType}.
* Finding unexplored structures can, and will, block if the world is
@@ -163,7 +163,7 @@ index fe94aeb95297877c8e4d8fbeb6f0e27aaaa23b44..de174d381b4917a66f68715a21431e16
* temporarily freezing while locating an unexplored structure.
*
* The {@code radius} is not a rigid square radius. Each structure may alter
-@@ -2740,7 +2740,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2781,7 +2781,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
/**
* Find the closest nearby structure of a given {@link Structure}. Finding
* unexplored structures can, and will, block if the world is looking in
@@ -426,10 +426,10 @@ index ae9eaaa8e38e1d9dfc459926c7fc51ddb89de84a..b2ec535bb1b0ce0c114ddd7638b90218
@Override
public int getConversionTime();
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3ae8612b1 100644
+index 83f9026e86223bc763990a90da5fda26dec2785f..d507aeb5b906b5b68d1daa5bfd2d98ede1b0e7b6 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -432,15 +432,15 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -434,15 +434,15 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/**
* Saves the players current location, health, inventory, motion, and
@@ -449,7 +449,7 @@ index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3
*
* Note: This will overwrite the players current inventory, health,
* motion, etc, with the state from the saved dat file.
-@@ -777,7 +777,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -779,7 +779,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/**
* Plays an effect to just this player.
*
@@ -458,7 +458,7 @@ index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3
* @param loc the location to play the effect at
* @param effect the {@link Effect}
* @param data a data bit needed for some effects
-@@ -1162,7 +1162,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1190,7 +1190,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* Use supplied alternative character to the section symbol to represent legacy color codes.
*
@@ -467,7 +467,7 @@ index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3
* @param message The message to send
* @deprecated use {@link #sendActionBar(net.kyori.adventure.text.Component)}
*/
-@@ -1628,7 +1628,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1656,7 +1656,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/**
* Allows this player to see a player that was previously hidden. If
@@ -476,7 +476,7 @@ index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3
* remain hidden until the other plugin calls this method too.
*
* @param plugin Plugin that wants to show the player
-@@ -1657,7 +1657,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1683,7 +1683,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/**
* Allows this player to see an entity that was previously hidden. If
@@ -485,7 +485,7 @@ index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3
* remain hidden until the other plugin calls this method too.
*
* @param plugin Plugin that wants to show the entity
-@@ -1744,9 +1744,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1766,9 +1766,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* case this method will have no affect on them. Use the
* {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack!
@@ -495,7 +495,7 @@ index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3
*
- The request is send with "null" as the hash. This might result
* in newer versions not loading the pack correctly.
*
-@@ -1780,9 +1777,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1802,9 +1799,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* case this method will have no affect on them. Use the
* {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack!
@@ -505,7 +505,7 @@ index c1ab6640003ec02f8e8f9ebd4060854c68d46baa..fa011b40e1369d5161f6af22b23885e3
* The request is send with empty string as the hash. This might result
* in newer versions not loading the pack correctly.
*
-@@ -1819,9 +1813,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1841,9 +1835,6 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* case this method will have no affect on them. Use the
* {@link PlayerResourcePackStatusEvent} to figure out whether or not
* the player loaded the pack!
diff --git a/patches/api/0060-Basic-PlayerProfile-API.patch b/patches/api/0060-Basic-PlayerProfile-API.patch
index 05b288bad7df..4a664dab73a8 100644
--- a/patches/api/0060-Basic-PlayerProfile-API.patch
+++ b/patches/api/0060-Basic-PlayerProfile-API.patch
@@ -321,10 +321,10 @@ index 0000000000000000000000000000000000000000..7b3b6ef533d32169fbeca389bd61cfc6
+ }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 22d63e82c3c7d54e90c5cd7adef09882f01c7da2..cf00ff0c0332b31167f8f1b7b386674458cdf15a 100644
+index 2bdba56855d3427a1c48bfada0e6416085386cdb..48cce5c4a31ce9df3f2fe0aba4dd50e0547493b6 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2314,6 +2314,83 @@ public final class Bukkit {
+@@ -2334,6 +2334,83 @@ public final class Bukkit {
public static boolean suggestPlayerNamesWhenNullTabCompletions() {
return server.suggestPlayerNamesWhenNullTabCompletions();
}
@@ -409,10 +409,10 @@ index 22d63e82c3c7d54e90c5cd7adef09882f01c7da2..cf00ff0c0332b31167f8f1b7b3866744
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 5a8f15195b0a87bb7a49983e5ee0dee6d2ce242c..4016129ead172c5f5b550482f523921d39df046f 100644
+index 50e8c25cc378b02b09ef57643cc753fa58ec1166..7bbd014aa3ecbae15518d9ebe4e6ec03a870ed5e 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2032,5 +2032,74 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2048,5 +2048,74 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @return true if player names should be suggested
*/
boolean suggestPlayerNamesWhenNullTabCompletions();
diff --git a/patches/api/0063-Entity-fromMobSpawner.patch b/patches/api/0063-Entity-fromMobSpawner.patch
index 98664b4d0a0d..8922abb73e1e 100644
--- a/patches/api/0063-Entity-fromMobSpawner.patch
+++ b/patches/api/0063-Entity-fromMobSpawner.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entity#fromMobSpawner()
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 24341516dd7d358b391f5e895cd837b5a10a8802..754097d9858b3a74f73c6ca483c2577c837f9f3a 100644
+index fd3b707893ba59aa6f6e4009113c5a94be5d7536..28e2d003db578e7c0468c0d443fda3a40e2a0efa 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -793,5 +793,12 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -788,5 +788,12 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
*/
@Nullable
Location getOrigin();
diff --git a/patches/api/0077-Expose-client-protocol-version-and-virtual-host.patch b/patches/api/0077-Expose-client-protocol-version-and-virtual-host.patch
index bc5b41f1a8fd..95708e688a8f 100644
--- a/patches/api/0077-Expose-client-protocol-version-and-virtual-host.patch
+++ b/patches/api/0077-Expose-client-protocol-version-and-virtual-host.patch
@@ -57,10 +57,10 @@ index 0000000000000000000000000000000000000000..7b2af1bd72dfbcf4e962a982940fc49b
+
+}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index cdc797fd351ffb261a0233e48b684dfd3bb62386..3f28d02d39c937abf001ae286632b84a5814fb61 100644
+index d507aeb5b906b5b68d1daa5bfd2d98ede1b0e7b6..74ccef3361a8089a2bf03cc3d2e0826f067b647e 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -52,7 +52,7 @@ import org.jetbrains.annotations.Nullable;
+@@ -54,7 +54,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Represents a player, connected or not
*/
diff --git a/patches/api/0081-Ability-to-apply-mending-to-XP-API.patch b/patches/api/0081-Ability-to-apply-mending-to-XP-API.patch
index 34e7521d4796..5515a779ea5a 100644
--- a/patches/api/0081-Ability-to-apply-mending-to-XP-API.patch
+++ b/patches/api/0081-Ability-to-apply-mending-to-XP-API.patch
@@ -10,10 +10,10 @@ of giving the player experience points.
Both an API To standalone mend, and apply mending logic to .giveExp has been added.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 8d09741cbb66ae6f0037f3195c1f1f57850307e4..90930f0f4eb30534c94165079d8c3ad923e6de0e 100644
+index 74ccef3361a8089a2bf03cc3d2e0826f067b647e..8ec100779944579f83cfc1be4b124a4c780cdc07 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1471,6 +1471,15 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1499,6 +1499,15 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public void resetPlayerWeather();
@@ -29,7 +29,7 @@ index 8d09741cbb66ae6f0037f3195c1f1f57850307e4..90930f0f4eb30534c94165079d8c3ad9
/**
* Gets the player's cooldown between picking up experience orbs.
*
-@@ -1496,8 +1505,20 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1524,8 +1533,20 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* Gives the player the amount of experience specified.
*
* @param amount Exp amount to give
diff --git a/patches/api/0092-Player.setPlayerProfile-API.patch b/patches/api/0092-Player.setPlayerProfile-API.patch
index 037d277caa33..0d0b10e01967 100644
--- a/patches/api/0092-Player.setPlayerProfile-API.patch
+++ b/patches/api/0092-Player.setPlayerProfile-API.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Player.setPlayerProfile API
This can be useful for changing name or skins after a player has logged in.
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index cf00ff0c0332b31167f8f1b7b386674458cdf15a..11288c4e1cb6a1f8322c6cbacb3750e6b08dad5e 100644
+index 48cce5c4a31ce9df3f2fe0aba4dd50e0547493b6..990436521c4d080d7adbd0a8c55f03690f17c1ec 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -1316,8 +1316,10 @@ public final class Bukkit {
+@@ -1336,8 +1336,10 @@ public final class Bukkit {
* @return the new PlayerProfile
* @throws IllegalArgumentException if both the unique id is
* null
and the name is null
or blank
@@ -20,7 +20,7 @@ index cf00ff0c0332b31167f8f1b7b386674458cdf15a..11288c4e1cb6a1f8322c6cbacb3750e6
public static PlayerProfile createPlayerProfile(@Nullable UUID uniqueId, @Nullable String name) {
return server.createPlayerProfile(uniqueId, name);
}
-@@ -1328,8 +1330,10 @@ public final class Bukkit {
+@@ -1348,8 +1350,10 @@ public final class Bukkit {
* @param uniqueId the unique id
* @return the new PlayerProfile
* @throws IllegalArgumentException if the unique id is null
@@ -31,7 +31,7 @@ index cf00ff0c0332b31167f8f1b7b386674458cdf15a..11288c4e1cb6a1f8322c6cbacb3750e6
public static PlayerProfile createPlayerProfile(@NotNull UUID uniqueId) {
return server.createPlayerProfile(uniqueId);
}
-@@ -1341,8 +1345,10 @@ public final class Bukkit {
+@@ -1361,8 +1365,10 @@ public final class Bukkit {
* @return the new PlayerProfile
* @throws IllegalArgumentException if the name is null
or
* blank
@@ -56,10 +56,10 @@ index ff59479f4782ac7726504aab239de79fdc840cde..abbf3d6f11350ab2dd47a277771d9f46
/**
* Checks if this player has had their profile banned.
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 4016129ead172c5f5b550482f523921d39df046f..4d500904b28375f8517aa05075667da22f23f754 100644
+index 7bbd014aa3ecbae15518d9ebe4e6ec03a870ed5e..c60be47a0ac646133211ab4bf17b4fad4d1893db 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1127,8 +1127,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1143,8 +1143,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @return the new PlayerProfile
* @throws IllegalArgumentException if both the unique id is
* null
and the name is null
or blank
@@ -70,7 +70,7 @@ index 4016129ead172c5f5b550482f523921d39df046f..4d500904b28375f8517aa05075667da2
PlayerProfile createPlayerProfile(@Nullable UUID uniqueId, @Nullable String name);
/**
-@@ -1137,8 +1139,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1153,8 +1155,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @param uniqueId the unique id
* @return the new PlayerProfile
* @throws IllegalArgumentException if the unique id is null
@@ -81,7 +81,7 @@ index 4016129ead172c5f5b550482f523921d39df046f..4d500904b28375f8517aa05075667da2
PlayerProfile createPlayerProfile(@NotNull UUID uniqueId);
/**
-@@ -1148,8 +1152,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1164,8 +1168,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @return the new PlayerProfile
* @throws IllegalArgumentException if the name is null
or
* blank
@@ -93,10 +93,10 @@ index 4016129ead172c5f5b550482f523921d39df046f..4d500904b28375f8517aa05075667da2
/**
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 90930f0f4eb30534c94165079d8c3ad923e6de0e..95f791b1f0af0735e565c0150fb2a4a3597b9997 100644
+index 8ec100779944579f83cfc1be4b124a4c780cdc07..ecc99524f20e1d7072bfad3ac310cccc4514e40f 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2949,6 +2949,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3017,6 +3017,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
}
// Paper end
diff --git a/patches/api/0093-getPlayerUniqueId-API.patch b/patches/api/0093-getPlayerUniqueId-API.patch
index 9b6ebd84649c..64497be9584c 100644
--- a/patches/api/0093-getPlayerUniqueId-API.patch
+++ b/patches/api/0093-getPlayerUniqueId-API.patch
@@ -9,10 +9,10 @@ In Offline Mode, will return an Offline UUID
This is a more performant way to obtain a UUID for a name than loading an OfflinePlayer
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 11288c4e1cb6a1f8322c6cbacb3750e6b08dad5e..579b002425024a942091c95880366ba8f1761e1c 100644
+index 990436521c4d080d7adbd0a8c55f03690f17c1ec..4f9ebcd991875d0bf486a8ebb39909f2ac32493b 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -699,6 +699,20 @@ public final class Bukkit {
+@@ -719,6 +719,20 @@ public final class Bukkit {
return server.getPlayer(id);
}
@@ -34,10 +34,10 @@ index 11288c4e1cb6a1f8322c6cbacb3750e6b08dad5e..579b002425024a942091c95880366ba8
* Gets the plugin manager for interfacing with plugins.
*
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 4d500904b28375f8517aa05075667da22f23f754..4c16d026c6850f38295e71f4f4299e81f3e4c856 100644
+index c60be47a0ac646133211ab4bf17b4fad4d1893db..7c53979f407a6a24c6d16bbfb205a8ac0321e5dc 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -601,6 +601,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -617,6 +617,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@Nullable
public Player getPlayer(@NotNull UUID id);
diff --git a/patches/api/0095-Add-openSign-method-to-HumanEntity.patch b/patches/api/0095-Add-openSign-method-to-HumanEntity.patch
index 18673117dc77..513d2c7b96b5 100644
--- a/patches/api/0095-Add-openSign-method-to-HumanEntity.patch
+++ b/patches/api/0095-Add-openSign-method-to-HumanEntity.patch
@@ -36,10 +36,10 @@ index abdca9fe5acc90f167219eb769ece66c35682bb1..b3aa3dc6aa5afbc36cc86741b4cba56f
/**
* Make the entity drop the item in their hand.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 95f791b1f0af0735e565c0150fb2a4a3597b9997..40853a37eb433b587ab63741367bbaf0ca60c0c1 100644
+index ecc99524f20e1d7072bfad3ac310cccc4514e40f..d06f9b4d0117515fb8fcf78d416dcd2b4ef6fb4b 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2910,10 +2910,12 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2978,10 +2978,12 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/**
* Open a Sign for editing by the Player.
*
diff --git a/patches/api/0096-Add-Ban-Methods-to-Player-Objects.patch b/patches/api/0096-Add-Ban-Methods-to-Player-Objects.patch
index b300e1c039e2..02815e865bd4 100644
--- a/patches/api/0096-Add-Ban-Methods-to-Player-Objects.patch
+++ b/patches/api/0096-Add-Ban-Methods-to-Player-Objects.patch
@@ -74,10 +74,10 @@ index abbf3d6f11350ab2dd47a277771d9f46221036bd..d8a3b6cb2d0cb035b2ab09e0327bc4f0
/**
* Adds this user to the {@link ProfileBanList}. If a previous ban exists, this will
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 40853a37eb433b587ab63741367bbaf0ca60c0c1..62707884e012badec14f74665f32058812bbc46e 100644
+index d06f9b4d0117515fb8fcf78d416dcd2b4ef6fb4b..07dde016220eef654901e3d78e2d37fb4ee4a128 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1145,6 +1145,162 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1173,6 +1173,162 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
public void sendMap(@NotNull MapView map);
// Paper start
diff --git a/patches/api/0098-Enderman.teleportRandomly.patch b/patches/api/0098-Enderman.teleportRandomly.patch
index 907a74cf51f5..5fedcbb7461c 100644
--- a/patches/api/0098-Enderman.teleportRandomly.patch
+++ b/patches/api/0098-Enderman.teleportRandomly.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Enderman.teleportRandomly()
Ability to trigger the vanilla "teleport randomly" mechanic of an enderman.
diff --git a/src/main/java/org/bukkit/entity/Enderman.java b/src/main/java/org/bukkit/entity/Enderman.java
-index 0a03dc437973888ba57ba00fec47193fee38b5a9..605af1a9fc48602643aec57dd14e8c4ab657a0bc 100644
+index cc4648528c08980e6191e2fbdd7ba366617491b5..3afe2787de576f7190d87c796bea0ab34dc30248 100644
--- a/src/main/java/org/bukkit/entity/Enderman.java
+++ b/src/main/java/org/bukkit/entity/Enderman.java
-@@ -11,6 +11,17 @@ import org.jetbrains.annotations.Nullable;
+@@ -10,6 +10,17 @@ import org.jetbrains.annotations.Nullable;
*/
public interface Enderman extends Monster {
diff --git a/patches/api/0099-Additional-world.getNearbyEntities-API-s.patch b/patches/api/0099-Additional-world.getNearbyEntities-API-s.patch
index 41ef5f3eb305..631c04c408b6 100644
--- a/patches/api/0099-Additional-world.getNearbyEntities-API-s.patch
+++ b/patches/api/0099-Additional-world.getNearbyEntities-API-s.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Additional world.getNearbyEntities API's
Provides more methods to get nearby entities, and filter by types and predicates
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index faedd3857023513340b6e9fc67b78c79e3989cbe..58a15d8fd57d55848b37bfc8fffa101692efce87 100644
+index 6decacdf85827305dbee9d34dadef4bc7c69e20a..fa4081c62f86245fef5a273f01837f9ac6998faa 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
@@ -1,6 +1,9 @@
@@ -19,7 +19,7 @@ index faedd3857023513340b6e9fc67b78c79e3989cbe..58a15d8fd57d55848b37bfc8fffa1016
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
-@@ -625,6 +628,238 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -627,6 +630,238 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public Collection getEntitiesByClasses(@NotNull Class>... classes);
diff --git a/patches/api/0101-Expand-World.spawnParticle-API-and-add-Builder.patch b/patches/api/0101-Expand-World.spawnParticle-API-and-add-Builder.patch
index 4709adf7e93e..a491dad5b07d 100644
--- a/patches/api/0101-Expand-World.spawnParticle-API-and-add-Builder.patch
+++ b/patches/api/0101-Expand-World.spawnParticle-API-and-add-Builder.patch
@@ -523,10 +523,10 @@ index ca6d0eaa9d9a37c07f3e1630b83a79bf98211edb..26d02aa5da444112f8fa84c07e3080bb
* Options which can be applied to redstone dust particles - a particle
* color and size.
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 27b6825a04e7857e7924ba32f9cc43e960edd238..89d948229eee47c90d078ffa26b019bfe24a8115 100644
+index fa4081c62f86245fef5a273f01837f9ac6998faa..fa31ba9d30cd0d1b23e15667c4c9bd9c13b5b9d3 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -2855,7 +2855,57 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2896,7 +2896,57 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
* @param data the data to use for the particle or null,
* the type of this depends on {@link Particle#getDataType()}
*/
diff --git a/patches/api/0114-Add-EntityKnockbackByEntityEvent-and-EntityPushedByE.patch b/patches/api/0114-Add-EntityKnockbackByEntityEvent-and-EntityPushedByE.patch
index e66a38f9c9b0..d6d986c4503b 100644
--- a/patches/api/0114-Add-EntityKnockbackByEntityEvent-and-EntityPushedByE.patch
+++ b/patches/api/0114-Add-EntityKnockbackByEntityEvent-and-EntityPushedByE.patch
@@ -62,10 +62,10 @@ index 0000000000000000000000000000000000000000..e0ba692c9b107f2b042a9c06549185e1
+}
diff --git a/src/main/java/io/papermc/paper/event/entity/EntityPushedByEntityAttackEvent.java b/src/main/java/io/papermc/paper/event/entity/EntityPushedByEntityAttackEvent.java
new file mode 100644
-index 0000000000000000000000000000000000000000..70d6e72d4dc0c040c8bccf7acc383e84db472514
+index 0000000000000000000000000000000000000000..404bec776244fd776566c81f671f1009830c6d6e
--- /dev/null
+++ b/src/main/java/io/papermc/paper/event/entity/EntityPushedByEntityAttackEvent.java
-@@ -0,0 +1,74 @@
+@@ -0,0 +1,82 @@
+package io.papermc.paper.event.entity;
+
+import org.bukkit.entity.Entity;
@@ -88,8 +88,7 @@ index 0000000000000000000000000000000000000000..70d6e72d4dc0c040c8bccf7acc383e84
+ private static final HandlerList HANDLER_LIST = new HandlerList();
+
+ private final @NotNull Entity pushedBy;
-+ private final @NotNull Vector acceleration;
-+
++ private @NotNull Vector acceleration;
+ private boolean cancelled;
+
+ @ApiStatus.Internal
@@ -116,7 +115,16 @@ index 0000000000000000000000000000000000000000..70d6e72d4dc0c040c8bccf7acc383e84
+ */
+ @NotNull
+ public Vector getAcceleration() {
-+ return this.acceleration;
++ return this.acceleration; // TODO Clone in 1.21 to not instantly break what was technically already modifiable
++ }
++
++ /**
++ * Sets the relative acceleration that will be applied to the affected entity.
++ *
++ * @param acceleration the new acceleration vector
++ */
++ public void setAcceleration(final @NotNull Vector acceleration) {
++ this.acceleration = acceleration.clone();
+ }
+
+ @Override
@@ -140,3 +148,33 @@ index 0000000000000000000000000000000000000000..70d6e72d4dc0c040c8bccf7acc383e84
+ return HANDLER_LIST;
+ }
+}
+diff --git a/src/main/java/org/bukkit/event/entity/EntityKnockbackByEntityEvent.java b/src/main/java/org/bukkit/event/entity/EntityKnockbackByEntityEvent.java
+index 3f17290c0863cc1d452bb50c524c18b6ab255d70..bd44bc5ed9e20148f9b2ab3d2049187280f3eb18 100644
+--- a/src/main/java/org/bukkit/event/entity/EntityKnockbackByEntityEvent.java
++++ b/src/main/java/org/bukkit/event/entity/EntityKnockbackByEntityEvent.java
+@@ -7,7 +7,10 @@ import org.jetbrains.annotations.NotNull;
+
+ /**
+ * Called when an entity receives knockback from another entity.
++ *
++ * @deprecated use {@link com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent}
+ */
++@Deprecated(forRemoval = true) // Paper
+ public class EntityKnockbackByEntityEvent extends EntityKnockbackEvent {
+
+ private final Entity source;
+diff --git a/src/main/java/org/bukkit/event/entity/EntityKnockbackEvent.java b/src/main/java/org/bukkit/event/entity/EntityKnockbackEvent.java
+index 9355efbbd4625e34d6c9d26bcbd02272202dec79..fe3374fbbfef728358e4a15bbf2deb238a1e0bfd 100644
+--- a/src/main/java/org/bukkit/event/entity/EntityKnockbackEvent.java
++++ b/src/main/java/org/bukkit/event/entity/EntityKnockbackEvent.java
+@@ -11,7 +11,10 @@ import org.jetbrains.annotations.NotNull;
+
+ /**
+ * Called when a living entity receives knockback.
++ *
++ * @deprecated use {@link com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent} or {@link io.papermc.paper.event.entity.EntityPushedByEntityAttackEvent}
+ */
++@Deprecated(forRemoval = true) // Paper
+ public class EntityKnockbackEvent extends EntityEvent implements Cancellable {
+
+ private static final HandlerList handlers = new HandlerList();
diff --git a/patches/api/0115-Expand-Explosions-API.patch b/patches/api/0115-Expand-Explosions-API.patch
index 3be51b350ef8..c74930f1a29d 100644
--- a/patches/api/0115-Expand-Explosions-API.patch
+++ b/patches/api/0115-Expand-Explosions-API.patch
@@ -108,10 +108,10 @@ index 3161eae2fa5f03b7d3a5e9945ab659c15cf568c6..af737017ee397f80c44ee02c6cc60cef
/**
* Returns a list of entities within a bounding box centered around a Location.
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 93c46d40efd73293d84c7eaadf4e360cc3706e2a..cd946f2de8a09fdb6ff9b256ca7eba64e6ed9aab 100644
+index fa31ba9d30cd0d1b23e15667c4c9bd9c13b5b9d3..ab0f76c74205f2fe1faf9aecc57ac3fb57431b06 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -1380,6 +1380,88 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -1382,6 +1382,88 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
*/
public boolean createExplosion(@NotNull Location loc, float power, boolean setFire);
diff --git a/patches/api/0119-Add-World.getEntity-UUID-API.patch b/patches/api/0119-Add-World.getEntity-UUID-API.patch
index fbf6d332454b..f1e054d2acbd 100644
--- a/patches/api/0119-Add-World.getEntity-UUID-API.patch
+++ b/patches/api/0119-Add-World.getEntity-UUID-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add World.getEntity(UUID) API
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index cd946f2de8a09fdb6ff9b256ca7eba64e6ed9aab..7ebe35096db30854443932add9d1f737f328ec92 100644
+index ab0f76c74205f2fe1faf9aecc57ac3fb57431b06..ad7e2b624d5929beee5268151bda3abe9dfbb786 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -894,6 +894,17 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -896,6 +896,17 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public Collection getNearbyEntities(@NotNull Location location, double x, double y, double z);
diff --git a/patches/api/0122-Entity-getChunk-API.patch b/patches/api/0122-Entity-getChunk-API.patch
index 55dee522c44c..069bb8834ea8 100644
--- a/patches/api/0122-Entity-getChunk-API.patch
+++ b/patches/api/0122-Entity-getChunk-API.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Entity#getChunk API
Get the chunk the entity is currently registered to
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 754097d9858b3a74f73c6ca483c2577c837f9f3a..40affe35704aa1a5e5a6f3661be966391c423ad2 100644
+index 28e2d003db578e7c0468c0d443fda3a40e2a0efa..77a706dde5995a8a6306b1d0a144dd37d580dea3 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -3,6 +3,7 @@ package org.bukkit.entity;
@@ -17,7 +17,7 @@ index 754097d9858b3a74f73c6ca483c2577c837f9f3a..40affe35704aa1a5e5a6f3661be96639
import org.bukkit.EntityEffect;
import org.bukkit.Location;
import org.bukkit.Nameable;
-@@ -800,5 +801,16 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -795,5 +796,16 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
* @return True if entity spawned from a mob spawner
*/
boolean fromMobSpawner();
diff --git a/patches/api/0133-Provide-Chunk-Coordinates-as-a-Long-API.patch b/patches/api/0133-Provide-Chunk-Coordinates-as-a-Long-API.patch
index eb07065fa40a..55e2525efcc6 100644
--- a/patches/api/0133-Provide-Chunk-Coordinates-as-a-Long-API.patch
+++ b/patches/api/0133-Provide-Chunk-Coordinates-as-a-Long-API.patch
@@ -7,10 +7,10 @@ Allows you to easily access the chunks X/z as a long, and a method
to look up by the long key too.
diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chunk.java
-index efbfed855248cff8b4bdbfc181d3e82058df4749..766d643f0fe79660942fdad25e39e488e9379419 100644
+index a25f112f4d679946ddcb5ec9b4d0a0e2d1795bd3..57976bbe682d2309f7d15d5dcd3ad7f8049429ec 100644
--- a/src/main/java/org/bukkit/Chunk.java
+++ b/src/main/java/org/bukkit/Chunk.java
-@@ -33,6 +33,32 @@ public interface Chunk extends PersistentDataHolder {
+@@ -35,6 +35,32 @@ public interface Chunk extends PersistentDataHolder {
*/
int getZ();
@@ -44,10 +44,10 @@ index efbfed855248cff8b4bdbfc181d3e82058df4749..766d643f0fe79660942fdad25e39e488
* Gets the world containing this chunk
*
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 7ebe35096db30854443932add9d1f737f328ec92..be0e1ad34c526f2bd7b80f035c79b07e3b3ef5fb 100644
+index ad7e2b624d5929beee5268151bda3abe9dfbb786..9c22650c299ab063a7e558408ce6c203c79d11fd 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -180,6 +180,37 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -182,6 +182,37 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public Chunk getChunkAt(@NotNull Block block);
diff --git a/patches/api/0134-Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch b/patches/api/0134-Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch
index c6a30483777b..1ec0eed80554 100644
--- a/patches/api/0134-Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch
+++ b/patches/api/0134-Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Ability to get Tile Entities from a chunk without snapshots
diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chunk.java
-index 766d643f0fe79660942fdad25e39e488e9379419..eca55d8d3464f0e13a3b7984f74559ccda87edba 100644
+index 57976bbe682d2309f7d15d5dcd3ad7f8049429ec..546888898d9d6827079fe041c7bc6eb4e1e4605c 100644
--- a/src/main/java/org/bukkit/Chunk.java
+++ b/src/main/java/org/bukkit/Chunk.java
-@@ -122,7 +122,30 @@ public interface Chunk extends PersistentDataHolder {
+@@ -124,7 +124,30 @@ public interface Chunk extends PersistentDataHolder {
* @return The tile entities.
*/
@NotNull
diff --git a/patches/api/0136-Allow-Blocks-to-be-accessed-via-a-long-key.patch b/patches/api/0136-Allow-Blocks-to-be-accessed-via-a-long-key.patch
index c58b8692c94e..fa5588a81f82 100644
--- a/patches/api/0136-Allow-Blocks-to-be-accessed-via-a-long-key.patch
+++ b/patches/api/0136-Allow-Blocks-to-be-accessed-via-a-long-key.patch
@@ -50,10 +50,10 @@ index 41125de49db8eafce4be59cc110ce5be06836a47..042d69e6d4584eb6d678b8ea13a3e4be
* @return A new location where X/Y/Z are the center of the block
*/
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index f15e1a6a43c0353ac4834f74fffb9adc2049dfcb..d5ebfdefe015e5509f0ecf53accfee2afbd4aadd 100644
+index 9c22650c299ab063a7e558408ce6c203c79d11fd..036a8ddc82a82800275d654d3fc00a9d30215350 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -97,6 +97,41 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -99,6 +99,41 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public Block getBlockAt(@NotNull Location location);
@@ -96,7 +96,7 @@ index f15e1a6a43c0353ac4834f74fffb9adc2049dfcb..d5ebfdefe015e5509f0ecf53accfee2a
* Gets the highest non-empty (impassable) block at the given coordinates.
*
diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java
-index 9f4d383ea3d6b26d16b8b77ca4c29d2d839ad6dd..f3a18e337a579b602b1289bccdf454334a663fcf 100644
+index f3b3606dc5881e931853fc2631aad9ca9083474d..a71001677e2b1b0b6225a7be63b8ea5ce4456862 100644
--- a/src/main/java/org/bukkit/block/Block.java
+++ b/src/main/java/org/bukkit/block/Block.java
@@ -156,6 +156,82 @@ public interface Block extends Metadatable, Translatable {
diff --git a/patches/api/0141-isChunkGenerated-API.patch b/patches/api/0141-isChunkGenerated-API.patch
index c8e246532b95..642a714f6492 100644
--- a/patches/api/0141-isChunkGenerated-API.patch
+++ b/patches/api/0141-isChunkGenerated-API.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] isChunkGenerated API
diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java
-index 34eeed3ec165bee9d9172ea636b1cc2d7d05f938..0b202d378d50946f43434e70d9d511cac06749b0 100644
+index 042d69e6d4584eb6d678b8ea13a3e4bea78703b8..02b4ffa6b918269bd64f7c518fcceef1f6990737 100644
--- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java
@@ -3,6 +3,7 @@ package org.bukkit;
@@ -37,10 +37,10 @@ index 34eeed3ec165bee9d9172ea636b1cc2d7d05f938..0b202d378d50946f43434e70d9d511ca
/**
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 55c0ad31ae8f1831c43404abb7e2e62da63885ce..07f723d5fb72e2eb776af130dc1d5caea16c5295 100644
+index 036a8ddc82a82800275d654d3fc00a9d30215350..25ff747e23e7373bb96ca9109df7e46cdefdcd2e 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -246,6 +246,19 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -248,6 +248,19 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
}
// Paper end - chunk long key API
diff --git a/patches/api/0143-Async-Chunks-API.patch b/patches/api/0143-Async-Chunks-API.patch
index a04a93a06c55..2473d4c47f9f 100644
--- a/patches/api/0143-Async-Chunks-API.patch
+++ b/patches/api/0143-Async-Chunks-API.patch
@@ -8,10 +8,10 @@ Adds API's to load or generate chunks asynchronously.
Also adds utility methods to Entity to teleport asynchronously.
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 07f723d5fb72e2eb776af130dc1d5caea16c5295..99a31572fa393a2482548ec55a96cb8568d07199 100644
+index 25ff747e23e7373bb96ca9109df7e46cdefdcd2e..116bad653e92efbfd576f3b146c0a9e40afbbe10 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -939,6 +939,472 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -941,6 +941,472 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
}
// Paper end - additional getNearbyEntities API
@@ -485,7 +485,7 @@ index 07f723d5fb72e2eb776af130dc1d5caea16c5295..99a31572fa393a2482548ec55a96cb85
* Get a list of all players in this World
*
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 40affe35704aa1a5e5a6f3661be966391c423ad2..bdc547298fd29fe55016a17ff1be0d51619c0e2d 100644
+index 77a706dde5995a8a6306b1d0a144dd37d580dea3..14e42959033919ff6409e48ddf01c0f15c28eb10 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -168,6 +168,33 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
diff --git a/patches/api/0145-Expose-attack-cooldown-methods-for-Player.patch b/patches/api/0145-Expose-attack-cooldown-methods-for-Player.patch
index 6c649269e814..7b7377559d10 100644
--- a/patches/api/0145-Expose-attack-cooldown-methods-for-Player.patch
+++ b/patches/api/0145-Expose-attack-cooldown-methods-for-Player.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expose attack cooldown methods for Player
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 62707884e012badec14f74665f32058812bbc46e..76f70e0db9409aa731d79e2c7b16d39b4c2dfc4c 100644
+index 07dde016220eef654901e3d78e2d37fb4ee4a128..7fe44fd8a1e93551365ea434e750f7dece9088de 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3127,6 +3127,28 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3195,6 +3195,28 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void setPlayerProfile(com.destroystokyo.paper.profile.@NotNull PlayerProfile profile);
// Paper end - Player Profile API
diff --git a/patches/api/0147-Add-Git-information-to-version-command-on-startup.patch b/patches/api/0147-Add-Git-information-to-version-command-on-startup.patch
index 9d6dcb06b43e..847ce11745af 100644
--- a/patches/api/0147-Add-Git-information-to-version-command-on-startup.patch
+++ b/patches/api/0147-Add-Git-information-to-version-command-on-startup.patch
@@ -48,10 +48,10 @@ index 0000000000000000000000000000000000000000..909617079db61b675cc7b60b44ef96b3
+ }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 9f52c092d906622e2eade3bc9d8baac6816f9f3a..869d57b429fbe2694d1444db56c56619abfae920 100644
+index 4f9ebcd991875d0bf486a8ebb39909f2ac32493b..c61096f724ea6a1ae7bc8990e9eaa44a16f5847e 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -57,6 +57,7 @@ import org.bukkit.util.CachedServerIcon;
+@@ -58,6 +58,7 @@ import org.bukkit.util.CachedServerIcon;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -59,7 +59,7 @@ index 9f52c092d906622e2eade3bc9d8baac6816f9f3a..869d57b429fbe2694d1444db56c56619
/**
* Represents the Bukkit core, for version and Server singleton handling
-@@ -106,7 +107,25 @@ public final class Bukkit {
+@@ -107,7 +108,25 @@ public final class Bukkit {
}
Bukkit.server = server;
diff --git a/patches/api/0157-Add-sun-related-API.patch b/patches/api/0157-Add-sun-related-API.patch
index 540087547e6f..df9c9b7818ec 100644
--- a/patches/api/0157-Add-sun-related-API.patch
+++ b/patches/api/0157-Add-sun-related-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add sun related API
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 99a31572fa393a2482548ec55a96cb8568d07199..561cfe701d76fa0c85cea4a76affa7e90de82da0 100644
+index 116bad653e92efbfd576f3b146c0a9e40afbbe10..bc0f09b2d555682d0bf7937e9aa6c97258e66635 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -1760,6 +1760,16 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -1762,6 +1762,16 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
*/
public void setFullTime(long time);
diff --git a/patches/api/0161-Make-the-default-permission-message-configurable.patch b/patches/api/0161-Make-the-default-permission-message-configurable.patch
index 67be23ffad70..cad7e3c31056 100644
--- a/patches/api/0161-Make-the-default-permission-message-configurable.patch
+++ b/patches/api/0161-Make-the-default-permission-message-configurable.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Make the default permission message configurable
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 378a457dee428238eb2c4827e9c1d2cc57d0f544..a06e6f51606612f5b9a69ce2d46be84231c08177 100644
+index c61096f724ea6a1ae7bc8990e9eaa44a16f5847e..ac84e6d10a337f767477177ef90ad10d754341e6 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2354,6 +2354,28 @@ public final class Bukkit {
+@@ -2374,6 +2374,28 @@ public final class Bukkit {
return server.suggestPlayerNamesWhenNullTabCompletions();
}
@@ -38,10 +38,10 @@ index 378a457dee428238eb2c4827e9c1d2cc57d0f544..a06e6f51606612f5b9a69ce2d46be842
* Creates a PlayerProfile for the specified uuid, with name as null.
*
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 4c16d026c6850f38295e71f4f4299e81f3e4c856..904502029842e8c3be700be33b156f11db4724af 100644
+index 7c53979f407a6a24c6d16bbfb205a8ac0321e5dc..050cdd5147814b39d158f0ce0fa8f5aa20894cf7 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2051,6 +2051,23 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2067,6 +2067,23 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
boolean suggestPlayerNamesWhenNullTabCompletions();
diff --git a/patches/api/0172-Entity-getEntitySpawnReason.patch b/patches/api/0172-Entity-getEntitySpawnReason.patch
index aa296072be57..a00834444c28 100644
--- a/patches/api/0172-Entity-getEntitySpawnReason.patch
+++ b/patches/api/0172-Entity-getEntitySpawnReason.patch
@@ -12,10 +12,10 @@ or DEFAULT since data was not stored.
Co-authored-by: Aurora
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index bdc547298fd29fe55016a17ff1be0d51619c0e2d..3117bf9d61b507175cfb673095763a5d6bc802ba 100644
+index 14e42959033919ff6409e48ddf01c0f15c28eb10..469e85c3cb371842a78b32f8da97fe9c71bf409b 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -839,5 +839,11 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -834,5 +834,11 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
// TODO remove impl here
return getLocation().getChunk();
}
diff --git a/patches/api/0173-Fix-Spigot-annotation-mistakes.patch b/patches/api/0173-Fix-Spigot-annotation-mistakes.patch
index b62df72e9d4e..837422c19fc7 100644
--- a/patches/api/0173-Fix-Spigot-annotation-mistakes.patch
+++ b/patches/api/0173-Fix-Spigot-annotation-mistakes.patch
@@ -40,10 +40,10 @@ index ac420f0059fc50d3e1294f85df7515c9e17ff78f..24daba85ce4129fb0babe67570059ca8
public static Art getById(int id) {
return BY_ID.get(id);
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index a06e6f51606612f5b9a69ce2d46be84231c08177..3e072efdb4f552a0d010fe4c8efe523f59cdccd0 100644
+index ac84e6d10a337f767477177ef90ad10d754341e6..567a0cda774ce2e28e1466c0c6b1e07b931b4008 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -848,9 +848,8 @@ public final class Bukkit {
+@@ -868,9 +868,8 @@ public final class Bukkit {
*
* @param id the id of the map to get
* @return a map view if it exists, or null otherwise
@@ -54,7 +54,7 @@ index a06e6f51606612f5b9a69ce2d46be84231c08177..3e072efdb4f552a0d010fe4c8efe523f
@Nullable
public static MapView getMap(int id) {
return server.getMap(id);
-@@ -1317,10 +1316,8 @@ public final class Bukkit {
+@@ -1337,10 +1336,8 @@ public final class Bukkit {
* @param name the name the player to retrieve
* @return an offline player
* @see #getOfflinePlayer(java.util.UUID)
@@ -66,7 +66,7 @@ index a06e6f51606612f5b9a69ce2d46be84231c08177..3e072efdb4f552a0d010fe4c8efe523f
@NotNull
public static OfflinePlayer getOfflinePlayer(@NotNull String name) {
return server.getOfflinePlayer(name);
-@@ -1911,7 +1908,7 @@ public final class Bukkit {
+@@ -1931,7 +1928,7 @@ public final class Bukkit {
*
* @return the scoreboard manager or null if no worlds are loaded.
*/
@@ -474,15 +474,14 @@ index 26d02aa5da444112f8fa84c07e3080bb669983a1..0cb15350704955f4a1aeff184a8b60d9
private final NamespacedKey key;
diff --git a/src/main/java/org/bukkit/Registry.java b/src/main/java/org/bukkit/Registry.java
-index 6455163261082c444985bc58b188d224517d4529..613cd9c2e91a851c86e339d2be86981b57669311 100644
+index db45423936d48835dee35d01ee502cdfdce4f68a..b3f8a2611ceb57f5d0b5c300fa80d8bad121498d 100644
--- a/src/main/java/org/bukkit/Registry.java
+++ b/src/main/java/org/bukkit/Registry.java
-@@ -198,14 +198,14 @@ public interface Registry extends Iterable {
+@@ -199,14 +199,12 @@ public interface Registry extends Iterable {
*
* @see TrimMaterial
*/
- @ApiStatus.Experimental
-+ //@ApiStatus.Experimental // Paper
Registry TRIM_MATERIAL = Bukkit.getRegistry(TrimMaterial.class);
/**
* Trim patterns.
@@ -490,11 +489,10 @@ index 6455163261082c444985bc58b188d224517d4529..613cd9c2e91a851c86e339d2be86981b
* @see TrimPattern
*/
- @ApiStatus.Experimental
-+ //@ApiStatus.Experimental // Paper
Registry TRIM_PATTERN = Bukkit.getRegistry(TrimPattern.class);
/**
- * Villager profession.
-@@ -287,8 +287,11 @@ public interface Registry extends Iterable {
+ * Damage types.
+@@ -295,8 +293,11 @@ public interface Registry extends Iterable {
*
* @param input non-null input
* @return registered object or null if does not exist
@@ -521,10 +519,10 @@ index 6277451c3c6c551078c237cd767b6d70c4f585ea..10f5cfb1885833a1d2c1027c03974da4
CRACKED(0x0),
GLYPHED(0x1),
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 904502029842e8c3be700be33b156f11db4724af..b9c7ff1dcbc09980faf26ce3319f7ee09bafc6df 100644
+index 050cdd5147814b39d158f0ce0fa8f5aa20894cf7..e5844d4a9808984fa21049401ed117102a1c4db8 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -712,9 +712,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -728,9 +728,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*
* @param id the id of the map to get
* @return a map view if it exists, or null otherwise
@@ -535,7 +533,7 @@ index 904502029842e8c3be700be33b156f11db4724af..b9c7ff1dcbc09980faf26ce3319f7ee0
@Nullable
public MapView getMap(int id);
-@@ -1111,10 +1110,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1127,10 +1126,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @param name the name the player to retrieve
* @return an offline player
* @see #getOfflinePlayer(java.util.UUID)
@@ -547,7 +545,7 @@ index 904502029842e8c3be700be33b156f11db4724af..b9c7ff1dcbc09980faf26ce3319f7ee0
@NotNull
public OfflinePlayer getOfflinePlayer(@NotNull String name);
-@@ -1614,7 +1611,7 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1630,7 +1627,7 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*
* @return the scoreboard manager or null if no worlds are loaded.
*/
@@ -600,10 +598,10 @@ index e455eb21abf121dc6ff10ff8a13dd06f67096a8f..bbc01e7c192ae6689c301670047ff114
return origin;
}
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 985dcea9ebed2fc5a3bfb8581cbd0ee4bf89ee8f..08eb8744104f1bbbd4f96972e0fb68f1aa4049f5 100644
+index bc0f09b2d555682d0bf7937e9aa6c97258e66635..bc5dd4182c5dd0a0d576410a68c445e3d006ae18 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -416,9 +416,8 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -418,9 +418,8 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
* @param z Z-coordinate of the chunk
* @return Whether the chunk was actually refreshed
*
@@ -614,7 +612,7 @@ index 985dcea9ebed2fc5a3bfb8581cbd0ee4bf89ee8f..08eb8744104f1bbbd4f96972e0fb68f1
public boolean refreshChunk(int x, int z);
/**
-@@ -3704,6 +3703,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -3745,6 +3744,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
StructureSearchResult locateNearestStructure(@NotNull Location origin, @NotNull Structure structure, int radius, boolean findUnexplored);
// Spigot start
@@ -622,7 +620,7 @@ index 985dcea9ebed2fc5a3bfb8581cbd0ee4bf89ee8f..08eb8744104f1bbbd4f96972e0fb68f1
public class Spigot {
/**
-@@ -3737,7 +3737,11 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -3778,7 +3778,11 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
}
}
@@ -634,7 +632,7 @@ index 985dcea9ebed2fc5a3bfb8581cbd0ee4bf89ee8f..08eb8744104f1bbbd4f96972e0fb68f1
Spigot spigot();
// Spigot end
-@@ -3928,9 +3932,9 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -3996,9 +4000,9 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
* Gets the dimension ID of this environment
*
* @return dimension ID
@@ -646,7 +644,7 @@ index 985dcea9ebed2fc5a3bfb8581cbd0ee4bf89ee8f..08eb8744104f1bbbd4f96972e0fb68f1
public int getId() {
return id;
}
-@@ -3940,9 +3944,9 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -4008,9 +4012,9 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
*
* @param id The ID of the environment
* @return The environment
@@ -738,10 +736,10 @@ index b90f5dc345ad2cdd3ae353dc57f42a14c231d18a..a7b915ded9154d53ac8ca599119c1699
public static PistonMoveReaction getById(int id) {
return byId.get(id);
diff --git a/src/main/java/org/bukkit/entity/Enderman.java b/src/main/java/org/bukkit/entity/Enderman.java
-index 605af1a9fc48602643aec57dd14e8c4ab657a0bc..b3085c7ff8b3e96083d209f6612c006578773c24 100644
+index 3afe2787de576f7190d87c796bea0ab34dc30248..58191017244f3949f6174fb108e3a245738a53c4 100644
--- a/src/main/java/org/bukkit/entity/Enderman.java
+++ b/src/main/java/org/bukkit/entity/Enderman.java
-@@ -26,15 +26,19 @@ public interface Enderman extends Monster {
+@@ -25,15 +25,19 @@ public interface Enderman extends Monster {
* Gets the id and data of the block that the Enderman is carrying.
*
* @return MaterialData containing the id and data of the block
@@ -820,7 +818,7 @@ index f124b35ec76e6cb6a1a0dc464005087043c3efd0..f50aaddf8582be55fd4860ad374d8f22
+@Deprecated(forRemoval = true) // Paper
public interface LingeringPotion extends ThrownPotion { }
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
-index 4605153a2a8aa7b7cd0eed772c15f02f18707ec3..c58f7b4a7c05e35056a478a818a9a6cdfe99203f 100644
+index b2f66f80c90b9d716f43f94166ca015bdfd3173e..030d3b1b1fee0906d6a0fb2a47031b8a94caaf89 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -684,7 +684,9 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
@@ -859,10 +857,10 @@ index 95c79c5fa0c4e30201f887da6467ce5f81c8a255..7f9c4d4b430a3f0276461346ff2621ba
/**
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 76f70e0db9409aa731d79e2c7b16d39b4c2dfc4c..ae324d684fa1fe256ae2b2c50bd0566ad0a27110 100644
+index 7fe44fd8a1e93551365ea434e750f7dece9088de..2778f72af5de5cd339a8648c5631ff94d5ee1352 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1539,11 +1539,8 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1567,11 +1567,8 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
/**
* Forces an update of the player's entire inventory.
@@ -1572,19 +1570,6 @@ index 597a18a767b68b47e81454b7d44613c7178c1366..bc3440eb72127824b3961fbdae583bb6
@NotNull
public ItemStack getInput() {
return this.ingredient.getItemStack();
-diff --git a/src/main/java/org/bukkit/inventory/meta/ColorableArmorMeta.java b/src/main/java/org/bukkit/inventory/meta/ColorableArmorMeta.java
-index 5ccae862dbac393805a47fe26c18a2f33f1e140d..72281899817c5c140cdca2afff75fbcebd942532 100644
---- a/src/main/java/org/bukkit/inventory/meta/ColorableArmorMeta.java
-+++ b/src/main/java/org/bukkit/inventory/meta/ColorableArmorMeta.java
-@@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull;
- /**
- * Represents armor that an entity can equip and can also be colored.
- */
--@ApiStatus.Experimental
-+//@ApiStatus.Experimental // Paper
- public interface ColorableArmorMeta extends ArmorMeta, LeatherArmorMeta {
-
- @Override
diff --git a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java b/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
index f800e776329c1b42f834cb30ebf2d0ace195d1a2..f23c0c942f200a68d2620f225ab90399a9057dfc 100644
--- a/src/main/java/org/bukkit/inventory/meta/ItemMeta.java
diff --git a/patches/api/0176-Add-Heightmap-API.patch b/patches/api/0176-Add-Heightmap-API.patch
index bede72444539..848d5fcfcbbf 100644
--- a/patches/api/0176-Add-Heightmap-API.patch
+++ b/patches/api/0176-Add-Heightmap-API.patch
@@ -51,7 +51,7 @@ index 0000000000000000000000000000000000000000..1c832d69bb3717dcfccf21e45f6f060a
+ SOLID_OR_LIQUID_NO_LEAVES;
+}
diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java
-index cf42f6e57e96aa9cb4465e34a6e3f8709de4ca09..9bbd928f7d513ca317cd27beffa61e5111f5ffb0 100644
+index f0878c7539696cc0676e6010e88914d3850acf20..c6049747fc286acb4e8053901fcc517e5170afa2 100644
--- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java
@@ -649,6 +649,46 @@ public class Location implements Cloneable, ConfigurationSerializable, io.paperm
@@ -102,10 +102,10 @@ index cf42f6e57e96aa9cb4465e34a6e3f8709de4ca09..9bbd928f7d513ca317cd27beffa61e51
/**
* Creates explosion at this location with given power
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 8a200ffe1851b24110c92bb3a9f7ffc39b8c63f2..dd498e3ba46bd001028f7f9f94e18de42e875ff6 100644
+index bc5dd4182c5dd0a0d576410a68c445e3d006ae18..24ce9966140730c581c0709b14280e62a58331fa 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -151,6 +151,87 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -153,6 +153,87 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public Block getHighestBlockAt(@NotNull Location location);
diff --git a/patches/api/0181-Expose-the-internal-current-tick.patch b/patches/api/0181-Expose-the-internal-current-tick.patch
index cab5b202d723..9a0fe90fb69f 100644
--- a/patches/api/0181-Expose-the-internal-current-tick.patch
+++ b/patches/api/0181-Expose-the-internal-current-tick.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expose the internal current tick
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 3e072efdb4f552a0d010fe4c8efe523f59cdccd0..bff6eb5114e44bf04eb793ad78752dabee471543 100644
+index 567a0cda774ce2e28e1466c0c6b1e07b931b4008..80144dc81249f7198bee5e6281362fd704e006d4 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2449,6 +2449,10 @@ public final class Bukkit {
+@@ -2469,6 +2469,10 @@ public final class Bukkit {
public static com.destroystokyo.paper.profile.PlayerProfile createProfileExact(@Nullable UUID uuid, @Nullable String name) {
return server.createProfileExact(uuid, name);
}
@@ -20,10 +20,10 @@ index 3e072efdb4f552a0d010fe4c8efe523f59cdccd0..bff6eb5114e44bf04eb793ad78752dab
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index b9c7ff1dcbc09980faf26ce3319f7ee09bafc6df..9cb3ab0ecfdab51e8dd1c397eb58bcdcde7a6a1a 100644
+index e5844d4a9808984fa21049401ed117102a1c4db8..031fd20bb361fb9befe62ec8006f42156bfe2747 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2133,5 +2133,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2149,5 +2149,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
@NotNull
com.destroystokyo.paper.profile.PlayerProfile createProfileExact(@Nullable UUID uuid, @Nullable String name);
diff --git a/patches/api/0187-Add-tick-times-API.patch b/patches/api/0187-Add-tick-times-API.patch
index 6bc3b548d340..c2d69a38e701 100644
--- a/patches/api/0187-Add-tick-times-API.patch
+++ b/patches/api/0187-Add-tick-times-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add tick times API
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index bff6eb5114e44bf04eb793ad78752dabee471543..36af91308b498b72639bef62aaf82a1ea26ec91c 100644
+index 80144dc81249f7198bee5e6281362fd704e006d4..a839e8684de0c915f8b7edfe5e87978d774f7bde 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2121,6 +2121,25 @@ public final class Bukkit {
+@@ -2141,6 +2141,25 @@ public final class Bukkit {
public static double[] getTPS() {
return server.getTPS();
}
@@ -35,10 +35,10 @@ index bff6eb5114e44bf04eb793ad78752dabee471543..36af91308b498b72639bef62aaf82a1e
/**
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 9cb3ab0ecfdab51e8dd1c397eb58bcdcde7a6a1a..037fab9568abda1ae2a54d3759ba74ec4fc09ff9 100644
+index 031fd20bb361fb9befe62ec8006f42156bfe2747..496e769cb77d856b4a0b4dc63ac466fdf6cbd3f9 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1795,6 +1795,21 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1811,6 +1811,21 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
@NotNull
public double[] getTPS();
diff --git a/patches/api/0188-Expose-MinecraftServer-isRunning.patch b/patches/api/0188-Expose-MinecraftServer-isRunning.patch
index 2297138cfa97..641ee5ac5445 100644
--- a/patches/api/0188-Expose-MinecraftServer-isRunning.patch
+++ b/patches/api/0188-Expose-MinecraftServer-isRunning.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Expose MinecraftServer#isRunning
This allows for plugins to detect if the server is actually turning off in onDisable rather than just plugins reloading.
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 36af91308b498b72639bef62aaf82a1ea26ec91c..27e62bd04426295e23134e2e601550a995ea7059 100644
+index a839e8684de0c915f8b7edfe5e87978d774f7bde..00320a15e4edbcbab182b4064b05d3a19dc441ce 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2472,6 +2472,15 @@ public final class Bukkit {
+@@ -2492,6 +2492,15 @@ public final class Bukkit {
public static int getCurrentTick() {
return server.getCurrentTick();
}
@@ -26,10 +26,10 @@ index 36af91308b498b72639bef62aaf82a1ea26ec91c..27e62bd04426295e23134e2e601550a9
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 037fab9568abda1ae2a54d3759ba74ec4fc09ff9..7a292b24d90b36278321200e13fa12d7d46225da 100644
+index 496e769cb77d856b4a0b4dc63ac466fdf6cbd3f9..d606b1d1ac37a13607c893e14ad88b26d1296ab0 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2155,5 +2155,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2171,5 +2171,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @return Current tick
*/
int getCurrentTick();
diff --git a/patches/api/0189-Add-Raw-Byte-ItemStack-Serialization.patch b/patches/api/0189-Add-Raw-Byte-ItemStack-Serialization.patch
index 3a9050cf8819..ac702b7e9021 100644
--- a/patches/api/0189-Add-Raw-Byte-ItemStack-Serialization.patch
+++ b/patches/api/0189-Add-Raw-Byte-ItemStack-Serialization.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Add Raw Byte ItemStack Serialization
Serializes using NBT which is safer for server data migrations than bukkits format.
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 4604392831d19a789e4906cf1a5f0197105fd6f2..f063016f8a88dbff480ac3b4b3ef05c16a8e515a 100644
+index 688fccdbc5cf831008ef2f27db9d15b0921a7561..e4861a8be534bfeae0385f0197261fa6ec1e7bc0 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -134,5 +134,9 @@ public interface UnsafeValues {
+@@ -151,5 +151,9 @@ public interface UnsafeValues {
default com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {
return new com.destroystokyo.paper.util.VersionFetcher.DummyVersionFetcher();
}
diff --git a/patches/api/0190-Add-Player-Client-Options-API.patch b/patches/api/0190-Add-Player-Client-Options-API.patch
index 4048aa206a88..f43e60785024 100644
--- a/patches/api/0190-Add-Player-Client-Options-API.patch
+++ b/patches/api/0190-Add-Player-Client-Options-API.patch
@@ -231,10 +231,10 @@ index 0000000000000000000000000000000000000000..1757055d821d9ec7c728aa6c1b52fa6a
+ }
+}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index ae324d684fa1fe256ae2b2c50bd0566ad0a27110..f36dc68a71e9799a638693ae5615743f94a85d40 100644
+index 2778f72af5de5cd339a8648c5631ff94d5ee1352..06872dcef2d7f158ca3f25fb69b56511a0a1a90e 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3146,6 +3146,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3214,6 +3214,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void resetCooldown();
// Paper end - attack cooldown API
diff --git a/patches/api/0195-Expose-game-version.patch b/patches/api/0195-Expose-game-version.patch
index 9d1750b3aaae..5cd19ffff949 100644
--- a/patches/api/0195-Expose-game-version.patch
+++ b/patches/api/0195-Expose-game-version.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expose game version
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 4e8383432a3a8a07dbc31f77986b0f4790779f7d..29cf7359334144d6e718fed560771be35f580b16 100644
+index 00320a15e4edbcbab182b4064b05d3a19dc441ce..ed65e84868f6b3b9272c8266244d7ab3725a7699 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -158,6 +158,18 @@ public final class Bukkit {
+@@ -159,6 +159,18 @@ public final class Bukkit {
return server.getBukkitVersion();
}
@@ -28,10 +28,10 @@ index 4e8383432a3a8a07dbc31f77986b0f4790779f7d..29cf7359334144d6e718fed560771be3
* Gets a view of all currently logged in players. This {@linkplain
* Collections#unmodifiableCollection(Collection) view} is a reused
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 37caeff1416cf0e3c63260ba7ad82a92e95a5399..d97200a8816dbbbce07734b5547a942f8f3f0fdc 100644
+index d606b1d1ac37a13607c893e14ad88b26d1296ab0..e87718db19c902fe385328866767e46c397b7e86 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -116,6 +116,16 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -117,6 +117,16 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
public String getBukkitVersion();
diff --git a/patches/api/0196-Add-Mob-Goal-API.patch b/patches/api/0196-Add-Mob-Goal-API.patch
index ce84f29868ed..5f64cd9ab94d 100644
--- a/patches/api/0196-Add-Mob-Goal-API.patch
+++ b/patches/api/0196-Add-Mob-Goal-API.patch
@@ -226,10 +226,10 @@ index 0000000000000000000000000000000000000000..e21f7574763dd4f13794f91bbef192ef
+ Collection> getRunningGoalsWithout(@NotNull T mob, @NotNull GoalType type);
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 29cf7359334144d6e718fed560771be35f580b16..5c508045a53d9f6efe6358648daa47c0096ad55e 100644
+index ed65e84868f6b3b9272c8266244d7ab3725a7699..946dc3c3bde31c7a02ac4733ee8c88e63d8baff8 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2493,6 +2493,16 @@ public final class Bukkit {
+@@ -2513,6 +2513,16 @@ public final class Bukkit {
public static boolean isStopping() {
return server.isStopping();
}
@@ -247,10 +247,10 @@ index 29cf7359334144d6e718fed560771be35f580b16..5c508045a53d9f6efe6358648daa47c0
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index d97200a8816dbbbce07734b5547a942f8f3f0fdc..aec7814485efb0b827ccfde92372a436d47ed2f5 100644
+index e87718db19c902fe385328866767e46c397b7e86..000713e09564c96a7d3c9ceb0371de26a11ff82e 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2172,5 +2172,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2188,5 +2188,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
* @return true if server is in the process of being shutdown
*/
boolean isStopping();
diff --git a/patches/api/0205-Add-entity-liquid-API.patch b/patches/api/0205-Add-entity-liquid-API.patch
index cefdd0dc5aef..286f7e4e5a42 100644
--- a/patches/api/0205-Add-entity-liquid-API.patch
+++ b/patches/api/0205-Add-entity-liquid-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add entity liquid API
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 3117bf9d61b507175cfb673095763a5d6bc802ba..72878285779dcfc6f365dc983f79b6e542792b89 100644
+index 469e85c3cb371842a78b32f8da97fe9c71bf409b..1e766f77e39b86b0561884a478d10cedc3d98fc2 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -845,5 +845,40 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -840,5 +840,40 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
*/
@NotNull
org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason getEntitySpawnReason();
diff --git a/patches/api/0208-Brand-support.patch b/patches/api/0208-Brand-support.patch
index c56833b9dff4..393665178f1f 100644
--- a/patches/api/0208-Brand-support.patch
+++ b/patches/api/0208-Brand-support.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Brand support
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index f36dc68a71e9799a638693ae5615743f94a85d40..f57c4a1ce6d1324c2adffed14b9ecb7700bea81c 100644
+index 06872dcef2d7f158ca3f25fb69b56511a0a1a90e..74dd447e74bae93a568acce75a7e3818ab6e5568 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3259,6 +3259,16 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3327,6 +3327,16 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
// Paper end
}
diff --git a/patches/api/0215-Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch b/patches/api/0215-Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
index 0118683bc24b..8d1a16ed4299 100644
--- a/patches/api/0215-Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
+++ b/patches/api/0215-Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Expose the Entity Counter to allow plugins to use valid and
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index f063016f8a88dbff480ac3b4b3ef05c16a8e515a..96b66f4f6fb8637ab3ad275ddd980d5b71711a6c 100644
+index e4861a8be534bfeae0385f0197261fa6ec1e7bc0..86bb2a6f46c7c39e7ac1923c3454785a3dc76648 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -138,5 +138,12 @@ public interface UnsafeValues {
+@@ -155,5 +155,12 @@ public interface UnsafeValues {
byte[] serializeItem(ItemStack item);
ItemStack deserializeItem(byte[] data);
diff --git a/patches/api/0216-Entity-isTicking.patch b/patches/api/0216-Entity-isTicking.patch
index 8d63d599c7c6..b56340aad506 100644
--- a/patches/api/0216-Entity-isTicking.patch
+++ b/patches/api/0216-Entity-isTicking.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entity#isTicking
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 72878285779dcfc6f365dc983f79b6e542792b89..9eb90abcdd5ee78e495b2b53ed8643593e9485d3 100644
+index 1e766f77e39b86b0561884a478d10cedc3d98fc2..387413af95421159eae04737cc04c8221e88357b 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -880,5 +880,10 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -875,5 +875,10 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
* Check if entity is in lava
*/
boolean isInLava();
diff --git a/patches/api/0218-Player-elytra-boost-API.patch b/patches/api/0218-Player-elytra-boost-API.patch
index d6552aab0a49..7b432696c4b6 100644
--- a/patches/api/0218-Player-elytra-boost-API.patch
+++ b/patches/api/0218-Player-elytra-boost-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Player elytra boost API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index f57c4a1ce6d1324c2adffed14b9ecb7700bea81c..2f083ef738681ae1219438541487eac093343cf0 100644
+index 74dd447e74bae93a568acce75a7e3818ab6e5568..3f9cdf1cfd19e61e3568af536b195f08b26418ab 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3153,6 +3153,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3221,6 +3221,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@NotNull T getClientOption(com.destroystokyo.paper.@NotNull ClientOption option);
// Paper end - client option API
diff --git a/patches/api/0219-Add-getOfflinePlayerIfCached-String.patch b/patches/api/0219-Add-getOfflinePlayerIfCached-String.patch
index bfbdc483f7b2..de11733eec57 100644
--- a/patches/api/0219-Add-getOfflinePlayerIfCached-String.patch
+++ b/patches/api/0219-Add-getOfflinePlayerIfCached-String.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add getOfflinePlayerIfCached(String)
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 1f63a4f8ffd11fe04f8dc807ad993e4b59172fea..dfe5055cefe6a110732e0fcc936dddb866cbd9e3 100644
+index 946dc3c3bde31c7a02ac4733ee8c88e63d8baff8..b4341f5c9adcebd13a0f62ebc32d081a65d71ba4 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -1335,6 +1335,27 @@ public final class Bukkit {
+@@ -1355,6 +1355,27 @@ public final class Bukkit {
return server.getOfflinePlayer(name);
}
@@ -37,10 +37,10 @@ index 1f63a4f8ffd11fe04f8dc807ad993e4b59172fea..dfe5055cefe6a110732e0fcc936dddb8
* Gets the player by the given UUID, regardless if they are offline or
* online.
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 1e88ad22e98cbbde118e6208b3502aee7391bac8..7986d51083c2c27709032b06731621d2e89bec57 100644
+index 000713e09564c96a7d3c9ceb0371de26a11ff82e..3c64eb18b7cb6ac371b094a581da8a033e90d00f 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1125,6 +1125,25 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1141,6 +1141,25 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
public OfflinePlayer getOfflinePlayer(@NotNull String name);
diff --git a/patches/api/0245-Add-sendOpLevel-API.patch b/patches/api/0245-Add-sendOpLevel-API.patch
index fa031a8e079c..2d47c5e770f5 100644
--- a/patches/api/0245-Add-sendOpLevel-API.patch
+++ b/patches/api/0245-Add-sendOpLevel-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add sendOpLevel API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 2f083ef738681ae1219438541487eac093343cf0..7a5839ac8f4d6bfd23d456e8e06fcfc86d24531f 100644
+index 3f9cdf1cfd19e61e3568af536b195f08b26418ab..59821aba66edbef2644bdd21646f556e773a898b 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3172,6 +3172,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3240,6 +3240,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
}
// Paper end - elytra boost API
diff --git a/patches/api/0247-Add-StructuresLocateEvent.patch b/patches/api/0247-Add-StructuresLocateEvent.patch
index f3cf01ce6849..ae3aef510212 100644
--- a/patches/api/0247-Add-StructuresLocateEvent.patch
+++ b/patches/api/0247-Add-StructuresLocateEvent.patch
@@ -513,10 +513,10 @@ index 0000000000000000000000000000000000000000..1e7b53f9bc13dcd5a0a4a40004591e4f
+ }
+}
diff --git a/src/main/java/org/bukkit/Registry.java b/src/main/java/org/bukkit/Registry.java
-index 613cd9c2e91a851c86e339d2be86981b57669311..4331acfc9efd08011e339a1bc0a5190abc197506 100644
+index b3f8a2611ceb57f5d0b5c300fa80d8bad121498d..4bc53793aade0887fa650a4bbf51d2e57678bd90 100644
--- a/src/main/java/org/bukkit/Registry.java
+++ b/src/main/java/org/bukkit/Registry.java
-@@ -262,6 +262,17 @@ public interface Registry extends Iterable {
+@@ -268,6 +268,17 @@ public interface Registry extends Iterable {
* @see GameEvent
*/
Registry GAME_EVENT = Objects.requireNonNull(Bukkit.getRegistry(GameEvent.class), "No registry present for GameEvent. This is a bug.");
diff --git a/patches/api/0259-Expose-Tracked-Players.patch b/patches/api/0259-Expose-Tracked-Players.patch
index 1abd6a33aa58..72636f895de8 100644
--- a/patches/api/0259-Expose-Tracked-Players.patch
+++ b/patches/api/0259-Expose-Tracked-Players.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expose Tracked Players
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 9eb90abcdd5ee78e495b2b53ed8643593e9485d3..d98fe98f703ff478ea4427783fd68debe9a6f267 100644
+index 387413af95421159eae04737cc04c8221e88357b..9d3694c6e1144e04006425fb96b802c96e5fdc12 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -885,5 +885,14 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -880,5 +880,14 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
* Check if entity is inside a ticking chunk
*/
boolean isTicking();
diff --git a/patches/api/0265-Expand-world-key-API.patch b/patches/api/0265-Expand-world-key-API.patch
index 761d7d83f5af..ee70bbcfd2e4 100644
--- a/patches/api/0265-Expand-world-key-API.patch
+++ b/patches/api/0265-Expand-world-key-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expand world key API
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index dfe5055cefe6a110732e0fcc936dddb866cbd9e3..c4a4a0b1295739070017e7d09dd5e04a798494e3 100644
+index b4341f5c9adcebd13a0f62ebc32d081a65d71ba4..7e049d9934df2259ea566aaa69ce118ce829529d 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -842,6 +842,18 @@ public final class Bukkit {
+@@ -862,6 +862,18 @@ public final class Bukkit {
public static World getWorld(@NotNull UUID uid) {
return server.getWorld(uid);
}
@@ -56,10 +56,10 @@ index 27eff0826d5b5b48697fefd9571886e7bbce74b1..d8b1fa79dc24138dc71e32c14bda71c1
// Paper end
}
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 7986d51083c2c27709032b06731621d2e89bec57..0e3e654fb0551c6f862ce14b75cf1186392b023f 100644
+index 3c64eb18b7cb6ac371b094a581da8a033e90d00f..c3e0b40a845a30790f31a0cf591bfa7f0cd87fee 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -704,6 +704,17 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -720,6 +720,17 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@Nullable
public World getWorld(@NotNull UUID uid);
@@ -78,10 +78,10 @@ index 7986d51083c2c27709032b06731621d2e89bec57..0e3e654fb0551c6f862ce14b75cf1186
* Create a new virtual {@link WorldBorder}.
*
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 96b66f4f6fb8637ab3ad275ddd980d5b71711a6c..27d5f37a9b2da92307e5b505e3b31cca8a067018 100644
+index 86bb2a6f46c7c39e7ac1923c3454785a3dc76648..72a29fff4c497a2a66e2746ad42553bcb712e20d 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -145,5 +145,10 @@ public interface UnsafeValues {
+@@ -162,5 +162,10 @@ public interface UnsafeValues {
* Use this when sending custom packets, so that there are no collisions on the client or server.
*/
public int nextEntityId();
diff --git a/patches/api/0266-Item-Rarity-API.patch b/patches/api/0266-Item-Rarity-API.patch
index aeb3aa7f1eaf..5e0072532446 100644
--- a/patches/api/0266-Item-Rarity-API.patch
+++ b/patches/api/0266-Item-Rarity-API.patch
@@ -61,10 +61,10 @@ index 85604d2c364c41fed24257a9b02ceeb58712f6a2..8fd928cfe61ab6f06c52eb5e4561fd68
/**
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 27d5f37a9b2da92307e5b505e3b31cca8a067018..26b0d5c0a62e516db6eef9dedc81216d7ed5053c 100644
+index 72a29fff4c497a2a66e2746ad42553bcb712e20d..22db1d8645a450308fe91d0cd100c926dd8c6f08 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -150,5 +150,22 @@ public interface UnsafeValues {
+@@ -167,5 +167,22 @@ public interface UnsafeValues {
* Just don't use it.
*/
@org.jetbrains.annotations.NotNull String getMainLevelName();
diff --git a/patches/api/0267-Expose-protocol-version.patch b/patches/api/0267-Expose-protocol-version.patch
index 18c7331272bf..0d34eacc4cb0 100644
--- a/patches/api/0267-Expose-protocol-version.patch
+++ b/patches/api/0267-Expose-protocol-version.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expose protocol version
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 26b0d5c0a62e516db6eef9dedc81216d7ed5053c..3ae23a15a2c8757d3003041425ced583187d3d21 100644
+index 22db1d8645a450308fe91d0cd100c926dd8c6f08..a3810c693d3748fba818e4a835ceb77762f433b9 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -167,5 +167,12 @@ public interface UnsafeValues {
+@@ -184,5 +184,12 @@ public interface UnsafeValues {
* @return the itemstack rarity
*/
public io.papermc.paper.inventory.ItemRarity getItemStackRarity(ItemStack itemStack);
diff --git a/patches/api/0272-More-World-API.patch b/patches/api/0272-More-World-API.patch
index 3c429371d9a4..a3d88eb648f1 100644
--- a/patches/api/0272-More-World-API.patch
+++ b/patches/api/0272-More-World-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] More World API
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 81b4e5764f68ef38938e645ca8180fc5ce263811..3fecfdebe43e3b543725a43f73465ae9ea030a0c 100644
+index 24ce9966140730c581c0709b14280e62a58331fa..d09c6b7c7b80f1f59e052ddb4aa8ad05b63fca2b 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -3783,6 +3783,122 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -3824,6 +3824,122 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@Nullable
StructureSearchResult locateNearestStructure(@NotNull Location origin, @NotNull Structure structure, int radius, boolean findUnexplored);
diff --git a/patches/api/0282-Add-basic-Datapack-API.patch b/patches/api/0282-Add-basic-Datapack-API.patch
index 497ce52ec66c..dafb02a98deb 100644
--- a/patches/api/0282-Add-basic-Datapack-API.patch
+++ b/patches/api/0282-Add-basic-Datapack-API.patch
@@ -70,10 +70,10 @@ index 0000000000000000000000000000000000000000..58f78d5e91beacaf710f62461cf869f7
+
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index c4a4a0b1295739070017e7d09dd5e04a798494e3..2e29da775e60c149d2c251d78ee7c60b494215a4 100644
+index 7e049d9934df2259ea566aaa69ce118ce829529d..8ca65a413295c1f104cc47f2f71cbc80345a9812 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -318,9 +318,11 @@ public final class Bukkit {
+@@ -328,9 +328,11 @@ public final class Bukkit {
/**
* Get the DataPack Manager.
*
@@ -85,7 +85,7 @@ index c4a4a0b1295739070017e7d09dd5e04a798494e3..2e29da775e60c149d2c251d78ee7c60b
public static DataPackManager getDataPackManager() {
return server.getDataPackManager();
}
-@@ -2536,6 +2538,14 @@ public final class Bukkit {
+@@ -2556,6 +2558,14 @@ public final class Bukkit {
public static com.destroystokyo.paper.entity.ai.MobGoals getMobGoals() {
return server.getMobGoals();
}
@@ -101,10 +101,10 @@ index c4a4a0b1295739070017e7d09dd5e04a798494e3..2e29da775e60c149d2c251d78ee7c60b
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 0e3e654fb0551c6f862ce14b75cf1186392b023f..61701b6e8291cb5816b0a7eb511152eed3db43e8 100644
+index c3e0b40a845a30790f31a0cf591bfa7f0cd87fee..be0d3ea564503441910aecdfe3d45b0303facc19 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -256,9 +256,11 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -264,9 +264,11 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
/**
* Get the DataPack Manager.
*
@@ -116,7 +116,7 @@ index 0e3e654fb0551c6f862ce14b75cf1186392b023f..61701b6e8291cb5816b0a7eb511152ee
public DataPackManager getDataPackManager();
/**
-@@ -2210,5 +2212,11 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2226,5 +2228,11 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
@NotNull
com.destroystokyo.paper.entity.ai.MobGoals getMobGoals();
diff --git a/patches/api/0284-ItemStack-repair-check-API.patch b/patches/api/0284-ItemStack-repair-check-API.patch
index c6f36eb4dea8..46650ec4b7e0 100644
--- a/patches/api/0284-ItemStack-repair-check-API.patch
+++ b/patches/api/0284-ItemStack-repair-check-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] ItemStack repair check API
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 3ae23a15a2c8757d3003041425ced583187d3d21..6b8013b072c9ca0a6f5ba86f37de3744fc70979e 100644
+index a3810c693d3748fba818e4a835ceb77762f433b9..d9e3e4ad108a94ac6f0f5378d22d47845091efb4 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -168,6 +168,16 @@ public interface UnsafeValues {
+@@ -185,6 +185,16 @@ public interface UnsafeValues {
*/
public io.papermc.paper.inventory.ItemRarity getItemStackRarity(ItemStack itemStack);
diff --git a/patches/api/0289-Attributes-API-for-item-defaults.patch b/patches/api/0289-Attributes-API-for-item-defaults.patch
index 6a98472b0976..66172a60274b 100644
--- a/patches/api/0289-Attributes-API-for-item-defaults.patch
+++ b/patches/api/0289-Attributes-API-for-item-defaults.patch
@@ -31,10 +31,10 @@ index 8fd928cfe61ab6f06c52eb5e4561fd6860e1f8d9..64ca3c676703eed55b4ac8a2d4561d48
/**
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 6b8013b072c9ca0a6f5ba86f37de3744fc70979e..0f09250d536b7405f0dc253afb1f3c4ccbaeb0da 100644
+index d9e3e4ad108a94ac6f0f5378d22d47845091efb4..bdee63fb97cbc0c9fbe7df74de5cb5f4ed7de3ca 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -178,6 +178,18 @@ public interface UnsafeValues {
+@@ -195,6 +195,18 @@ public interface UnsafeValues {
*/
public boolean isValidRepairItemStack(@org.jetbrains.annotations.NotNull ItemStack itemToBeRepaired, @org.jetbrains.annotations.NotNull ItemStack repairMaterial);
diff --git a/patches/api/0292-Add-PlayerKickEvent-causes.patch b/patches/api/0292-Add-PlayerKickEvent-causes.patch
index d03d83031ad9..39657e4039d0 100644
--- a/patches/api/0292-Add-PlayerKickEvent-causes.patch
+++ b/patches/api/0292-Add-PlayerKickEvent-causes.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add PlayerKickEvent causes
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 6e44845340f23a5b6ad8be46a1fa3dbb9dec5d67..a5e4b4447b5c68339d6b09749520048642a4eb83 100644
+index 59821aba66edbef2644bdd21646f556e773a898b..793df7533096efb0f60bddcb3e4e1575cbcc1069 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -275,6 +275,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -277,6 +277,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param message kick message
*/
void kick(final net.kyori.adventure.text.@Nullable Component message);
diff --git a/patches/api/0299-Missing-Entity-API.patch b/patches/api/0299-Missing-Entity-API.patch
index 0fbca326eb62..7dff1ccf46f9 100644
--- a/patches/api/0299-Missing-Entity-API.patch
+++ b/patches/api/0299-Missing-Entity-API.patch
@@ -402,12 +402,12 @@ index 191ce6c0e32ab3d05b1376e0fa56d1292c2d442c..8de09075e14a08a6c68f9c24e8960cc0
-public interface Cod extends Fish { }
+public interface Cod extends io.papermc.paper.entity.SchoolableFish { } // Paper - Schooling Fish API
diff --git a/src/main/java/org/bukkit/entity/Enderman.java b/src/main/java/org/bukkit/entity/Enderman.java
-index b3085c7ff8b3e96083d209f6612c006578773c24..b8ad718dbc6bc6e4000480d35c499cc1542998fa 100644
+index 58191017244f3949f6174fb108e3a245738a53c4..61672c6faf94aa497145aadd634bb10103c7b05a 100644
--- a/src/main/java/org/bukkit/entity/Enderman.java
+++ b/src/main/java/org/bukkit/entity/Enderman.java
-@@ -89,4 +89,36 @@ public interface Enderman extends Monster {
+@@ -86,4 +86,36 @@ public interface Enderman extends Monster {
+ * @return true if the teleport succeeded.
*/
- @ApiStatus.Experimental
public boolean teleportTowards(@NotNull Entity entity);
+
+ // Paper start
@@ -556,7 +556,7 @@ index 6b3c9bef9a8a34ddc6ff42cf358541a2665bf5e3..9c618a27d590f186f29c5d9094fc565e
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
-index 129df18c471f1ec0c286746953ae8803a209cfa7..ca74b215d226db16259e9ca9c930a49b3e444a7a 100644
+index b1fb059fc2249814c9e509c219da2aed84d34fe0..6e6b80843a8669b422f93e98343e1da9f8546ee7 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -1016,6 +1016,57 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
@@ -722,10 +722,10 @@ index 11b6d1aba7d1f6ae1f3c822193486f5a1478e105..709c8fc3dde786f45ff13d6ee6c405ff
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/entity/MushroomCow.java b/src/main/java/org/bukkit/entity/MushroomCow.java
-index 939a3dbfcf38f38e4e39d28973ef723157ce0a50..e14194a130ebd872bbc1eb24c7759f0388f3da97 100644
+index cef1700834643fe28ed5737578d91ecefbe99e2f..794b7b4a870a0d289476074e3a3f46552604c954 100644
--- a/src/main/java/org/bukkit/entity/MushroomCow.java
+++ b/src/main/java/org/bukkit/entity/MushroomCow.java
-@@ -35,4 +35,75 @@ public interface MushroomCow extends Cow {
+@@ -95,4 +95,75 @@ public interface MushroomCow extends Cow {
*/
BROWN;
}
diff --git a/patches/api/0315-Add-methods-to-find-targets-for-lightning-strikes.patch b/patches/api/0315-Add-methods-to-find-targets-for-lightning-strikes.patch
index 209cde5c4233..c84e83d2de17 100644
--- a/patches/api/0315-Add-methods-to-find-targets-for-lightning-strikes.patch
+++ b/patches/api/0315-Add-methods-to-find-targets-for-lightning-strikes.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add methods to find targets for lightning strikes
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 39fd31cb24d16b8279f54e666bb5e7bccf32468c..21835fcc70c4dcffb2474caa7be3cd07bb54e2cd 100644
+index d09c6b7c7b80f1f59e052ddb4aa8ad05b63fca2b..6897600a6879d88cea287cde350c1e9cd11ae96d 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -735,6 +735,37 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -737,6 +737,37 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@NotNull
public LightningStrike strikeLightningEffect(@NotNull Location loc);
diff --git a/patches/api/0316-Get-entity-default-attributes.patch b/patches/api/0316-Get-entity-default-attributes.patch
index d655cddecbdd..60dc6739f1e4 100644
--- a/patches/api/0316-Get-entity-default-attributes.patch
+++ b/patches/api/0316-Get-entity-default-attributes.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Get entity default attributes
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 0f09250d536b7405f0dc253afb1f3c4ccbaeb0da..f08e03c71f1e59d31a22822701b4e9ae6cc1429d 100644
+index bdee63fb97cbc0c9fbe7df74de5cb5f4ed7de3ca..5d4721595a24c8c970f2500fc805c3efc4508157 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -196,5 +196,22 @@ public interface UnsafeValues {
+@@ -213,5 +213,22 @@ public interface UnsafeValues {
* @return the server's protocol version
*/
int getProtocolVersion();
diff --git a/patches/api/0318-Add-critical-damage-API.patch b/patches/api/0318-Add-critical-damage-API.patch
index 12f98b0fead7..e0621399a2f1 100644
--- a/patches/api/0318-Add-critical-damage-API.patch
+++ b/patches/api/0318-Add-critical-damage-API.patch
@@ -5,47 +5,58 @@ Subject: [PATCH] Add critical damage API
diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java
-index 869bad7405ec7fa67728e90d8b9f2e11b542611f..aec5a0c2882cf69e8802b9e754b14d0acc34b162 100644
+index 0a43b1ffdb03bb8b67e880dfd9a6a1ce5d02eb32..f79eb4a0f634354ac68995144821bc4e966d2dd8 100644
--- a/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityDamageByEntityEvent.java
-@@ -11,15 +11,40 @@ import org.jetbrains.annotations.NotNull;
+@@ -4,6 +4,7 @@ import com.google.common.base.Function;
+ import java.util.Map;
+ import org.bukkit.damage.DamageSource;
+ import org.bukkit.entity.Entity;
++import org.jetbrains.annotations.ApiStatus;
+ import org.jetbrains.annotations.NotNull;
+
+ /**
+@@ -11,17 +12,43 @@ import org.jetbrains.annotations.NotNull;
+ */
public class EntityDamageByEntityEvent extends EntityDamageEvent {
private final Entity damager;
++ private final boolean critical; // Paper
-+ @Deprecated // Paper - add critical damage API
- public EntityDamageByEntityEvent(@NotNull final Entity damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, final double damage) {
- super(damagee, cause, damage);
++ @Deprecated
+ public EntityDamageByEntityEvent(@NotNull final Entity damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, final double damage) {
+ super(damagee, cause, damageSource, damage);
this.damager = damager;
+ this.critical = false; // Paper - add critical damage API
}
-+ @Deprecated // Paper - add critical damage API
- public EntityDamageByEntityEvent(@NotNull final Entity damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions) {
-+ // Paper start - add critical damage API
-+ this(damager, damagee, cause, modifiers, modifierFunctions, false);
-+ }
-+
-+ private final boolean critical;
-+ public EntityDamageByEntityEvent(@NotNull final Entity damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions, boolean critical) {
-+ // Paper end
- super(damagee, cause, modifiers, modifierFunctions);
++ @Deprecated
+ public EntityDamageByEntityEvent(@NotNull final Entity damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions) {
+ super(damagee, cause, damageSource, modifiers, modifierFunctions);
this.damager = damager;
-+ // Paper start - add critical damage API
++ // Paper start
++ this.critical = false;
+ }
+
++ @ApiStatus.Internal
++ public EntityDamageByEntityEvent(@NotNull final Entity damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions, boolean critical) {
++ super(damagee, cause, damageSource, modifiers, modifierFunctions);
++ this.damager = damager;
+ this.critical = critical;
+ }
+
+ /**
+ * Shows this damage instance was critical.
+ * The damage instance can be critical if the attacking player met the respective conditions.
-+ * Furthermore arrows may also cause a critical damage event if the arrow {@link org.bukkit.entity.AbstractArrow#isCritical()}.
++ * Furthermore, arrows may also cause a critical damage event if the arrow {@link org.bukkit.entity.AbstractArrow#isCritical()}.
+ *
+ * @return if the hit was critical.
+ * @see https://minecraft.wiki/wiki/Damage#Critical_hit
+ */
+ public boolean isCritical() {
+ return this.critical;
- }
++ }
+ // Paper end
-
++
/**
* Returns the entity that damaged the defender.
+ *
diff --git a/patches/api/0321-Add-isCollidable-methods-to-various-places.patch b/patches/api/0321-Add-isCollidable-methods-to-various-places.patch
index 4931b0b29f50..a3abc4242a76 100644
--- a/patches/api/0321-Add-isCollidable-methods-to-various-places.patch
+++ b/patches/api/0321-Add-isCollidable-methods-to-various-places.patch
@@ -26,10 +26,10 @@ index 64ca3c676703eed55b4ac8a2d4561d483c6935b1..9f86ad25a57b3f6e6bda1ce657833837
/**
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index f08e03c71f1e59d31a22822701b4e9ae6cc1429d..7dc808f94c42e821fa125073b1a9b853e16d5b41 100644
+index 5d4721595a24c8c970f2500fc805c3efc4508157..434fde52986ba07d7209ff47483f74fe31e8ebe7 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -213,5 +213,14 @@ public interface UnsafeValues {
+@@ -230,5 +230,14 @@ public interface UnsafeValues {
* @throws IllegalArgumentException if the entity does not exist of have default attributes (use {@link #hasDefaultEntityAttributes(NamespacedKey)} first)
*/
@org.jetbrains.annotations.NotNull org.bukkit.attribute.Attributable getDefaultEntityAttributes(@org.jetbrains.annotations.NotNull NamespacedKey entityKey);
@@ -45,7 +45,7 @@ index f08e03c71f1e59d31a22822701b4e9ae6cc1429d..7dc808f94c42e821fa125073b1a9b853
// Paper end
}
diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java
-index 6de4c858ff6e542daa0879092e4f99a948225964..05fd2aa8a1639598b488712d2fe5f739019f41dc 100644
+index b5fe76a6353816a2d009dfa5921f8ada92984f34..42cc4f2ee960c0abf9c6688aeee4150754612c32 100644
--- a/src/main/java/org/bukkit/block/Block.java
+++ b/src/main/java/org/bukkit/block/Block.java
@@ -482,6 +482,13 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
diff --git a/patches/api/0324-Add-Raw-Byte-Entity-Serialization.patch b/patches/api/0324-Add-Raw-Byte-Entity-Serialization.patch
index 46b080adb128..a809fef9b66d 100644
--- a/patches/api/0324-Add-Raw-Byte-Entity-Serialization.patch
+++ b/patches/api/0324-Add-Raw-Byte-Entity-Serialization.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add Raw Byte Entity Serialization
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 7dc808f94c42e821fa125073b1a9b853e16d5b41..fc0356b0600946af0a46312cee16b080a7769ae2 100644
+index 434fde52986ba07d7209ff47483f74fe31e8ebe7..0c7204e390f44b649fc26cd46152abeb2ad2d670 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -139,6 +139,14 @@ public interface UnsafeValues {
+@@ -156,6 +156,14 @@ public interface UnsafeValues {
ItemStack deserializeItem(byte[] data);
@@ -24,10 +24,10 @@ index 7dc808f94c42e821fa125073b1a9b853e16d5b41..fc0356b0600946af0a46312cee16b080
* Creates and returns the next EntityId available.
*
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index d98fe98f703ff478ea4427783fd68debe9a6f267..6356370eed537cec782f036dc73fe5bfbe4c1fb7 100644
+index 9d3694c6e1144e04006425fb96b802c96e5fdc12..f69a6bccb174ce48ce0393c633279f84553d1df8 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -894,5 +894,32 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -889,5 +889,32 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
*/
@Deprecated
@NotNull Set getTrackedPlayers();
diff --git a/patches/api/0326-Allow-delegation-to-vanilla-chunk-gen.patch b/patches/api/0326-Allow-delegation-to-vanilla-chunk-gen.patch
index a88d2a93be0f..e8f75d98e2a1 100644
--- a/patches/api/0326-Allow-delegation-to-vanilla-chunk-gen.patch
+++ b/patches/api/0326-Allow-delegation-to-vanilla-chunk-gen.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Allow delegation to vanilla chunk gen
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 2e29da775e60c149d2c251d78ee7c60b494215a4..27fd3ea4d0f96efa24167623c756f463995161bd 100644
+index 8ca65a413295c1f104cc47f2f71cbc80345a9812..03a94d0b332f531832bfad9839ec60a2ad91222c 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2056,6 +2056,24 @@ public final class Bukkit {
+@@ -2076,6 +2076,24 @@ public final class Bukkit {
return server.createChunkData(world);
}
@@ -34,10 +34,10 @@ index 2e29da775e60c149d2c251d78ee7c60b494215a4..27fd3ea4d0f96efa24167623c756f463
* Creates a boss bar instance to display to players. The progress
* defaults to 1.0
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 61701b6e8291cb5816b0a7eb511152eed3db43e8..d2c4887184661b68726ff8539d022b8dee8313fa 100644
+index be0d3ea564503441910aecdfe3d45b0303facc19..a1a9ed907eaa89e2915855eb2946d27ef3521b61 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1738,6 +1738,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1754,6 +1754,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
public ChunkGenerator.ChunkData createChunkData(@NotNull World world);
diff --git a/patches/api/0330-Entity-powdered-snow-API.patch b/patches/api/0330-Entity-powdered-snow-API.patch
index 2a4ece4cef87..2d4522029f19 100644
--- a/patches/api/0330-Entity-powdered-snow-API.patch
+++ b/patches/api/0330-Entity-powdered-snow-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entity powdered snow API
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 6356370eed537cec782f036dc73fe5bfbe4c1fb7..6456f7bfc8aa8cb5c9aaf0c06f9130242003ee3e 100644
+index f69a6bccb174ce48ce0393c633279f84553d1df8..1b9abd69483941f19ee7d0bb28e2655806dd3ca8 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -921,5 +921,12 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -916,5 +916,12 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
* @return Whether the entity was successfully spawned.
*/
public boolean spawnAt(@NotNull Location location, @NotNull org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason);
diff --git a/patches/api/0338-Multi-Block-Change-API.patch b/patches/api/0338-Multi-Block-Change-API.patch
index 21086887b139..45664f22b3be 100644
--- a/patches/api/0338-Multi-Block-Change-API.patch
+++ b/patches/api/0338-Multi-Block-Change-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Multi Block Change API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 07ba09643077fcd90d073b2efd52ae9a3a99198b..5662e957e7609aa4cc3e5fcf6b8f12cde6ae4305 100644
+index 793df7533096efb0f60bddcb3e4e1575cbcc1069..c8a50647d34c70bc927c33c602f938a01bf6e7a9 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -893,6 +893,29 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -895,6 +895,29 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public void sendBlockDamage(@NotNull Location loc, float progress);
diff --git a/patches/api/0342-More-PotionEffectType-API.patch b/patches/api/0342-More-PotionEffectType-API.patch
index 3ccfee4a9dcf..7e3682f8b41d 100644
--- a/patches/api/0342-More-PotionEffectType-API.patch
+++ b/patches/api/0342-More-PotionEffectType-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] More PotionEffectType API
diff --git a/src/main/java/org/bukkit/Registry.java b/src/main/java/org/bukkit/Registry.java
-index 4331acfc9efd08011e339a1bc0a5190abc197506..800d23bb249e19d5cf924e7ba36684068624da02 100644
+index 4bc53793aade0887fa650a4bbf51d2e57678bd90..18c672f3855a329bf8f87a9de81b677e8e360b41 100644
--- a/src/main/java/org/bukkit/Registry.java
+++ b/src/main/java/org/bukkit/Registry.java
-@@ -271,6 +271,31 @@ public interface Registry extends Iterable {
+@@ -277,6 +277,31 @@ public interface Registry extends Iterable {
*/
@Deprecated(forRemoval = true)
Registry CONFIGURED_STRUCTURE = Bukkit.getRegistry(io.papermc.paper.world.structure.ConfiguredStructure.class);
diff --git a/patches/api/0343-API-for-creating-command-sender-which-forwards-feedb.patch b/patches/api/0343-API-for-creating-command-sender-which-forwards-feedb.patch
index 328823c1039f..5c1c336819a5 100644
--- a/patches/api/0343-API-for-creating-command-sender-which-forwards-feedb.patch
+++ b/patches/api/0343-API-for-creating-command-sender-which-forwards-feedb.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] API for creating command sender which forwards feedback
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index c5ac78c4a4711e9c44d5eb7f66b28f448bcda63a..d7a9b5f9aeececb4070264bba6d2240628cdca12 100644
+index 03a94d0b332f531832bfad9839ec60a2ad91222c..c64f6ccfcd08c851900e734a194b1de4c8e32b07 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -1545,6 +1545,20 @@ public final class Bukkit {
+@@ -1565,6 +1565,20 @@ public final class Bukkit {
return server.getConsoleSender();
}
@@ -30,10 +30,10 @@ index c5ac78c4a4711e9c44d5eb7f66b28f448bcda63a..d7a9b5f9aeececb4070264bba6d22406
* Gets the folder that contains all of the various {@link World}s.
*
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index d2c4887184661b68726ff8539d022b8dee8313fa..1fbd8ce1b9fa60ba06512dfcbd025212bc6dedfc 100644
+index a1a9ed907eaa89e2915855eb2946d27ef3521b61..d6c3fefbd407ae3aa1be9e71d05b6370f09dd905 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -1302,6 +1302,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1318,6 +1318,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
public ConsoleCommandSender getConsoleSender();
diff --git a/patches/api/0344-Implement-regenerateChunk.patch b/patches/api/0344-Implement-regenerateChunk.patch
index 4625c51a5ac4..8023a26d0fb1 100644
--- a/patches/api/0344-Implement-regenerateChunk.patch
+++ b/patches/api/0344-Implement-regenerateChunk.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Implement regenerateChunk
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 21835fcc70c4dcffb2474caa7be3cd07bb54e2cd..86c7b4ba676f826344056b24b204b748cfce1580 100644
+index 6897600a6879d88cea287cde350c1e9cd11ae96d..0eb90bfff2e12cb3ed977a581912221ac4dee6f6 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -484,8 +484,8 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -486,8 +486,8 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
* @return Whether the chunk was actually regenerated
*
* @deprecated regenerating a single chunk is not likely to produce the same
diff --git a/patches/api/0349-Custom-Potion-Mixes.patch b/patches/api/0349-Custom-Potion-Mixes.patch
index 57bce6f5d1ae..3881038adb8f 100644
--- a/patches/api/0349-Custom-Potion-Mixes.patch
+++ b/patches/api/0349-Custom-Potion-Mixes.patch
@@ -155,10 +155,10 @@ index 0000000000000000000000000000000000000000..3ede1e8f7bf0436fdc5bf395c0f9eaf1
+ }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index d7a9b5f9aeececb4070264bba6d2240628cdca12..50d336fda7f549e50dc127767ca35107c99a3483 100644
+index c64f6ccfcd08c851900e734a194b1de4c8e32b07..986d506ae0eb91363e7fdfa19b1f9d0d840a5207 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2578,6 +2578,15 @@ public final class Bukkit {
+@@ -2598,6 +2598,15 @@ public final class Bukkit {
public static io.papermc.paper.datapack.DatapackManager getDatapackManager() {
return server.getDatapackManager();
}
@@ -175,10 +175,10 @@ index d7a9b5f9aeececb4070264bba6d2240628cdca12..50d336fda7f549e50dc127767ca35107
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 1fbd8ce1b9fa60ba06512dfcbd025212bc6dedfc..eca2b37d2841f3d64b9c3134c6b40264ee49d255 100644
+index d6c3fefbd407ae3aa1be9e71d05b6370f09dd905..33458df42b41e9ef5d9728d526cc45b8199f25b4 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2246,5 +2246,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2262,5 +2262,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
@NotNull
io.papermc.paper.datapack.DatapackManager getDatapackManager();
diff --git a/patches/api/0361-Expand-FallingBlock-API.patch b/patches/api/0361-Expand-FallingBlock-API.patch
index 81549f87522b..bbff3129a4ec 100644
--- a/patches/api/0361-Expand-FallingBlock-API.patch
+++ b/patches/api/0361-Expand-FallingBlock-API.patch
@@ -10,10 +10,10 @@ Subject: [PATCH] Expand FallingBlock API
Co-authored-by: Lukas Planz
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 86c7b4ba676f826344056b24b204b748cfce1580..0f60823426898974b7d61123fb848006fdc7bfcf 100644
+index 0eb90bfff2e12cb3ed977a581912221ac4dee6f6..5785dda1127106b529f0784df524e120aaf87f4f 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -2220,8 +2220,10 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2261,8 +2261,10 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
* @return The spawned {@link FallingBlock} instance
* @throws IllegalArgumentException if {@link Location} or {@link
* MaterialData} are null or {@link Material} of the {@link MaterialData} is not a block
@@ -24,7 +24,7 @@ index 86c7b4ba676f826344056b24b204b748cfce1580..0f60823426898974b7d61123fb848006
public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull MaterialData data) throws IllegalArgumentException;
/**
-@@ -2234,8 +2236,10 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2275,8 +2277,10 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
* @return The spawned {@link FallingBlock} instance
* @throws IllegalArgumentException if {@link Location} or {@link
* BlockData} are null
@@ -35,7 +35,7 @@ index 86c7b4ba676f826344056b24b204b748cfce1580..0f60823426898974b7d61123fb848006
public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull BlockData data) throws IllegalArgumentException;
/**
-@@ -2252,7 +2256,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -2293,7 +2297,7 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
* @return The spawned {@link FallingBlock} instance
* @throws IllegalArgumentException if {@link Location} or {@link
* Material} are null or {@link Material} is not a block
diff --git a/patches/api/0362-Add-method-isTickingWorlds-to-Bukkit.patch b/patches/api/0362-Add-method-isTickingWorlds-to-Bukkit.patch
index f25774fe607a..91e4d0fdac6d 100644
--- a/patches/api/0362-Add-method-isTickingWorlds-to-Bukkit.patch
+++ b/patches/api/0362-Add-method-isTickingWorlds-to-Bukkit.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add method isTickingWorlds() to Bukkit.
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 50d336fda7f549e50dc127767ca35107c99a3483..d71b30d574e5cf7273ff831edb7f3ef2359bbadc 100644
+index 986d506ae0eb91363e7fdfa19b1f9d0d840a5207..da505ee90f49983a9458cdf371db32228791fb53 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -786,12 +786,26 @@ public final class Bukkit {
+@@ -806,12 +806,26 @@ public final class Bukkit {
return server.getWorlds();
}
@@ -35,7 +35,7 @@ index 50d336fda7f549e50dc127767ca35107c99a3483..d71b30d574e5cf7273ff831edb7f3ef2
*
* @param creator the options to use when creating the world
* @return newly created or loaded world
-@@ -803,6 +817,9 @@ public final class Bukkit {
+@@ -823,6 +837,9 @@ public final class Bukkit {
/**
* Unloads a world with the given name.
@@ -45,7 +45,7 @@ index 50d336fda7f549e50dc127767ca35107c99a3483..d71b30d574e5cf7273ff831edb7f3ef2
*
* @param name Name of the world to unload
* @param save whether to save the chunks before unloading
-@@ -814,6 +831,9 @@ public final class Bukkit {
+@@ -834,6 +851,9 @@ public final class Bukkit {
/**
* Unloads the given world.
@@ -56,10 +56,10 @@ index 50d336fda7f549e50dc127767ca35107c99a3483..d71b30d574e5cf7273ff831edb7f3ef2
* @param world the world to unload
* @param save whether to save the chunks before unloading
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index eca2b37d2841f3d64b9c3134c6b40264ee49d255..75f2b46c4fc1e12d1d02cd60865a5b76b1c2de49 100644
+index 33458df42b41e9ef5d9728d526cc45b8199f25b4..d433a9d2fe0bb487865fec33307cc4c45af475a0 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -657,34 +657,55 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -673,34 +673,55 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@NotNull
public List getWorlds();
diff --git a/patches/api/0366-More-Teleport-API.patch b/patches/api/0366-More-Teleport-API.patch
index 7279598aea3b..a7561dc07914 100644
--- a/patches/api/0366-More-Teleport-API.patch
+++ b/patches/api/0366-More-Teleport-API.patch
@@ -120,7 +120,7 @@ index 0000000000000000000000000000000000000000..c8b5b570d44da9524bfc59c7e11b2ae5
+
+}
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index f090368dbb5acf352e1bee34d78b55eb92373c6d..8322d22f34968d579b92c581b36544d42b7732cd 100644
+index 29a34fa6bef077550526e00d0cdd0d8f49872e0c..3905c12b23bbfc88c9667b04e60fad7ad2febd60 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -126,10 +126,32 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
@@ -158,10 +158,10 @@ index f090368dbb5acf352e1bee34d78b55eb92373c6d..8322d22f34968d579b92c581b36544d4
* Teleports this entity to the given location. If this entity is riding a
* vehicle, it will be dismounted prior to teleportation.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 5662e957e7609aa4cc3e5fcf6b8f12cde6ae4305..a74ef246913baf52b990838ce26c8a4590b8ab36 100644
+index c8a50647d34c70bc927c33c602f938a01bf6e7a9..14b744bd1a0595260c65d3870be5f3985fb95ccb 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3332,6 +3332,45 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3400,6 +3400,45 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
String getClientBrandName();
// Paper end
diff --git a/patches/api/0368-Custom-Chat-Completion-Suggestions-API.patch b/patches/api/0368-Custom-Chat-Completion-Suggestions-API.patch
index baab234d28b1..1eb0e934e4b6 100644
--- a/patches/api/0368-Custom-Chat-Completion-Suggestions-API.patch
+++ b/patches/api/0368-Custom-Chat-Completion-Suggestions-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Custom Chat Completion Suggestions API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index a74ef246913baf52b990838ce26c8a4590b8ab36..5caca55d8fc53720ff3304e46af5cfdcfd1acfbc 100644
+index 14b744bd1a0595260c65d3870be5f3985fb95ccb..87d20d238071dabdbebf745d28e87b210b2436ca 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3216,6 +3216,31 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3284,6 +3284,31 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void sendOpLevel(byte level);
// Paper end - sendOpLevel API
diff --git a/patches/api/0369-Collision-API.patch b/patches/api/0369-Collision-API.patch
index 64087e5ba36c..607e11fb9e53 100644
--- a/patches/api/0369-Collision-API.patch
+++ b/patches/api/0369-Collision-API.patch
@@ -25,10 +25,10 @@ index 44ee56a5956cc17194c767a0c1071a2abffe818a..43dd6c59cceba12f27e6b265acc3ad97
// Paper end
}
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 8322d22f34968d579b92c581b36544d42b7732cd..2a4ff1457a9b4aa17bf28083ed4c301467ae9735 100644
+index 3905c12b23bbfc88c9667b04e60fad7ad2febd60..3fec6816bcc9167314b021a9989409649da6f7a7 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -971,4 +971,26 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -966,4 +966,26 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
*/
boolean isInPowderedSnow();
// Paper end
diff --git a/patches/api/0371-Add-NamespacedKey-biome-methods.patch b/patches/api/0371-Add-NamespacedKey-biome-methods.patch
index ae9059caa8b5..f11f727f1a17 100644
--- a/patches/api/0371-Add-NamespacedKey-biome-methods.patch
+++ b/patches/api/0371-Add-NamespacedKey-biome-methods.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Add NamespacedKey biome methods
Co-authored-by: Thonk <30448663+ExcessiveAmountsOfZombies@users.noreply.github.com>
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index fc0356b0600946af0a46312cee16b080a7769ae2..815b16338ed5f90daf24edc5be14a6f49e978832 100644
+index 0c7204e390f44b649fc26cd46152abeb2ad2d670..741ead65c89d4f9521d35dcbc9661d6772058499 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -230,5 +230,32 @@ public interface UnsafeValues {
+@@ -247,5 +247,32 @@ public interface UnsafeValues {
* @throws IllegalArgumentException if {@link Material#isBlock()} is false
*/
boolean isCollidable(@org.jetbrains.annotations.NotNull Material material);
diff --git a/patches/api/0378-Elder-Guardian-appearance-API.patch b/patches/api/0378-Elder-Guardian-appearance-API.patch
index a004acf776d7..338c1b65a3c0 100644
--- a/patches/api/0378-Elder-Guardian-appearance-API.patch
+++ b/patches/api/0378-Elder-Guardian-appearance-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Elder Guardian appearance API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 5caca55d8fc53720ff3304e46af5cfdcfd1acfbc..73536de601692a75fc83ff8b6e6781c7ae320a02 100644
+index 87d20d238071dabdbebf745d28e87b210b2436ca..ada7cfe2070eae77591b3138b88d389fbaab281a 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3396,6 +3396,24 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3464,6 +3464,24 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void lookAt(@NotNull org.bukkit.entity.Entity entity, @NotNull io.papermc.paper.entity.LookAnchor playerAnchor, @NotNull io.papermc.paper.entity.LookAnchor entityAnchor);
// Paper end - Teleport API
diff --git a/patches/api/0386-Add-Player-Warden-Warning-API.patch b/patches/api/0386-Add-Player-Warden-Warning-API.patch
index 54a7ac70eb9c..1bc7d6a95a69 100644
--- a/patches/api/0386-Add-Player-Warden-Warning-API.patch
+++ b/patches/api/0386-Add-Player-Warden-Warning-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add Player Warden Warning API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 73536de601692a75fc83ff8b6e6781c7ae320a02..7a680e61038856743d1271bae9b3ce8b8230a40f 100644
+index ada7cfe2070eae77591b3138b88d389fbaab281a..8a862dbf093ca0812aa1ce8def1e650380c303d0 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3412,6 +3412,59 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3480,6 +3480,59 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param silent whether sound should be silenced
*/
void showElderGuardian(boolean silent);
diff --git a/patches/api/0396-Add-Sneaking-API-for-Entities.patch b/patches/api/0396-Add-Sneaking-API-for-Entities.patch
index 274d5fb7d6b1..b89804cae7fe 100644
--- a/patches/api/0396-Add-Sneaking-API-for-Entities.patch
+++ b/patches/api/0396-Add-Sneaking-API-for-Entities.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add Sneaking API for Entities
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 351a7d0aeab5d83564dd543935ba503ea0b68d60..c9139bb7abc881fddd2d5610d9506cd4fce7eba3 100644
+index 3fec6816bcc9167314b021a9989409649da6f7a7..e5627ed4c6bac789ab847e9b423c0b78834b9430 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -782,6 +782,25 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -777,6 +777,25 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
@NotNull
Pose getPose();
@@ -35,10 +35,10 @@ index 351a7d0aeab5d83564dd543935ba503ea0b68d60..c9139bb7abc881fddd2d5610d9506cd4
* Get the category of spawn to which this entity belongs.
*
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 5b1233ff2a5cdda75263eae86f96052bc28e9f5c..e6191168df1032f5904ce5c580c7e41fb1249b22 100644
+index 8a862dbf093ca0812aa1ce8def1e650380c303d0..bfa5a218576c9db147da75ec39cf8a8f6e9f6157 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -415,6 +415,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -417,6 +417,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* @return true if player is in sneak mode
*/
@@ -46,7 +46,7 @@ index 5b1233ff2a5cdda75263eae86f96052bc28e9f5c..e6191168df1032f5904ce5c580c7e41f
public boolean isSneaking();
/**
-@@ -422,6 +423,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -424,6 +425,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*
* @param sneak true if player should appear sneaking
*/
diff --git a/patches/api/0398-Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch b/patches/api/0398-Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch
index c9fd0c650180..e2cea1ed6d67 100644
--- a/patches/api/0398-Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch
+++ b/patches/api/0398-Add-exploded-block-state-to-BlockExplodeEvent-and-En.patch
@@ -65,10 +65,10 @@ index 641c71ab66bd2499b35cf3c1d533fd105d096e10..7dcbb75170296c1dd1d784a032bf3696
* Returns the list of blocks that would have been removed or were removed
* from the explosion event.
diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
-index 461727dc7f06efb3550fc370e0db5bd04ba89711..ab18f35b686ec79551c307dde9e43c7dfad1b182 100644
+index 5ba9f7edf3bb814844ba9599c622a5106394c897..03889ab9b26c6f8fa4c9f51b7f67ad3ff40ef5db 100644
--- a/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityDamageByBlockEvent.java
-@@ -9,18 +9,38 @@ import org.jetbrains.annotations.Nullable;
+@@ -10,18 +10,25 @@ import org.jetbrains.annotations.Nullable;
/**
* Called when an entity is damaged by a block
@@ -81,33 +81,22 @@ index 461727dc7f06efb3550fc370e0db5bd04ba89711..ab18f35b686ec79551c307dde9e43c7d
private final Block damager;
+ private final org.bukkit.block.BlockState damagerBlockState; // Paper
- public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, final double damage) {
-+ // Paper start
-+ this(damager, damagee, cause, damage, null);
-+ }
-+ @org.jetbrains.annotations.ApiStatus.Internal
-+ public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, final double damage, final @Nullable org.bukkit.block.BlockState damagerBlockState) {
-+ // Paper end
- super(damagee, cause, damage);
+- public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, final double damage) {
++ public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, final double damage, final @Nullable org.bukkit.block.BlockState damagerBlockState) { // Paper
+ super(damagee, cause, damageSource, damage);
this.damager = damager;
+ this.damagerBlockState = damagerBlockState; // Paper
}
- public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions) {
-+ // Paper start
-+ this(damager, damagee, cause, modifiers, modifierFunctions, null);
-+ }
-+
-+ @org.jetbrains.annotations.ApiStatus.Internal
-+ public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions, final @Nullable org.bukkit.block.BlockState damagerBlockState) {
-+ // Paper end
- super(damagee, cause, modifiers, modifierFunctions);
+- public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions) {
++ public EntityDamageByBlockEvent(@Nullable final Block damager, @NotNull final Entity damagee, @NotNull final DamageCause cause, @NotNull final DamageSource damageSource, @NotNull final Map modifiers, @NotNull final Map> modifierFunctions, final @Nullable org.bukkit.block.BlockState damagerBlockState) { // Paper
+ super(damagee, cause, damageSource, modifiers, modifierFunctions);
this.damager = damager;
+ this.damagerBlockState = damagerBlockState; // Paper
}
/**
-@@ -32,4 +52,20 @@ public class EntityDamageByBlockEvent extends EntityDamageEvent {
+@@ -33,4 +40,20 @@ public class EntityDamageByBlockEvent extends EntityDamageEvent {
public Block getDamager() {
return damager;
}
diff --git a/patches/api/0399-Flying-Fall-Damage-API.patch b/patches/api/0399-Flying-Fall-Damage-API.patch
index 680af0c62ed8..3c619f5b4302 100644
--- a/patches/api/0399-Flying-Fall-Damage-API.patch
+++ b/patches/api/0399-Flying-Fall-Damage-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Flying Fall Damage API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index ef1efb5c2a66ee81ffc85a5bbf0b25784c65a90b..e5ef5f4a19ef181b7df3e06664ee77ebc3865d89 100644
+index bfa5a218576c9db147da75ec39cf8a8f6e9f6157..9d81aec1346d07faa47745a3cb79bac4a8a4ffa3 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1807,6 +1807,23 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1835,6 +1835,23 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public void setAllowFlight(boolean flight);
diff --git a/patches/api/0401-Win-Screen-API.patch b/patches/api/0401-Win-Screen-API.patch
index 9f6cf38d00d8..3863beaa63ee 100644
--- a/patches/api/0401-Win-Screen-API.patch
+++ b/patches/api/0401-Win-Screen-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Win Screen API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index e5ef5f4a19ef181b7df3e06664ee77ebc3865d89..cacf86208957d3708b489467f1abde61672da3ee 100644
+index 9d81aec1346d07faa47745a3cb79bac4a8a4ffa3..b49294027712e8d0b8aaaee1c041bc731b4cb184 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1177,6 +1177,47 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1205,6 +1205,47 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
public void sendMap(@NotNull MapView map);
diff --git a/patches/api/0402-Add-Entity-Body-Yaw-API.patch b/patches/api/0402-Add-Entity-Body-Yaw-API.patch
index ca3ef262334d..c09a6aa96268 100644
--- a/patches/api/0402-Add-Entity-Body-Yaw-API.patch
+++ b/patches/api/0402-Add-Entity-Body-Yaw-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add Entity Body Yaw API
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index e5df511d962a59260207e8390d7da7782af5dc77..90c46483928e70f37a9900cada7dc67957a031d0 100644
+index e5627ed4c6bac789ab847e9b423c0b78834b9430..79bd8e5fe58c99133a620e46237bd667bf70e508 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -989,6 +989,43 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -984,6 +984,43 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
* @return true if in powdered snow.
*/
boolean isInPowderedSnow();
@@ -53,7 +53,7 @@ index e5df511d962a59260207e8390d7da7782af5dc77..90c46483928e70f37a9900cada7dc679
// Paper start - Collision API
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
-index 74cd1d4aee0d4ef79fd77ac689c1e9b5d082664d..15d26b5d4fd55a29680f7485c80e33b7ce787fbe 100644
+index b9f98279789fe26181aa9c7aa253877d916034be..2dbb61df25967739c5a8308d6d89be20136816ba 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -1278,5 +1278,21 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
diff --git a/patches/api/0406-Add-Shearable-API.patch b/patches/api/0406-Add-Shearable-API.patch
index 617157b4995b..4e49b175724a 100644
--- a/patches/api/0406-Add-Shearable-API.patch
+++ b/patches/api/0406-Add-Shearable-API.patch
@@ -54,10 +54,10 @@ index 0000000000000000000000000000000000000000..0d5793790ab6a47525ad330335173612
+ boolean readyToBeSheared();
+}
diff --git a/src/main/java/org/bukkit/entity/MushroomCow.java b/src/main/java/org/bukkit/entity/MushroomCow.java
-index e14194a130ebd872bbc1eb24c7759f0388f3da97..a6020bf1e927c1478b5ab90ec9a6ee21f03579da 100644
+index 794b7b4a870a0d289476074e3a3f46552604c954..2f9aefd38c43755c79b30abddd6643b26880bd0d 100644
--- a/src/main/java/org/bukkit/entity/MushroomCow.java
+++ b/src/main/java/org/bukkit/entity/MushroomCow.java
-@@ -5,7 +5,7 @@ import org.jetbrains.annotations.NotNull;
+@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Represents a mushroom {@link Cow}
*/
@@ -65,7 +65,7 @@ index e14194a130ebd872bbc1eb24c7759f0388f3da97..a6020bf1e927c1478b5ab90ec9a6ee21
+public interface MushroomCow extends Cow, io.papermc.paper.entity.Shearable { // Paper
/**
- * Get the variant of this cow.
+ * Checks for the presence of custom potion effects to be applied to the
diff --git a/src/main/java/org/bukkit/entity/Sheep.java b/src/main/java/org/bukkit/entity/Sheep.java
index f4ce312ccd927a8b64f4266b35a0a53b85e591f3..97388d46cee225dedc0b61a12e7b60b3424732c8 100644
--- a/src/main/java/org/bukkit/entity/Sheep.java
diff --git a/patches/api/0413-Folia-scheduler-and-owned-region-API.patch b/patches/api/0413-Folia-scheduler-and-owned-region-API.patch
index 5eb0946bc3a5..d915fc3c77d5 100644
--- a/patches/api/0413-Folia-scheduler-and-owned-region-API.patch
+++ b/patches/api/0413-Folia-scheduler-and-owned-region-API.patch
@@ -499,10 +499,10 @@ index 0000000000000000000000000000000000000000..a6b50c9d8af589cc4747e14d343d2045
+ }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index d71b30d574e5cf7273ff831edb7f3ef2359bbadc..f98c8c41ad9685af327db9c44db5fc9e37e00590 100644
+index da505ee90f49983a9458cdf371db32228791fb53..63a4f5cc3f2e8fbff47543de76e42a79996dbe81 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2609,6 +2609,141 @@ public final class Bukkit {
+@@ -2629,6 +2629,141 @@ public final class Bukkit {
}
// Paper end
@@ -645,10 +645,10 @@ index d71b30d574e5cf7273ff831edb7f3ef2359bbadc..f98c8c41ad9685af327db9c44db5fc9e
public static Server.Spigot spigot() {
return server.spigot();
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 75f2b46c4fc1e12d1d02cd60865a5b76b1c2de49..f8f0a2b7fdd51c739c3f55801037a417872ce7d5 100644
+index d433a9d2fe0bb487865fec33307cc4c45af475a0..f819de247080d58803a2851a4cab28d2b3765495 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2275,4 +2275,119 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2291,4 +2291,119 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
@NotNull org.bukkit.potion.PotionBrewer getPotionBrewer();
// Paper end
@@ -769,10 +769,10 @@ index 75f2b46c4fc1e12d1d02cd60865a5b76b1c2de49..f8f0a2b7fdd51c739c3f55801037a417
+ // Paper end - Folia region threading API
}
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 90c46483928e70f37a9900cada7dc67957a031d0..3bf0c76ef830fa54d7695711cd7903dc64c619b1 100644
+index 79bd8e5fe58c99133a620e46237bd667bf70e508..4e01980ea00917743a92787b00d0f964395a6dd5 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -1049,4 +1049,15 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -1044,4 +1044,15 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
*/
boolean wouldCollideUsing(@NotNull BoundingBox boundingBox);
// Paper end - Collision API
diff --git a/patches/api/0416-Fix-BanList-API.patch b/patches/api/0416-Fix-BanList-API.patch
index e6e242f0d1e7..351f4dae160c 100644
--- a/patches/api/0416-Fix-BanList-API.patch
+++ b/patches/api/0416-Fix-BanList-API.patch
@@ -36,7 +36,7 @@ index 548f6d28c28d74bed8b58ee82875909354afe132..a77c0411a68a9bad33ddfb335b7a996a
/**
* Gets if a {@link BanEntry} exists for the target, indicating an active
diff --git a/src/main/java/org/bukkit/OfflinePlayer.java b/src/main/java/org/bukkit/OfflinePlayer.java
-index 774f9ec6a57d5d16a74ebe998e9ad800b1828029..9b84cb5abdf3db55cbc7ba19c8cd6955bf4fc5ec 100644
+index 634629d8c591d0477dfa6af91fa99caf17ffa9b0..ef6cb124adc98cb5231dc44e243450a2340f74af 100644
--- a/src/main/java/org/bukkit/OfflinePlayer.java
+++ b/src/main/java/org/bukkit/OfflinePlayer.java
@@ -135,7 +135,7 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio
@@ -130,10 +130,10 @@ index e805e629cede1c4c0674282c930cb67852718c3e..5248cf08ef83c7304dd76c42a2f646bb
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 41e7e24c65c3ae8cb451608db7598297fd9ffff2..5b00c51157a724e1d3f89198e97ba7e33b3a163d 100644
+index b49294027712e8d0b8aaaee1c041bc731b4cb184..8a765921b7e9ed047cfce2577408e420762f16bb 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -299,7 +299,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -301,7 +301,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* (updated) previous ban
*/
@Nullable
@@ -142,7 +142,7 @@ index 41e7e24c65c3ae8cb451608db7598297fd9ffff2..5b00c51157a724e1d3f89198e97ba7e3
/**
* Adds this user to the {@link ProfileBanList}. If a previous ban exists, this will
-@@ -315,7 +315,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -317,7 +317,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* (updated) previous ban
*/
@Nullable
@@ -151,7 +151,7 @@ index 41e7e24c65c3ae8cb451608db7598297fd9ffff2..5b00c51157a724e1d3f89198e97ba7e3
/**
* Adds this user to the {@link ProfileBanList}. If a previous ban exists, this will
-@@ -331,7 +331,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -333,7 +333,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* (updated) previous ban
*/
@Nullable
diff --git a/patches/api/0418-API-for-updating-recipes-on-clients.patch b/patches/api/0418-API-for-updating-recipes-on-clients.patch
index 266d6a480db0..c1665b9ba05f 100644
--- a/patches/api/0418-API-for-updating-recipes-on-clients.patch
+++ b/patches/api/0418-API-for-updating-recipes-on-clients.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] API for updating recipes on clients
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index f98c8c41ad9685af327db9c44db5fc9e37e00590..adfaf27b872aa5614a31ff5f32cf9336c6f2ee49 100644
+index 63a4f5cc3f2e8fbff47543de76e42a79996dbe81..b82260cdee74a82b78c103467f7e2888ba4d06c1 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -970,6 +970,26 @@ public final class Bukkit {
+@@ -990,6 +990,26 @@ public final class Bukkit {
server.reloadData();
}
@@ -35,7 +35,7 @@ index f98c8c41ad9685af327db9c44db5fc9e37e00590..adfaf27b872aa5614a31ff5f32cf9336
/**
* Returns the primary logger associated with this server instance.
*
-@@ -1024,6 +1044,20 @@ public final class Bukkit {
+@@ -1044,6 +1064,20 @@ public final class Bukkit {
return server.addRecipe(recipe);
}
@@ -56,7 +56,7 @@ index f98c8c41ad9685af327db9c44db5fc9e37e00590..adfaf27b872aa5614a31ff5f32cf9336
/**
* Get a list of all recipes for a given item. The stack size is ignored
* in comparisons. If the durability is -1, it will match any data value.
-@@ -1215,6 +1249,24 @@ public final class Bukkit {
+@@ -1235,6 +1269,24 @@ public final class Bukkit {
return server.removeRecipe(key);
}
@@ -82,10 +82,10 @@ index f98c8c41ad9685af327db9c44db5fc9e37e00590..adfaf27b872aa5614a31ff5f32cf9336
* Gets a list of command aliases defined in the server properties.
*
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index f8f0a2b7fdd51c739c3f55801037a417872ce7d5..36a21c39f834faa6fec29a319588ddc58715a747 100644
+index f819de247080d58803a2851a4cab28d2b3765495..f18f5db804053e072134508ef38252391895549a 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -820,6 +820,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -836,6 +836,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
public void reloadData();
@@ -108,7 +108,7 @@ index f8f0a2b7fdd51c739c3f55801037a417872ce7d5..36a21c39f834faa6fec29a319588ddc5
/**
* Returns the primary logger associated with this server instance.
*
-@@ -855,15 +871,34 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -871,15 +887,34 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
public boolean dispatchCommand(@NotNull CommandSender sender, @NotNull String commandLine) throws CommandException;
/**
@@ -144,7 +144,7 @@ index f8f0a2b7fdd51c739c3f55801037a417872ce7d5..36a21c39f834faa6fec29a319588ddc5
/**
* Get a list of all recipes for a given item. The stack size is ignored
* in comparisons. If the durability is -1, it will match any data value.
-@@ -1032,6 +1067,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -1048,6 +1083,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
public boolean removeRecipe(@NotNull NamespacedKey key);
diff --git a/patches/api/0420-Fix-custom-statistic-criteria-creation.patch b/patches/api/0420-Fix-custom-statistic-criteria-creation.patch
index 42a05e6c6bbb..4ce596796340 100644
--- a/patches/api/0420-Fix-custom-statistic-criteria-creation.patch
+++ b/patches/api/0420-Fix-custom-statistic-criteria-creation.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Fix custom statistic criteria creation
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 815b16338ed5f90daf24edc5be14a6f49e978832..a4b38f284d4fea7df7f9df9bf44e4f68fefaf20f 100644
+index 741ead65c89d4f9521d35dcbc9661d6772058499..0cfbb77c4da58b0692cb1df5686657b5ce04ad87 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -257,5 +257,7 @@ public interface UnsafeValues {
+@@ -274,5 +274,7 @@ public interface UnsafeValues {
* @throws IllegalStateException if no biome by the given key is registered.
*/
void setBiomeKey(RegionAccessor accessor, int x, int y, int z, NamespacedKey biomeKey);
diff --git a/patches/api/0422-API-for-an-entity-s-scoreboard-name.patch b/patches/api/0422-API-for-an-entity-s-scoreboard-name.patch
index 736aeeac0326..33df5bea8929 100644
--- a/patches/api/0422-API-for-an-entity-s-scoreboard-name.patch
+++ b/patches/api/0422-API-for-an-entity-s-scoreboard-name.patch
@@ -7,10 +7,10 @@ Was obtainable through different methods, but you had to use different
methods depending on the implementation of Entity you were working with.
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index b2f5be3227d5dad5b1ff0129930dcd1944c75cef..82c67193a2dbb7b0bd0d6381cd0e06af49415d18 100644
+index 4e01980ea00917743a92787b00d0f964395a6dd5..fded39b709ef4129b53eac0e021dbb1a37fe5770 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -1060,4 +1060,15 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -1055,4 +1055,15 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
*/
@NotNull io.papermc.paper.threadedregions.scheduler.EntityScheduler getScheduler();
// Paper end - Folia schedulers
diff --git a/patches/api/0423-Deprecate-and-replace-methods-with-old-StructureType.patch b/patches/api/0423-Deprecate-and-replace-methods-with-old-StructureType.patch
index 2e0d35f59799..177761f8cde9 100644
--- a/patches/api/0423-Deprecate-and-replace-methods-with-old-StructureType.patch
+++ b/patches/api/0423-Deprecate-and-replace-methods-with-old-StructureType.patch
@@ -5,20 +5,10 @@ Subject: [PATCH] Deprecate and replace methods with old StructureType
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index adfaf27b872aa5614a31ff5f32cf9336c6f2ee49..48fab492609e0bae459d20cc2eae78b87e37ab75 100644
+index b82260cdee74a82b78c103467f7e2888ba4d06c1..ca27559cf4aa1c2e44fdca2022e213b1b1c80f4e 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -926,7 +926,9 @@ public final class Bukkit {
- *
- * @see World#locateNearestStructure(org.bukkit.Location,
- * org.bukkit.StructureType, int, boolean)
-+ * @deprecated use {@link #createExplorerMap(World, Location, org.bukkit.generator.structure.StructureType, org.bukkit.map.MapCursor.Type)}
- */
-+ @Deprecated // Paper
- @NotNull
- public static ItemStack createExplorerMap(@NotNull World world, @NotNull Location location, @NotNull StructureType structureType) {
- return server.createExplorerMap(world, location, structureType);
-@@ -935,9 +937,6 @@ public final class Bukkit {
+@@ -935,9 +935,6 @@ public final class Bukkit {
/**
* Create a new explorer map targeting the closest nearby structure of a
* given {@link StructureType}.
@@ -28,7 +18,17 @@ index adfaf27b872aa5614a31ff5f32cf9336c6f2ee49..48fab492609e0bae459d20cc2eae78b8
*
* @param world the world the map will belong to
* @param location the origin location to find the nearest structure
-@@ -949,11 +948,54 @@ public final class Bukkit {
+@@ -946,7 +943,9 @@ public final class Bukkit {
+ *
+ * @see World#locateNearestStructure(org.bukkit.Location,
+ * org.bukkit.StructureType, int, boolean)
++ * @deprecated use {@link #createExplorerMap(World, Location, org.bukkit.generator.structure.StructureType, org.bukkit.map.MapCursor.Type)}
+ */
++ @Deprecated // Paper
+ @NotNull
+ public static ItemStack createExplorerMap(@NotNull World world, @NotNull Location location, @NotNull StructureType structureType) {
+ return server.createExplorerMap(world, location, structureType);
+@@ -969,11 +968,54 @@ public final class Bukkit {
*
* @see World#locateNearestStructure(org.bukkit.Location,
* org.bukkit.StructureType, int, boolean)
@@ -84,10 +84,10 @@ index adfaf27b872aa5614a31ff5f32cf9336c6f2ee49..48fab492609e0bae459d20cc2eae78b8
/**
* Reloads the server, refreshing settings and plugin information.
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 36a21c39f834faa6fec29a319588ddc58715a747..9af4bc16da09e59009c47911219e99450cdf2aa5 100644
+index f18f5db804053e072134508ef38252391895549a..b4f8281d3797ec825a7671f38077cd65d5a1d76e 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -784,16 +784,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -800,16 +800,15 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*
* @see World#locateNearestStructure(org.bukkit.Location,
* org.bukkit.StructureType, int, boolean)
@@ -106,7 +106,7 @@ index 36a21c39f834faa6fec29a319588ddc58715a747..9af4bc16da09e59009c47911219e9945
*
* @param world the world the map will belong to
* @param location the origin location to find the nearest structure
-@@ -805,9 +804,50 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -821,9 +820,50 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*
* @see World#locateNearestStructure(org.bukkit.Location,
* org.bukkit.StructureType, int, boolean)
diff --git a/patches/api/0424-Add-Listing-API-for-Player.patch b/patches/api/0424-Add-Listing-API-for-Player.patch
index 5cd488a2154b..609dd75c8760 100644
--- a/patches/api/0424-Add-Listing-API-for-Player.patch
+++ b/patches/api/0424-Add-Listing-API-for-Player.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] Add Listing API for Player
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index f5ea1e4709a3d72ea9fe3045f8bced7aa77bc3f4..bd1beef9615eb87297abab6abb55fae34c579626 100644
+index 8a765921b7e9ed047cfce2577408e420762f16bb..8839ccf9515ebc3d2962e5dd17e948a2a83a5241 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1943,6 +1943,32 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
- @ApiStatus.Experimental
+@@ -1965,6 +1965,32 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+ */
public boolean canSee(@NotNull Entity entity);
+ // Paper start
diff --git a/patches/api/0427-Expand-Pose-API.patch b/patches/api/0427-Expand-Pose-API.patch
index 9ffa45bc3699..f18a16576e53 100644
--- a/patches/api/0427-Expand-Pose-API.patch
+++ b/patches/api/0427-Expand-Pose-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Expand Pose API
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
-index 82c67193a2dbb7b0bd0d6381cd0e06af49415d18..1d0fd7ff8449f815a7d980af0b378181ea8bf8d8 100644
+index fded39b709ef4129b53eac0e021dbb1a37fe5770..9022567f32a58b94ed030db22524876d8f1df4aa 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
-@@ -799,6 +799,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
+@@ -794,6 +794,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
* @param sneak true if the entity should be sneaking
*/
void setSneaking(boolean sneak);
diff --git a/patches/api/0438-Add-player-idle-duration-API.patch b/patches/api/0438-Add-player-idle-duration-API.patch
index 24af4683d66e..9c44c6b88953 100644
--- a/patches/api/0438-Add-player-idle-duration-API.patch
+++ b/patches/api/0438-Add-player-idle-duration-API.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Add player idle duration API
Implements API for getting and resetting a player's idle duration.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index bd1beef9615eb87297abab6abb55fae34c579626..dfd58cde92f8799f5f4a406a29277d13a1aef46f 100644
+index 8839ccf9515ebc3d2962e5dd17e948a2a83a5241..5bad312df63eb6dea705c35e0f7e4dd980f526d7 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3553,6 +3553,29 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3621,6 +3621,29 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void increaseWardenWarningLevel();
// Paper end
diff --git a/patches/api/0440-Add-predicate-for-blocks-when-raytracing.patch b/patches/api/0440-Add-predicate-for-blocks-when-raytracing.patch
index 2d0f899ec00d..67d10e420ea5 100644
--- a/patches/api/0440-Add-predicate-for-blocks-when-raytracing.patch
+++ b/patches/api/0440-Add-predicate-for-blocks-when-raytracing.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add predicate for blocks when raytracing
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index 0f60823426898974b7d61123fb848006fdc7bfcf..e014a71f2fd20e41f985ce68301006c4a4e0c5e3 100644
+index 5785dda1127106b529f0784df524e120aaf87f4f..c0ad21a3dd1f3cd9a4c66000e937e89ffc183638 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -1692,6 +1692,27 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -1694,6 +1694,27 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@Nullable
public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, double raySize, @Nullable Predicate super Entity> filter);
@@ -36,7 +36,7 @@ index 0f60823426898974b7d61123fb848006fdc7bfcf..e014a71f2fd20e41f985ce68301006c4
/**
* Performs a ray trace that checks for block collisions using the blocks'
* precise collision shapes.
-@@ -1755,6 +1776,34 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -1757,6 +1778,34 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@Nullable
public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks);
@@ -71,7 +71,7 @@ index 0f60823426898974b7d61123fb848006fdc7bfcf..e014a71f2fd20e41f985ce68301006c4
/**
* Performs a ray trace that checks for both block and entity collisions.
*
-@@ -1788,6 +1837,42 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -1790,6 +1839,42 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
@Nullable
public RayTraceResult rayTrace(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, @Nullable Predicate super Entity> filter);
diff --git a/patches/api/0445-Add-Structure-check-API.patch b/patches/api/0445-Add-Structure-check-API.patch
index d993eeba7f35..693f5dbf0950 100644
--- a/patches/api/0445-Add-Structure-check-API.patch
+++ b/patches/api/0445-Add-Structure-check-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add Structure check API
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
-index e014a71f2fd20e41f985ce68301006c4a4e0c5e3..bf4b94ea2577e9d7e344385209fc0644a4e6bfbb 100644
+index c0ad21a3dd1f3cd9a4c66000e937e89ffc183638..c5fe36050eeaff80cfb989fe2f38370215af6fe5 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
-@@ -76,6 +76,30 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
+@@ -78,6 +78,30 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
*/
int getPlayerCount();
// Paper end
diff --git a/patches/api/0448-Improve-Registry.patch b/patches/api/0448-Improve-Registry.patch
index 1082efe432b6..da9c8aeaebe4 100644
--- a/patches/api/0448-Improve-Registry.patch
+++ b/patches/api/0448-Improve-Registry.patch
@@ -10,10 +10,10 @@ getKey() methods on Keyed objects that have a registry
are marked as Deprecated or Obsolete.
diff --git a/src/main/java/org/bukkit/Registry.java b/src/main/java/org/bukkit/Registry.java
-index 800d23bb249e19d5cf924e7ba36684068624da02..57e97b424cebd205cb260556ab9fb9eb2ff1eebc 100644
+index 18c672f3855a329bf8f87a9de81b677e8e360b41..e1fb4d8cca6a9c59047b1396f5c40bea957d777a 100644
--- a/src/main/java/org/bukkit/Registry.java
+++ b/src/main/java/org/bukkit/Registry.java
-@@ -307,6 +307,49 @@ public interface Registry extends Iterable {
+@@ -313,6 +313,49 @@ public interface Registry extends Iterable {
@Nullable
T get(@NotNull NamespacedKey key);
@@ -63,7 +63,7 @@ index 800d23bb249e19d5cf924e7ba36684068624da02..57e97b424cebd205cb260556ab9fb9eb
/**
* Returns a new stream, which contains all registry items, which are registered to the registry.
*
-@@ -373,5 +416,12 @@ public interface Registry extends Iterable {
+@@ -379,5 +422,12 @@ public interface Registry extends Iterable {
public Iterator iterator() {
return map.values().iterator();
}
diff --git a/patches/api/0449-Add-experience-points-API.patch b/patches/api/0449-Add-experience-points-API.patch
index 6223e3ae1ae4..eac15c72493c 100644
--- a/patches/api/0449-Add-experience-points-API.patch
+++ b/patches/api/0449-Add-experience-points-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add experience points API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index dfd58cde92f8799f5f4a406a29277d13a1aef46f..31aa6ef5fc2b3b88c72f5a15b8cc7a0e50c29f46 100644
+index 5bad312df63eb6dea705c35e0f7e4dd980f526d7..254a02ddb5dc867c9dd6c2086791f7ab94247fd3 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1806,6 +1806,45 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1834,6 +1834,45 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @param exp New total experience points
*/
public void setTotalExperience(int exp);
diff --git a/patches/api/0458-Add-api-for-spawn-egg-texture-colors.patch b/patches/api/0458-Add-api-for-spawn-egg-texture-colors.patch
index 9f9ef4707d3a..22ba7c25bfca 100644
--- a/patches/api/0458-Add-api-for-spawn-egg-texture-colors.patch
+++ b/patches/api/0458-Add-api-for-spawn-egg-texture-colors.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add api for spawn egg texture colors
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index a4b38f284d4fea7df7f9df9bf44e4f68fefaf20f..923d8655a84e26960d35d8dc6e4ebc0b10c295d5 100644
+index 0cfbb77c4da58b0692cb1df5686657b5ce04ad87..43f779ff7eca7450f52ac3688744743b5c3647bf 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -260,4 +260,17 @@ public interface UnsafeValues {
+@@ -277,4 +277,17 @@ public interface UnsafeValues {
String getStatisticCriteriaKey(@NotNull org.bukkit.Statistic statistic);
// Paper end
diff --git a/patches/api/0459-Add-Lifecycle-Event-system.patch b/patches/api/0459-Add-Lifecycle-Event-system.patch
index 2285a3eaa95a..635d4a73250a 100644
--- a/patches/api/0459-Add-Lifecycle-Event-system.patch
+++ b/patches/api/0459-Add-Lifecycle-Event-system.patch
@@ -528,10 +528,10 @@ index 0000000000000000000000000000000000000000..304f978e40e1759bb19704cc5cec3995
+ }
+}
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 923d8655a84e26960d35d8dc6e4ebc0b10c295d5..890c07cfc2e64a52752e96d518578b5eb1afbd19 100644
+index 43f779ff7eca7450f52ac3688744743b5c3647bf..f2163b5238e1667a44bf623cd52bab90d9f2d88d 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -273,4 +273,12 @@ public interface UnsafeValues {
+@@ -290,4 +290,12 @@ public interface UnsafeValues {
*/
@Nullable org.bukkit.Color getSpawnEggLayerColor(org.bukkit.entity.EntityType entityType, int layer);
// Paper end - spawn egg color visibility
diff --git a/patches/api/0461-ItemStack-Tooltip-API.patch b/patches/api/0461-ItemStack-Tooltip-API.patch
index c7710b7c4c96..9aa55ce1a905 100644
--- a/patches/api/0461-ItemStack-Tooltip-API.patch
+++ b/patches/api/0461-ItemStack-Tooltip-API.patch
@@ -108,10 +108,10 @@ index 0000000000000000000000000000000000000000..1d9bed6691f581529c53b577b26f1d0f
+ }
+}
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 890c07cfc2e64a52752e96d518578b5eb1afbd19..c6222fe754dee53f269944c7578dde8106377f20 100644
+index f2163b5238e1667a44bf623cd52bab90d9f2d88d..9a65c4f614a6c358d74491794d7b25172a00bc11 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -281,4 +281,6 @@ public interface UnsafeValues {
+@@ -298,4 +298,6 @@ public interface UnsafeValues {
@org.jetbrains.annotations.ApiStatus.Internal
io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager createPluginLifecycleEventManager(final org.bukkit.plugin.java.JavaPlugin plugin, final java.util.function.BooleanSupplier registrationCheck);
// Paper end - lifecycle event API
diff --git a/patches/api/0462-Add-getChunkSnapshot-includeLightData-parameter.patch b/patches/api/0462-Add-getChunkSnapshot-includeLightData-parameter.patch
index 288f6740ddb3..0437924b946e 100644
--- a/patches/api/0462-Add-getChunkSnapshot-includeLightData-parameter.patch
+++ b/patches/api/0462-Add-getChunkSnapshot-includeLightData-parameter.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add getChunkSnapshot includeLightData parameter
diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chunk.java
-index eca55d8d3464f0e13a3b7984f74559ccda87edba..0b83bf7fb7dac51ed1dbc005df36f0292167ec16 100644
+index 546888898d9d6827079fe041c7bc6eb4e1e4605c..d547ae2b20c58bc703de4532b3b591dd34ddb1c6 100644
--- a/src/main/java/org/bukkit/Chunk.java
+++ b/src/main/java/org/bukkit/Chunk.java
-@@ -100,6 +100,23 @@ public interface Chunk extends PersistentDataHolder {
+@@ -102,6 +102,23 @@ public interface Chunk extends PersistentDataHolder {
@NotNull
ChunkSnapshot getChunkSnapshot(boolean includeMaxblocky, boolean includeBiome, boolean includeBiomeTempRain);
diff --git a/patches/server/0002-Remap-fixes.patch b/patches/server/0002-Remap-fixes.patch
index 5e367262c099..3f9503543f1c 100644
--- a/patches/server/0002-Remap-fixes.patch
+++ b/patches/server/0002-Remap-fixes.patch
@@ -187,10 +187,10 @@ index 5818bfa69a8573a2a8f350066f829d587cbc546b..8e421a1bee0c526e3024eab9ba4cc0b3
assertNotNull(bukkit, "Bukkit gene null for " + gene);
diff --git a/src/test/java/org/bukkit/registry/RegistryConstantsTest.java b/src/test/java/org/bukkit/registry/RegistryConstantsTest.java
-index 8acd2400dac0486d95a28cc07c21fc0c7183769b..8038e422cfcdda0eab19a2b3961c2597de25752b 100644
+index 8abeb88d1514d22b5095153f9537317006f39df0..82a1efcb3aaaceaf12ad21559dec6b5112fcb361 100644
--- a/src/test/java/org/bukkit/registry/RegistryConstantsTest.java
+++ b/src/test/java/org/bukkit/registry/RegistryConstantsTest.java
-@@ -21,17 +21,17 @@ public class RegistryConstantsTest extends AbstractTestingBase {
+@@ -28,17 +28,17 @@ public class RegistryConstantsTest extends AbstractTestingBase {
@Test
public void testTrimMaterial() {
diff --git a/patches/server/0005-Paper-config-files.patch b/patches/server/0005-Paper-config-files.patch
index 27deead1df98..c9327e3fc279 100644
--- a/patches/server/0005-Paper-config-files.patch
+++ b/patches/server/0005-Paper-config-files.patch
@@ -4896,7 +4896,7 @@ index 1d611538d339345df065cd9c0c582d02e1fb0cc7..d200619b4aa820e273c26f2f6133589c
@Nullable
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-index dd16b56a478e1cd6f1b3c5563c9c02025d894802..c56c7293261ec2601ab02d051b37e820f023f0ff 100644
+index 57fdf24730d93e4dc48bacfa8f034fc99a48f0e4..8ddfd4a148c95d0d9e93edf03ddac46332936d9a 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -183,6 +183,10 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -4964,10 +4964,10 @@ index 8487fa452e4009c0f2a23a0d4eac4bf56f91447b..00ddf94c5bade8c0c486337ce920f59d
this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env);
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 8318b4a56b4a0235a00caba9df4ba41c85eb13bc..b5256eefb64808ae15bd622a8eccbe13454b4564 100644
+index 680a308c466c0056d4213e61f69cf13ee3ff5c61..cd39509d383c47319b71797e5d1df41c2b8c7ab6 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -915,6 +915,7 @@ public final class CraftServer implements Server {
+@@ -927,6 +927,7 @@ public final class CraftServer implements Server {
}
org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot
diff --git a/patches/server/0008-CB-fixes.patch b/patches/server/0008-CB-fixes.patch
index 5807a8e518b0..d0c88b547347 100644
--- a/patches/server/0008-CB-fixes.patch
+++ b/patches/server/0008-CB-fixes.patch
@@ -30,7 +30,7 @@ index 674c996af91de91ee6302cc67334b836ea4fa4de..93867b8883c6f5d5086e8fdc153e6d7c
if ((this.dimension() == Level.END && this.dimensionTypeRegistration().is(BuiltinDimensionTypes.END)) || env == org.bukkit.World.Environment.THE_END) { // CraftBukkit - Allow to create EnderDragonBattle in default and custom END
this.dragonFight = new EndDragonFight(this, this.serverLevelData.worldGenOptions().seed(), this.serverLevelData.endDragonFightData()); // CraftBukkit
diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
-index 869f60e9407ed1c5bee536ef91a21f4d11f8f964..3aa98f7c282cb4884589cb83b1546b924e66f096 100644
+index 869f60e9407ed1c5bee536ef91a21f4d11f8f964..95e5d1d707e610c930b6098a86c5162fd29bf602 100644
--- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
+++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
@@ -445,9 +445,9 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Saddl
@@ -38,10 +38,10 @@ index 869f60e9407ed1c5bee536ef91a21f4d11f8f964..3aa98f7c282cb4884589cb83b1546b92
@Override
- protected void actuallyHurt(DamageSource source, float amount) {
-+ protected boolean damageEntity0(DamageSource source, float amount) { // Paper - fix CB method rename issue
++ protected boolean actuallyHurt(DamageSource source, float amount) { // Paper - Fix CB...
this.standUpInstantly();
- super.actuallyHurt(source, amount);
-+ return super.damageEntity0(source, amount); // Paper - fix CB method rename issue
++ return super.actuallyHurt(source, amount); // Paper - Fix CB...
}
@Override
@@ -84,10 +84,10 @@ index 809fdf2da78293391aa5c60c04f4ad652b152eec..955b0abd4019fc45df84719eee6bf413
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 5f12fce84e0ec001dc43523753883a098434fcb6..d6a1b9bbf9737ed884ecf4af31e1521f46807405 100644
+index cd39509d383c47319b71797e5d1df41c2b8c7ab6..2cc1871c81056acd0582184bb684e672d14d3b6f 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -2454,7 +2454,11 @@ public final class CraftServer implements Server {
+@@ -2466,7 +2466,11 @@ public final class CraftServer implements Server {
Preconditions.checkArgument(key != null, "NamespacedKey key cannot be null");
LootDataManager registry = this.getServer().getLootData();
diff --git a/patches/server/0009-MC-Utils.patch b/patches/server/0009-MC-Utils.patch
index 34aea8b512a5..5de7f3ff8463 100644
--- a/patches/server/0009-MC-Utils.patch
+++ b/patches/server/0009-MC-Utils.patch
@@ -7028,7 +7028,7 @@ index 337e0a7b3c14e1b1a28744920e0dc0a69e0c5a87..f5829ae484d93b547a5437b85a962134
@Override
public void tell(R runnable) {
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 8957b7082f310b2b8aed5f5a68847d6dc773177a..a1f658f4dafd47de0020d96667b090aa88c69f9c 100644
+index 449635563afcb6a43e036dc0f3988efddbb622b2..e945daf877068625d4ad0f0b534f2eb23ee658a9 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -330,6 +330,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
@@ -7044,10 +7044,10 @@ index 8957b7082f310b2b8aed5f5a68847d6dc773177a..a1f658f4dafd47de0020d96667b090aa
public Entity(EntityType> type, Level world) {
this.id = Entity.ENTITY_COUNTER.incrementAndGet();
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 7fda861b1c2fc7246f2df8d199b4e8bbe55bc647..b71b702471599fc8f1de42919ade8ee6a4e6247c 100644
+index db768130e7b7c21e111687ebe761608e7494a739..44bfb8778f2894be9633be7ddc4f3c6881c9b05d 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -257,6 +257,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -258,6 +258,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
public boolean collides = true;
public Set collidableExemptions = new HashSet<>();
public boolean bukkitPickUpLoot;
@@ -7056,7 +7056,7 @@ index 7fda861b1c2fc7246f2df8d199b4e8bbe55bc647..b71b702471599fc8f1de42919ade8ee6
@Override
public float getBukkitYaw() {
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 1152735ac2cb8b193fdfb448f24517ad902b02a8..01761d37c9e4be4e498b62c7612885648b2968a6 100644
+index 0f24a32334e66b0c93287c9b2b14484da799738f..fc264864d4a6f56f94d884f4892257452b360b73 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -277,6 +277,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
@@ -7093,10 +7093,10 @@ index 86b65d66d895a4f02da002448739c122796feb4d..036d79baf372f4900681fee366bcd91c
super(type, world);
this.xpReward = 5;
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
-index d75bd8ab63930454d72299c378b6fef2ccc3725d..9861cd23b07f8fbacb1d125af835dee58c2debbb 100644
+index a7cbd0b9e37717215c03809e025f877e9c0a40b8..6291265ae4691bf7dffe196d20571c1c30e8d906 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
-@@ -823,6 +823,25 @@ public final class ItemStack {
+@@ -825,6 +825,25 @@ public final class ItemStack {
return this.tag != null ? this.tag.getList("Enchantments", 10) : new ListTag();
}
@@ -7122,7 +7122,7 @@ index d75bd8ab63930454d72299c378b6fef2ccc3725d..9861cd23b07f8fbacb1d125af835dee5
public void setTag(@Nullable CompoundTag nbt) {
this.tag = nbt;
if (this.getItem().canBeDepleted()) {
-@@ -1212,6 +1231,7 @@ public final class ItemStack {
+@@ -1214,6 +1233,7 @@ public final class ItemStack {
// CraftBukkit start
@Deprecated
public void setItem(Item item) {
@@ -7733,10 +7733,10 @@ index 98836000cbca2a21649cb8f2a466986373405ea1..bbbf6dd8e566ecdca8794e3b03765fe7
return false;
} else {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index aa3032f9dac2700f2621a860deeec49ada801939..e51bed4771dcef6201f943e9289c4a53f029f1ab 100644
+index 2cc1871c81056acd0582184bb684e672d14d3b6f..5cf26c39b00ea1f7b1c5719f434af79fb20c6c60 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -2531,4 +2531,9 @@ public final class CraftServer implements Server {
+@@ -2543,4 +2543,9 @@ public final class CraftServer implements Server {
return this.spigot;
}
// Spigot end
@@ -7747,10 +7747,10 @@ index aa3032f9dac2700f2621a860deeec49ada801939..e51bed4771dcef6201f943e9289c4a53
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-index 16785a8dab5a2e786e17db049c027ed1c13f5ef6..2b0b9994751557e69ee7aa48fcb8319c128a5bbf 100644
+index fcf06c157fa8ecdb742c301a95da8489e951ea20..1ce9787b04e28b3a50fdc7779a430c3be60a7646 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-@@ -245,8 +245,8 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+@@ -251,8 +251,8 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@Override
public Chunk[] getLoadedChunks() {
@@ -7761,7 +7761,7 @@ index 16785a8dab5a2e786e17db049c027ed1c13f5ef6..2b0b9994751557e69ee7aa48fcb8319c
}
@Override
-@@ -321,7 +321,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+@@ -327,7 +327,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
@Override
public boolean refreshChunk(int x, int z) {
@@ -7770,7 +7770,7 @@ index 16785a8dab5a2e786e17db049c027ed1c13f5ef6..2b0b9994751557e69ee7aa48fcb8319c
if (playerChunk == null) return false;
playerChunk.getTickingChunkFuture().thenAccept(either -> {
-@@ -2018,4 +2018,55 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+@@ -2055,4 +2055,55 @@ public class CraftWorld extends CraftRegionAccessor implements World {
return this.spigot;
}
// Spigot end
@@ -7869,10 +7869,10 @@ index 70165d287156f46b793eb23dd30b601289c0ffb1..758bf988432bb34aad9386e3f4e8bba6
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 070f119315a83be900c1a8e83962833d7df4c485..5d2ece0c415526d8c632b507f441977e6888c2cb 100644
+index ed501b794c222278dca98f8ece6096db1d8108a5..be3a8e54d64b3cc145ab09b0bc7abb3f4ee153c3 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2282,4 +2282,34 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2335,4 +2335,34 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return this.spigot;
}
// Spigot end
@@ -8151,10 +8151,10 @@ index 0000000000000000000000000000000000000000..909b2c98e7a9117d2f737245e4661792
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index d16df4f475151558593ac637c94391899f313829..32b73cd6d65abe1cd5fd33733d8c06467382acdc 100644
+index a2eb1e6dc8218157c1a5bbd769dd3b1d881fddb6..56c3aa7647eb2890cf7f546d35002b0c43724500 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-@@ -102,8 +102,17 @@ public final class CraftMagicNumbers implements UnsafeValues {
+@@ -107,8 +107,17 @@ public final class CraftMagicNumbers implements UnsafeValues {
private static final Map- ITEM_MATERIAL = new HashMap<>();
private static final Map MATERIAL_ITEM = new HashMap<>();
private static final Map MATERIAL_BLOCK = new HashMap<>();
@@ -8172,7 +8172,7 @@ index d16df4f475151558593ac637c94391899f313829..32b73cd6d65abe1cd5fd33733d8c0646
for (Block block : BuiltInRegistries.BLOCK) {
BLOCK_MATERIAL.put(block, Material.getMaterial(BuiltInRegistries.BLOCK.getKey(block).getPath().toUpperCase(Locale.ROOT)));
}
-@@ -154,6 +163,14 @@ public final class CraftMagicNumbers implements UnsafeValues {
+@@ -159,6 +168,14 @@ public final class CraftMagicNumbers implements UnsafeValues {
public static ResourceLocation key(Material mat) {
return CraftNamespacedKey.toMinecraft(mat.getKey());
}
diff --git a/patches/server/0010-Adventure.patch b/patches/server/0010-Adventure.patch
index 8d235e570cf6..631f6c96d000 100644
--- a/patches/server/0010-Adventure.patch
+++ b/patches/server/0010-Adventure.patch
@@ -2933,7 +2933,7 @@ index a60fef571c94858998a91711b17d3670c28a81bd..04a728a16bb629adbae1cd8586764a6d
@Override
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 520f0742210342b43aa854b1e8b0c42a84935a9c..d13a662895737180f3d75b6e357ff90c72b0fe08 100644
+index 58872976048a1162602d5f11a85eaead837cd805..acd53d9005fc5f43b94c80ec5e7d0e1f9c86ca98 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -44,6 +44,7 @@ import net.minecraft.nbt.ListTag;
@@ -3354,10 +3354,10 @@ index 23bdb77690ba15bcbbfb0c70af23336d08ac7752..8f144a357174bbe096ac9b38a5e67a61
}
collection = icons;
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8aa29bc887 100644
+index 5cf26c39b00ea1f7b1c5719f434af79fb20c6c60..8441cbe4ebd676d1aacff223abdabeb32b5658e0 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -608,8 +608,10 @@ public final class CraftServer implements Server {
+@@ -610,8 +610,10 @@ public final class CraftServer implements Server {
}
@Override
@@ -3368,7 +3368,7 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
}
@Override
-@@ -1569,7 +1571,15 @@ public final class CraftServer implements Server {
+@@ -1581,7 +1583,15 @@ public final class CraftServer implements Server {
return this.configuration.getInt("settings.spawn-radius", -1);
}
@@ -3384,7 +3384,7 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
public String getShutdownMessage() {
return this.configuration.getString("settings.shutdown-message");
}
-@@ -1737,7 +1747,20 @@ public final class CraftServer implements Server {
+@@ -1749,7 +1759,20 @@ public final class CraftServer implements Server {
}
@Override
@@ -3405,7 +3405,7 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
Set recipients = new HashSet<>();
for (Permissible permissible : this.getPluginManager().getPermissionSubscriptions(permission)) {
if (permissible instanceof CommandSender && permissible.hasPermission(permission)) {
-@@ -1745,14 +1768,14 @@ public final class CraftServer implements Server {
+@@ -1757,14 +1780,14 @@ public final class CraftServer implements Server {
}
}
@@ -3422,7 +3422,7 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
for (CommandSender recipient : recipients) {
recipient.sendMessage(message);
-@@ -2014,6 +2037,14 @@ public final class CraftServer implements Server {
+@@ -2026,6 +2049,14 @@ public final class CraftServer implements Server {
return CraftInventoryCreator.INSTANCE.createInventory(owner, type);
}
@@ -3437,7 +3437,7 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
@Override
public Inventory createInventory(InventoryHolder owner, InventoryType type, String title) {
Preconditions.checkArgument(type != null, "InventoryType cannot be null");
-@@ -2028,13 +2059,28 @@ public final class CraftServer implements Server {
+@@ -2040,13 +2071,28 @@ public final class CraftServer implements Server {
return CraftInventoryCreator.INSTANCE.createInventory(owner, size);
}
@@ -3466,7 +3466,7 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
public Merchant createMerchant(String title) {
return new CraftMerchantCustom(title == null ? InventoryType.MERCHANT.getDefaultTitle() : title);
}
-@@ -2099,6 +2145,17 @@ public final class CraftServer implements Server {
+@@ -2111,6 +2157,17 @@ public final class CraftServer implements Server {
return Thread.currentThread().equals(this.console.serverThread) || this.console.hasStopped() || !org.spigotmc.AsyncCatcher.enabled; // All bets are off if we have shut down (e.g. due to watchdog)
}
@@ -3484,7 +3484,7 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
@Override
public String getMotd() {
return this.console.getMotd();
-@@ -2536,4 +2593,57 @@ public final class CraftServer implements Server {
+@@ -2548,4 +2605,57 @@ public final class CraftServer implements Server {
public double[] getTPS() {
return new double[]{0, 0, 0}; // TODO
}
@@ -3543,10 +3543,10 @@ index e51bed4771dcef6201f943e9289c4a53f029f1ab..c9453c4689d02a39fa4a01aa14fc8d8a
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-index 2b0b9994751557e69ee7aa48fcb8319c128a5bbf..b2632cbc7903e23eb68e9901df039f5d8293bd77 100644
+index 1ce9787b04e28b3a50fdc7779a430c3be60a7646..8ff8d8174cd32d25b33c2e773d30c474b4e903d3 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-@@ -155,6 +155,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+@@ -161,6 +161,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
private final BlockMetadataStore blockMetadata = new BlockMetadataStore(this);
private final Object2IntOpenHashMap spawnCategoryLimit = new Object2IntOpenHashMap<>();
private final CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(CraftWorld.DATA_TYPE_REGISTRY);
@@ -3554,7 +3554,7 @@ index 2b0b9994751557e69ee7aa48fcb8319c128a5bbf..b2632cbc7903e23eb68e9901df039f5d
private static final Random rand = new Random();
-@@ -1646,6 +1647,42 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+@@ -1659,6 +1660,42 @@ public class CraftWorld extends CraftRegionAccessor implements World {
entityTracker.broadcastAndSend(packet);
}
}
@@ -3597,7 +3597,7 @@ index 2b0b9994751557e69ee7aa48fcb8319c128a5bbf..b2632cbc7903e23eb68e9901df039f5d
private static Map> gamerules;
public static synchronized Map> getGameRulesNMS() {
-@@ -2068,5 +2105,18 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+@@ -2105,5 +2142,18 @@ public class CraftWorld extends CraftRegionAccessor implements World {
public void setSendViewDistance(final int viewDistance) {
throw new UnsupportedOperationException("Not implemented yet");
}
@@ -4137,10 +4137,10 @@ index 61759e8179d0f6342abf0c0294e5a024928db8d9..92e21126a9347f1ee2279ab09bb6abf2
public boolean isOp() {
return true;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec9953bc0a63e 100644
+index be3a8e54d64b3cc145ab09b0bc7abb3f4ee153c3..e5330d41512dc59b5f94d9cacda340a46f45fd76 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -300,14 +300,39 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -306,14 +306,39 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public String getDisplayName() {
@@ -4180,7 +4180,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
@Override
public String getPlayerListName() {
return this.getHandle().listName == null ? this.getName() : CraftChatMessage.fromComponent(this.getHandle().listName);
-@@ -326,42 +351,42 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -332,42 +357,42 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
}
@@ -4232,7 +4232,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
this.getHandle().connection.send(packet);
}
-@@ -393,6 +418,23 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -399,6 +424,23 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
this.getHandle().connection.disconnect(message == null ? "" : message);
}
@@ -4256,7 +4256,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
@Override
public void setCompassTarget(Location loc) {
Preconditions.checkArgument(loc != null, "Location cannot be null");
-@@ -689,6 +731,24 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -695,6 +737,24 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
this.getHandle().connection.send(packet);
}
@@ -4281,7 +4281,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
@Override
public void sendSignChange(Location loc, String[] lines) {
this.sendSignChange(loc, lines, DyeColor.BLACK);
-@@ -712,6 +772,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -718,6 +778,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
if (this.getHandle().connection == null) return;
Component[] components = CraftSign.sanitizeLines(lines);
@@ -4293,7 +4293,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
SignBlockEntity sign = new SignBlockEntity(CraftLocation.toBlockPosition(loc), Blocks.OAK_SIGN.defaultBlockState());
SignText text = sign.getFrontText();
text = text.setColor(net.minecraft.world.item.DyeColor.byId(dyeColor.getWoolData()));
-@@ -721,7 +786,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -727,7 +792,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
sign.setText(text, true);
@@ -4303,7 +4303,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
}
@Override
-@@ -1705,7 +1771,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -1735,7 +1801,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void setResourcePack(String url) {
@@ -4312,7 +4312,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
}
@Override
-@@ -1720,7 +1786,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -1750,7 +1816,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void setResourcePack(String url, byte[] hash, boolean force) {
@@ -4321,8 +4321,8 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
}
@Override
-@@ -1743,6 +1809,59 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- }
+@@ -1787,6 +1853,59 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ this.handlePushResourcePack(new ClientboundResourcePackPushPacket(id, url, hashStr, force, CraftChatMessage.fromStringOrNull(prompt, true)), false);
}
+ // Paper start - adventure
@@ -4381,7 +4381,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
@Override
public void removeResourcePack(UUID id) {
Preconditions.checkArgument(id != null, "Resource pack id cannot be null");
-@@ -2150,6 +2269,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2203,6 +2322,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return (this.getHandle().requestedViewDistance() == 0) ? Bukkit.getViewDistance() : this.getHandle().requestedViewDistance();
}
@@ -4394,7 +4394,7 @@ index 5d2ece0c415526d8c632b507f441977e6888c2cb..f53e223e2412846b82298233459ec995
@Override
public int getPing() {
return this.getHandle().connection.latency();
-@@ -2200,6 +2325,252 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2253,6 +2378,252 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return this.getHandle().allowsListing();
}
@@ -4670,7 +4670,7 @@ index 5725b0281ac53a2354b233223259d6784353bc6e..9ef939b76d06874b856e0c850addb364
@Override
public int getLineWidth() {
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index ec1c0080642914ceeb931ee6ebdab31c2c6f1f59..a0dc52c805a82e267b66502a480cf76bc82a20d4 100644
+index 249d271338a75c49ec9bc886d034af637618bc7b..da100f451238a093bcaad83343a79254d4aa31ce 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -904,7 +904,7 @@ public class CraftEventFactory {
@@ -4876,7 +4876,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 7753018d4e36091d25badc030ed8a3c9e431a369..5e01357208fe52c1d270c68cb19029ea0f4057bb 100644
+index d1d4760ca6c392c1f1217b58d03a611e7fd6ee54..e0d4798e244add64cbe43201604ad9d57701515f 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;
@@ -4890,7 +4890,7 @@ index 7753018d4e36091d25badc030ed8a3c9e431a369..5e01357208fe52c1d270c68cb19029ea
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-@@ -261,6 +262,148 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
+@@ -262,6 +263,148 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
this.generation = (generation == null) ? null : generation.ordinal();
}
@@ -5039,7 +5039,7 @@ index 7753018d4e36091d25badc030ed8a3c9e431a369..5e01357208fe52c1d270c68cb19029ea
@Override
public String getPage(final int page) {
Preconditions.checkArgument(this.isValidPage(page), "Invalid page number (%s)", page);
-@@ -402,7 +545,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
+@@ -403,7 +546,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
}
@Override
@@ -5459,10 +5459,10 @@ index d4fc39c4c450e675c5696b376576a4449a475497..516b3fef4d388366df09f0dd88deadbc
boolean hadFormat = false;
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index 32b73cd6d65abe1cd5fd33733d8c06467382acdc..1c98b1f1a1c6ab27bb31fd9b32927c97728f980c 100644
+index 56c3aa7647eb2890cf7f546d35002b0c43724500..5cbac19f3c5eaa1940b36891b5a289c425300b20 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-@@ -73,6 +73,43 @@ public final class CraftMagicNumbers implements UnsafeValues {
+@@ -78,6 +78,43 @@ public final class CraftMagicNumbers implements UnsafeValues {
private CraftMagicNumbers() {}
diff --git a/patches/server/0011-Paper-command.patch b/patches/server/0011-Paper-command.patch
index f330c0e862a0..7fe615b89f4b 100644
--- a/patches/server/0011-Paper-command.patch
+++ b/patches/server/0011-Paper-command.patch
@@ -605,7 +605,7 @@ index 0000000000000000000000000000000000000000..ae60bd96b5284d54676d8e7e4dd5d170
+ }
+}
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-index c56c7293261ec2601ab02d051b37e820f023f0ff..faab5e8c952a2af6a286043617cded4e6ca5c3c6 100644
+index 8ddfd4a148c95d0d9e93edf03ddac46332936d9a..8499eb5128d3269925ffb2c61d8532e9da47be4a 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -187,6 +187,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -617,10 +617,10 @@ index c56c7293261ec2601ab02d051b37e820f023f0ff..faab5e8c952a2af6a286043617cded4e
this.setPvpAllowed(dedicatedserverproperties.pvp);
this.setFlightAllowed(dedicatedserverproperties.allowFlight);
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 4c75f630ff99259bd1d0e116fa20d0f625a3cf30..e9aa6a3c7710ed0c4685c5d8661d5de3fabb0a0d 100644
+index 8441cbe4ebd676d1aacff223abdabeb32b5658e0..45ba78ae029f59efd16534a2d6453af50a7aa74a 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -939,6 +939,7 @@ public final class CraftServer implements Server {
+@@ -951,6 +951,7 @@ public final class CraftServer implements Server {
this.commandMap.clearCommands();
this.reloadData();
org.spigotmc.SpigotConfig.registerCommands(); // Spigot
@@ -628,7 +628,7 @@ index 4c75f630ff99259bd1d0e116fa20d0f625a3cf30..e9aa6a3c7710ed0c4685c5d8661d5de3
this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*");
this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions");
-@@ -2637,6 +2638,34 @@ public final class CraftServer implements Server {
+@@ -2649,6 +2650,34 @@ public final class CraftServer implements Server {
// Paper end
// Paper start
diff --git a/patches/server/0013-Paper-Plugins.patch b/patches/server/0013-Paper-Plugins.patch
index db0f1755aae2..dcbfcbfaec31 100644
--- a/patches/server/0013-Paper-Plugins.patch
+++ b/patches/server/0013-Paper-Plugins.patch
@@ -7164,10 +7164,10 @@ index 403c57fc683bb0497602e1a9ec7b81b2722ecc01..ba58580f4c60205d1c7a7b7dfcdc22c4
Bootstrap.validate();
Util.startTimerHackThread();
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index e7aaa9cd3d89ddf46e2a4a41f5d2b8005ccadbbe..e05c01e18d9982f799196c8cdbd593b722475b49 100644
+index 45ba78ae029f59efd16534a2d6453af50a7aa74a..7bd9abe9166df3d120fe6580407a04f68279c55f 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -270,7 +270,8 @@ public final class CraftServer implements Server {
+@@ -272,7 +272,8 @@ public final class CraftServer implements Server {
private final CraftCommandMap commandMap = new CraftCommandMap(this);
private final SimpleHelpMap helpMap = new SimpleHelpMap(this);
private final StandardMessenger messenger = new StandardMessenger();
@@ -7177,7 +7177,7 @@ index e7aaa9cd3d89ddf46e2a4a41f5d2b8005ccadbbe..e05c01e18d9982f799196c8cdbd593b7
private final StructureManager structureManager;
protected final DedicatedServer console;
protected final DedicatedPlayerList playerList;
-@@ -418,24 +419,7 @@ public final class CraftServer implements Server {
+@@ -420,24 +421,7 @@ public final class CraftServer implements Server {
}
public void loadPlugins() {
@@ -7203,7 +7203,7 @@ index e7aaa9cd3d89ddf46e2a4a41f5d2b8005ccadbbe..e05c01e18d9982f799196c8cdbd593b7
}
public void enablePlugins(PluginLoadOrder type) {
-@@ -524,15 +508,17 @@ public final class CraftServer implements Server {
+@@ -526,15 +510,17 @@ public final class CraftServer implements Server {
private void enablePlugin(Plugin plugin) {
try {
List perms = plugin.getDescription().getPermissions();
@@ -7227,7 +7227,7 @@ index e7aaa9cd3d89ddf46e2a4a41f5d2b8005ccadbbe..e05c01e18d9982f799196c8cdbd593b7
this.pluginManager.enablePlugin(plugin);
} catch (Throwable ex) {
-@@ -963,6 +949,7 @@ public final class CraftServer implements Server {
+@@ -975,6 +961,7 @@ public final class CraftServer implements Server {
"This plugin is not properly shutting down its async tasks when it is being reloaded. This may cause conflicts with the newly loaded version of the plugin"
));
}
@@ -7253,10 +7253,10 @@ index 909b2c98e7a9117d2f737245e4661792ffafb744..d96399e9bf1a58db5a4a22e58abb99e7
@Override
public FileConfiguration getConfig() {
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index 1c98b1f1a1c6ab27bb31fd9b32927c97728f980c..72c1b7f1468c47ad7053a7ff6b3248324b2bf604 100644
+index 5cbac19f3c5eaa1940b36891b5a289c425300b20..8db0df55c5e23657b3a99a56fefb8e7419618c16 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-@@ -421,6 +421,12 @@ public final class CraftMagicNumbers implements UnsafeValues {
+@@ -426,6 +426,12 @@ public final class CraftMagicNumbers implements UnsafeValues {
net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
return nmsItemStack.getItem().getDescriptionId(nmsItemStack);
}
diff --git a/patches/server/0014-Timings-v2.patch b/patches/server/0014-Timings-v2.patch
index 528768a9ecde..4d99a43a439f 100644
--- a/patches/server/0014-Timings-v2.patch
+++ b/patches/server/0014-Timings-v2.patch
@@ -893,7 +893,7 @@ index 3691fd58c7baf98b15c50fa4dacf3a35f4f9b4b8..a6a8b5079ceaad90a79a09cab5c38a6f
this.profiler.popPush("send chunks");
iterator = this.playerList.getPlayers().iterator();
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-index 813fd87df0dfed8fe46389db8333d1d9f409fbe4..dfb37ddb89c2f43d9f9a34a6b2d38616575eb39b 100644
+index 4917aa64505870a0521bc09ce4d4d3e37c03eaae..65dbd05fa904eb8f0f0ef5d3fc3c1e885771f953 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -58,8 +58,9 @@ import org.apache.logging.log4j.Level;
@@ -1244,7 +1244,7 @@ index 68a0192f3b1c9491a6f64309ccc919274cdfe178..73608abb5a39749c326ce6fe1bf01442
this.entityManager.saveAll();
} else {
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index d13a662895737180f3d75b6e357ff90c72b0fe08..ce7caf08865df9ff032ba6c42308ea3ce4de6226 100644
+index acd53d9005fc5f43b94c80ec5e7d0e1f9c86ca98..01c70d149b306030c775427f744c4dfab19411cf 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -322,7 +322,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@@ -1315,7 +1315,7 @@ index 6e9f5a404511f3703298def67402b87eca2f28a0..f5a4191977e8675952fc689744c8a39e
public UserWhiteList getWhiteList() {
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index a1f658f4dafd47de0020d96667b090aa88c69f9c..8811646495f37587e7976edd8b9558cda412edb1 100644
+index e945daf877068625d4ad0f0b534f2eb23ee658a9..0ecdc0d671f744d85072ca0d157ef37bb28bab9c 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -135,7 +135,6 @@ import org.bukkit.craftbukkit.event.CraftPortalEvent;
@@ -1334,7 +1334,7 @@ index a1f658f4dafd47de0020d96667b090aa88c69f9c..8811646495f37587e7976edd8b9558cd
// Spigot start
public final org.spigotmc.ActivationRange.ActivationType activationType = org.spigotmc.ActivationRange.initializeEntityActivationType(this);
public final boolean defaultActivationState;
-@@ -811,7 +809,6 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -810,7 +808,6 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public void move(MoverType movementType, Vec3 movement) {
@@ -1342,7 +1342,7 @@ index a1f658f4dafd47de0020d96667b090aa88c69f9c..8811646495f37587e7976edd8b9558cd
if (this.noPhysics) {
this.setPos(this.getX() + movement.x, this.getY() + movement.y, this.getZ() + movement.z);
} else {
-@@ -972,7 +969,6 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -971,7 +968,6 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.level().getProfiler().pop();
}
}
@@ -1393,10 +1393,10 @@ index c4bc491eed487c0a7e30538b0fb46fde91cd7b31..382b55167dede435b034866bd394455f
}
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9edfbc4ad 100644
+index 44bfb8778f2894be9633be7ddc4f3c6881c9b05d..e111bdb614f173322ed0cc0386db6870a984fff7 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -140,7 +140,7 @@ import org.bukkit.event.entity.EntityTeleportEvent;
+@@ -141,7 +141,7 @@ import org.bukkit.event.entity.EntityTeleportEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
// CraftBukkit end
@@ -1405,7 +1405,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
public abstract class LivingEntity extends Entity implements Attackable {
-@@ -2866,7 +2866,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -2879,7 +2879,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
@Override
public void tick() {
@@ -1413,7 +1413,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
super.tick();
this.updatingUsingItem();
this.updateSwimAmount();
-@@ -2908,9 +2907,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -2921,9 +2920,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
if (!this.isRemoved()) {
@@ -1423,7 +1423,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
}
double d0 = this.getX() - this.xo;
-@@ -2994,7 +2991,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3007,7 +3004,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
this.refreshDirtyAttributes();
@@ -1431,7 +1431,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
}
public void detectEquipmentUpdatesPublic() { // CraftBukkit
-@@ -3169,7 +3165,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3182,7 +3178,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.setDeltaMovement(d0, d1, d2);
this.level().getProfiler().push("ai");
@@ -1439,7 +1439,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
if (this.isImmobile()) {
this.jumping = false;
this.xxa = 0.0F;
-@@ -3179,7 +3174,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3192,7 +3187,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.serverAiStep();
this.level().getProfiler().pop();
}
@@ -1447,7 +1447,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
this.level().getProfiler().pop();
this.level().getProfiler().push("jump");
-@@ -3219,7 +3213,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3232,7 +3226,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.resetFallDistance();
}
@@ -1455,7 +1455,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
label104:
{
LivingEntity entityliving = this.getControllingPassenger();
-@@ -3235,7 +3228,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3248,7 +3241,6 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.travel(vec3d1);
}
@@ -1463,7 +1463,7 @@ index b71b702471599fc8f1de42919ade8ee6a4e6247c..2e47008a8ff1bb56b752d4eb880173b9
this.level().getProfiler().pop();
this.level().getProfiler().push("freezing");
-@@ -3262,9 +3254,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3275,9 +3267,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.checkAutoSpinAttack(axisalignedbb, this.getBoundingBox());
}
@@ -1579,7 +1579,7 @@ index 409007f6e6940e5ea92e3cbaa74e55cdee50325b..c2179ea2a16ae0fac0b59d81a57abf13
}
}
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
-index 0eb09ce5c850d85ffd7229d27cf06b3e0edda11b..cc1d7626a82881c4410d65c6a33dadae7ab07172 100644
+index fff1a2f2b8b5235c0c56c68264db0a914f6cb15d..ba7a816bd9dd4aec79e2560f0968374dbb28442c 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
@@ -483,13 +483,10 @@ public class ChunkSerializer {
@@ -1605,10 +1605,10 @@ index 0eb09ce5c850d85ffd7229d27cf06b3e0edda11b..cc1d7626a82881c4410d65c6a33dadae
};
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index ab7f7246ee7cd456dbf016aa4b3eed974cd0bca2..eccca51b91f3c8afeab19fe11b3e60df314c9c72 100644
+index 7bd9abe9166df3d120fe6580407a04f68279c55f..13b33785e13d5f9cc659dc48e5fea6451ca778fc 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -368,7 +368,7 @@ public final class CraftServer implements Server {
+@@ -370,7 +370,7 @@ public final class CraftServer implements Server {
this.saveCommandsConfig();
this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*");
this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions");
@@ -1617,7 +1617,7 @@ index ab7f7246ee7cd456dbf016aa4b3eed974cd0bca2..eccca51b91f3c8afeab19fe11b3e60df
this.overrideSpawnLimits();
console.autosavePeriod = this.configuration.getInt("ticks-per.autosave");
this.warningState = WarningState.value(this.configuration.getString("settings.deprecated-verbose"));
-@@ -2545,12 +2545,31 @@ public final class CraftServer implements Server {
+@@ -2557,12 +2557,31 @@ public final class CraftServer implements Server {
private final org.bukkit.Server.Spigot spigot = new org.bukkit.Server.Spigot()
{
@@ -1819,10 +1819,10 @@ index b0ffa23faf62629043dfd613315eaf9c5fcc2cfe..00000000000000000000000000000000
- }
-}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index f53e223e2412846b82298233459ec9953bc0a63e..87e7071a381540be3b1db55f5d606e9e1e117b39 100644
+index e5330d41512dc59b5f94d9cacda340a46f45fd76..d53e15a3a70de8e2a405d3a39ff51a3551e82dbc 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2646,6 +2646,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2699,6 +2699,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
CraftPlayer.this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundSystemChatPacket(components, position == net.md_5.bungee.api.ChatMessageType.ACTION_BAR));
}
@@ -2019,10 +2019,10 @@ index f97eccb6a17c7876e1e002d798eb67bbe80571a0..76effc345d362047e64d064eb64a5222
+ } // Paper
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index 72c1b7f1468c47ad7053a7ff6b3248324b2bf604..677335c3888adc25fbf3c5ec4d5a6c5ecf58ea5d 100644
+index 8db0df55c5e23657b3a99a56fefb8e7419618c16..5e541636b216d4f46be18b1031522bd92e667b67 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-@@ -209,6 +209,12 @@ public final class CraftMagicNumbers implements UnsafeValues {
+@@ -214,6 +214,12 @@ public final class CraftMagicNumbers implements UnsafeValues {
}
// Paper end
// ========================================================================
@@ -2035,20 +2035,19 @@ index 72c1b7f1468c47ad7053a7ff6b3248324b2bf604..677335c3888adc25fbf3c5ec4d5a6c5e
public static byte toLegacyData(BlockState data) {
return CraftLegacy.toLegacyData(data);
-@@ -442,6 +448,13 @@ public final class CraftMagicNumbers implements UnsafeValues {
- return new CraftPotionType(namespacedKey, potionRegistry);
+@@ -457,6 +463,12 @@ public final class CraftMagicNumbers implements UnsafeValues {
+ public DamageSource.Builder createDamageSourceBuilder(DamageType damageType) {
+ return new CraftDamageSourceBuilder(damageType);
}
-
+ // Paper start
+ @Override
+ public String getTimingsServerName() {
+ return io.papermc.paper.configuration.GlobalConfiguration.get().timings.serverName;
+ }
+ // Paper end
-+
+
/**
* This helper class represents the different NBT Tags.
- *
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
index ff422d4d4f2b764370f0ee2af13034853c1d3fe1..a5da6c1cae0afbde684be250e2fc3c0c32a1265b 100644
--- a/src/main/java/org/spigotmc/ActivationRange.java
diff --git a/patches/server/0016-Further-improve-server-tick-loop.patch b/patches/server/0016-Further-improve-server-tick-loop.patch
index 70deed19e296..5c66e16921cf 100644
--- a/patches/server/0016-Further-improve-server-tick-loop.patch
+++ b/patches/server/0016-Further-improve-server-tick-loop.patch
@@ -146,10 +146,10 @@ index a6a8b5079ceaad90a79a09cab5c38a6fde6d33ee..f32aa4e03ae02d1449101c4aa89c8e0c
this.startMetricsRecordingTick();
this.profiler.push("tick");
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index ac036223ca386a48caf1796ea65c3bbde4d6ed08..2e42f297ad27d9dea4b09cf19e9b4f00e4fc5a21 100644
+index 13b33785e13d5f9cc659dc48e5fea6451ca778fc..5a720c0a751e7a83976727d01cc5bc6282702255 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -2598,7 +2598,11 @@ public final class CraftServer implements Server {
+@@ -2610,7 +2610,11 @@ public final class CraftServer implements Server {
@Override
public double[] getTPS() {
diff --git a/patches/server/0017-Add-command-line-option-to-load-extra-plugin-jars-no.patch b/patches/server/0017-Add-command-line-option-to-load-extra-plugin-jars-no.patch
index 5dc280deb735..98abdd4851be 100644
--- a/patches/server/0017-Add-command-line-option-to-load-extra-plugin-jars-no.patch
+++ b/patches/server/0017-Add-command-line-option-to-load-extra-plugin-jars-no.patch
@@ -7,10 +7,10 @@ Subject: [PATCH] Add command line option to load extra plugin jars not in the
ex: java -jar paperclip.jar nogui -add-plugin=/path/to/plugin.jar -add-plugin=/path/to/another/plugin_jar.jar
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 33b6605d1139e83a09054b6ed140e129e65a954d..3b2f99617a519c2c2f60b88a4679064c01e5d958 100644
+index 5a720c0a751e7a83976727d01cc5bc6282702255..48c40f12649735f14204c516eace6905b2ac0019 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -422,6 +422,35 @@ public final class CraftServer implements Server {
+@@ -424,6 +424,35 @@ public final class CraftServer implements Server {
io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler.INSTANCE.enter(io.papermc.paper.plugin.entrypoint.Entrypoint.PLUGIN); // Paper - replace implementation
}
diff --git a/patches/server/0018-Keep-previous-behavior-for-setResourcePack.patch b/patches/server/0018-Keep-previous-behavior-for-setResourcePack.patch
deleted file mode 100644
index 98e0dec4c489..000000000000
--- a/patches/server/0018-Keep-previous-behavior-for-setResourcePack.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic
-Date: Fri, 8 Dec 2023 15:06:16 -0800
-Subject: [PATCH] Keep previous behavior for setResourcePack
-
-Before multiple packs were allowed, setResourcePack
-resulted in the client's existing server pack being
-replaced. To keep this behavior, we will remove all
-packs before sending the new pack. Other API exists
-for adding a new pack to the existing packs on a client.
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 87e7071a381540be3b1db55f5d606e9e1e117b39..afdc702682af7ddf338fe00a1b1912766e728f41 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -1803,8 +1803,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- if (hash != null) {
- Preconditions.checkArgument(hash.length == 20, "Resource pack hash should be 20 bytes long but was %s", hash.length);
-
-+ this.getHandle().connection.send(new net.minecraft.network.protocol.common.ClientboundResourcePackPopPacket(Optional.empty())); // Paper - keep previous behavior of clearing packs
- this.getHandle().connection.send(new ClientboundResourcePackPushPacket(id, url, BaseEncoding.base16().lowerCase().encode(hash), force, CraftChatMessage.fromStringOrNull(prompt, true)));
- } else {
-+ this.getHandle().connection.send(new net.minecraft.network.protocol.common.ClientboundResourcePackPopPacket(Optional.empty())); // Paper - keep previous behavior of clearing packs
- this.getHandle().connection.send(new ClientboundResourcePackPushPacket(id, url, "", force, CraftChatMessage.fromStringOrNull(prompt, true)));
- }
- }
diff --git a/patches/server/0019-Support-components-in-ItemMeta.patch b/patches/server/0018-Support-components-in-ItemMeta.patch
similarity index 100%
rename from patches/server/0019-Support-components-in-ItemMeta.patch
rename to patches/server/0018-Support-components-in-ItemMeta.patch
diff --git a/patches/server/0019-Configurable-cactus-bamboo-and-reed-growth-height.patch b/patches/server/0019-Configurable-cactus-bamboo-and-reed-growth-height.patch
new file mode 100644
index 000000000000..6f7a9c6719af
--- /dev/null
+++ b/patches/server/0019-Configurable-cactus-bamboo-and-reed-growth-height.patch
@@ -0,0 +1,92 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Tue, 1 Mar 2016 13:02:51 -0600
+Subject: [PATCH] Configurable cactus bamboo and reed growth height
+
+Bamboo - Both the minimum fully-grown height and the maximum are configurable
+- Machine_Maker
+
+diff --git a/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java b/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java
+index bd72deadb59289ae90afc379ee61e8198ddaf4ed..e8dc4ea90d74036dacb0785fcb9125df192a4c22 100644
+--- a/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java
+@@ -137,7 +137,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
+ if (random.nextFloat() < (world.spigotConfig.bambooModifier / (100.0f * 3)) && world.isEmptyBlock(pos.above()) && world.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution
+ int i = this.getHeightBelowUpToMax(world, pos) + 1;
+
+- if (i < 16) {
++ if (i < world.paperConfig().maxGrowthHeight.bamboo.max) { // Paper - Configurable cactus/bamboo/reed growth height
+ this.growBamboo(state, world, pos, random, i);
+ }
+ }
+@@ -168,7 +168,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
+ int i = this.getHeightAboveUpToMax(world, pos);
+ int j = this.getHeightBelowUpToMax(world, pos);
+
+- return i + j + 1 < 16 && (Integer) world.getBlockState(pos.above(i)).getValue(BambooStalkBlock.STAGE) != 1;
++ return i + j + 1 < ((Level) world).paperConfig().maxGrowthHeight.bamboo.max && (Integer) world.getBlockState(pos.above(i)).getValue(BambooStalkBlock.STAGE) != 1; // Paper - Configurable cactus/bamboo/reed growth height
+ }
+
+ @Override
+@@ -187,7 +187,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
+ BlockPos blockposition1 = pos.above(i);
+ BlockState iblockdata1 = world.getBlockState(blockposition1);
+
+- if (k >= 16 || !iblockdata1.is(Blocks.BAMBOO) || (Integer) iblockdata1.getValue(BambooStalkBlock.STAGE) == 1 || !world.isEmptyBlock(blockposition1.above())) { // CraftBukkit - If the BlockSpreadEvent was cancelled, we have no bamboo here
++ if (k >= world.paperConfig().maxGrowthHeight.bamboo.max || !iblockdata1.is(Blocks.BAMBOO) || (Integer) iblockdata1.getValue(BambooStalkBlock.STAGE) == 1 || !world.isEmptyBlock(blockposition1.above())) { // CraftBukkit - If the BlockSpreadEvent was cancelled, we have no bamboo here // Paper - Configurable cactus/bamboo/reed growth height
+ return;
+ }
+
+@@ -228,7 +228,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
+ }
+
+ int j = (Integer) state.getValue(BambooStalkBlock.AGE) != 1 && !iblockdata2.is(Blocks.BAMBOO) ? 0 : 1;
+- int k = (height < 11 || random.nextFloat() >= 0.25F) && height != 15 ? 0 : 1;
++ int k = (height < world.paperConfig().maxGrowthHeight.bamboo.min || random.nextFloat() >= 0.25F) && height != (world.paperConfig().maxGrowthHeight.bamboo.max - 1) ? 0 : 1; // Paper - Configurable cactus/bamboo/reed growth height
+
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(world, pos, pos.above(), (BlockState) ((BlockState) ((BlockState) this.defaultBlockState().setValue(BambooStalkBlock.AGE, j)).setValue(BambooStalkBlock.LEAVES, blockpropertybamboosize)).setValue(BambooStalkBlock.STAGE, k), 3)) {
+@@ -243,7 +243,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
+ protected int getHeightAboveUpToMax(BlockGetter world, BlockPos pos) {
+ int i;
+
+- for (i = 0; i < 16 && world.getBlockState(pos.above(i + 1)).is(Blocks.BAMBOO); ++i) {
++ for (i = 0; i < ((Level) world).paperConfig().maxGrowthHeight.bamboo.max && world.getBlockState(pos.above(i + 1)).is(Blocks.BAMBOO); ++i) { // Paper - Configurable cactus/bamboo/reed growth height
+ ;
+ }
+
+@@ -253,7 +253,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
+ protected int getHeightBelowUpToMax(BlockGetter world, BlockPos pos) {
+ int i;
+
+- for (i = 0; i < 16 && world.getBlockState(pos.below(i + 1)).is(Blocks.BAMBOO); ++i) {
++ for (i = 0; i < ((Level) world).paperConfig().maxGrowthHeight.bamboo.max && world.getBlockState(pos.below(i + 1)).is(Blocks.BAMBOO); ++i) { // Paper - Configurable cactus/bamboo/reed growth height
+ ;
+ }
+
+diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java
+index 2f343eaf0c2216702fd614dbec98ac3d46ef5b2e..0e8c337dde0cfa2ac289c79904ecd2affc86d70a 100644
+--- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java
+@@ -61,7 +61,7 @@ public class CactusBlock extends Block {
+ ;
+ }
+
+- if (i < 3) {
++ if (i < world.paperConfig().maxGrowthHeight.cactus) { // Paper - Configurable cactus/bamboo/reed growth height
+ int j = (Integer) state.getValue(CactusBlock.AGE);
+
+ int modifier = world.spigotConfig.cactusModifier; // Spigot - SPIGOT-7159: Better modifier resolution
+diff --git a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
+index 47d4fc5bcf2657078abc7a2637b6337fc0ea0977..04957d461d0e968d443737068aaeec1d0bce78b2 100644
+--- a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
++++ b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
+@@ -59,7 +59,7 @@ public class SugarCaneBlock extends Block {
+ ;
+ }
+
+- if (i < 3) {
++ if (i < world.paperConfig().maxGrowthHeight.reeds) { // Paper - Configurable cactus/bamboo/reed growth heigh
+ int j = (Integer) state.getValue(SugarCaneBlock.AGE);
+
+ int modifier = world.spigotConfig.caneModifier; // Spigot - SPIGOT-7159: Better modifier resolution
diff --git a/patches/server/0021-Configurable-baby-zombie-movement-speed.patch b/patches/server/0020-Configurable-baby-zombie-movement-speed.patch
similarity index 100%
rename from patches/server/0021-Configurable-baby-zombie-movement-speed.patch
rename to patches/server/0020-Configurable-baby-zombie-movement-speed.patch
diff --git a/patches/server/0020-Configurable-cactus-bamboo-and-reed-growth-height.patch b/patches/server/0020-Configurable-cactus-bamboo-and-reed-growth-height.patch
deleted file mode 100644
index 195e55198ac5..000000000000
--- a/patches/server/0020-Configurable-cactus-bamboo-and-reed-growth-height.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown
-Date: Tue, 1 Mar 2016 13:02:51 -0600
-Subject: [PATCH] Configurable cactus bamboo and reed growth height
-
-Bamboo - Both the minimum fully-grown height and the maximum are configurable
-- Machine_Maker
-
-diff --git a/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java b/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java
-index bd72deadb59289ae90afc379ee61e8198ddaf4ed..e8dc4ea90d74036dacb0785fcb9125df192a4c22 100644
---- a/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/BambooStalkBlock.java
-@@ -137,7 +137,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
- if (random.nextFloat() < (world.spigotConfig.bambooModifier / (100.0f * 3)) && world.isEmptyBlock(pos.above()) && world.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution
- int i = this.getHeightBelowUpToMax(world, pos) + 1;
-
-- if (i < 16) {
-+ if (i < world.paperConfig().maxGrowthHeight.bamboo.max) { // Paper - Configurable cactus/bamboo/reed growth height
- this.growBamboo(state, world, pos, random, i);
- }
- }
-@@ -168,7 +168,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
- int i = this.getHeightAboveUpToMax(world, pos);
- int j = this.getHeightBelowUpToMax(world, pos);
-
-- return i + j + 1 < 16 && (Integer) world.getBlockState(pos.above(i)).getValue(BambooStalkBlock.STAGE) != 1;
-+ return i + j + 1 < ((Level) world).paperConfig().maxGrowthHeight.bamboo.max && (Integer) world.getBlockState(pos.above(i)).getValue(BambooStalkBlock.STAGE) != 1; // Paper - Configurable cactus/bamboo/reed growth height
- }
-
- @Override
-@@ -187,7 +187,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
- BlockPos blockposition1 = pos.above(i);
- BlockState iblockdata1 = world.getBlockState(blockposition1);
-
-- if (k >= 16 || !iblockdata1.is(Blocks.BAMBOO) || (Integer) iblockdata1.getValue(BambooStalkBlock.STAGE) == 1 || !world.isEmptyBlock(blockposition1.above())) { // CraftBukkit - If the BlockSpreadEvent was cancelled, we have no bamboo here
-+ if (k >= world.paperConfig().maxGrowthHeight.bamboo.max || !iblockdata1.is(Blocks.BAMBOO) || (Integer) iblockdata1.getValue(BambooStalkBlock.STAGE) == 1 || !world.isEmptyBlock(blockposition1.above())) { // CraftBukkit - If the BlockSpreadEvent was cancelled, we have no bamboo here // Paper - Configurable cactus/bamboo/reed growth height
- return;
- }
-
-@@ -228,7 +228,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
- }
-
- int j = (Integer) state.getValue(BambooStalkBlock.AGE) != 1 && !iblockdata2.is(Blocks.BAMBOO) ? 0 : 1;
-- int k = (height < 11 || random.nextFloat() >= 0.25F) && height != 15 ? 0 : 1;
-+ int k = (height < world.paperConfig().maxGrowthHeight.bamboo.min || random.nextFloat() >= 0.25F) && height != (world.paperConfig().maxGrowthHeight.bamboo.max - 1) ? 0 : 1; // Paper - Configurable cactus/bamboo/reed growth height
-
- // CraftBukkit start
- if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(world, pos, pos.above(), (BlockState) ((BlockState) ((BlockState) this.defaultBlockState().setValue(BambooStalkBlock.AGE, j)).setValue(BambooStalkBlock.LEAVES, blockpropertybamboosize)).setValue(BambooStalkBlock.STAGE, k), 3)) {
-@@ -243,7 +243,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
- protected int getHeightAboveUpToMax(BlockGetter world, BlockPos pos) {
- int i;
-
-- for (i = 0; i < 16 && world.getBlockState(pos.above(i + 1)).is(Blocks.BAMBOO); ++i) {
-+ for (i = 0; i < ((Level) world).paperConfig().maxGrowthHeight.bamboo.max && world.getBlockState(pos.above(i + 1)).is(Blocks.BAMBOO); ++i) { // Paper - Configurable cactus/bamboo/reed growth height
- ;
- }
-
-@@ -253,7 +253,7 @@ public class BambooStalkBlock extends Block implements BonemealableBlock {
- protected int getHeightBelowUpToMax(BlockGetter world, BlockPos pos) {
- int i;
-
-- for (i = 0; i < 16 && world.getBlockState(pos.below(i + 1)).is(Blocks.BAMBOO); ++i) {
-+ for (i = 0; i < ((Level) world).paperConfig().maxGrowthHeight.bamboo.max && world.getBlockState(pos.below(i + 1)).is(Blocks.BAMBOO); ++i) { // Paper - Configurable cactus/bamboo/reed growth height
- ;
- }
-
-diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java
-index fcd5b593c79aab42928cb1ddd0e6c1b03b7bafaf..581870d23e4deca85ae94bffac2011b69650c23d 100644
---- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java
-@@ -61,7 +61,7 @@ public class CactusBlock extends Block {
- ;
- }
-
-- if (i < 3) {
-+ if (i < world.paperConfig().maxGrowthHeight.cactus) { // Paper - Configurable cactus/bamboo/reed growth height
- int j = (Integer) state.getValue(CactusBlock.AGE);
-
- int modifier = world.spigotConfig.cactusModifier; // Spigot - SPIGOT-7159: Better modifier resolution
-diff --git a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
-index 47d4fc5bcf2657078abc7a2637b6337fc0ea0977..04957d461d0e968d443737068aaeec1d0bce78b2 100644
---- a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
-@@ -59,7 +59,7 @@ public class SugarCaneBlock extends Block {
- ;
- }
-
-- if (i < 3) {
-+ if (i < world.paperConfig().maxGrowthHeight.reeds) { // Paper - Configurable cactus/bamboo/reed growth heigh
- int j = (Integer) state.getValue(SugarCaneBlock.AGE);
-
- int modifier = world.spigotConfig.caneModifier; // Spigot - SPIGOT-7159: Better modifier resolution
diff --git a/patches/server/0022-Configurable-fishing-time-ranges.patch b/patches/server/0021-Configurable-fishing-time-ranges.patch
similarity index 100%
rename from patches/server/0022-Configurable-fishing-time-ranges.patch
rename to patches/server/0021-Configurable-fishing-time-ranges.patch
diff --git a/patches/server/0022-Allow-nerfed-mobs-to-jump.patch b/patches/server/0022-Allow-nerfed-mobs-to-jump.patch
new file mode 100644
index 000000000000..963c4fa03270
--- /dev/null
+++ b/patches/server/0022-Allow-nerfed-mobs-to-jump.patch
@@ -0,0 +1,47 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Tue, 1 Mar 2016 13:24:16 -0600
+Subject: [PATCH] Allow nerfed mobs to jump
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
+index fc264864d4a6f56f94d884f4892257452b360b73..b86ad4fbf1245c4c040d84daf9f93bd1aee6beae 100644
+--- a/src/main/java/net/minecraft/world/entity/Mob.java
++++ b/src/main/java/net/minecraft/world/entity/Mob.java
+@@ -112,6 +112,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+ private final BodyRotationControl bodyRotationControl;
+ protected PathNavigation navigation;
+ public GoalSelector goalSelector;
++ @Nullable public net.minecraft.world.entity.ai.goal.FloatGoal goalFloat; // Paper - Allow nerfed mobs to jump and float
+ public GoalSelector targetSelector;
+ @Nullable
+ private LivingEntity target;
+@@ -877,7 +878,15 @@ public abstract class Mob extends LivingEntity implements Targeting {
+ @Override
+ protected final void serverAiStep() {
+ ++this.noActionTime;
+- if (!this.aware) return; // CraftBukkit
++ // Paper start - Allow nerfed mobs to jump and float
++ if (!this.aware) {
++ if (goalFloat != null) {
++ if (goalFloat.canUse()) goalFloat.tick();
++ this.getJumpControl().tick();
++ }
++ return;
++ }
++ // Paper end - Allow nerfed mobs to jump and float
+ this.level().getProfiler().push("sensing");
+ this.sensing.tick();
+ this.level().getProfiler().pop();
+diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
+index 01950951ea06e43bedeeede489a112e577617829..60a62781fcfe4c598c308a7ce2b0dcf72c0895ae 100644
+--- a/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
++++ b/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
+@@ -9,6 +9,7 @@ public class FloatGoal extends Goal {
+
+ public FloatGoal(Mob mob) {
+ this.mob = mob;
++ if (mob.getCommandSenderWorld().paperConfig().entities.behavior.spawnerNerfedMobsShouldJump) mob.goalFloat = this; // Paper - Allow nerfed mobs to jump and float
+ this.setFlags(EnumSet.of(Goal.Flag.JUMP));
+ mob.getNavigation().setCanFloat(true);
+ }
diff --git a/patches/server/0023-Add-configurable-entity-despawn-distances.patch b/patches/server/0023-Add-configurable-entity-despawn-distances.patch
new file mode 100644
index 000000000000..dca9b87b3b4e
--- /dev/null
+++ b/patches/server/0023-Add-configurable-entity-despawn-distances.patch
@@ -0,0 +1,27 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Suddenly
+Date: Tue, 1 Mar 2016 13:51:54 -0600
+Subject: [PATCH] Add configurable entity despawn distances
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
+index b86ad4fbf1245c4c040d84daf9f93bd1aee6beae..1de4c45f1a3a69e63eccf063be5516b163f7882a 100644
+--- a/src/main/java/net/minecraft/world/entity/Mob.java
++++ b/src/main/java/net/minecraft/world/entity/Mob.java
+@@ -853,14 +853,14 @@ public abstract class Mob extends LivingEntity implements Targeting {
+
+ if (entityhuman != null) {
+ double d0 = entityhuman.distanceToSqr((Entity) this);
+- int i = this.getType().getCategory().getDespawnDistance();
++ int i = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()).hard(); // Paper - Configurable despawn distances
+ int j = i * i;
+
+ if (d0 > (double) j && this.removeWhenFarAway(d0)) {
+ this.discard();
+ }
+
+- int k = this.getType().getCategory().getNoDespawnDistance();
++ int k = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()).soft(); // Paper - Configurable despawn distances
+ int l = k * k;
+
+ if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && d0 > (double) l && this.removeWhenFarAway(d0)) {
diff --git a/patches/server/0023-Allow-nerfed-mobs-to-jump.patch b/patches/server/0023-Allow-nerfed-mobs-to-jump.patch
deleted file mode 100644
index 6cd56c73a4ee..000000000000
--- a/patches/server/0023-Allow-nerfed-mobs-to-jump.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown
-Date: Tue, 1 Mar 2016 13:24:16 -0600
-Subject: [PATCH] Allow nerfed mobs to jump
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 01761d37c9e4be4e498b62c7612885648b2968a6..093c60df0948fd1a46aef86223ecc63bc9e8b440 100644
---- a/src/main/java/net/minecraft/world/entity/Mob.java
-+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -112,6 +112,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
- private final BodyRotationControl bodyRotationControl;
- protected PathNavigation navigation;
- public GoalSelector goalSelector;
-+ @Nullable public net.minecraft.world.entity.ai.goal.FloatGoal goalFloat; // Paper - Allow nerfed mobs to jump and float
- public GoalSelector targetSelector;
- @Nullable
- private LivingEntity target;
-@@ -877,7 +878,15 @@ public abstract class Mob extends LivingEntity implements Targeting {
- @Override
- protected final void serverAiStep() {
- ++this.noActionTime;
-- if (!this.aware) return; // CraftBukkit
-+ // Paper start - Allow nerfed mobs to jump and float
-+ if (!this.aware) {
-+ if (goalFloat != null) {
-+ if (goalFloat.canUse()) goalFloat.tick();
-+ this.getJumpControl().tick();
-+ }
-+ return;
-+ }
-+ // Paper end - Allow nerfed mobs to jump and float
- this.level().getProfiler().push("sensing");
- this.sensing.tick();
- this.level().getProfiler().pop();
-diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
-index 01950951ea06e43bedeeede489a112e577617829..60a62781fcfe4c598c308a7ce2b0dcf72c0895ae 100644
---- a/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
-+++ b/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
-@@ -9,6 +9,7 @@ public class FloatGoal extends Goal {
-
- public FloatGoal(Mob mob) {
- this.mob = mob;
-+ if (mob.getCommandSenderWorld().paperConfig().entities.behavior.spawnerNerfedMobsShouldJump) mob.goalFloat = this; // Paper - Allow nerfed mobs to jump and float
- this.setFlags(EnumSet.of(Goal.Flag.JUMP));
- mob.getNavigation().setCanFloat(true);
- }
diff --git a/patches/server/0024-Add-configurable-entity-despawn-distances.patch b/patches/server/0024-Add-configurable-entity-despawn-distances.patch
deleted file mode 100644
index 600e13736cd2..000000000000
--- a/patches/server/0024-Add-configurable-entity-despawn-distances.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Suddenly
-Date: Tue, 1 Mar 2016 13:51:54 -0600
-Subject: [PATCH] Add configurable entity despawn distances
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 093c60df0948fd1a46aef86223ecc63bc9e8b440..7cbb74f4bc7b63af86b7b2c52783fb20c7739258 100644
---- a/src/main/java/net/minecraft/world/entity/Mob.java
-+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -853,14 +853,14 @@ public abstract class Mob extends LivingEntity implements Targeting {
-
- if (entityhuman != null) {
- double d0 = entityhuman.distanceToSqr((Entity) this);
-- int i = this.getType().getCategory().getDespawnDistance();
-+ int i = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()).hard(); // Paper - Configurable despawn distances
- int j = i * i;
-
- if (d0 > (double) j && this.removeWhenFarAway(d0)) {
- this.discard();
- }
-
-- int k = this.getType().getCategory().getNoDespawnDistance();
-+ int k = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory()).soft(); // Paper - Configurable despawn distances
- int l = k * k;
-
- if (this.noActionTime > 600 && this.random.nextInt(800) == 0 && d0 > (double) l && this.removeWhenFarAway(d0)) {
diff --git a/patches/server/0025-Allow-for-toggling-of-spawn-chunks.patch b/patches/server/0024-Allow-for-toggling-of-spawn-chunks.patch
similarity index 100%
rename from patches/server/0025-Allow-for-toggling-of-spawn-chunks.patch
rename to patches/server/0024-Allow-for-toggling-of-spawn-chunks.patch
diff --git a/patches/server/0025-Drop-falling-block-and-tnt-entities-at-the-specified.patch b/patches/server/0025-Drop-falling-block-and-tnt-entities-at-the-specified.patch
new file mode 100644
index 000000000000..79d4064bb479
--- /dev/null
+++ b/patches/server/0025-Drop-falling-block-and-tnt-entities-at-the-specified.patch
@@ -0,0 +1,62 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Byteflux
+Date: Tue, 1 Mar 2016 14:14:15 -0600
+Subject: [PATCH] Drop falling block and tnt entities at the specified height
+
+Co-authored-by: Jake Potrebic
+
+diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
+index 66c0b74a41cb9e7403826b4fd54a8575d6f16faa..ee5ef4fe16ce6397bba30900b9c6690e3c4f51e6 100644
+--- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
++++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
+@@ -142,6 +142,16 @@ public class FallingBlockEntity extends Entity {
+ }
+
+ this.move(MoverType.SELF, this.getDeltaMovement());
++ // Paper start - Configurable falling blocks height nerf
++ if (this.level().paperConfig().fixes.fallingBlockHeightNerf.test(v -> this.getY() > v)) {
++ if (this.dropItem && this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
++ this.spawnAtLocation(block);
++ }
++
++ this.discard();
++ return;
++ }
++ // Paper end - Configurable falling blocks height nerf
+ if (!this.level().isClientSide) {
+ BlockPos blockposition = this.blockPosition();
+ boolean flag = this.blockState.getBlock() instanceof ConcretePowderBlock;
+diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
+index 36d93ee421406302c05945db17d46b04b485e4c0..19e2f2005bd1fb4d199debd34e92a0794a3d3fe4 100644
+--- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
++++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
+@@ -77,6 +77,12 @@ public class PrimedTnt extends Entity implements TraceableEntity {
+ }
+
+ this.move(MoverType.SELF, this.getDeltaMovement());
++ // Paper start - Configurable TNT height nerf
++ if (this.level().paperConfig().fixes.tntEntityHeightNerf.test(v -> this.getY() > v)) {
++ this.discard();
++ return;
++ }
++ // Paper end - Configurable TNT height nerf
+ this.setDeltaMovement(this.getDeltaMovement().scale(0.98D));
+ if (this.onGround()) {
+ this.setDeltaMovement(this.getDeltaMovement().multiply(0.7D, -0.5D, 0.7D));
+diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java
+index 0fc58f38bbd855414ad36b682e60b069d7b68cb1..48f531da21fa0305ab1e8d5b50276e61e3155a38 100644
+--- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java
++++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java
+@@ -53,6 +53,12 @@ public class MinecartTNT extends AbstractMinecart {
+ public void tick() {
+ super.tick();
+ if (this.fuse > 0) {
++ // Paper start - Configurable TNT height nerf
++ if (this.level().paperConfig().fixes.tntEntityHeightNerf.test(v -> this.getY() > v)) {
++ this.discard();
++ return;
++ }
++ // Paper end - Configurable TNT height nerf
+ --this.fuse;
+ this.level().addParticle(ParticleTypes.SMOKE, this.getX(), this.getY() + 0.5D, this.getZ(), 0.0D, 0.0D, 0.0D);
+ } else if (this.fuse == 0) {
diff --git a/patches/server/0026-Drop-falling-block-and-tnt-entities-at-the-specified.patch b/patches/server/0026-Drop-falling-block-and-tnt-entities-at-the-specified.patch
deleted file mode 100644
index 21eaaaa49e2e..000000000000
--- a/patches/server/0026-Drop-falling-block-and-tnt-entities-at-the-specified.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Byteflux
-Date: Tue, 1 Mar 2016 14:14:15 -0600
-Subject: [PATCH] Drop falling block and tnt entities at the specified height
-
-Co-authored-by: Jake Potrebic
-
-diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
-index d344b13e3726f0fe8a57c098769d1beea9705cdd..67088152004caeecf4a678618be19419862e7ff1 100644
---- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
-+++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
-@@ -142,6 +142,16 @@ public class FallingBlockEntity extends Entity {
- }
-
- this.move(MoverType.SELF, this.getDeltaMovement());
-+ // Paper start - Configurable falling blocks height nerf
-+ if (this.level().paperConfig().fixes.fallingBlockHeightNerf.test(v -> this.getY() > v)) {
-+ if (this.dropItem && this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
-+ this.spawnAtLocation(block);
-+ }
-+
-+ this.discard();
-+ return;
-+ }
-+ // Paper end - Configurable falling blocks height nerf
- if (!this.level().isClientSide) {
- BlockPos blockposition = this.blockPosition();
- boolean flag = this.blockState.getBlock() instanceof ConcretePowderBlock;
-diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
-index 36d93ee421406302c05945db17d46b04b485e4c0..19e2f2005bd1fb4d199debd34e92a0794a3d3fe4 100644
---- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
-+++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
-@@ -77,6 +77,12 @@ public class PrimedTnt extends Entity implements TraceableEntity {
- }
-
- this.move(MoverType.SELF, this.getDeltaMovement());
-+ // Paper start - Configurable TNT height nerf
-+ if (this.level().paperConfig().fixes.tntEntityHeightNerf.test(v -> this.getY() > v)) {
-+ this.discard();
-+ return;
-+ }
-+ // Paper end - Configurable TNT height nerf
- this.setDeltaMovement(this.getDeltaMovement().scale(0.98D));
- if (this.onGround()) {
- this.setDeltaMovement(this.getDeltaMovement().multiply(0.7D, -0.5D, 0.7D));
-diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java
-index 0fc58f38bbd855414ad36b682e60b069d7b68cb1..48f531da21fa0305ab1e8d5b50276e61e3155a38 100644
---- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java
-+++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartTNT.java
-@@ -53,6 +53,12 @@ public class MinecartTNT extends AbstractMinecart {
- public void tick() {
- super.tick();
- if (this.fuse > 0) {
-+ // Paper start - Configurable TNT height nerf
-+ if (this.level().paperConfig().fixes.tntEntityHeightNerf.test(v -> this.getY() > v)) {
-+ this.discard();
-+ return;
-+ }
-+ // Paper end - Configurable TNT height nerf
- --this.fuse;
- this.level().addParticle(ParticleTypes.SMOKE, this.getX(), this.getY() + 0.5D, this.getZ(), 0.0D, 0.0D, 0.0D);
- } else if (this.fuse == 0) {
diff --git a/patches/server/0026-Show-Paper-in-client-crashes-server-lists-and-Mojang.patch b/patches/server/0026-Show-Paper-in-client-crashes-server-lists-and-Mojang.patch
new file mode 100644
index 000000000000..06b6b9aded66
--- /dev/null
+++ b/patches/server/0026-Show-Paper-in-client-crashes-server-lists-and-Mojang.patch
@@ -0,0 +1,104 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Tue, 1 Mar 2016 14:32:43 -0600
+Subject: [PATCH] Show 'Paper' in client crashes, server lists, and Mojang
+ stats
+
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index f32aa4e03ae02d1449101c4aa89c8e0c0fa26ba5..c6ce55d48fc71ea097a4a279fcd0dd1d4086be9b 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -1615,7 +1615,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // CraftBukkit - cb > vanilla!
++ return "Paper"; // Paper
+ }
+
+ public SystemReport fillSystemReport(SystemReport details) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index 48c40f12649735f14204c516eace6905b2ac0019..56a63adc3c0c919594c3f2646d4cf5b86b5c6f1e 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -263,7 +263,7 @@ import org.yaml.snakeyaml.error.MarkedYAMLException;
+ import net.md_5.bungee.api.chat.BaseComponent; // Spigot
+
+ public final class CraftServer implements Server {
+- private final String serverName = "CraftBukkit";
++ private final String serverName = "Paper"; // Paper
+ private final String serverVersion;
+ private final String bukkitVersion = Versioning.getBukkitVersion();
+ private final Logger logger = Logger.getLogger("Minecraft");
+diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
+index c312c450055965d63db0ccdee8aa8e34e7051d0b..9f4c5a6f22719ae30d88ca02a1db4a3f39957943 100644
+--- a/src/main/java/org/bukkit/craftbukkit/Main.java
++++ b/src/main/java/org/bukkit/craftbukkit/Main.java
+@@ -241,12 +241,25 @@ public class Main {
+ deadline.add(Calendar.DAY_OF_YEAR, -7);
+ if (buildDate.before(deadline.getTime())) {
+ System.err.println("*** Error, this build is outdated ***");
+- System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***");
++ System.err.println("*** Please download a new build as per instructions from https://papermc.io/downloads/paper ***"); // Paper
+ System.err.println("*** Server will start in 20 seconds ***");
+ Thread.sleep(TimeUnit.SECONDS.toMillis(20));
+ }
+ }
+
++ // Paper start - Log Java and OS versioning to help with debugging plugin issues
++ java.lang.management.RuntimeMXBean runtimeMX = java.lang.management.ManagementFactory.getRuntimeMXBean();
++ java.lang.management.OperatingSystemMXBean osMX = java.lang.management.ManagementFactory.getOperatingSystemMXBean();
++ if (runtimeMX != null && osMX != null) {
++ String javaInfo = "Java " + runtimeMX.getSpecVersion() + " (" + runtimeMX.getVmName() + " " + runtimeMX.getVmVersion() + ")";
++ String osInfo = "Host: " + osMX.getName() + " " + osMX.getVersion() + " (" + osMX.getArch() + ")";
++
++ System.out.println("System Info: " + javaInfo + " " + osInfo);
++ } else {
++ System.out.println("Unable to read system info");
++ }
++ // Paper end - Log Java and OS versioning to help with debugging plugin issues
++
+ System.out.println("Loading libraries, please wait...");
+ net.minecraft.server.Main.main(options);
+ } catch (Throwable t) {
+diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
+index c4bf7053d83d207caca0e13e19f5c1afa7062de3..231b4e3552b17f7803815a433a5ece440c227cc6 100644
+--- a/src/main/java/org/spigotmc/WatchdogThread.java
++++ b/src/main/java/org/spigotmc/WatchdogThread.java
+@@ -19,7 +19,7 @@ public class WatchdogThread extends Thread
+
+ private WatchdogThread(long timeoutTime, boolean restart)
+ {
+- super( "Spigot Watchdog Thread" );
++ super( "Paper Watchdog Thread" );
+ this.timeoutTime = timeoutTime;
+ this.restart = restart;
+ }
+@@ -65,14 +65,14 @@ public class WatchdogThread extends Thread
+ {
+ Logger log = Bukkit.getServer().getLogger();
+ log.log( Level.SEVERE, "------------------------------" );
+- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Spigot bug." );
++ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug." ); // Paper
+ log.log( Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author" );
+ log.log( Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring" );
+ log.log( Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once" );
+ log.log( Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes" );
+- log.log( Level.SEVERE, "If you are unsure or still think this is a Spigot bug, please report to https://www.spigotmc.org/" );
++ log.log( Level.SEVERE, "If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" );
+ log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" );
+- log.log( Level.SEVERE, "Spigot version: " + Bukkit.getServer().getVersion() );
++ log.log( Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion() );
+ //
+ if ( net.minecraft.world.level.Level.lastPhysicsProblem != null )
+ {
+@@ -82,7 +82,7 @@ public class WatchdogThread extends Thread
+ }
+ //
+ log.log( Level.SEVERE, "------------------------------" );
+- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Spigot!):" );
++ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper
+ WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
+ log.log( Level.SEVERE, "------------------------------" );
+ //
diff --git a/patches/server/0027-Implement-Paper-VersionChecker.patch b/patches/server/0027-Implement-Paper-VersionChecker.patch
new file mode 100644
index 000000000000..11cae6752054
--- /dev/null
+++ b/patches/server/0027-Implement-Paper-VersionChecker.patch
@@ -0,0 +1,157 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Mon, 27 May 2019 03:40:05 -0500
+Subject: [PATCH] Implement Paper VersionChecker
+
+
+diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..22a55be34fde453fedd987173d95b8b347a03588
+--- /dev/null
++++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
+@@ -0,0 +1,129 @@
++package com.destroystokyo.paper;
++
++import com.destroystokyo.paper.util.VersionFetcher;
++import com.google.common.base.Charsets;
++import com.google.common.io.Resources;
++import com.google.gson.*;
++import net.kyori.adventure.text.Component;
++import net.kyori.adventure.text.event.ClickEvent;
++import net.kyori.adventure.text.format.NamedTextColor;
++
++import javax.annotation.Nonnull;
++import javax.annotation.Nullable;
++import java.io.*;
++import java.net.HttpURLConnection;
++import java.net.URL;
++import java.util.stream.StreamSupport;
++
++public class PaperVersionFetcher implements VersionFetcher {
++ private static final java.util.regex.Pattern VER_PATTERN = java.util.regex.Pattern.compile("^([0-9\\.]*)\\-.*R"); // R is an anchor, will always give '-R' at end
++ private static final String GITHUB_BRANCH_NAME = "master";
++ private static final String DOWNLOAD_PAGE = "https://papermc.io/downloads/paper";
++ private static @Nullable String mcVer;
++
++ @Override
++ public long getCacheTime() {
++ return 720000;
++ }
++
++ @Nonnull
++ @Override
++ public Component getVersionMessage(@Nonnull String serverVersion) {
++ String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]");
++ return getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]);
++ }
++
++ private static @Nullable String getMinecraftVersion() {
++ if (mcVer == null) {
++ java.util.regex.Matcher matcher = VER_PATTERN.matcher(org.bukkit.Bukkit.getBukkitVersion());
++ if (matcher.find()) {
++ String result = matcher.group();
++ mcVer = result.substring(0, result.length() - 2); // strip 'R' anchor and trailing '-'
++ } else {
++ org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to PaperMC!");
++ org.bukkit.Bukkit.getLogger().warning("Pattern: " + VER_PATTERN.toString());
++ org.bukkit.Bukkit.getLogger().warning("Version: " + org.bukkit.Bukkit.getBukkitVersion());
++ }
++ }
++
++ return mcVer;
++ }
++
++ private static Component getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) {
++ int distance;
++ try {
++ int jenkinsBuild = Integer.parseInt(versionInfo);
++ distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion());
++ } catch (NumberFormatException ignored) {
++ versionInfo = versionInfo.replace("\"", "");
++ distance = fetchDistanceFromGitHub(repo, branch, versionInfo);
++ }
++
++ switch (distance) {
++ case -1:
++ return Component.text("Error obtaining version information", NamedTextColor.YELLOW);
++ case 0:
++ return Component.text("You are running the latest version", NamedTextColor.GREEN);
++ case -2:
++ return Component.text("Unknown version", NamedTextColor.YELLOW);
++ default:
++ return Component.text("You are " + distance + " version(s) behind", NamedTextColor.YELLOW)
++ .append(Component.newline())
++ .append(Component.text("Download the new version at: ")
++ .append(Component.text(DOWNLOAD_PAGE, NamedTextColor.GOLD)
++ .hoverEvent(Component.text("Click to open", NamedTextColor.WHITE))
++ .clickEvent(ClickEvent.openUrl(DOWNLOAD_PAGE))));
++ }
++ }
++
++ private static int fetchDistanceFromSiteApi(int jenkinsBuild, @Nullable String siteApiVersion) {
++ if (siteApiVersion == null) { return -1; }
++ try {
++ try (BufferedReader reader = Resources.asCharSource(
++ new URL("https://api.papermc.io/v2/projects/paper/versions/" + siteApiVersion),
++ Charsets.UTF_8
++ ).openBufferedStream()) {
++ JsonObject json = new Gson().fromJson(reader, JsonObject.class);
++ JsonArray builds = json.getAsJsonArray("builds");
++ int latest = StreamSupport.stream(builds.spliterator(), false)
++ .mapToInt(e -> e.getAsInt())
++ .max()
++ .getAsInt();
++ return latest - jenkinsBuild;
++ } catch (JsonSyntaxException ex) {
++ ex.printStackTrace();
++ return -1;
++ }
++ } catch (IOException e) {
++ e.printStackTrace();
++ return -1;
++ }
++ }
++
++ // Contributed by Techcable in GH-65
++ private static int fetchDistanceFromGitHub(@Nonnull String repo, @Nonnull String branch, @Nonnull String hash) {
++ try {
++ HttpURLConnection connection = (HttpURLConnection) new URL("https://api.github.com/repos/" + repo + "/compare/" + branch + "..." + hash).openConnection();
++ connection.connect();
++ if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) return -2; // Unknown commit
++ try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) {
++ JsonObject obj = new Gson().fromJson(reader, JsonObject.class);
++ String status = obj.get("status").getAsString();
++ switch (status) {
++ case "identical":
++ return 0;
++ case "behind":
++ return obj.get("behind_by").getAsInt();
++ default:
++ return -1;
++ }
++ } catch (JsonSyntaxException | NumberFormatException e) {
++ e.printStackTrace();
++ return -1;
++ }
++ } catch (IOException e) {
++ e.printStackTrace();
++ return -1;
++ }
++ }
++}
+diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+index 5e541636b216d4f46be18b1031522bd92e667b67..d11773ed44936f8836f2f8e582d5e9573af5b439 100644
+--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+@@ -468,6 +468,11 @@ public final class CraftMagicNumbers implements UnsafeValues {
+ public String getTimingsServerName() {
+ return io.papermc.paper.configuration.GlobalConfiguration.get().timings.serverName;
+ }
++
++ @Override
++ public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {
++ return new com.destroystokyo.paper.PaperVersionFetcher();
++ }
+ // Paper end
+
+ /**
diff --git a/patches/server/0027-Show-Paper-in-client-crashes-server-lists-and-Mojang.patch b/patches/server/0027-Show-Paper-in-client-crashes-server-lists-and-Mojang.patch
deleted file mode 100644
index 139de649848e..000000000000
--- a/patches/server/0027-Show-Paper-in-client-crashes-server-lists-and-Mojang.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown
-Date: Tue, 1 Mar 2016 14:32:43 -0600
-Subject: [PATCH] Show 'Paper' in client crashes, server lists, and Mojang
- stats
-
-
-diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index c99da8c4810385600470a0c3b4c03670edd0759b..107a04f6c5889e98c183a932ad158fb5b6591a10 100644
---- a/src/main/java/net/minecraft/server/MinecraftServer.java
-+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1615,7 +1615,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // CraftBukkit - cb > vanilla!
-+ return "Paper"; // Paper
- }
-
- public SystemReport fillSystemReport(SystemReport details) {
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 3b2f99617a519c2c2f60b88a4679064c01e5d958..9b85ec9e9a66a5bc0c98598531102f01e597f525 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -261,7 +261,7 @@ import org.yaml.snakeyaml.error.MarkedYAMLException;
- import net.md_5.bungee.api.chat.BaseComponent; // Spigot
-
- public final class CraftServer implements Server {
-- private final String serverName = "CraftBukkit";
-+ private final String serverName = "Paper"; // Paper
- private final String serverVersion;
- private final String bukkitVersion = Versioning.getBukkitVersion();
- private final Logger logger = Logger.getLogger("Minecraft");
-diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
-index c312c450055965d63db0ccdee8aa8e34e7051d0b..9f4c5a6f22719ae30d88ca02a1db4a3f39957943 100644
---- a/src/main/java/org/bukkit/craftbukkit/Main.java
-+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
-@@ -241,12 +241,25 @@ public class Main {
- deadline.add(Calendar.DAY_OF_YEAR, -7);
- if (buildDate.before(deadline.getTime())) {
- System.err.println("*** Error, this build is outdated ***");
-- System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***");
-+ System.err.println("*** Please download a new build as per instructions from https://papermc.io/downloads/paper ***"); // Paper
- System.err.println("*** Server will start in 20 seconds ***");
- Thread.sleep(TimeUnit.SECONDS.toMillis(20));
- }
- }
-
-+ // Paper start - Log Java and OS versioning to help with debugging plugin issues
-+ java.lang.management.RuntimeMXBean runtimeMX = java.lang.management.ManagementFactory.getRuntimeMXBean();
-+ java.lang.management.OperatingSystemMXBean osMX = java.lang.management.ManagementFactory.getOperatingSystemMXBean();
-+ if (runtimeMX != null && osMX != null) {
-+ String javaInfo = "Java " + runtimeMX.getSpecVersion() + " (" + runtimeMX.getVmName() + " " + runtimeMX.getVmVersion() + ")";
-+ String osInfo = "Host: " + osMX.getName() + " " + osMX.getVersion() + " (" + osMX.getArch() + ")";
-+
-+ System.out.println("System Info: " + javaInfo + " " + osInfo);
-+ } else {
-+ System.out.println("Unable to read system info");
-+ }
-+ // Paper end - Log Java and OS versioning to help with debugging plugin issues
-+
- System.out.println("Loading libraries, please wait...");
- net.minecraft.server.Main.main(options);
- } catch (Throwable t) {
-diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
-index c4bf7053d83d207caca0e13e19f5c1afa7062de3..231b4e3552b17f7803815a433a5ece440c227cc6 100644
---- a/src/main/java/org/spigotmc/WatchdogThread.java
-+++ b/src/main/java/org/spigotmc/WatchdogThread.java
-@@ -19,7 +19,7 @@ public class WatchdogThread extends Thread
-
- private WatchdogThread(long timeoutTime, boolean restart)
- {
-- super( "Spigot Watchdog Thread" );
-+ super( "Paper Watchdog Thread" );
- this.timeoutTime = timeoutTime;
- this.restart = restart;
- }
-@@ -65,14 +65,14 @@ public class WatchdogThread extends Thread
- {
- Logger log = Bukkit.getServer().getLogger();
- log.log( Level.SEVERE, "------------------------------" );
-- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Spigot bug." );
-+ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug." ); // Paper
- log.log( Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author" );
- log.log( Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring" );
- log.log( Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once" );
- log.log( Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes" );
-- log.log( Level.SEVERE, "If you are unsure or still think this is a Spigot bug, please report to https://www.spigotmc.org/" );
-+ log.log( Level.SEVERE, "If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" );
- log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" );
-- log.log( Level.SEVERE, "Spigot version: " + Bukkit.getServer().getVersion() );
-+ log.log( Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion() );
- //
- if ( net.minecraft.world.level.Level.lastPhysicsProblem != null )
- {
-@@ -82,7 +82,7 @@ public class WatchdogThread extends Thread
- }
- //
- log.log( Level.SEVERE, "------------------------------" );
-- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Spigot!):" );
-+ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper
- WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
- log.log( Level.SEVERE, "------------------------------" );
- //
diff --git a/patches/server/0028-Add-version-history-to-version-command.patch b/patches/server/0028-Add-version-history-to-version-command.patch
new file mode 100644
index 000000000000..53590f6fd671
--- /dev/null
+++ b/patches/server/0028-Add-version-history-to-version-command.patch
@@ -0,0 +1,222 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Kyle Wood
+Date: Thu, 1 Mar 2018 19:37:52 -0600
+Subject: [PATCH] Add version history to version command
+
+
+diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
+index 22a55be34fde453fedd987173d95b8b347a03588..9d687da5bdf398bb3f6c84cdf1249a7213d09f2e 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
++++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
+@@ -7,6 +7,8 @@ import com.google.gson.*;
+ import net.kyori.adventure.text.Component;
+ import net.kyori.adventure.text.event.ClickEvent;
+ import net.kyori.adventure.text.format.NamedTextColor;
++import net.kyori.adventure.text.format.TextDecoration;
++import net.kyori.adventure.text.TextComponent;
+
+ import javax.annotation.Nonnull;
+ import javax.annotation.Nullable;
+@@ -30,7 +32,10 @@ public class PaperVersionFetcher implements VersionFetcher {
+ @Override
+ public Component getVersionMessage(@Nonnull String serverVersion) {
+ String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]");
+- return getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]);
++ final Component updateMessage = getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]);
++ final Component history = getHistory();
++
++ return history != null ? TextComponent.ofChildren(updateMessage, Component.newline(), history) : updateMessage;
+ }
+
+ private static @Nullable String getMinecraftVersion() {
+@@ -126,4 +131,19 @@ public class PaperVersionFetcher implements VersionFetcher {
+ return -1;
+ }
+ }
++
++ @Nullable
++ private Component getHistory() {
++ final VersionHistoryManager.VersionData data = VersionHistoryManager.INSTANCE.getVersionData();
++ if (data == null) {
++ return null;
++ }
++
++ final String oldVersion = data.getOldVersion();
++ if (oldVersion == null) {
++ return null;
++ }
++
++ return Component.text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC);
++ }
+ }
+diff --git a/src/main/java/com/destroystokyo/paper/VersionHistoryManager.java b/src/main/java/com/destroystokyo/paper/VersionHistoryManager.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..660b2ec6b63a4ceffee44ab11f54dfa7c0d0996f
+--- /dev/null
++++ b/src/main/java/com/destroystokyo/paper/VersionHistoryManager.java
+@@ -0,0 +1,153 @@
++package com.destroystokyo.paper;
++
++import com.google.common.base.MoreObjects;
++import com.google.gson.Gson;
++import com.google.gson.JsonSyntaxException;
++import java.io.BufferedReader;
++import java.io.BufferedWriter;
++import java.io.IOException;
++import java.nio.charset.StandardCharsets;
++import java.nio.file.Files;
++import java.nio.file.Path;
++import java.nio.file.Paths;
++import java.nio.file.StandardOpenOption;
++import java.util.Objects;
++import java.util.logging.Level;
++import java.util.logging.Logger;
++import org.bukkit.Bukkit;
++
++import javax.annotation.Nonnull;
++import javax.annotation.Nullable;
++
++public enum VersionHistoryManager {
++ INSTANCE;
++
++ private final Gson gson = new Gson();
++
++ private final Logger logger = Bukkit.getLogger();
++
++ private VersionData currentData = null;
++
++ VersionHistoryManager() {
++ final Path path = Paths.get("version_history.json");
++
++ if (Files.exists(path)) {
++ // Basic file santiy checks
++ if (!Files.isRegularFile(path)) {
++ if (Files.isDirectory(path)) {
++ logger.severe(path + " is a directory, cannot be used for version history");
++ } else {
++ logger.severe(path + " is not a regular file, cannot be used for version history");
++ }
++ // We can't continue
++ return;
++ }
++
++ try (final BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
++ currentData = gson.fromJson(reader, VersionData.class);
++ } catch (final IOException e) {
++ logger.log(Level.SEVERE, "Failed to read version history file '" + path + "'", e);
++ return;
++ } catch (final JsonSyntaxException e) {
++ logger.log(Level.SEVERE, "Invalid json syntax for file '" + path + "'", e);
++ return;
++ }
++
++ final String version = Bukkit.getVersion();
++ if (version == null) {
++ logger.severe("Failed to retrieve current version");
++ return;
++ }
++
++ if (currentData == null) {
++ // Empty file
++ currentData = new VersionData();
++ currentData.setCurrentVersion(version);
++ writeFile(path);
++ return;
++ }
++
++ if (!version.equals(currentData.getCurrentVersion())) {
++ // The version appears to have changed
++ currentData.setOldVersion(currentData.getCurrentVersion());
++ currentData.setCurrentVersion(version);
++ writeFile(path);
++ }
++ } else {
++ // File doesn't exist, start fresh
++ currentData = new VersionData();
++ // oldVersion is null
++ currentData.setCurrentVersion(Bukkit.getVersion());
++ writeFile(path);
++ }
++ }
++
++ private void writeFile(@Nonnull final Path path) {
++ try (final BufferedWriter writer = Files.newBufferedWriter(
++ path,
++ StandardCharsets.UTF_8,
++ StandardOpenOption.WRITE,
++ StandardOpenOption.CREATE,
++ StandardOpenOption.TRUNCATE_EXISTING
++ )) {
++ gson.toJson(currentData, writer);
++ } catch (final IOException e) {
++ logger.log(Level.SEVERE, "Failed to write to version history file", e);
++ }
++ }
++
++ @Nullable
++ public VersionData getVersionData() {
++ return currentData;
++ }
++
++ public static class VersionData {
++ private String oldVersion;
++
++ private String currentVersion;
++
++ @Nullable
++ public String getOldVersion() {
++ return oldVersion;
++ }
++
++ public void setOldVersion(@Nullable String oldVersion) {
++ this.oldVersion = oldVersion;
++ }
++
++ @Nullable
++ public String getCurrentVersion() {
++ return currentVersion;
++ }
++
++ public void setCurrentVersion(@Nullable String currentVersion) {
++ this.currentVersion = currentVersion;
++ }
++
++ @Override
++ public String toString() {
++ return MoreObjects.toStringHelper(this)
++ .add("oldVersion", oldVersion)
++ .add("currentVersion", currentVersion)
++ .toString();
++ }
++
++ @Override
++ public boolean equals(@Nullable Object o) {
++ if (this == o) {
++ return true;
++ }
++ if (o == null || getClass() != o.getClass()) {
++ return false;
++ }
++ final VersionData versionData = (VersionData) o;
++ return Objects.equals(oldVersion, versionData.oldVersion) &&
++ Objects.equals(currentVersion, versionData.currentVersion);
++ }
++
++ @Override
++ public int hashCode() {
++ return Objects.hash(oldVersion, currentVersion);
++ }
++ }
++}
+diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+index 65dbd05fa904eb8f0f0ef5d3fc3c1e885771f953..88d45e52bc1105c4351ec5be39e3829ecfa8c1b6 100644
+--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
++++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+@@ -190,6 +190,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
+ // Paper end - initialize global and world-defaults configuration
+ io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command
+ com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics
++ com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now
+
+ this.setPvpAllowed(dedicatedserverproperties.pvp);
+ this.setFlightAllowed(dedicatedserverproperties.allowFlight);
diff --git a/patches/server/0028-Implement-Paper-VersionChecker.patch b/patches/server/0028-Implement-Paper-VersionChecker.patch
deleted file mode 100644
index 1d47f57f92cd..000000000000
--- a/patches/server/0028-Implement-Paper-VersionChecker.patch
+++ /dev/null
@@ -1,157 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown
-Date: Mon, 27 May 2019 03:40:05 -0500
-Subject: [PATCH] Implement Paper VersionChecker
-
-
-diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
-new file mode 100644
-index 0000000000000000000000000000000000000000..22a55be34fde453fedd987173d95b8b347a03588
---- /dev/null
-+++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
-@@ -0,0 +1,129 @@
-+package com.destroystokyo.paper;
-+
-+import com.destroystokyo.paper.util.VersionFetcher;
-+import com.google.common.base.Charsets;
-+import com.google.common.io.Resources;
-+import com.google.gson.*;
-+import net.kyori.adventure.text.Component;
-+import net.kyori.adventure.text.event.ClickEvent;
-+import net.kyori.adventure.text.format.NamedTextColor;
-+
-+import javax.annotation.Nonnull;
-+import javax.annotation.Nullable;
-+import java.io.*;
-+import java.net.HttpURLConnection;
-+import java.net.URL;
-+import java.util.stream.StreamSupport;
-+
-+public class PaperVersionFetcher implements VersionFetcher {
-+ private static final java.util.regex.Pattern VER_PATTERN = java.util.regex.Pattern.compile("^([0-9\\.]*)\\-.*R"); // R is an anchor, will always give '-R' at end
-+ private static final String GITHUB_BRANCH_NAME = "master";
-+ private static final String DOWNLOAD_PAGE = "https://papermc.io/downloads/paper";
-+ private static @Nullable String mcVer;
-+
-+ @Override
-+ public long getCacheTime() {
-+ return 720000;
-+ }
-+
-+ @Nonnull
-+ @Override
-+ public Component getVersionMessage(@Nonnull String serverVersion) {
-+ String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]");
-+ return getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]);
-+ }
-+
-+ private static @Nullable String getMinecraftVersion() {
-+ if (mcVer == null) {
-+ java.util.regex.Matcher matcher = VER_PATTERN.matcher(org.bukkit.Bukkit.getBukkitVersion());
-+ if (matcher.find()) {
-+ String result = matcher.group();
-+ mcVer = result.substring(0, result.length() - 2); // strip 'R' anchor and trailing '-'
-+ } else {
-+ org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to PaperMC!");
-+ org.bukkit.Bukkit.getLogger().warning("Pattern: " + VER_PATTERN.toString());
-+ org.bukkit.Bukkit.getLogger().warning("Version: " + org.bukkit.Bukkit.getBukkitVersion());
-+ }
-+ }
-+
-+ return mcVer;
-+ }
-+
-+ private static Component getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) {
-+ int distance;
-+ try {
-+ int jenkinsBuild = Integer.parseInt(versionInfo);
-+ distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion());
-+ } catch (NumberFormatException ignored) {
-+ versionInfo = versionInfo.replace("\"", "");
-+ distance = fetchDistanceFromGitHub(repo, branch, versionInfo);
-+ }
-+
-+ switch (distance) {
-+ case -1:
-+ return Component.text("Error obtaining version information", NamedTextColor.YELLOW);
-+ case 0:
-+ return Component.text("You are running the latest version", NamedTextColor.GREEN);
-+ case -2:
-+ return Component.text("Unknown version", NamedTextColor.YELLOW);
-+ default:
-+ return Component.text("You are " + distance + " version(s) behind", NamedTextColor.YELLOW)
-+ .append(Component.newline())
-+ .append(Component.text("Download the new version at: ")
-+ .append(Component.text(DOWNLOAD_PAGE, NamedTextColor.GOLD)
-+ .hoverEvent(Component.text("Click to open", NamedTextColor.WHITE))
-+ .clickEvent(ClickEvent.openUrl(DOWNLOAD_PAGE))));
-+ }
-+ }
-+
-+ private static int fetchDistanceFromSiteApi(int jenkinsBuild, @Nullable String siteApiVersion) {
-+ if (siteApiVersion == null) { return -1; }
-+ try {
-+ try (BufferedReader reader = Resources.asCharSource(
-+ new URL("https://api.papermc.io/v2/projects/paper/versions/" + siteApiVersion),
-+ Charsets.UTF_8
-+ ).openBufferedStream()) {
-+ JsonObject json = new Gson().fromJson(reader, JsonObject.class);
-+ JsonArray builds = json.getAsJsonArray("builds");
-+ int latest = StreamSupport.stream(builds.spliterator(), false)
-+ .mapToInt(e -> e.getAsInt())
-+ .max()
-+ .getAsInt();
-+ return latest - jenkinsBuild;
-+ } catch (JsonSyntaxException ex) {
-+ ex.printStackTrace();
-+ return -1;
-+ }
-+ } catch (IOException e) {
-+ e.printStackTrace();
-+ return -1;
-+ }
-+ }
-+
-+ // Contributed by Techcable in GH-65
-+ private static int fetchDistanceFromGitHub(@Nonnull String repo, @Nonnull String branch, @Nonnull String hash) {
-+ try {
-+ HttpURLConnection connection = (HttpURLConnection) new URL("https://api.github.com/repos/" + repo + "/compare/" + branch + "..." + hash).openConnection();
-+ connection.connect();
-+ if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) return -2; // Unknown commit
-+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8))) {
-+ JsonObject obj = new Gson().fromJson(reader, JsonObject.class);
-+ String status = obj.get("status").getAsString();
-+ switch (status) {
-+ case "identical":
-+ return 0;
-+ case "behind":
-+ return obj.get("behind_by").getAsInt();
-+ default:
-+ return -1;
-+ }
-+ } catch (JsonSyntaxException | NumberFormatException e) {
-+ e.printStackTrace();
-+ return -1;
-+ }
-+ } catch (IOException e) {
-+ e.printStackTrace();
-+ return -1;
-+ }
-+ }
-+}
-diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index 677335c3888adc25fbf3c5ec4d5a6c5ecf58ea5d..e31ead0d99203a018757cb2e765b5d28dd373eef 100644
---- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-@@ -453,6 +453,11 @@ public final class CraftMagicNumbers implements UnsafeValues {
- public String getTimingsServerName() {
- return io.papermc.paper.configuration.GlobalConfiguration.get().timings.serverName;
- }
-+
-+ @Override
-+ public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {
-+ return new com.destroystokyo.paper.PaperVersionFetcher();
-+ }
- // Paper end
-
- /**
diff --git a/patches/server/0029-Add-version-history-to-version-command.patch b/patches/server/0029-Add-version-history-to-version-command.patch
deleted file mode 100644
index bddc3de96dc8..000000000000
--- a/patches/server/0029-Add-version-history-to-version-command.patch
+++ /dev/null
@@ -1,222 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Kyle Wood
-Date: Thu, 1 Mar 2018 19:37:52 -0600
-Subject: [PATCH] Add version history to version command
-
-
-diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
-index 22a55be34fde453fedd987173d95b8b347a03588..9d687da5bdf398bb3f6c84cdf1249a7213d09f2e 100644
---- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
-+++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
-@@ -7,6 +7,8 @@ import com.google.gson.*;
- import net.kyori.adventure.text.Component;
- import net.kyori.adventure.text.event.ClickEvent;
- import net.kyori.adventure.text.format.NamedTextColor;
-+import net.kyori.adventure.text.format.TextDecoration;
-+import net.kyori.adventure.text.TextComponent;
-
- import javax.annotation.Nonnull;
- import javax.annotation.Nullable;
-@@ -30,7 +32,10 @@ public class PaperVersionFetcher implements VersionFetcher {
- @Override
- public Component getVersionMessage(@Nonnull String serverVersion) {
- String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]");
-- return getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]);
-+ final Component updateMessage = getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]);
-+ final Component history = getHistory();
-+
-+ return history != null ? TextComponent.ofChildren(updateMessage, Component.newline(), history) : updateMessage;
- }
-
- private static @Nullable String getMinecraftVersion() {
-@@ -126,4 +131,19 @@ public class PaperVersionFetcher implements VersionFetcher {
- return -1;
- }
- }
-+
-+ @Nullable
-+ private Component getHistory() {
-+ final VersionHistoryManager.VersionData data = VersionHistoryManager.INSTANCE.getVersionData();
-+ if (data == null) {
-+ return null;
-+ }
-+
-+ final String oldVersion = data.getOldVersion();
-+ if (oldVersion == null) {
-+ return null;
-+ }
-+
-+ return Component.text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC);
-+ }
- }
-diff --git a/src/main/java/com/destroystokyo/paper/VersionHistoryManager.java b/src/main/java/com/destroystokyo/paper/VersionHistoryManager.java
-new file mode 100644
-index 0000000000000000000000000000000000000000..660b2ec6b63a4ceffee44ab11f54dfa7c0d0996f
---- /dev/null
-+++ b/src/main/java/com/destroystokyo/paper/VersionHistoryManager.java
-@@ -0,0 +1,153 @@
-+package com.destroystokyo.paper;
-+
-+import com.google.common.base.MoreObjects;
-+import com.google.gson.Gson;
-+import com.google.gson.JsonSyntaxException;
-+import java.io.BufferedReader;
-+import java.io.BufferedWriter;
-+import java.io.IOException;
-+import java.nio.charset.StandardCharsets;
-+import java.nio.file.Files;
-+import java.nio.file.Path;
-+import java.nio.file.Paths;
-+import java.nio.file.StandardOpenOption;
-+import java.util.Objects;
-+import java.util.logging.Level;
-+import java.util.logging.Logger;
-+import org.bukkit.Bukkit;
-+
-+import javax.annotation.Nonnull;
-+import javax.annotation.Nullable;
-+
-+public enum VersionHistoryManager {
-+ INSTANCE;
-+
-+ private final Gson gson = new Gson();
-+
-+ private final Logger logger = Bukkit.getLogger();
-+
-+ private VersionData currentData = null;
-+
-+ VersionHistoryManager() {
-+ final Path path = Paths.get("version_history.json");
-+
-+ if (Files.exists(path)) {
-+ // Basic file santiy checks
-+ if (!Files.isRegularFile(path)) {
-+ if (Files.isDirectory(path)) {
-+ logger.severe(path + " is a directory, cannot be used for version history");
-+ } else {
-+ logger.severe(path + " is not a regular file, cannot be used for version history");
-+ }
-+ // We can't continue
-+ return;
-+ }
-+
-+ try (final BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
-+ currentData = gson.fromJson(reader, VersionData.class);
-+ } catch (final IOException e) {
-+ logger.log(Level.SEVERE, "Failed to read version history file '" + path + "'", e);
-+ return;
-+ } catch (final JsonSyntaxException e) {
-+ logger.log(Level.SEVERE, "Invalid json syntax for file '" + path + "'", e);
-+ return;
-+ }
-+
-+ final String version = Bukkit.getVersion();
-+ if (version == null) {
-+ logger.severe("Failed to retrieve current version");
-+ return;
-+ }
-+
-+ if (currentData == null) {
-+ // Empty file
-+ currentData = new VersionData();
-+ currentData.setCurrentVersion(version);
-+ writeFile(path);
-+ return;
-+ }
-+
-+ if (!version.equals(currentData.getCurrentVersion())) {
-+ // The version appears to have changed
-+ currentData.setOldVersion(currentData.getCurrentVersion());
-+ currentData.setCurrentVersion(version);
-+ writeFile(path);
-+ }
-+ } else {
-+ // File doesn't exist, start fresh
-+ currentData = new VersionData();
-+ // oldVersion is null
-+ currentData.setCurrentVersion(Bukkit.getVersion());
-+ writeFile(path);
-+ }
-+ }
-+
-+ private void writeFile(@Nonnull final Path path) {
-+ try (final BufferedWriter writer = Files.newBufferedWriter(
-+ path,
-+ StandardCharsets.UTF_8,
-+ StandardOpenOption.WRITE,
-+ StandardOpenOption.CREATE,
-+ StandardOpenOption.TRUNCATE_EXISTING
-+ )) {
-+ gson.toJson(currentData, writer);
-+ } catch (final IOException e) {
-+ logger.log(Level.SEVERE, "Failed to write to version history file", e);
-+ }
-+ }
-+
-+ @Nullable
-+ public VersionData getVersionData() {
-+ return currentData;
-+ }
-+
-+ public static class VersionData {
-+ private String oldVersion;
-+
-+ private String currentVersion;
-+
-+ @Nullable
-+ public String getOldVersion() {
-+ return oldVersion;
-+ }
-+
-+ public void setOldVersion(@Nullable String oldVersion) {
-+ this.oldVersion = oldVersion;
-+ }
-+
-+ @Nullable
-+ public String getCurrentVersion() {
-+ return currentVersion;
-+ }
-+
-+ public void setCurrentVersion(@Nullable String currentVersion) {
-+ this.currentVersion = currentVersion;
-+ }
-+
-+ @Override
-+ public String toString() {
-+ return MoreObjects.toStringHelper(this)
-+ .add("oldVersion", oldVersion)
-+ .add("currentVersion", currentVersion)
-+ .toString();
-+ }
-+
-+ @Override
-+ public boolean equals(@Nullable Object o) {
-+ if (this == o) {
-+ return true;
-+ }
-+ if (o == null || getClass() != o.getClass()) {
-+ return false;
-+ }
-+ final VersionData versionData = (VersionData) o;
-+ return Objects.equals(oldVersion, versionData.oldVersion) &&
-+ Objects.equals(currentVersion, versionData.currentVersion);
-+ }
-+
-+ @Override
-+ public int hashCode() {
-+ return Objects.hash(oldVersion, currentVersion);
-+ }
-+ }
-+}
-diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-index dfb37ddb89c2f43d9f9a34a6b2d38616575eb39b..10bf1f9237436b68b855fb63b83a4aeeddf0f0c0 100644
---- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-@@ -190,6 +190,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
- // Paper end - initialize global and world-defaults configuration
- io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command
- com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics
-+ com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now
-
- this.setPvpAllowed(dedicatedserverproperties.pvp);
- this.setFlightAllowed(dedicatedserverproperties.allowFlight);
diff --git a/patches/server/0029-Player-affects-spawning-API.patch b/patches/server/0029-Player-affects-spawning-API.patch
new file mode 100644
index 000000000000..5b8a0b37ce66
--- /dev/null
+++ b/patches/server/0029-Player-affects-spawning-API.patch
@@ -0,0 +1,158 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jedediah Smith
+Date: Tue, 1 Mar 2016 14:47:52 -0600
+Subject: [PATCH] Player affects spawning API
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java
+index 3126e8cab3c40e3af47f4c8925e1c6a9523309ba..3207166061bf9c4d7bf3f38e5a9f7aff23ccd5c1 100644
+--- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
++++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
+@@ -30,6 +30,11 @@ public final class EntitySelector {
+ public static final Predicate CAN_BE_COLLIDED_WITH = EntitySelector.NO_SPECTATORS.and(Entity::canBeCollidedWith);
+
+ private EntitySelector() {}
++ // Paper start - Affects Spawning API
++ public static final Predicate PLAYER_AFFECTS_SPAWNING = (entity) -> {
++ return !entity.isSpectator() && entity.isAlive() && entity instanceof Player player && player.affectsSpawning;
++ };
++ // Paper end - Affects Spawning API
+
+ public static Predicate withinDistance(double x, double y, double z, double max) {
+ double d4 = max * max;
+diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
+index 1de4c45f1a3a69e63eccf063be5516b163f7882a..fa5d8a041858d17c785f033dd2aa3ab242069749 100644
+--- a/src/main/java/net/minecraft/world/entity/Mob.java
++++ b/src/main/java/net/minecraft/world/entity/Mob.java
+@@ -849,7 +849,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+ if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) {
+ this.discard();
+ } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) {
+- Player entityhuman = this.level().getNearestPlayer(this, -1.0D);
++ Player entityhuman = this.level().findNearbyPlayer(this, -1.0D, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API
+
+ if (entityhuman != null) {
+ double d0 = entityhuman.distanceToSqr((Entity) this);
+diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
+index c7ab59aa0e2fd0f3e7252647ddb25b82ac604830..8f20239f3ef7ebe41fac8ee6e024c36dafec33c4 100644
+--- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
++++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
+@@ -25,7 +25,7 @@ public class SkeletonTrapGoal extends Goal {
+
+ @Override
+ public boolean canUse() {
+- return this.horse.level().hasNearbyAlivePlayer(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D);
++ return this.horse.level().hasNearbyAlivePlayerThatAffectsSpawning(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D); // Paper - Affects Spawning API
+ }
+
+ @Override
+diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
+index 96181e8925aef7f3d0a2010305caf1f6d9bcfcc9..6f452605e9dc9ebd9980eae9fdeea34417a37a88 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
++++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
+@@ -127,7 +127,7 @@ public class Silverfish extends Monster {
+ if (checkAnyLightMonsterSpawnRules(type, world, spawnReason, pos, random)) {
+ Player entityhuman = world.getNearestPlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, 5.0D, true);
+
+- return entityhuman == null;
++ return !(entityhuman != null && !entityhuman.affectsSpawning) && entityhuman == null; // Paper - Affects Spawning API
+ } else {
+ return false;
+ }
+diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+index a779d32f87b59f347408974e402fad22fdc47f09..15ccde8ee8bac1f70c6047464595aff6db073646 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
++++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+@@ -326,7 +326,7 @@ public class Zombie extends Monster {
+
+ if (NaturalSpawner.isSpawnPositionOk(entitypositiontypes_surface, this.level(), blockposition, entitytypes) && SpawnPlacements.checkSpawnRules(entitytypes, worldserver, MobSpawnType.REINFORCEMENT, blockposition, this.level().random)) {
+ entityzombie.setPos((double) i1, (double) j1, (double) k1);
+- if (!this.level().hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) {
++ if (!this.level().hasNearbyAlivePlayerThatAffectsSpawning((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) { // Paper - Affects Spawning API
+ entityzombie.setTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit
+ entityzombie.finalizeSpawn(worldserver, this.level().getCurrentDifficultyAt(entityzombie.blockPosition()), MobSpawnType.REINFORCEMENT, (SpawnGroupData) null, (CompoundTag) null);
+ worldserver.addFreshEntityWithPassengers(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit
+diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
+index 79f823c2ce2c5d03c34e580555a7e44a6747bf02..10c2c9d7c7feb878319eb19cd1fb6401da3b9189 100644
+--- a/src/main/java/net/minecraft/world/entity/player/Player.java
++++ b/src/main/java/net/minecraft/world/entity/player/Player.java
+@@ -180,6 +180,7 @@ public abstract class Player extends LivingEntity {
+ @Nullable
+ public FishingHook fishing;
+ protected float hurtDir;
++ public boolean affectsSpawning = true; // Paper - Affects Spawning API
+
+ // CraftBukkit start
+ public boolean fauxSleeping;
+diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java
+index d156f7e3430685947d2b4c30aa867e8002ca70ad..e888cf862662ae6baa6d0de8188aa74a9c6a8e00 100644
+--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
++++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
+@@ -56,7 +56,7 @@ public abstract class BaseSpawner {
+ }
+
+ public boolean isNearPlayer(Level world, BlockPos pos) {
+- return world.hasNearbyAlivePlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange);
++ return world.hasNearbyAlivePlayerThatAffectsSpawning((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange); // Paper - Affects Spawning API
+ }
+
+ public void clientTick(Level world, BlockPos pos) {
+diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java
+index b6a3c75b84d9f768afee33aa0f226207b307c1c0..07e7851ca27ea0f8166be52b086a6504c0deea09 100644
+--- a/src/main/java/net/minecraft/world/level/EntityGetter.java
++++ b/src/main/java/net/minecraft/world/level/EntityGetter.java
+@@ -70,6 +70,11 @@ public interface EntityGetter {
+ }
+ }
+
++ // Paper start - Affects Spawning API
++ default @Nullable Player findNearbyPlayer(Entity entity, double maxDistance, @Nullable Predicate predicate) {
++ return this.getNearestPlayer(entity.getX(), entity.getY(), entity.getZ(), maxDistance, predicate);
++ }
++ // Paper end - Affects Spawning API
+ @Nullable
+ default Player getNearestPlayer(double x, double y, double z, double maxDistance, @Nullable Predicate targetPredicate) {
+ double d = -1.0D;
+@@ -99,6 +104,20 @@ public interface EntityGetter {
+ return this.getNearestPlayer(x, y, z, maxDistance, predicate);
+ }
+
++ // Paper start - Affects Spawning API
++ default boolean hasNearbyAlivePlayerThatAffectsSpawning(double x, double y, double z, double range) {
++ for (Player player : this.players()) {
++ if (EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) { // combines NO_SPECTATORS and LIVING_ENTITY_STILL_ALIVE with an "affects spawning" check
++ double distanceSqr = player.distanceToSqr(x, y, z);
++ if (range < 0.0D || distanceSqr < range * range) {
++ return true;
++ }
++ }
++ }
++ return false;
++ }
++ // Paper end - Affects Spawning API
++
+ default boolean hasNearbyAlivePlayer(double x, double y, double z, double range) {
+ for(Player player : this.players()) {
+ if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index d53e15a3a70de8e2a405d3a39ff51a3551e82dbc..a592ee955a823309f1936a607823ff93822cd369 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -2338,6 +2338,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ return this.getHandle().language;
+ }
+
++ // Paper start
++ public void setAffectsSpawning(boolean affects) {
++ this.getHandle().affectsSpawning = affects;
++ }
++
++ @Override
++ public boolean getAffectsSpawning() {
++ return this.getHandle().affectsSpawning;
++ }
++ // Paper end
++
+ @Override
+ public void updateCommands() {
+ if (this.getHandle().connection == null) return;
diff --git a/patches/server/0030-Only-refresh-abilities-if-needed.patch b/patches/server/0030-Only-refresh-abilities-if-needed.patch
new file mode 100644
index 000000000000..47aaec74c5e3
--- /dev/null
+++ b/patches/server/0030-Only-refresh-abilities-if-needed.patch
@@ -0,0 +1,25 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Tue, 1 Mar 2016 23:12:03 -0600
+Subject: [PATCH] Only refresh abilities if needed
+
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index a592ee955a823309f1936a607823ff93822cd369..6e47cd5cc17ad7edff3d946364485bb01bf87a41 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -2010,12 +2010,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+
+ @Override
+ public void setFlying(boolean value) {
++ boolean needsUpdate = getHandle().getAbilities().flying != value; // Paper - Only refresh abilities if needed
+ if (!this.getAllowFlight()) {
+ Preconditions.checkArgument(!value, "Player is not allowed to fly (check #getAllowFlight())");
+ }
+
+ this.getHandle().getAbilities().flying = value;
+- this.getHandle().onUpdateAbilities();
++ if (needsUpdate) this.getHandle().onUpdateAbilities(); // Paper - Only refresh abilities if needed
+ }
+
+ @Override
diff --git a/patches/server/0030-Player-affects-spawning-API.patch b/patches/server/0030-Player-affects-spawning-API.patch
deleted file mode 100644
index f3dbfb67957f..000000000000
--- a/patches/server/0030-Player-affects-spawning-API.patch
+++ /dev/null
@@ -1,158 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jedediah Smith
-Date: Tue, 1 Mar 2016 14:47:52 -0600
-Subject: [PATCH] Player affects spawning API
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java
-index 3126e8cab3c40e3af47f4c8925e1c6a9523309ba..3207166061bf9c4d7bf3f38e5a9f7aff23ccd5c1 100644
---- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
-+++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
-@@ -30,6 +30,11 @@ public final class EntitySelector {
- public static final Predicate CAN_BE_COLLIDED_WITH = EntitySelector.NO_SPECTATORS.and(Entity::canBeCollidedWith);
-
- private EntitySelector() {}
-+ // Paper start - Affects Spawning API
-+ public static final Predicate PLAYER_AFFECTS_SPAWNING = (entity) -> {
-+ return !entity.isSpectator() && entity.isAlive() && entity instanceof Player player && player.affectsSpawning;
-+ };
-+ // Paper end - Affects Spawning API
-
- public static Predicate withinDistance(double x, double y, double z, double max) {
- double d4 = max * max;
-diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 7cbb74f4bc7b63af86b7b2c52783fb20c7739258..3fcd93f6d5a7553b032b44e7e919838ad2120dc9 100644
---- a/src/main/java/net/minecraft/world/entity/Mob.java
-+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -849,7 +849,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
- if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) {
- this.discard();
- } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) {
-- Player entityhuman = this.level().getNearestPlayer(this, -1.0D);
-+ Player entityhuman = this.level().findNearbyPlayer(this, -1.0D, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API
-
- if (entityhuman != null) {
- double d0 = entityhuman.distanceToSqr((Entity) this);
-diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
-index c7ab59aa0e2fd0f3e7252647ddb25b82ac604830..8f20239f3ef7ebe41fac8ee6e024c36dafec33c4 100644
---- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
-+++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonTrapGoal.java
-@@ -25,7 +25,7 @@ public class SkeletonTrapGoal extends Goal {
-
- @Override
- public boolean canUse() {
-- return this.horse.level().hasNearbyAlivePlayer(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D);
-+ return this.horse.level().hasNearbyAlivePlayerThatAffectsSpawning(this.horse.getX(), this.horse.getY(), this.horse.getZ(), 10.0D); // Paper - Affects Spawning API
- }
-
- @Override
-diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
-index 96181e8925aef7f3d0a2010305caf1f6d9bcfcc9..6f452605e9dc9ebd9980eae9fdeea34417a37a88 100644
---- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
-+++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
-@@ -127,7 +127,7 @@ public class Silverfish extends Monster {
- if (checkAnyLightMonsterSpawnRules(type, world, spawnReason, pos, random)) {
- Player entityhuman = world.getNearestPlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, 5.0D, true);
-
-- return entityhuman == null;
-+ return !(entityhuman != null && !entityhuman.affectsSpawning) && entityhuman == null; // Paper - Affects Spawning API
- } else {
- return false;
- }
-diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
-index a779d32f87b59f347408974e402fad22fdc47f09..15ccde8ee8bac1f70c6047464595aff6db073646 100644
---- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
-+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
-@@ -326,7 +326,7 @@ public class Zombie extends Monster {
-
- if (NaturalSpawner.isSpawnPositionOk(entitypositiontypes_surface, this.level(), blockposition, entitytypes) && SpawnPlacements.checkSpawnRules(entitytypes, worldserver, MobSpawnType.REINFORCEMENT, blockposition, this.level().random)) {
- entityzombie.setPos((double) i1, (double) j1, (double) k1);
-- if (!this.level().hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) {
-+ if (!this.level().hasNearbyAlivePlayerThatAffectsSpawning((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) { // Paper - Affects Spawning API
- entityzombie.setTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit
- entityzombie.finalizeSpawn(worldserver, this.level().getCurrentDifficultyAt(entityzombie.blockPosition()), MobSpawnType.REINFORCEMENT, (SpawnGroupData) null, (CompoundTag) null);
- worldserver.addFreshEntityWithPassengers(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit
-diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
-index eed6481bc88ed15a5e3fe7056b545ab44ed81983..f8d3e195c094ff200c0a7bd8cd4829ef36d328da 100644
---- a/src/main/java/net/minecraft/world/entity/player/Player.java
-+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
-@@ -179,6 +179,7 @@ public abstract class Player extends LivingEntity {
- @Nullable
- public FishingHook fishing;
- protected float hurtDir;
-+ public boolean affectsSpawning = true; // Paper - Affects Spawning API
-
- // CraftBukkit start
- public boolean fauxSleeping;
-diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java
-index d156f7e3430685947d2b4c30aa867e8002ca70ad..e888cf862662ae6baa6d0de8188aa74a9c6a8e00 100644
---- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
-+++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
-@@ -56,7 +56,7 @@ public abstract class BaseSpawner {
- }
-
- public boolean isNearPlayer(Level world, BlockPos pos) {
-- return world.hasNearbyAlivePlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange);
-+ return world.hasNearbyAlivePlayerThatAffectsSpawning((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, (double) this.requiredPlayerRange); // Paper - Affects Spawning API
- }
-
- public void clientTick(Level world, BlockPos pos) {
-diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java
-index b6a3c75b84d9f768afee33aa0f226207b307c1c0..07e7851ca27ea0f8166be52b086a6504c0deea09 100644
---- a/src/main/java/net/minecraft/world/level/EntityGetter.java
-+++ b/src/main/java/net/minecraft/world/level/EntityGetter.java
-@@ -70,6 +70,11 @@ public interface EntityGetter {
- }
- }
-
-+ // Paper start - Affects Spawning API
-+ default @Nullable Player findNearbyPlayer(Entity entity, double maxDistance, @Nullable Predicate predicate) {
-+ return this.getNearestPlayer(entity.getX(), entity.getY(), entity.getZ(), maxDistance, predicate);
-+ }
-+ // Paper end - Affects Spawning API
- @Nullable
- default Player getNearestPlayer(double x, double y, double z, double maxDistance, @Nullable Predicate targetPredicate) {
- double d = -1.0D;
-@@ -99,6 +104,20 @@ public interface EntityGetter {
- return this.getNearestPlayer(x, y, z, maxDistance, predicate);
- }
-
-+ // Paper start - Affects Spawning API
-+ default boolean hasNearbyAlivePlayerThatAffectsSpawning(double x, double y, double z, double range) {
-+ for (Player player : this.players()) {
-+ if (EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) { // combines NO_SPECTATORS and LIVING_ENTITY_STILL_ALIVE with an "affects spawning" check
-+ double distanceSqr = player.distanceToSqr(x, y, z);
-+ if (range < 0.0D || distanceSqr < range * range) {
-+ return true;
-+ }
-+ }
-+ }
-+ return false;
-+ }
-+ // Paper end - Affects Spawning API
-+
- default boolean hasNearbyAlivePlayer(double x, double y, double z, double range) {
- for(Player player : this.players()) {
- if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) {
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index afdc702682af7ddf338fe00a1b1912766e728f41..aafab28ed643e9f5f4b28a12ecd7bde3bc993abf 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2287,6 +2287,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- return this.getHandle().language;
- }
-
-+ // Paper start
-+ public void setAffectsSpawning(boolean affects) {
-+ this.getHandle().affectsSpawning = affects;
-+ }
-+
-+ @Override
-+ public boolean getAffectsSpawning() {
-+ return this.getHandle().affectsSpawning;
-+ }
-+ // Paper end
-+
- @Override
- public void updateCommands() {
- if (this.getHandle().connection == null) return;
diff --git a/patches/server/0031-Only-refresh-abilities-if-needed.patch b/patches/server/0031-Only-refresh-abilities-if-needed.patch
deleted file mode 100644
index 58032170df66..000000000000
--- a/patches/server/0031-Only-refresh-abilities-if-needed.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown
-Date: Tue, 1 Mar 2016 23:12:03 -0600
-Subject: [PATCH] Only refresh abilities if needed
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index aafab28ed643e9f5f4b28a12ecd7bde3bc993abf..8b7f6ac3214d318bff41779ae80c48ce3ecd54ce 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -1959,12 +1959,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-
- @Override
- public void setFlying(boolean value) {
-+ boolean needsUpdate = getHandle().getAbilities().flying != value; // Paper - Only refresh abilities if needed
- if (!this.getAllowFlight()) {
- Preconditions.checkArgument(!value, "Player is not allowed to fly (check #getAllowFlight())");
- }
-
- this.getHandle().getAbilities().flying = value;
-- this.getHandle().onUpdateAbilities();
-+ if (needsUpdate) this.getHandle().onUpdateAbilities(); // Paper - Only refresh abilities if needed
- }
-
- @Override
diff --git a/patches/server/0031-fix-ItemMeta-removing-CustomModelData.patch b/patches/server/0031-fix-ItemMeta-removing-CustomModelData.patch
new file mode 100644
index 000000000000..e42dfffc097b
--- /dev/null
+++ b/patches/server/0031-fix-ItemMeta-removing-CustomModelData.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic
+Date: Tue, 2 Jan 2024 10:35:46 -0800
+Subject: [PATCH] fix ItemMeta removing CustomModelData
+
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+index 2157034e735c3921d4ef128688c30917aaad7161..ffdea312f93d00289364ef4d41a820cd1338f3bd 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+@@ -353,7 +353,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ }
+ }
+
+- if (tag.contains(CraftMetaItem.CUSTOM_MODEL_DATA.NBT, CraftMagicNumbers.NBT.TAG_INT)) {
++ if (tag.contains(CraftMetaItem.CUSTOM_MODEL_DATA.NBT, CraftMagicNumbers.NBT.TAG_ANY_NUMBER)) { // Paper - correctly allow any number type
+ this.customModelData = tag.getInt(CraftMetaItem.CUSTOM_MODEL_DATA.NBT);
+ }
+ if (tag.contains(CraftMetaItem.BLOCK_DATA.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) {
diff --git a/patches/server/0032-Entity-Origin-API.patch b/patches/server/0032-Entity-Origin-API.patch
new file mode 100644
index 000000000000..b5fb102df6db
--- /dev/null
+++ b/patches/server/0032-Entity-Origin-API.patch
@@ -0,0 +1,120 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Byteflux
+Date: Tue, 1 Mar 2016 23:45:08 -0600
+Subject: [PATCH] Entity Origin API
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
+index 73608abb5a39749c326ce6fe1bf014422941b2d1..1315822ce37e5011880b24afb4fbe18cd1dfe80f 100644
+--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
+@@ -2149,6 +2149,15 @@ public class ServerLevel extends Level implements WorldGenLevel {
+ entity.updateDynamicGameEventListener(DynamicGameEventListener::add);
+ entity.inWorld = true; // CraftBukkit - Mark entity as in world
+ entity.valid = true; // CraftBukkit
++ // Paper start - Entity origin API
++ if (entity.getOriginVector() == null) {
++ entity.setOrigin(entity.getBukkitEntity().getLocation());
++ }
++ // Default to current world if unknown, gross assumption but entities rarely change world
++ if (entity.getOriginWorld() == null) {
++ entity.setOrigin(entity.getOriginVector().toLocation(getWorld()));
++ }
++ // Paper end - Entity origin API
+ }
+
+ public void onTrackingEnd(Entity entity) {
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 0ecdc0d671f744d85072ca0d157ef37bb28bab9c..1212943cf64a716ceae187c76ff9be6241595ba2 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -319,7 +319,27 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ public long activatedTick = Integer.MIN_VALUE;
+ public void inactiveTick() { }
+ // Spigot end
++ // Paper start - Entity origin API
++ @javax.annotation.Nullable
++ private org.bukkit.util.Vector origin;
++ @javax.annotation.Nullable
++ private UUID originWorld;
+
++ public void setOrigin(@javax.annotation.Nonnull Location location) {
++ this.origin = location.toVector();
++ this.originWorld = location.getWorld().getUID();
++ }
++
++ @javax.annotation.Nullable
++ public org.bukkit.util.Vector getOriginVector() {
++ return this.origin != null ? this.origin.clone() : null;
++ }
++
++ @javax.annotation.Nullable
++ public UUID getOriginWorld() {
++ return this.originWorld;
++ }
++ // Paper end - Entity origin API
+ public float getBukkitYaw() {
+ return this.yRot;
+ }
+@@ -2042,6 +2062,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ this.bukkitEntity.storeBukkitValues(nbttagcompound);
+ }
+ // CraftBukkit end
++ // Paper start
++ if (this.origin != null) {
++ UUID originWorld = this.originWorld != null ? this.originWorld : this.level != null ? this.level.getWorld().getUID() : null;
++ if (originWorld != null) {
++ nbttagcompound.putUUID("Paper.OriginWorld", originWorld);
++ }
++ nbttagcompound.put("Paper.Origin", this.newDoubleList(origin.getX(), origin.getY(), origin.getZ()));
++ }
++ // Paper end
+ return nbttagcompound;
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT");
+@@ -2169,6 +2198,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ }
+ // CraftBukkit end
+
++ // Paper start
++ ListTag originTag = nbt.getList("Paper.Origin", net.minecraft.nbt.Tag.TAG_DOUBLE);
++ if (!originTag.isEmpty()) {
++ UUID originWorld = null;
++ if (nbt.contains("Paper.OriginWorld")) {
++ originWorld = nbt.getUUID("Paper.OriginWorld");
++ } else if (this.level != null) {
++ originWorld = this.level.getWorld().getUID();
++ }
++ this.originWorld = originWorld;
++ origin = new org.bukkit.util.Vector(originTag.getDouble(0), originTag.getDouble(1), originTag.getDouble(2));
++ }
++ // Paper end
++
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT");
+ CrashReportCategory crashreportsystemdetails = crashreport.addCategory("Entity being loaded");
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+index e269812e6193492afc3f25612edafa1a58325fa3..49294a8d580d891f21d8d4cbae14ae477c01ff8d 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+@@ -967,5 +967,20 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+
+ return ret;
+ }
++
++ @Override
++ public Location getOrigin() {
++ Vector originVector = this.getHandle().getOriginVector();
++ if (originVector == null) {
++ return null;
++ }
++ World world = this.getWorld();
++ if (this.getHandle().getOriginWorld() != null) {
++ world = org.bukkit.Bukkit.getWorld(this.getHandle().getOriginWorld());
++ }
++
++ //noinspection ConstantConditions
++ return originVector.toLocation(world);
++ }
+ // Paper end
+ }
diff --git a/patches/server/0032-fix-ItemMeta-removing-CustomModelData.patch b/patches/server/0032-fix-ItemMeta-removing-CustomModelData.patch
deleted file mode 100644
index 5d5438460cf5..000000000000
--- a/patches/server/0032-fix-ItemMeta-removing-CustomModelData.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic
-Date: Tue, 2 Jan 2024 10:35:46 -0800
-Subject: [PATCH] fix ItemMeta removing CustomModelData
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
-index aad1bfb515556ed98a55b181057d3ebb178ee52d..9e11d7bccd04b4c2e6913de56a299190c22aa9c1 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
-@@ -353,7 +353,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- }
- }
-
-- if (tag.contains(CraftMetaItem.CUSTOM_MODEL_DATA.NBT, CraftMagicNumbers.NBT.TAG_INT)) {
-+ if (tag.contains(CraftMetaItem.CUSTOM_MODEL_DATA.NBT, CraftMagicNumbers.NBT.TAG_ANY_NUMBER)) { // Paper - correctly allow any number type
- this.customModelData = tag.getInt(CraftMetaItem.CUSTOM_MODEL_DATA.NBT);
- }
- if (tag.contains(CraftMetaItem.BLOCK_DATA.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND)) {
diff --git a/patches/server/0033-Entity-Origin-API.patch b/patches/server/0033-Entity-Origin-API.patch
deleted file mode 100644
index ec30ee3e45f0..000000000000
--- a/patches/server/0033-Entity-Origin-API.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Byteflux
-Date: Tue, 1 Mar 2016 23:45:08 -0600
-Subject: [PATCH] Entity Origin API
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index d00b789d8deb0163726acbcb10edb0965ac9f326..5b304c0c701a74398ba46ef8766a3d707bbe6a07 100644
---- a/src/main/java/net/minecraft/server/level/ServerLevel.java
-+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -2149,6 +2149,15 @@ public class ServerLevel extends Level implements WorldGenLevel {
- entity.updateDynamicGameEventListener(DynamicGameEventListener::add);
- entity.inWorld = true; // CraftBukkit - Mark entity as in world
- entity.valid = true; // CraftBukkit
-+ // Paper start - Entity origin API
-+ if (entity.getOriginVector() == null) {
-+ entity.setOrigin(entity.getBukkitEntity().getLocation());
-+ }
-+ // Default to current world if unknown, gross assumption but entities rarely change world
-+ if (entity.getOriginWorld() == null) {
-+ entity.setOrigin(entity.getOriginVector().toLocation(getWorld()));
-+ }
-+ // Paper end - Entity origin API
- }
-
- public void onTrackingEnd(Entity entity) {
-diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 8811646495f37587e7976edd8b9558cda412edb1..b58b5b5fa710dc453966f7ff0dea6ac16a88c99d 100644
---- a/src/main/java/net/minecraft/world/entity/Entity.java
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -319,7 +319,27 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- public long activatedTick = Integer.MIN_VALUE;
- public void inactiveTick() { }
- // Spigot end
-+ // Paper start - Entity origin API
-+ @javax.annotation.Nullable
-+ private org.bukkit.util.Vector origin;
-+ @javax.annotation.Nullable
-+ private UUID originWorld;
-
-+ public void setOrigin(@javax.annotation.Nonnull Location location) {
-+ this.origin = location.toVector();
-+ this.originWorld = location.getWorld().getUID();
-+ }
-+
-+ @javax.annotation.Nullable
-+ public org.bukkit.util.Vector getOriginVector() {
-+ return this.origin != null ? this.origin.clone() : null;
-+ }
-+
-+ @javax.annotation.Nullable
-+ public UUID getOriginWorld() {
-+ return this.originWorld;
-+ }
-+ // Paper end - Entity origin API
- public float getBukkitYaw() {
- return this.yRot;
- }
-@@ -2043,6 +2063,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- this.bukkitEntity.storeBukkitValues(nbttagcompound);
- }
- // CraftBukkit end
-+ // Paper start
-+ if (this.origin != null) {
-+ UUID originWorld = this.originWorld != null ? this.originWorld : this.level != null ? this.level.getWorld().getUID() : null;
-+ if (originWorld != null) {
-+ nbttagcompound.putUUID("Paper.OriginWorld", originWorld);
-+ }
-+ nbttagcompound.put("Paper.Origin", this.newDoubleList(origin.getX(), origin.getY(), origin.getZ()));
-+ }
-+ // Paper end
- return nbttagcompound;
- } catch (Throwable throwable) {
- CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT");
-@@ -2170,6 +2199,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- }
- // CraftBukkit end
-
-+ // Paper start
-+ ListTag originTag = nbt.getList("Paper.Origin", net.minecraft.nbt.Tag.TAG_DOUBLE);
-+ if (!originTag.isEmpty()) {
-+ UUID originWorld = null;
-+ if (nbt.contains("Paper.OriginWorld")) {
-+ originWorld = nbt.getUUID("Paper.OriginWorld");
-+ } else if (this.level != null) {
-+ originWorld = this.level.getWorld().getUID();
-+ }
-+ this.originWorld = originWorld;
-+ origin = new org.bukkit.util.Vector(originTag.getDouble(0), originTag.getDouble(1), originTag.getDouble(2));
-+ }
-+ // Paper end
-+
- } catch (Throwable throwable) {
- CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT");
- CrashReportCategory crashreportsystemdetails = crashreport.addCategory("Entity being loaded");
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index e269812e6193492afc3f25612edafa1a58325fa3..49294a8d580d891f21d8d4cbae14ae477c01ff8d 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -967,5 +967,20 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
-
- return ret;
- }
-+
-+ @Override
-+ public Location getOrigin() {
-+ Vector originVector = this.getHandle().getOriginVector();
-+ if (originVector == null) {
-+ return null;
-+ }
-+ World world = this.getWorld();
-+ if (this.getHandle().getOriginWorld() != null) {
-+ world = org.bukkit.Bukkit.getWorld(this.getHandle().getOriginWorld());
-+ }
-+
-+ //noinspection ConstantConditions
-+ return originVector.toLocation(world);
-+ }
- // Paper end
- }
diff --git a/patches/server/0034-Prevent-block-entity-and-entity-crashes.patch b/patches/server/0033-Prevent-block-entity-and-entity-crashes.patch
similarity index 100%
rename from patches/server/0034-Prevent-block-entity-and-entity-crashes.patch
rename to patches/server/0033-Prevent-block-entity-and-entity-crashes.patch
diff --git a/patches/server/0034-Configurable-top-of-nether-void-damage.patch b/patches/server/0034-Configurable-top-of-nether-void-damage.patch
new file mode 100644
index 000000000000..e8fedeba3f69
--- /dev/null
+++ b/patches/server/0034-Configurable-top-of-nether-void-damage.patch
@@ -0,0 +1,49 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Tue, 1 Mar 2016 23:58:50 -0600
+Subject: [PATCH] Configurable top of nether void damage
+
+Co-authored-by: Jake Potrebic
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 1212943cf64a716ceae187c76ff9be6241595ba2..3577829c2386779913f4d2aebd1825051da2d364 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -670,7 +670,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ }
+
+ public void checkBelowWorld() {
+- if (this.getY() < (double) (this.level().getMinBuildHeight() - 64)) {
++ // Paper start - Configurable nether ceiling damage
++ if (this.getY() < (double) (this.level.getMinBuildHeight() - 64) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER
++ && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v)
++ && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
++ // Paper end - Configurable nether ceiling damage
+ this.onBelowWorld();
+ }
+
+diff --git a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
+index 02e3322ec41108fe9275510e2daa833d180353dc..550b7bc694d861c084769265f6c49c4d44033296 100644
+--- a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
++++ b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
+@@ -55,7 +55,7 @@ public class PortalForcer {
+ Optional optional = villageplace.getInSquare((holder) -> {
+ return holder.is(PoiTypes.NETHER_PORTAL);
+ }, blockposition, i, PoiManager.Occupancy.ANY).filter((villageplacerecord) -> {
+- return worldborder.isWithinBounds(villageplacerecord.getPos());
++ return worldborder.isWithinBounds(villageplacerecord.getPos()) && !(this.level.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.NETHER && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> villageplacerecord.getPos().getY() >= v)); // Paper - Configurable nether ceiling damage
+ }).sorted(Comparator.comparingDouble((PoiRecord villageplacerecord) -> { // CraftBukkit - decompile error
+ return villageplacerecord.getPos().distSqr(blockposition);
+ }).thenComparingInt((villageplacerecord) -> {
+@@ -90,6 +90,11 @@ public class PortalForcer {
+ BlockPos blockposition2 = null;
+ WorldBorder worldborder = this.level.getWorldBorder();
+ int i = Math.min(this.level.getMaxBuildHeight(), this.level.getMinBuildHeight() + this.level.getLogicalHeight()) - 1;
++ // Paper start - Configurable nether ceiling damage; make sure the max height doesn't exceed the void damage height
++ if (this.level.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.NETHER && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.enabled()) {
++ i = Math.min(i, this.level.paperConfig().environment.netherCeilingVoidDamageHeight.intValue() - 1);
++ }
++ // Paper end - Configurable nether ceiling damage
+ BlockPos.MutableBlockPos blockposition_mutableblockposition = blockposition.mutable();
+ Iterator iterator = BlockPos.spiralAround(blockposition, createRadius, Direction.EAST, Direction.SOUTH).iterator(); // CraftBukkit
+
diff --git a/patches/server/0035-Check-online-mode-before-converting-and-renaming-pla.patch b/patches/server/0035-Check-online-mode-before-converting-and-renaming-pla.patch
new file mode 100644
index 000000000000..d6d157d97344
--- /dev/null
+++ b/patches/server/0035-Check-online-mode-before-converting-and-renaming-pla.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Wed, 2 Mar 2016 00:03:55 -0600
+Subject: [PATCH] Check online mode before converting and renaming player data
+
+
+diff --git a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
+index 8292978e1386c55d99241c3ee2ead3440b9e2570..2a167a0131d866b4368fc30849c17acdf0ab9af0 100644
+--- a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
++++ b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
+@@ -60,7 +60,7 @@ public class PlayerDataStorage {
+ File file = new File(this.playerDir, player.getStringUUID() + ".dat");
+ // Spigot Start
+ boolean usingWrongFile = false;
+- if ( !file.exists() )
++ if ( org.bukkit.Bukkit.getOnlineMode() && !file.exists() ) // Paper - Check online mode first
+ {
+ file = new File( this.playerDir, java.util.UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + player.getScoreboardName() ).getBytes( "UTF-8" ) ).toString() + ".dat");
+ if ( file.exists() )
diff --git a/patches/server/0035-Configurable-top-of-nether-void-damage.patch b/patches/server/0035-Configurable-top-of-nether-void-damage.patch
deleted file mode 100644
index 778ca74fbf3d..000000000000
--- a/patches/server/0035-Configurable-top-of-nether-void-damage.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown
-Date: Tue, 1 Mar 2016 23:58:50 -0600
-Subject: [PATCH] Configurable top of nether void damage
-
-Co-authored-by: Jake Potrebic
-
-diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index b58b5b5fa710dc453966f7ff0dea6ac16a88c99d..8e4f8849acfede8eec04527b67a3405ae805633d 100644
---- a/src/main/java/net/minecraft/world/entity/Entity.java
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -670,7 +670,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- }
-
- public void checkBelowWorld() {
-- if (this.getY() < (double) (this.level().getMinBuildHeight() - 64)) {
-+ // Paper start - Configurable nether ceiling damage
-+ if (this.getY() < (double) (this.level.getMinBuildHeight() - 64) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER
-+ && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v)
-+ && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
-+ // Paper end - Configurable nether ceiling damage
- this.onBelowWorld();
- }
-
-diff --git a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
-index 02e3322ec41108fe9275510e2daa833d180353dc..550b7bc694d861c084769265f6c49c4d44033296 100644
---- a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
-+++ b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
-@@ -55,7 +55,7 @@ public class PortalForcer {
- Optional optional = villageplace.getInSquare((holder) -> {
- return holder.is(PoiTypes.NETHER_PORTAL);
- }, blockposition, i, PoiManager.Occupancy.ANY).filter((villageplacerecord) -> {
-- return worldborder.isWithinBounds(villageplacerecord.getPos());
-+ return worldborder.isWithinBounds(villageplacerecord.getPos()) && !(this.level.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.NETHER && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> villageplacerecord.getPos().getY() >= v)); // Paper - Configurable nether ceiling damage
- }).sorted(Comparator.comparingDouble((PoiRecord villageplacerecord) -> { // CraftBukkit - decompile error
- return villageplacerecord.getPos().distSqr(blockposition);
- }).thenComparingInt((villageplacerecord) -> {
-@@ -90,6 +90,11 @@ public class PortalForcer {
- BlockPos blockposition2 = null;
- WorldBorder worldborder = this.level.getWorldBorder();
- int i = Math.min(this.level.getMaxBuildHeight(), this.level.getMinBuildHeight() + this.level.getLogicalHeight()) - 1;
-+ // Paper start - Configurable nether ceiling damage; make sure the max height doesn't exceed the void damage height
-+ if (this.level.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.NETHER && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.enabled()) {
-+ i = Math.min(i, this.level.paperConfig().environment.netherCeilingVoidDamageHeight.intValue() - 1);
-+ }
-+ // Paper end - Configurable nether ceiling damage
- BlockPos.MutableBlockPos blockposition_mutableblockposition = blockposition.mutable();
- Iterator iterator = BlockPos.spiralAround(blockposition, createRadius, Direction.EAST, Direction.SOUTH).iterator(); // CraftBukkit
-
diff --git a/patches/server/0037-Always-tick-falling-blocks.patch b/patches/server/0036-Always-tick-falling-blocks.patch
similarity index 100%
rename from patches/server/0037-Always-tick-falling-blocks.patch
rename to patches/server/0036-Always-tick-falling-blocks.patch
diff --git a/patches/server/0036-Check-online-mode-before-converting-and-renaming-pla.patch b/patches/server/0036-Check-online-mode-before-converting-and-renaming-pla.patch
deleted file mode 100644
index 5d700a45742d..000000000000
--- a/patches/server/0036-Check-online-mode-before-converting-and-renaming-pla.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown
-Date: Wed, 2 Mar 2016 00:03:55 -0600
-Subject: [PATCH] Check online mode before converting and renaming player data
-
-
-diff --git a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
-index 3d74ffc6e38b0dbe7ca6d8d84a63f78d6b1908a7..08f4cc47ec3aa4dd6980ba543219891a510b010b 100644
---- a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
-+++ b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java
-@@ -60,7 +60,7 @@ public class PlayerDataStorage {
- File file = new File(this.playerDir, player.getStringUUID() + ".dat");
- // Spigot Start
- boolean usingWrongFile = false;
-- if ( !file.exists() )
-+ if ( org.bukkit.Bukkit.getOnlineMode() && !file.exists() ) // Paper - Check online mode first
- {
- file = new File( this.playerDir, java.util.UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + player.getScoreboardName() ).getBytes( "UTF-8" ) ).toString() + ".dat");
- if ( file.exists() )
diff --git a/patches/server/0037-Configurable-end-credits.patch b/patches/server/0037-Configurable-end-credits.patch
new file mode 100644
index 000000000000..d1085599d140
--- /dev/null
+++ b/patches/server/0037-Configurable-end-credits.patch
@@ -0,0 +1,18 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: DoctorDark
+Date: Wed, 16 Mar 2016 02:21:39 -0500
+Subject: [PATCH] Configurable end credits
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 27a1450696a633578cd44567f240cbc1a4c578ac..3bb3312da2b91616d9d3bb4cb79259ee9e3479bd 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -1030,6 +1030,7 @@ public class ServerPlayer extends Player {
+ this.unRide();
+ this.serverLevel().removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION);
+ if (!this.wonGame) {
++ if (this.level().paperConfig().misc.disableEndCredits) this.seenCredits = true; // Paper - Option to disable end credits
+ this.wonGame = true;
+ this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.WIN_GAME, this.seenCredits ? 0.0F : 1.0F));
+ this.seenCredits = true;
diff --git a/patches/server/0038-Configurable-end-credits.patch b/patches/server/0038-Configurable-end-credits.patch
deleted file mode 100644
index e20735f6d61e..000000000000
--- a/patches/server/0038-Configurable-end-credits.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: DoctorDark
-Date: Wed, 16 Mar 2016 02:21:39 -0500
-Subject: [PATCH] Configurable end credits
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 61d4afb6b76fdffdda9f01af5005f005e21f4807..c1006a1991e294fa69b1eb35f4224154b064671b 100644
---- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
-+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-@@ -1030,6 +1030,7 @@ public class ServerPlayer extends Player {
- this.unRide();
- this.serverLevel().removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION);
- if (!this.wonGame) {
-+ if (this.level().paperConfig().misc.disableEndCredits) this.seenCredits = true; // Paper - Option to disable end credits
- this.wonGame = true;
- this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.WIN_GAME, this.seenCredits ? 0.0F : 1.0F));
- this.seenCredits = true;
diff --git a/patches/server/0038-Fix-lag-from-explosions-processing-dead-entities.patch b/patches/server/0038-Fix-lag-from-explosions-processing-dead-entities.patch
new file mode 100644
index 000000000000..fb7366543b1c
--- /dev/null
+++ b/patches/server/0038-Fix-lag-from-explosions-processing-dead-entities.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Iceee
+Date: Wed, 2 Mar 2016 01:39:52 -0600
+Subject: [PATCH] Fix lag from explosions processing dead entities
+
+
+diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
+index f8dafdf67447c9627f677fca7160e212239709c4..b600abae1c17e1196ff2b171e054db95cca5c9ff 100644
+--- a/src/main/java/net/minecraft/world/level/Explosion.java
++++ b/src/main/java/net/minecraft/world/level/Explosion.java
+@@ -225,7 +225,7 @@ public class Explosion {
+ int i1 = Mth.floor(this.y + (double) f2 + 1.0D);
+ int j1 = Mth.floor(this.z - (double) f2 - 1.0D);
+ int k1 = Mth.floor(this.z + (double) f2 + 1.0D);
+- List list = this.level.getEntities(this.source, new AABB((double) i, (double) l, (double) j1, (double) j, (double) i1, (double) k1));
++ List list = this.level.getEntities(this.source, new AABB((double) i, (double) l, (double) j1, (double) j, (double) i1, (double) k1), (com.google.common.base.Predicate) entity -> entity.isAlive() && !entity.isSpectator()); // Paper - Fix lag from explosions processing dead entities
+ Vec3 vec3d = new Vec3(this.x, this.y, this.z);
+ Iterator iterator = list.iterator();
+
diff --git a/patches/server/0039-Fix-lag-from-explosions-processing-dead-entities.patch b/patches/server/0039-Fix-lag-from-explosions-processing-dead-entities.patch
deleted file mode 100644
index 305920cc5511..000000000000
--- a/patches/server/0039-Fix-lag-from-explosions-processing-dead-entities.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Iceee
-Date: Wed, 2 Mar 2016 01:39:52 -0600
-Subject: [PATCH] Fix lag from explosions processing dead entities
-
-
-diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
-index 725ea53e6143d29f9619e1045341bc30155b248e..c5d644876e0c92a444a574ee7571227e19b28482 100644
---- a/src/main/java/net/minecraft/world/level/Explosion.java
-+++ b/src/main/java/net/minecraft/world/level/Explosion.java
-@@ -225,7 +225,7 @@ public class Explosion {
- int i1 = Mth.floor(this.y + (double) f2 + 1.0D);
- int j1 = Mth.floor(this.z - (double) f2 - 1.0D);
- int k1 = Mth.floor(this.z + (double) f2 + 1.0D);
-- List list = this.level.getEntities(this.source, new AABB((double) i, (double) l, (double) j1, (double) j, (double) i1, (double) k1));
-+ List list = this.level.getEntities(this.source, new AABB((double) i, (double) l, (double) j1, (double) j, (double) i1, (double) k1), (com.google.common.base.Predicate) entity -> entity.isAlive() && !entity.isSpectator()); // Paper - Fix lag from explosions processing dead entities
- Vec3 vec3d = new Vec3(this.x, this.y, this.z);
- Iterator iterator = list.iterator();
-
diff --git a/patches/server/0039-Optimize-explosions.patch b/patches/server/0039-Optimize-explosions.patch
new file mode 100644
index 000000000000..9434cb4e986c
--- /dev/null
+++ b/patches/server/0039-Optimize-explosions.patch
@@ -0,0 +1,133 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Byteflux
+Date: Wed, 2 Mar 2016 11:59:48 -0600
+Subject: [PATCH] Optimize explosions
+
+The process of determining an entity's exposure from explosions can be
+expensive when there are hundreds or more entities in range.
+
+This patch adds a per-tick cache that is used for storing and retrieving
+an entity's exposure during an explosion.
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index c6ce55d48fc71ea097a4a279fcd0dd1d4086be9b..cc2775d94f3b6ebd7f97e14e324bf292d5874de4 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -1489,6 +1489,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop>> 32));
++ temp = Double.doubleToLongBits(posY);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ temp = Double.doubleToLongBits(posZ);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ temp = Double.doubleToLongBits(minX);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ temp = Double.doubleToLongBits(minY);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ temp = Double.doubleToLongBits(minZ);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ temp = Double.doubleToLongBits(maxX);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ temp = Double.doubleToLongBits(maxY);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ temp = Double.doubleToLongBits(maxZ);
++ result = 31 * result + (int) (temp ^ (temp >>> 32));
++ return result;
++ }
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
+index dfe8eea789a6dd5476da0c194236dba3868a2cb7..7ead83d46e7bb3ee3586acf695b08f197f61f04a 100644
+--- a/src/main/java/net/minecraft/world/level/Level.java
++++ b/src/main/java/net/minecraft/world/level/Level.java
+@@ -170,6 +170,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+ private org.spigotmc.TickLimiter entityLimiter;
+ private org.spigotmc.TickLimiter tileLimiter;
+ private int tileTickPosition;
++ public final Map explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions
+
+ public CraftWorld getWorld() {
+ return this.world;
diff --git a/patches/server/0040-Disable-explosion-knockback.patch b/patches/server/0040-Disable-explosion-knockback.patch
new file mode 100644
index 000000000000..880de82afd78
--- /dev/null
+++ b/patches/server/0040-Disable-explosion-knockback.patch
@@ -0,0 +1,28 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Sudzzy
+Date: Wed, 2 Mar 2016 14:48:03 -0600
+Subject: [PATCH] Disable explosion knockback
+
+
+diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
+index df17b8cddd7f8bd3f13641c99ad0d25e8a596675..00cfa26783ce0772c75166266ead258a415097bc 100644
+--- a/src/main/java/net/minecraft/world/level/Explosion.java
++++ b/src/main/java/net/minecraft/world/level/Explosion.java
+@@ -283,7 +283,7 @@ public class Explosion {
+ if (entity instanceof LivingEntity) {
+ LivingEntity entityliving = (LivingEntity) entity;
+
+- d13 = ProtectionEnchantment.getExplosionKnockbackAfterDampener(entityliving, d12);
++ d13 = entity instanceof Player && level.paperConfig().environment.disableExplosionKnockback ? 0 : ProtectionEnchantment.getExplosionKnockbackAfterDampener(entityliving, d12); // Paper - Option to disable explosion knockback
+ } else {
+ d13 = d12;
+ }
+@@ -305,7 +305,7 @@ public class Explosion {
+ if (entity instanceof Player) {
+ Player entityhuman = (Player) entity;
+
+- if (!entityhuman.isSpectator() && (!entityhuman.isCreative() || !entityhuman.getAbilities().flying)) {
++ if (!entityhuman.isSpectator() && (!entityhuman.isCreative() || !entityhuman.getAbilities().flying) && !level.paperConfig().environment.disableExplosionKnockback) { // Paper - Option to disable explosion knockback
+ this.hitPlayers.put(entityhuman, vec3d1);
+ }
+ }
diff --git a/patches/server/0040-Optimize-explosions.patch b/patches/server/0040-Optimize-explosions.patch
deleted file mode 100644
index 7ecbc0cda475..000000000000
--- a/patches/server/0040-Optimize-explosions.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Byteflux
-Date: Wed, 2 Mar 2016 11:59:48 -0600
-Subject: [PATCH] Optimize explosions
-
-The process of determining an entity's exposure from explosions can be
-expensive when there are hundreds or more entities in range.
-
-This patch adds a per-tick cache that is used for storing and retrieving
-an entity's exposure during an explosion.
-
-diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 107a04f6c5889e98c183a932ad158fb5b6591a10..455f72f2a653154d4528c53d39866d3cd85b6862 100644
---- a/src/main/java/net/minecraft/server/MinecraftServer.java
-+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1489,6 +1489,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop>> 32));
-+ temp = Double.doubleToLongBits(posY);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ temp = Double.doubleToLongBits(posZ);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ temp = Double.doubleToLongBits(minX);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ temp = Double.doubleToLongBits(minY);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ temp = Double.doubleToLongBits(minZ);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ temp = Double.doubleToLongBits(maxX);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ temp = Double.doubleToLongBits(maxY);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ temp = Double.doubleToLongBits(maxZ);
-+ result = 31 * result + (int) (temp ^ (temp >>> 32));
-+ return result;
-+ }
-+ }
-+ // Paper end
- }
-diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index dfe8eea789a6dd5476da0c194236dba3868a2cb7..7ead83d46e7bb3ee3586acf695b08f197f61f04a 100644
---- a/src/main/java/net/minecraft/world/level/Level.java
-+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -170,6 +170,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
- private org.spigotmc.TickLimiter entityLimiter;
- private org.spigotmc.TickLimiter tileLimiter;
- private int tileTickPosition;
-+ public final Map explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions
-
- public CraftWorld getWorld() {
- return this.world;
diff --git a/patches/server/0041-Disable-explosion-knockback.patch b/patches/server/0041-Disable-explosion-knockback.patch
deleted file mode 100644
index 68b32b3813ce..000000000000
--- a/patches/server/0041-Disable-explosion-knockback.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Sudzzy
-Date: Wed, 2 Mar 2016 14:48:03 -0600
-Subject: [PATCH] Disable explosion knockback
-
-
-diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
-index 4e382cfae7a3a1889bc36bad24c6ea38b7eb14a6..219f3abc6d3280077b53cfff97db7e724133f5a1 100644
---- a/src/main/java/net/minecraft/world/level/Explosion.java
-+++ b/src/main/java/net/minecraft/world/level/Explosion.java
-@@ -285,7 +285,7 @@ public class Explosion {
- if (entity instanceof LivingEntity) {
- LivingEntity entityliving = (LivingEntity) entity;
-
-- d13 = ProtectionEnchantment.getExplosionKnockbackAfterDampener(entityliving, d12);
-+ d13 = entity instanceof Player && level.paperConfig().environment.disableExplosionKnockback ? 0 : ProtectionEnchantment.getExplosionKnockbackAfterDampener(entityliving, d12); // Paper - Option to disable explosion knockback
- } else {
- d13 = d12;
- }
-@@ -299,7 +299,7 @@ public class Explosion {
- if (entity instanceof Player) {
- Player entityhuman = (Player) entity;
-
-- if (!entityhuman.isSpectator() && (!entityhuman.isCreative() || !entityhuman.getAbilities().flying)) {
-+ if (!entityhuman.isSpectator() && (!entityhuman.isCreative() || !entityhuman.getAbilities().flying) && !level.paperConfig().environment.disableExplosionKnockback) { // Paper - Option to disable explosion knockback
- this.hitPlayers.put(entityhuman, vec3d1);
- }
- }
diff --git a/patches/server/0041-Disable-thunder.patch b/patches/server/0041-Disable-thunder.patch
new file mode 100644
index 000000000000..812330feaa0a
--- /dev/null
+++ b/patches/server/0041-Disable-thunder.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Sudzzy
+Date: Wed, 2 Mar 2016 14:52:43 -0600
+Subject: [PATCH] Disable thunder
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
+index 1315822ce37e5011880b24afb4fbe18cd1dfe80f..ae4f429ccacc01e3f970fadf01570ec7da454721 100644
+--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
+@@ -609,7 +609,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+ ProfilerFiller gameprofilerfiller = this.getProfiler();
+
+ gameprofilerfiller.push("thunder");
+- if (flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot
++ if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - Option to disable thunder
+ BlockPos blockposition = this.findLightningTargetAround(this.getBlockRandomPos(j, 0, k, 15));
+
+ if (this.isRainingAt(blockposition)) {
diff --git a/patches/server/0042-Disable-ice-and-snow.patch b/patches/server/0042-Disable-ice-and-snow.patch
new file mode 100644
index 000000000000..b67a99ca1132
--- /dev/null
+++ b/patches/server/0042-Disable-ice-and-snow.patch
@@ -0,0 +1,24 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Sudzzy
+Date: Wed, 2 Mar 2016 14:57:24 -0600
+Subject: [PATCH] Disable ice and snow
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
+index ae4f429ccacc01e3f970fadf01570ec7da454721..c9113f7e0d9e1b9861f667c40e2702c6bb1d4e53 100644
+--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
+@@ -639,11 +639,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
+
+ gameprofilerfiller.popPush("iceandsnow");
+
++ if (!this.paperConfig().environment.disableIceAndSnow) { // Paper - Option to disable ice and snow
+ for (int l = 0; l < randomTickSpeed; ++l) {
+ if (this.random.nextInt(48) == 0) {
+ this.tickPrecipitation(this.getBlockRandomPos(j, 0, k, 15));
+ }
+ }
++ } // Paper - Option to disable ice and snow
+
+ gameprofilerfiller.popPush("tickBlocks");
+ timings.chunkTicksBlocks.startTiming(); // Paper
diff --git a/patches/server/0042-Disable-thunder.patch b/patches/server/0042-Disable-thunder.patch
deleted file mode 100644
index ac0e1ec07294..000000000000
--- a/patches/server/0042-Disable-thunder.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Sudzzy
-Date: Wed, 2 Mar 2016 14:52:43 -0600
-Subject: [PATCH] Disable thunder
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 5b304c0c701a74398ba46ef8766a3d707bbe6a07..40287f5dbdfb5526f4cba901ded9740009e29b00 100644
---- a/src/main/java/net/minecraft/server/level/ServerLevel.java
-+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -609,7 +609,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
- ProfilerFiller gameprofilerfiller = this.getProfiler();
-
- gameprofilerfiller.push("thunder");
-- if (flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot
-+ if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - Option to disable thunder
- BlockPos blockposition = this.findLightningTargetAround(this.getBlockRandomPos(j, 0, k, 15));
-
- if (this.isRainingAt(blockposition)) {
diff --git a/patches/server/0044-Configurable-mob-spawner-tick-rate.patch b/patches/server/0043-Configurable-mob-spawner-tick-rate.patch
similarity index 100%
rename from patches/server/0044-Configurable-mob-spawner-tick-rate.patch
rename to patches/server/0043-Configurable-mob-spawner-tick-rate.patch
diff --git a/patches/server/0043-Disable-ice-and-snow.patch b/patches/server/0043-Disable-ice-and-snow.patch
deleted file mode 100644
index 4ec16311b0af..000000000000
--- a/patches/server/0043-Disable-ice-and-snow.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Sudzzy
-Date: Wed, 2 Mar 2016 14:57:24 -0600
-Subject: [PATCH] Disable ice and snow
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 40287f5dbdfb5526f4cba901ded9740009e29b00..4b6fc197c6e0544f2ec993ea863e9dd560b05f11 100644
---- a/src/main/java/net/minecraft/server/level/ServerLevel.java
-+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -639,11 +639,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
-
- gameprofilerfiller.popPush("iceandsnow");
-
-+ if (!this.paperConfig().environment.disableIceAndSnow) { // Paper - Option to disable ice and snow
- for (int l = 0; l < randomTickSpeed; ++l) {
- if (this.random.nextInt(48) == 0) {
- this.tickPrecipitation(this.getBlockRandomPos(j, 0, k, 15));
- }
- }
-+ } // Paper - Option to disable ice and snow
-
- gameprofilerfiller.popPush("tickBlocks");
- timings.chunkTicksBlocks.startTiming(); // Paper
diff --git a/patches/server/0044-Implement-PlayerLocaleChangeEvent.patch b/patches/server/0044-Implement-PlayerLocaleChangeEvent.patch
new file mode 100644
index 000000000000..fa3a977c1000
--- /dev/null
+++ b/patches/server/0044-Implement-PlayerLocaleChangeEvent.patch
@@ -0,0 +1,56 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Isaac Moore
+Date: Tue, 19 Apr 2016 14:09:31 -0500
+Subject: [PATCH] Implement PlayerLocaleChangeEvent
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 3bb3312da2b91616d9d3bb4cb79259ee9e3479bd..f21174c1d50158330b9a48dba8409919a2229927 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -222,7 +222,7 @@ public class ServerPlayer extends Player {
+ private int levitationStartTime;
+ private boolean disconnected;
+ private int requestedViewDistance;
+- public String language = "en_us"; // CraftBukkit - default
++ public String language = null; // CraftBukkit - default // Paper - default to null
+ public java.util.Locale adventure$locale = java.util.Locale.US; // Paper
+ @Nullable
+ private Vec3 startingToFallPosition;
+@@ -272,7 +272,7 @@ public class ServerPlayer extends Player {
+ this.lastActionTime = Util.getMillis();
+ this.recipeBook = new ServerRecipeBook();
+ this.requestedViewDistance = 2;
+- this.language = "en_us";
++ this.language = null; // Paper - default to null
+ this.lastSectionPos = SectionPos.of(0, 0, 0);
+ this.chunkTrackingView = ChunkTrackingView.EMPTY;
+ this.respawnDimension = Level.OVERWORLD;
+@@ -1920,9 +1920,10 @@ public class ServerPlayer extends Player {
+ PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), this.getMainArm() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT);
+ this.server.server.getPluginManager().callEvent(event);
+ }
+- if (!this.language.equals(clientOptions.language())) {
++ if (this.language == null || !this.language.equals(clientOptions.language())) { // Paper
+ PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(this.getBukkitEntity(), clientOptions.language());
+ this.server.server.getPluginManager().callEvent(event);
++ this.server.server.getPluginManager().callEvent(new com.destroystokyo.paper.event.player.PlayerLocaleChangeEvent(this.getBukkitEntity(), this.language, clientOptions.language())); // Paper
+ }
+ // CraftBukkit end
+ this.language = clientOptions.language();
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 6e47cd5cc17ad7edff3d946364485bb01bf87a41..42b27e1b8bc317a4cd0fcc27a5d7ce2d69d33aeb 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -2336,7 +2336,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+
+ @Override
+ public String getLocale() {
+- return this.getHandle().language;
++ // Paper start - Locale change event
++ final String locale = this.getHandle().language;
++ return locale != null ? locale : "en_us";
++ // Paper end
+ }
+
+ // Paper start
diff --git a/patches/server/0046-Add-BeaconEffectEvent.patch b/patches/server/0045-Add-BeaconEffectEvent.patch
similarity index 100%
rename from patches/server/0046-Add-BeaconEffectEvent.patch
rename to patches/server/0045-Add-BeaconEffectEvent.patch
diff --git a/patches/server/0045-Implement-PlayerLocaleChangeEvent.patch b/patches/server/0045-Implement-PlayerLocaleChangeEvent.patch
deleted file mode 100644
index 914926f06ecb..000000000000
--- a/patches/server/0045-Implement-PlayerLocaleChangeEvent.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Isaac Moore
-Date: Tue, 19 Apr 2016 14:09:31 -0500
-Subject: [PATCH] Implement PlayerLocaleChangeEvent
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index c1006a1991e294fa69b1eb35f4224154b064671b..b0a548ed0abbe08df2cae771248a811fba3891da 100644
---- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
-+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-@@ -222,7 +222,7 @@ public class ServerPlayer extends Player {
- private int levitationStartTime;
- private boolean disconnected;
- private int requestedViewDistance;
-- public String language = "en_us"; // CraftBukkit - default
-+ public String language = null; // CraftBukkit - default // Paper - default to null
- public java.util.Locale adventure$locale = java.util.Locale.US; // Paper
- @Nullable
- private Vec3 startingToFallPosition;
-@@ -272,7 +272,7 @@ public class ServerPlayer extends Player {
- this.lastActionTime = Util.getMillis();
- this.recipeBook = new ServerRecipeBook();
- this.requestedViewDistance = 2;
-- this.language = "en_us";
-+ this.language = null; // Paper - default to null
- this.lastSectionPos = SectionPos.of(0, 0, 0);
- this.chunkTrackingView = ChunkTrackingView.EMPTY;
- this.respawnDimension = Level.OVERWORLD;
-@@ -1920,9 +1920,10 @@ public class ServerPlayer extends Player {
- PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), this.getMainArm() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT);
- this.server.server.getPluginManager().callEvent(event);
- }
-- if (!this.language.equals(clientOptions.language())) {
-+ if (this.language == null || !this.language.equals(clientOptions.language())) { // Paper
- PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(this.getBukkitEntity(), clientOptions.language());
- this.server.server.getPluginManager().callEvent(event);
-+ this.server.server.getPluginManager().callEvent(new com.destroystokyo.paper.event.player.PlayerLocaleChangeEvent(this.getBukkitEntity(), this.language, clientOptions.language())); // Paper
- }
- // CraftBukkit end
- this.language = clientOptions.language();
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 8b7f6ac3214d318bff41779ae80c48ce3ecd54ce..3eb1a36eb171d0b98ae005a61902274ef4b12b6e 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2285,7 +2285,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-
- @Override
- public String getLocale() {
-- return this.getHandle().language;
-+ // Paper start - Locale change event
-+ final String locale = this.getHandle().language;
-+ return locale != null ? locale : "en_us";
-+ // Paper end
- }
-
- // Paper start
diff --git a/patches/server/0046-Configurable-container-update-tick-rate.patch b/patches/server/0046-Configurable-container-update-tick-rate.patch
new file mode 100644
index 000000000000..7a2ea2cb5110
--- /dev/null
+++ b/patches/server/0046-Configurable-container-update-tick-rate.patch
@@ -0,0 +1,32 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Sudzzy
+Date: Wed, 2 Mar 2016 23:34:44 -0600
+Subject: [PATCH] Configurable container update tick rate
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index f21174c1d50158330b9a48dba8409919a2229927..429f3ed00c0c6d7c89138aa9a4b770e3e68b7ed7 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -247,6 +247,7 @@ public class ServerPlayer extends Player {
+ private RemoteChatSession chatSession;
+ private int containerCounter;
+ public boolean wonGame;
++ private int containerUpdateDelay; // Paper - Configurable container update tick rate
+
+ // CraftBukkit start
+ public String displayName;
+@@ -639,7 +640,12 @@ public class ServerPlayer extends Player {
+ --this.invulnerableTime;
+ }
+
+- this.containerMenu.broadcastChanges();
++ // Paper start - Configurable container update tick rate
++ if (--containerUpdateDelay <= 0) {
++ this.containerMenu.broadcastChanges();
++ containerUpdateDelay = this.level().paperConfig().tickRates.containerUpdate;
++ }
++ // Paper end - Configurable container update tick rate
+ if (!this.level().isClientSide && !this.containerMenu.stillValid(this)) {
+ this.closeContainer();
+ this.containerMenu = this.inventoryMenu;
diff --git a/patches/server/0047-Configurable-container-update-tick-rate.patch b/patches/server/0047-Configurable-container-update-tick-rate.patch
deleted file mode 100644
index 15658964ad6d..000000000000
--- a/patches/server/0047-Configurable-container-update-tick-rate.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Sudzzy
-Date: Wed, 2 Mar 2016 23:34:44 -0600
-Subject: [PATCH] Configurable container update tick rate
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index b0a548ed0abbe08df2cae771248a811fba3891da..7e777ab6998203e031fb8387b1521bff3d86f11a 100644
---- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
-+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-@@ -247,6 +247,7 @@ public class ServerPlayer extends Player {
- private RemoteChatSession chatSession;
- private int containerCounter;
- public boolean wonGame;
-+ private int containerUpdateDelay; // Paper - Configurable container update tick rate
-
- // CraftBukkit start
- public String displayName;
-@@ -639,7 +640,12 @@ public class ServerPlayer extends Player {
- --this.invulnerableTime;
- }
-
-- this.containerMenu.broadcastChanges();
-+ // Paper start - Configurable container update tick rate
-+ if (--containerUpdateDelay <= 0) {
-+ this.containerMenu.broadcastChanges();
-+ containerUpdateDelay = this.level().paperConfig().tickRates.containerUpdate;
-+ }
-+ // Paper end - Configurable container update tick rate
- if (!this.level().isClientSide && !this.containerMenu.stillValid(this)) {
- this.closeContainer();
- this.containerMenu = this.inventoryMenu;
diff --git a/patches/server/0048-Use-UserCache-for-player-heads.patch b/patches/server/0047-Use-UserCache-for-player-heads.patch
similarity index 100%
rename from patches/server/0048-Use-UserCache-for-player-heads.patch
rename to patches/server/0047-Use-UserCache-for-player-heads.patch
diff --git a/patches/server/0049-Disable-spigot-tick-limiters.patch b/patches/server/0048-Disable-spigot-tick-limiters.patch
similarity index 100%
rename from patches/server/0049-Disable-spigot-tick-limiters.patch
rename to patches/server/0048-Disable-spigot-tick-limiters.patch
diff --git a/patches/server/0050-Add-PlayerInitialSpawnEvent.patch b/patches/server/0049-Add-PlayerInitialSpawnEvent.patch
similarity index 100%
rename from patches/server/0050-Add-PlayerInitialSpawnEvent.patch
rename to patches/server/0049-Add-PlayerInitialSpawnEvent.patch
diff --git a/patches/server/0051-Configurable-Disabling-Cat-Chest-Detection.patch b/patches/server/0050-Configurable-Disabling-Cat-Chest-Detection.patch
similarity index 100%
rename from patches/server/0051-Configurable-Disabling-Cat-Chest-Detection.patch
rename to patches/server/0050-Configurable-Disabling-Cat-Chest-Detection.patch
diff --git a/patches/server/0051-Improve-Player-chat-API-handling.patch b/patches/server/0051-Improve-Player-chat-API-handling.patch
new file mode 100644
index 000000000000..80ec033d0404
--- /dev/null
+++ b/patches/server/0051-Improve-Player-chat-API-handling.patch
@@ -0,0 +1,80 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar
+Date: Thu, 3 Mar 2016 01:17:12 -0600
+Subject: [PATCH] Improve Player chat API handling
+
+Properly split up the chat and command handling to reflect the server now
+having separate packets for both, and the client always using the correct packet. Text
+from a chat packet should never be parsed into a command, even if it starts with the `/`
+character.
+
+Add a missing async catcher and improve Spigot's async catcher error message.
+
+== AT ==
+public net.minecraft.server.network.ServerGamePacketListenerImpl isChatMessageIllegal(Ljava/lang/String;)Z
+
+Co-authored-by: Jake Potrebic
+Co-authored-by: SoSeDiK
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 01c70d149b306030c775427f744c4dfab19411cf..dedd0aa332412eec5f976959b67da5405d980ded 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -1930,7 +1930,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ }
+ OutgoingChatMessage outgoing = OutgoingChatMessage.create(original);
+
+- if (!async && s.startsWith("/")) {
++ if (false && !async && s.startsWith("/")) { // Paper - Don't handle commands in chat logic
+ this.handleCommand(s);
+ } else if (this.player.getChatVisibility() == ChatVisiblity.SYSTEM) {
+ // Do nothing, this is coming from a plugin
+@@ -2017,7 +2017,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ }
+ }
+
+- private void handleCommand(String s) {
++ public void handleCommand(String s) { // Paper - private -> public
++ org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher
+ co.aikar.timings.MinecraftTimings.playerCommandTimer.startTiming(); // Paper
+ if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot
+ this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s);
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index 56a63adc3c0c919594c3f2646d4cf5b86b5c6f1e..5b22714d6f5eb8318275ca0bf01597be8d55f118 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -897,7 +897,7 @@ public final class CraftServer implements Server {
+ public boolean dispatchCommand(CommandSender sender, String commandLine) {
+ Preconditions.checkArgument(sender != null, "sender cannot be null");
+ Preconditions.checkArgument(commandLine != null, "commandLine cannot be null");
+- org.spigotmc.AsyncCatcher.catchOp("command dispatch"); // Spigot
++ org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + commandLine); // Spigot // Paper - Include command in error message
+
+ if (this.commandMap.dispatch(sender, commandLine)) {
+ return true;
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 42b27e1b8bc317a4cd0fcc27a5d7ce2d69d33aeb..6f3c450cd03fa4848175cada63be2dcf5abe45ba 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -462,7 +462,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+
+ if (this.getHandle().connection == null) return;
+
+- this.getHandle().connection.chat(msg, PlayerChatMessage.system(msg), false);
++ // Paper start - Improve chat handling
++ if (ServerGamePacketListenerImpl.isChatMessageIllegal(msg)) {
++ this.getHandle().connection.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters"));
++ } else {
++ if (msg.startsWith("/")) {
++ this.getHandle().connection.handleCommand(msg);
++ } else {
++ final PlayerChatMessage playerChatMessage = PlayerChatMessage.system(msg).withResult(new net.minecraft.network.chat.ChatDecorator.ModernResult(Component.literal(msg), true, false));
++ // TODO chat decorating
++ // TODO text filtering
++ this.getHandle().connection.chat(msg, playerChatMessage, false);
++ }
++ }
++ // Paper end - Improve chat handling
+ }
+
+ @Override
diff --git a/patches/server/0052-All-chunks-are-slime-spawn-chunks-toggle.patch b/patches/server/0052-All-chunks-are-slime-spawn-chunks-toggle.patch
new file mode 100644
index 000000000000..a1e73b56c2b2
--- /dev/null
+++ b/patches/server/0052-All-chunks-are-slime-spawn-chunks-toggle.patch
@@ -0,0 +1,32 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: vemacs
+Date: Thu, 3 Mar 2016 01:19:22 -0600
+Subject: [PATCH] All chunks are slime spawn chunks toggle
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java
+index 8b2206c5c56341ecd96837bdb3e0c6ab7c874af5..897c815fb448d1e9ca75b7f8b93b4021dccf7596 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/Slime.java
++++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java
+@@ -338,7 +338,7 @@ public class Slime extends Mob implements Enemy {
+ }
+
+ ChunkPos chunkcoordintpair = new ChunkPos(pos);
+- boolean flag = WorldgenRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((WorldGenLevel) world).getSeed(), world.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot
++ boolean flag = world.getMinecraftWorld().paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((WorldGenLevel) world).getSeed(), world.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot // Paper
+
+ if (random.nextInt(10) == 0 && flag && pos.getY() < 40) {
+ return checkMobSpawnRules(type, world, spawnReason, pos, random);
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
+index d09f0f68031135f86a864e69eb8d65ceddd7a9b1..70999e95116d50de1a7fecdd91bbad0bac2bf1d8 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
+@@ -217,7 +217,7 @@ public class CraftChunk implements Chunk {
+ @Override
+ public boolean isSlimeChunk() {
+ // 987234911L is deterimined in EntitySlime when seeing if a slime can spawn in a chunk
+- return WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), this.worldServer.spigotConfig.slimeSeed).nextInt(10) == 0;
++ return this.worldServer.paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), worldServer.spigotConfig.slimeSeed).nextInt(10) == 0; // Paper
+ }
+
+ @Override
diff --git a/patches/server/0052-Improve-Player-chat-API-handling.patch b/patches/server/0052-Improve-Player-chat-API-handling.patch
deleted file mode 100644
index 5de45ed559d5..000000000000
--- a/patches/server/0052-Improve-Player-chat-API-handling.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar
-Date: Thu, 3 Mar 2016 01:17:12 -0600
-Subject: [PATCH] Improve Player chat API handling
-
-Properly split up the chat and command handling to reflect the server now
-having separate packets for both, and the client always using the correct packet. Text
-from a chat packet should never be parsed into a command, even if it starts with the `/`
-character.
-
-Add a missing async catcher and improve Spigot's async catcher error message.
-
-== AT ==
-public net.minecraft.server.network.ServerGamePacketListenerImpl isChatMessageIllegal(Ljava/lang/String;)Z
-
-Co-authored-by: Jake Potrebic
-Co-authored-by: SoSeDiK
-
-diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index ce7caf08865df9ff032ba6c42308ea3ce4de6226..04e68886a5385234701962f2502948052074515e 100644
---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1930,7 +1930,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
- }
- OutgoingChatMessage outgoing = OutgoingChatMessage.create(original);
-
-- if (!async && s.startsWith("/")) {
-+ if (false && !async && s.startsWith("/")) { // Paper - Don't handle commands in chat logic
- this.handleCommand(s);
- } else if (this.player.getChatVisibility() == ChatVisiblity.SYSTEM) {
- // Do nothing, this is coming from a plugin
-@@ -2017,7 +2017,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
- }
- }
-
-- private void handleCommand(String s) {
-+ public void handleCommand(String s) { // Paper - private -> public
-+ org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher
- co.aikar.timings.MinecraftTimings.playerCommandTimer.startTiming(); // Paper
- if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot
- this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s);
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 4fbc98bc2fe808a15f974b0abf614781fe66e1c4..6568af2428be41c6d8baa8cf2a486ec4942d44d7 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -885,7 +885,7 @@ public final class CraftServer implements Server {
- public boolean dispatchCommand(CommandSender sender, String commandLine) {
- Preconditions.checkArgument(sender != null, "sender cannot be null");
- Preconditions.checkArgument(commandLine != null, "commandLine cannot be null");
-- org.spigotmc.AsyncCatcher.catchOp("command dispatch"); // Spigot
-+ org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + commandLine); // Spigot // Paper - Include command in error message
-
- if (this.commandMap.dispatch(sender, commandLine)) {
- return true;
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index ce54892f4a9b745779613af769783cb388336103..0017679b115de12f2e272db7ba3c11315086680f 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -456,7 +456,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-
- if (this.getHandle().connection == null) return;
-
-- this.getHandle().connection.chat(msg, PlayerChatMessage.system(msg), false);
-+ // Paper start - Improve chat handling
-+ if (ServerGamePacketListenerImpl.isChatMessageIllegal(msg)) {
-+ this.getHandle().connection.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters"));
-+ } else {
-+ if (msg.startsWith("/")) {
-+ this.getHandle().connection.handleCommand(msg);
-+ } else {
-+ final PlayerChatMessage playerChatMessage = PlayerChatMessage.system(msg).withResult(new net.minecraft.network.chat.ChatDecorator.ModernResult(Component.literal(msg), true, false));
-+ // TODO chat decorating
-+ // TODO text filtering
-+ this.getHandle().connection.chat(msg, playerChatMessage, false);
-+ }
-+ }
-+ // Paper end - Improve chat handling
- }
-
- @Override
diff --git a/patches/server/0053-All-chunks-are-slime-spawn-chunks-toggle.patch b/patches/server/0053-All-chunks-are-slime-spawn-chunks-toggle.patch
deleted file mode 100644
index 55c1f1b35bcf..000000000000
--- a/patches/server/0053-All-chunks-are-slime-spawn-chunks-toggle.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: vemacs
-Date: Thu, 3 Mar 2016 01:19:22 -0600
-Subject: [PATCH] All chunks are slime spawn chunks toggle
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java
-index 8b2206c5c56341ecd96837bdb3e0c6ab7c874af5..897c815fb448d1e9ca75b7f8b93b4021dccf7596 100644
---- a/src/main/java/net/minecraft/world/entity/monster/Slime.java
-+++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java
-@@ -338,7 +338,7 @@ public class Slime extends Mob implements Enemy {
- }
-
- ChunkPos chunkcoordintpair = new ChunkPos(pos);
-- boolean flag = WorldgenRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((WorldGenLevel) world).getSeed(), world.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot
-+ boolean flag = world.getMinecraftWorld().paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((WorldGenLevel) world).getSeed(), world.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot // Paper
-
- if (random.nextInt(10) == 0 && flag && pos.getY() < 40) {
- return checkMobSpawnRules(type, world, spawnReason, pos, random);
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
-index b1aeb021e53a233bfb0439d38f1a889ed6fc301d..491416754e1c5e8c2b345b57f45289906c7932ba 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
-@@ -215,7 +215,7 @@ public class CraftChunk implements Chunk {
- @Override
- public boolean isSlimeChunk() {
- // 987234911L is deterimined in EntitySlime when seeing if a slime can spawn in a chunk
-- return WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), this.worldServer.spigotConfig.slimeSeed).nextInt(10) == 0;
-+ return this.worldServer.paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), worldServer.spigotConfig.slimeSeed).nextInt(10) == 0; // Paper
- }
-
- @Override
diff --git a/patches/server/0053-Expose-server-CommandMap.patch b/patches/server/0053-Expose-server-CommandMap.patch
new file mode 100644
index 000000000000..9e0239735d22
--- /dev/null
+++ b/patches/server/0053-Expose-server-CommandMap.patch
@@ -0,0 +1,18 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: kashike
+Date: Thu, 3 Mar 2016 02:15:57 -0600
+Subject: [PATCH] Expose server CommandMap
+
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index 5b22714d6f5eb8318275ca0bf01597be8d55f118..6135e8c0669886260afacdaa7405bf55597b17a6 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -2124,6 +2124,7 @@ public final class CraftServer implements Server {
+ return this.helpMap;
+ }
+
++ @Override // Paper - add override
+ public SimpleCommandMap getCommandMap() {
+ return this.commandMap;
+ }
diff --git a/patches/server/0054-Be-a-bit-more-informative-in-maxHealth-exception.patch b/patches/server/0054-Be-a-bit-more-informative-in-maxHealth-exception.patch
new file mode 100644
index 000000000000..aadcfbc397be
--- /dev/null
+++ b/patches/server/0054-Be-a-bit-more-informative-in-maxHealth-exception.patch
@@ -0,0 +1,24 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: kashike
+Date: Thu, 3 Mar 2016 02:18:39 -0600
+Subject: [PATCH] Be a bit more informative in maxHealth exception
+
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+index bcab4757869428e20c67907684e02b64d2958e88..a73a5a8291ddd954f2c7b73a4895933e715c5d68 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+@@ -102,7 +102,12 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+ @Override
+ public void setHealth(double health) {
+ health = (float) health;
+- Preconditions.checkArgument(health >= 0 && health <= this.getMaxHealth(), "Health value (%s) must be between 0 and %s", health, this.getMaxHealth());
++ // Paper start - Be more informative
++ Preconditions.checkArgument(health >= 0 && health <= this.getMaxHealth(),
++ "Health value (%s) must be between 0 and %s. (attribute base value: %s%s)",
++ health, this.getMaxHealth(), this.getHandle().getAttribute(Attributes.MAX_HEALTH).getBaseValue(), this instanceof CraftPlayer ? ", player: " + this.getName() : ""
++ );
++ // Paper end
+
+ // during world generation, we don't want to run logic for dropping items and xp
+ if (this.getHandle().generation && health == 0) {
diff --git a/patches/server/0054-Expose-server-CommandMap.patch b/patches/server/0054-Expose-server-CommandMap.patch
deleted file mode 100644
index 03a0a271b530..000000000000
--- a/patches/server/0054-Expose-server-CommandMap.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: kashike
-Date: Thu, 3 Mar 2016 02:15:57 -0600
-Subject: [PATCH] Expose server CommandMap
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 6568af2428be41c6d8baa8cf2a486ec4942d44d7..669e75549d0cc1d9c506f362e27b2f1717ec8d5c 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -2112,6 +2112,7 @@ public final class CraftServer implements Server {
- return this.helpMap;
- }
-
-+ @Override // Paper - add override
- public SimpleCommandMap getCommandMap() {
- return this.commandMap;
- }
diff --git a/patches/server/0055-Be-a-bit-more-informative-in-maxHealth-exception.patch b/patches/server/0055-Be-a-bit-more-informative-in-maxHealth-exception.patch
deleted file mode 100644
index 46b700c3222b..000000000000
--- a/patches/server/0055-Be-a-bit-more-informative-in-maxHealth-exception.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: kashike
-Date: Thu, 3 Mar 2016 02:18:39 -0600
-Subject: [PATCH] Be a bit more informative in maxHealth exception
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-index bad29a542e31a6fe2c75bfd008653ca6aa409df8..5825f942db3b9870631ff093708dee0e930fccc8 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-@@ -101,7 +101,12 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
- @Override
- public void setHealth(double health) {
- health = (float) health;
-- Preconditions.checkArgument(health >= 0 && health <= this.getMaxHealth(), "Health value (%s) must be between 0 and %s", health, this.getMaxHealth());
-+ // Paper start - Be more informative
-+ Preconditions.checkArgument(health >= 0 && health <= this.getMaxHealth(),
-+ "Health value (%s) must be between 0 and %s. (attribute base value: %s%s)",
-+ health, this.getMaxHealth(), this.getHandle().getAttribute(Attributes.MAX_HEALTH).getBaseValue(), this instanceof CraftPlayer ? ", player: " + this.getName() : ""
-+ );
-+ // Paper end
-
- // during world generation, we don't want to run logic for dropping items and xp
- if (this.getHandle().generation && health == 0) {
diff --git a/patches/server/0055-Player-Tab-List-and-Title-APIs.patch b/patches/server/0055-Player-Tab-List-and-Title-APIs.patch
new file mode 100644
index 000000000000..ff7e5579f017
--- /dev/null
+++ b/patches/server/0055-Player-Tab-List-and-Title-APIs.patch
@@ -0,0 +1,177 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Techcable
+Date: Thu, 3 Mar 2016 02:32:10 -0600
+Subject: [PATCH] Player Tab List and Title APIs
+
+
+diff --git a/src/main/java/net/minecraft/network/FriendlyByteBuf.java b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
+index 53f033d2d887909f5f905c00122d1b09809e5e3c..b9dd91927cb259789ad71b2241024c5fa2586d57 100644
+--- a/src/main/java/net/minecraft/network/FriendlyByteBuf.java
++++ b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
+@@ -545,6 +545,12 @@ public class FriendlyByteBuf extends ByteBuf {
+ return this.writeWithCodec(NbtOps.INSTANCE, ComponentSerialization.localizedCodec(this.adventure$locale), text);
+ // Paper end - adventure; support writing adventure components directly and server-side translations
+ }
++ // Paper start - deprecated Tab List & Title APIs
++ @Deprecated
++ public FriendlyByteBuf writeComponent(final net.md_5.bungee.api.chat.BaseComponent[] component) {
++ return this.writeComponent(java.util.Objects.requireNonNull(Component.Serializer.fromJson(net.md_5.bungee.chat.ComponentSerializer.toString(component))));
++ }
++ // Paper end - deprecated Tab List & Title APIs
+
+ public > T readEnum(Class enumClass) {
+ return ((T[]) enumClass.getEnumConstants())[this.readVarInt()]; // CraftBukkit - fix decompile error
+diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java
+index e77bd5bb66279f579fad4fdcc8b0606410922e9e..4c05fee93eb20044a4198c43d5ae1eebebaabaf7 100644
+--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java
++++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java
+@@ -7,6 +7,7 @@ import net.minecraft.network.protocol.Packet;
+ public class ClientboundSetSubtitleTextPacket implements Packet {
+ private final Component text;
+ public net.kyori.adventure.text.Component adventure$text; // Paper
++ public net.md_5.bungee.api.chat.BaseComponent[] components; // Paper
+
+ public ClientboundSetSubtitleTextPacket(Component subtitle) {
+ this.text = subtitle;
+@@ -21,6 +22,8 @@ public class ClientboundSetSubtitleTextPacket implements Packet {
+ private final Component text;
+ public net.kyori.adventure.text.Component adventure$text; // Paper
++ public net.md_5.bungee.api.chat.BaseComponent[] components; // Paper
+
+ public ClientboundSetTitleTextPacket(Component title) {
+ this.text = title;
+@@ -21,6 +22,8 @@ public class ClientboundSetTitleTextPacket implements Packet
+Date: Thu, 3 Mar 2016 02:46:17 -0600
+Subject: [PATCH] Add configurable portal search radius
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 3577829c2386779913f4d2aebd1825051da2d364..4c7a2d64ab4a5269fdea0b30e6c91fa1cb9f509c 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -3179,7 +3179,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ double d0 = DimensionType.getTeleportationScale(this.level().dimensionType(), destination.dimensionType());
+ BlockPos blockposition = worldborder.clampToBounds(this.getX() * d0, this.getY(), this.getZ() * d0);
+ // CraftBukkit start
+- CraftPortalEvent event = this.callPortalEvent(this, destination, new Vec3(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, flag2 ? 16 : 128, 16);
++ // Paper start - Configurable portal search radius
++ int portalSearchRadius = destination.paperConfig().environment.portalSearchRadius;
++ if (level.paperConfig().environment.portalSearchVanillaDimensionScaling && flag2) { // == THE_NETHER
++ portalSearchRadius = (int) (portalSearchRadius / destination.dimensionType().coordinateScale());
++ }
++ // Paper end - Configurable portal search radius
++ CraftPortalEvent event = this.callPortalEvent(this, destination, new Vec3(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, portalSearchRadius, destination.paperConfig().environment.portalCreateRadius); // Paper start - configurable portal radius
+ if (event == null) {
+ return null;
+ }
+diff --git a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
+index 550b7bc694d861c084769265f6c49c4d44033296..afdd4ecbff21e2172b390bcbdf74f3c1bbddafcc 100644
+--- a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
++++ b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
+@@ -43,7 +43,7 @@ public class PortalForcer {
+
+ public Optional findPortalAround(BlockPos pos, boolean destIsNether, WorldBorder worldBorder) {
+ // CraftBukkit start
+- return this.findPortalAround(pos, worldBorder, destIsNether ? 16 : 128); // Search Radius
++ return this.findPortalAround(pos, worldBorder, destIsNether ? level.paperConfig().environment.portalCreateRadius : level.paperConfig().environment.portalSearchRadius); // Search Radius // Paper - Configurable portal search radius
+ }
+
+ public Optional findPortalAround(BlockPos blockposition, WorldBorder worldborder, int i) {
diff --git a/patches/server/0056-Player-Tab-List-and-Title-APIs.patch b/patches/server/0056-Player-Tab-List-and-Title-APIs.patch
deleted file mode 100644
index 8776c8880aa9..000000000000
--- a/patches/server/0056-Player-Tab-List-and-Title-APIs.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Techcable
-Date: Thu, 3 Mar 2016 02:32:10 -0600
-Subject: [PATCH] Player Tab List and Title APIs
-
-
-diff --git a/src/main/java/net/minecraft/network/FriendlyByteBuf.java b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
-index 53f033d2d887909f5f905c00122d1b09809e5e3c..b9dd91927cb259789ad71b2241024c5fa2586d57 100644
---- a/src/main/java/net/minecraft/network/FriendlyByteBuf.java
-+++ b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
-@@ -545,6 +545,12 @@ public class FriendlyByteBuf extends ByteBuf {
- return this.writeWithCodec(NbtOps.INSTANCE, ComponentSerialization.localizedCodec(this.adventure$locale), text);
- // Paper end - adventure; support writing adventure components directly and server-side translations
- }
-+ // Paper start - deprecated Tab List & Title APIs
-+ @Deprecated
-+ public FriendlyByteBuf writeComponent(final net.md_5.bungee.api.chat.BaseComponent[] component) {
-+ return this.writeComponent(java.util.Objects.requireNonNull(Component.Serializer.fromJson(net.md_5.bungee.chat.ComponentSerializer.toString(component))));
-+ }
-+ // Paper end - deprecated Tab List & Title APIs
-
- public > T readEnum(Class enumClass) {
- return ((T[]) enumClass.getEnumConstants())[this.readVarInt()]; // CraftBukkit - fix decompile error
-diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java
-index e77bd5bb66279f579fad4fdcc8b0606410922e9e..4c05fee93eb20044a4198c43d5ae1eebebaabaf7 100644
---- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java
-+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSetSubtitleTextPacket.java
-@@ -7,6 +7,7 @@ import net.minecraft.network.protocol.Packet;
- public class ClientboundSetSubtitleTextPacket implements Packet {
- private final Component text;
- public net.kyori.adventure.text.Component adventure$text; // Paper
-+ public net.md_5.bungee.api.chat.BaseComponent[] components; // Paper
-
- public ClientboundSetSubtitleTextPacket(Component subtitle) {
- this.text = subtitle;
-@@ -21,6 +22,8 @@ public class ClientboundSetSubtitleTextPacket implements Packet {
- private final Component text;
- public net.kyori.adventure.text.Component adventure$text; // Paper
-+ public net.md_5.bungee.api.chat.BaseComponent[] components; // Paper
-
- public ClientboundSetTitleTextPacket(Component title) {
- this.text = title;
-@@ -21,6 +22,8 @@ public class ClientboundSetTitleTextPacket implements Packet
-Date: Thu, 3 Mar 2016 02:46:17 -0600
-Subject: [PATCH] Add configurable portal search radius
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 8e4f8849acfede8eec04527b67a3405ae805633d..bef8f3574ecb0d957f9041639b56c94b41913f99 100644
---- a/src/main/java/net/minecraft/world/entity/Entity.java
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3181,7 +3181,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- double d0 = DimensionType.getTeleportationScale(this.level().dimensionType(), destination.dimensionType());
- BlockPos blockposition = worldborder.clampToBounds(this.getX() * d0, this.getY(), this.getZ() * d0);
- // CraftBukkit start
-- CraftPortalEvent event = this.callPortalEvent(this, destination, new Vec3(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, flag2 ? 16 : 128, 16);
-+ // Paper start - Configurable portal search radius
-+ int portalSearchRadius = destination.paperConfig().environment.portalSearchRadius;
-+ if (level.paperConfig().environment.portalSearchVanillaDimensionScaling && flag2) { // == THE_NETHER
-+ portalSearchRadius = (int) (portalSearchRadius / destination.dimensionType().coordinateScale());
-+ }
-+ // Paper end - Configurable portal search radius
-+ CraftPortalEvent event = this.callPortalEvent(this, destination, new Vec3(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, portalSearchRadius, destination.paperConfig().environment.portalCreateRadius); // Paper start - configurable portal radius
- if (event == null) {
- return null;
- }
-diff --git a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
-index 550b7bc694d861c084769265f6c49c4d44033296..afdd4ecbff21e2172b390bcbdf74f3c1bbddafcc 100644
---- a/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
-+++ b/src/main/java/net/minecraft/world/level/portal/PortalForcer.java
-@@ -43,7 +43,7 @@ public class PortalForcer {
-
- public Optional findPortalAround(BlockPos pos, boolean destIsNether, WorldBorder worldBorder) {
- // CraftBukkit start
-- return this.findPortalAround(pos, worldBorder, destIsNether ? 16 : 128); // Search Radius
-+ return this.findPortalAround(pos, worldBorder, destIsNether ? level.paperConfig().environment.portalCreateRadius : level.paperConfig().environment.portalSearchRadius); // Search Radius // Paper - Configurable portal search radius
- }
-
- public Optional findPortalAround(BlockPos blockposition, WorldBorder worldborder, int i) {
diff --git a/patches/server/0057-Add-velocity-warnings.patch b/patches/server/0057-Add-velocity-warnings.patch
new file mode 100644
index 000000000000..f81b57b34483
--- /dev/null
+++ b/patches/server/0057-Add-velocity-warnings.patch
@@ -0,0 +1,85 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Joseph Hirschfeld
+Date: Thu, 3 Mar 2016 02:48:12 -0600
+Subject: [PATCH] Add velocity warnings
+
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index 6135e8c0669886260afacdaa7405bf55597b17a6..2b2d0c8ed68eb86812877026a0bb5c4a6389c3d4 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -300,6 +300,7 @@ public final class CraftServer implements Server {
+ public boolean ignoreVanillaPermissions = false;
+ private final List playerView;
+ public int reloadCount;
++ public static Exception excessiveVelEx; // Paper - Velocity warnings
+
+ static {
+ ConfigurationSerialization.registerClass(CraftOfflinePlayer.class);
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+index 49294a8d580d891f21d8d4cbae14ae477c01ff8d..74937603e7b8308fd314d650d9d966e8abd2c725 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+@@ -128,10 +128,40 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+ public void setVelocity(Vector velocity) {
+ Preconditions.checkArgument(velocity != null, "velocity");
+ velocity.checkFinite();
++ // Paper start - Warn server owners when plugins try to set super high velocities
++ if (!(this instanceof org.bukkit.entity.Projectile || this instanceof org.bukkit.entity.Minecart) && isUnsafeVelocity(velocity)) {
++ CraftServer.excessiveVelEx = new Exception("Excessive velocity set detected: tried to set velocity of entity " + entity.getScoreboardName() + " id #" + getEntityId() + " to (" + velocity.getX() + "," + velocity.getY() + "," + velocity.getZ() + ").");
++ }
++ // Paper end
+ this.entity.setDeltaMovement(CraftVector.toNMS(velocity));
+ this.entity.hurtMarked = true;
+ }
+
++ // Paper start
++ /**
++ * Checks if the given velocity is not necessarily safe in all situations.
++ * This function returning true does not mean the velocity is dangerous or to be avoided, only that it may be
++ * a detriment to performance on the server.
++ *
++ * It is not to be used as a hard rule of any sort.
++ * Paper only uses it to warn server owners in watchdog crashes.
++ *
++ * @param vel incoming velocity to check
++ * @return if the velocity has the potential to be a performance detriment
++ */
++ private static boolean isUnsafeVelocity(Vector vel) {
++ final double x = vel.getX();
++ final double y = vel.getY();
++ final double z = vel.getZ();
++
++ if (x > 4 || x < -4 || y > 4 || y < -4 || z > 4 || z < -4) {
++ return true;
++ }
++
++ return false;
++ }
++ // Paper end
++
+ @Override
+ public double getHeight() {
+ return this.getHandle().getBbHeight();
+diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
+index 231b4e3552b17f7803815a433a5ece440c227cc6..4bfc2f1729e45e36307a98bd69de9c820123cb8e 100644
+--- a/src/main/java/org/spigotmc/WatchdogThread.java
++++ b/src/main/java/org/spigotmc/WatchdogThread.java
+@@ -81,6 +81,17 @@ public class WatchdogThread extends Thread
+ log.log( Level.SEVERE, "near " + net.minecraft.world.level.Level.lastPhysicsProblem );
+ }
+ //
++ // Paper start - Warn in watchdog if an excessive velocity was ever set
++ if (org.bukkit.craftbukkit.CraftServer.excessiveVelEx != null) {
++ log.log(Level.SEVERE, "------------------------------");
++ log.log(Level.SEVERE, "During the run of the server, a plugin set an excessive velocity on an entity");
++ log.log(Level.SEVERE, "This may be the cause of the issue, or it may be entirely unrelated");
++ log.log(Level.SEVERE, org.bukkit.craftbukkit.CraftServer.excessiveVelEx.getMessage());
++ for (StackTraceElement stack : org.bukkit.craftbukkit.CraftServer.excessiveVelEx.getStackTrace()) {
++ log.log( Level.SEVERE, "\t\t" + stack );
++ }
++ }
++ // Paper end
+ log.log( Level.SEVERE, "------------------------------" );
+ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper
+ WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
diff --git a/patches/server/0058-Add-velocity-warnings.patch b/patches/server/0058-Add-velocity-warnings.patch
deleted file mode 100644
index ad923e70d1fa..000000000000
--- a/patches/server/0058-Add-velocity-warnings.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Joseph Hirschfeld
-Date: Thu, 3 Mar 2016 02:48:12 -0600
-Subject: [PATCH] Add velocity warnings
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 669e75549d0cc1d9c506f362e27b2f1717ec8d5c..908808099d0b7c3320f447330a441a536ce07421 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -298,6 +298,7 @@ public final class CraftServer implements Server {
- public boolean ignoreVanillaPermissions = false;
- private final List playerView;
- public int reloadCount;
-+ public static Exception excessiveVelEx; // Paper - Velocity warnings
-
- static {
- ConfigurationSerialization.registerClass(CraftOfflinePlayer.class);
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index 49294a8d580d891f21d8d4cbae14ae477c01ff8d..74937603e7b8308fd314d650d9d966e8abd2c725 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -128,10 +128,40 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
- public void setVelocity(Vector velocity) {
- Preconditions.checkArgument(velocity != null, "velocity");
- velocity.checkFinite();
-+ // Paper start - Warn server owners when plugins try to set super high velocities
-+ if (!(this instanceof org.bukkit.entity.Projectile || this instanceof org.bukkit.entity.Minecart) && isUnsafeVelocity(velocity)) {
-+ CraftServer.excessiveVelEx = new Exception("Excessive velocity set detected: tried to set velocity of entity " + entity.getScoreboardName() + " id #" + getEntityId() + " to (" + velocity.getX() + "," + velocity.getY() + "," + velocity.getZ() + ").");
-+ }
-+ // Paper end
- this.entity.setDeltaMovement(CraftVector.toNMS(velocity));
- this.entity.hurtMarked = true;
- }
-
-+ // Paper start
-+ /**
-+ * Checks if the given velocity is not necessarily safe in all situations.
-+ * This function returning true does not mean the velocity is dangerous or to be avoided, only that it may be
-+ * a detriment to performance on the server.
-+ *
-+ * It is not to be used as a hard rule of any sort.
-+ * Paper only uses it to warn server owners in watchdog crashes.
-+ *
-+ * @param vel incoming velocity to check
-+ * @return if the velocity has the potential to be a performance detriment
-+ */
-+ private static boolean isUnsafeVelocity(Vector vel) {
-+ final double x = vel.getX();
-+ final double y = vel.getY();
-+ final double z = vel.getZ();
-+
-+ if (x > 4 || x < -4 || y > 4 || y < -4 || z > 4 || z < -4) {
-+ return true;
-+ }
-+
-+ return false;
-+ }
-+ // Paper end
-+
- @Override
- public double getHeight() {
- return this.getHandle().getBbHeight();
-diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
-index 231b4e3552b17f7803815a433a5ece440c227cc6..4bfc2f1729e45e36307a98bd69de9c820123cb8e 100644
---- a/src/main/java/org/spigotmc/WatchdogThread.java
-+++ b/src/main/java/org/spigotmc/WatchdogThread.java
-@@ -81,6 +81,17 @@ public class WatchdogThread extends Thread
- log.log( Level.SEVERE, "near " + net.minecraft.world.level.Level.lastPhysicsProblem );
- }
- //
-+ // Paper start - Warn in watchdog if an excessive velocity was ever set
-+ if (org.bukkit.craftbukkit.CraftServer.excessiveVelEx != null) {
-+ log.log(Level.SEVERE, "------------------------------");
-+ log.log(Level.SEVERE, "During the run of the server, a plugin set an excessive velocity on an entity");
-+ log.log(Level.SEVERE, "This may be the cause of the issue, or it may be entirely unrelated");
-+ log.log(Level.SEVERE, org.bukkit.craftbukkit.CraftServer.excessiveVelEx.getMessage());
-+ for (StackTraceElement stack : org.bukkit.craftbukkit.CraftServer.excessiveVelEx.getStackTrace()) {
-+ log.log( Level.SEVERE, "\t\t" + stack );
-+ }
-+ }
-+ // Paper end
- log.log( Level.SEVERE, "------------------------------" );
- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper
- WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
diff --git a/patches/server/0058-Configurable-inter-world-teleportation-safety.patch b/patches/server/0058-Configurable-inter-world-teleportation-safety.patch
new file mode 100644
index 000000000000..ca20bf2e171b
--- /dev/null
+++ b/patches/server/0058-Configurable-inter-world-teleportation-safety.patch
@@ -0,0 +1,30 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Sudzzy
+Date: Thu, 3 Mar 2016 02:50:31 -0600
+Subject: [PATCH] Configurable inter-world teleportation safety
+
+People are able to abuse the way Bukkit handles teleportation across worlds since it provides a built in teleportation
+safety check.
+
+To abuse the safety check, players are required to get into a location deemed unsafe by Bukkit e.g. be within a chest
+or door block. While they are in this block, they accept a teleport request from a player within a different world. Once
+the player teleports, Minecraft will recursively search upwards for a safe location, this could eventually land within a
+player's skybase.
+
+Example setup to perform the glitch: http://puu.sh/ng3PC/cf072dcbdb.png
+The wanted destination was on top of the emerald block however the player ended on top of the diamond block.
+This only is the case if the player is teleporting between worlds.
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 03dad5aa44d4484e9a3064279c867f009104a9b2..fc2374c9ecc7603c310761e6196c026eded788f6 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -1156,7 +1156,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ entity.connection.teleport(to);
+ } else {
+ // The respawn reason should never be used if the passed location is non null.
+- this.server.getHandle().respawn(entity, toWorld, true, to, true, null);
++ this.server.getHandle().respawn(entity, toWorld, true, to, !toWorld.paperConfig().environment.disableTeleportationSuffocationCheck, null); // Paper
+ }
+ return true;
+ }
diff --git a/patches/server/0060-Add-exception-reporting-event.patch b/patches/server/0059-Add-exception-reporting-event.patch
similarity index 100%
rename from patches/server/0060-Add-exception-reporting-event.patch
rename to patches/server/0059-Add-exception-reporting-event.patch
diff --git a/patches/server/0059-Configurable-inter-world-teleportation-safety.patch b/patches/server/0059-Configurable-inter-world-teleportation-safety.patch
deleted file mode 100644
index 3d04ecd59b0f..000000000000
--- a/patches/server/0059-Configurable-inter-world-teleportation-safety.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Sudzzy
-Date: Thu, 3 Mar 2016 02:50:31 -0600
-Subject: [PATCH] Configurable inter-world teleportation safety
-
-People are able to abuse the way Bukkit handles teleportation across worlds since it provides a built in teleportation
-safety check.
-
-To abuse the safety check, players are required to get into a location deemed unsafe by Bukkit e.g. be within a chest
-or door block. While they are in this block, they accept a teleport request from a player within a different world. Once
-the player teleports, Minecraft will recursively search upwards for a safe location, this could eventually land within a
-player's skybase.
-
-Example setup to perform the glitch: http://puu.sh/ng3PC/cf072dcbdb.png
-The wanted destination was on top of the emerald block however the player ended on top of the diamond block.
-This only is the case if the player is teleporting between worlds.
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index cfa95917b39b32917bf32b2e97211d232d9037fd..2de70507a03e662afa45dd9f2e3c28c857a8037c 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -1126,7 +1126,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- entity.connection.teleport(to);
- } else {
- // The respawn reason should never be used if the passed location is non null.
-- this.server.getHandle().respawn(entity, toWorld, true, to, true, null);
-+ this.server.getHandle().respawn(entity, toWorld, true, to, !toWorld.paperConfig().environment.disableTeleportationSuffocationCheck, null); // Paper
- }
- return true;
- }
diff --git a/patches/server/0060-Disable-Scoreboards-for-non-players-by-default.patch b/patches/server/0060-Disable-Scoreboards-for-non-players-by-default.patch
new file mode 100644
index 000000000000..b562b1b37394
--- /dev/null
+++ b/patches/server/0060-Disable-Scoreboards-for-non-players-by-default.patch
@@ -0,0 +1,36 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar
+Date: Tue, 8 Mar 2016 23:25:45 -0500
+Subject: [PATCH] Disable Scoreboards for non players by default
+
+Entities collision is checking for scoreboards setting.
+This is very heavy to do map lookups for every collision to check
+this setting.
+
+So avoid looking up scoreboards and short circuit to the "not on a team"
+logic which is most likely to be true.
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 4c7a2d64ab4a5269fdea0b30e6c91fa1cb9f509c..e7157ff6cd6f2c52593bba63129fdaa60fcbf886 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -2807,6 +2807,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+
+ @Nullable
+ public PlayerTeam getTeam() {
++ if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof Player)) { return null; } // Paper - Perf: Disable Scoreboards for non players by default
+ return this.level().getScoreboard().getPlayersTeam(this.getScoreboardName());
+ }
+
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index e111bdb614f173322ed0cc0386db6870a984fff7..0a573b188111e84290317f2ce5620b6ea6c8b6de 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -833,6 +833,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ if (nbt.contains("Team", 8)) {
+ String s = nbt.getString("Team");
+ PlayerTeam scoreboardteam = this.level().getScoreboard().getPlayerTeam(s);
++ if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof net.minecraft.world.entity.player.Player)) { scoreboardteam = null; } // Paper - Perf: Disable Scoreboards for non players by default
+ boolean flag = scoreboardteam != null && this.level().getScoreboard().addPlayerToTeam(this.getStringUUID(), scoreboardteam);
+
+ if (!flag) {
diff --git a/patches/server/0061-Add-methods-for-working-with-arrows-stuck-in-living-.patch b/patches/server/0061-Add-methods-for-working-with-arrows-stuck-in-living-.patch
new file mode 100644
index 000000000000..59051e3b9718
--- /dev/null
+++ b/patches/server/0061-Add-methods-for-working-with-arrows-stuck-in-living-.patch
@@ -0,0 +1,60 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: mrapple
+Date: Sun, 25 Nov 2012 13:43:39 -0600
+Subject: [PATCH] Add methods for working with arrows stuck in living entities
+
+Upstream added methods for this, original methods are now
+deprecated
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+index a73a5a8291ddd954f2c7b73a4895933e715c5d68..4636e1ebf11025a551d398a6594b1506748a8390 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+@@ -267,10 +267,29 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+ }
+
+ @Override
+- public void setArrowsInBody(int count) {
++ public void setArrowsInBody(final int count, final boolean fireEvent) { // Paper
+ Preconditions.checkArgument(count >= 0, "New arrow amount must be >= 0");
++ if (!fireEvent) { // Paper
+ this.getHandle().getEntityData().set(net.minecraft.world.entity.LivingEntity.DATA_ARROW_COUNT_ID, count);
++ // Paper start
++ } else {
++ this.getHandle().setArrowCount(count);
++ }
++ // Paper end
++ }
++
++ // Paper start - Add methods for working with arrows stuck in living entities
++ @Override
++ public void setNextArrowRemoval(final int ticks) {
++ Preconditions.checkArgument(ticks >= 0, "New amount of ticks before next arrow removal must be >= 0");
++ this.getHandle().removeArrowTime = ticks;
++ }
++
++ @Override
++ public int getNextArrowRemoval() {
++ return this.getHandle().removeArrowTime;
+ }
++ // Paper end - Add methods for working with arrows stuck in living entities
+
+ @Override
+ public void damage(double amount) {
+@@ -799,4 +818,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+ this.getHandle().persistentInvisibility = invisible;
+ this.getHandle().setSharedFlag(5, invisible);
+ }
++
++ // Paper start
++ @Override
++ public int getArrowsStuck() {
++ return this.getHandle().getArrowCount();
++ }
++
++ @Override
++ public void setArrowsStuck(final int arrows) {
++ this.getHandle().setArrowCount(arrows);
++ }
++ // Paper end
+ }
diff --git a/patches/server/0061-Disable-Scoreboards-for-non-players-by-default.patch b/patches/server/0061-Disable-Scoreboards-for-non-players-by-default.patch
deleted file mode 100644
index 2ec136b21c13..000000000000
--- a/patches/server/0061-Disable-Scoreboards-for-non-players-by-default.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar
-Date: Tue, 8 Mar 2016 23:25:45 -0500
-Subject: [PATCH] Disable Scoreboards for non players by default
-
-Entities collision is checking for scoreboards setting.
-This is very heavy to do map lookups for every collision to check
-this setting.
-
-So avoid looking up scoreboards and short circuit to the "not on a team"
-logic which is most likely to be true.
-
-diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index bef8f3574ecb0d957f9041639b56c94b41913f99..c4168fa278dacf9f50058bb7dc98bb12aef717f2 100644
---- a/src/main/java/net/minecraft/world/entity/Entity.java
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -2808,6 +2808,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
-
- @Nullable
- public PlayerTeam getTeam() {
-+ if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof Player)) { return null; } // Paper - Perf: Disable Scoreboards for non players by default
- return this.level().getScoreboard().getPlayersTeam(this.getScoreboardName());
- }
-
-diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 2e47008a8ff1bb56b752d4eb880173b9edfbc4ad..3eeb40c2176a80b9e2a472d43671ae0fe087d9e7 100644
---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
-+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -832,6 +832,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
- if (nbt.contains("Team", 8)) {
- String s = nbt.getString("Team");
- PlayerTeam scoreboardteam = this.level().getScoreboard().getPlayerTeam(s);
-+ if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof net.minecraft.world.entity.player.Player)) { scoreboardteam = null; } // Paper - Perf: Disable Scoreboards for non players by default
- boolean flag = scoreboardteam != null && this.level().getScoreboard().addPlayerToTeam(this.getStringUUID(), scoreboardteam);
-
- if (!flag) {
diff --git a/patches/server/0062-Add-methods-for-working-with-arrows-stuck-in-living-.patch b/patches/server/0062-Add-methods-for-working-with-arrows-stuck-in-living-.patch
deleted file mode 100644
index f7b2fb6ec119..000000000000
--- a/patches/server/0062-Add-methods-for-working-with-arrows-stuck-in-living-.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: mrapple
-Date: Sun, 25 Nov 2012 13:43:39 -0600
-Subject: [PATCH] Add methods for working with arrows stuck in living entities
-
-Upstream added methods for this, original methods are now
-deprecated
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-index 5825f942db3b9870631ff093708dee0e930fccc8..690364b874212cca2fe2078efa7b8f3f7880e39f 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-@@ -266,10 +266,29 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
- }
-
- @Override
-- public void setArrowsInBody(int count) {
-+ public void setArrowsInBody(final int count, final boolean fireEvent) { // Paper
- Preconditions.checkArgument(count >= 0, "New arrow amount must be >= 0");
-+ if (!fireEvent) { // Paper
- this.getHandle().getEntityData().set(net.minecraft.world.entity.LivingEntity.DATA_ARROW_COUNT_ID, count);
-+ // Paper start
-+ } else {
-+ this.getHandle().setArrowCount(count);
-+ }
-+ // Paper end
-+ }
-+
-+ // Paper start - Add methods for working with arrows stuck in living entities
-+ @Override
-+ public void setNextArrowRemoval(final int ticks) {
-+ Preconditions.checkArgument(ticks >= 0, "New amount of ticks before next arrow removal must be >= 0");
-+ this.getHandle().removeArrowTime = ticks;
-+ }
-+
-+ @Override
-+ public int getNextArrowRemoval() {
-+ return this.getHandle().removeArrowTime;
- }
-+ // Paper end - Add methods for working with arrows stuck in living entities
-
- @Override
- public void damage(double amount) {
-@@ -786,4 +805,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
- this.getHandle().persistentInvisibility = invisible;
- this.getHandle().setSharedFlag(5, invisible);
- }
-+
-+ // Paper start
-+ @Override
-+ public int getArrowsStuck() {
-+ return this.getHandle().getArrowCount();
-+ }
-+
-+ @Override
-+ public void setArrowsStuck(final int arrows) {
-+ this.getHandle().setArrowCount(arrows);
-+ }
-+ // Paper end
- }
diff --git a/patches/server/0063-Chunk-Save-Reattempt.patch b/patches/server/0062-Chunk-Save-Reattempt.patch
similarity index 100%
rename from patches/server/0063-Chunk-Save-Reattempt.patch
rename to patches/server/0062-Chunk-Save-Reattempt.patch
diff --git a/patches/server/0063-Complete-resource-pack-API.patch b/patches/server/0063-Complete-resource-pack-API.patch
new file mode 100644
index 000000000000..296b0713c6ec
--- /dev/null
+++ b/patches/server/0063-Complete-resource-pack-API.patch
@@ -0,0 +1,49 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jedediah Smith
+Date: Sat, 4 Apr 2015 23:17:52 -0400
+Subject: [PATCH] Complete resource pack API
+
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+index c8041492b7b2a1ff67b95d9944cfccd476b3ee1d..66497960995dc30abe60d26200979a78513ff2c6 100644
+--- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+@@ -169,7 +169,11 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+ callback.packEventReceived(packet.id(), net.kyori.adventure.resource.ResourcePackStatus.valueOf(packet.action().name()), this.getCraftPlayer());
+ }
+ // Paper end
+- this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()])); // CraftBukkit
++ // Paper start - store last pack status
++ PlayerResourcePackStatusEvent.Status packStatus = PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()];
++ player.getBukkitEntity().resourcePackStatus = packStatus;
++ this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), packStatus)); // CraftBukkit
++ // Paper end - store last pack status
+
+ }
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index fc2374c9ecc7603c310761e6196c026eded788f6..b6851bd629c4d3b9aa7efdf1112e1cf59cd63f60 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -195,6 +195,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ private double healthScale = 20;
+ private CraftWorldBorder clientWorldBorder = null;
+ private BorderChangeListener clientWorldBorderListener = this.createWorldBorderListener();
++ public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status resourcePackStatus; // Paper - more resource pack API
+
+ public CraftPlayer(CraftServer server, ServerPlayer entity) {
+ super(server, entity);
+@@ -2014,6 +2015,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ }
+ // Paper end - adventure
+
++ // Paper start - more resource pack API
++ @Override
++ public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status getResourcePackStatus() {
++ return this.resourcePackStatus;
++ }
++ // Paper end - more resource pack API
++
+ @Override
+ public void removeResourcePack(UUID id) {
+ Preconditions.checkArgument(id != null, "Resource pack id cannot be null");
diff --git a/patches/server/0064-Complete-resource-pack-API.patch b/patches/server/0064-Complete-resource-pack-API.patch
deleted file mode 100644
index 645ad3f88d88..000000000000
--- a/patches/server/0064-Complete-resource-pack-API.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jedediah Smith
-Date: Sat, 4 Apr 2015 23:17:52 -0400
-Subject: [PATCH] Complete resource pack API
-
-
-diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-index c8041492b7b2a1ff67b95d9944cfccd476b3ee1d..66497960995dc30abe60d26200979a78513ff2c6 100644
---- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-+++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-@@ -169,7 +169,11 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
- callback.packEventReceived(packet.id(), net.kyori.adventure.resource.ResourcePackStatus.valueOf(packet.action().name()), this.getCraftPlayer());
- }
- // Paper end
-- this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()])); // CraftBukkit
-+ // Paper start - store last pack status
-+ PlayerResourcePackStatusEvent.Status packStatus = PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()];
-+ player.getBukkitEntity().resourcePackStatus = packStatus;
-+ this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), packStatus)); // CraftBukkit
-+ // Paper end - store last pack status
-
- }
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 05a3d86c5861f237dcccb93c8a9f91cf6a7c18b6..8be468cb5305c0db5f46298aaf6c896b27ce4aee 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -189,6 +189,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- private double healthScale = 20;
- private CraftWorldBorder clientWorldBorder = null;
- private BorderChangeListener clientWorldBorderListener = this.createWorldBorderListener();
-+ public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status resourcePackStatus; // Paper - more resource pack API
-
- public CraftPlayer(CraftServer server, ServerPlayer entity) {
- super(server, entity);
-@@ -1972,6 +1973,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- }
- // Paper end - adventure
-
-+ // Paper start - more resource pack API
-+ @Override
-+ public org.bukkit.event.player.PlayerResourcePackStatusEvent.Status getResourcePackStatus() {
-+ return this.resourcePackStatus;
-+ }
-+ // Paper end - more resource pack API
-+
- @Override
- public void removeResourcePack(UUID id) {
- Preconditions.checkArgument(id != null, "Resource pack id cannot be null");
diff --git a/patches/server/0064-Default-loading-permissions.yml-before-plugins.patch b/patches/server/0064-Default-loading-permissions.yml-before-plugins.patch
new file mode 100644
index 000000000000..5cb350113eda
--- /dev/null
+++ b/patches/server/0064-Default-loading-permissions.yml-before-plugins.patch
@@ -0,0 +1,38 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar
+Date: Fri, 18 Mar 2016 13:17:38 -0400
+Subject: [PATCH] Default loading permissions.yml before plugins
+
+Under previous behavior, plugins were not able to check if a player had a permission
+if it was defined in permissions.yml. there is no clean way for a plugin to fix that either.
+
+This will change the order so that by default, permissions.yml loads BEFORE plugins instead of after.
+
+This gives plugins expected permission checks.
+
+It also helps improve the expected logic, as servers should set the initial defaults, and then let plugins
+modify that. Under the previous logic, plugins were unable (cleanly) override permissions.yml.
+
+A config option has been added for those who depend on the previous behavior, but I don't expect that.
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index 2b2d0c8ed68eb86812877026a0bb5c4a6389c3d4..1d85e64b30e872f12de7d84af26be6271e77387e 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -458,6 +458,7 @@ public final class CraftServer implements Server {
+ if (type == PluginLoadOrder.STARTUP) {
+ this.helpMap.clear();
+ this.helpMap.initializeGeneralTopics();
++ if (io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) loadCustomPermissions(); // Paper
+ }
+
+ Plugin[] plugins = this.pluginManager.getPlugins();
+@@ -477,7 +478,7 @@ public final class CraftServer implements Server {
+ this.commandMap.registerServerAliases();
+ DefaultPermissions.registerCorePermissions();
+ CraftDefaultPermissions.registerCorePermissions();
+- this.loadCustomPermissions();
++ if (!io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) this.loadCustomPermissions(); // Paper
+ this.helpMap.initializeCommands();
+ this.syncCommands();
+ }
diff --git a/patches/server/0065-Allow-Reloading-of-Custom-Permissions.patch b/patches/server/0065-Allow-Reloading-of-Custom-Permissions.patch
new file mode 100644
index 000000000000..78a798eca3fb
--- /dev/null
+++ b/patches/server/0065-Allow-Reloading-of-Custom-Permissions.patch
@@ -0,0 +1,35 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: William
+Date: Fri, 18 Mar 2016 03:30:17 -0400
+Subject: [PATCH] Allow Reloading of Custom Permissions
+
+https://github.com/PaperMC/Paper/issues/49
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index 1d85e64b30e872f12de7d84af26be6271e77387e..f7726d16d37c64228515b0791d921b047bc887e6 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -2728,5 +2728,23 @@ public final class CraftServer implements Server {
+ }
+ return this.adventure$audiences;
+ }
++
++ @Override
++ public void reloadPermissions() {
++ pluginManager.clearPermissions();
++ if (io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) loadCustomPermissions();
++ for (Plugin plugin : pluginManager.getPlugins()) {
++ for (Permission perm : plugin.getDescription().getPermissions()) {
++ try {
++ pluginManager.addPermission(perm);
++ } catch (IllegalArgumentException ex) {
++ getLogger().log(Level.WARNING, "Plugin " + plugin.getDescription().getFullName() + " tried to register permission '" + perm.getName() + "' but it's already registered", ex);
++ }
++ }
++ }
++ if (!io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) loadCustomPermissions();
++ DefaultPermissions.registerCorePermissions();
++ CraftDefaultPermissions.registerCorePermissions();
++ }
+ // Paper end
+ }
diff --git a/patches/server/0065-Default-loading-permissions.yml-before-plugins.patch b/patches/server/0065-Default-loading-permissions.yml-before-plugins.patch
deleted file mode 100644
index 11685910665a..000000000000
--- a/patches/server/0065-Default-loading-permissions.yml-before-plugins.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar
-Date: Fri, 18 Mar 2016 13:17:38 -0400
-Subject: [PATCH] Default loading permissions.yml before plugins
-
-Under previous behavior, plugins were not able to check if a player had a permission
-if it was defined in permissions.yml. there is no clean way for a plugin to fix that either.
-
-This will change the order so that by default, permissions.yml loads BEFORE plugins instead of after.
-
-This gives plugins expected permission checks.
-
-It also helps improve the expected logic, as servers should set the initial defaults, and then let plugins
-modify that. Under the previous logic, plugins were unable (cleanly) override permissions.yml.
-
-A config option has been added for those who depend on the previous behavior, but I don't expect that.
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 908808099d0b7c3320f447330a441a536ce07421..9bec3b0d5c7eaccb334e2663bb1fdc42cd6eb367 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -456,6 +456,7 @@ public final class CraftServer implements Server {
- if (type == PluginLoadOrder.STARTUP) {
- this.helpMap.clear();
- this.helpMap.initializeGeneralTopics();
-+ if (io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) loadCustomPermissions(); // Paper
- }
-
- Plugin[] plugins = this.pluginManager.getPlugins();
-@@ -475,7 +476,7 @@ public final class CraftServer implements Server {
- this.commandMap.registerServerAliases();
- DefaultPermissions.registerCorePermissions();
- CraftDefaultPermissions.registerCorePermissions();
-- this.loadCustomPermissions();
-+ if (!io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) this.loadCustomPermissions(); // Paper
- this.helpMap.initializeCommands();
- this.syncCommands();
- }
diff --git a/patches/server/0066-Allow-Reloading-of-Custom-Permissions.patch b/patches/server/0066-Allow-Reloading-of-Custom-Permissions.patch
deleted file mode 100644
index 537c89fe417e..000000000000
--- a/patches/server/0066-Allow-Reloading-of-Custom-Permissions.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: William
-Date: Fri, 18 Mar 2016 03:30:17 -0400
-Subject: [PATCH] Allow Reloading of Custom Permissions
-
-https://github.com/PaperMC/Paper/issues/49
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 7203f9b281305e83d7a31e49aab5fb73d603789b..58cf842c3bdc91233404ce907e3652abb1187e03 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -2716,5 +2716,23 @@ public final class CraftServer implements Server {
- }
- return this.adventure$audiences;
- }
-+
-+ @Override
-+ public void reloadPermissions() {
-+ pluginManager.clearPermissions();
-+ if (io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) loadCustomPermissions();
-+ for (Plugin plugin : pluginManager.getPlugins()) {
-+ for (Permission perm : plugin.getDescription().getPermissions()) {
-+ try {
-+ pluginManager.addPermission(perm);
-+ } catch (IllegalArgumentException ex) {
-+ getLogger().log(Level.WARNING, "Plugin " + plugin.getDescription().getFullName() + " tried to register permission '" + perm.getName() + "' but it's already registered", ex);
-+ }
-+ }
-+ }
-+ if (!io.papermc.paper.configuration.GlobalConfiguration.get().misc.loadPermissionsYmlBeforePlugins) loadCustomPermissions();
-+ DefaultPermissions.registerCorePermissions();
-+ CraftDefaultPermissions.registerCorePermissions();
-+ }
- // Paper end
- }
diff --git a/patches/server/0066-Remove-Metadata-on-reload.patch b/patches/server/0066-Remove-Metadata-on-reload.patch
new file mode 100644
index 000000000000..006d87514f1a
--- /dev/null
+++ b/patches/server/0066-Remove-Metadata-on-reload.patch
@@ -0,0 +1,29 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar
+Date: Fri, 18 Mar 2016 13:50:14 -0400
+Subject: [PATCH] Remove Metadata on reload
+
+Metadata is not meant to persist reload as things break badly with non primitive types
+This will remove metadata on reload so it does not crash everything if a plugin uses it.
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index f7726d16d37c64228515b0791d921b047bc887e6..f69d5e8f22fa8335b19f9e777ddbd33443eb08dc 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -964,8 +964,16 @@ public final class CraftServer implements Server {
+ world.spigotConfig.init(); // Spigot
+ }
+
++ Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper
+ this.pluginManager.clearPlugins();
+ this.commandMap.clearCommands();
++ // Paper start
++ for (Plugin plugin : pluginClone) {
++ entityMetadata.removeAll(plugin);
++ worldMetadata.removeAll(plugin);
++ playerMetadata.removeAll(plugin);
++ }
++ // Paper end
+ this.reloadData();
+ org.spigotmc.SpigotConfig.registerCommands(); // Spigot
+ io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper
diff --git a/patches/server/0067-Handle-Item-Meta-Inconsistencies.patch b/patches/server/0067-Handle-Item-Meta-Inconsistencies.patch
new file mode 100644
index 000000000000..9528bf143127
--- /dev/null
+++ b/patches/server/0067-Handle-Item-Meta-Inconsistencies.patch
@@ -0,0 +1,306 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar
+Date: Thu, 28 May 2015 23:00:19 -0400
+Subject: [PATCH] Handle Item Meta Inconsistencies
+
+First, Enchantment order would blow away seeing 2 items as the same,
+however the Client forces enchantment list in a certain order, as well
+as does the /enchant command. Anvils can insert it into forced order,
+causing 2 same items to be considered different.
+
+This change makes unhandled NBT Tags and Enchantments use a sorted tree map,
+so they will always be in a consistent order.
+
+Additionally, the old enchantment API was never updated when ItemMeta
+was added, resulting in 2 different ways to modify an items enchantments.
+
+For consistency, the old API methods now forward to use the
+ItemMeta API equivalents, and should deprecate the old API's.
+
+diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
+index 6291265ae4691bf7dffe196d20571c1c30e8d906..70511628eefc28163d07f50f18d9cc55dd93d68b 100644
+--- a/src/main/java/net/minecraft/world/item/ItemStack.java
++++ b/src/main/java/net/minecraft/world/item/ItemStack.java
+@@ -181,6 +181,23 @@ public final class ItemStack {
+ return this.getItem().getTooltipImage(this);
+ }
+
++ // Paper start
++ private static final java.util.Comparator super CompoundTag> enchantSorter = java.util.Comparator.comparing(o -> o.getString("id"));
++ private void processEnchantOrder(@Nullable CompoundTag tag) {
++ if (tag == null || !tag.contains("Enchantments", net.minecraft.nbt.Tag.TAG_LIST)) {
++ return;
++ }
++ ListTag list = tag.getList("Enchantments", net.minecraft.nbt.Tag.TAG_COMPOUND);
++ if (list.size() < 2) {
++ return;
++ }
++ try {
++ //noinspection unchecked
++ list.sort((java.util.Comparator super net.minecraft.nbt.Tag>) enchantSorter); // Paper
++ } catch (Exception ignored) {}
++ }
++ // Paper end
++
+ public ItemStack(ItemLike item) {
+ this(item, 1);
+ }
+@@ -227,6 +244,7 @@ public final class ItemStack {
+ this.count = nbttagcompound.getByte("Count");
+ if (nbttagcompound.contains("tag", 10)) {
+ this.tag = nbttagcompound.getCompound("tag").copy();
++ this.processEnchantOrder(this.tag); // Paper
+ this.getItem().verifyTagAfterLoad(this.tag);
+ }
+
+@@ -846,6 +864,7 @@ public final class ItemStack {
+
+ public void setTag(@Nullable CompoundTag nbt) {
+ this.tag = nbt;
++ this.processEnchantOrder(this.tag); // Paper
+ if (this.getItem().canBeDepleted()) {
+ this.setDamageValue(this.getDamageValue());
+ }
+@@ -1143,6 +1162,7 @@ public final class ItemStack {
+ ListTag nbttaglist = this.tag.getList("Enchantments", 10);
+
+ nbttaglist.add(EnchantmentHelper.storeEnchantment(EnchantmentHelper.getEnchantmentId(enchantment), (byte) level));
++ processEnchantOrder(this.tag); // Paper
+ }
+
+ public boolean isEnchanted() {
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
+index 23b83f8e98d681895b4e23cda4f3d50f85c12dd9..c72a1a503f6e71228a1f82b37068ff7a83e983dc 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
+@@ -188,28 +188,11 @@ public final class CraftItemStack extends ItemStack {
+ public void addUnsafeEnchantment(Enchantment ench, int level) {
+ Preconditions.checkArgument(ench != null, "Enchantment cannot be null");
+
+- if (!CraftItemStack.makeTag(this.handle)) {
+- return;
+- }
+- ListTag list = CraftItemStack.getEnchantmentList(this.handle);
+- if (list == null) {
+- list = new ListTag();
+- this.handle.getTag().put(ENCHANTMENTS.NBT, list);
+- }
+- int size = list.size();
+-
+- for (int i = 0; i < size; i++) {
+- CompoundTag tag = (CompoundTag) list.get(i);
+- String id = tag.getString(ENCHANTMENTS_ID.NBT);
+- if (ench.getKey().equals(NamespacedKey.fromString(id))) {
+- tag.putShort(ENCHANTMENTS_LVL.NBT, (short) level);
+- return;
+- }
+- }
+- CompoundTag tag = new CompoundTag();
+- tag.putString(ENCHANTMENTS_ID.NBT, ench.getKey().toString());
+- tag.putShort(ENCHANTMENTS_LVL.NBT, (short) level);
+- list.add(tag);
++ // Paper start - Replace whole method
++ final ItemMeta itemMeta = this.getItemMeta();
++ itemMeta.addEnchant(ench, level, true);
++ this.setItemMeta(itemMeta);
++ // Paper end
+ }
+
+ static boolean makeTag(net.minecraft.world.item.ItemStack item) {
+@@ -242,43 +225,15 @@ public final class CraftItemStack extends ItemStack {
+ public int removeEnchantment(Enchantment ench) {
+ Preconditions.checkArgument(ench != null, "Enchantment cannot be null");
+
+- ListTag list = CraftItemStack.getEnchantmentList(this.handle), listCopy;
+- if (list == null) {
+- return 0;
+- }
+- int index = Integer.MIN_VALUE;
+- int level = Integer.MIN_VALUE;
+- int size = list.size();
+-
+- for (int i = 0; i < size; i++) {
+- CompoundTag enchantment = (CompoundTag) list.get(i);
+- String id = enchantment.getString(ENCHANTMENTS_ID.NBT);
+- if (ench.getKey().equals(NamespacedKey.fromString(id))) {
+- index = i;
+- level = 0xffff & enchantment.getShort(ENCHANTMENTS_LVL.NBT);
+- break;
+- }
+- }
+-
+- if (index == Integer.MIN_VALUE) {
+- return 0;
+- }
+- if (size == 1) {
+- this.handle.getTag().remove(ENCHANTMENTS.NBT);
+- if (this.handle.getTag().isEmpty()) {
+- this.handle.setTag(null);
+- }
+- return level;
+- }
+-
+- // This is workaround for not having an index removal
+- listCopy = new ListTag();
+- for (int i = 0; i < size; i++) {
+- if (i != index) {
+- listCopy.add(list.get(i));
+- }
++ // Paper start - replace entire method
++ int level = getEnchantmentLevel(ench);
++ if (level > 0) {
++ final ItemMeta itemMeta = this.getItemMeta();
++ if (itemMeta == null) return 0;
++ itemMeta.removeEnchant(ench);
++ this.setItemMeta(itemMeta);
+ }
+- this.handle.getTag().put(ENCHANTMENTS.NBT, listCopy);
++ // Paper end
+
+ return level;
+ }
+@@ -290,7 +245,7 @@ public final class CraftItemStack extends ItemStack {
+
+ @Override
+ public Map getEnchantments() {
+- return CraftItemStack.getEnchantments(this.handle);
++ return this.hasItemMeta() ? this.getItemMeta().getEnchants() : ImmutableMap.of(); // Paper - use Item Meta
+ }
+
+ static Map getEnchantments(net.minecraft.world.item.ItemStack item) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+index ffdea312f93d00289364ef4d41a820cd1338f3bd..361268bcc0197c2f9f4bd065d8f7b51771d562a9 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+@@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableList;
+ import com.google.common.collect.ImmutableMap;
+ import com.google.common.collect.ImmutableMultimap;
+ import com.google.common.collect.LinkedHashMultimap;
++import com.google.common.collect.ImmutableSortedMap; // Paper
+ import com.google.common.collect.Lists;
+ import com.google.common.collect.Multimap;
+ import com.google.common.collect.SetMultimap;
+@@ -23,6 +24,7 @@ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Base64;
+ import java.util.Collection;
++import java.util.Comparator; // Paper
+ import java.util.EnumSet;
+ import java.util.HashMap;
+ import java.util.Iterator;
+@@ -33,6 +35,7 @@ import java.util.Map;
+ import java.util.NoSuchElementException;
+ import java.util.Objects;
+ import java.util.Set;
++import java.util.TreeMap; // Paper
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+ import javax.annotation.Nonnull;
+@@ -277,7 +280,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ private List lore; // null and empty are two different states internally
+ private Integer customModelData;
+ private CompoundTag blockData;
+- private Map enchantments;
++ private EnchantmentMap enchantments; // Paper
+ private Multimap attributeModifiers;
+ private int repairCost;
+ private int hideFlag;
+@@ -288,7 +291,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry();
+
+ private CompoundTag internalTag;
+- final Map unhandledTags = new HashMap(); // Visible for testing only
++ final Map unhandledTags = new TreeMap(); // Visible for testing only // Paper
+ private CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(CraftMetaItem.DATA_TYPE_REGISTRY);
+
+ private int version = CraftMagicNumbers.INSTANCE.getDataVersion(); // Internal use only
+@@ -309,7 +312,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ this.blockData = meta.blockData;
+
+ if (meta.enchantments != null) {
+- this.enchantments = new LinkedHashMap(meta.enchantments);
++ this.enchantments = new EnchantmentMap(meta.enchantments); // Paper
+ }
+
+ if (meta.hasAttributeModifiers()) {
+@@ -392,13 +395,13 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ }
+ }
+
+- static Map buildEnchantments(CompoundTag tag, ItemMetaKey key) {
++ static EnchantmentMap buildEnchantments(CompoundTag tag, ItemMetaKey key) { // Paper
+ if (!tag.contains(key.NBT)) {
+ return null;
+ }
+
+ ListTag ench = tag.getList(key.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND);
+- Map enchantments = new LinkedHashMap(ench.size());
++ EnchantmentMap enchantments = new EnchantmentMap(); // Paper
+
+ for (int i = 0; i < ench.size(); i++) {
+ String id = ((CompoundTag) ench.get(i)).getString(CraftMetaItem.ENCHANTMENTS_ID.NBT);
+@@ -551,13 +554,13 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ }
+ }
+
+- static Map buildEnchantments(Map map, ItemMetaKey key) {
++ static EnchantmentMap buildEnchantments(Map map, ItemMetaKey key) { // Paper
+ Map, ?> ench = SerializableMeta.getObject(Map.class, map, key.BUKKIT, true);
+ if (ench == null) {
+ return null;
+ }
+
+- Map enchantments = new LinkedHashMap(ench.size());
++ EnchantmentMap enchantments = new EnchantmentMap(); // Paper
+ for (Map.Entry, ?> entry : ench.entrySet()) {
+ // Doctor older enchants
+ String enchantKey = entry.getKey().toString();
+@@ -845,14 +848,14 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+
+ @Override
+ public Map getEnchants() {
+- return this.hasEnchants() ? ImmutableMap.copyOf(this.enchantments) : ImmutableMap.of();
++ return this.hasEnchants() ? ImmutableSortedMap.copyOfSorted(this.enchantments) : ImmutableMap.of(); // Paper
+ }
+
+ @Override
+ public boolean addEnchant(Enchantment ench, int level, boolean ignoreRestrictions) {
+ Preconditions.checkArgument(ench != null, "Enchantment cannot be null");
+ if (this.enchantments == null) {
+- this.enchantments = new LinkedHashMap(4);
++ this.enchantments = new EnchantmentMap(); // Paper
+ }
+
+ if (ignoreRestrictions || level >= ench.getStartLevel() && level <= ench.getMaxLevel()) {
+@@ -1269,7 +1272,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ clone.customModelData = this.customModelData;
+ clone.blockData = this.blockData;
+ if (this.enchantments != null) {
+- clone.enchantments = new LinkedHashMap(this.enchantments);
++ clone.enchantments = new EnchantmentMap(this.enchantments); // Paper
+ }
+ if (this.hasAttributeModifiers()) {
+ clone.attributeModifiers = LinkedHashMultimap.create(this.attributeModifiers);
+@@ -1516,4 +1519,22 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
+ return CraftMetaItem.HANDLED_TAGS;
+ }
+ }
++
++ // Paper start
++ private static class EnchantmentMap extends TreeMap {
++ private EnchantmentMap(Map enchantments) {
++ this();
++ putAll(enchantments);
++ }
++
++ private EnchantmentMap() {
++ super(Comparator.comparing(o -> o.getKey().toString()));
++ }
++
++ public EnchantmentMap clone() {
++ return (EnchantmentMap) super.clone();
++ }
++ }
++ // Paper end
++
+ }
diff --git a/patches/server/0067-Remove-Metadata-on-reload.patch b/patches/server/0067-Remove-Metadata-on-reload.patch
deleted file mode 100644
index d7f1fa2629bb..000000000000
--- a/patches/server/0067-Remove-Metadata-on-reload.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar
-Date: Fri, 18 Mar 2016 13:50:14 -0400
-Subject: [PATCH] Remove Metadata on reload
-
-Metadata is not meant to persist reload as things break badly with non primitive types
-This will remove metadata on reload so it does not crash everything if a plugin uses it.
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index d2d2cc70eac66d503efe89ded205f1a904c95a26..fb6c21a43e771317526972c183d95402d941924b 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -952,8 +952,16 @@ public final class CraftServer implements Server {
- world.spigotConfig.init(); // Spigot
- }
-
-+ Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper
- this.pluginManager.clearPlugins();
- this.commandMap.clearCommands();
-+ // Paper start
-+ for (Plugin plugin : pluginClone) {
-+ entityMetadata.removeAll(plugin);
-+ worldMetadata.removeAll(plugin);
-+ playerMetadata.removeAll(plugin);
-+ }
-+ // Paper end
- this.reloadData();
- org.spigotmc.SpigotConfig.registerCommands(); // Spigot
- io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper
diff --git a/patches/server/0069-Configurable-Non-Player-Arrow-Despawn-Rate.patch b/patches/server/0068-Configurable-Non-Player-Arrow-Despawn-Rate.patch
similarity index 100%
rename from patches/server/0069-Configurable-Non-Player-Arrow-Despawn-Rate.patch
rename to patches/server/0068-Configurable-Non-Player-Arrow-Despawn-Rate.patch
diff --git a/patches/server/0068-Handle-Item-Meta-Inconsistencies.patch b/patches/server/0068-Handle-Item-Meta-Inconsistencies.patch
deleted file mode 100644
index e4b3d7b26b0f..000000000000
--- a/patches/server/0068-Handle-Item-Meta-Inconsistencies.patch
+++ /dev/null
@@ -1,306 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar
-Date: Thu, 28 May 2015 23:00:19 -0400
-Subject: [PATCH] Handle Item Meta Inconsistencies
-
-First, Enchantment order would blow away seeing 2 items as the same,
-however the Client forces enchantment list in a certain order, as well
-as does the /enchant command. Anvils can insert it into forced order,
-causing 2 same items to be considered different.
-
-This change makes unhandled NBT Tags and Enchantments use a sorted tree map,
-so they will always be in a consistent order.
-
-Additionally, the old enchantment API was never updated when ItemMeta
-was added, resulting in 2 different ways to modify an items enchantments.
-
-For consistency, the old API methods now forward to use the
-ItemMeta API equivalents, and should deprecate the old API's.
-
-diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
-index 9861cd23b07f8fbacb1d125af835dee58c2debbb..b0ea04fc0bac640f7076100e44c16c03b86b2a0e 100644
---- a/src/main/java/net/minecraft/world/item/ItemStack.java
-+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
-@@ -180,6 +180,23 @@ public final class ItemStack {
- return this.getItem().getTooltipImage(this);
- }
-
-+ // Paper start
-+ private static final java.util.Comparator super CompoundTag> enchantSorter = java.util.Comparator.comparing(o -> o.getString("id"));
-+ private void processEnchantOrder(@Nullable CompoundTag tag) {
-+ if (tag == null || !tag.contains("Enchantments", net.minecraft.nbt.Tag.TAG_LIST)) {
-+ return;
-+ }
-+ ListTag list = tag.getList("Enchantments", net.minecraft.nbt.Tag.TAG_COMPOUND);
-+ if (list.size() < 2) {
-+ return;
-+ }
-+ try {
-+ //noinspection unchecked
-+ list.sort((java.util.Comparator super net.minecraft.nbt.Tag>) enchantSorter); // Paper
-+ } catch (Exception ignored) {}
-+ }
-+ // Paper end
-+
- public ItemStack(ItemLike item) {
- this(item, 1);
- }
-@@ -226,6 +243,7 @@ public final class ItemStack {
- this.count = nbttagcompound.getByte("Count");
- if (nbttagcompound.contains("tag", 10)) {
- this.tag = nbttagcompound.getCompound("tag").copy();
-+ this.processEnchantOrder(this.tag); // Paper
- this.getItem().verifyTagAfterLoad(this.tag);
- }
-
-@@ -844,6 +862,7 @@ public final class ItemStack {
-
- public void setTag(@Nullable CompoundTag nbt) {
- this.tag = nbt;
-+ this.processEnchantOrder(this.tag); // Paper
- if (this.getItem().canBeDepleted()) {
- this.setDamageValue(this.getDamageValue());
- }
-@@ -1141,6 +1160,7 @@ public final class ItemStack {
- ListTag nbttaglist = this.tag.getList("Enchantments", 10);
-
- nbttaglist.add(EnchantmentHelper.storeEnchantment(EnchantmentHelper.getEnchantmentId(enchantment), (byte) level));
-+ processEnchantOrder(this.tag); // Paper
- }
-
- public boolean isEnchanted() {
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
-index 23b83f8e98d681895b4e23cda4f3d50f85c12dd9..c72a1a503f6e71228a1f82b37068ff7a83e983dc 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
-@@ -188,28 +188,11 @@ public final class CraftItemStack extends ItemStack {
- public void addUnsafeEnchantment(Enchantment ench, int level) {
- Preconditions.checkArgument(ench != null, "Enchantment cannot be null");
-
-- if (!CraftItemStack.makeTag(this.handle)) {
-- return;
-- }
-- ListTag list = CraftItemStack.getEnchantmentList(this.handle);
-- if (list == null) {
-- list = new ListTag();
-- this.handle.getTag().put(ENCHANTMENTS.NBT, list);
-- }
-- int size = list.size();
--
-- for (int i = 0; i < size; i++) {
-- CompoundTag tag = (CompoundTag) list.get(i);
-- String id = tag.getString(ENCHANTMENTS_ID.NBT);
-- if (ench.getKey().equals(NamespacedKey.fromString(id))) {
-- tag.putShort(ENCHANTMENTS_LVL.NBT, (short) level);
-- return;
-- }
-- }
-- CompoundTag tag = new CompoundTag();
-- tag.putString(ENCHANTMENTS_ID.NBT, ench.getKey().toString());
-- tag.putShort(ENCHANTMENTS_LVL.NBT, (short) level);
-- list.add(tag);
-+ // Paper start - Replace whole method
-+ final ItemMeta itemMeta = this.getItemMeta();
-+ itemMeta.addEnchant(ench, level, true);
-+ this.setItemMeta(itemMeta);
-+ // Paper end
- }
-
- static boolean makeTag(net.minecraft.world.item.ItemStack item) {
-@@ -242,43 +225,15 @@ public final class CraftItemStack extends ItemStack {
- public int removeEnchantment(Enchantment ench) {
- Preconditions.checkArgument(ench != null, "Enchantment cannot be null");
-
-- ListTag list = CraftItemStack.getEnchantmentList(this.handle), listCopy;
-- if (list == null) {
-- return 0;
-- }
-- int index = Integer.MIN_VALUE;
-- int level = Integer.MIN_VALUE;
-- int size = list.size();
--
-- for (int i = 0; i < size; i++) {
-- CompoundTag enchantment = (CompoundTag) list.get(i);
-- String id = enchantment.getString(ENCHANTMENTS_ID.NBT);
-- if (ench.getKey().equals(NamespacedKey.fromString(id))) {
-- index = i;
-- level = 0xffff & enchantment.getShort(ENCHANTMENTS_LVL.NBT);
-- break;
-- }
-- }
--
-- if (index == Integer.MIN_VALUE) {
-- return 0;
-- }
-- if (size == 1) {
-- this.handle.getTag().remove(ENCHANTMENTS.NBT);
-- if (this.handle.getTag().isEmpty()) {
-- this.handle.setTag(null);
-- }
-- return level;
-- }
--
-- // This is workaround for not having an index removal
-- listCopy = new ListTag();
-- for (int i = 0; i < size; i++) {
-- if (i != index) {
-- listCopy.add(list.get(i));
-- }
-+ // Paper start - replace entire method
-+ int level = getEnchantmentLevel(ench);
-+ if (level > 0) {
-+ final ItemMeta itemMeta = this.getItemMeta();
-+ if (itemMeta == null) return 0;
-+ itemMeta.removeEnchant(ench);
-+ this.setItemMeta(itemMeta);
- }
-- this.handle.getTag().put(ENCHANTMENTS.NBT, listCopy);
-+ // Paper end
-
- return level;
- }
-@@ -290,7 +245,7 @@ public final class CraftItemStack extends ItemStack {
-
- @Override
- public Map getEnchantments() {
-- return CraftItemStack.getEnchantments(this.handle);
-+ return this.hasItemMeta() ? this.getItemMeta().getEnchants() : ImmutableMap.of(); // Paper - use Item Meta
- }
-
- static Map getEnchantments(net.minecraft.world.item.ItemStack item) {
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
-index ffdea312f93d00289364ef4d41a820cd1338f3bd..361268bcc0197c2f9f4bd065d8f7b51771d562a9 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
-@@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableList;
- import com.google.common.collect.ImmutableMap;
- import com.google.common.collect.ImmutableMultimap;
- import com.google.common.collect.LinkedHashMultimap;
-+import com.google.common.collect.ImmutableSortedMap; // Paper
- import com.google.common.collect.Lists;
- import com.google.common.collect.Multimap;
- import com.google.common.collect.SetMultimap;
-@@ -23,6 +24,7 @@ import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Base64;
- import java.util.Collection;
-+import java.util.Comparator; // Paper
- import java.util.EnumSet;
- import java.util.HashMap;
- import java.util.Iterator;
-@@ -33,6 +35,7 @@ import java.util.Map;
- import java.util.NoSuchElementException;
- import java.util.Objects;
- import java.util.Set;
-+import java.util.TreeMap; // Paper
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javax.annotation.Nonnull;
-@@ -277,7 +280,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- private List lore; // null and empty are two different states internally
- private Integer customModelData;
- private CompoundTag blockData;
-- private Map enchantments;
-+ private EnchantmentMap enchantments; // Paper
- private Multimap attributeModifiers;
- private int repairCost;
- private int hideFlag;
-@@ -288,7 +291,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry();
-
- private CompoundTag internalTag;
-- final Map unhandledTags = new HashMap(); // Visible for testing only
-+ final Map unhandledTags = new TreeMap(); // Visible for testing only // Paper
- private CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(CraftMetaItem.DATA_TYPE_REGISTRY);
-
- private int version = CraftMagicNumbers.INSTANCE.getDataVersion(); // Internal use only
-@@ -309,7 +312,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- this.blockData = meta.blockData;
-
- if (meta.enchantments != null) {
-- this.enchantments = new LinkedHashMap(meta.enchantments);
-+ this.enchantments = new EnchantmentMap(meta.enchantments); // Paper
- }
-
- if (meta.hasAttributeModifiers()) {
-@@ -392,13 +395,13 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- }
- }
-
-- static Map buildEnchantments(CompoundTag tag, ItemMetaKey key) {
-+ static EnchantmentMap buildEnchantments(CompoundTag tag, ItemMetaKey key) { // Paper
- if (!tag.contains(key.NBT)) {
- return null;
- }
-
- ListTag ench = tag.getList(key.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND);
-- Map enchantments = new LinkedHashMap(ench.size());
-+ EnchantmentMap enchantments = new EnchantmentMap(); // Paper
-
- for (int i = 0; i < ench.size(); i++) {
- String id = ((CompoundTag) ench.get(i)).getString(CraftMetaItem.ENCHANTMENTS_ID.NBT);
-@@ -551,13 +554,13 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- }
- }
-
-- static Map buildEnchantments(Map map, ItemMetaKey key) {
-+ static EnchantmentMap buildEnchantments(Map map, ItemMetaKey key) { // Paper
- Map, ?> ench = SerializableMeta.getObject(Map.class, map, key.BUKKIT, true);
- if (ench == null) {
- return null;
- }
-
-- Map enchantments = new LinkedHashMap(ench.size());
-+ EnchantmentMap enchantments = new EnchantmentMap(); // Paper
- for (Map.Entry, ?> entry : ench.entrySet()) {
- // Doctor older enchants
- String enchantKey = entry.getKey().toString();
-@@ -845,14 +848,14 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
-
- @Override
- public Map getEnchants() {
-- return this.hasEnchants() ? ImmutableMap.copyOf(this.enchantments) : ImmutableMap.of();
-+ return this.hasEnchants() ? ImmutableSortedMap.copyOfSorted(this.enchantments) : ImmutableMap.of(); // Paper
- }
-
- @Override
- public boolean addEnchant(Enchantment ench, int level, boolean ignoreRestrictions) {
- Preconditions.checkArgument(ench != null, "Enchantment cannot be null");
- if (this.enchantments == null) {
-- this.enchantments = new LinkedHashMap(4);
-+ this.enchantments = new EnchantmentMap(); // Paper
- }
-
- if (ignoreRestrictions || level >= ench.getStartLevel() && level <= ench.getMaxLevel()) {
-@@ -1269,7 +1272,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- clone.customModelData = this.customModelData;
- clone.blockData = this.blockData;
- if (this.enchantments != null) {
-- clone.enchantments = new LinkedHashMap(this.enchantments);
-+ clone.enchantments = new EnchantmentMap(this.enchantments); // Paper
- }
- if (this.hasAttributeModifiers()) {
- clone.attributeModifiers = LinkedHashMultimap.create(this.attributeModifiers);
-@@ -1516,4 +1519,22 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
- return CraftMetaItem.HANDLED_TAGS;
- }
- }
-+
-+ // Paper start
-+ private static class EnchantmentMap extends TreeMap {
-+ private EnchantmentMap(Map enchantments) {
-+ this();
-+ putAll(enchantments);
-+ }
-+
-+ private EnchantmentMap() {
-+ super(Comparator.comparing(o -> o.getKey().toString()));
-+ }
-+
-+ public EnchantmentMap clone() {
-+ return (EnchantmentMap) super.clone();
-+ }
-+ }
-+ // Paper end
-+
- }
diff --git a/patches/server/0070-Add-World-Util-Methods.patch b/patches/server/0069-Add-World-Util-Methods.patch
similarity index 100%
rename from patches/server/0070-Add-World-Util-Methods.patch
rename to patches/server/0069-Add-World-Util-Methods.patch
diff --git a/patches/server/0070-Custom-replacement-for-eaten-items.patch b/patches/server/0070-Custom-replacement-for-eaten-items.patch
new file mode 100644
index 000000000000..c44df3ecedbe
--- /dev/null
+++ b/patches/server/0070-Custom-replacement-for-eaten-items.patch
@@ -0,0 +1,48 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jedediah Smith
+Date: Sun, 21 Jun 2015 15:07:20 -0400
+Subject: [PATCH] Custom replacement for eaten items
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 0a573b188111e84290317f2ce5620b6ea6c8b6de..13da8e684172f9f95fbcb63a322b559b733f2469 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -3711,10 +3711,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ this.triggerItemUseEffects(this.useItem, 16);
+ // CraftBukkit start - fire PlayerItemConsumeEvent
+ ItemStack itemstack;
++ PlayerItemConsumeEvent event = null; // Paper
+ if (this instanceof ServerPlayer) {
+ org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.useItem);
+ org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(enumhand);
+- PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem, hand);
++ event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem, hand); // Paper
+ this.level().getCraftServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+@@ -3728,6 +3729,12 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ } else {
+ itemstack = this.useItem.finishUsingItem(this.level(), this);
+ }
++ // Paper start - save the default replacement item and change it if necessary
++ final ItemStack defaultReplacement = itemstack;
++ if (event != null && event.getReplacement() != null) {
++ itemstack = CraftItemStack.asNMSCopy(event.getReplacement());
++ }
++ // Paper end
+ // CraftBukkit end
+
+ if (itemstack != this.useItem) {
+@@ -3735,6 +3742,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ }
+
+ this.stopUsingItem();
++ // Paper start - if the replacement is anything but the default, update the client inventory
++ if (this instanceof ServerPlayer && !com.google.common.base.Objects.equal(defaultReplacement, itemstack)) {
++ ((ServerPlayer) this).getBukkitEntity().updateInventory();
++ }
++ // Paper end
+ }
+
+ }
diff --git a/patches/server/0071-Custom-replacement-for-eaten-items.patch b/patches/server/0071-Custom-replacement-for-eaten-items.patch
deleted file mode 100644
index 19948631fa23..000000000000
--- a/patches/server/0071-Custom-replacement-for-eaten-items.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jedediah Smith
-Date: Sun, 21 Jun 2015 15:07:20 -0400
-Subject: [PATCH] Custom replacement for eaten items
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 3eeb40c2176a80b9e2a472d43671ae0fe087d9e7..3179fc1b33f503b0cdd462ad160edee760b5a7eb 100644
---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
-+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -3698,10 +3698,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
- this.triggerItemUseEffects(this.useItem, 16);
- // CraftBukkit start - fire PlayerItemConsumeEvent
- ItemStack itemstack;
-+ PlayerItemConsumeEvent event = null; // Paper
- if (this instanceof ServerPlayer) {
- org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.useItem);
- org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(enumhand);
-- PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem, hand);
-+ event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem, hand); // Paper
- this.level().getCraftServer().getPluginManager().callEvent(event);
-
- if (event.isCancelled()) {
-@@ -3715,6 +3716,12 @@ public abstract class LivingEntity extends Entity implements Attackable {
- } else {
- itemstack = this.useItem.finishUsingItem(this.level(), this);
- }
-+ // Paper start - save the default replacement item and change it if necessary
-+ final ItemStack defaultReplacement = itemstack;
-+ if (event != null && event.getReplacement() != null) {
-+ itemstack = CraftItemStack.asNMSCopy(event.getReplacement());
-+ }
-+ // Paper end
- // CraftBukkit end
-
- if (itemstack != this.useItem) {
-@@ -3722,6 +3729,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
- }
-
- this.stopUsingItem();
-+ // Paper start - if the replacement is anything but the default, update the client inventory
-+ if (this instanceof ServerPlayer && !com.google.common.base.Objects.equal(defaultReplacement, itemstack)) {
-+ ((ServerPlayer) this).getBukkitEntity().updateInventory();
-+ }
-+ // Paper end
- }
-
- }
diff --git a/patches/server/0071-handle-NaN-health-absorb-values-and-repair-bad-data.patch b/patches/server/0071-handle-NaN-health-absorb-values-and-repair-bad-data.patch
new file mode 100644
index 000000000000..47da543ce464
--- /dev/null
+++ b/patches/server/0071-handle-NaN-health-absorb-values-and-repair-bad-data.patch
@@ -0,0 +1,57 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar
+Date: Sun, 27 Sep 2015 01:18:02 -0400
+Subject: [PATCH] handle NaN health/absorb values and repair bad data
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 13da8e684172f9f95fbcb63a322b559b733f2469..406559f3a493e1be0d2bee8a6f3cc79668e2bb38 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -794,7 +794,13 @@ public abstract class LivingEntity extends Entity implements Attackable {
+
+ @Override
+ public void readAdditionalSaveData(CompoundTag nbt) {
+- this.internalSetAbsorptionAmount(nbt.getFloat("AbsorptionAmount"));
++ // Paper start - Check for NaN
++ float absorptionAmount = nbt.getFloat("AbsorptionAmount");
++ if (Float.isNaN(absorptionAmount)) {
++ absorptionAmount = 0;
++ }
++ this.internalSetAbsorptionAmount(absorptionAmount);
++ // Paper end - Check for NaN
+ if (nbt.contains("Attributes", 9) && this.level() != null && !this.level().isClientSide) {
+ this.getAttributes().load(nbt.getList("Attributes", 10));
+ }
+@@ -1344,6 +1350,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ }
+
+ public void setHealth(float health) {
++ // Paper start - Check for NaN
++ if (Float.isNaN(health)) { health = getMaxHealth(); if (this.valid) {
++ System.err.println("[NAN-HEALTH] " + getScoreboardName() + " had NaN health set");
++ } } // Paper end - Check for NaN
+ // CraftBukkit start - Handle scaled health
+ if (this instanceof ServerPlayer) {
+ org.bukkit.craftbukkit.entity.CraftPlayer player = ((ServerPlayer) this).getBukkitEntity();
+@@ -3544,7 +3554,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ }
+
+ public final void setAbsorptionAmount(float absorptionAmount) {
+- this.internalSetAbsorptionAmount(Mth.clamp(absorptionAmount, 0.0F, this.getMaxAbsorption()));
++ this.internalSetAbsorptionAmount(!Float.isNaN(absorptionAmount) ? Mth.clamp(absorptionAmount, 0.0F, this.getMaxAbsorption()) : 0.0F); // Paper - Check for NaN
+ }
+
+ protected void internalSetAbsorptionAmount(float absorptionAmount) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index b6851bd629c4d3b9aa7efdf1112e1cf59cd63f60..b79aea8ae49a4edbb45f0824535fd38d3686e67b 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -2258,6 +2258,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ }
+
+ public void setRealHealth(double health) {
++ if (Double.isNaN(health)) {return;} // Paper - Check for NaN
+ this.health = health;
+ }
+
diff --git a/patches/server/0072-Use-a-Shared-Random-for-Entities.patch b/patches/server/0072-Use-a-Shared-Random-for-Entities.patch
new file mode 100644
index 000000000000..38fbe5985fe0
--- /dev/null
+++ b/patches/server/0072-Use-a-Shared-Random-for-Entities.patch
@@ -0,0 +1,113 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar
+Date: Tue, 22 Mar 2016 00:33:47 -0400
+Subject: [PATCH] Use a Shared Random for Entities
+
+Reduces memory usage and provides ensures more randomness, Especially since a lot of garbage entity objects get created.
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index e7157ff6cd6f2c52593bba63129fdaa60fcbf886..dba9588d9c8b1291ec8fe401e4990f4750b790db 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -165,6 +165,79 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ return tag.contains("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level;
+ }
+
++ // Paper start - Share random for entities to make them more random
++ public static RandomSource SHARED_RANDOM = new RandomRandomSource();
++ private static final class RandomRandomSource extends java.util.Random implements net.minecraft.world.level.levelgen.BitRandomSource {
++ private boolean locked = false;
++
++ @Override
++ public synchronized void setSeed(long seed) {
++ if (locked) {
++ LOGGER.error("Ignoring setSeed on Entity.SHARED_RANDOM", new Throwable());
++ } else {
++ super.setSeed(seed);
++ locked = true;
++ }
++ }
++
++ @Override
++ public RandomSource fork() {
++ return new net.minecraft.world.level.levelgen.LegacyRandomSource(this.nextLong());
++ }
++
++ @Override
++ public net.minecraft.world.level.levelgen.PositionalRandomFactory forkPositional() {
++ return new net.minecraft.world.level.levelgen.LegacyRandomSource.LegacyPositionalRandomFactory(this.nextLong());
++ }
++
++ // these below are added to fix reobf issues that I don't wanna deal with right now
++ @Override
++ public int next(int bits) {
++ return super.next(bits);
++ }
++
++ @Override
++ public int nextInt(int origin, int bound) {
++ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(origin, bound);
++ }
++
++ @Override
++ public long nextLong() {
++ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextLong();
++ }
++
++ @Override
++ public int nextInt() {
++ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt();
++ }
++
++ @Override
++ public int nextInt(int bound) {
++ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(bound);
++ }
++
++ @Override
++ public boolean nextBoolean() {
++ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextBoolean();
++ }
++
++ @Override
++ public float nextFloat() {
++ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextFloat();
++ }
++
++ @Override
++ public double nextDouble() {
++ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextDouble();
++ }
++
++ @Override
++ public double nextGaussian() {
++ return super.nextGaussian();
++ }
++ }
++ // Paper end - Share random for entities to make them more random
++
+ private CraftEntity bukkitEntity;
+
+ public CraftEntity getBukkitEntity() {
+@@ -361,7 +434,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ this.bb = Entity.INITIAL_AABB;
+ this.stuckSpeedMultiplier = Vec3.ZERO;
+ this.nextStep = 1.0F;
+- this.random = RandomSource.create();
++ this.random = SHARED_RANDOM; // Paper - Share random for entities to make them more random
+ this.remainingFireTicks = -this.getFireImmuneTicks();
+ this.fluidHeight = new Object2DoubleArrayMap(2);
+ this.fluidOnEyes = new HashSet();
+diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java
+index 891d8b4c8cb73d5e310970066831ab3e2af14e91..4f32597c7af34d599f6658fe4962d41624e60419 100644
+--- a/src/main/java/net/minecraft/world/entity/animal/Squid.java
++++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java
+@@ -44,7 +44,7 @@ public class Squid extends WaterAnimal {
+
+ public Squid(EntityType extends Squid> type, Level world) {
+ super(type, world);
+- this.random.setSeed((long)this.getId());
++ //this.random.setSeed((long)this.getId()); // Paper - Share random for entities to make them more random
+ this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
+ }
+
diff --git a/patches/server/0072-handle-NaN-health-absorb-values-and-repair-bad-data.patch b/patches/server/0072-handle-NaN-health-absorb-values-and-repair-bad-data.patch
deleted file mode 100644
index fc8065c9453a..000000000000
--- a/patches/server/0072-handle-NaN-health-absorb-values-and-repair-bad-data.patch
+++ /dev/null
@@ -1,57 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar
-Date: Sun, 27 Sep 2015 01:18:02 -0400
-Subject: [PATCH] handle NaN health/absorb values and repair bad data
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 3179fc1b33f503b0cdd462ad160edee760b5a7eb..428a9d21b24e9c349bf766c16172ffd904f3b6a5 100644
---- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
-+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -793,7 +793,13 @@ public abstract class LivingEntity extends Entity implements Attackable {
-
- @Override
- public void readAdditionalSaveData(CompoundTag nbt) {
-- this.internalSetAbsorptionAmount(nbt.getFloat("AbsorptionAmount"));
-+ // Paper start - Check for NaN
-+ float absorptionAmount = nbt.getFloat("AbsorptionAmount");
-+ if (Float.isNaN(absorptionAmount)) {
-+ absorptionAmount = 0;
-+ }
-+ this.internalSetAbsorptionAmount(absorptionAmount);
-+ // Paper end - Check for NaN
- if (nbt.contains("Attributes", 9) && this.level() != null && !this.level().isClientSide) {
- this.getAttributes().load(nbt.getList("Attributes", 10));
- }
-@@ -1343,6 +1349,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
- }
-
- public void setHealth(float health) {
-+ // Paper start - Check for NaN
-+ if (Float.isNaN(health)) { health = getMaxHealth(); if (this.valid) {
-+ System.err.println("[NAN-HEALTH] " + getScoreboardName() + " had NaN health set");
-+ } } // Paper end - Check for NaN
- // CraftBukkit start - Handle scaled health
- if (this instanceof ServerPlayer) {
- org.bukkit.craftbukkit.entity.CraftPlayer player = ((ServerPlayer) this).getBukkitEntity();
-@@ -3531,7 +3541,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
- }
-
- public final void setAbsorptionAmount(float absorptionAmount) {
-- this.internalSetAbsorptionAmount(Mth.clamp(absorptionAmount, 0.0F, this.getMaxAbsorption()));
-+ this.internalSetAbsorptionAmount(!Float.isNaN(absorptionAmount) ? Mth.clamp(absorptionAmount, 0.0F, this.getMaxAbsorption()) : 0.0F); // Paper - Check for NaN
- }
-
- protected void internalSetAbsorptionAmount(float absorptionAmount) {
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 8be468cb5305c0db5f46298aaf6c896b27ce4aee..af0b3ea4bdb474d15c3e0a8ad8e1d23abc4c3413 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2207,6 +2207,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- }
-
- public void setRealHealth(double health) {
-+ if (Double.isNaN(health)) {return;} // Paper - Check for NaN
- this.health = health;
- }
-
diff --git a/patches/server/0073-Configurable-spawn-chances-for-skeleton-horses.patch b/patches/server/0073-Configurable-spawn-chances-for-skeleton-horses.patch
new file mode 100644
index 000000000000..604e850fb328
--- /dev/null
+++ b/patches/server/0073-Configurable-spawn-chances-for-skeleton-horses.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown
+Date: Tue, 22 Mar 2016 12:04:28 -0500
+Subject: [PATCH] Configurable spawn chances for skeleton horses
+
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
+index c9113f7e0d9e1b9861f667c40e2702c6bb1d4e53..a127acc6c44bfd078e06c74b408d62df6e85d1fe 100644
+--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
+@@ -614,7 +614,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+
+ if (this.isRainingAt(blockposition)) {
+ DifficultyInstance difficultydamagescaler = this.getCurrentDifficultyAt(blockposition);
+- boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * 0.01D && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD);
++ boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper - Configurable spawn chances for skeleton horses
+
+ if (flag1) {
+ SkeletonHorse entityhorseskeleton = (SkeletonHorse) EntityType.SKELETON_HORSE.create(this);
diff --git a/patches/server/0073-Use-a-Shared-Random-for-Entities.patch b/patches/server/0073-Use-a-Shared-Random-for-Entities.patch
deleted file mode 100644
index c5c3e67cfe80..000000000000
--- a/patches/server/0073-Use-a-Shared-Random-for-Entities.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar
-Date: Tue, 22 Mar 2016 00:33:47 -0400
-Subject: [PATCH] Use a Shared Random for Entities
-
-Reduces memory usage and provides ensures more randomness, Especially since a lot of garbage entity objects get created.
-
-diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index c4168fa278dacf9f50058bb7dc98bb12aef717f2..b5138df02005e30c1788c97bd9dcbcf2c5fb5d34 100644
---- a/src/main/java/net/minecraft/world/entity/Entity.java
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -165,6 +165,79 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- return tag.contains("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level;
- }
-
-+ // Paper start - Share random for entities to make them more random
-+ public static RandomSource SHARED_RANDOM = new RandomRandomSource();
-+ private static final class RandomRandomSource extends java.util.Random implements net.minecraft.world.level.levelgen.BitRandomSource {
-+ private boolean locked = false;
-+
-+ @Override
-+ public synchronized void setSeed(long seed) {
-+ if (locked) {
-+ LOGGER.error("Ignoring setSeed on Entity.SHARED_RANDOM", new Throwable());
-+ } else {
-+ super.setSeed(seed);
-+ locked = true;
-+ }
-+ }
-+
-+ @Override
-+ public RandomSource fork() {
-+ return new net.minecraft.world.level.levelgen.LegacyRandomSource(this.nextLong());
-+ }
-+
-+ @Override
-+ public net.minecraft.world.level.levelgen.PositionalRandomFactory forkPositional() {
-+ return new net.minecraft.world.level.levelgen.LegacyRandomSource.LegacyPositionalRandomFactory(this.nextLong());
-+ }
-+
-+ // these below are added to fix reobf issues that I don't wanna deal with right now
-+ @Override
-+ public int next(int bits) {
-+ return super.next(bits);
-+ }
-+
-+ @Override
-+ public int nextInt(int origin, int bound) {
-+ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(origin, bound);
-+ }
-+
-+ @Override
-+ public long nextLong() {
-+ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextLong();
-+ }
-+
-+ @Override
-+ public int nextInt() {
-+ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt();
-+ }
-+
-+ @Override
-+ public int nextInt(int bound) {
-+ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(bound);
-+ }
-+
-+ @Override
-+ public boolean nextBoolean() {
-+ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextBoolean();
-+ }
-+
-+ @Override
-+ public float nextFloat() {
-+ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextFloat();
-+ }
-+
-+ @Override
-+ public double nextDouble() {
-+ return net.minecraft.world.level.levelgen.BitRandomSource.super.nextDouble();
-+ }
-+
-+ @Override
-+ public double nextGaussian() {
-+ return super.nextGaussian();
-+ }
-+ }
-+ // Paper end - Share random for entities to make them more random
-+
- private CraftEntity bukkitEntity;
-
- public CraftEntity getBukkitEntity() {
-@@ -361,7 +434,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- this.bb = Entity.INITIAL_AABB;
- this.stuckSpeedMultiplier = Vec3.ZERO;
- this.nextStep = 1.0F;
-- this.random = RandomSource.create();
-+ this.random = SHARED_RANDOM; // Paper - Share random for entities to make them more random
- this.remainingFireTicks = -this.getFireImmuneTicks();
- this.fluidHeight = new Object2DoubleArrayMap(2);
- this.fluidOnEyes = new HashSet();
-diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java
-index 891d8b4c8cb73d5e310970066831ab3e2af14e91..4f32597c7af34d599f6658fe4962d41624e60419 100644
---- a/src/main/java/net/minecraft/world/entity/animal/Squid.java
-+++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java
-@@ -44,7 +44,7 @@ public class Squid extends WaterAnimal {
-
- public Squid(EntityType extends Squid> type, Level world) {
- super(type, world);
-- this.random.setSeed((long)this.getId());
-+ //this.random.setSeed((long)this.getId()); // Paper - Share random for entities to make them more random
- this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
- }
-
diff --git a/patches/server/0074-Configurable-spawn-chances-for-skeleton-horses.patch b/patches/server/0074-Configurable-spawn-chances-for-skeleton-horses.patch
deleted file mode 100644
index d7d438869c10..000000000000
--- a/patches/server/0074-Configurable-spawn-chances-for-skeleton-horses.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Zach Brown