From 9ece54ccdd009548627ba61edc5f87bed97c6b85 Mon Sep 17 00:00:00 2001
From: Noah van der Aa <ndvdaa@gmail.com>
Date: Tue, 22 Oct 2024 20:04:31 +0200
Subject: [PATCH] first 100!

---
 .../server/Add-BeaconEffectEvent.patch        |   0
 .../Add-PlayerUseUnknownEntityEvent.patch     |   0
 .../server/Add-World-Util-Methods.patch       |   0
 ...-to-configure-frosted_ice-properties.patch |   2 +-
 ...onfigurable-entity-despawn-distances.patch |   0
 ...dd-configurable-portal-search-radius.patch |   0
 .../Add-exception-reporting-event.patch       |   6 +-
 ...ent-to-allow-plugins-to-handle-clien.patch |   0
 ...working-with-arrows-stuck-in-living-.patch |   2 +-
 ...ties-to-activation-range-ignore-list.patch |   0
 .../server/Add-server-name-parameter.patch    |   0
 .../server/Add-velocity-warnings.patch        |   0
 ...chunks-are-slime-spawn-chunks-toggle.patch |  10 +-
 ...llow-Reloading-of-Custom-Permissions.patch |   0
 .../Async-GameProfileCache-saving.patch       |   0
 ...e-informative-in-maxHealth-exception.patch |   0
 ...e-before-converting-and-renaming-pla.patch |   0
 .../server/Chunk-Save-Reattempt.patch         |   0
 .../server/Complete-resource-pack-API.patch   |   0
 .../Configurable-Chunk-Inhabited-Time.patch   |   2 +-
 ...urable-Disabling-Cat-Chest-Detection.patch |   0
 ...urable-Non-Player-Arrow-Despawn-Rate.patch |   0
 .../Configurable-Player-Collision.patch       |   2 +-
 .../server/Configurable-RCON-IP-address.patch |   0
 ...figurable-container-update-tick-rate.patch |   2 +-
 .../server/Configurable-end-credits.patch     |   0
 .../Configurable-mob-spawner-tick-rate.patch  |   0
 ...gurable-random-tick-rates-for-blocks.patch |   0
 ...le-spawn-chances-for-skeleton-horses.patch |   4 +-
 ...nfigurable-top-of-nether-void-damage.patch |   6 +-
 .../Custom-replacement-for-eaten-items.patch  |   2 +-
 ...ading-permissions.yml-before-plugins.patch |   0
 ...oreboards-for-non-players-by-default.patch |   0
 .../server/Disable-explosion-knockback.patch  |  18 +--
 .../server/Disable-ice-and-snow.patch         |   2 +-
 .../server/Disable-spigot-tick-limiters.patch |   0
 .../server/Disable-thunder.patch              |   4 +-
 .../Do-not-load-chunks-for-Pathfinding.patch  |   0
 ...y-scoreboard-teams-to-scoreboard.dat.patch |   0
 ...ck-and-tnt-entities-at-the-specified.patch |   8 +-
 ...Entity-AddTo-RemoveFrom-World-Events.patch |   4 +-
 .../server/Entity-Origin-API.patch            |   2 +-
 .../server/EntityPathfindEvent.patch          |  22 ++--
 ...ityRegainHealthEvent-isFastRegen-API.patch |   0
 .../server/Expose-server-CommandMap.patch     |   0
 .../Expose-server-build-information.patch     |   4 +-
 ...r-redstone-torch-rapid-clock-removal.patch |   2 +-
 ...g-BlockPlaceEvent-triggering-physics.patch |  12 +-
 ...-explosions-processing-dead-entities.patch |  19 +++
 ...awn-location-event-changing-location.patch |   0
 .../Handle-Item-Meta-Inconsistencies.patch    |   6 +-
 .../Improve-Player-chat-API-handling.patch    |   0
 ...able-API-and-replenishable-lootables.patch | 113 +++++++++---------
 patches/server/MC-Utils.patch                 |  10 +-
 ...ckPhysicsEvent-if-a-plugin-has-a-lis.patch |  10 +-
 .../Only-refresh-abilities-if-needed.patch    |   0
 .../server/Optimize-DataBits.patch            |   0
 .../server/Optimize-explosions.patch          |  65 +++++-----
 ...nilla-per-world-scoreboard-coloring-.patch |   0
 .../Optional-TNT-doesn-t-move-in-water.patch  |  22 +++-
 .../Player-Tab-List-and-Title-APIs.patch      |   0
 .../server/Player-affects-spawning-API.patch  |  18 +--
 ...vent-block-entity-and-entity-crashes.patch |   0
 .../server/Remove-Metadata-on-reload.patch    |   0
 ...egionFileCache-and-make-configurable.patch |   0
 ...tem-property-for-disabling-watchdoge.patch |   0
 patches/server/Timings-v2.patch               |  28 +++++
 .../Use-UserCache-for-player-heads.patch      |   0
 .../Use-a-Shared-Random-for-Entities.patch    |   2 +-
 .../server/Use-null-Locale-by-default.patch   |   2 +-
 ...th-absorb-values-and-repair-bad-data.patch |   0
 ...-possibility-for-getServer-singleton.patch |   4 +-
 ...-explosions-processing-dead-entities.patch |  19 ---
 73 files changed, 237 insertions(+), 197 deletions(-)
 rename patches/{unapplied => }/server/Add-BeaconEffectEvent.patch (100%)
 rename patches/{unapplied => }/server/Add-PlayerUseUnknownEntityEvent.patch (100%)
 rename patches/{unapplied => }/server/Add-World-Util-Methods.patch (100%)
 rename patches/{unapplied => }/server/Add-ability-to-configure-frosted_ice-properties.patch (97%)
 rename patches/{unapplied => }/server/Add-configurable-entity-despawn-distances.patch (100%)
 rename patches/{unapplied => }/server/Add-configurable-portal-search-radius.patch (100%)
 rename patches/{unapplied => }/server/Add-exception-reporting-event.patch (98%)
 rename patches/{unapplied => }/server/Add-handshake-event-to-allow-plugins-to-handle-clien.patch (100%)
 rename patches/{unapplied => }/server/Add-methods-for-working-with-arrows-stuck-in-living-.patch (98%)
 rename patches/{unapplied => }/server/Add-more-entities-to-activation-range-ignore-list.patch (100%)
 rename patches/{unapplied => }/server/Add-server-name-parameter.patch (100%)
 rename patches/{unapplied => }/server/Add-velocity-warnings.patch (100%)
 rename patches/{unapplied => }/server/All-chunks-are-slime-spawn-chunks-toggle.patch (80%)
 rename patches/{unapplied => }/server/Allow-Reloading-of-Custom-Permissions.patch (100%)
 rename patches/{unapplied => }/server/Async-GameProfileCache-saving.patch (100%)
 rename patches/{unapplied => }/server/Be-a-bit-more-informative-in-maxHealth-exception.patch (100%)
 rename patches/{unapplied => }/server/Check-online-mode-before-converting-and-renaming-pla.patch (100%)
 rename patches/{unapplied => }/server/Chunk-Save-Reattempt.patch (100%)
 rename patches/{unapplied => }/server/Complete-resource-pack-API.patch (100%)
 rename patches/{unapplied => }/server/Configurable-Chunk-Inhabited-Time.patch (92%)
 rename patches/{unapplied => }/server/Configurable-Disabling-Cat-Chest-Detection.patch (100%)
 rename patches/{unapplied => }/server/Configurable-Non-Player-Arrow-Despawn-Rate.patch (100%)
 rename patches/{unapplied => }/server/Configurable-Player-Collision.patch (99%)
 rename patches/{unapplied => }/server/Configurable-RCON-IP-address.patch (100%)
 rename patches/{unapplied => }/server/Configurable-container-update-tick-rate.patch (97%)
 rename patches/{unapplied => }/server/Configurable-end-credits.patch (100%)
 rename patches/{unapplied => }/server/Configurable-mob-spawner-tick-rate.patch (100%)
 rename patches/{unapplied => }/server/Configurable-random-tick-rates-for-blocks.patch (100%)
 rename patches/{unapplied => }/server/Configurable-spawn-chances-for-skeleton-horses.patch (93%)
 rename patches/{unapplied => }/server/Configurable-top-of-nether-void-damage.patch (90%)
 rename patches/{unapplied => }/server/Custom-replacement-for-eaten-items.patch (97%)
 rename patches/{unapplied => }/server/Default-loading-permissions.yml-before-plugins.patch (100%)
 rename patches/{unapplied => }/server/Disable-Scoreboards-for-non-players-by-default.patch (100%)
 rename patches/{unapplied => }/server/Disable-explosion-knockback.patch (58%)
 rename patches/{unapplied => }/server/Disable-ice-and-snow.patch (97%)
 rename patches/{unapplied => }/server/Disable-spigot-tick-limiters.patch (100%)
 rename patches/{unapplied => }/server/Disable-thunder.patch (92%)
 rename patches/{unapplied => }/server/Do-not-load-chunks-for-Pathfinding.patch (100%)
 rename patches/{unapplied => }/server/Don-t-save-empty-scoreboard-teams-to-scoreboard.dat.patch (100%)
 rename patches/{unapplied => }/server/Drop-falling-block-and-tnt-entities-at-the-specified.patch (93%)
 rename patches/{unapplied => }/server/Entity-AddTo-RemoveFrom-World-Events.patch (95%)
 rename patches/{unapplied => }/server/Entity-Origin-API.patch (99%)
 rename patches/{unapplied => }/server/EntityPathfindEvent.patch (89%)
 rename patches/{unapplied => }/server/EntityRegainHealthEvent-isFastRegen-API.patch (100%)
 rename patches/{unapplied => }/server/Expose-server-CommandMap.patch (100%)
 rename patches/{unapplied => }/server/Expose-server-build-information.patch (99%)
 rename patches/{unapplied => }/server/Faster-redstone-torch-rapid-clock-removal.patch (96%)
 rename patches/{unapplied => }/server/Fix-Cancelling-BlockPlaceEvent-triggering-physics.patch (66%)
 create mode 100644 patches/server/Fix-lag-from-explosions-processing-dead-entities.patch
 rename patches/{unapplied => }/server/Fix-spawn-location-event-changing-location.patch (100%)
 rename patches/{unapplied => }/server/Handle-Item-Meta-Inconsistencies.patch (99%)
 rename patches/{unapplied => }/server/Improve-Player-chat-API-handling.patch (100%)
 rename patches/{unapplied => }/server/LootTable-API-and-replenishable-lootables.patch (94%)
 rename patches/{unapplied => }/server/Only-process-BlockPhysicsEvent-if-a-plugin-has-a-lis.patch (89%)
 rename patches/{unapplied => }/server/Only-refresh-abilities-if-needed.patch (100%)
 rename patches/{unapplied => }/server/Optimize-DataBits.patch (100%)
 rename patches/{unapplied => }/server/Optimize-explosions.patch (76%)
 rename patches/{unapplied => }/server/Option-to-use-vanilla-per-world-scoreboard-coloring-.patch (100%)
 rename patches/{unapplied => }/server/Optional-TNT-doesn-t-move-in-water.patch (74%)
 rename patches/{unapplied => }/server/Player-Tab-List-and-Title-APIs.patch (100%)
 rename patches/{unapplied => }/server/Player-affects-spawning-API.patch (87%)
 rename patches/{unapplied => }/server/Prevent-block-entity-and-entity-crashes.patch (100%)
 rename patches/{unapplied => }/server/Remove-Metadata-on-reload.patch (100%)
 rename patches/{unapplied => }/server/Sanitise-RegionFileCache-and-make-configurable.patch (100%)
 rename patches/{unapplied => }/server/System-property-for-disabling-watchdoge.patch (100%)
 rename patches/{unapplied => }/server/Use-UserCache-for-player-heads.patch (100%)
 rename patches/{unapplied => }/server/Use-a-Shared-Random-for-Entities.patch (98%)
 rename patches/{unapplied => }/server/Use-null-Locale-by-default.patch (98%)
 rename patches/{unapplied => }/server/handle-NaN-health-absorb-values-and-repair-bad-data.patch (100%)
 rename patches/{unapplied => }/server/remove-null-possibility-for-getServer-singleton.patch (95%)
 delete mode 100644 patches/unapplied/server/Fix-lag-from-explosions-processing-dead-entities.patch

