From f6242c0a304bee6b87df1bdc62e18d6a38ed3452 Mon Sep 17 00:00:00 2001 From: granny Date: Sat, 7 Feb 2026 15:58:19 -0800 Subject: [PATCH] Updated Upstream (Paper) Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@57c7aac4 Propagate failures from suggestion futures fixes #13587 (#13598) PaperMC/Paper@fd39dbdb Provide locale pointer for config connection audience (#13600) PaperMC/Paper@a687a82c [ci/skip] chore: remove unneeded task configuration (#13484) PaperMC/Paper@e5718dce fix: PlayerServerFullCheckEvent#deny not setting the allow flag (#13601) PaperMC/Paper@ae0c3a9e Add ItemCraftedEvent (#12245) PaperMC/Paper@581214ad Fix fixClimbingBypassingCramming option (#12793) PaperMC/Paper@0d768aac Add RecipeChoice.ItemTypeChoice (#12049) PaperMC/Paper@e2b76dfd Implement deprecated getItemStack method in ItemTypeRecipeChoice (#13607) PaperMC/Paper@9d303299 Fix pre-tick cooldown reset on swap (#13589) PaperMC/Paper@04739de1 Make SkinSource Player implementation reflect profile changes (#13585) PaperMC/Paper@c59990d9 Update affects spawning api (#13556) PaperMC/Paper@302c47c0 Don't tick disconnected connections (#13614) --- build.gradle.kts | 4 --- gradle.properties | 2 +- .../java/org/bukkit/OfflinePlayer.java.patch | 8 ++--- .../java/org/bukkit/entity/Player.java.patch | 2 +- .../bukkit/inventory/RecipeChoice.java.patch | 12 +++---- .../features/0001-Ridables.patch | 12 +++---- .../ServerGamePacketListenerImpl.java.patch | 34 +++++++++---------- .../world/level/EntityGetter.java.patch | 2 +- .../inventory/CraftRecipe.java.patch | 2 +- 9 files changed, 37 insertions(+), 41 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7d9eeaeb7..aad5377f0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -60,10 +60,6 @@ subprojects { events(TestLogEvent.STANDARD_OUT) } } - tasks.withType().configureEach { - isPreserveFileTimestamps = false - isReproducibleFileOrder = true - } repositories { mavenCentral() diff --git a/gradle.properties b/gradle.properties index fb48a998a..3e1ebf85a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ version = 1.21.11-R0.1-SNAPSHOT mcVersion = 1.21.11 apiVersion = 1.21.11 -paperCommit = 4873e3fb7eb448dfbb5b815a0e3a8c52038af6e1 +paperCommit = 302c47c0dda6251fd5eb6bf7130345e9dcb988fc org.gradle.configuration-cache = true org.gradle.caching = true diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch index 47eb17201..4f157623a 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch @@ -1,10 +1,10 @@ --- a/src/main/java/org/bukkit/OfflinePlayer.java +++ b/src/main/java/org/bukkit/OfflinePlayer.java -@@ -592,4 +_,104 @@ - default void applySkinToPlayerHeadContents(final PlayerHeadObjectContents.@NonNull Builder builder) { - builder.id(this.getUniqueId()); +@@ -591,4 +_,104 @@ + default void applySkinToPlayerHeadContents(final PlayerHeadObjectContents.Builder builder) { + builder.skin(this.getPlayerProfile()); } -+ ++ + // Purpur start - OfflinePlayer API + /** + * Determines if the OfflinePlayer is allowed to fly via jump key double-tap like diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Player.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Player.java.patch index 95b49e83f..63bc57f4a 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Player.java.patch +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Player.java.patch @@ -1,6 +1,6 @@ --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -4004,4 +_,123 @@ +@@ -4012,4 +_,123 @@ */ @ApiStatus.Experimental PlayerGameConnection getConnection(); diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch index 177eef71b..18e048d91 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch @@ -1,22 +1,22 @@ --- a/src/main/java/org/bukkit/inventory/RecipeChoice.java +++ b/src/main/java/org/bukkit/inventory/RecipeChoice.java -@@ -191,6 +_,7 @@ - public static class ExactChoice implements RecipeChoice { +@@ -227,6 +_,7 @@ + final class ExactChoice implements RecipeChoice { private List choices; + private Predicate predicate; // Purpur - Add predicate to recipe's ExactChoice ingredient - public ExactChoice(@NotNull ItemStack stack) { + public ExactChoice(ItemStack stack) { this(Arrays.asList(stack)); -@@ -241,6 +_,7 @@ +@@ -275,6 +_,7 @@ @Override - public boolean test(@NotNull ItemStack t) { + public boolean test(ItemStack t) { + if (predicate != null) return predicate.test(t); // Purpur - Add predicate to recipe's ExactChoice ingredient for (ItemStack match : choices) { if (t.isSimilar(match)) { return true; -@@ -249,6 +_,17 @@ +@@ -283,6 +_,17 @@ return false; } diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index b7c783851..1062e3de3 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -18,7 +18,7 @@ index 05eb0c3273ffa1b5a1ebd8f8ae42c11830d755c7..49d3154afe2ca5789e63bdf972c79196 public boolean isClientAuthoritative() { return false; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 8793253032e43920d9668079d5a2537ac5aec415..2717e0a1fd8a3cc7d4a6f8d18659293e86025cd0 100644 +index 21ec2d87249824a6f796833baa48b122e39157d2..cbf0f526329b0de3281795667203a6500c6aedd0 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -1836,6 +1836,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -1) { -@@ -363,6 +_,12 @@ + if (this.isDisconnected()) return; // Paper +@@ -364,6 +_,12 @@ && this.server.playerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > TimeUnit.MINUTES.toMillis(this.server.playerIdleTimeout()) && !this.player.wonGame) { @@ -34,7 +34,7 @@ this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause } } -@@ -682,6 +_,8 @@ +@@ -683,6 +_,8 @@ this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -43,7 +43,7 @@ Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -761,6 +_,7 @@ +@@ -762,6 +_,7 @@ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { @@ -51,7 +51,7 @@ this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause return; } -@@ -1301,6 +_,10 @@ +@@ -1302,6 +_,10 @@ final int maxBookPageSize = pageMax.intValue(); final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D); long byteAllowed = maxBookPageSize; @@ -62,7 +62,7 @@ for (final String page : pageList) { final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length; byteTotal += byteLength; -@@ -1325,7 +_,8 @@ +@@ -1326,7 +_,8 @@ } if (byteTotal > byteAllowed) { @@ -72,7 +72,7 @@ this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect return; } -@@ -1344,31 +_,45 @@ +@@ -1345,31 +_,45 @@ Optional optional = packet.title(); optional.ifPresent(list::add); list.addAll(packet.pages()); @@ -122,7 +122,7 @@ itemStack.set( DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getPlainTextName(), 0, list, true) ); -@@ -1381,6 +_,16 @@ +@@ -1382,6 +_,16 @@ return this.player.isTextFilteringEnabled() ? Filterable.passThrough(filteredText.filteredOrEmpty()) : Filterable.from(filteredText); } @@ -139,7 +139,7 @@ @Override public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); -@@ -1420,7 +_,15 @@ +@@ -1421,7 +_,15 @@ @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); @@ -156,7 +156,7 @@ this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause } else { ServerLevel serverLevel = this.player.level(); -@@ -1603,7 +_,7 @@ +@@ -1604,7 +_,7 @@ movedWrongly = true; if (event.getLogWarning()) // Paper end @@ -165,7 +165,7 @@ } // Paper } -@@ -1668,6 +_,8 @@ +@@ -1669,6 +_,8 @@ this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -174,7 +174,7 @@ Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -1723,6 +_,13 @@ +@@ -1724,6 +_,13 @@ this.player.tryResetCurrentImpulseContext(); } @@ -188,7 +188,7 @@ this.player.checkMovementStatistics(this.player.getX() - x, this.player.getY() - y, this.player.getZ() - z); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); -@@ -1740,6 +_,17 @@ +@@ -1741,6 +_,17 @@ } } @@ -206,7 +206,7 @@ private boolean shouldCheckPlayerMovement(boolean isElytraMovement) { if (this.isSingleplayerOwner()) { return false; -@@ -2168,6 +_,7 @@ +@@ -2169,6 +_,7 @@ boolean cancelled; if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) { @@ -214,7 +214,7 @@ org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemInHand, hand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2820,6 +_,7 @@ +@@ -2821,6 +_,7 @@ AABB boundingBox = target.getBoundingBox(); if (packet.isWithinRange(this.player, boundingBox, io.papermc.paper.configuration.GlobalConfiguration.get().misc.clientInteractionLeniencyDistance.or(3.0))) { // Paper - configurable lenience value for interact range @@ -222,7 +222,7 @@ packet.dispatch( new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand hand, ServerGamePacketListenerImpl.EntityInteraction entityInteraction, PlayerInteractEntityEvent event) { // CraftBukkit -@@ -3580,7 +_,7 @@ +@@ -3581,7 +_,7 @@ @Override public void handleChangeGameMode(ServerboundChangeGameModePacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch index a2b6b7872..037967e4e 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/EntityGetter.java +++ b/net/minecraft/world/level/EntityGetter.java -@@ -182,7 +_,7 @@ +@@ -187,7 +_,7 @@ default boolean hasNearbyAlivePlayer(double x, double y, double z, double distance) { for (Player player : this.players()) { diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch index b3042e1f5..d0024f75f 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch @@ -1,6 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java -@@ -36,6 +_,7 @@ +@@ -43,6 +_,7 @@ stack = Ingredient.of(((RecipeChoice.MaterialChoice) bukkit).getChoices().stream().map((mat) -> CraftItemType.bukkitToMinecraft(mat))); } else if (bukkit instanceof RecipeChoice.ExactChoice) { stack = Ingredient.ofStacks(((RecipeChoice.ExactChoice) bukkit).getChoices().stream().map((mat) -> CraftItemStack.asNMSCopy(mat)).toList());