diff --git a/gradle.properties b/gradle.properties
index 8926da231..d438aa67b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -2,7 +2,7 @@ group = org.purpurmc.purpur
version = 1.20.4-R0.1-SNAPSHOT
mcVersion = 1.20.4
-paperCommit = de04cbced5441dfa9847b02ab28fe7c4b54f054c
+paperCommit = 0b952981e6e96157d2cea8322c04c0f69965f2bf
org.gradle.caching = true
org.gradle.parallel = true
diff --git a/patches/server/0005-Component-related-conveniences.patch b/patches/server/0005-Component-related-conveniences.patch
index e89c2bdd2..c415bd65f 100644
--- a/patches/server/0005-Component-related-conveniences.patch
+++ b/patches/server/0005-Component-related-conveniences.patch
@@ -81,10 +81,10 @@ index 25a5a3b949a0eb632611355e74ccd4865be108ca..14fcfd7c1d3a62833978e163f4e0d6f9
return this.type().msgId();
}
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 9abe817ae202edaa2d88cd59ae5c7db0b1c634be..37632d0c41149e6269fead808903765f0e59dbcc 100644
+index 0c46a4aeafd03fbbfd590b0362d41bf2b1d5ca74..b81ec809a0ba2462a9b5a212c0362a6b50d1bfbf 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -4130,6 +4130,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4125,6 +4125,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return SlotAccess.NULL;
}
diff --git a/patches/server/0006-Ridables.patch b/patches/server/0006-Ridables.patch
index 44f2f710a..6bd067d10 100644
--- a/patches/server/0006-Ridables.patch
+++ b/patches/server/0006-Ridables.patch
@@ -79,7 +79,7 @@ index 30ccbab1586a656e0ae41d7406525fb02d9e025b..bec249a47f1fbcabd6a121399d19d71e
if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) {
entity.getEntityData().resendPossiblyDesyncedEntity(player); // Paper - The entire mob gets deleted, so resend it.
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 37632d0c41149e6269fead808903765f0e59dbcc..eed3fa6b14b1e93f8d6571bba5675796e3418f49 100644
+index b81ec809a0ba2462a9b5a212c0362a6b50d1bfbf..3773ae61b9cb747dd33613990339d1e3f363138e 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -377,7 +377,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
@@ -91,7 +91,7 @@ index 37632d0c41149e6269fead808903765f0e59dbcc..eed3fa6b14b1e93f8d6571bba5675796
private float eyeHeight;
public boolean isInPowderSnow;
public boolean wasInPowderSnow;
-@@ -3001,6 +3001,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -2996,6 +2996,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.passengers = ImmutableList.copyOf(list);
}
@@ -105,7 +105,7 @@ index 37632d0c41149e6269fead808903765f0e59dbcc..eed3fa6b14b1e93f8d6571bba5675796
this.gameEvent(GameEvent.ENTITY_MOUNT, passenger);
}
}
-@@ -3041,6 +3048,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3036,6 +3043,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return false;
}
// Spigot end
@@ -120,7 +120,7 @@ index 37632d0c41149e6269fead808903765f0e59dbcc..eed3fa6b14b1e93f8d6571bba5675796
if (this.passengers.size() == 1 && this.passengers.get(0) == entity) {
this.passengers = ImmutableList.of();
} else {
-@@ -4930,4 +4945,44 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4925,4 +4940,44 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return ((net.minecraft.server.level.ServerChunkCache) level.getChunkSource()).isPositionTicking(this);
}
// Paper end
@@ -4375,7 +4375,7 @@ index cd964e5cded6a74cb9dcf27b4134f944764062cd..5d15c491034e2bd9c136935f5b266e2d
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java
-index 6f12e342adf1a008709fd9a4fbbbe1da8ec31b83..5a578ab80853f8961afeec2aae76ed521f486430 100644
+index 9063f66b0497a3eb3893e307e685be692cc5c128..5944ded9de9fac56136b30858fbf8236f8f6f555 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Spider.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java
@@ -53,14 +53,33 @@ public class Spider extends Monster {
diff --git a/patches/server/0052-Configurable-void-damage-height-and-damage.patch b/patches/server/0052-Configurable-void-damage-height-and-damage.patch
index e31f6d0a8..eb22d84fd 100644
--- a/patches/server/0052-Configurable-void-damage-height-and-damage.patch
+++ b/patches/server/0052-Configurable-void-damage-height-and-damage.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Configurable void damage height and damage
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index e664ca676c21b1c7fdc9df00797060053901e1f7..e5a66f96970446174d3a37f544611c9220faf91e 100644
+index 14318ffea715e7175f5d5d02a1fce84ff2f0ff80..ab1b3e634ab110e7f6cd98468e30b0b48367c25e 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -886,7 +886,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -885,7 +885,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public void checkBelowWorld() {
// Paper start - Configurable nether ceiling damage
diff --git a/patches/server/0053-Add-canSaveToDisk-to-Entity.patch b/patches/server/0053-Add-canSaveToDisk-to-Entity.patch
index 1c1028999..43bd30a08 100644
--- a/patches/server/0053-Add-canSaveToDisk-to-Entity.patch
+++ b/patches/server/0053-Add-canSaveToDisk-to-Entity.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add canSaveToDisk to Entity
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index e5a66f96970446174d3a37f544611c9220faf91e..39bf307e3fd3c5333192e132b4cb56355444eacc 100644
+index ab1b3e634ab110e7f6cd98468e30b0b48367c25e..bc59457a526232f7b962d3fb575d0678524eba0a 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -492,6 +492,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -491,6 +491,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return false;
}
diff --git a/patches/server/0082-Stop-squids-floating-on-top-of-water.patch b/patches/server/0082-Stop-squids-floating-on-top-of-water.patch
index 72926b934..8338b1296 100644
--- a/patches/server/0082-Stop-squids-floating-on-top-of-water.patch
+++ b/patches/server/0082-Stop-squids-floating-on-top-of-water.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Stop squids floating on top of water
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 39bf307e3fd3c5333192e132b4cb56355444eacc..d39d3980235a022ee79b20eb5ed63fd63cd27522 100644
+index bc59457a526232f7b962d3fb575d0678524eba0a..8f8a17180f8010a62af9b59faf035ec10bd8967a 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -4436,6 +4436,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4431,6 +4431,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.yRotO = this.getYRot();
}
diff --git a/patches/server/0084-Entities-can-use-portals-configuration.patch b/patches/server/0084-Entities-can-use-portals-configuration.patch
index 647dbbb6e..550c92359 100644
--- a/patches/server/0084-Entities-can-use-portals-configuration.patch
+++ b/patches/server/0084-Entities-can-use-portals-configuration.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entities can use portals configuration
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index d39d3980235a022ee79b20eb5ed63fd63cd27522..9907c10091b0f02c43cfd2d4b0d0953b91cbb070 100644
+index 8f8a17180f8010a62af9b59faf035ec10bd8967a..77ada6859c6fcc6929be5da350ac0f483dd1ae00 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3142,7 +3142,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3137,7 +3137,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public void handleInsidePortal(BlockPos pos) {
if (this.isOnPortalCooldown()) {
this.setPortalCooldown();
@@ -17,7 +17,7 @@ index d39d3980235a022ee79b20eb5ed63fd63cd27522..9907c10091b0f02c43cfd2d4b0d0953b
if (!this.level().isClientSide && !pos.equals(this.portalEntrancePos)) {
this.portalEntrancePos = pos.immutable();
}
-@@ -3851,7 +3851,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3846,7 +3846,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public boolean canChangeDimensions() {
diff --git a/patches/server/0124-Movement-options-for-armor-stands.patch b/patches/server/0124-Movement-options-for-armor-stands.patch
index 85f9bf338..062b6ae1d 100644
--- a/patches/server/0124-Movement-options-for-armor-stands.patch
+++ b/patches/server/0124-Movement-options-for-armor-stands.patch
@@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 9907c10091b0f02c43cfd2d4b0d0953b91cbb070..da036cb4be83301a22c9f5af9c7f1439a9347799 100644
+index 77ada6859c6fcc6929be5da350ac0f483dd1ae00..63c195ece6a96940bc059251bb40ab9129196fe1 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -1863,7 +1863,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1858,7 +1858,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return this.isInWater() || flag;
}
diff --git a/patches/server/0125-Fix-stuck-in-portals.patch b/patches/server/0125-Fix-stuck-in-portals.patch
index b67ed1e11..3d584387a 100644
--- a/patches/server/0125-Fix-stuck-in-portals.patch
+++ b/patches/server/0125-Fix-stuck-in-portals.patch
@@ -17,10 +17,10 @@ index 3349082af08600894fbca04533f9ab4a9bf2dfd9..c63502c452c3804fafe31fe4daf2aed8
// CraftBukkit end
this.setServerLevel(worldserver);
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index da036cb4be83301a22c9f5af9c7f1439a9347799..93c4f2ccf556a52e5bc951291f847f53d056c2b0 100644
+index 63c195ece6a96940bc059251bb40ab9129196fe1..1bf2960f34b120f258bc75bba6552c8b22ce9ed7 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3139,12 +3139,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3134,12 +3134,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return Vec3.directionFromRotation(this.getRotationVector());
}
diff --git a/patches/server/0145-Drowning-Settings.patch b/patches/server/0145-Drowning-Settings.patch
index 1af0a0ffd..376c73c21 100644
--- a/patches/server/0145-Drowning-Settings.patch
+++ b/patches/server/0145-Drowning-Settings.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Drowning Settings
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 93c4f2ccf556a52e5bc951291f847f53d056c2b0..f12ad902b6add41ffd9aff19081ce4abf998effb 100644
+index 1bf2960f34b120f258bc75bba6552c8b22ce9ed7..c45e7caa0ecbeaa1b37f722abba2884a6148ca20 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3388,7 +3388,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3383,7 +3383,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public int getMaxAirSupply() {
diff --git a/patches/server/0171-API-for-any-mob-to-burn-daylight.patch b/patches/server/0171-API-for-any-mob-to-burn-daylight.patch
index c1a45a985..415dea862 100644
--- a/patches/server/0171-API-for-any-mob-to-burn-daylight.patch
+++ b/patches/server/0171-API-for-any-mob-to-burn-daylight.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] API for any mob to burn daylight
Co-authored by: Encode42
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index f8851857bdaeb1173124f43ee0eb3bd845789467..942359c28d9ced02b737b712f4e83e844424afc0 100644
+index c45e7caa0ecbeaa1b37f722abba2884a6148ca20..01bf0886d8196ec0a09e7b399636874bb8e6baa9 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -496,6 +496,21 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -495,6 +495,21 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return true;
}
diff --git a/patches/server/0175-Add-toggle-for-end-portal-safe-teleporting.patch b/patches/server/0175-Add-toggle-for-end-portal-safe-teleporting.patch
index fb89df9b6..44d1b2f1d 100644
--- a/patches/server/0175-Add-toggle-for-end-portal-safe-teleporting.patch
+++ b/patches/server/0175-Add-toggle-for-end-portal-safe-teleporting.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add toggle for end portal safe teleporting
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 1ed6072672d0585fa7609b9709b7c4b876a0f7fe..c9dafb8ca9267bea2449bb92ab5808af453ad2b1 100644
+index 01bf0886d8196ec0a09e7b399636874bb8e6baa9..e0a3c7e23ebf6b8994d82964dd38cc8342e81aa3 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3213,7 +3213,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3208,7 +3208,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
this.processPortalCooldown();
diff --git a/patches/server/0260-Add-toggle-for-RNG-manipulation.patch b/patches/server/0260-Add-toggle-for-RNG-manipulation.patch
index 8e300d86b..9cba5076f 100644
--- a/patches/server/0260-Add-toggle-for-RNG-manipulation.patch
+++ b/patches/server/0260-Add-toggle-for-RNG-manipulation.patch
@@ -7,10 +7,10 @@ Paper patches RNG maniplulation by using a shared (and locked) random source.
This comes with a performance gain, but technical players may prefer the ability to manipulate RNG.
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index c9dafb8ca9267bea2449bb92ab5808af453ad2b1..61aaf79bb631c37680d04168519a4e2e6af1ccc0 100644
+index e0a3c7e23ebf6b8994d82964dd38cc8342e81aa3..24365907591a7e35fff0bc64a1f00e6e907c3bb7 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -593,7 +593,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -592,7 +592,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.bb = Entity.INITIAL_AABB;
this.stuckSpeedMultiplier = Vec3.ZERO;
this.nextStep = 1.0F;
@@ -33,7 +33,7 @@ index 88c238e492b1081d1a64a3b6f05d7baa17e5d8c9..dd7f2beabf0edad4143ac2365ac04a22
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 601452f16c7f41b609cc13026386d6f5d06ac92e..4e8c250a1c41c82dbfbae69e8d48b4604d63139b 100644
+index a1c95d2a69a8eaedefa90e689d5ce1636648fd1e..81a758847405ca2a4770da8120a9f837662bc3f7 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -204,9 +204,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0264-Remove-Mojang-Profiler.patch b/patches/server/0264-Remove-Mojang-Profiler.patch
index a32fc0583..30c1f5fad 100644
--- a/patches/server/0264-Remove-Mojang-Profiler.patch
+++ b/patches/server/0264-Remove-Mojang-Profiler.patch
@@ -1088,10 +1088,10 @@ index 2e6e8eac987c4ef6b2dcd3de592d8a51d2b29792..863343a87fe34d72f04af89d75268b47
};
}
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834dd69d1d0e 100644
+index 24365907591a7e35fff0bc64a1f00e6e907c3bb7..b45064a92674a4c48350c466b8131bf1ffae4335 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -835,7 +835,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -834,7 +834,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
// CraftBukkit end
public void baseTick() {
@@ -1100,7 +1100,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Update last hurt when ticking
this.feetBlockState = null;
if (this.isPassenger() && this.getVehicle().isRemoved()) {
-@@ -896,7 +896,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -895,7 +895,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
this.firstTick = false;
@@ -1109,7 +1109,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
}
public void setSharedFlagOnFire(boolean onFire) {
-@@ -1115,7 +1115,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1114,7 +1114,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
}
@@ -1118,7 +1118,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7D) {
movement = movement.multiply(this.stuckSpeedMultiplier);
this.stuckSpeedMultiplier = Vec3.ZERO;
-@@ -1124,7 +1124,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1123,7 +1123,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
// Paper start - ignore movement changes while inactive.
if (isTemporarilyActive && !(this instanceof ItemEntity || this instanceof net.minecraft.world.entity.vehicle.AbstractMinecart) && movement == getDeltaMovement() && movementType == MoverType.SELF) {
setDeltaMovement(Vec3.ZERO);
@@ -1127,7 +1127,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
return;
}
// Paper end
-@@ -1145,8 +1145,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1144,8 +1144,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.setPos(this.getX() + vec3d1.x, this.getY() + vec3d1.y, this.getZ() + vec3d1.z);
}
@@ -1138,7 +1138,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
boolean flag = !Mth.equal(movement.x, vec3d1.x);
boolean flag1 = !Mth.equal(movement.z, vec3d1.z);
-@@ -1165,7 +1165,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1164,7 +1164,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.checkFallDamage(vec3d1.y, this.onGround(), iblockdata, blockposition);
if (this.isRemoved()) {
@@ -1147,7 +1147,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
} else {
if (this.horizontalCollision) {
Vec3 vec3d2 = this.getDeltaMovement();
-@@ -1303,7 +1303,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1302,7 +1302,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.setRemainingFireTicks(-this.getFireImmuneTicks());
}
@@ -1156,7 +1156,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
}
}
// Paper start - detailed watchdog information
-@@ -3180,7 +3180,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3175,7 +3175,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
ServerLevel worldserver1 = minecraftserver.getLevel(resourcekey);
if (true && !this.isPassenger() && this.portalTime++ >= i) { // CraftBukkit
@@ -1165,7 +1165,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
this.portalTime = i;
// Paper start
io.papermc.paper.event.entity.EntityPortalReadyEvent event = new io.papermc.paper.event.entity.EntityPortalReadyEvent(this.getBukkitEntity(), worldserver1 == null ? null : worldserver1.getWorld(), org.bukkit.PortalType.NETHER);
-@@ -3198,7 +3198,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3193,7 +3193,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
} // Paper
// CraftBukkit end
@@ -1174,7 +1174,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
}
this.isInsidePortal = false;
-@@ -3673,14 +3673,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3668,14 +3668,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
// Paper end
if (this.level() instanceof ServerLevel && !this.isRemoved()) {
@@ -1191,7 +1191,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
PortalInfo shapedetectorshape = (location == null) ? this.findDimensionEntryPoint(worldserver) : new PortalInfo(new Vec3(location.x(), location.y(), location.z()), Vec3.ZERO, this.yRot, this.xRot, worldserver, null); // CraftBukkit
if (shapedetectorshape == null) {
-@@ -3719,7 +3719,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3714,7 +3714,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.unRide();
// CraftBukkit end
@@ -1200,7 +1200,7 @@ index c2dd8373108d46bfdba2bc1fea7c60ce02a303e4..381ca3207b4d7b7ca3b30e0ba2d0834d
// Paper start - Change lead drop timing to prevent dupe
if (this instanceof Mob) {
((Mob) this).dropLeash(true, true); // Paper drop lead
-@@ -3746,10 +3746,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3741,10 +3741,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
this.removeAfterChangingDimensions();
diff --git a/patches/server/0282-Fire-Immunity-API.patch b/patches/server/0282-Fire-Immunity-API.patch
index 81bf22fbc..9f1e8ccb7 100644
--- a/patches/server/0282-Fire-Immunity-API.patch
+++ b/patches/server/0282-Fire-Immunity-API.patch
@@ -5,18 +5,18 @@ Subject: [PATCH] Fire Immunity API
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 381ca3207b4d7b7ca3b30e0ba2d0834dd69d1d0e..51f83ee4f617c0dbe40ef9fa1d2f5e49e68e37bb 100644
+index b45064a92674a4c48350c466b8131bf1ffae4335..1e2308ecde7bef57ac0b6192b8362cbcd58e6725 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -423,6 +423,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -422,6 +422,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+ private UUID originWorld;
public boolean freezeLocked = false; // Paper - Freeze Tick Lock API
- public boolean collidingWithWorldBorder; // Paper
public boolean fixedPose = false; // Paper
+ public @Nullable Boolean immuneToFire = null; // Purpur - Fire immune API
public void setOrigin(@javax.annotation.Nonnull Location location) {
this.origin = location.toVector();
-@@ -1805,7 +1806,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1800,7 +1801,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public boolean fireImmune() {
@@ -25,7 +25,7 @@ index 381ca3207b4d7b7ca3b30e0ba2d0834dd69d1d0e..51f83ee4f617c0dbe40ef9fa1d2f5e49
}
public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
-@@ -2497,6 +2498,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -2492,6 +2493,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
nbttagcompound.putBoolean("Paper.FreezeLock", true);
}
// Paper end
@@ -37,7 +37,7 @@ index 381ca3207b4d7b7ca3b30e0ba2d0834dd69d1d0e..51f83ee4f617c0dbe40ef9fa1d2f5e49
return nbttagcompound;
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT");
-@@ -2644,6 +2650,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -2639,6 +2645,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
freezeLocked = nbt.getBoolean("Paper.FreezeLock");
}
// Paper end
diff --git a/patches/server/0283-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch b/patches/server/0283-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch
index 82885415c..2ed346c9e 100644
--- a/patches/server/0283-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch
+++ b/patches/server/0283-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add option to teleport to spawn on nether ceiling damage
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 9c7a84874df50ba675a6a480086336e0c137424f..b38b39bbf6560af368780a305559668a9d8f808b 100644
+index 1e2308ecde7bef57ac0b6192b8362cbcd58e6725..b21dd27e77632435ea53b48861fe16ee03d5ba06 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -910,6 +910,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -909,6 +909,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
&& this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v)
&& (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
// Paper end
@@ -17,7 +17,7 @@ index 9c7a84874df50ba675a6a480086336e0c137424f..b38b39bbf6560af368780a305559668a
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 52108909cbe0ea7faa0032f985898c41084cac10..0e25bfd7b345c3ba578191ce6656f041ffb9fd05 100644
+index 39726c991874b631545e0a06fa5b06383e7b7115..7234603063091d3999f71e5d7781c6468665c8f3 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -417,6 +417,7 @@ public class PurpurWorldConfig {