From 0fde46537fdaaa0c37129efb63c265db0355a7af Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 21 Sep 2023 15:26:51 -0700
Subject: [PATCH] some more work

---
 ...-replace-OfflinePlayer-getLastPlayed.patch |  4 +-
 .../Add-LivingEntity-getTargetEntity.patch    |  0
 .../Add-PlayerConnectionCloseEvent.patch      |  7 ++--
 .../server/Add-more-Witch-API.patch           |  6 +--
 .../server/Add-more-Zombie-API.patch          |  0
 ...event-players-from-moving-into-unloa.patch |  8 ++--
 .../server/Add-sun-related-API.patch          |  0
 patches/server/Adventure.patch                |  6 ++-
 ...ow-chests-to-be-placed-with-NBT-data.patch |  0
 .../server/Async-command-map-building.patch   |  0
 ...-remove-from-being-called-on-Players.patch |  0
 .../server/BlockDestroyEvent.patch            |  0
 .../server/Book-Size-Limits.patch             |  2 +-
 ...tator-target-events-and-improve-impl.patch |  0
 ...arseException-in-Entity-and-TE-names.patch | 27 ++++---------
 ...owned-for-Villager-Aggression-Config.patch |  0
 ...ble-connection-throttle-kick-message.patch |  0
 ...t-allow-digging-into-unloaded-chunks.patch |  2 +-
 ...-after-profile-lookups-if-not-needed.patch |  6 +--
 ...e-attack-cooldown-methods-for-Player.patch |  0
 .../Fix-SpongeAbsortEvent-handling.patch      |  0
 ...e-Large-Packets-disconnecting-client.patch | 38 +++++++++++--------
 .../server/Honor-EntityAgeable.ageLock.patch  |  0
 .../server/Hook-into-CB-plugin-rewrites.patch |  0
 ...-for-CanPlaceOn-and-CanDestroy-NBT-v.patch |  0
 ...nt-furnace-cook-speed-multiplier-API.patch | 16 ++++----
 ...er-Thread-Pool-and-Thread-Priorities.patch |  0
 .../server/Improve-death-events.patch         |  4 +-
 ...ther-worlds-for-shooter-of-projectil.patch |  0
 ...ault-permission-message-configurable.patch |  0
 .../server/Mob-Pathfinding-API.patch          |  0
 .../server/Optimize-World-Time-Updates.patch  |  0
 .../server/PreSpawnerSpawnEvent.patch         |  0
 ...Prevent-Enderman-from-loading-chunks.patch |  0
 ...ent-Mob-AI-Rules-from-Loading-Chunks.patch |  0
 ...ent-chunk-loading-from-Fluid-Flowing.patch |  0
 ...wning-from-loading-generating-chunks.patch |  0
 ...Prevent-rayTrace-from-loading-chunks.patch |  0
 .../Reset-players-airTicks-on-respawn.patch   |  0
 ...store-custom-InventoryHolder-support.patch |  0
 .../{unapplied => }/server/Turtle-API.patch   |  0
 .../server/Use-Vanilla-Minecart-Speeds.patch  |  0
 ...vehicle-tracking-issue-on-disconnect.patch |  0
 ...entity-dismount-during-teleportation.patch |  0
 44 files changed, 64 insertions(+), 62 deletions(-)
 rename patches/{unapplied => }/server/Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch (98%)
 rename patches/{unapplied => }/server/Add-LivingEntity-getTargetEntity.patch (100%)
 rename patches/{unapplied => }/server/Add-PlayerConnectionCloseEvent.patch (95%)
 rename patches/{unapplied => }/server/Add-more-Witch-API.patch (99%)
 rename patches/{unapplied => }/server/Add-more-Zombie-API.patch (100%)
 rename patches/{unapplied => }/server/Add-option-to-prevent-players-from-moving-into-unloa.patch (92%)
 rename patches/{unapplied => }/server/Add-sun-related-API.patch (100%)
 rename patches/{unapplied => }/server/Allow-chests-to-be-placed-with-NBT-data.patch (100%)
 rename patches/{unapplied => }/server/Async-command-map-building.patch (100%)
 rename patches/{unapplied => }/server/Block-Entity-remove-from-being-called-on-Players.patch (100%)
 rename patches/{unapplied => }/server/BlockDestroyEvent.patch (100%)
 rename patches/{unapplied => }/server/Book-Size-Limits.patch (96%)
 rename patches/{unapplied => }/server/Call-player-spectator-target-events-and-improve-impl.patch (100%)
 rename patches/{unapplied => }/server/Catch-JsonParseException-in-Entity-and-TE-names.patch (87%)
 rename patches/{unapplied => }/server/Check-Drowned-for-Villager-Aggression-Config.patch (100%)
 rename patches/{unapplied => }/server/Configurable-connection-throttle-kick-message.patch (100%)
 rename patches/{unapplied => }/server/Don-t-allow-digging-into-unloaded-chunks.patch (98%)
 rename patches/{unapplied => }/server/Don-t-sleep-after-profile-lookups-if-not-needed.patch (83%)
 rename patches/{unapplied => }/server/Expose-attack-cooldown-methods-for-Player.patch (100%)
 rename patches/{unapplied => }/server/Fix-SpongeAbsortEvent-handling.patch (100%)
 rename patches/{unapplied => }/server/Handle-Large-Packets-disconnecting-client.patch (81%)
 rename patches/{unapplied => }/server/Honor-EntityAgeable.ageLock.patch (100%)
 rename patches/{unapplied => }/server/Hook-into-CB-plugin-rewrites.patch (100%)
 rename patches/{unapplied => }/server/Implement-an-API-for-CanPlaceOn-and-CanDestroy-NBT-v.patch (100%)
 rename patches/{unapplied => }/server/Implement-furnace-cook-speed-multiplier-API.patch (89%)
 rename patches/{unapplied => }/server/Improve-Server-Thread-Pool-and-Thread-Priorities.patch (100%)
 rename patches/{unapplied => }/server/Improve-death-events.patch (99%)
 rename patches/{unapplied => }/server/MC-50319-Check-other-worlds-for-shooter-of-projectil.patch (100%)
 rename patches/{unapplied => }/server/Make-the-default-permission-message-configurable.patch (100%)
 rename patches/{unapplied => }/server/Mob-Pathfinding-API.patch (100%)
 rename patches/{unapplied => }/server/Optimize-World-Time-Updates.patch (100%)
 rename patches/{unapplied => }/server/PreSpawnerSpawnEvent.patch (100%)
 rename patches/{unapplied => }/server/Prevent-Enderman-from-loading-chunks.patch (100%)
 rename patches/{unapplied => }/server/Prevent-Mob-AI-Rules-from-Loading-Chunks.patch (100%)
 rename patches/{unapplied => }/server/Prevent-chunk-loading-from-Fluid-Flowing.patch (100%)
 rename patches/{unapplied => }/server/Prevent-mob-spawning-from-loading-generating-chunks.patch (100%)
 rename patches/{unapplied => }/server/Prevent-rayTrace-from-loading-chunks.patch (100%)
 rename patches/{unapplied => }/server/Reset-players-airTicks-on-respawn.patch (100%)
 rename patches/{unapplied => }/server/Restore-custom-InventoryHolder-support.patch (100%)
 rename patches/{unapplied => }/server/Turtle-API.patch (100%)
 rename patches/{unapplied => }/server/Use-Vanilla-Minecart-Speeds.patch (100%)
 rename patches/{unapplied => }/server/Workaround-for-vehicle-tracking-issue-on-disconnect.patch (100%)
 rename patches/{unapplied => }/server/force-entity-dismount-during-teleportation.patch (100%)