diff --git a/patches/unapplied/server/Add-BeaconEffectEvent.patch b/patches/server/Add-BeaconEffectEvent.patch
similarity index 100%
rename from patches/unapplied/server/Add-BeaconEffectEvent.patch
rename to patches/server/Add-BeaconEffectEvent.patch
diff --git a/patches/unapplied/server/Add-PlayerUseUnknownEntityEvent.patch b/patches/server/Add-PlayerUseUnknownEntityEvent.patch
similarity index 100%
rename from patches/unapplied/server/Add-PlayerUseUnknownEntityEvent.patch
rename to patches/server/Add-PlayerUseUnknownEntityEvent.patch
diff --git a/patches/unapplied/server/Add-World-Util-Methods.patch b/patches/server/Add-World-Util-Methods.patch
similarity index 100%
rename from patches/unapplied/server/Add-World-Util-Methods.patch
rename to patches/server/Add-World-Util-Methods.patch
diff --git a/patches/unapplied/server/Add-ability-to-configure-frosted_ice-properties.patch b/patches/server/Add-ability-to-configure-frosted_ice-properties.patch
similarity index 97%
rename from patches/unapplied/server/Add-ability-to-configure-frosted_ice-properties.patch
rename to patches/server/Add-ability-to-configure-frosted_ice-properties.patch
index a197cc2721..a41008225e 100644
--- a/patches/unapplied/server/Add-ability-to-configure-frosted_ice-properties.patch
+++ b/patches/server/Add-ability-to-configure-frosted_ice-properties.patch
@@ -14,7 +14,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      protected void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) {
 +        if (!world.paperConfig().environment.frostedIce.enabled) return; // Paper - Frosted ice options
          if ((random.nextInt(3) == 0 || this.fewerNeigboursThan(world, pos, 4))
-             && world.getMaxLocalRawBrightness(pos) > 11 - state.getValue(AGE) - state.getLightBlock(world, pos)
+             && world.getMaxLocalRawBrightness(pos) > 11 - state.getValue(AGE) - state.getLightBlock()
              && this.slightlyMelt(state, world, pos)) {
 @@ -0,0 +0,0 @@ public class FrostedIceBlock extends IceBlock {
                  mutableBlockPos.setWithOffset(pos, direction);
diff --git a/patches/unapplied/server/Add-configurable-entity-despawn-distances.patch b/patches/server/Add-configurable-entity-despawn-distances.patch
similarity index 100%
rename from patches/unapplied/server/Add-configurable-entity-despawn-distances.patch
rename to patches/server/Add-configurable-entity-despawn-distances.patch
diff --git a/patches/unapplied/server/Add-configurable-portal-search-radius.patch b/patches/server/Add-configurable-portal-search-radius.patch
similarity index 100%
rename from patches/unapplied/server/Add-configurable-portal-search-radius.patch
rename to patches/server/Add-configurable-portal-search-radius.patch
diff --git a/patches/unapplied/server/Add-exception-reporting-event.patch b/patches/server/Add-exception-reporting-event.patch
similarity index 98%
rename from patches/unapplied/server/Add-exception-reporting-event.patch
rename to patches/server/Add-exception-reporting-event.patch
index 81a7c6fc63..c224ad6512 100644
--- a/patches/unapplied/server/Add-exception-reporting-event.patch
+++ b/patches/server/Add-exception-reporting-event.patch
@@ -83,7 +83,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/ai/village/VillageSiege.java
 +++ b/src/main/java/net/minecraft/world/entity/ai/village/VillageSiege.java
 @@ -0,0 +0,0 @@ public class VillageSiege implements CustomSpawner {
-                 entityzombie.finalizeSpawn(world, world.getCurrentDifficultyAt(entityzombie.blockPosition()), MobSpawnType.EVENT, (SpawnGroupData) null);
+                 entityzombie.finalizeSpawn(world, world.getCurrentDifficultyAt(entityzombie.blockPosition()), EntitySpawnReason.EVENT, (SpawnGroupData) null);
              } catch (Exception exception) {
                  VillageSiege.LOGGER.warn("Failed to create zombie for village siege at {}", vec3d, exception);
 +                com.destroystokyo.paper.exception.ServerInternalException.reportInternalException(exception); // Paper - ServerExceptionEvent
@@ -115,7 +115,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          return null;
 @@ -0,0 +0,0 @@ public final class NaturalSpawner {
-                                     entity = biomesettingsmobs_c.type.create(world.getLevel());
+                                     entity = biomesettingsmobs_c.type.create(world.getLevel(), EntitySpawnReason.NATURAL);
                                  } catch (Exception exception) {
                                      NaturalSpawner.LOGGER.warn("Failed to create mob", exception);
 +                                    com.destroystokyo.paper.exception.ServerInternalException.reportInternalException(exception); // Paper - ServerExceptionEvent
@@ -199,7 +199,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                  }
                  this.parsePending();
              } else {
-                 this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass()));
+                 this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(this.currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass()));
 -                this.executor.execute(task);
 +                this.executor.execute(new com.destroystokyo.paper.ServerSchedulerReportingWrapper(task)); // Paper
                  // We don't need to parse pending
diff --git a/patches/unapplied/server/Add-handshake-event-to-allow-plugins-to-handle-clien.patch b/patches/server/Add-handshake-event-to-allow-plugins-to-handle-clien.patch
similarity index 100%
rename from patches/unapplied/server/Add-handshake-event-to-allow-plugins-to-handle-clien.patch
rename to patches/server/Add-handshake-event-to-allow-plugins-to-handle-clien.patch
diff --git a/patches/unapplied/server/Add-methods-for-working-with-arrows-stuck-in-living-.patch b/patches/server/Add-methods-for-working-with-arrows-stuck-in-living-.patch
similarity index 98%
rename from patches/unapplied/server/Add-methods-for-working-with-arrows-stuck-in-living-.patch
rename to patches/server/Add-methods-for-working-with-arrows-stuck-in-living-.patch
index 4752343498..a9d97afcc9 100644
--- a/patches/unapplied/server/Add-methods-for-working-with-arrows-stuck-in-living-.patch
+++ b/patches/server/Add-methods-for-working-with-arrows-stuck-in-living-.patch
@@ -40,7 +40,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end - Add methods for working with arrows stuck in living entities
  
      @Override
-     public void damage(double amount) {
+     public boolean isInvulnerable() {
 @@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
          this.getHandle().persistentInvisibility = invisible;
          this.getHandle().setSharedFlag(5, invisible);
diff --git a/patches/unapplied/server/Add-more-entities-to-activation-range-ignore-list.patch b/patches/server/Add-more-entities-to-activation-range-ignore-list.patch
similarity index 100%
rename from patches/unapplied/server/Add-more-entities-to-activation-range-ignore-list.patch
rename to patches/server/Add-more-entities-to-activation-range-ignore-list.patch
diff --git a/patches/unapplied/server/Add-server-name-parameter.patch b/patches/server/Add-server-name-parameter.patch
similarity index 100%
rename from patches/unapplied/server/Add-server-name-parameter.patch
rename to patches/server/Add-server-name-parameter.patch
diff --git a/patches/unapplied/server/Add-velocity-warnings.patch b/patches/server/Add-velocity-warnings.patch
similarity index 100%
rename from patches/unapplied/server/Add-velocity-warnings.patch
rename to patches/server/Add-velocity-warnings.patch
diff --git a/patches/unapplied/server/All-chunks-are-slime-spawn-chunks-toggle.patch b/patches/server/All-chunks-are-slime-spawn-chunks-toggle.patch
similarity index 80%
rename from patches/unapplied/server/All-chunks-are-slime-spawn-chunks-toggle.patch
rename to patches/server/All-chunks-are-slime-spawn-chunks-toggle.patch
index 3f00aba727..1bd12619e7 100644
--- a/patches/unapplied/server/All-chunks-are-slime-spawn-chunks-toggle.patch
+++ b/patches/server/All-chunks-are-slime-spawn-chunks-toggle.patch
@@ -9,14 +9,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java
 +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java
 @@ -0,0 +0,0 @@ public class Slime extends Mob implements Enemy {
-                 }
+             }
  
-                 ChunkPos chunkcoordintpair = new ChunkPos(pos);
--                boolean flag = WorldgenRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((WorldGenLevel) world).getSeed(), world.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot
+             ChunkPos chunkcoordintpair = new ChunkPos(pos);
+-            boolean flag = WorldgenRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((WorldGenLevel) world).getSeed(), world.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot
 +                boolean flag = world.getMinecraftWorld().paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((WorldGenLevel) world).getSeed(), world.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot // Paper
  
-                 if (random.nextInt(10) == 0 && flag && pos.getY() < 40) {
-                     return checkMobSpawnRules(type, world, spawnReason, pos, random);
+             if (random.nextInt(10) == 0 && flag && pos.getY() < 40) {
+                 return checkMobSpawnRules(type, world, spawnReason, pos, random);
 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
diff --git a/patches/unapplied/server/Allow-Reloading-of-Custom-Permissions.patch b/patches/server/Allow-Reloading-of-Custom-Permissions.patch
similarity index 100%
rename from patches/unapplied/server/Allow-Reloading-of-Custom-Permissions.patch
rename to patches/server/Allow-Reloading-of-Custom-Permissions.patch
diff --git a/patches/unapplied/server/Async-GameProfileCache-saving.patch b/patches/server/Async-GameProfileCache-saving.patch
similarity index 100%
rename from patches/unapplied/server/Async-GameProfileCache-saving.patch
rename to patches/server/Async-GameProfileCache-saving.patch
diff --git a/patches/unapplied/server/Be-a-bit-more-informative-in-maxHealth-exception.patch b/patches/server/Be-a-bit-more-informative-in-maxHealth-exception.patch
similarity index 100%
rename from patches/unapplied/server/Be-a-bit-more-informative-in-maxHealth-exception.patch
rename to patches/server/Be-a-bit-more-informative-in-maxHealth-exception.patch
diff --git a/patches/unapplied/server/Check-online-mode-before-converting-and-renaming-pla.patch b/patches/server/Check-online-mode-before-converting-and-renaming-pla.patch
similarity index 100%
rename from patches/unapplied/server/Check-online-mode-before-converting-and-renaming-pla.patch
rename to patches/server/Check-online-mode-before-converting-and-renaming-pla.patch
diff --git a/patches/unapplied/server/Chunk-Save-Reattempt.patch b/patches/server/Chunk-Save-Reattempt.patch
similarity index 100%
rename from patches/unapplied/server/Chunk-Save-Reattempt.patch
rename to patches/server/Chunk-Save-Reattempt.patch
diff --git a/patches/unapplied/server/Complete-resource-pack-API.patch b/patches/server/Complete-resource-pack-API.patch
similarity index 100%
rename from patches/unapplied/server/Complete-resource-pack-API.patch
rename to patches/server/Complete-resource-pack-API.patch
diff --git a/patches/unapplied/server/Configurable-Chunk-Inhabited-Time.patch b/patches/server/Configurable-Chunk-Inhabited-Time.patch
similarity index 92%
rename from patches/unapplied/server/Configurable-Chunk-Inhabited-Time.patch
rename to patches/server/Configurable-Chunk-Inhabited-Time.patch
index 9703dc0a44..734ffd8bb4 100644
--- a/patches/unapplied/server/Configurable-Chunk-Inhabited-Time.patch
+++ b/patches/server/Configurable-Chunk-Inhabited-Time.patch
@@ -15,7 +15,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
 +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
 @@ -0,0 +0,0 @@ public class LevelChunk extends ChunkAccess {
-         return new ChunkAccess.TicksToSave(this.blockTicks, this.fluidTicks);
+         return new ChunkAccess.PackedTicks(this.blockTicks.pack(time), this.fluidTicks.pack(time));
      }
  
 +    // Paper start
diff --git a/patches/unapplied/server/Configurable-Disabling-Cat-Chest-Detection.patch b/patches/server/Configurable-Disabling-Cat-Chest-Detection.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-Disabling-Cat-Chest-Detection.patch
rename to patches/server/Configurable-Disabling-Cat-Chest-Detection.patch
diff --git a/patches/unapplied/server/Configurable-Non-Player-Arrow-Despawn-Rate.patch b/patches/server/Configurable-Non-Player-Arrow-Despawn-Rate.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-Non-Player-Arrow-Despawn-Rate.patch
rename to patches/server/Configurable-Non-Player-Arrow-Despawn-Rate.patch
diff --git a/patches/unapplied/server/Configurable-Player-Collision.patch b/patches/server/Configurable-Player-Collision.patch
similarity index 99%
rename from patches/unapplied/server/Configurable-Player-Collision.patch
rename to patches/server/Configurable-Player-Collision.patch
index 32d210fd63..12108ade03 100644
--- a/patches/unapplied/server/Configurable-Player-Collision.patch
+++ b/patches/server/Configurable-Player-Collision.patch
@@ -55,7 +55,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public PlayerList(MinecraftServer server, LayeredRegistryAccess<RegistryLayer> registryManager, PlayerDataStorage saveHandler, int maxPlayers) {
          this.cserver = server.server = new CraftServer((DedicatedServer) server, this);
 @@ -0,0 +0,0 @@ public abstract class PlayerList {
- 
+         player.loadAndSpawnParentVehicle(optional);
          player.initInventoryMenu();
          // CraftBukkit - Moved from above, added world
 +        // Paper start - Configurable player collision; Add to collideRule team if needed
diff --git a/patches/unapplied/server/Configurable-RCON-IP-address.patch b/patches/server/Configurable-RCON-IP-address.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-RCON-IP-address.patch
rename to patches/server/Configurable-RCON-IP-address.patch
diff --git a/patches/unapplied/server/Configurable-container-update-tick-rate.patch b/patches/server/Configurable-container-update-tick-rate.patch
similarity index 97%
rename from patches/unapplied/server/Configurable-container-update-tick-rate.patch
rename to patches/server/Configurable-container-update-tick-rate.patch
index 352487861d..8608dc14df 100644
--- a/patches/unapplied/server/Configurable-container-update-tick-rate.patch
+++ b/patches/server/Configurable-container-update-tick-rate.patch
@@ -9,7 +9,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 net.minecraft.world.entity.player.Player {
-     public final Object object;
+     private final CommandSource commandSource;
      private int containerCounter;
      public boolean wonGame;
 +    private int containerUpdateDelay; // Paper - Configurable container update tick rate
diff --git a/patches/unapplied/server/Configurable-end-credits.patch b/patches/server/Configurable-end-credits.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-end-credits.patch
rename to patches/server/Configurable-end-credits.patch
diff --git a/patches/unapplied/server/Configurable-mob-spawner-tick-rate.patch b/patches/server/Configurable-mob-spawner-tick-rate.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-mob-spawner-tick-rate.patch
rename to patches/server/Configurable-mob-spawner-tick-rate.patch
diff --git a/patches/unapplied/server/Configurable-random-tick-rates-for-blocks.patch b/patches/server/Configurable-random-tick-rates-for-blocks.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-random-tick-rates-for-blocks.patch
rename to patches/server/Configurable-random-tick-rates-for-blocks.patch
diff --git a/patches/unapplied/server/Configurable-spawn-chances-for-skeleton-horses.patch b/patches/server/Configurable-spawn-chances-for-skeleton-horses.patch
similarity index 93%
rename from patches/unapplied/server/Configurable-spawn-chances-for-skeleton-horses.patch
rename to patches/server/Configurable-spawn-chances-for-skeleton-horses.patch
index 0ee7892050..1b638e6931 100644
--- a/patches/unapplied/server/Configurable-spawn-chances-for-skeleton-horses.patch
+++ b/patches/server/Configurable-spawn-chances-for-skeleton-horses.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/mai
 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 {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
  
              if (this.isRainingAt(blockposition)) {
                  DifficultyInstance difficultydamagescaler = this.getCurrentDifficultyAt(blockposition);
@@ -16,4 +16,4 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +                boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper - Configurable spawn chances for skeleton horses
  
                  if (flag1) {
-                     SkeletonHorse entityhorseskeleton = (SkeletonHorse) EntityType.SKELETON_HORSE.create(this);
+                     SkeletonHorse entityhorseskeleton = (SkeletonHorse) EntityType.SKELETON_HORSE.create(this, EntitySpawnReason.EVENT);
diff --git a/patches/unapplied/server/Configurable-top-of-nether-void-damage.patch b/patches/server/Configurable-top-of-nether-void-damage.patch
similarity index 90%
rename from patches/unapplied/server/Configurable-top-of-nether-void-damage.patch
rename to patches/server/Configurable-top-of-nether-void-damage.patch
index 0f77d7fb1d..6023808f81 100644
--- a/patches/unapplied/server/Configurable-top-of-nether-void-damage.patch
+++ b/patches/server/Configurable-top-of-nether-void-damage.patch
@@ -13,9 +13,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      }
  
      public void checkBelowWorld() {
--        if (this.getY() < (double) (this.level().getMinBuildHeight() - 64)) {
+-        if (this.getY() < (double) (this.level().getMinY() - 64)) {
 +        // Paper start - Configurable nether ceiling damage
-+        if (this.getY() < (double) (this.level.getMinBuildHeight() - 64) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER
++        if (this.getY() < (double) (this.level.getMinY() - 64) || (this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER
 +            && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v)
 +            && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
 +            // Paper end - Configurable nether ceiling damage
@@ -38,7 +38,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public class PortalForcer {
          BlockPos blockposition2 = null;
          WorldBorder worldborder = this.level.getWorldBorder();
-         int i = Math.min(this.level.getMaxBuildHeight(), this.level.getMinBuildHeight() + this.level.getLogicalHeight()) - 1;
+         int i = Math.min(this.level.getMaxY(), this.level.getMinY() + this.level.getLogicalHeight() - 1);
 +        // Paper start - Configurable nether ceiling damage; make sure the max height doesn't exceed the void damage height
 +        if (this.level.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.NETHER && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.enabled()) {
 +            i = Math.min(i, this.level.paperConfig().environment.netherCeilingVoidDamageHeight.intValue() - 1);
diff --git a/patches/unapplied/server/Custom-replacement-for-eaten-items.patch b/patches/server/Custom-replacement-for-eaten-items.patch
similarity index 97%
rename from patches/unapplied/server/Custom-replacement-for-eaten-items.patch
rename to patches/server/Custom-replacement-for-eaten-items.patch
index 0c7bd0ec3d..6b1735cd6d 100644
--- a/patches/unapplied/server/Custom-replacement-for-eaten-items.patch
+++ b/patches/server/Custom-replacement-for-eaten-items.patch
@@ -9,7 +9,7 @@ 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 {
-                     this.triggerItemUseEffects(this.useItem, 16);
+                 if (!this.useItem.isEmpty() && this.isUsingItem()) {
                      // CraftBukkit start - fire PlayerItemConsumeEvent
                      ItemStack itemstack;
 +                    PlayerItemConsumeEvent event = null; // Paper
diff --git a/patches/unapplied/server/Default-loading-permissions.yml-before-plugins.patch b/patches/server/Default-loading-permissions.yml-before-plugins.patch
similarity index 100%
rename from patches/unapplied/server/Default-loading-permissions.yml-before-plugins.patch
rename to patches/server/Default-loading-permissions.yml-before-plugins.patch
diff --git a/patches/unapplied/server/Disable-Scoreboards-for-non-players-by-default.patch b/patches/server/Disable-Scoreboards-for-non-players-by-default.patch
similarity index 100%
rename from patches/unapplied/server/Disable-Scoreboards-for-non-players-by-default.patch
rename to patches/server/Disable-Scoreboards-for-non-players-by-default.patch
diff --git a/patches/unapplied/server/Disable-explosion-knockback.patch b/patches/server/Disable-explosion-knockback.patch
similarity index 58%
rename from patches/unapplied/server/Disable-explosion-knockback.patch
rename to patches/server/Disable-explosion-knockback.patch
index 5b2cdcb3de..4d11592a8b 100644
--- a/patches/unapplied/server/Disable-explosion-knockback.patch
+++ b/patches/server/Disable-explosion-knockback.patch
@@ -4,25 +4,25 @@ Date: Wed, 2 Mar 2016 14:48:03 -0600
 Subject: [PATCH] Disable explosion knockback
 
 
-diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
+diff --git a/src/main/java/net/minecraft/world/level/ServerExplosion.java b/src/main/java/net/minecraft/world/level/ServerExplosion.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/Explosion.java
-+++ b/src/main/java/net/minecraft/world/level/Explosion.java
-@@ -0,0 +0,0 @@ public class Explosion {
+--- a/src/main/java/net/minecraft/world/level/ServerExplosion.java
++++ b/src/main/java/net/minecraft/world/level/ServerExplosion.java
+@@ -0,0 +0,0 @@ public class ServerExplosion implements Explosion {
                          if (entity instanceof LivingEntity) {
                              LivingEntity entityliving = (LivingEntity) entity;
  
--                            d13 = d12 * (1.0D - entityliving.getAttributeValue(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE));
-+                            d13 = entity instanceof Player && this.level.paperConfig().environment.disableExplosionKnockback ? 0 : d12 * (1.0D - entityliving.getAttributeValue(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE));
+-                            d6 = d5 * (1.0D - entityliving.getAttributeValue(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE));
++                            d6 = entity instanceof Player && this.level.paperConfig().environment.disableExplosionKnockback ? 0 : d5 * (1.0D - entityliving.getAttributeValue(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE)); // Paper
                          } else {
-                             d13 = d12;
+                             d6 = d5;
                          }
-@@ -0,0 +0,0 @@ public class Explosion {
+@@ -0,0 +0,0 @@ public class ServerExplosion implements Explosion {
                          if (entity instanceof Player) {
                              Player entityhuman = (Player) entity;
  
 -                            if (!entityhuman.isSpectator() && (!entityhuman.isCreative() || !entityhuman.getAbilities().flying)) {
 +                            if (!entityhuman.isSpectator() && (!entityhuman.isCreative() || !entityhuman.getAbilities().flying) && !level.paperConfig().environment.disableExplosionKnockback) { // Paper - Option to disable explosion knockback
-                                 this.hitPlayers.put(entityhuman, vec3d1);
+                                 this.hitPlayers.put(entityhuman, vec3d);
                              }
                          }
diff --git a/patches/unapplied/server/Disable-ice-and-snow.patch b/patches/server/Disable-ice-and-snow.patch
similarity index 97%
rename from patches/unapplied/server/Disable-ice-and-snow.patch
rename to patches/server/Disable-ice-and-snow.patch
index 996216c844..bd89303434 100644
--- a/patches/unapplied/server/Disable-ice-and-snow.patch
+++ b/patches/server/Disable-ice-and-snow.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/mai
 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 {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
  
          gameprofilerfiller.popPush("iceandsnow");
  
diff --git a/patches/unapplied/server/Disable-spigot-tick-limiters.patch b/patches/server/Disable-spigot-tick-limiters.patch
similarity index 100%
rename from patches/unapplied/server/Disable-spigot-tick-limiters.patch
rename to patches/server/Disable-spigot-tick-limiters.patch
diff --git a/patches/unapplied/server/Disable-thunder.patch b/patches/server/Disable-thunder.patch
similarity index 92%
rename from patches/unapplied/server/Disable-thunder.patch
rename to patches/server/Disable-thunder.patch
index 9cb40b734f..52dfef0f6e 100644
--- a/patches/unapplied/server/Disable-thunder.patch
+++ b/patches/server/Disable-thunder.patch
@@ -8,8 +8,8 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/mai
 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 {
-         ProfilerFiller gameprofilerfiller = this.getProfiler();
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+         ProfilerFiller gameprofilerfiller = Profiler.get();
  
          gameprofilerfiller.push("thunder");
 -        if (flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot
diff --git a/patches/unapplied/server/Do-not-load-chunks-for-Pathfinding.patch b/patches/server/Do-not-load-chunks-for-Pathfinding.patch
similarity index 100%
rename from patches/unapplied/server/Do-not-load-chunks-for-Pathfinding.patch
rename to patches/server/Do-not-load-chunks-for-Pathfinding.patch
diff --git a/patches/unapplied/server/Don-t-save-empty-scoreboard-teams-to-scoreboard.dat.patch b/patches/server/Don-t-save-empty-scoreboard-teams-to-scoreboard.dat.patch
similarity index 100%
rename from patches/unapplied/server/Don-t-save-empty-scoreboard-teams-to-scoreboard.dat.patch
rename to patches/server/Don-t-save-empty-scoreboard-teams-to-scoreboard.dat.patch
diff --git a/patches/unapplied/server/Drop-falling-block-and-tnt-entities-at-the-specified.patch b/patches/server/Drop-falling-block-and-tnt-entities-at-the-specified.patch
similarity index 93%
rename from patches/unapplied/server/Drop-falling-block-and-tnt-entities-at-the-specified.patch
rename to patches/server/Drop-falling-block-and-tnt-entities-at-the-specified.patch
index d28b3d1482..edb02cc105 100644
--- a/patches/unapplied/server/Drop-falling-block-and-tnt-entities-at-the-specified.patch
+++ b/patches/server/Drop-falling-block-and-tnt-entities-at-the-specified.patch
@@ -10,9 +10,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
 +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
 @@ -0,0 +0,0 @@ public class FallingBlockEntity extends Entity {
-             ++this.time;
              this.applyGravity();
              this.move(MoverType.SELF, this.getDeltaMovement());
+             this.applyEffectsFromBlocks();
 +            // Paper start - Configurable falling blocks height nerf
 +            if (this.level().paperConfig().fixes.fallingBlockHeightNerf.test(v -> this.getY() > v)) {
 +                if (this.dropItem && this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
@@ -24,16 +24,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +            }
 +            // Paper end - Configurable falling blocks height nerf
              this.handlePortal();
-             if (!this.level().isClientSide && (this.isAlive() || this.forceTickAfterTeleportToDuplicate)) {
-                 BlockPos blockposition = this.blockPosition();
+             Level world = this.level();
+ 
 diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
 +++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
 @@ -0,0 +0,0 @@ public class PrimedTnt extends Entity implements TraceableEntity {
-         this.handlePortal();
          this.applyGravity();
          this.move(MoverType.SELF, this.getDeltaMovement());
+         this.applyEffectsFromBlocks();
 +        // Paper start - Configurable TNT height nerf
 +        if (this.level().paperConfig().fixes.tntEntityHeightNerf.test(v -> this.getY() > v)) {
 +            this.discard(EntityRemoveEvent.Cause.OUT_OF_WORLD);
diff --git a/patches/unapplied/server/Entity-AddTo-RemoveFrom-World-Events.patch b/patches/server/Entity-AddTo-RemoveFrom-World-Events.patch
similarity index 95%
rename from patches/unapplied/server/Entity-AddTo-RemoveFrom-World-Events.patch
rename to patches/server/Entity-AddTo-RemoveFrom-World-Events.patch
index 180bc70bfd..99ab7d02ad 100644
--- a/patches/unapplied/server/Entity-AddTo-RemoveFrom-World-Events.patch
+++ b/patches/server/Entity-AddTo-RemoveFrom-World-Events.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/mai
 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 {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
                  entity.setOrigin(entity.getOriginVector().toLocation(getWorld()));
              }
              // Paper end - Entity origin API
@@ -16,7 +16,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          }
  
          public void onTrackingEnd(Entity entity) {
-@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
                  }
              }
              // CraftBukkit end
diff --git a/patches/unapplied/server/Entity-Origin-API.patch b/patches/server/Entity-Origin-API.patch
similarity index 99%
rename from patches/unapplied/server/Entity-Origin-API.patch
rename to patches/server/Entity-Origin-API.patch
index 80f5060ffe..5f932294ec 100644
--- a/patches/unapplied/server/Entity-Origin-API.patch
+++ b/patches/server/Entity-Origin-API.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/mai
 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 {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
              entity.updateDynamicGameEventListener(DynamicGameEventListener::add);
              entity.inWorld = true; // CraftBukkit - Mark entity as in world
              entity.valid = true; // CraftBukkit
diff --git a/patches/unapplied/server/EntityPathfindEvent.patch b/patches/server/EntityPathfindEvent.patch
similarity index 89%
rename from patches/unapplied/server/EntityPathfindEvent.patch
rename to patches/server/EntityPathfindEvent.patch
index c1e891c8e5..cd4038f44f 100644
--- a/patches/unapplied/server/EntityPathfindEvent.patch
+++ b/patches/server/EntityPathfindEvent.patch
@@ -34,12 +34,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public class GroundPathNavigation extends PathNavigation {
                  }
  
-                 if (blockPos.getY() > this.level.getMinBuildHeight()) {
--                    return super.createPath(blockPos.above(), distance);
-+                    return super.createPath(blockPos.above(), entity, distance); // Paper - EntityPathfindEvent
+                 if (mutableBlockPos.getY() > this.level.getMinY()) {
+-                    return super.createPath(mutableBlockPos.above(), distance);
++                    return super.createPath(mutableBlockPos.above(), entity, distance); // Paper - EntityPathfindEvent
                  }
  
-                 while (blockPos.getY() < this.level.getMaxBuildHeight() && levelChunk.getBlockState(blockPos).isAir()) {
+                 mutableBlockPos.setY(target.getY() + 1);
 @@ -0,0 +0,0 @@ public class GroundPathNavigation extends PathNavigation {
              }
  
@@ -47,14 +47,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -                return super.createPath(target, distance);
 +                return super.createPath(target, entity, distance); // Paper - EntityPathfindEvent
              } else {
-                 BlockPos blockPos2 = target.above();
+                 BlockPos.MutableBlockPos mutableBlockPos2 = target.mutable().move(Direction.UP);
  
 @@ -0,0 +0,0 @@ public class GroundPathNavigation extends PathNavigation {
-                     blockPos2 = blockPos2.above();
+                     mutableBlockPos2.move(Direction.UP);
                  }
  
--                return super.createPath(blockPos2, distance);
-+                return super.createPath(blockPos2, entity, distance); // Paper - EntityPathfindEvent
+-                return super.createPath(mutableBlockPos2.immutable(), distance);
++                return super.createPath(mutableBlockPos2.immutable(), entity, distance);  // Paper - EntityPathfindEvent
              }
          }
      }
@@ -111,7 +111,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        // Paper end - EntityPathfindEvent
          if (positions.isEmpty()) {
              return null;
-         } else if (this.mob.getY() < (double)this.level.getMinBuildHeight()) {
+         } else if (this.mob.getY() < (double)this.level.getMinY()) {
 @@ -0,0 +0,0 @@ public abstract class PathNavigation {
          } else if (this.path != null && !this.path.isDone() && positions.contains(this.targetPos)) {
              return this.path;
@@ -133,9 +133,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +                }
 +            }
 +            // Paper end - EntityPathfindEvent
-             this.level.getProfiler().push("pathfind");
+             ProfilerFiller profilerFiller = Profiler.get();
+             profilerFiller.push("pathfind");
              BlockPos blockPos = useHeadPos ? this.mob.blockPosition().above() : this.mob.blockPosition();
-             int i = (int)(followRange + (float)range);
 diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/WallClimberNavigation.java
diff --git a/patches/unapplied/server/EntityRegainHealthEvent-isFastRegen-API.patch b/patches/server/EntityRegainHealthEvent-isFastRegen-API.patch
similarity index 100%
rename from patches/unapplied/server/EntityRegainHealthEvent-isFastRegen-API.patch
rename to patches/server/EntityRegainHealthEvent-isFastRegen-API.patch
diff --git a/patches/unapplied/server/Expose-server-CommandMap.patch b/patches/server/Expose-server-CommandMap.patch
similarity index 100%
rename from patches/unapplied/server/Expose-server-CommandMap.patch
rename to patches/server/Expose-server-CommandMap.patch
diff --git a/patches/unapplied/server/Expose-server-build-information.patch b/patches/server/Expose-server-build-information.patch
similarity index 99%
rename from patches/unapplied/server/Expose-server-build-information.patch
rename to patches/server/Expose-server-build-information.patch
index 25a11daa2f..3cf70f5fae 100644
--- a/patches/unapplied/server/Expose-server-build-information.patch
+++ b/patches/server/Expose-server-build-information.patch
@@ -542,8 +542,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  import java.util.concurrent.Executor;
 -import java.util.concurrent.RejectedExecutionException;
  import java.util.concurrent.atomic.AtomicReference;
+ import java.util.concurrent.locks.LockSupport;
  import java.util.function.BooleanSupplier;
- import java.util.function.Consumer;
 @@ -0,0 +0,0 @@ import net.minecraft.world.phys.Vec2;
  import net.minecraft.world.phys.Vec3;
  import org.bukkit.Bukkit;
@@ -671,7 +671,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public static boolean useConsole = true;
  
 @@ -0,0 +0,0 @@ public class Main {
-                     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 ***");
 -                        System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***");
diff --git a/patches/unapplied/server/Faster-redstone-torch-rapid-clock-removal.patch b/patches/server/Faster-redstone-torch-rapid-clock-removal.patch
similarity index 96%
rename from patches/unapplied/server/Faster-redstone-torch-rapid-clock-removal.patch
rename to patches/server/Faster-redstone-torch-rapid-clock-removal.patch
index dfe62f120a..e64c4d20a3 100644
--- a/patches/unapplied/server/Faster-redstone-torch-rapid-clock-removal.patch
+++ b/patches/server/Faster-redstone-torch-rapid-clock-removal.patch
@@ -12,7 +12,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
      private org.spigotmc.TickLimiter tileLimiter;
      private int tileTickPosition;
-     public final Map<Explosion.CacheKey, Float> explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions
+     public final Map<ServerExplosion.CacheKey, Float> explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions
 +    public java.util.ArrayDeque<net.minecraft.world.level.block.RedstoneTorchBlock.Toggle> redstoneUpdateInfos; // Paper - Faster redstone torch rapid clock removal; Move from Map in BlockRedstoneTorch to here
  
      public CraftWorld getWorld() {
diff --git a/patches/unapplied/server/Fix-Cancelling-BlockPlaceEvent-triggering-physics.patch b/patches/server/Fix-Cancelling-BlockPlaceEvent-triggering-physics.patch
similarity index 66%
rename from patches/unapplied/server/Fix-Cancelling-BlockPlaceEvent-triggering-physics.patch
rename to patches/server/Fix-Cancelling-BlockPlaceEvent-triggering-physics.patch
index 9db7869c5d..9ed76a583f 100644
--- a/patches/unapplied/server/Fix-Cancelling-BlockPlaceEvent-triggering-physics.patch
+++ b/patches/server/Fix-Cancelling-BlockPlaceEvent-triggering-physics.patch
@@ -8,11 +8,17 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/mai
 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 {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
  
      @Override
-     public void updateNeighborsAt(BlockPos pos, Block sourceBlock) {
+     public void updateNeighborsAt(BlockPos pos, Block block) {
 +        if (captureBlockStates) { return; } // Paper - Cancel all physics during placement
-         this.neighborUpdater.updateNeighborsAtExceptFromFacing(pos, sourceBlock, (Direction) null);
+         this.updateNeighborsAt(pos, block, ExperimentalRedstoneUtils.initialOrientation(this, (Direction) null, (Direction) null));
+     }
+ 
+     @Override
+     public void updateNeighborsAt(BlockPos pos, Block sourceBlock, @Nullable Orientation orientation) {
++        if (captureBlockStates) { return; } // Paper - Cancel all physics during placement
+         this.neighborUpdater.updateNeighborsAtExceptFromFacing(pos, sourceBlock, (Direction) null, orientation);
      }
  
diff --git a/patches/server/Fix-lag-from-explosions-processing-dead-entities.patch b/patches/server/Fix-lag-from-explosions-processing-dead-entities.patch
new file mode 100644
index 0000000000..94f2af97f6
--- /dev/null
+++ b/patches/server/Fix-lag-from-explosions-processing-dead-entities.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Iceee <andrew@opticgaming.tv>
+Date: Wed, 2 Mar 2016 01:39:52 -0600
+Subject: [PATCH] Fix lag from explosions processing dead entities
+
+
+diff --git a/src/main/java/net/minecraft/world/level/ServerExplosion.java b/src/main/java/net/minecraft/world/level/ServerExplosion.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/ServerExplosion.java
++++ b/src/main/java/net/minecraft/world/level/ServerExplosion.java
+@@ -0,0 +0,0 @@ public class ServerExplosion implements Explosion {
+         int l = Mth.floor(this.center.y + (double) f + 1.0D);
+         int i1 = Mth.floor(this.center.z - (double) f - 1.0D);
+         int j1 = Mth.floor(this.center.z + (double) f + 1.0D);
+-        List<Entity> list = this.level.getEntities(this.source, new AABB((double) i, (double) k, (double) i1, (double) j, (double) l, (double) j1));
++        List<Entity> list = this.level.getEntities(this.source, new AABB((double) i, (double) k, (double) i1, (double) j, (double) l, (double) j1), (com.google.common.base.Predicate<Entity>) entity -> entity.isAlive() && !entity.isSpectator()); // Paper - Fix lag from explosions processing dead entities
+         Iterator iterator = list.iterator();
+ 
+         while (iterator.hasNext()) {
diff --git a/patches/unapplied/server/Fix-spawn-location-event-changing-location.patch b/patches/server/Fix-spawn-location-event-changing-location.patch
similarity index 100%
rename from patches/unapplied/server/Fix-spawn-location-event-changing-location.patch
rename to patches/server/Fix-spawn-location-event-changing-location.patch
diff --git a/patches/unapplied/server/Handle-Item-Meta-Inconsistencies.patch b/patches/server/Handle-Item-Meta-Inconsistencies.patch
similarity index 99%
rename from patches/unapplied/server/Handle-Item-Meta-Inconsistencies.patch
rename to patches/server/Handle-Item-Meta-Inconsistencies.patch
index a7ff95fcda..e8cd193370 100644
--- a/patches/unapplied/server/Handle-Item-Meta-Inconsistencies.patch
+++ b/patches/server/Handle-Item-Meta-Inconsistencies.patch
@@ -35,7 +35,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    private static final java.util.Comparator<Holder<Enchantment>> ENCHANTMENT_ORDER = java.util.Comparator.comparing(Holder::getRegisteredName);
 +    public static final ItemEnchantments EMPTY = new ItemEnchantments(new Object2IntAVLTreeMap<>(ENCHANTMENT_ORDER), true);
 +    // Paper end
-     private static final Codec<Integer> LEVEL_CODEC = Codec.intRange(0, 255);
+     private static final Codec<Integer> LEVEL_CODEC = Codec.intRange(1, 255);
 -    private static final Codec<Object2IntOpenHashMap<Holder<Enchantment>>> LEVELS_CODEC = Codec.unboundedMap(Enchantment.CODEC, LEVEL_CODEC)
 -        .xmap(Object2IntOpenHashMap::new, Function.identity());
 +    private static final Codec<Object2IntAVLTreeMap<Holder<Enchantment>>> LEVELS_CODEC = Codec.unboundedMap(
@@ -169,8 +169,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  import java.util.HashMap;
  import java.util.Iterator;
 @@ -0,0 +0,0 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
-     private List<Component> lore; // null and empty are two different states internally
      private Integer customModelData;
+     private Integer enchantableValue;
      private Map<String, String> blockData;
 -    private Map<Enchantment, Integer> enchantments;
 +    private EnchantmentMap enchantments; // Paper
@@ -231,7 +231,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          if (ignoreRestrictions || level >= ench.getStartLevel() && level <= ench.getMaxLevel()) {
 @@ -0,0 +0,0 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
-             clone.customModelData = this.customModelData;
+             clone.enchantableValue = this.enchantableValue;
              clone.blockData = this.blockData;
              if (this.enchantments != null) {
 -                clone.enchantments = new LinkedHashMap<Enchantment, Integer>(this.enchantments);
diff --git a/patches/unapplied/server/Improve-Player-chat-API-handling.patch b/patches/server/Improve-Player-chat-API-handling.patch
similarity index 100%
rename from patches/unapplied/server/Improve-Player-chat-API-handling.patch
rename to patches/server/Improve-Player-chat-API-handling.patch
diff --git a/patches/unapplied/server/LootTable-API-and-replenishable-lootables.patch b/patches/server/LootTable-API-and-replenishable-lootables.patch
similarity index 94%
rename from patches/unapplied/server/LootTable-API-and-replenishable-lootables.patch
rename to patches/server/LootTable-API-and-replenishable-lootables.patch
index 0e639ab553..30469230fe 100644
--- a/patches/unapplied/server/LootTable-API-and-replenishable-lootables.patch
+++ b/patches/server/LootTable-API-and-replenishable-lootables.patch
@@ -608,6 +608,34 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +    // Paper end - LootTable API
  }
+diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractChestBoat.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractChestBoat.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractChestBoat.java
++++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractChestBoat.java
+@@ -0,0 +0,0 @@ public abstract class AbstractChestBoat extends AbstractBoat implements HasCusto
+     @Nullable
+     @Override
+     public AbstractContainerMenu createMenu(int syncId, Inventory playerInventory, Player player) {
+-        if (this.lootTable != null && player.isSpectator()) {
++        if (this.lootTable != null && player.isSpectator()) { // Paper - LootTable API (TODO spectators can open chests that aren't ready to be re-generated but this doesn't support that)
+             return null;
+         } else {
+             this.unpackLootTable(playerInventory.player);
+@@ -0,0 +0,0 @@ public abstract class AbstractChestBoat extends AbstractBoat implements HasCusto
+         this.level().gameEvent((Holder) GameEvent.CONTAINER_CLOSE, this.position(), GameEvent.Context.of((Entity) player));
+     }
+ 
++    // Paper start - LootTable API
++    final com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData = new com.destroystokyo.paper.loottable.PaperLootableInventoryData();
++
++    @Override
++    public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData() {
++        return this.lootableData;
++    }
++    // Paper end - LootTable API
+     // CraftBukkit start
+     public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
+     private int maxStack = MAX_STACK;
 diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java
@@ -616,34 +644,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public ResourceKey<LootTable> lootTable;
      public long lootTableSeed;
  
-+    // Paper start - LootTable API
-+    final com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData = new com.destroystokyo.paper.loottable.PaperLootableInventoryData();
-+
-+    @Override
-+    public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData() {
-+        return this.lootableData;
-+    }
-+    // Paper end - LootTable API
-     // CraftBukkit start
-     public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
-     private int maxStack = MAX_STACK;
-diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
-+++ b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
-@@ -0,0 +0,0 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain
-     @Nullable
-     @Override
-     public AbstractContainerMenu createMenu(int syncId, Inventory playerInventory, Player player) {
--        if (this.lootTable != null && player.isSpectator()) {
-+        if (this.lootTable != null && player.isSpectator()) { // Paper - LootTable API (TODO spectators can open chests that aren't ready to be re-generated but this doesn't support that)
-             return null;
-         } else {
-             this.unpackLootTable(playerInventory.player);
-@@ -0,0 +0,0 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain
-         this.level().gameEvent((Holder) GameEvent.CONTAINER_CLOSE, this.position(), GameEvent.Context.of((Entity) player));
-     }
- 
 +    // Paper start - LootTable API
 +    final com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData = new com.destroystokyo.paper.loottable.PaperLootableInventoryData();
 +
@@ -660,53 +660,54 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
 +++ b/src/main/java/net/minecraft/world/entity/vehicle/ContainerEntity.java
 @@ -0,0 +0,0 @@ public interface ContainerEntity extends Container, MenuProvider {
-     default void addChestVehicleSaveData(CompoundTag nbt, HolderLookup.Provider registriesLookup) {
-         if (this.getLootTable() != null) {
-             nbt.putString("LootTable", this.getLootTable().location().toString());
+     default void addChestVehicleSaveData(CompoundTag nbt, HolderLookup.Provider registries) {
+         if (this.getContainerLootTable() != null) {
+             nbt.putString("LootTable", this.getContainerLootTable().location().toString());
 +            this.lootableData().saveNbt(nbt); // Paper
-             if (this.getLootTableSeed() != 0L) {
-                 nbt.putLong("LootTableSeed", this.getLootTableSeed());
+             if (this.getContainerLootTableSeed() != 0L) {
+                 nbt.putLong("LootTableSeed", this.getContainerLootTableSeed());
              }
 -        } else {
--            ContainerHelper.saveAllItems(nbt, this.getItemStacks(), registriesLookup);
+-            ContainerHelper.saveAllItems(nbt, this.getItemStacks(), registries);
          }
-+        ContainerHelper.saveAllItems(nbt, this.getItemStacks(), registriesLookup); // Paper - always save the items, table may still remain
++        ContainerHelper.saveAllItems(nbt, this.getItemStacks(), registries); // Paper - always save the items, table may still remain
      }
  
-     default void readChestVehicleSaveData(CompoundTag nbt, HolderLookup.Provider registriesLookup) {
+     default void readChestVehicleSaveData(CompoundTag nbt, HolderLookup.Provider registries) {
          this.clearItemStacks();
          if (nbt.contains("LootTable", 8)) {
-             this.setLootTable(ResourceKey.create(Registries.LOOT_TABLE, ResourceLocation.parse(nbt.getString("LootTable"))));
+             this.setContainerLootTable(ResourceKey.create(Registries.LOOT_TABLE, ResourceLocation.parse(nbt.getString("LootTable"))));
 +            // Paper start - LootTable API
 +            if (this.getLootTable() != null) {
 +                this.lootableData().loadNbt(nbt);
 +            }
 +            // Paper end - LootTable API
-             this.setLootTableSeed(nbt.getLong("LootTableSeed"));
+             this.setContainerLootTableSeed(nbt.getLong("LootTableSeed"));
 -        } else {
--            ContainerHelper.loadAllItems(nbt, this.getItemStacks(), registriesLookup);
+-            ContainerHelper.loadAllItems(nbt, this.getItemStacks(), registries);
          }
-+        ContainerHelper.loadAllItems(nbt, this.getItemStacks(), registriesLookup); // Paper - always save the items, table may still remain
++        ContainerHelper.loadAllItems(nbt, this.getItemStacks(), registries); // Paper - always save the items, table may still remain
      }
  
-     default void chestVehicleDestroyed(DamageSource source, Level world, Entity vehicle) {
+     default void chestVehicleDestroyed(DamageSource source, ServerLevel world, Entity vehicle) {
 @@ -0,0 +0,0 @@ public interface ContainerEntity extends Container, MenuProvider {
  
      default void unpackChestVehicleLootTable(@Nullable Player player) {
          MinecraftServer minecraftServer = this.level().getServer();
--        if (this.getLootTable() != null && minecraftServer != null) {
+-        if (this.getContainerLootTable() != null && minecraftServer != null) {
 +        if (minecraftServer != null && this.lootableData().shouldReplenish(this, com.destroystokyo.paper.loottable.PaperLootableInventoryData.ENTITY, player)) { // Paper - LootTable API
-             LootTable lootTable = minecraftServer.reloadableRegistries().getLootTable(this.getLootTable());
+             LootTable lootTable = minecraftServer.reloadableRegistries().getLootTable(this.getContainerLootTable());
              if (player != null) {
-                 CriteriaTriggers.GENERATE_LOOT.trigger((ServerPlayer)player, this.getLootTable());
+                 CriteriaTriggers.GENERATE_LOOT.trigger((ServerPlayer)player, this.getContainerLootTable());
              }
  
--            this.setLootTable(null);
+-            this.setContainerLootTable(null);
 +            // Paper start - LootTable API
 +            if (this.lootableData().shouldClearLootTable(this, com.destroystokyo.paper.loottable.PaperLootableInventoryData.ENTITY, player)) {
-+                this.setLootTable(null);
++                this.setContainerLootTable(null);
 +            }
 +            // Paper end - LootTable API
++
              LootParams.Builder builder = new LootParams.Builder((ServerLevel)this.level()).withParameter(LootContextParams.ORIGIN, this.position());
              if (player != null) {
                  builder.withLuck(player.getLuck()).withParameter(LootContextParams.THIS_ENTITY, player);
@@ -857,13 +858,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  import org.bukkit.inventory.Inventory;
  import org.bukkit.loot.LootTable;
  
--public class CraftChestBoat extends CraftBoat implements org.bukkit.entity.ChestBoat {
+-public abstract class CraftChestBoat extends CraftBoat implements org.bukkit.entity.ChestBoat {
 -
-+public class CraftChestBoat extends CraftBoat implements org.bukkit.entity.ChestBoat, com.destroystokyo.paper.loottable.PaperLootableEntityInventory { // Paper
++public abstract class CraftChestBoat extends CraftBoat implements org.bukkit.entity.ChestBoat, com.destroystokyo.paper.loottable.PaperLootableEntityInventory { // Paper
      private final Inventory inventory;
  
-     public CraftChestBoat(CraftServer server, ChestBoat entity) {
-@@ -0,0 +0,0 @@ public class CraftChestBoat extends CraftBoat implements org.bukkit.entity.Chest
+     public CraftChestBoat(CraftServer server, AbstractChestBoat entity) {
+@@ -0,0 +0,0 @@ public abstract class CraftChestBoat extends CraftBoat implements org.bukkit.ent
          return this.inventory;
      }
  
@@ -871,10 +872,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -    public void setLootTable(LootTable table) {
 -        this.setLootTable(table, this.getSeed());
 -    }
--
++    // Paper - moved loot table logic to PaperLootableEntityInventory
+ 
 -    @Override
 -    public LootTable getLootTable() {
--        return CraftLootTable.minecraftToBukkit(this.getHandle().getLootTable());
+-        return CraftLootTable.minecraftToBukkit(this.getHandle().getContainerLootTable());
 -    }
 -
 -    @Override
@@ -884,14 +886,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -
 -    @Override
 -    public long getSeed() {
--        return this.getHandle().getLootTableSeed();
+-        return this.getHandle().getContainerLootTableSeed();
 -    }
 -
 -    private void setLootTable(LootTable table, long seed) {
--        this.getHandle().setLootTable(CraftLootTable.bukkitToMinecraft(table));
--        this.getHandle().setLootTableSeed(seed);
+-        this.getHandle().setContainerLootTable(CraftLootTable.bukkitToMinecraft(table));
+-        this.getHandle().setContainerLootTableSeed(seed);
 -    }
-+    // Paper - moved loot table logic to PaperLootableEntityInventory
  }
 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartChest.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartChest.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
diff --git a/patches/server/MC-Utils.patch b/patches/server/MC-Utils.patch
index bd936f4e2e..99d892a1c0 100644
--- a/patches/server/MC-Utils.patch
+++ b/patches/server/MC-Utils.patch
@@ -4419,14 +4419,6 @@ diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/MinecraftServer.java
 +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
-         if (Runtime.getRuntime().availableProcessors() > 4) {
-             thread.setPriority(8);
-         }
--
-         S s0 = serverFactory.apply(thread); // CraftBukkit - decompile error
- 
-         atomicreference.set(s0);
 @@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
              MinecraftServer.LOGGER.error("Failed to unlock level {}", this.storageSource.getLevelId(), ioexception1);
          }
@@ -4620,7 +4612,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      public boolean hasWork() {
 -        return this.lightEngine.hasLightWork() || !this.pendingUnloads.isEmpty() || !this.updatingChunkMap.isEmpty() || this.poiManager.hasWork() || !this.toDrop.isEmpty() || !this.unloadQueue.isEmpty() || this.worldgenTaskDispatcher.hasWork() || this.lightTaskDispatcher.hasWork() || this.distanceManager.hasTickets();
-+        return this.lightEngine.hasLightWork() || !this.pendingUnloads.isEmpty() || ca.spottedleaf.moonrise.common.util.ChunkSystem.hasAnyChunkHolders(this.level) || this.poiManager.hasWork() || !this.toDrop.isEmpty() || !this.unloadQueue.isEmpty() || this.queueSorter.hasWork() || this.lightTaskDispatcher.hasWork() || this.distanceManager.hasTickets(); // Paper
++        return this.lightEngine.hasLightWork() || !this.pendingUnloads.isEmpty() || ca.spottedleaf.moonrise.common.util.ChunkSystem.hasAnyChunkHolders(this.level) || !this.updatingChunkMap.isEmpty() || this.poiManager.hasWork() || !this.toDrop.isEmpty() || !this.unloadQueue.isEmpty() || this.worldgenTaskDispatcher.hasWork() || this.lightTaskDispatcher.hasWork() || this.distanceManager.hasTickets();
      }
  
      private void processUnloads(BooleanSupplier shouldKeepTicking) {
diff --git a/patches/unapplied/server/Only-process-BlockPhysicsEvent-if-a-plugin-has-a-lis.patch b/patches/server/Only-process-BlockPhysicsEvent-if-a-plugin-has-a-lis.patch
similarity index 89%
rename from patches/unapplied/server/Only-process-BlockPhysicsEvent-if-a-plugin-has-a-lis.patch
rename to patches/server/Only-process-BlockPhysicsEvent-if-a-plugin-has-a-lis.patch
index 62c43ba8bf..55f92690dc 100644
--- a/patches/unapplied/server/Only-process-BlockPhysicsEvent-if-a-plugin-has-a-lis.patch
+++ b/patches/server/Only-process-BlockPhysicsEvent-if-a-plugin-has-a-lis.patch
@@ -15,13 +15,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              ServerLevel worldserver = (ServerLevel) iterator.next();
 +            worldserver.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent
  
-             this.profiler.push(() -> {
+             gameprofilerfiller.push(() -> {
                  String s = String.valueOf(worldserver);
 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 {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
      // CraftBukkit start
      public final LevelStorageSource.LevelStorageAccess convertable;
      public final UUID uuid;
@@ -47,11 +47,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/level/block/BushBlock.java
 +++ b/src/main/java/net/minecraft/world/level/block/BushBlock.java
 @@ -0,0 +0,0 @@ public abstract class BushBlock extends Block {
-     protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) {
          // CraftBukkit start
          if (!state.canSurvive(world, pos)) {
--            if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world, pos).isCancelled()) {
-+            if (!(world instanceof net.minecraft.server.level.ServerLevel && ((net.minecraft.server.level.ServerLevel) world).hasPhysicsEvent) || !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world, pos).isCancelled()) { // Paper
+             // Suppress during worldgen
+-            if (!(world instanceof Level world1) || !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world1, pos).isCancelled()) {
++            if (!(world instanceof net.minecraft.server.level.ServerLevel world1 && world1.hasPhysicsEvent) || !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world1, pos).isCancelled()) { // Paper
                  return Blocks.AIR.defaultBlockState();
              }
          }
diff --git a/patches/unapplied/server/Only-refresh-abilities-if-needed.patch b/patches/server/Only-refresh-abilities-if-needed.patch
similarity index 100%
rename from patches/unapplied/server/Only-refresh-abilities-if-needed.patch
rename to patches/server/Only-refresh-abilities-if-needed.patch
diff --git a/patches/unapplied/server/Optimize-DataBits.patch b/patches/server/Optimize-DataBits.patch
similarity index 100%
rename from patches/unapplied/server/Optimize-DataBits.patch
rename to patches/server/Optimize-DataBits.patch
diff --git a/patches/unapplied/server/Optimize-explosions.patch b/patches/server/Optimize-explosions.patch
similarity index 76%
rename from patches/unapplied/server/Optimize-explosions.patch
rename to patches/server/Optimize-explosions.patch
index f0551fd4e4..38d5f8aac2 100644
--- a/patches/unapplied/server/Optimize-explosions.patch
+++ b/patches/server/Optimize-explosions.patch
@@ -14,30 +14,43 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/server/MinecraftServer.java
 +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
 @@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- 
-             this.profiler.pop();
-             this.profiler.pop();
+         if (System.console() == null && System.getProperty("jline.terminal") == null) {
+             System.setProperty("jline.terminal", "jline.UnsupportedTerminal");
+             Main.useJline = false;
 +            worldserver.explosionDensityCache.clear(); // Paper - Optimize explosions
          }
  
-         this.profiler.popPush("connection");
-diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
+         try {
+diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/Explosion.java
-+++ b/src/main/java/net/minecraft/world/level/Explosion.java
-@@ -0,0 +0,0 @@ public class Explosion {
-                             // CraftBukkit end
-                         }
+--- a/src/main/java/net/minecraft/world/level/Level.java
++++ b/src/main/java/net/minecraft/world/level/Level.java
+@@ -0,0 +0,0 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+     private org.spigotmc.TickLimiter entityLimiter;
+     private org.spigotmc.TickLimiter tileLimiter;
+     private int tileTickPosition;
++    public final Map<ServerExplosion.CacheKey, Float> explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions
  
--                        double d12 = (1.0D - d7) * (double) Explosion.getSeenPercent(vec3d, entity) * (double) this.damageCalculator.getKnockbackMultiplier(entity);
-+                        double d12 = (1.0D - d7) * this.getBlockDensity(vec3d, entity) * (double) this.damageCalculator.getKnockbackMultiplier(entity); // Paper - Optimize explosions
-                         double d13;
+     public CraftWorld getWorld() {
+         return this.world;
+diff --git a/src/main/java/net/minecraft/world/level/ServerExplosion.java b/src/main/java/net/minecraft/world/level/ServerExplosion.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/ServerExplosion.java
++++ b/src/main/java/net/minecraft/world/level/ServerExplosion.java
+@@ -0,0 +0,0 @@ public class ServerExplosion implements Explosion {
+                         d3 /= d4;
+                         boolean flag = this.damageCalculator.shouldDamageEntity(this, entity);
+                         float f1 = this.damageCalculator.getKnockbackMultiplier(entity);
+-                        float f2 = !flag && f1 == 0.0F ? 0.0F : ServerExplosion.getSeenPercent(this.center, entity);
++                        float f2 = !flag && f1 == 0.0F ? 0.0F : this.getBlockDensity(this.center, entity); // Paper - Optimize explosions
  
-                         if (entity instanceof LivingEntity) {
-@@ -0,0 +0,0 @@ public class Explosion {
+                         if (flag) {
+                             // CraftBukkit start
+@@ -0,0 +0,0 @@ public class ServerExplosion implements Explosion {
  
-         private BlockInteraction() {}
+         }
      }
++
 +    // Paper start - Optimize explosions
 +    private float getBlockDensity(Vec3 vec3d, Entity entity) {
 +        if (!this.level.paperConfig().environment.optimizeExplosions) {
@@ -60,10 +73,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        private final double maxX, maxY, maxZ;
 +
 +        public CacheKey(Explosion explosion, AABB aabb) {
-+            this.world = explosion.level;
-+            this.posX = explosion.x;
-+            this.posY = explosion.y;
-+            this.posZ = explosion.z;
++            this.world = explosion.level();
++            this.posX = explosion.center().x;
++            this.posY = explosion.center().y;
++            this.posZ = explosion.center().z;
 +            this.minX = aabb.minX;
 +            this.minY = aabb.minY;
 +            this.minZ = aabb.minZ;
@@ -119,15 +132,3 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +    // Paper end
  }
-diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/Level.java
-+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -0,0 +0,0 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
-     private org.spigotmc.TickLimiter entityLimiter;
-     private org.spigotmc.TickLimiter tileLimiter;
-     private int tileTickPosition;
-+    public final Map<Explosion.CacheKey, Float> explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions
- 
-     public CraftWorld getWorld() {
-         return this.world;
diff --git a/patches/unapplied/server/Option-to-use-vanilla-per-world-scoreboard-coloring-.patch b/patches/server/Option-to-use-vanilla-per-world-scoreboard-coloring-.patch
similarity index 100%
rename from patches/unapplied/server/Option-to-use-vanilla-per-world-scoreboard-coloring-.patch
rename to patches/server/Option-to-use-vanilla-per-world-scoreboard-coloring-.patch
diff --git a/patches/unapplied/server/Optional-TNT-doesn-t-move-in-water.patch b/patches/server/Optional-TNT-doesn-t-move-in-water.patch
similarity index 74%
rename from patches/unapplied/server/Optional-TNT-doesn-t-move-in-water.patch
rename to patches/server/Optional-TNT-doesn-t-move-in-water.patch
index 8f1b42eb96..5d24d07f6f 100644
--- a/patches/unapplied/server/Optional-TNT-doesn-t-move-in-water.patch
+++ b/patches/server/Optional-TNT-doesn-t-move-in-water.patch
@@ -8,6 +8,17 @@ diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
 +++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
+@@ -0,0 +0,0 @@ public class PrimedTnt extends Entity implements TraceableEntity {
+ 
+     @Override
+     public void tick() {
+-        if (this.level().spigotConfig.maxTntTicksPerTick > 0 && ++this.level().spigotConfig.currentPrimedTnt > this.level().spigotConfig.maxTntTicksPerTick) { return; } // Spigot
++        if (this.level().spigotConfig.maxTntTicksPerTick > 0 && ++this.level().spigotConfig.currentPrimedTnt > this.level().spigotConfig.maxTntTicksPerTick) {
++            return;
++        } // Spigot
+         this.handlePortal();
+         this.applyGravity();
+         this.move(MoverType.SELF, this.getDeltaMovement());
 @@ -0,0 +0,0 @@ public class PrimedTnt extends Entity implements TraceableEntity {
              }
          }
@@ -19,7 +30,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +             */
 +            // Send position and velocity updates to nearby players on every tick while the TNT is in water.
 +            // This does pretty well at keeping their clients in sync with the server.
-+            net.minecraft.server.level.ChunkMap.TrackedEntity ete = ((net.minecraft.server.level.ServerLevel)this.level()).getChunkSource().chunkMap.entityMap.get(this.getId());
++            net.minecraft.server.level.ChunkMap.TrackedEntity ete = ((net.minecraft.server.level.ServerLevel) this.level()).getChunkSource().chunkMap.entityMap.get(this.getId());
 +            if (ete != null) {
 +                net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket velocityPacket = new net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket(this);
 +                net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket positionPacket = new net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket(this);
@@ -37,14 +48,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      private void explode() {
 @@ -0,0 +0,0 @@ public class PrimedTnt extends Entity implements TraceableEntity {
- 
          return entity;
      }
-+
+ 
 +    // Paper start - Option to prevent TNT from moving in water
-+    @Override
+     @Override
+-    public final boolean hurtServer(ServerLevel world, DamageSource source, float amount) {
+-        return false;
 +    public boolean isPushedByFluid() {
 +        return !level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid();
-+    }
+     }
 +    // Paper end - Option to prevent TNT from moving in water
  }
diff --git a/patches/unapplied/server/Player-Tab-List-and-Title-APIs.patch b/patches/server/Player-Tab-List-and-Title-APIs.patch
similarity index 100%
rename from patches/unapplied/server/Player-Tab-List-and-Title-APIs.patch
rename to patches/server/Player-Tab-List-and-Title-APIs.patch
diff --git a/patches/unapplied/server/Player-affects-spawning-API.patch b/patches/server/Player-affects-spawning-API.patch
similarity index 87%
rename from patches/unapplied/server/Player-affects-spawning-API.patch
rename to patches/server/Player-affects-spawning-API.patch
index aeb0c6b613..1be762e02d 100644
--- a/patches/unapplied/server/Player-affects-spawning-API.patch
+++ b/patches/server/Player-affects-spawning-API.patch
@@ -9,7 +9,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
 +++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
 @@ -0,0 +0,0 @@ public final class EntitySelector {
-     public static final Predicate<Entity> CAN_BE_COLLIDED_WITH = EntitySelector.NO_SPECTATORS.and(Entity::canBeCollidedWith);
+     public static final Predicate<Entity> CAN_BE_PICKED = EntitySelector.NO_SPECTATORS.and(Entity::isPickable);
  
      private EntitySelector() {}
 +    // Paper start - Affects Spawning API
@@ -51,27 +51,27 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
 +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
 @@ -0,0 +0,0 @@ public class Silverfish extends Monster {
-         if (checkAnyLightMonsterSpawnRules(type, world, spawnReason, pos, random)) {
+         } else {
              Player entityhuman = world.getNearestPlayer((double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, 5.0D, true);
  
 -            return entityhuman == null;
 +            return !(entityhuman != null && !entityhuman.affectsSpawning) && entityhuman == null; // Paper - Affects Spawning API
-         } else {
-             return false;
          }
+     }
+ 
 diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
 +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
 @@ -0,0 +0,0 @@ public class Zombie extends Monster {
  
-                     if (SpawnPlacements.isSpawnPositionOk(entitytypes, this.level(), blockposition) && SpawnPlacements.checkSpawnRules(entitytypes, worldserver, MobSpawnType.REINFORCEMENT, blockposition, this.level().random)) {
+                     if (SpawnPlacements.isSpawnPositionOk(entitytypes, world, blockposition) && SpawnPlacements.checkSpawnRules(entitytypes, world, EntitySpawnReason.REINFORCEMENT, blockposition, world.random)) {
                          entityzombie.setPos((double) i1, (double) j1, (double) k1);
--                        if (!this.level().hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) {
-+                        if (!this.level().hasNearbyAlivePlayerThatAffectsSpawning((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) { // Paper - Affects Spawning API
+-                        if (!world.hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && world.isUnobstructed(entityzombie) && world.noCollision((Entity) entityzombie) && (entityzombie.canSpawnInLiquids() || !world.containsAnyLiquid(entityzombie.getBoundingBox()))) {
++                        if (!world.hasNearbyAlivePlayerhasNearbyAlivePlayerThatAffectsSpawning((double) i1, (double) j1, (double) k1, 7.0D) && world.isUnobstructed(entityzombie) && world.noCollision((Entity) entityzombie) && (entityzombie.canSpawnInLiquids() || !world.containsAnyLiquid(entityzombie.getBoundingBox()))) { // Paper - affects spawning api
                              entityzombie.setTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit
-                             entityzombie.finalizeSpawn(worldserver, this.level().getCurrentDifficultyAt(entityzombie.blockPosition()), MobSpawnType.REINFORCEMENT, (SpawnGroupData) null);
-                             worldserver.addFreshEntityWithPassengers(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit
+                             entityzombie.finalizeSpawn(world, world.getCurrentDifficultyAt(entityzombie.blockPosition()), EntitySpawnReason.REINFORCEMENT, (SpawnGroupData) null);
+                             world.addFreshEntityWithPassengers(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit
 diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/player/Player.java
diff --git a/patches/unapplied/server/Prevent-block-entity-and-entity-crashes.patch b/patches/server/Prevent-block-entity-and-entity-crashes.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-block-entity-and-entity-crashes.patch
rename to patches/server/Prevent-block-entity-and-entity-crashes.patch
diff --git a/patches/unapplied/server/Remove-Metadata-on-reload.patch b/patches/server/Remove-Metadata-on-reload.patch
similarity index 100%
rename from patches/unapplied/server/Remove-Metadata-on-reload.patch
rename to patches/server/Remove-Metadata-on-reload.patch
diff --git a/patches/unapplied/server/Sanitise-RegionFileCache-and-make-configurable.patch b/patches/server/Sanitise-RegionFileCache-and-make-configurable.patch
similarity index 100%
rename from patches/unapplied/server/Sanitise-RegionFileCache-and-make-configurable.patch
rename to patches/server/Sanitise-RegionFileCache-and-make-configurable.patch
diff --git a/patches/unapplied/server/System-property-for-disabling-watchdoge.patch b/patches/server/System-property-for-disabling-watchdoge.patch
similarity index 100%
rename from patches/unapplied/server/System-property-for-disabling-watchdoge.patch
rename to patches/server/System-property-for-disabling-watchdoge.patch
diff --git a/patches/server/Timings-v2.patch b/patches/server/Timings-v2.patch
index 873a794690..4b4ff32c9a 100644
--- a/patches/server/Timings-v2.patch
+++ b/patches/server/Timings-v2.patch
@@ -1581,6 +1581,34 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              }
          }
      }
+diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/SerializableChunkData.java b/src/main/java/net/minecraft/world/level/chunk/storage/SerializableChunkData.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/chunk/storage/SerializableChunkData.java
++++ b/src/main/java/net/minecraft/world/level/chunk/storage/SerializableChunkData.java
+@@ -0,0 +0,0 @@ public record SerializableChunkData(Registry<Biome> biomeRegistry, ChunkPos chun
+     @Nullable
+     private static LevelChunk.PostLoadProcessor postLoadChunk(ServerLevel world, List<CompoundTag> entities, List<CompoundTag> blockEntities) {
+         return entities.isEmpty() && blockEntities.isEmpty() ? null : (chunk) -> {
+-            world.timings.syncChunkLoadEntitiesTimer.startTiming(); // Spigot
+             if (!entities.isEmpty()) {
+                 world.addLegacyChunkEntities(EntityType.loadEntitiesRecursive(entities, world, EntitySpawnReason.LOAD));
+             }
+-            world.timings.syncChunkLoadEntitiesTimer.stopTiming(); // Spigot
+ 
+             Iterator iterator = blockEntities.iterator();
+ 
+-            world.timings.syncChunkLoadTileEntitiesTimer.startTiming(); // Spigot
+             while (iterator.hasNext()) {
+                 CompoundTag nbttagcompound = (CompoundTag) iterator.next();
+                 boolean flag = nbttagcompound.getBoolean("keepPacked");
+@@ -0,0 +0,0 @@ public record SerializableChunkData(Registry<Biome> biomeRegistry, ChunkPos chun
+                     }
+                 }
+             }
+-            world.timings.syncChunkLoadTileEntitiesTimer.stopTiming(); // Spigot
+ 
+         };
+     }
 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
diff --git a/patches/unapplied/server/Use-UserCache-for-player-heads.patch b/patches/server/Use-UserCache-for-player-heads.patch
similarity index 100%
rename from patches/unapplied/server/Use-UserCache-for-player-heads.patch
rename to patches/server/Use-UserCache-for-player-heads.patch
diff --git a/patches/unapplied/server/Use-a-Shared-Random-for-Entities.patch b/patches/server/Use-a-Shared-Random-for-Entities.patch
similarity index 98%
rename from patches/unapplied/server/Use-a-Shared-Random-for-Entities.patch
rename to patches/server/Use-a-Shared-Random-for-Entities.patch
index fd590a9579..405723f727 100644
--- a/patches/unapplied/server/Use-a-Shared-Random-for-Entities.patch
+++ b/patches/server/Use-a-Shared-Random-for-Entities.patch
@@ -102,7 +102,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/ma
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java
 +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java
-@@ -0,0 +0,0 @@ public class Squid extends WaterAnimal {
+@@ -0,0 +0,0 @@ public class Squid extends AgeableWaterCreature {
  
      public Squid(EntityType<? extends Squid> type, Level world) {
          super(type, world);
diff --git a/patches/unapplied/server/Use-null-Locale-by-default.patch b/patches/server/Use-null-Locale-by-default.patch
similarity index 98%
rename from patches/unapplied/server/Use-null-Locale-by-default.patch
rename to patches/server/Use-null-Locale-by-default.patch
index 7a551ce206..99bc095d43 100644
--- a/patches/unapplied/server/Use-null-Locale-by-default.patch
+++ b/patches/server/Use-null-Locale-by-default.patch
@@ -18,8 +18,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      @Nullable
      private Vec3 startingToFallPosition;
 @@ -0,0 +0,0 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
+         this.canChatColor = true;
          this.lastActionTime = Util.getMillis();
-         this.recipeBook = new ServerRecipeBook();
          this.requestedViewDistance = 2;
 -        this.language = "en_us";
 +        this.language =  null; // Paper - default to null
diff --git a/patches/unapplied/server/handle-NaN-health-absorb-values-and-repair-bad-data.patch b/patches/server/handle-NaN-health-absorb-values-and-repair-bad-data.patch
similarity index 100%
rename from patches/unapplied/server/handle-NaN-health-absorb-values-and-repair-bad-data.patch
rename to patches/server/handle-NaN-health-absorb-values-and-repair-bad-data.patch
diff --git a/patches/unapplied/server/remove-null-possibility-for-getServer-singleton.patch b/patches/server/remove-null-possibility-for-getServer-singleton.patch
similarity index 95%
rename from patches/unapplied/server/remove-null-possibility-for-getServer-singleton.patch
rename to patches/server/remove-null-possibility-for-getServer-singleton.patch
index 56f257aa1d..a743fbc2bd 100644
--- a/patches/unapplied/server/remove-null-possibility-for-getServer-singleton.patch
+++ b/patches/server/remove-null-possibility-for-getServer-singleton.patch
@@ -11,7 +11,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
 @@ -0,0 +0,0 @@ import co.aikar.timings.MinecraftTimings; // Paper
  
- public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTask> implements ServerInfo, ChunkIOErrorReporter, CommandSource, AutoCloseable {
+ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTask> implements ServerInfo, ChunkIOErrorReporter, CommandSource {
  
 +    private static MinecraftServer SERVER; // Paper
      public static final Logger LOGGER = LogUtils.getLogger();
@@ -23,8 +23,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          super("Server");
 +        SERVER = this; // Paper - better singleton
          this.metricsRecorder = InactiveMetricsRecorder.INSTANCE;
-         this.profiler = this.metricsRecorder.getProfiler();
          this.onMetricsRecordingStopped = (methodprofilerresults) -> {
+             this.stopRecordingMetrics();
 @@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
          return false;
      }
diff --git a/patches/unapplied/server/Fix-lag-from-explosions-processing-dead-entities.patch b/patches/unapplied/server/Fix-lag-from-explosions-processing-dead-entities.patch
deleted file mode 100644
index 09dabeaadd..0000000000
--- a/patches/unapplied/server/Fix-lag-from-explosions-processing-dead-entities.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Iceee <andrew@opticgaming.tv>
-Date: Wed, 2 Mar 2016 01:39:52 -0600
-Subject: [PATCH] Fix lag from explosions processing dead entities
-
-
-diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/Explosion.java
-+++ b/src/main/java/net/minecraft/world/level/Explosion.java
-@@ -0,0 +0,0 @@ public class Explosion {
-         int i1 = Mth.floor(this.y + (double) f2 + 1.0D);
-         int j1 = Mth.floor(this.z - (double) f2 - 1.0D);
-         int k1 = Mth.floor(this.z + (double) f2 + 1.0D);
--        List<Entity> list = this.level.getEntities(this.source, new AABB((double) i, (double) l, (double) j1, (double) j, (double) i1, (double) k1));
-+        List<Entity> list = this.level.getEntities(this.source, new AABB((double) i, (double) l, (double) j1, (double) j, (double) i1, (double) k1), (com.google.common.base.Predicate<Entity>) entity -> entity.isAlive() && !entity.isSpectator()); // Paper - Fix lag from explosions processing dead entities
-         Vec3 vec3d = new Vec3(this.x, this.y, this.z);
-         Iterator iterator = list.iterator();
-