From 149a25fb8312b86d1bc3ae32e342d8bc68d0fce7 Mon Sep 17 00:00:00 2001
From: Bjarne Koll <git@lynxplay.dev>
Date: Tue, 22 Oct 2024 23:30:51 +0200
Subject: [PATCH] Work it

---
 ...-get-a-BlockState-without-a-snapshot.patch |  2 +-
 .../Ability-to-apply-mending-to-XP-API.patch  |  0
 .../server/Add-ArmorStand-Item-Meta.patch     |  0
 ...PlayerAdvancementCriterionGrantEvent.patch |  0
 .../server/Add-PlayerArmorChangeEvent.patch   |  4 +-
 .../server/Add-PlayerJumpEvent.patch          |  0
 ...dd-more-fields-to-AsyncPreLoginEvent.patch |  0
 .../Add-openSign-method-to-HumanEntity.patch  |  0
 .../Add-setPlayerProfile-API-for-Skulls.patch |  0
 ...-a-custom-authentication-servers-dow.patch |  0
 .../server/AsyncTabCompleteEvent.patch        |  2 +-
 ...player-logins-during-server-shutdown.patch |  0
 ...ServerListPingEvent-for-legacy-pings.patch |  0
 ...urable-sprint-interruption-on-attack.patch |  0
 ...le-Explicit-Network-Manager-Flushing.patch |  0
 .../server/Enderman.teleportRandomly.patch    |  0
 .../server/EndermanEscapeEvent.patch          | 10 ++--
 .../server/Entity-fromMobSpawner.patch        |  0
 ...nt-protocol-version-and-virtual-host.patch |  0
 .../Extend-Player-Interact-cancellation.patch |  0
 .../server/Fill-Profile-Property-Events.patch |  0
 ...117075-Block-entity-unload-lag-spike.patch |  0
 .../server/Fix-this-stupid-bullshit.patch     |  2 +-
 .../Flag-to-disable-the-channel-limit.patch   |  0
 ...nt-extended-PaperServerListPingEvent.patch |  0
 .../server/Implement-getI18NDisplayName.patch |  0
 .../Improve-the-Saddle-API-for-Horses.patch   |  0
 .../Improved-Async-Task-Scheduler.patch       | 16 ++---
 .../server/LivingEntity-setKiller.patch       |  0
 ...ke-legacy-ping-handler-more-reliable.patch |  0
 ...awns-should-honor-nametags-and-leash.patch |  0
 .../server/Player.setPlayerProfile-API.patch  | 15 +----
 .../PlayerNaturallySpawnCreaturesEvent.patch  | 58 +++++++++----------
 .../server/PlayerPickupExperienceEvent.patch  |  0
 .../server/PreCreatureSpawnEvent.patch        | 26 ++++-----
 ...rom-being-processed-when-the-player-.patch |  0
 .../server/Profile-Lookup-Events.patch        |  0
 .../server/ProfileWhitelistVerifyEvent.patch  |  0
 ...imer-when-spawner-event-is-cancelled.patch |  0
 ...dEffects-only-to-players-who-can-see.patch |  0
 .../Tameable-getOwnerUniqueId-API.patch       |  0
 .../server/Toggleable-player-crits.patch      |  0
 .../server/ensureServerConversions-API.patch  |  0
 .../server/getPlayerUniqueId-API.patch        |  0
 ...dle-ServerboundKeepAlivePacket-async.patch |  0
 ...rt-serverside-behavior-of-keepalives.patch |  4 +-
 ...e-implementations-for-captured-block.patch |  0
 .../Block-Enderpearl-Travel-Exploit.patch     | 46 ---------------
 48 files changed, 63 insertions(+), 122 deletions(-)
 rename patches/{unapplied => }/server/API-to-get-a-BlockState-without-a-snapshot.patch (99%)
 rename patches/{unapplied => }/server/Ability-to-apply-mending-to-XP-API.patch (100%)
 rename patches/{unapplied => }/server/Add-ArmorStand-Item-Meta.patch (100%)
 rename patches/{unapplied => }/server/Add-PlayerAdvancementCriterionGrantEvent.patch (100%)
 rename patches/{unapplied => }/server/Add-PlayerArmorChangeEvent.patch (97%)
 rename patches/{unapplied => }/server/Add-PlayerJumpEvent.patch (100%)
 rename patches/{unapplied => }/server/Add-more-fields-to-AsyncPreLoginEvent.patch (100%)
 rename patches/{unapplied => }/server/Add-openSign-method-to-HumanEntity.patch (100%)
 rename patches/{unapplied => }/server/Add-setPlayerProfile-API-for-Skulls.patch (100%)
 rename patches/{unapplied => }/server/Allow-specifying-a-custom-authentication-servers-dow.patch (100%)
 rename patches/{unapplied => }/server/AsyncTabCompleteEvent.patch (98%)
 rename patches/{unapplied => }/server/Block-player-logins-during-server-shutdown.patch (100%)
 rename patches/{unapplied => }/server/Call-PaperServerListPingEvent-for-legacy-pings.patch (100%)
 rename patches/{unapplied => }/server/Configurable-sprint-interruption-on-attack.patch (100%)
 rename patches/{unapplied => }/server/Disable-Explicit-Network-Manager-Flushing.patch (100%)
 rename patches/{unapplied => }/server/Enderman.teleportRandomly.patch (100%)
 rename patches/{unapplied => }/server/EndermanEscapeEvent.patch (80%)
 rename patches/{unapplied => }/server/Entity-fromMobSpawner.patch (100%)
 rename patches/{unapplied => }/server/Expose-client-protocol-version-and-virtual-host.patch (100%)
 rename patches/{unapplied => }/server/Extend-Player-Interact-cancellation.patch (100%)
 rename patches/{unapplied => }/server/Fill-Profile-Property-Events.patch (100%)
 rename patches/{unapplied => }/server/Fix-MC-117075-Block-entity-unload-lag-spike.patch (100%)
 rename patches/{unapplied => }/server/Fix-this-stupid-bullshit.patch (97%)
 rename patches/{unapplied => }/server/Flag-to-disable-the-channel-limit.patch (100%)
 rename patches/{unapplied => }/server/Implement-extended-PaperServerListPingEvent.patch (100%)
 rename patches/{unapplied => }/server/Implement-getI18NDisplayName.patch (100%)
 rename patches/{unapplied => }/server/Improve-the-Saddle-API-for-Horses.patch (100%)
 rename patches/{unapplied => }/server/Improved-Async-Task-Scheduler.patch (96%)
 rename patches/{unapplied => }/server/LivingEntity-setKiller.patch (100%)
 rename patches/{unapplied => }/server/Make-legacy-ping-handler-more-reliable.patch (100%)
 rename patches/{unapplied => }/server/Ocelot-despawns-should-honor-nametags-and-leash.patch (100%)
 rename patches/{unapplied => }/server/Player.setPlayerProfile-API.patch (91%)
 rename patches/{unapplied => }/server/PlayerNaturallySpawnCreaturesEvent.patch (55%)
 rename patches/{unapplied => }/server/PlayerPickupExperienceEvent.patch (100%)
 rename patches/{unapplied => }/server/PreCreatureSpawnEvent.patch (82%)
 rename patches/{unapplied => }/server/Prevent-logins-from-being-processed-when-the-player-.patch (100%)
 rename patches/{unapplied => }/server/Profile-Lookup-Events.patch (100%)
 rename patches/{unapplied => }/server/ProfileWhitelistVerifyEvent.patch (100%)
 rename patches/{unapplied => }/server/Reset-spawner-timer-when-spawner-event-is-cancelled.patch (100%)
 rename patches/{unapplied => }/server/Send-attack-SoundEffects-only-to-players-who-can-see.patch (100%)
 rename patches/{unapplied => }/server/Tameable-getOwnerUniqueId-API.patch (100%)
 rename patches/{unapplied => }/server/Toggleable-player-crits.patch (100%)
 rename patches/{unapplied => }/server/ensureServerConversions-API.patch (100%)
 rename patches/{unapplied => }/server/getPlayerUniqueId-API.patch (100%)
 rename patches/{unapplied => }/server/handle-ServerboundKeepAlivePacket-async.patch (100%)
 rename patches/{unapplied => }/server/revert-serverside-behavior-of-keepalives.patch (97%)
 rename patches/{unapplied => }/server/use-CB-BlockState-implementations-for-captured-block.patch (100%)
 delete mode 100644 patches/unapplied/server/Block-Enderpearl-Travel-Exploit.patch