diff --git a/patches/unapplied/server/Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch b/patches/server/Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
similarity index 98%
rename from patches/unapplied/server/Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
rename to patches/server/Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
index 6c3ef3a067..f4e24d8b55 100644
--- a/patches/unapplied/server/Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
+++ b/patches/server/Add-APIs-to-replace-OfflinePlayer-getLastPlayed.patch
@@ -20,7 +20,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
 +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
 @@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
-     public int latency;
+     private int containerCounter;
      public boolean wonGame;
      private int containerUpdateDelay; // Paper
 +    public long loginTime; // Paper
@@ -33,7 +33,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/net/minecraft/server/players/PlayerList.java
 @@ -0,0 +0,0 @@ public abstract class PlayerList {
  
-     public void placeNewPlayer(Connection connection, ServerPlayer player) {
+     public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie clientData) {
          player.isRealPlayer = true; // Paper
 +        player.loginTime = System.currentTimeMillis(); // Paper
          GameProfile gameprofile = player.getGameProfile();
diff --git a/patches/unapplied/server/Add-LivingEntity-getTargetEntity.patch b/patches/server/Add-LivingEntity-getTargetEntity.patch
similarity index 100%
rename from patches/unapplied/server/Add-LivingEntity-getTargetEntity.patch
rename to patches/server/Add-LivingEntity-getTargetEntity.patch
diff --git a/patches/unapplied/server/Add-PlayerConnectionCloseEvent.patch b/patches/server/Add-PlayerConnectionCloseEvent.patch
similarity index 95%
rename from patches/unapplied/server/Add-PlayerConnectionCloseEvent.patch
rename to patches/server/Add-PlayerConnectionCloseEvent.patch
index 49c8b37f2f..4e0dcd067a 100644
--- a/patches/unapplied/server/Add-PlayerConnectionCloseEvent.patch
+++ b/patches/server/Add-PlayerConnectionCloseEvent.patch
@@ -43,9 +43,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/network/Connection.java
 +++ b/src/main/java/net/minecraft/network/Connection.java
 @@ -0,0 +0,0 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
-                     this.getPacketListener().onDisconnect(Component.translatable("multiplayer.disconnect.generic"));
+                     packetlistener1.onDisconnect(ichatbasecomponent);
                  }
-                 this.queue.clear(); // Free up packet queue.
+                 this.pendingActions.clear(); // Free up packet queue.
 +                // Paper start - Add PlayerConnectionCloseEvent
 +                final PacketListener packetListener = this.getPacketListener();
 +                if (packetListener instanceof net.minecraft.server.network.ServerGamePacketListenerImpl) {
@@ -66,6 +66,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +                    }
 +                }
 +                // Paper end
-             }
++            }
  
+             }
          }
diff --git a/patches/unapplied/server/Add-more-Witch-API.patch b/patches/server/Add-more-Witch-API.patch
similarity index 99%
rename from patches/unapplied/server/Add-more-Witch-API.patch
rename to patches/server/Add-more-Witch-API.patch
index 458a63abe0..cc523057a1 100644
--- a/patches/unapplied/server/Add-more-Witch-API.patch
+++ b/patches/server/Add-more-Witch-API.patch
@@ -28,8 +28,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -                    }
 -
 -                    AttributeInstance attributemodifiable = this.getAttribute(Attributes.MOVEMENT_SPEED);
- 
--                    attributemodifiable.removeModifier(Witch.SPEED_MODIFIER_DRINKING);
+-
+-                    attributemodifiable.removeModifier(Witch.SPEED_MODIFIER_DRINKING.getId());
 -                    attributemodifiable.addTransientModifier(Witch.SPEED_MODIFIER_DRINKING);
                  }
              }
@@ -51,7 +51,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +
 +        AttributeInstance attributemodifiable = this.getAttribute(Attributes.MOVEMENT_SPEED);
 +
-+        attributemodifiable.removeModifier(Witch.SPEED_MODIFIER_DRINKING);
++        attributemodifiable.removeModifier(Witch.SPEED_MODIFIER_DRINKING.getId());
 +        attributemodifiable.addTransientModifier(Witch.SPEED_MODIFIER_DRINKING);
 +    }
 +    // Paper end
diff --git a/patches/unapplied/server/Add-more-Zombie-API.patch b/patches/server/Add-more-Zombie-API.patch
similarity index 100%
rename from patches/unapplied/server/Add-more-Zombie-API.patch
rename to patches/server/Add-more-Zombie-API.patch
diff --git a/patches/unapplied/server/Add-option-to-prevent-players-from-moving-into-unloa.patch b/patches/server/Add-option-to-prevent-players-from-moving-into-unloa.patch
similarity index 92%
rename from patches/unapplied/server/Add-option-to-prevent-players-from-moving-into-unloa.patch
rename to patches/server/Add-option-to-prevent-players-from-moving-into-unloa.patch
index 2845b78083..85eae89587 100644
--- a/patches/unapplied/server/Add-option-to-prevent-players-from-moving-into-unloa.patch
+++ b/patches/server/Add-option-to-prevent-players-from-moving-into-unloa.patch
@@ -9,7 +9,7 @@ diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListener
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
 +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
                  double d0 = entity.getX();
                  double d1 = entity.getY();
                  double d2 = entity.getZ();
@@ -22,7 +22,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                  float f = Mth.wrapDegrees(packet.getYRot());
                  float f1 = Mth.wrapDegrees(packet.getXRot());
                  double d6 = d3 - this.vehicleFirstGoodX;
-@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
                  }
                  speed *= 2f; // TODO: Get the speed of the vehicle instead of the player
  
@@ -39,7 +39,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                  if (d10 - d9 > Math.max(100.0D, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) {
                  // CraftBukkit end
                      ServerGamePacketListenerImpl.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", new Object[]{entity.getName().getString(), this.player.getName().getString(), d6, d7, d8});
-@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
                      this.allowedPlayerTicks = 20; // CraftBukkit
                  } else {
                      this.awaitingTeleportTime = this.tickCount;
@@ -52,7 +52,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                      float f = Mth.wrapDegrees(packet.getYRot(this.player.getYRot()));
                      float f1 = Mth.wrapDegrees(packet.getXRot(this.player.getXRot()));
  
-@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
                              } else {
                                  speed = this.player.getAbilities().walkingSpeed * 10f;
                              }
diff --git a/patches/unapplied/server/Add-sun-related-API.patch b/patches/server/Add-sun-related-API.patch
similarity index 100%
rename from patches/unapplied/server/Add-sun-related-API.patch
rename to patches/server/Add-sun-related-API.patch
diff --git a/patches/server/Adventure.patch b/patches/server/Adventure.patch
index addf8e59f1..ad9faabe7c 100644
--- a/patches/server/Adventure.patch
+++ b/patches/server/Adventure.patch
@@ -2455,10 +2455,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          // CraftBukkit end
          this.player.getTextFilter().leave();
 @@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
-                     CompletableFuture<FilteredText> completablefuture = this.filterTextPacket(playerchatmessage.signedContent());
-                     Component ichatbasecomponent = this.server.getChatDecorator().decorate(this.player, playerchatmessage.decoratedContent());
+                     }
  
+                     CompletableFuture<FilteredText> completablefuture = this.filterTextPacket(playerchatmessage.signedContent());
+-                    Component ichatbasecomponent = this.server.getChatDecorator().decorate(this.player, playerchatmessage.decoratedContent());
 +                    CompletableFuture<ChatDecorator.Result> componentFuture = this.server.getChatDecorator().decorate(this.player, null, playerchatmessage.decoratedContent()); // Paper