diff --git a/patches/unapplied/server/API-to-get-a-BlockState-without-a-snapshot.patch b/patches/server/API-to-get-a-BlockState-without-a-snapshot.patch
similarity index 99%
rename from patches/unapplied/server/API-to-get-a-BlockState-without-a-snapshot.patch
rename to patches/server/API-to-get-a-BlockState-without-a-snapshot.patch
index 6ac744879a..e818c4a546 100644
--- a/patches/unapplied/server/API-to-get-a-BlockState-without-a-snapshot.patch
+++ b/patches/server/API-to-get-a-BlockState-without-a-snapshot.patch
@@ -27,7 +27,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public abstract class BlockEntity {
  
      // CraftBukkit start - read container
-     protected void loadAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) {
+     protected void loadAdditional(CompoundTag nbt, HolderLookup.Provider registries) {
 -        this.persistentDataContainer = new CraftPersistentDataContainer(BlockEntity.DATA_TYPE_REGISTRY);
 +        this.persistentDataContainer.clear(); // Paper - clear instead of init
  
diff --git a/patches/unapplied/server/Ability-to-apply-mending-to-XP-API.patch b/patches/server/Ability-to-apply-mending-to-XP-API.patch
similarity index 100%
rename from patches/unapplied/server/Ability-to-apply-mending-to-XP-API.patch
rename to patches/server/Ability-to-apply-mending-to-XP-API.patch
diff --git a/patches/unapplied/server/Add-ArmorStand-Item-Meta.patch b/patches/server/Add-ArmorStand-Item-Meta.patch
similarity index 100%
rename from patches/unapplied/server/Add-ArmorStand-Item-Meta.patch
rename to patches/server/Add-ArmorStand-Item-Meta.patch
diff --git a/patches/unapplied/server/Add-PlayerAdvancementCriterionGrantEvent.patch b/patches/server/Add-PlayerAdvancementCriterionGrantEvent.patch
similarity index 100%
rename from patches/unapplied/server/Add-PlayerAdvancementCriterionGrantEvent.patch
rename to patches/server/Add-PlayerAdvancementCriterionGrantEvent.patch
diff --git a/patches/unapplied/server/Add-PlayerArmorChangeEvent.patch b/patches/server/Add-PlayerArmorChangeEvent.patch
similarity index 97%
rename from patches/unapplied/server/Add-PlayerArmorChangeEvent.patch
rename to patches/server/Add-PlayerArmorChangeEvent.patch
index 6269595f95..dc28fd1499 100644
--- a/patches/unapplied/server/Add-PlayerArmorChangeEvent.patch
+++ b/patches/server/Add-PlayerArmorChangeEvent.patch
@@ -9,9 +9,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
 +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
 @@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
-             ItemStack itemstack2 = this.getItemBySlot(enumitemslot);
  
-             if (this.equipmentHasChanged(itemstack1, itemstack2)) {
+             itemstack = this.getItemBySlot(enumitemslot);
+             if (this.equipmentHasChanged(itemstack2, itemstack)) {
 +                // Paper start - PlayerArmorChangeEvent
 +                if (this instanceof ServerPlayer && enumitemslot.getType() == EquipmentSlot.Type.HUMANOID_ARMOR) {
 +                    final org.bukkit.inventory.ItemStack oldItem = CraftItemStack.asBukkitCopy(itemstack1);
diff --git a/patches/unapplied/server/Add-PlayerJumpEvent.patch b/patches/server/Add-PlayerJumpEvent.patch
similarity index 100%
rename from patches/unapplied/server/Add-PlayerJumpEvent.patch
rename to patches/server/Add-PlayerJumpEvent.patch
diff --git a/patches/unapplied/server/Add-more-fields-to-AsyncPreLoginEvent.patch b/patches/server/Add-more-fields-to-AsyncPreLoginEvent.patch
similarity index 100%
rename from patches/unapplied/server/Add-more-fields-to-AsyncPreLoginEvent.patch
rename to patches/server/Add-more-fields-to-AsyncPreLoginEvent.patch
diff --git a/patches/unapplied/server/Add-openSign-method-to-HumanEntity.patch b/patches/server/Add-openSign-method-to-HumanEntity.patch
similarity index 100%
rename from patches/unapplied/server/Add-openSign-method-to-HumanEntity.patch
rename to patches/server/Add-openSign-method-to-HumanEntity.patch
diff --git a/patches/unapplied/server/Add-setPlayerProfile-API-for-Skulls.patch b/patches/server/Add-setPlayerProfile-API-for-Skulls.patch
similarity index 100%
rename from patches/unapplied/server/Add-setPlayerProfile-API-for-Skulls.patch
rename to patches/server/Add-setPlayerProfile-API-for-Skulls.patch
diff --git a/patches/unapplied/server/Allow-specifying-a-custom-authentication-servers-dow.patch b/patches/server/Allow-specifying-a-custom-authentication-servers-dow.patch
similarity index 100%
rename from patches/unapplied/server/Allow-specifying-a-custom-authentication-servers-dow.patch
rename to patches/server/Allow-specifying-a-custom-authentication-servers-dow.patch
diff --git a/patches/unapplied/server/AsyncTabCompleteEvent.patch b/patches/server/AsyncTabCompleteEvent.patch
similarity index 98%
rename from patches/unapplied/server/AsyncTabCompleteEvent.patch
rename to patches/server/AsyncTabCompleteEvent.patch
index dd663cd98d..c5b8770b46 100644
--- a/patches/unapplied/server/AsyncTabCompleteEvent.patch
+++ b/patches/server/AsyncTabCompleteEvent.patch
@@ -32,7 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -        PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
 +        // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
          // CraftBukkit start
-         if (this.chatSpamTickCount.addAndGet(1) > 500 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) {
+         if (!this.chatSpamThrottler.isIncrementAndUnderThreshold(1, 500) && !this.server.getPlayerList().isOp(this.player.getGameProfile()) && !this.server.isSingleplayerOwner(this.player.getGameProfile())) {
              this.disconnect(Component.translatable("disconnect.spam"));
              return;
          }
diff --git a/patches/unapplied/server/Block-player-logins-during-server-shutdown.patch b/patches/server/Block-player-logins-during-server-shutdown.patch
similarity index 100%
rename from patches/unapplied/server/Block-player-logins-during-server-shutdown.patch
rename to patches/server/Block-player-logins-during-server-shutdown.patch
diff --git a/patches/unapplied/server/Call-PaperServerListPingEvent-for-legacy-pings.patch b/patches/server/Call-PaperServerListPingEvent-for-legacy-pings.patch
similarity index 100%
rename from patches/unapplied/server/Call-PaperServerListPingEvent-for-legacy-pings.patch
rename to patches/server/Call-PaperServerListPingEvent-for-legacy-pings.patch
diff --git a/patches/unapplied/server/Configurable-sprint-interruption-on-attack.patch b/patches/server/Configurable-sprint-interruption-on-attack.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-sprint-interruption-on-attack.patch
rename to patches/server/Configurable-sprint-interruption-on-attack.patch
diff --git a/patches/unapplied/server/Disable-Explicit-Network-Manager-Flushing.patch b/patches/server/Disable-Explicit-Network-Manager-Flushing.patch
similarity index 100%
rename from patches/unapplied/server/Disable-Explicit-Network-Manager-Flushing.patch
rename to patches/server/Disable-Explicit-Network-Manager-Flushing.patch
diff --git a/patches/unapplied/server/Enderman.teleportRandomly.patch b/patches/server/Enderman.teleportRandomly.patch
similarity index 100%
rename from patches/unapplied/server/Enderman.teleportRandomly.patch
rename to patches/server/Enderman.teleportRandomly.patch
diff --git a/patches/unapplied/server/EndermanEscapeEvent.patch b/patches/server/EndermanEscapeEvent.patch
similarity index 80%
rename from patches/unapplied/server/EndermanEscapeEvent.patch
rename to patches/server/EndermanEscapeEvent.patch
index 5149283ce7..f63e29ac94 100644
--- a/patches/unapplied/server/EndermanEscapeEvent.patch
+++ b/patches/server/EndermanEscapeEvent.patch
@@ -25,17 +25,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public boolean setTarget(LivingEntity entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) {
          if (!super.setTarget(entityliving, reason, fireEvent)) {
 @@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
-         if (this.level().isDay() && this.tickCount >= this.targetChangeTime + 600) {
+         if (world.isDay() && this.tickCount >= this.targetChangeTime + 600) {
              float f = this.getLightLevelDependentMagicValue();
  
--            if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
-+            if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper - EndermanEscapeEvent
+-            if (f > 0.5F && world.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
++            if (f > 0.5F && world.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper - EndermanEscapeEvent
                  this.setTarget((LivingEntity) null);
                  this.teleport();
              }
 @@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
              } else {
-                 flag1 = flag && this.hurtWithCleanWater(source, (ThrownPotion) source.getDirectEntity(), amount);
+                 flag1 = flag && this.hurtWithCleanWater(world, source, (ThrownPotion) source.getDirectEntity(), amount);
  
 +                if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent
                  for (int i = 0; i < 64; ++i) {
@@ -50,7 +50,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
              } else {
                  if (this.target != null && !this.enderman.isPassenger()) {
-                     if (this.enderman.isLookingAtMe((Player) this.target)) {
+                     if (this.enderman.isBeingStaredBy((Player) this.target)) {
 -                        if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D) {
 +                        if (this.target.distanceToSqr((Entity) this.enderman) < 16.0D && this.enderman.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.STARE)) { // Paper - EndermanEscapeEvent
                              this.enderman.teleport();
diff --git a/patches/unapplied/server/Entity-fromMobSpawner.patch b/patches/server/Entity-fromMobSpawner.patch
similarity index 100%
rename from patches/unapplied/server/Entity-fromMobSpawner.patch
rename to patches/server/Entity-fromMobSpawner.patch
diff --git a/patches/unapplied/server/Expose-client-protocol-version-and-virtual-host.patch b/patches/server/Expose-client-protocol-version-and-virtual-host.patch
similarity index 100%
rename from patches/unapplied/server/Expose-client-protocol-version-and-virtual-host.patch
rename to patches/server/Expose-client-protocol-version-and-virtual-host.patch
diff --git a/patches/unapplied/server/Extend-Player-Interact-cancellation.patch b/patches/server/Extend-Player-Interact-cancellation.patch
similarity index 100%
rename from patches/unapplied/server/Extend-Player-Interact-cancellation.patch
rename to patches/server/Extend-Player-Interact-cancellation.patch
diff --git a/patches/unapplied/server/Fill-Profile-Property-Events.patch b/patches/server/Fill-Profile-Property-Events.patch
similarity index 100%
rename from patches/unapplied/server/Fill-Profile-Property-Events.patch
rename to patches/server/Fill-Profile-Property-Events.patch
diff --git a/patches/unapplied/server/Fix-MC-117075-Block-entity-unload-lag-spike.patch b/patches/server/Fix-MC-117075-Block-entity-unload-lag-spike.patch
similarity index 100%
rename from patches/unapplied/server/Fix-MC-117075-Block-entity-unload-lag-spike.patch
rename to patches/server/Fix-MC-117075-Block-entity-unload-lag-spike.patch
diff --git a/patches/unapplied/server/Fix-this-stupid-bullshit.patch b/patches/server/Fix-this-stupid-bullshit.patch
similarity index 97%
rename from patches/unapplied/server/Fix-this-stupid-bullshit.patch
rename to patches/server/Fix-this-stupid-bullshit.patch
index 6286528519..2748352d35 100644
--- a/patches/unapplied/server/Fix-this-stupid-bullshit.patch
+++ b/patches/server/Fix-this-stupid-bullshit.patch
@@ -36,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/org/bukkit/craftbukkit/Main.java
 @@ -0,0 +0,0 @@ public class Main {
                      Calendar deadline = Calendar.getInstance();
-                     deadline.add(Calendar.DAY_OF_YEAR, -28);
+                     deadline.add(Calendar.DAY_OF_YEAR, -3);
                      if (buildDate.before(deadline.getTime())) {
 -                        System.err.println("*** Error, this build is outdated ***");
 +                        // Paper start - This is some stupid bullshit
diff --git a/patches/unapplied/server/Flag-to-disable-the-channel-limit.patch b/patches/server/Flag-to-disable-the-channel-limit.patch
similarity index 100%
rename from patches/unapplied/server/Flag-to-disable-the-channel-limit.patch
rename to patches/server/Flag-to-disable-the-channel-limit.patch
diff --git a/patches/unapplied/server/Implement-extended-PaperServerListPingEvent.patch b/patches/server/Implement-extended-PaperServerListPingEvent.patch
similarity index 100%
rename from patches/unapplied/server/Implement-extended-PaperServerListPingEvent.patch
rename to patches/server/Implement-extended-PaperServerListPingEvent.patch
diff --git a/patches/unapplied/server/Implement-getI18NDisplayName.patch b/patches/server/Implement-getI18NDisplayName.patch
similarity index 100%
rename from patches/unapplied/server/Implement-getI18NDisplayName.patch
rename to patches/server/Implement-getI18NDisplayName.patch
diff --git a/patches/unapplied/server/Improve-the-Saddle-API-for-Horses.patch b/patches/server/Improve-the-Saddle-API-for-Horses.patch
similarity index 100%
rename from patches/unapplied/server/Improve-the-Saddle-API-for-Horses.patch
rename to patches/server/Improve-the-Saddle-API-for-Horses.patch
diff --git a/patches/unapplied/server/Improved-Async-Task-Scheduler.patch b/patches/server/Improved-Async-Task-Scheduler.patch
similarity index 96%
rename from patches/unapplied/server/Improved-Async-Task-Scheduler.patch
rename to patches/server/Improved-Async-Task-Scheduler.patch
index 40968fe538..803db65442 100644
--- a/patches/unapplied/server/Improved-Async-Task-Scheduler.patch
+++ b/patches/server/Improved-Async-Task-Scheduler.patch
@@ -106,8 +106,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +
 +    @Override
-+    public void mainThreadHeartbeat(int currentTick) {
-+        this.currentTick = currentTick;
++    public void mainThreadHeartbeat() {
++        this.currentTick++;
 +        this.management.execute(() -> this.runTasks(currentTick));
 +    }
 +
@@ -304,28 +304,28 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      }
  
 @@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
-      * This method is designed to never block or wait for locks; an immediate execution of all current tasks.
       */
-     public void mainThreadHeartbeat(final int currentTick) {
+     public void mainThreadHeartbeat() {
+         this.currentTick++;
 +        // Paper start
 +        if (!this.isAsyncScheduler) {
-+            this.asyncScheduler.mainThreadHeartbeat(currentTick);
++            this.asyncScheduler.mainThreadHeartbeat();
 +        }
 +        // Paper end
-         this.currentTick = currentTick;
          final List<CraftTask> temp = this.temp;
          this.parsePending();
+         while (this.isReady(this.currentTick)) {
 @@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
                  this.parsePending();
              } else {
-                 // this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper
+                 // this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(this.currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper
 -                this.executor.execute(new com.destroystokyo.paper.ServerSchedulerReportingWrapper(task)); // Paper
 +                task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper
                  // We don't need to parse pending
                  // (async tasks must live with race-conditions if they attempt to cancel between these few lines of code)
              }
 @@ -0,0 +0,0 @@ public class CraftScheduler implements BukkitScheduler {
-         //this.debugHead = this.debugHead.getNextHead(currentTick); // Paper
+         //this.debugHead = this.debugHead.getNextHead(this.currentTick); // Paper
      }
  
 -    private void addTask(final CraftTask task) {
diff --git a/patches/unapplied/server/LivingEntity-setKiller.patch b/patches/server/LivingEntity-setKiller.patch
similarity index 100%
rename from patches/unapplied/server/LivingEntity-setKiller.patch
rename to patches/server/LivingEntity-setKiller.patch
diff --git a/patches/unapplied/server/Make-legacy-ping-handler-more-reliable.patch b/patches/server/Make-legacy-ping-handler-more-reliable.patch
similarity index 100%
rename from patches/unapplied/server/Make-legacy-ping-handler-more-reliable.patch
rename to patches/server/Make-legacy-ping-handler-more-reliable.patch
diff --git a/patches/unapplied/server/Ocelot-despawns-should-honor-nametags-and-leash.patch b/patches/server/Ocelot-despawns-should-honor-nametags-and-leash.patch
similarity index 100%
rename from patches/unapplied/server/Ocelot-despawns-should-honor-nametags-and-leash.patch
rename to patches/server/Ocelot-despawns-should-honor-nametags-and-leash.patch
diff --git a/patches/unapplied/server/Player.setPlayerProfile-API.patch b/patches/server/Player.setPlayerProfile-API.patch
similarity index 91%
rename from patches/unapplied/server/Player.setPlayerProfile-API.patch
rename to patches/server/Player.setPlayerProfile-API.patch
index 2e52590300..87111f4576 100644
--- a/patches/unapplied/server/Player.setPlayerProfile-API.patch
+++ b/patches/server/Player.setPlayerProfile-API.patch
@@ -8,19 +8,6 @@ This can be useful for changing name or skins after a player has logged in.
 == AT ==
 public-f net.minecraft.world.entity.player.Player gameProfile
 
-diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-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 extends ServerCommonPacketListenerImpl
-         this.internalTeleport(dest.getX(), dest.getY(), dest.getZ(), dest.getYaw(), dest.getPitch(), Collections.emptySet());
-     }
- 
--    private void internalTeleport(double d0, double d1, double d2, float f, float f1, Set<RelativeMovement> set) {
-+    public void internalTeleport(double d0, double d1, double d2, float f, float f1, Set<RelativeMovement> set) { // Paper
-         // CraftBukkit start
-         if (Float.isNaN(f)) {
-             f = 0;
 diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
@@ -203,7 +190,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        ServerLevel worldserver = handle.serverLevel();
 +        connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(handle.createCommonSpawnInfo(worldserver), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA));
 +        handle.onUpdateAbilities();
-+        connection.internalTeleport(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch(), java.util.Collections.emptySet());
++        connection.internalTeleport(net.minecraft.world.entity.PositionMoveRotation.of(this.getHandle()), java.util.Collections.emptySet());
 +        net.minecraft.server.players.PlayerList playerList = handle.server.getPlayerList();
 +        playerList.sendPlayerPermissionLevel(handle, false);
 +        playerList.sendLevelInfo(handle, worldserver);
diff --git a/patches/unapplied/server/PlayerNaturallySpawnCreaturesEvent.patch b/patches/server/PlayerNaturallySpawnCreaturesEvent.patch
similarity index 55%
rename from patches/unapplied/server/PlayerNaturallySpawnCreaturesEvent.patch
rename to patches/server/PlayerNaturallySpawnCreaturesEvent.patch
index 1443e0faf4..0dcc5f402d 100644
--- a/patches/unapplied/server/PlayerNaturallySpawnCreaturesEvent.patch
+++ b/patches/server/PlayerNaturallySpawnCreaturesEvent.patch
@@ -21,44 +21,44 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event
 +        double blockRange = 16384.0D; // Paper
          // Spigot end
-         if (!this.distanceManager.hasPlayersNearby(chunkcoordintpair.toLong())) {
-             return false;
+         Iterator iterator = this.playerMap.getAllPlayers().iterator();
+ 
 @@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
-                 }
+             }
  
-                 entityplayer = (ServerPlayer) iterator.next();
-+                // Paper start - PlayerNaturallySpawnCreaturesEvent
-+                com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event;
-+                blockRange = 16384.0D;
-+                if (reducedRange) {
-+                    event = entityplayer.playerNaturallySpawnedEvent;
-+                    if (event == null || event.isCancelled()) return false;
-+                    blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
-+                }
-+                // Paper end - PlayerNaturallySpawnCreaturesEvent
-             } while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot
+             entityplayer = (ServerPlayer) iterator.next();
++            // Paper start - PlayerNaturallySpawnCreaturesEvent
++            com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event;
++            blockRange = 16384.0D;
++            if (reducedRange) {
++                event = entityplayer.playerNaturallySpawnedEvent;
++                if (event == null || event.isCancelled()) return false;
++                blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
++            }
++            // Paper end - PlayerNaturallySpawnCreaturesEvent
+         } while (!this.playerIsCloseEnoughForSpawning(entityplayer, chunkcoordintpair, blockRange)); // Spigot
  
-             return true;
+         return true;
 diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
 +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
 @@ -0,0 +0,0 @@ public class ServerChunkCache extends ChunkSource {
-                 boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit
+         List list1;
  
-                 Util.shuffle(list, this.level.random);
-+                // Paper start - PlayerNaturallySpawnCreaturesEvent
-+                int chunkRange = level.spigotConfig.mobSpawnRange;
-+                chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange;
-+                chunkRange = Math.min(chunkRange, 8);
-+                for (ServerPlayer entityPlayer : this.level.players()) {
-+                    entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange);
-+                    entityPlayer.playerNaturallySpawnedEvent.callEvent();
-+                }
-+                // Paper end - PlayerNaturallySpawnCreaturesEvent
-                 int l = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING);
-                 boolean flag1 = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getLevelData().getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
-                 Iterator iterator1 = list.iterator();
+         if (flag && (this.spawnEnemies || this.spawnFriendlies)) {
++            // Paper start - PlayerNaturallySpawnCreaturesEvent
++            int chunkRange = level.spigotConfig.mobSpawnRange;
++            chunkRange = (chunkRange > level.spigotConfig.viewDistance) ? (byte) level.spigotConfig.viewDistance : chunkRange;
++            chunkRange = Math.min(chunkRange, 8);
++            for (ServerPlayer entityPlayer : this.level.players()) {
++                entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange);
++                entityPlayer.playerNaturallySpawnedEvent.callEvent();
++            }
++            // Paper end - PlayerNaturallySpawnCreaturesEvent
+             boolean flag1 = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getLevelData().getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
+ 
+             list1 = NaturalSpawner.getFilteredSpawningCategories(spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1, this.level); // CraftBukkit
 diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
diff --git a/patches/unapplied/server/PlayerPickupExperienceEvent.patch b/patches/server/PlayerPickupExperienceEvent.patch
similarity index 100%
rename from patches/unapplied/server/PlayerPickupExperienceEvent.patch
rename to patches/server/PlayerPickupExperienceEvent.patch
diff --git a/patches/unapplied/server/PreCreatureSpawnEvent.patch b/patches/server/PreCreatureSpawnEvent.patch
similarity index 82%
rename from patches/unapplied/server/PreCreatureSpawnEvent.patch
rename to patches/server/PreCreatureSpawnEvent.patch
index 555309bd9e..d0b87e6e67 100644
--- a/patches/unapplied/server/PreCreatureSpawnEvent.patch
+++ b/patches/server/PreCreatureSpawnEvent.patch
@@ -20,14 +20,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/net/minecraft/util/SpawnUtil.java
 @@ -0,0 +0,0 @@ public class SpawnUtil {
  
-     public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entityType, MobSpawnType reason, ServerLevel world, BlockPos pos, int tries, int horizontalRange, int verticalRange, SpawnUtil.Strategy requirements) {
+     public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entityType, EntitySpawnReason reason, ServerLevel world, BlockPos pos, int tries, int horizontalRange, int verticalRange, SpawnUtil.Strategy requirements) {
          // CraftBukkit start
 -        return SpawnUtil.trySpawnMob(entityType, reason, world, pos, tries, horizontalRange, verticalRange, requirements, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT);
 +        return SpawnUtil.trySpawnMob(entityType, reason, world, pos, tries, horizontalRange, verticalRange, requirements, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT, null); // Paper
      }
  
--    public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, MobSpawnType enummobspawn, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
-+    public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, MobSpawnType enummobspawn, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason, @javax.annotation.Nullable Runnable onAbort) { // Paper
+-    public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, EntitySpawnReason entityspawnreason, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
++    public static <T extends Mob> Optional<T> trySpawnMob(EntityType<T> entitytypes, EntitySpawnReason entityspawnreason, ServerLevel worldserver, BlockPos blockposition, int i, int j, int k, SpawnUtil.Strategy spawnutil_a, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason, @javax.annotation.Nullable Runnable onAbort) {  // Paper - pre creature spawn event
          // CraftBukkit end
          BlockPos.MutableBlockPos blockposition_mutableblockposition = blockposition.mutable();
  
@@ -51,7 +51,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +                    break;
 +                }
 +                // Paper end - PreCreatureSpawnEvent
-                 T t0 = entitytypes.create(worldserver, (Consumer<T>) null, blockposition_mutableblockposition, enummobspawn, false, false); // CraftBukkit - decompile error
+                 T t0 = entitytypes.create(worldserver, (Consumer<T>) null, blockposition_mutableblockposition, entityspawnreason, false, false); // CraftBukkit - decompile error
  
                  if (t0 != null) {
 diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
@@ -60,7 +60,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/net/minecraft/world/entity/EntityType.java
 @@ -0,0 +0,0 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
      @Nullable
-     public T spawn(ServerLevel worldserver, @Nullable Consumer<T> consumer, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
+     public T spawn(ServerLevel worldserver, @Nullable Consumer<T> consumer, BlockPos blockposition, EntitySpawnReason entityspawnreason, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
          // CraftBukkit end
 +        // Paper start - PreCreatureSpawnEvent
 +        com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
@@ -72,7 +72,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +            return null;
 +        }
 +        // Paper end - PreCreatureSpawnEvent
-         T t0 = this.create(worldserver, consumer, blockposition, enummobspawn, flag, flag1);
+         T t0 = this.create(worldserver, consumer, blockposition, entityspawnreason, flag, flag1);
  
          if (t0 != null) {
 diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
@@ -80,11 +80,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
 +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
 @@ -0,0 +0,0 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
-             }).limit(5L).collect(Collectors.toList());
+             }).limit(5L).toList();
  
              if (list1.size() >= requiredCount) {
--                if (!SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, MobSpawnType.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE).isEmpty()) { // CraftBukkit
-+                if (SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, MobSpawnType.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE, () -> {GolemSensor.golemDetected(this);}).isPresent()) { // CraftBukkit // Paper - Set Golem Last Seen to stop it from spawning another one
+-                if (!SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, EntitySpawnReason.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE).isEmpty()) { // CraftBukkit
++                if (SpawnUtil.trySpawnMob(EntityType.IRON_GOLEM, EntitySpawnReason.MOB_SUMMONED, world, this.blockPosition(), 10, 8, 6, SpawnUtil.Strategy.LEGACY_IRON_GOLEM, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE, () -> {GolemSensor.golemDetected(this);}).isPresent()) { // CraftBukkit // Paper - Set Golem Last Seen to stop it from spawning another one
                      list.forEach(GolemSensor::golemDetected);
                  }
              }
@@ -93,7 +93,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
 +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
 @@ -0,0 +0,0 @@ public abstract class BaseSpawner {
-                         } else if (!SpawnPlacements.checkSpawnRules((EntityType) optional.get(), world, MobSpawnType.SPAWNER, blockposition1, world.getRandom())) {
+                         } else if (!SpawnPlacements.checkSpawnRules((EntityType) optional.get(), world, EntitySpawnReason.SPAWNER, blockposition1, world.getRandom())) {
                              continue;
                          }
 +                        // Paper start - PreCreatureSpawnEvent
@@ -111,7 +111,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +                        }
 +                        // Paper end - PreCreatureSpawnEvent
  
-                         Entity entity = EntityType.loadEntityRecursive(nbttagcompound, world, (entity1) -> {
+                         Entity entity = EntityType.loadEntityRecursive(nbttagcompound, world, EntitySpawnReason.SPAWNER, (entity1) -> {
                              entity1.moveTo(d0, d1, d2, entity1.getYRot(), entity1.getXRot());
 diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
@@ -148,7 +148,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        // Paper end - PreCreatureSpawnEvent
          EntityType<?> entitytypes = spawnEntry.type;
  
--        return entitytypes.getCategory() == MobCategory.MISC ? false : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? false : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? false : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? false : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)))) : false));
+-        return entitytypes.getCategory() == MobCategory.MISC ? false : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? false : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? false : (!SpawnPlacements.checkSpawnRules(entitytypes, world, EntitySpawnReason.NATURAL, pos, world.random) ? false : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)))) : false));
 +        // Paper start - PreCreatureSpawnEvent
 +        com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent event = new com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent(
 +            io.papermc.paper.util.MCUtil.toLocation(world, pos),
@@ -162,7 +162,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        }
 +        // Paper end - PreCreatureSpawnEvent
 +
-+        return entitytypes.getCategory() == MobCategory.MISC ? PreSpawnStatus.FAIL : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? PreSpawnStatus.FAIL : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? PreSpawnStatus.FAIL : (!SpawnPlacements.checkSpawnRules(entitytypes, world, MobSpawnType.NATURAL, pos, world.random) ? PreSpawnStatus.FAIL : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)) ? PreSpawnStatus.SUCCESS : PreSpawnStatus.FAIL)) : PreSpawnStatus.FAIL)); // Paper - PreCreatureSpawnEvent
++        return entitytypes.getCategory() == MobCategory.MISC ? PreSpawnStatus.FAIL : (!entitytypes.canSpawnFarFromPlayer() && squaredDistance > (double) (entitytypes.getCategory().getDespawnDistance() * entitytypes.getCategory().getDespawnDistance()) ? PreSpawnStatus.FAIL : (entitytypes.canSummon() && NaturalSpawner.canSpawnMobAt(world, structureAccessor, chunkGenerator, group, spawnEntry, pos) ? (!SpawnPlacements.isSpawnPositionOk(entitytypes, world, pos) ? PreSpawnStatus.FAIL : (!SpawnPlacements.checkSpawnRules(entitytypes, world, EntitySpawnReason.NATURAL, pos, world.random) ? PreSpawnStatus.FAIL : world.noCollision(entitytypes.getSpawnAABB((double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D)) ? PreSpawnStatus.SUCCESS : PreSpawnStatus.FAIL)) : PreSpawnStatus.FAIL)); // Paper - PreCreatureSpawnEvent
      }
  
      @Nullable
diff --git a/patches/unapplied/server/Prevent-logins-from-being-processed-when-the-player-.patch b/patches/server/Prevent-logins-from-being-processed-when-the-player-.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-logins-from-being-processed-when-the-player-.patch
rename to patches/server/Prevent-logins-from-being-processed-when-the-player-.patch
diff --git a/patches/unapplied/server/Profile-Lookup-Events.patch b/patches/server/Profile-Lookup-Events.patch
similarity index 100%
rename from patches/unapplied/server/Profile-Lookup-Events.patch
rename to patches/server/Profile-Lookup-Events.patch
diff --git a/patches/unapplied/server/ProfileWhitelistVerifyEvent.patch b/patches/server/ProfileWhitelistVerifyEvent.patch
similarity index 100%
rename from patches/unapplied/server/ProfileWhitelistVerifyEvent.patch
rename to patches/server/ProfileWhitelistVerifyEvent.patch
diff --git a/patches/unapplied/server/Reset-spawner-timer-when-spawner-event-is-cancelled.patch b/patches/server/Reset-spawner-timer-when-spawner-event-is-cancelled.patch
similarity index 100%
rename from patches/unapplied/server/Reset-spawner-timer-when-spawner-event-is-cancelled.patch
rename to patches/server/Reset-spawner-timer-when-spawner-event-is-cancelled.patch
diff --git a/patches/unapplied/server/Send-attack-SoundEffects-only-to-players-who-can-see.patch b/patches/server/Send-attack-SoundEffects-only-to-players-who-can-see.patch
similarity index 100%
rename from patches/unapplied/server/Send-attack-SoundEffects-only-to-players-who-can-see.patch
rename to patches/server/Send-attack-SoundEffects-only-to-players-who-can-see.patch
diff --git a/patches/unapplied/server/Tameable-getOwnerUniqueId-API.patch b/patches/server/Tameable-getOwnerUniqueId-API.patch
similarity index 100%
rename from patches/unapplied/server/Tameable-getOwnerUniqueId-API.patch
rename to patches/server/Tameable-getOwnerUniqueId-API.patch
diff --git a/patches/unapplied/server/Toggleable-player-crits.patch b/patches/server/Toggleable-player-crits.patch
similarity index 100%
rename from patches/unapplied/server/Toggleable-player-crits.patch
rename to patches/server/Toggleable-player-crits.patch
diff --git a/patches/unapplied/server/ensureServerConversions-API.patch b/patches/server/ensureServerConversions-API.patch
similarity index 100%
rename from patches/unapplied/server/ensureServerConversions-API.patch
rename to patches/server/ensureServerConversions-API.patch
diff --git a/patches/unapplied/server/getPlayerUniqueId-API.patch b/patches/server/getPlayerUniqueId-API.patch
similarity index 100%
rename from patches/unapplied/server/getPlayerUniqueId-API.patch
rename to patches/server/getPlayerUniqueId-API.patch
diff --git a/patches/unapplied/server/handle-ServerboundKeepAlivePacket-async.patch b/patches/server/handle-ServerboundKeepAlivePacket-async.patch
similarity index 100%
rename from patches/unapplied/server/handle-ServerboundKeepAlivePacket-async.patch
rename to patches/server/handle-ServerboundKeepAlivePacket-async.patch
diff --git a/patches/unapplied/server/revert-serverside-behavior-of-keepalives.patch b/patches/server/revert-serverside-behavior-of-keepalives.patch
similarity index 97%
rename from patches/unapplied/server/revert-serverside-behavior-of-keepalives.patch
rename to patches/server/revert-serverside-behavior-of-keepalives.patch
index 716f9a421b..661d2cec6b 100644
--- a/patches/unapplied/server/revert-serverside-behavior-of-keepalives.patch
+++ b/patches/server/revert-serverside-behavior-of-keepalives.patch
@@ -40,7 +40,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
  
      protected void keepConnectionAlive() {
-         this.server.getProfiler().push("keepAlive");
+         Profiler.get().push("keepAlive");
 -        long i = Util.getMillis();
 +        // Paper start - give clients a longer time to respond to pings as per pre 1.12.2 timings
 +        // This should effectively place the keepalive handling back to "as it was" before 1.12.2
@@ -64,5 +64,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          }
 +        // Paper end - give clients a longer time to respond to pings as per pre 1.12.2 timings
  
-         this.server.getProfiler().pop();
+         Profiler.get().pop();
      }
diff --git a/patches/unapplied/server/use-CB-BlockState-implementations-for-captured-block.patch b/patches/server/use-CB-BlockState-implementations-for-captured-block.patch
similarity index 100%
rename from patches/unapplied/server/use-CB-BlockState-implementations-for-captured-block.patch
rename to patches/server/use-CB-BlockState-implementations-for-captured-block.patch
diff --git a/patches/unapplied/server/Block-Enderpearl-Travel-Exploit.patch b/patches/unapplied/server/Block-Enderpearl-Travel-Exploit.patch
deleted file mode 100644
index 66ff671e0a..0000000000
--- a/patches/unapplied/server/Block-Enderpearl-Travel-Exploit.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar <aikar@aikar.co>
-Date: Mon, 30 Apr 2018 17:15:26 -0400
-Subject: [PATCH] Block Enderpearl Travel Exploit
-
-Players are able to use alt accounts and enderpearls to travel
-long distances utilizing the pearls in unloaded chunks and loading
-the chunk later when convenient.
-
-This disables that by not saving the thrower when the chunk is unloaded.
-
-This is mainly useful for survival servers that do not allow freeform teleporting.
-
-== AT ==
-public net.minecraft.world.entity.projectile.Projectile cachedOwner
-public net.minecraft.world.entity.projectile.Projectile ownerUUID
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/server/level/ServerLevel.java
-+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements WorldGenLevel {
- 
-         public void onTickingEnd(Entity entity) {
-             ServerLevel.this.entityTickList.remove(entity);
-+            // Paper start - Reset pearls when they stop being ticked
-+            if (paperConfig().fixes.disableUnloadedChunkEnderpearlExploit && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) {
-+                pearl.cachedOwner = null;
-+                pearl.ownerUUID = null;
-+            }
-+            // Paper end - Reset pearls when they stop being ticked
-         }
- 
-         public void onTrackingStart(Entity entity) {
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
-@@ -0,0 +0,0 @@ public abstract class Projectile extends Entity implements TraceableEntity {
-         if (nbt.hasUUID("Owner")) {
-             this.ownerUUID = nbt.getUUID("Owner");
-             this.cachedOwner = null;
-+            if (this instanceof ThrownEnderpearl && this.level() != null && this.level().paperConfig().fixes.disableUnloadedChunkEnderpearlExploit) { this.ownerUUID = null; } // Paper - Reset pearls when they stop being ticked; Don't store shooter name for pearls to block enderpearl travel exploit
-         }
- 
-         this.leftOwner = nbt.getBoolean("LeftOwner");