+ 
                      this.chatMessageChain.append((executor) -> {
 -                        return completablefuture.thenAcceptAsync((filteredtext) -> {
 -                            PlayerChatMessage playerchatmessage1 = playerchatmessage.withUnsignedContent(ichatbasecomponent).filter(filteredtext.mask());
diff --git a/patches/unapplied/server/Allow-chests-to-be-placed-with-NBT-data.patch b/patches/server/Allow-chests-to-be-placed-with-NBT-data.patch
similarity index 100%
rename from patches/unapplied/server/Allow-chests-to-be-placed-with-NBT-data.patch
rename to patches/server/Allow-chests-to-be-placed-with-NBT-data.patch
diff --git a/patches/unapplied/server/Async-command-map-building.patch b/patches/server/Async-command-map-building.patch
similarity index 100%
rename from patches/unapplied/server/Async-command-map-building.patch
rename to patches/server/Async-command-map-building.patch
diff --git a/patches/unapplied/server/Block-Entity-remove-from-being-called-on-Players.patch b/patches/server/Block-Entity-remove-from-being-called-on-Players.patch
similarity index 100%
rename from patches/unapplied/server/Block-Entity-remove-from-being-called-on-Players.patch
rename to patches/server/Block-Entity-remove-from-being-called-on-Players.patch
diff --git a/patches/unapplied/server/BlockDestroyEvent.patch b/patches/server/BlockDestroyEvent.patch
similarity index 100%
rename from patches/unapplied/server/BlockDestroyEvent.patch
rename to patches/server/BlockDestroyEvent.patch
diff --git a/patches/unapplied/server/Book-Size-Limits.patch b/patches/server/Book-Size-Limits.patch
similarity index 96%
rename from patches/unapplied/server/Book-Size-Limits.patch
rename to patches/server/Book-Size-Limits.patch
index 178f5e5ece..29f215b08e 100644
--- a/patches/unapplied/server/Book-Size-Limits.patch
+++ b/patches/server/Book-Size-Limits.patch
@@ -9,7 +9,7 @@ diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListener
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
 +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
  
      @Override
      public void handleEditBook(ServerboundEditBookPacket packet) {
diff --git a/patches/unapplied/server/Call-player-spectator-target-events-and-improve-impl.patch b/patches/server/Call-player-spectator-target-events-and-improve-impl.patch
similarity index 100%
rename from patches/unapplied/server/Call-player-spectator-target-events-and-improve-impl.patch
rename to patches/server/Call-player-spectator-target-events-and-improve-impl.patch
diff --git a/patches/unapplied/server/Catch-JsonParseException-in-Entity-and-TE-names.patch b/patches/server/Catch-JsonParseException-in-Entity-and-TE-names.patch
similarity index 87%
rename from patches/unapplied/server/Catch-JsonParseException-in-Entity-and-TE-names.patch
rename to patches/server/Catch-JsonParseException-in-Entity-and-TE-names.patch
index fcbab5cc2c..2cbcd9bb0c 100644
--- a/patches/unapplied/server/Catch-JsonParseException-in-Entity-and-TE-names.patch
+++ b/patches/server/Catch-JsonParseException-in-Entity-and-TE-names.patch
@@ -16,37 +16,26 @@ diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/io/papermc/paper/util/MCUtil.java
 +++ b/src/main/java/io/papermc/paper/util/MCUtil.java
-@@ -0,0 +0,0 @@ import net.minecraft.core.BlockPos;
- import net.minecraft.core.Direction;
- import net.minecraft.core.Vec3i;
- import net.minecraft.server.MinecraftServer;
-+import net.minecraft.nbt.CompoundTag;
-+import net.minecraft.network.chat.Component;
- import net.minecraft.server.level.ChunkHolder;
- import net.minecraft.server.level.ChunkMap;
- import net.minecraft.server.level.DistanceManager;
 @@ -0,0 +0,0 @@ public final class MCUtil {
-         }
+     public static int getTicketLevelFor(net.minecraft.world.level.chunk.ChunkStatus status) {
+         return net.minecraft.server.level.ChunkMap.MAX_VIEW_DISTANCE + net.minecraft.world.level.chunk.ChunkStatus.getDistance(status);
      }
- 
++
 +    @Nullable
-+    public static Component getBaseComponentFromNbt(String key, CompoundTag compound) {
++    public static net.minecraft.network.chat.Component getBaseComponentFromNbt(String key, net.minecraft.nbt.CompoundTag compound) {
 +        if (!compound.contains(key)) {
 +            return null;
 +        }
 +        String string = compound.getString(key);
 +        try {
-+            return Component.Serializer.fromJson(string);
++            return net.minecraft.network.chat.Component.Serializer.fromJson(string);
 +        } catch (com.google.gson.JsonParseException e) {
 +            org.bukkit.Bukkit.getLogger().warning("Unable to parse " + key + " from " + compound +": " + e.getMessage());
 +        }
 +
 +        return null;
 +    }
-+
-     public static ChunkStatus getChunkStatus(ChunkHolder chunk) {
-         return chunk.getChunkHolderStatus();
-     }
+ }
 diff --git a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java b/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java
@@ -91,8 +80,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
 +++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
 @@ -0,0 +0,0 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name
-         this.levels = nbt.getInt("Levels"); // SPIGOT-5053, use where available
-         // CraftBukkit end
+         this.secondaryPower = BeaconBlockEntity.loadEffect(nbt, "secondary_effect");
+         this.levels = nbt.getInt("Levels"); // CraftBukkit - SPIGOT-5053, use where available
          if (nbt.contains("CustomName", 8)) {
 -            this.name = Component.Serializer.fromJson(nbt.getString("CustomName"));
 +            this.name = io.papermc.paper.util.MCUtil.getBaseComponentFromNbt("CustomName", nbt); // Paper - Catch ParseException
diff --git a/patches/unapplied/server/Check-Drowned-for-Villager-Aggression-Config.patch b/patches/server/Check-Drowned-for-Villager-Aggression-Config.patch
similarity index 100%
rename from patches/unapplied/server/Check-Drowned-for-Villager-Aggression-Config.patch
rename to patches/server/Check-Drowned-for-Villager-Aggression-Config.patch
diff --git a/patches/unapplied/server/Configurable-connection-throttle-kick-message.patch b/patches/server/Configurable-connection-throttle-kick-message.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-connection-throttle-kick-message.patch
rename to patches/server/Configurable-connection-throttle-kick-message.patch
diff --git a/patches/unapplied/server/Don-t-allow-digging-into-unloaded-chunks.patch b/patches/server/Don-t-allow-digging-into-unloaded-chunks.patch
similarity index 98%
rename from patches/unapplied/server/Don-t-allow-digging-into-unloaded-chunks.patch
rename to patches/server/Don-t-allow-digging-into-unloaded-chunks.patch
index d40fcdfc39..0fc487af62 100644
--- a/patches/unapplied/server/Don-t-allow-digging-into-unloaded-chunks.patch
+++ b/patches/server/Don-t-allow-digging-into-unloaded-chunks.patch
@@ -62,7 +62,7 @@ diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListener
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
 +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
              case START_DESTROY_BLOCK:
              case ABORT_DESTROY_BLOCK:
              case STOP_DESTROY_BLOCK:
diff --git a/patches/unapplied/server/Don-t-sleep-after-profile-lookups-if-not-needed.patch b/patches/server/Don-t-sleep-after-profile-lookups-if-not-needed.patch
similarity index 83%
rename from patches/unapplied/server/Don-t-sleep-after-profile-lookups-if-not-needed.patch
rename to patches/server/Don-t-sleep-after-profile-lookups-if-not-needed.patch
index 28a28f9160..1b258abddc 100644
--- a/patches/unapplied/server/Don-t-sleep-after-profile-lookups-if-not-needed.patch
+++ b/patches/server/Don-t-sleep-after-profile-lookups-if-not-needed.patch
@@ -11,16 +11,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/com/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java
 +++ b/src/main/java/com/mojang/authlib/yggdrasil/YggdrasilGameProfileRepository.java
 @@ -0,0 +0,0 @@ public class YggdrasilGameProfileRepository implements GameProfileRepository {
-         }
+             .collect(Collectors.toSet());
  
          final int page = 0;
 +        boolean hasRequested = false; // Paper
  
          for (final List<String> request : Iterables.partition(criteria, ENTRIES_PER_PAGE)) {
-             int failCount = 0;
+             final List<String> normalizedRequest = request.stream().map(YggdrasilGameProfileRepository::normalizeName).toList();
 @@ -0,0 +0,0 @@ public class YggdrasilGameProfileRepository implements GameProfileRepository {
                          LOGGER.debug("Couldn't find profile {}", name);
-                         callback.onProfileLookupFailed(new GameProfile(null, name), new ProfileNotFoundException("Server did not find the requested profile"));
+                         callback.onProfileLookupFailed(name, new ProfileNotFoundException("Server did not find the requested profile"));
                      }
 +                    // Paper start
 +                    if (!hasRequested) {
diff --git a/patches/unapplied/server/Expose-attack-cooldown-methods-for-Player.patch b/patches/server/Expose-attack-cooldown-methods-for-Player.patch
similarity index 100%
rename from patches/unapplied/server/Expose-attack-cooldown-methods-for-Player.patch
rename to patches/server/Expose-attack-cooldown-methods-for-Player.patch
diff --git a/patches/unapplied/server/Fix-SpongeAbsortEvent-handling.patch b/patches/server/Fix-SpongeAbsortEvent-handling.patch
similarity index 100%
rename from patches/unapplied/server/Fix-SpongeAbsortEvent-handling.patch
rename to patches/server/Fix-SpongeAbsortEvent-handling.patch
diff --git a/patches/unapplied/server/Handle-Large-Packets-disconnecting-client.patch b/patches/server/Handle-Large-Packets-disconnecting-client.patch
similarity index 81%
rename from patches/unapplied/server/Handle-Large-Packets-disconnecting-client.patch
rename to patches/server/Handle-Large-Packets-disconnecting-client.patch
index acf81465b2..8206764d83 100644
--- a/patches/unapplied/server/Handle-Large-Packets-disconnecting-client.patch
+++ b/patches/server/Handle-Large-Packets-disconnecting-client.patch
@@ -16,10 +16,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) {
 +        // Paper start
 +        if (throwable instanceof io.netty.handler.codec.EncoderException && throwable.getCause() instanceof PacketEncoder.PacketTooLargeException packetTooLargeException) {
-+            if (packetTooLargeException.getPacket().packetTooLarge(this)) {
++            final Packet<?> packet = packetTooLargeException.getPacket();
++            final io.netty.util.Attribute<ConnectionProtocol.CodecData<?>> codecDataAttribute = channelhandlercontext.channel().attr(packetTooLargeException.codecKey);
++            if (packet.packetTooLarge(this)) {
++                ProtocolSwapHandler.swapProtocolIfNeeded(codecDataAttribute, packet);
 +                return;
-+            } else if (packetTooLargeException.getPacket().isSkippable()) {
++            } else if (packet.isSkippable()) {
 +                Connection.LOGGER.debug("Skipping packet due to errors", throwable.getCause());
++                ProtocolSwapHandler.swapProtocolIfNeeded(codecDataAttribute, packet);
 +                return;
 +            } else {
 +                throwable = throwable.getCause();
@@ -40,19 +44,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -                    if (k > 8388608) {
 +                    if (false && k > 8388608) { // Paper - disable
                          throw new IllegalArgumentException("Packet too big (is " + k + ", should be less than 8388608): " + packet);
-                     } else {
-                         int l = channelHandlerContext.channel().attr(Connection.ATTRIBUTE_PROTOCOL).get().getId();
-@@ -0,0 +0,0 @@ public class PacketEncoder extends MessageToByteEncoder<Packet<?>> {
-                         throw var10;
                      }
+ 
+@@ -0,0 +0,0 @@ public class PacketEncoder extends MessageToByteEncoder<Packet<?>> {
+ 
+                     throw var13;
+                 } finally {
++                    // Paper start
++                    int packetLength = friendlyByteBuf.readableBytes();
++                    if (packetLength > MAX_PACKET_SIZE) {
++                        throw new PacketTooLargeException(packet, this.codecKey, packetLength);
++                    }
++                    // Paper end
+                     ProtocolSwapHandler.swapProtocolIfNeeded(attribute, packet);
                  }
-+
-+                // Paper start
-+                int packetLength = friendlyByteBuf.readableBytes();
-+                if (packetLength > MAX_PACKET_SIZE) {
-+                    throw new PacketTooLargeException(packet, packetLength);
-+                }
-+                // Paper end
+ 
              }
          }
      }
@@ -62,14 +68,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +
 +    public static class PacketTooLargeException extends RuntimeException {
 +        private final Packet<?> packet;
++        public final AttributeKey<ConnectionProtocol.CodecData<?>> codecKey;
 +
-+        PacketTooLargeException(Packet<?> packet, int packetLength) {
++        PacketTooLargeException(Packet<?> packet, AttributeKey<ConnectionProtocol.CodecData<?>> codecKey, int packetLength) {
 +            super("PacketTooLarge - " + packet.getClass().getSimpleName() + " is " + packetLength + ". Max is " + MAX_PACKET_SIZE);
 +            this.packet = packet;
++            this.codecKey = codecKey;
 +        }
 +
 +        public Packet<?> getPacket() {
-+            return packet;
++            return this.packet;
 +        }
 +    }
 +    // Paper end
diff --git a/patches/unapplied/server/Honor-EntityAgeable.ageLock.patch b/patches/server/Honor-EntityAgeable.ageLock.patch
similarity index 100%
rename from patches/unapplied/server/Honor-EntityAgeable.ageLock.patch
rename to patches/server/Honor-EntityAgeable.ageLock.patch
diff --git a/patches/unapplied/server/Hook-into-CB-plugin-rewrites.patch b/patches/server/Hook-into-CB-plugin-rewrites.patch
similarity index 100%
rename from patches/unapplied/server/Hook-into-CB-plugin-rewrites.patch
rename to patches/server/Hook-into-CB-plugin-rewrites.patch
diff --git a/patches/unapplied/server/Implement-an-API-for-CanPlaceOn-and-CanDestroy-NBT-v.patch b/patches/server/Implement-an-API-for-CanPlaceOn-and-CanDestroy-NBT-v.patch
similarity index 100%
rename from patches/unapplied/server/Implement-an-API-for-CanPlaceOn-and-CanDestroy-NBT-v.patch
rename to patches/server/Implement-an-API-for-CanPlaceOn-and-CanDestroy-NBT-v.patch
diff --git a/patches/unapplied/server/Implement-furnace-cook-speed-multiplier-API.patch b/patches/server/Implement-furnace-cook-speed-multiplier-API.patch
similarity index 89%
rename from patches/unapplied/server/Implement-furnace-cook-speed-multiplier-API.patch
rename to patches/server/Implement-furnace-cook-speed-multiplier-API.patch
index 5a38c1c3a2..8f9b2a6ed9 100644
--- a/patches/unapplied/server/Implement-furnace-cook-speed-multiplier-API.patch
+++ b/patches/server/Implement-furnace-cook-speed-multiplier-API.patch
@@ -58,7 +58,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
 @@ -0,0 +0,0 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
                      CraftItemStack source = CraftItemStack.asCraftMirror(blockEntity.items.get(0));
-                     CookingRecipe<?> recipe = (CookingRecipe<?>) irecipe.toBukkitRecipe();
+                     CookingRecipe<?> recipe = (CookingRecipe<?>) recipeholder.toBukkitRecipe();
  
 -                    FurnaceStartSmeltEvent event = new FurnaceStartSmeltEvent(CraftBlock.at(world, pos), source, recipe);
 +                    FurnaceStartSmeltEvent event = new FurnaceStartSmeltEvent(CraftBlock.at(world, pos), source, recipe, AbstractFurnaceBlockEntity.getTotalCookTime(world, blockEntity.recipeType, blockEntity, blockEntity.cookSpeedMultiplier)); // Paper - cook speed multiplier API
@@ -74,25 +74,27 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                      blockEntity.cookingProgress = 0;
 -                    blockEntity.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(world, blockEntity);
 +                    blockEntity.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(world, blockEntity.recipeType, blockEntity, blockEntity.cookSpeedMultiplier); // Paper
-                     if (AbstractFurnaceBlockEntity.burn(blockEntity.level, blockEntity.worldPosition, world.registryAccess(), irecipe, blockEntity.items, i)) { // CraftBukkit
-                         blockEntity.setRecipeUsed(irecipe);
+                     if (AbstractFurnaceBlockEntity.burn(blockEntity.level, blockEntity.worldPosition, world.registryAccess(), recipeholder, blockEntity.items, i)) { // CraftBukkit
+                         blockEntity.setRecipeUsed(recipeholder);
                      }
 @@ -0,0 +0,0 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
          }
      }
  
 -    private static int getTotalCookTime(Level world, AbstractFurnaceBlockEntity furnace) {
--        return (world != null) ? (Integer) furnace.quickCheck.getRecipeFor(furnace, world).map(AbstractCookingRecipe::getCookingTime).orElse(200) : 200; // CraftBukkit - SPIGOT-4302
+-        if (world == null) return 200; // CraftBukkit - SPIGOT-4302
+-        return (Integer) furnace.quickCheck.getRecipeFor(furnace, world).map((recipeholder) -> {
+-            return ((AbstractCookingRecipe) recipeholder.value()).getCookingTime();
+-        }).orElse(200);
 +    // Paper start
 +    public static int getTotalCookTime(@Nullable Level world, RecipeType<? extends AbstractCookingRecipe> recipeType, AbstractFurnaceBlockEntity furnace, double cookSpeedMultiplier) {
 +        /* Scale the recipe's cooking time to the current cookSpeedMultiplier */
-+        int cookTime = world != null ? furnace.quickCheck.getRecipeFor(furnace, world).map(AbstractCookingRecipe::getCookingTime).orElse(200) : (net.minecraft.server.MinecraftServer.getServer().getRecipeManager().getRecipeFor(recipeType, furnace, world /* passing a null level here is safe. world is only used for map extending recipes which won't happen here */).map(AbstractCookingRecipe::getCookingTime).orElse(200));
++        int cookTime = world != null ? furnace.quickCheck.getRecipeFor(furnace, world).map(holder -> holder.value().getCookingTime()).orElse(200) : (net.minecraft.server.MinecraftServer.getServer().getRecipeManager().getRecipeFor(recipeType, furnace, world /* passing a null level here is safe. world is only used for map extending recipes which won't happen here */).map(holder -> holder.value().getCookingTime()).orElse(200));
 +        return (int) Math.ceil (cookTime / cookSpeedMultiplier);
++        // Paper end
      }
-+    // Paper end
  
      public static boolean isFuel(ItemStack stack) {
-         return AbstractFurnaceBlockEntity.getFuel().containsKey(stack.getItem());
 @@ -0,0 +0,0 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
          }
  
diff --git a/patches/unapplied/server/Improve-Server-Thread-Pool-and-Thread-Priorities.patch b/patches/server/Improve-Server-Thread-Pool-and-Thread-Priorities.patch
similarity index 100%
rename from patches/unapplied/server/Improve-Server-Thread-Pool-and-Thread-Priorities.patch
rename to patches/server/Improve-Server-Thread-Pool-and-Thread-Priorities.patch
diff --git a/patches/unapplied/server/Improve-death-events.patch b/patches/server/Improve-death-events.patch
similarity index 99%
rename from patches/unapplied/server/Improve-death-events.patch
rename to patches/server/Improve-death-events.patch
index e49ce48143..28c7b4153b 100644
--- a/patches/unapplied/server/Improve-death-events.patch
+++ b/patches/server/Improve-death-events.patch
@@ -23,7 +23,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
 +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
 @@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
-     public int latency;
+     private int containerCounter;
      public boolean wonGame;
      private int containerUpdateDelay; // Paper
 +    // Paper start - cancellable death event
@@ -274,7 +274,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        return deathEvent; // Paper
      }
  
-     public static boolean isPathClear(Fox fox, LivingEntity chasedEntity) {
+     @Override
 diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractChestedHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractChestedHorse.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractChestedHorse.java
diff --git a/patches/unapplied/server/MC-50319-Check-other-worlds-for-shooter-of-projectil.patch b/patches/server/MC-50319-Check-other-worlds-for-shooter-of-projectil.patch
similarity index 100%
rename from patches/unapplied/server/MC-50319-Check-other-worlds-for-shooter-of-projectil.patch
rename to patches/server/MC-50319-Check-other-worlds-for-shooter-of-projectil.patch
diff --git a/patches/unapplied/server/Make-the-default-permission-message-configurable.patch b/patches/server/Make-the-default-permission-message-configurable.patch
similarity index 100%
rename from patches/unapplied/server/Make-the-default-permission-message-configurable.patch
rename to patches/server/Make-the-default-permission-message-configurable.patch
diff --git a/patches/unapplied/server/Mob-Pathfinding-API.patch b/patches/server/Mob-Pathfinding-API.patch
similarity index 100%
rename from patches/unapplied/server/Mob-Pathfinding-API.patch
rename to patches/server/Mob-Pathfinding-API.patch
diff --git a/patches/unapplied/server/Optimize-World-Time-Updates.patch b/patches/server/Optimize-World-Time-Updates.patch
similarity index 100%
rename from patches/unapplied/server/Optimize-World-Time-Updates.patch
rename to patches/server/Optimize-World-Time-Updates.patch
diff --git a/patches/unapplied/server/PreSpawnerSpawnEvent.patch b/patches/server/PreSpawnerSpawnEvent.patch
similarity index 100%
rename from patches/unapplied/server/PreSpawnerSpawnEvent.patch
rename to patches/server/PreSpawnerSpawnEvent.patch
diff --git a/patches/unapplied/server/Prevent-Enderman-from-loading-chunks.patch b/patches/server/Prevent-Enderman-from-loading-chunks.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-Enderman-from-loading-chunks.patch
rename to patches/server/Prevent-Enderman-from-loading-chunks.patch
diff --git a/patches/unapplied/server/Prevent-Mob-AI-Rules-from-Loading-Chunks.patch b/patches/server/Prevent-Mob-AI-Rules-from-Loading-Chunks.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-Mob-AI-Rules-from-Loading-Chunks.patch
rename to patches/server/Prevent-Mob-AI-Rules-from-Loading-Chunks.patch
diff --git a/patches/unapplied/server/Prevent-chunk-loading-from-Fluid-Flowing.patch b/patches/server/Prevent-chunk-loading-from-Fluid-Flowing.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-chunk-loading-from-Fluid-Flowing.patch
rename to patches/server/Prevent-chunk-loading-from-Fluid-Flowing.patch
diff --git a/patches/unapplied/server/Prevent-mob-spawning-from-loading-generating-chunks.patch b/patches/server/Prevent-mob-spawning-from-loading-generating-chunks.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-mob-spawning-from-loading-generating-chunks.patch
rename to patches/server/Prevent-mob-spawning-from-loading-generating-chunks.patch
diff --git a/patches/unapplied/server/Prevent-rayTrace-from-loading-chunks.patch b/patches/server/Prevent-rayTrace-from-loading-chunks.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-rayTrace-from-loading-chunks.patch
rename to patches/server/Prevent-rayTrace-from-loading-chunks.patch
diff --git a/patches/unapplied/server/Reset-players-airTicks-on-respawn.patch b/patches/server/Reset-players-airTicks-on-respawn.patch
similarity index 100%
rename from patches/unapplied/server/Reset-players-airTicks-on-respawn.patch
rename to patches/server/Reset-players-airTicks-on-respawn.patch
diff --git a/patches/unapplied/server/Restore-custom-InventoryHolder-support.patch b/patches/server/Restore-custom-InventoryHolder-support.patch
similarity index 100%
rename from patches/unapplied/server/Restore-custom-InventoryHolder-support.patch
rename to patches/server/Restore-custom-InventoryHolder-support.patch
diff --git a/patches/unapplied/server/Turtle-API.patch b/patches/server/Turtle-API.patch
similarity index 100%
rename from patches/unapplied/server/Turtle-API.patch
rename to patches/server/Turtle-API.patch
diff --git a/patches/unapplied/server/Use-Vanilla-Minecart-Speeds.patch b/patches/server/Use-Vanilla-Minecart-Speeds.patch
similarity index 100%
rename from patches/unapplied/server/Use-Vanilla-Minecart-Speeds.patch
rename to patches/server/Use-Vanilla-Minecart-Speeds.patch
diff --git a/patches/unapplied/server/Workaround-for-vehicle-tracking-issue-on-disconnect.patch b/patches/server/Workaround-for-vehicle-tracking-issue-on-disconnect.patch
similarity index 100%
rename from patches/unapplied/server/Workaround-for-vehicle-tracking-issue-on-disconnect.patch
rename to patches/server/Workaround-for-vehicle-tracking-issue-on-disconnect.patch
diff --git a/patches/unapplied/server/force-entity-dismount-during-teleportation.patch b/patches/server/force-entity-dismount-during-teleportation.patch
similarity index 100%
rename from patches/unapplied/server/force-entity-dismount-during-teleportation.patch
rename to patches/server/force-entity-dismount-during-teleportation.patch