diff --git a/gradle.properties b/gradle.properties
index abb60014c..0be6c994b 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 = 94807a1d2e74b26b1a3154974d4024daa4c95f51
+paperCommit = 27cabc19a02e054276b58bfe0a40fc0add14d25e
org.gradle.caching = true
org.gradle.parallel = true
diff --git a/patches/server/0001-Pufferfish-Server-Changes.patch b/patches/server/0001-Pufferfish-Server-Changes.patch
index c878e01ed..9c586a8a4 100644
--- a/patches/server/0001-Pufferfish-Server-Changes.patch
+++ b/patches/server/0001-Pufferfish-Server-Changes.patch
@@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
diff --git a/build.gradle.kts b/build.gradle.kts
-index 444ff797c70b0e285d4272ea2ce3d72453c9bda5..fd785a79b1708aadd760f5b62d49d4d4e55e9938 100644
+index 376e8983fdfdbb6c3e5fd8ad0f6a05e655b622bf..658e9b4590a82d179907feea04e129fdba9a2f42 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -13,8 +13,12 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) {
@@ -625,10 +625,10 @@ index 0000000000000000000000000000000000000000..020368da69b9a492155f6de6297f7473
+}
diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
new file mode 100644
-index 0000000000000000000000000000000000000000..61f21c0bf6658326a15b735c22001b4028b98800
+index 0000000000000000000000000000000000000000..ad368b58005b6b0453b709c2ef0ea23bca53d34a
--- /dev/null
+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
-@@ -0,0 +1,315 @@
+@@ -0,0 +1,301 @@
+package gg.pufferfish.pufferfish;
+
+import gg.pufferfish.pufferfish.simd.SIMDDetection;
@@ -819,20 +819,6 @@ index 0000000000000000000000000000000000000000..61f21c0bf6658326a15b735c22001b40
+ "an attempt to maintain 20 TPS. This option (defaults to true per",
+ "spigot/paper) can cause mobs to move fast after a lag spike.");
+ }
-+
-+ public static boolean enableAsyncWorldSaving;
-+ public static boolean asyncWorldSavingInitialized;
-+ private static void asyncWorldSaving() {
-+ boolean temp = getBoolean("enable-async-world-saving", false,
-+ "Save world changes asynchronously. This is disabled by default as it is not",
-+ "100% confident that this will not cause world corruption issues.");
-+
-+ // This prevents us from changing the value during a reload.
-+ if (!asyncWorldSavingInitialized) {
-+ asyncWorldSavingInitialized = true;
-+ enableAsyncWorldSaving = temp;
-+ }
-+ }
+
+ public static boolean enableSuffocationOptimization;
+ private static void suffocationOptimization() {
@@ -935,13 +921,13 @@ index 0000000000000000000000000000000000000000..61f21c0bf6658326a15b735c22001b40
+ "the ender dragon whenever a player places an end crystal.");
+ }
+
-+ public static boolean disableMethodProfiler;
++ public static boolean disableMethodProfiler;
+ public static boolean disableOutOfOrderChat;
-+ private static void miscSettings() {
++ private static void miscSettings() {
+ disableMethodProfiler = getBoolean("misc.disable-method-profiler", true);
+ disableOutOfOrderChat = getBoolean("misc.disable-out-of-order-chat", false);
-+ setComment("misc", "Settings for things that don't belong elsewhere");
-+ }
++ setComment("misc", "Settings for things that don't belong elsewhere");
++ }
+
+}
diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java
@@ -1498,20 +1484,20 @@ index 200ed770b57e1a9240abf0473968d4b85cbefe3c..0acc7cfc0fb0264dd76a58f7582e79d8
public static long getCoordinateKey(final ChunkPos pair) {
diff --git a/src/main/java/net/minecraft/network/chat/SignedMessageChain.java b/src/main/java/net/minecraft/network/chat/SignedMessageChain.java
-index 85a8a687b1568a56e3e646b37ef78b562c1b8a82..69971b2c59e541ac4100b84c84e2972de1b44ca9 100644
+index ba12919c3f9aec34a9e64993b143ae92be5eb172..9efeab9078e2d08903e482718b840797e22ab1c2 100644
--- a/src/main/java/net/minecraft/network/chat/SignedMessageChain.java
+++ b/src/main/java/net/minecraft/network/chat/SignedMessageChain.java
@@ -38,7 +38,7 @@ public class SignedMessageChain {
throw new SignedMessageChain.DecodeException(Component.translatable("chat.disabled.chain_broken"), false); // Paper - diff on change (if disconnects, need a new kick event cause)
} else if (playerPublicKey.data().hasExpired()) {
- throw new SignedMessageChain.DecodeException(Component.translatable("chat.disabled.expiredProfileKey", org.bukkit.event.player.PlayerKickEvent.Cause.EXPIRED_PROFILE_PUBLIC_KEY), false); // Paper - kick event causes
+ throw new SignedMessageChain.DecodeException(Component.translatable("chat.disabled.expiredProfileKey"), false, org.bukkit.event.player.PlayerKickEvent.Cause.EXPIRED_PROFILE_PUBLIC_KEY); // Paper - kick event causes
- } else if (body.timeStamp().isBefore(this.lastTimeStamp)) {
+ } else if (!gg.pufferfish.pufferfish.PufferfishConfig.disableOutOfOrderChat && body.timeStamp().isBefore(this.lastTimeStamp)) { // Pufferfish
- throw new SignedMessageChain.DecodeException(Component.translatable("multiplayer.disconnect.out_of_order_chat", org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT), true); // Paper - kick event causes
+ throw new SignedMessageChain.DecodeException(Component.translatable("multiplayer.disconnect.out_of_order_chat"), true, org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT); // Paper - kick event causes
} else {
this.lastTimeStamp = body.timeStamp();
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 016b7628b289fb882f3ec15dd5b0cb4e0af72edc..1343649cd77a42dd502747581050b401840a6efe 100644
+index ec1197e498d0fa8d58466b8dffe46fb0683b530c..771a9c9f4c39fdfac26ee62db2a9cdcf15d9e1a6 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -314,6 +314,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop chunkConsumer) {
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
-index b6e5a2fa247bdee2f681739a26630dff3fc6c51a..e385a62058204ba3b01ce594e7c180f9cc6cf664 100644
+index ae188ae314336d971303023c7b7b8ecf32bae253..79914528f6d255355284b04253218a7c4dec1ead 100644
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
-@@ -177,7 +177,8 @@ public class ServerEntity {
+@@ -183,7 +183,8 @@ public class ServerEntity {
long i1 = this.positionCodec.encodeZ(vec3d);
boolean flag6 = k < -32768L || k > 32767L || l < -32768L || l > 32767L || i1 < -32768L || i1 > 32767L;
@@ -1744,7 +1730,7 @@ index b6e5a2fa247bdee2f681739a26630dff3fc6c51a..e385a62058204ba3b01ce594e7c180f9
if ((!flag2 || !flag3) && !(this.entity instanceof AbstractArrow)) {
if (flag2) {
packet1 = new ClientboundMoveEntityPacket.Pos(this.entity.getId(), (short) ((int) k), (short) ((int) l), (short) ((int) i1), this.entity.onGround());
-@@ -191,6 +192,7 @@ public class ServerEntity {
+@@ -197,6 +198,7 @@ public class ServerEntity {
flag4 = true;
flag5 = true;
}
@@ -1753,10 +1739,10 @@ index b6e5a2fa247bdee2f681739a26630dff3fc6c51a..e385a62058204ba3b01ce594e7c180f9
this.wasOnGround = this.entity.onGround();
this.teleportDelay = 0;
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index e0dae41eb94da08649cba607975798dc2ac328ad..f7215d0a67e9e024af0c040c796ebcbb4f76e885 100644
+index 7a327afc8c08dfb94e66595b015887c6d0018c37..e387de54c9786711272f0ec3f8d312e472a9c4ea 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -899,6 +899,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -894,6 +894,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
org.spigotmc.ActivationRange.activateEntities(this); // Spigot
this.timings.entityTick.startTiming(); // Spigot
this.entityTickList.forEach((entity) -> {
@@ -1764,7 +1750,7 @@ index e0dae41eb94da08649cba607975798dc2ac328ad..f7215d0a67e9e024af0c040c796ebcbb
if (!entity.isRemoved()) {
if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed
entity.discard();
-@@ -918,7 +919,20 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -913,7 +914,20 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
gameprofilerfiller.push("tick");
@@ -1786,7 +1772,7 @@ index e0dae41eb94da08649cba607975798dc2ac328ad..f7215d0a67e9e024af0c040c796ebcbb
gameprofilerfiller.pop();
}
}
-@@ -983,9 +997,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -978,9 +992,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
// Paper start - optimise random block ticking
private final BlockPos.MutableBlockPos chunkTickMutablePosition = new BlockPos.MutableBlockPos();
@@ -1799,7 +1785,7 @@ index e0dae41eb94da08649cba607975798dc2ac328ad..f7215d0a67e9e024af0c040c796ebcbb
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
ChunkPos chunkcoordintpair = chunk.getPos();
boolean flag = this.isRaining();
-@@ -996,7 +1012,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -991,7 +1007,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
gameprofilerfiller.push("thunder");
final BlockPos.MutableBlockPos blockposition = this.chunkTickMutablePosition; // Paper - use mutable to reduce allocation rate, final to force compile fail on change
@@ -1808,64 +1794,18 @@ index e0dae41eb94da08649cba607975798dc2ac328ad..f7215d0a67e9e024af0c040c796ebcbb
blockposition.set(this.findLightningTargetAround(this.getBlockRandomPos(j, 0, k, 15))); // Paper
if (this.isRainingAt(blockposition)) {
-@@ -1491,7 +1507,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
-
- try (co.aikar.timings.Timing ignored = this.timings.worldSave.startTiming()) {
- if (doFull) {
-- this.saveLevelData();
-+ this.saveLevelData(true); // Pufferfish
- }
-
- this.timings.worldSaveChunks.startTiming(); // Paper
-@@ -1527,7 +1543,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
- progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel"));
- }
-
-- this.saveLevelData();
-+ this.saveLevelData(!close); // Pufferfish
- if (progressListener != null) {
- progressListener.progressStage(Component.translatable("menu.savingChunks"));
- }
-@@ -1550,12 +1566,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
- // CraftBukkit end
- }
-
-- private void saveLevelData() {
-+ private void saveLevelData(boolean async) { // Pufferfish
- if (this.dragonFight != null) {
- this.serverLevelData.setEndDragonFightData(this.dragonFight.saveData()); // CraftBukkit
- }
-
-- this.getChunkSource().getDataStorage().save();
-+ this.getChunkSource().getDataStorage().save(async); // Pufferfish
- }
-
- public List extends T> getEntities(EntityTypeTest filter, Predicate super T> predicate) {
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 8568de90c39838e1627f286c5c3ca4b0f19002cb..04b0eb391bb524dd7af14b862d89c0f2494a8206 100644
+index 5234d3dcb60d84f65621713b57bea034038af2a5..b5917417aaed74555917772650fe51485281c2ec 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1124,6 +1124,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1121,6 +1121,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@Override
public void handleEditBook(ServerboundEditBookPacket packet) {
+ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableBooks && !this.player.getBukkitEntity().hasPermission("pufferfish.usebooks")) return; // Pufferfish
- // Paper start
+ // Paper start - Book size limits
if (!this.cserver.isPrimaryThread()) {
List pageList = packet.getPages();
-diff --git a/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java b/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java
-index f2a7cb6ebed7a4b4019a09af2a025f624f6fe9c9..47636aad5fa20d1c28d3520beb0729df9b30cf6c 100644
---- a/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java
-+++ b/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java
-@@ -224,7 +224,7 @@ public class WorldUpgrader {
- }
- }
-
-- this.overworldDataStorage.save();
-+ this.overworldDataStorage.save(false); // Pufferfish
- i = Util.getMillis() - i;
- WorldUpgrader.LOGGER.info("World optimizaton finished after {} ms", i);
- this.finished = true;
diff --git a/src/main/java/net/minecraft/world/CompoundContainer.java b/src/main/java/net/minecraft/world/CompoundContainer.java
index 241fec02e6869c638d3a160819b32173a081467b..6a8f9e8f5bf108674c47018def28906e2d0a729c 100644
--- a/src/main/java/net/minecraft/world/CompoundContainer.java
@@ -1979,10 +1919,10 @@ index d6cbe98e67fdbf8db46338a88ab1356dd63b50a3..20dd3a63b2f955b05a75eb240e33ae4c
int LARGE_MAX_STACK_SIZE = 64;
int DEFAULT_DISTANCE_LIMIT = 8;
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 14fbaef2215f7de4acb5303ad6f677b348f855d8..a8d8d261daed2ebbbea3f4f356434942997ba541 100644
+index 1a19f18b5d4c42ac07e7e4f305e140954dea481b..7a50a1fe485de232abb9d626e8001eee78a33b1b 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -309,7 +309,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -308,7 +308,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public double yo;
public double zo;
private Vec3 position;
@@ -1991,7 +1931,7 @@ index 14fbaef2215f7de4acb5303ad6f677b348f855d8..a8d8d261daed2ebbbea3f4f356434942
private ChunkPos chunkPosition;
private Vec3 deltaMovement;
private float yRot;
-@@ -440,6 +440,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -439,6 +439,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return this.originWorld;
}
// Paper end
@@ -2004,7 +1944,7 @@ index 14fbaef2215f7de4acb5303ad6f677b348f855d8..a8d8d261daed2ebbbea3f4f356434942
public float getBukkitYaw() {
return this.yRot;
}
-@@ -808,6 +814,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -807,6 +813,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public void tick() {
@@ -2017,7 +1957,7 @@ index 14fbaef2215f7de4acb5303ad6f677b348f855d8..a8d8d261daed2ebbbea3f4f356434942
this.baseTick();
}
-@@ -4410,16 +4422,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4407,16 +4419,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) {
@@ -2043,7 +1983,7 @@ index 14fbaef2215f7de4acb5303ad6f677b348f855d8..a8d8d261daed2ebbbea3f4f356434942
double d1 = 0.0D;
boolean flag = this.isPushedByFluid();
boolean flag1 = false;
-@@ -4427,14 +4441,61 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4424,14 +4438,61 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
int k1 = 0;
BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos();
@@ -2111,7 +2051,7 @@ index 14fbaef2215f7de4acb5303ad6f677b348f855d8..a8d8d261daed2ebbbea3f4f356434942
if (d2 >= axisalignedbb.minY) {
flag1 = true;
-@@ -4456,9 +4517,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4453,9 +4514,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
// CraftBukkit end
}
}
@@ -2125,7 +2065,7 @@ index 14fbaef2215f7de4acb5303ad6f677b348f855d8..a8d8d261daed2ebbbea3f4f356434942
if (vec3d.length() > 0.0D) {
if (k1 > 0) {
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
-index 081937597a8984b52a1e92d4c6032c04c942116e..0ffd377dba738bd651b0c7f5ca0a0d61aaa1d82c 100644
+index e52f3da3b63cc3dba59d3e874a8420dd312b5e96..f772f7c4cd41ec52bea53d619b5b953971825df0 100644
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
@@ -305,6 +305,8 @@ public class EntityType implements FeatureElement, EntityTypeT
@@ -2138,7 +2078,7 @@ index 081937597a8984b52a1e92d4c6032c04c942116e..0ffd377dba738bd651b0c7f5ca0a0d61
private String descriptionId;
@Nullable
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 4cbb1f5d904191e59395df0177e76e94faae764c..9b7e786d5ae6bdeeb96df6e9c4d1b24e1e856e58 100644
+index 5e2f6a1cdaf83468c0db6a2cc8fefb71e6ec51d8..370033cb058a20a83f80b8e2618e419bb3fd97cf 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -142,7 +142,6 @@ import org.bukkit.event.entity.EntityTeleportEvent;
@@ -2200,7 +2140,7 @@ index 4cbb1f5d904191e59395df0177e76e94faae764c..9b7e786d5ae6bdeeb96df6e9c4d1b24e
if (this.isSpectator()) {
return false;
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 0b5334004b9d0489e8465824870662b467ce321b..2f3dc569ff9cdead48aa831c96c027cc7255d609 100644
+index 3ebf777811cba0cc45cfae7587b277f06adeb045..4e3d48f6af493f2cded599f51ad5d2cd07e252f2 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -221,14 +221,16 @@ public abstract class Mob extends LivingEntity implements Targeting {
@@ -2244,7 +2184,7 @@ index 0b5334004b9d0489e8465824870662b467ce321b..2f3dc569ff9cdead48aa831c96c027cc
this.level().getProfiler().pop();
}
diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java
-index 7204b973c3ad9239e82355513f6d538107102e48..3087f8359b098682a345399c85395de8a15b6eed 100644
+index 897d7632ecfea40890433474870dd7a5e534d8ab..683c9693754d1a87b7e8fccc757a0d0963351f60 100644
--- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java
+++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java
@@ -23,9 +23,11 @@ public class AttributeMap {
@@ -2310,19 +2250,19 @@ index b738ee2d3801fadfd09313f05ae24593e56b0ec6..1635818fc4b1788c0d397085239df6dd
public boolean hasTasks() {
for (WrappedGoal task : this.availableGoals) {
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java
-index 4bbc36404b396500df0d9db380cf223b5897662e..382e9d18b81bcbeb20cb3b828b66260f07a845e6 100644
+index 07519c817cc6de04a98198c43a0c2b02ba3141eb..ee66be6e5aa45ec8448b6d30785a6e71200b09e3 100644
--- a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java
-@@ -119,6 +119,7 @@ public abstract class MoveToBlockGoal extends Goal {
+@@ -120,6 +120,7 @@ public abstract class MoveToBlockGoal extends Goal {
for(int m = 0; m <= l; m = m > 0 ? -m : 1 - m) {
for(int n = m < l && m > -l ? l : 0; n <= l; n = n > 0 ? -n : 1 - n) {
mutableBlockPos.setWithOffset(blockPos, m, k - 1, n);
+ if (!this.mob.level().hasChunkAt(mutableBlockPos)) continue; // Pufferfish - if this block isn't loaded, continue
if (this.mob.isWithinRestriction(mutableBlockPos) && this.isValidTarget(this.mob.level(), mutableBlockPos)) {
this.blockPos = mutableBlockPos;
- setTargetPosition(mutableBlockPos.immutable()); // Paper
+ this.mob.movingTarget = mutableBlockPos == BlockPos.ZERO ? null : mutableBlockPos.immutable(); // Paper
diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java
-index c157309ac78e7af084d3acb6e8b2bcd469a39d5e..ac5e5676b194a2a99e5cf53eb89c1152cac963b8 100644
+index c8a80c1b2fedff22e8a877d466062375ffb2f0d7..3c4f4af85a3f2d4f9f52827164e63727b916c33a 100644
--- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java
+++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java
@@ -75,9 +75,18 @@ public class TargetingConditions {
@@ -2330,7 +2270,7 @@ index c157309ac78e7af084d3acb6e8b2bcd469a39d5e..ac5e5676b194a2a99e5cf53eb89c1152
if (this.range > 0.0D) {
- double d = this.testInvisible ? targetEntity.getVisibilityPercent(baseEntity) : 1.0D;
-- double e = Math.max((this.useFollowRange ? this.getFollowRange(baseEntity) : this.range) * d, 2.0D); // Paper
+- double e = Math.max((this.useFollowRange ? this.getFollowRange(baseEntity) : this.range) * d, 2.0D); // Paper - Fix MC-145656
+ // Pufferfish start - check range before getting visibility
+ // d = invisibility percent, e = follow range adjusted for invisibility, f = distance
double f = baseEntity.distanceToSqr(targetEntity.getX(), targetEntity.getY(), targetEntity.getZ());
@@ -2347,7 +2287,7 @@ index c157309ac78e7af084d3acb6e8b2bcd469a39d5e..ac5e5676b194a2a99e5cf53eb89c1152
return false;
}
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
-index 6b614818b14ecfc8fc82b523eeb7e21fdf9bf1ba..8820905ac733a8915cc1697259b2bef14d97e471 100644
+index 44fa2d4f90389f5526746bd94a2450c03340bd0b..4fba7c2f6ec363846a772ef2a63e9b3fc1037de5 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
@@ -241,13 +241,22 @@ public class Bat extends AmbientCreature {
@@ -2391,7 +2331,7 @@ index 5ad5f22e5aa26445e5eb229958e7bf356bdd460e..d241ca4d0295f9fce39c11197bd435cf
this.level().getProfiler().pop();
this.level().getProfiler().push("allayActivityUpdate");
diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java
-index 387006271c246362b0df1bfcadca7b7096660003..9158c5a507904c46a8fe2fdad9a0b6ba3a9b2460 100644
+index b21e180641d17438997a80e5bcb0ec7998d24a2e..33c160994f70f71446d665e7487913437c9f9db4 100644
--- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java
+++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java
@@ -275,9 +275,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getTypeKey();
+
@@ -2773,7 +2713,7 @@ index b05e11e6b091c7616df5a9bbef867b06cafe3dc3..2902c29cd7f0b99b84cff3664fc4ec15
protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config; Async-Anti-Xray: Pass executor
this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot
-@@ -1318,13 +1320,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1317,13 +1319,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
try {
tickConsumer.accept(entity);
MinecraftServer.getServer().executeMidTickTasks(); // Paper - execute chunk tasks mid tick
@@ -2789,7 +2729,7 @@ index b05e11e6b091c7616df5a9bbef867b06cafe3dc3..2902c29cd7f0b99b84cff3664fc4ec15
// Paper end
}
}
-@@ -1798,6 +1800,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1797,6 +1799,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
public ProfilerFiller getProfiler() {
@@ -2798,7 +2738,7 @@ index b05e11e6b091c7616df5a9bbef867b06cafe3dc3..2902c29cd7f0b99b84cff3664fc4ec15
}
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
-index dc211c6aedc178ac50b7d05aab3662c422211cbd..3fb96de68b93e8d33bd5ab9137e5d4facc94d788 100644
+index ba67c55cde0120786e6705fed96fab4b611c1c75..2c300e3769acf534ee3bed91663374eca0acf5df 100644
--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java
+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
@@ -429,12 +429,12 @@ public final class NaturalSpawner {
@@ -2868,7 +2808,7 @@ index 4f9187d9d640618c40a2fa528f36b845017b4777..efca73d4de33028cf9df944f36e51b7b
}
}
diff --git a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java
-index a71414397bd45ee7bcacfeef0041d80dfa25f114..d66806565770cb03a21794f99e5c4b0f3040b26a 100644
+index 9b1243d96e0694c62fc9e82e9be540bce0d2b3ad..3514022d898a24052c917ebf55dcef3e757d6836 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java
@@ -31,7 +31,10 @@ import org.bukkit.entity.HumanEntity;
@@ -2946,7 +2886,7 @@ index a71414397bd45ee7bcacfeef0041d80dfa25f114..d66806565770cb03a21794f99e5c4b0f
@Override
diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
-index df1c1c27b7c0065f8179d59bdb9de01dde22befa..1ddae39df4e7cb36db412ebdec8ca9d2818450a9 100644
+index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f0478af4679f 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
@@ -47,7 +47,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
@@ -3060,7 +3000,7 @@ index a94300a457b25f0e33a8eeabba6dd5720ca9ab1e..b41635dd0569ff7df909df492d3e850a
}
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index 27e8ee4507460b1cc72de692b41562b9f4f13929..1afac69b5bc7055d2adb07aea4755b87b246275c 100644
+index d85ed706703e50f76df8db414827ccd41a5985d9..177673cc19cd70f60bb489cb2e74b39fbb8f8d24 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
@@ -86,6 +86,18 @@ public class LevelChunk extends ChunkAccess {
@@ -3092,7 +3032,7 @@ index 27e8ee4507460b1cc72de692b41562b9f4f13929..1afac69b5bc7055d2adb07aea4755b87
// CraftBukkit start
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
-index 9da74764a91bea7822c0444b48623b23e038d3f2..37228dc74463dddcc55301489c41aa253017f2d4 100644
+index 1a473187c22c4158959a3aae33a6823229c5b7a7..1df090afcbf5ac43cd03c61b154b7902eb2f3bc1 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
@@ -25,6 +25,7 @@ public class LevelChunkSection {
@@ -3141,7 +3081,7 @@ index 4cdfc433df67afcd455422e9baf56f167dd712ae..57fcf3910f45ce371ac2e237b277b103
private void ensureActiveIsNotIterated() {
// Paper - replace with better logic, do not delay removals
diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
-index e21f4c5aff3a8e97101f6efc1349fbecf326b5ea..c55f51e6db55f9fa66f53eef0e7a56af5f81d742 100644
+index 6d8ff6c06af5545634f255ed17dc1e489ece2548..6411aa4ff6bd4cabb25c426fa8f4a7eedb969c03 100644
--- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
+++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
@@ -45,6 +45,8 @@ public abstract class FlowingFluid extends Fluid {
@@ -3168,7 +3108,7 @@ index e21f4c5aff3a8e97101f6efc1349fbecf326b5ea..c55f51e6db55f9fa66f53eef0e7a56af
private final Map shapes = Maps.newIdentityHashMap();
public FlowingFluid() {}
-@@ -252,6 +262,8 @@ public abstract class FlowingFluid extends Fluid {
+@@ -251,6 +261,8 @@ public abstract class FlowingFluid extends Fluid {
return false;
}
// Paper end - optimise collisions
@@ -3177,7 +3117,7 @@ index e21f4c5aff3a8e97101f6efc1349fbecf326b5ea..c55f51e6db55f9fa66f53eef0e7a56af
Object2ByteLinkedOpenHashMap object2bytelinkedopenhashmap;
if (!state.getBlock().hasDynamicShape() && !fromState.getBlock().hasDynamicShape()) {
-@@ -259,9 +271,16 @@ public abstract class FlowingFluid extends Fluid {
+@@ -258,9 +270,16 @@ public abstract class FlowingFluid extends Fluid {
} else {
object2bytelinkedopenhashmap = null;
}
@@ -3194,7 +3134,7 @@ index e21f4c5aff3a8e97101f6efc1349fbecf326b5ea..c55f51e6db55f9fa66f53eef0e7a56af
if (object2bytelinkedopenhashmap != null) {
block_a = new Block.BlockStatePairKey(state, fromState, face);
byte b0 = object2bytelinkedopenhashmap.getAndMoveToFirst(block_a);
-@@ -272,11 +291,22 @@ public abstract class FlowingFluid extends Fluid {
+@@ -271,11 +290,22 @@ public abstract class FlowingFluid extends Fluid {
} else {
block_a = null;
}
@@ -3217,7 +3157,7 @@ index e21f4c5aff3a8e97101f6efc1349fbecf326b5ea..c55f51e6db55f9fa66f53eef0e7a56af
if (object2bytelinkedopenhashmap != null) {
if (object2bytelinkedopenhashmap.size() == 200) {
object2bytelinkedopenhashmap.removeLastByte();
-@@ -284,6 +314,11 @@ public abstract class FlowingFluid extends Fluid {
+@@ -283,6 +313,11 @@ public abstract class FlowingFluid extends Fluid {
object2bytelinkedopenhashmap.putAndMoveToFirst(block_a, (byte) (flag ? 1 : 0));
}
@@ -3229,57 +3169,6 @@ index e21f4c5aff3a8e97101f6efc1349fbecf326b5ea..c55f51e6db55f9fa66f53eef0e7a56af
return flag;
}
-diff --git a/src/main/java/net/minecraft/world/level/saveddata/SavedData.java b/src/main/java/net/minecraft/world/level/saveddata/SavedData.java
-index 697df9a9f050c0130246ce2b08a859965bddf184..6df6a6bd89979bcd728e2f5bec948437d6ff9498 100644
---- a/src/main/java/net/minecraft/world/level/saveddata/SavedData.java
-+++ b/src/main/java/net/minecraft/world/level/saveddata/SavedData.java
-@@ -29,17 +29,28 @@ public abstract class SavedData {
- return this.dirty;
- }
-
-- public void save(File file) {
-+ public void save(File file) { save(file, false); } // Pufferfish
-+ public void save(File file, boolean async) { // Pufferfish
- if (this.isDirty()) {
- CompoundTag compoundTag = new CompoundTag();
- compoundTag.put("data", this.save(new CompoundTag()));
- NbtUtils.addCurrentDataVersion(compoundTag);
-
-+ // Pufferfish start
-+ Runnable writeRunnable = () -> {
- try {
- NbtIo.writeCompressed(compoundTag, file.toPath());
- } catch (IOException var4) {
- LOGGER.error("Could not save data {}", this, var4);
- }
-+ };
-+
-+ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncWorldSaving && async) {
-+ net.minecraft.Util.ioPool().execute(writeRunnable);
-+ } else {
-+ writeRunnable.run();
-+ }
-+ // Pufferfish end
-
- this.setDirty(false);
- }
-diff --git a/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java b/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java
-index d051e8c1db6b5c42b8df0be54d9d48ba0e7b0077..6488a61bb05b0f2af23c77bc6df7c3014042ec5e 100644
---- a/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java
-+++ b/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java
-@@ -118,10 +118,10 @@ public class DimensionDataStorage {
- return bl;
- }
-
-- public void save() {
-+ public void save(boolean async) { // Pufferfish
- this.cache.forEach((id, state) -> {
- if (state != null) {
-- state.save(this.getDataFile(id));
-+ state.save(this.getDataFile(id), async); // Pufferfish
- }
-
- });
diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootParams.java b/src/main/java/net/minecraft/world/level/storage/loot/LootParams.java
index e43d07ccdd36f0c9f5b8e9c74cf0d87e17eec66a..8e441f7c2b2d911a0c0111aaa231fc6adae08730 100644
--- a/src/main/java/net/minecraft/world/level/storage/loot/LootParams.java
@@ -3384,7 +3273,7 @@ index ebe65474a4a05ff1637d7f37ebcfe690af59def5..42142c512b12e5b269c19f1e821c50e7
@Nullable
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 9ef8f911632598fd589368cedde268c8abcad3b6..cfc41926305441cb36ed67a8cb7e327cd80ff301 100644
+index d5e473d621ba09f6cf84ba9ca0e870f5ff6e02f3..8962ced18e0dac6603df54ba7d99588fae24073c 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -264,7 +264,7 @@ import javax.annotation.Nullable; // Paper
@@ -3407,7 +3296,7 @@ index 9ef8f911632598fd589368cedde268c8abcad3b6..cfc41926305441cb36ed67a8cb7e327c
+ }
}
}
- // Paper end
+ // Paper end - Wait for Async Tasks during shutdown
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java
index 96d772eb02f79f8c478f5e6f065e387aa7665b18..c5ce412f321b8b4f31cc042893659e213b081f29 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java
@@ -3421,7 +3310,7 @@ index 96d772eb02f79f8c478f5e6f065e387aa7665b18..c5ce412f321b8b4f31cc042893659e21
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index ec2396f0e5d62b10450eaa7239a8c5479638b3c3..c909efd2060dc95bd3ecb8c9fec36a1e69a642ff 100644
+index 509f8487a170f3dc84b091acf16df26e42391189..2338ba106c19c3e61d1a2088cc51d0744432666d 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -482,7 +482,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@@ -3447,7 +3336,7 @@ index 774556a62eb240da42e84db4502e2ed43495be17..80553face9c70c2a3d897681e7761df8
if (stream != null) {
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
-index 2d31752478636bd21bbff5b430e5acb76b5d91c2..651063863b451d24ffe39f0a4d8db296e58ff585 100644
+index fafc8b84d6b6368c70b8eedfdb4c3a9deace9c26..a69814d3a6214af734d670fe5545518a5f8a8dc5 100644
--- a/src/main/java/org/spigotmc/ActivationRange.java
+++ b/src/main/java/org/spigotmc/ActivationRange.java
@@ -38,6 +38,10 @@ import co.aikar.timings.MinecraftTimings;
@@ -3463,7 +3352,7 @@ index 2d31752478636bd21bbff5b430e5acb76b5d91c2..651063863b451d24ffe39f0a4d8db296
{
@@ -222,6 +226,25 @@ public class ActivationRange
}
- // Paper end - configurable marker ticking
+ // Paper end - Configurable marker ticking
ActivationRange.activateEntity(entity);
+
+ // Pufferfish start
diff --git a/patches/server/0003-Fix-pufferfish-issues.patch b/patches/server/0003-Fix-pufferfish-issues.patch
index 23b2191fa..7a5e18f1a 100644
--- a/patches/server/0003-Fix-pufferfish-issues.patch
+++ b/patches/server/0003-Fix-pufferfish-issues.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Fix pufferfish issues
diff --git a/build.gradle.kts b/build.gradle.kts
-index 4bdf291e2e2d96ea7385ae667983f1731baa176a..5b8a28969451b12c4fc66976afd052ffa5805932 100644
+index f253b340d75302fda8e59a2ad113f652c2417869..0c92d10f334f82d196e065c0811d0c1f48887377 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -232,5 +232,7 @@ val runtimeClasspathForRunDev = sourceSets.main.flatMap { src ->
@@ -18,10 +18,10 @@ index 4bdf291e2e2d96ea7385ae667983f1731baa176a..5b8a28969451b12c4fc66976afd052ff
+ jvmArgs("-DPaper.isRunDev=true")
}
diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
-index 61f21c0bf6658326a15b735c22001b4028b98800..51ec029e33f8bdb1710ad36f014fa769da2db41c 100644
+index ad368b58005b6b0453b709c2ef0ea23bca53d34a..2dac1ec1daf4084f33ead33d5128d2955da23ee2 100644
--- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
+++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java
-@@ -246,7 +246,7 @@ public class PufferfishConfig {
+@@ -232,7 +232,7 @@ public class PufferfishConfig {
public static int activationDistanceMod;
private static void dynamicActivationOfBrains() throws IOException {
@@ -30,7 +30,7 @@ index 61f21c0bf6658326a15b735c22001b4028b98800..51ec029e33f8bdb1710ad36f014fa769
startDistance = getInt("dab.start-distance", "activation-range.start-distance", 12,
"This value determines how far away an entity has to be",
"from the player to start being effected by DEAR.");
-@@ -290,7 +290,7 @@ public class PufferfishConfig {
+@@ -276,7 +276,7 @@ public class PufferfishConfig {
public static boolean throttleInactiveGoalSelectorTick;
private static void inactiveGoalSelectorThrottle() {
@@ -40,10 +40,10 @@ index 61f21c0bf6658326a15b735c22001b4028b98800..51ec029e33f8bdb1710ad36f014fa769
"This can improve performance by a few percent, but has minor gameplay implications.");
}
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index c80dc73d7fd7d6cf3b87d1626129273e944d6649..916fa1ecef7a73b494d14c21c4db407d9d8316d7 100644
+index e387de54c9786711272f0ec3f8d312e472a9c4ea..e0f1f23bcf4f59cffa98ea1c70f774fd787dae08 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -997,7 +997,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -992,7 +992,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
// Paper start - optimise random block ticking
private final BlockPos.MutableBlockPos chunkTickMutablePosition = new BlockPos.MutableBlockPos();
@@ -53,11 +53,11 @@ index c80dc73d7fd7d6cf3b87d1626129273e944d6649..916fa1ecef7a73b494d14c21c4db407d
private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.randomTickRandom.nextInt(16); } // Pufferfish
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index 3bf4aa21e2ad602bf9d85d3fcd4f43e0357ef221..43729a9f1282999d5cfcffdc70aac9e8cc76c916 100644
+index 4f568184557d21b44569a9a16456962ee983101b..aa6c3df047e97bde3c352caae7eb3c09e2f45978 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -212,8 +212,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
- // Paper end
+@@ -211,8 +211,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+ // Paper end - Use getChunkIfLoadedImmediately
public abstract ResourceKey getTypeKey();
-
@@ -68,7 +68,7 @@ index 3bf4aa21e2ad602bf9d85d3fcd4f43e0357ef221..43729a9f1282999d5cfcffdc70aac9e8
protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config; Async-Anti-Xray: Pass executor
this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index 1afac69b5bc7055d2adb07aea4755b87b246275c..76a4708464d35dd7782b1032288b52d61ee8fffc 100644
+index 177673cc19cd70f60bb489cb2e74b39fbb8f8d24..c3fb622845770bcee9ddd6ebbeee174b06ee16eb 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
@@ -122,7 +122,7 @@ public class LevelChunk extends ChunkAccess {
diff --git a/patches/server/0004-Purpur-config-files.patch b/patches/server/0004-Purpur-config-files.patch
index d9b1b48d3..705d5b047 100644
--- a/patches/server/0004-Purpur-config-files.patch
+++ b/patches/server/0004-Purpur-config-files.patch
@@ -37,7 +37,7 @@ index 692c962193cf9fcc6801fc93f3220bdc673d527b..8cde30544e14f8fc2dac32966ae3c21f
metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> {
Map> map = new HashMap<>();
diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java
-index ec4152f7372ddad216039a489fb5d72f963b4f18..ca926baddf27536252a442bb23d0e34ac9fc08c0 100644
+index 623403c56d79e29421f340e97c05488efaf1893d..d7333193b20fc6d9a4aaa0ef00a2a66655250081 100644
--- a/src/main/java/net/minecraft/commands/CommandSourceStack.java
+++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java
@@ -335,6 +335,30 @@ public class CommandSourceStack implements ExecutionCommandSource resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config; Async-Anti-Xray: Pass executor
this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot
this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config
@@ -112,7 +112,7 @@ index 43729a9f1282999d5cfcffdc70aac9e8cc76c916..f528e4df3299d76d1ecc846721f34ae3
this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env);
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 63a27079bae650672c027443ff4dc8d4e21a4d06..d1776bb7309b6e35115ab39e31d4bf4b96e5e28b 100644
+index 0d37bde27beaa2d6730bb9f82d4b686f6f60e40b..5248e951e1307c2e019db276dcc80d9d41693fb0 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1037,6 +1037,7 @@ public final class CraftServer implements Server {
@@ -159,7 +159,7 @@ index 63a27079bae650672c027443ff4dc8d4e21a4d06..d1776bb7309b6e35115ab39e31d4bf4b
public void restart() {
org.spigotmc.RestartCommand.restart();
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
-index ef8bbef6e4143b9432ee2ae2fb79e2aa2a9b84df..537fb93e1207d659d9d5375bf53981708393486a 100644
+index 62d9737a8d36d4863ffd7853ba290ef83c759687..bc001869b10fa497d3473f7e45a2a7120e61f87e 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -174,6 +174,14 @@ public class Main {
diff --git a/patches/server/0005-Purpur-client-support.patch b/patches/server/0005-Purpur-client-support.patch
index 931f716e3..619b0c8df 100644
--- a/patches/server/0005-Purpur-client-support.patch
+++ b/patches/server/0005-Purpur-client-support.patch
@@ -5,19 +5,19 @@ Subject: [PATCH] Purpur client support
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index be05a52be037042c6158100e2ce880b8ed415d53..95240bee8f76fd651166ecabe80885ac6601c34e 100644
+index 38df47d282713522b3c5784a562ff09e3151fb27..0b90e6810ec549471fad70406f2f054897c1eb24 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -281,6 +281,7 @@ public class ServerPlayer extends Player {
public com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper
- public @Nullable String clientBrandName = null; // Paper - Brand name
- public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event
+ public @Nullable String clientBrandName = null; // Paper - Brand support
+ public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event
+ public boolean purpurClient = false; // Purpur
// Paper start - replace player chunk loader
private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1));
diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-index d28d0ef6105ddeb562ddf31ae9088739856941fc..49aaa5147b9b904fa912c1811dc66d47d2e8dada 100644
+index f5f2d65d2e02b0d79352585d9d4ef588ab59dce7..fda3c2c006ffdf8743097da05e75ecc6c7d3893d 100644
--- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
@@ -56,6 +56,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@@ -43,7 +43,7 @@ index d28d0ef6105ddeb562ddf31ae9088739856941fc..49aaa5147b9b904fa912c1811dc66d47
try {
String channels = payload.toString(com.google.common.base.Charsets.UTF_8);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index da63b4050be25dcb91d04df8c2fcc643cbb0751d..96e4f1c21e13bc673ff83279ca51c1f1467a5e6e 100644
+index b8d3398b349d9294de6b8a8594b054d3c84dbe0a..4ab63267c4ec808d3daf94478a1425b5aa70b75f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -3373,4 +3373,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
diff --git a/patches/server/0007-Component-related-conveniences.patch b/patches/server/0007-Component-related-conveniences.patch
index c19d76df5..04646987b 100644
--- a/patches/server/0007-Component-related-conveniences.patch
+++ b/patches/server/0007-Component-related-conveniences.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Component related conveniences
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 95240bee8f76fd651166ecabe80885ac6601c34e..257675e0f3d44dec2d532161713609502b2ae868 100644
+index 0b90e6810ec549471fad70406f2f054897c1eb24..a1dff77b662f178bd42c0d232ecea1ca2cc4f6d3 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -1884,6 +1884,26 @@ public class ServerPlayer extends Player {
@@ -36,7 +36,7 @@ index 95240bee8f76fd651166ecabe80885ac6601c34e..257675e0f3d44dec2d53216171360950
public void displayClientMessage(Component message, boolean overlay) {
this.sendSystemMessage(message, overlay);
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index e98a455b6bca9d094d0da323bddd7b3f2c07bb23..05131b298048de6418cfa103d883039b55740dfa 100644
+index 1c89b95ac40120ee970da0f06fd7fff36eb55e61..2a4b63ead77cf6117b1ebefe9d9dbd6c73ed4d95 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -1064,6 +1064,20 @@ public abstract class PlayerList {
@@ -61,7 +61,7 @@ index e98a455b6bca9d094d0da323bddd7b3f2c07bb23..05131b298048de6418cfa103d883039b
Iterator iterator = this.players.iterator();
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
-index 25a5a3b949a0eb632611355e74ccd4865be108ca..14fcfd7c1d3a62833978e163f4e0d6f9b2203042 100644
+index fc6903b20a6e084729306fc960a6fc80e094f76c..dad8d358e60902eb186cbc5686219f66d3babf89 100644
--- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
@@ -126,6 +126,15 @@ public class DamageSource {
@@ -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 5cbe6cb0676ac23e184e7586e2dacbbc1d5fb218..4bcd36f4767975e87ec6ed12a3c80e834e2d497b 100644
+index 7a50a1fe485de232abb9d626e8001eee78a33b1b..59ec8a66c76bea89f14aa19f61c03571a00c7e4f 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -4141,6 +4141,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4138,6 +4138,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return SlotAccess.NULL;
}
diff --git a/patches/server/0008-Ridables.patch b/patches/server/0008-Ridables.patch
index 59fcb77ce..b01a32d0b 100644
--- a/patches/server/0008-Ridables.patch
+++ b/patches/server/0008-Ridables.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] Ridables
diff --git a/src/main/java/net/minecraft/core/BlockPos.java b/src/main/java/net/minecraft/core/BlockPos.java
-index c47aa87db42dea74a2e07ffe6015257fa337da23..fb672028548fbc3c026c3823024249e4e804be01 100644
+index e17fa30966dea2836fb791becd032fc7d5cc2611..dd06323731533fb9b1b25a56844a4e39e8a1c4ea 100644
--- a/src/main/java/net/minecraft/core/BlockPos.java
+++ b/src/main/java/net/minecraft/core/BlockPos.java
@@ -48,6 +48,12 @@ public class BlockPos extends Vec3i {
private static final int X_OFFSET = 38;
- // Paper end
+ // Paper end - Optimize Bit Operations by inlining
+ // Purpur start
+ public BlockPos(net.minecraft.world.entity.Entity entity) {
@@ -22,31 +22,31 @@ index c47aa87db42dea74a2e07ffe6015257fa337da23..fb672028548fbc3c026c3823024249e4
super(x, y, z);
}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index de0f93e1a85754051315653f707b95753ff7dc70..41918e5fe6d55749204a9207efe305e2f1369d9c 100644
+index e83bf05132155c5ac5b57ac04c433c99d4ba77c2..a0dafd629275e2aa42edf00f5e166097e85ed394 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1700,6 +1700,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper
net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers
- worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper
+ worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
+ worldserver.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur
this.profiler.push(() -> {
return worldserver + " " + worldserver.dimension().location();
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index f29b3dc2243138783ba1d5ec852a8e4c2400150c..dda4a2e46e085190697adc60311abc43031bbf2e 100644
+index e0f1f23bcf4f59cffa98ea1c70f774fd787dae08..a129e8ef37fef6fa289e6457b68a221947ef0348 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -224,6 +224,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
public boolean hasPhysicsEvent = true; // Paper
- public boolean hasEntityMoveEvent = false; // Paper
+ public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent
private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current)
+ public boolean hasRidableMoveEvent = false; // Purpur
- public static Throwable getAddToWorldStackTrace(Entity entity) {
- final Throwable thr = new Throwable(entity + " Added to world at " + new java.util.Date());
- io.papermc.paper.util.StacktraceDeobfuscator.INSTANCE.deobfuscateThrowable(thr);
+
+ @Override public LevelChunk getChunkIfLoaded(int x, int z) { // Paper - this was added in world too but keeping here for NMS ABI
+ return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 849b4190976722179ce4b90aa2bad1dd6cfbadc7..c0b18bf97c8da4e843e08ccd39d4ef6d43295e54 100644
+index a1dff77b662f178bd42c0d232ecea1ca2cc4f6d3..6c6f084fcb2e9da843365ed4eac4f1c2d7550f33 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -763,6 +763,15 @@ public class ServerPlayer extends Player {
@@ -66,10 +66,10 @@ index 849b4190976722179ce4b90aa2bad1dd6cfbadc7..c0b18bf97c8da4e843e08ccd39d4ef6d
public void doTick() {
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 04b0eb391bb524dd7af14b862d89c0f2494a8206..671b5deba9eb3afddc4d0af7ce5e61c11cddd303 100644
+index b5917417aaed74555917772650fe51485281c2ec..d9f34bfb22f8b3ca444002acc861eeb5bd3b69e1 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2724,6 +2724,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2719,6 +2719,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event);
@@ -79,10 +79,10 @@ index 04b0eb391bb524dd7af14b862d89c0f2494a8206..671b5deba9eb3afddc4d0af7ce5e61c1
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 d7e664b9b1f19eeb74b380c90d25354b3f450421..5544a0d6bb1eac588a301261dcd96701be316cc8 100644
+index 59ec8a66c76bea89f14aa19f61c03571a00c7e4f..f0216a0ac90aa1c0851dea13dd2250a2560c0e17 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -379,7 +379,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -378,7 +378,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
private final Set tags;
private final double[] pistonDeltas;
private long pistonDeltasGameTime;
@@ -91,7 +91,7 @@ index d7e664b9b1f19eeb74b380c90d25354b3f450421..5544a0d6bb1eac588a301261dcd96701
private float eyeHeight;
public boolean isInPowderSnow;
public boolean wasInPowderSnow;
-@@ -3013,6 +3013,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3012,6 +3012,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.passengers = ImmutableList.copyOf(list);
}
@@ -105,7 +105,7 @@ index d7e664b9b1f19eeb74b380c90d25354b3f450421..5544a0d6bb1eac588a301261dcd96701
this.gameEvent(GameEvent.ENTITY_MOUNT, passenger);
}
}
-@@ -3052,6 +3059,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3051,6 +3058,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return false;
}
// CraftBukkit end
@@ -120,10 +120,10 @@ index d7e664b9b1f19eeb74b380c90d25354b3f450421..5544a0d6bb1eac588a301261dcd96701
if (this.passengers.size() == 1 && this.passengers.get(0) == entity) {
this.passengers = ImmutableList.of();
} else {
-@@ -5000,4 +5015,44 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4992,4 +5007,44 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return ((net.minecraft.server.level.ServerChunkCache) level.getChunkSource()).isPositionTicking(this);
}
- // Paper end
+ // Paper end - Expose entity id counter
+ // Purpur start
+ @Nullable
+ private Player rider = null;
@@ -190,7 +190,7 @@ index 1bb8b6e91c44cd13411d96d749fa64835c75a267..75c278b67ad2b78766efd8f89c4c2ca7
protected ParticleOptions getInkParticle() {
return ParticleTypes.GLOW_SQUID_INK;
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 9b7e786d5ae6bdeeb96df6e9c4d1b24e1e856e58..120666439f235c976ba32a02b09c239ca79cb826 100644
+index 370033cb058a20a83f80b8e2618e419bb3fd97cf..b225b9823e5edf81dfc916c3817caab93927118d 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -217,9 +217,9 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -226,16 +226,16 @@ index 9b7e786d5ae6bdeeb96df6e9c4d1b24e1e856e58..120666439f235c976ba32a02b09c239c
@@ -2728,7 +2729,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
- protected long lastJumpTime = 0L; // Paper
+ protected long lastJumpTime = 0L; // Paper - Prevent excessive velocity through repeated crits
- protected void jumpFromGround() {
+ public void jumpFromGround() { // Purpur - protected -> public
Vec3 vec3d = this.getDeltaMovement();
- // Paper start
+ // Paper start - Prevent excessive velocity through repeated crits
long time = System.nanoTime();
@@ -3506,8 +3507,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.pushEntities();
this.level().getProfiler().pop();
- // Paper start
+ // Paper start - Add EntityMoveEvent
- if (((ServerLevel) this.level()).hasEntityMoveEvent && !(this instanceof net.minecraft.world.entity.player.Player)) {
- if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) {
+ // Purpur start
@@ -265,10 +265,10 @@ index 9b7e786d5ae6bdeeb96df6e9c4d1b24e1e856e58..120666439f235c976ba32a02b09c239c
+ }
+ // Purpur end
}
- // Paper end
+ // Paper end - Add EntityMoveEvent
if (!this.level().isClientSide && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) {
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 2f3dc569ff9cdead48aa831c96c027cc7255d609..36c49ca7632495d816fdf98e7f5ae62bbedd4e22 100644
+index 4e3d48f6af493f2cded599f51ad5d2cd07e252f2..749de94a6e41d44a6041f67c7d0e2205e10a26ab 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -148,8 +148,8 @@ public abstract class Mob extends LivingEntity implements Targeting {
@@ -349,7 +349,7 @@ index 2f3dc569ff9cdead48aa831c96c027cc7255d609..36c49ca7632495d816fdf98e7f5ae62b
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java
-index 3087f8359b098682a345399c85395de8a15b6eed..6b0855cffb901dbc7dcc5fd44506275206bc9a2d 100644
+index 683c9693754d1a87b7e8fccc757a0d0963351f60..c47af2c9d023aba454343bab0b43268013c8bd08 100644
--- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java
+++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java
@@ -24,14 +24,21 @@ public class AttributeMap {
@@ -527,7 +527,7 @@ index 7df56705a4a0de2dc4ff7ab133fc26612c219162..384bed4505b6cabb1ae151cd2c4eb5e5
--this.lookAtCooldown;
this.getYRotD().ifPresent((yaw) -> {
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
-index 8820905ac733a8915cc1697259b2bef14d97e471..384fa039b11fb70c2d04df447b689aef3e808968 100644
+index 4fba7c2f6ec363846a772ef2a63e9b3fc1037de5..f8c2e2a7065a3ad5b306ebab3d04a12f362c2ea1 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
@@ -19,6 +19,7 @@ import net.minecraft.world.entity.EntityDimensions;
@@ -679,7 +679,7 @@ index 2249fc6dd98afb8d52623b5864955fdd3b3fc042..2ccfaab0a02cf5ff9779e250fb79a75a
double d = this.wantedX - this.fish.getX();
double e = this.wantedY - this.fish.getY();
diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java
-index a87a34b0c4c8e5d0cf079025c230b1434c919b54..8f906101afa436b891f4a751b184d6eb89668948 100644
+index f9521a6e115f0c975a7885b024c99eae300b63bf..78e802a4bd994b6988ae415cf2958bb828830964 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java
@@ -43,6 +43,7 @@ import net.minecraft.world.entity.EntityType;
@@ -695,7 +695,7 @@ index a87a34b0c4c8e5d0cf079025c230b1434c919b54..8f906101afa436b891f4a751b184d6eb
super(type, world);
this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(this.random, 20, 60);
+ final org.purpurmc.purpur.controller.FlyingMoveControllerWASD flyingController = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this, 0.25F, 1.0F, false); // Purpur
- // Paper start - apply gravity to bees when they get stuck in the void, fixes MC-167279
+ // Paper start - Fix MC-167279
class BeeFlyingMoveControl extends FlyingMoveControl {
public BeeFlyingMoveControl(final Mob entity, final int maxPitchChange, final boolean noGravity) {
@@ -155,11 +157,24 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
@@ -722,7 +722,7 @@ index a87a34b0c4c8e5d0cf079025c230b1434c919b54..8f906101afa436b891f4a751b184d6eb
+ // Purpur end
}
this.moveControl = new BeeFlyingMoveControl(this, 20, true);
- // Paper end
+ // Paper end - Fix MC-167279
@@ -171,6 +186,40 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
this.setPathfindingMalus(BlockPathTypes.FENCE, -1.0F);
}
@@ -801,7 +801,7 @@ index a87a34b0c4c8e5d0cf079025c230b1434c919b54..8f906101afa436b891f4a751b184d6eb
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java
-index de51ce9875e12961e6e549e87d76f492d2f19787..3e89e788c796fe168e43a6b78c0d6c1fc077fc78 100644
+index f760ce7d9df79ef58f8963de3e901cba3e12fcaa..25636efbdb55605303e390f63276ef0bfd4929ba 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
@@ -98,6 +98,31 @@ public class Cat extends TamableAnimal implements VariantHolder {
@@ -965,7 +965,7 @@ index 3cdd9f379c7e2d46ea47c9ef55b121c93ec0bb4a..b0cff23aa6f841ad291437964ea5bebb
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
-index e555fd8ca61e1ce7a52ecd475cc3ea11dedcab08..e818cf94d0a7def1f0abc8519e3b8ff4e7918aef 100644
+index 178e1e75fcd0e60a1dd2729a894df08cf4129526..2412cdb1bdaf7a558ad7235fca7ea5c74eeaad3f 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
@@ -82,14 +82,82 @@ public class Dolphin extends WaterAnimal {
@@ -1090,7 +1090,7 @@ index e555fd8ca61e1ce7a52ecd475cc3ea11dedcab08..e818cf94d0a7def1f0abc8519e3b8ff4
this.setAirSupply(this.getMaxAirSupply());
} else {
diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java
-index 3d771b137dc29579614aa4c15d12bd456cdc608a..8e1494f0f5a50dc16efebc8ab76a41d0cd355ff2 100644
+index 287e52dc844c2a64dac74dad117b775f46631157..9133fc6cf8ecc5670b5c3745c882430308e7c184 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Fox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java
@@ -144,6 +144,44 @@ public class Fox extends Animal implements VariantHolder {
@@ -1195,7 +1195,7 @@ index 3d771b137dc29579614aa4c15d12bd456cdc608a..8e1494f0f5a50dc16efebc8ab76a41d0
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
-index f383928fc5b331ddf128bdcb6a23010d8fe088d3..6815d7350a82c6d32f60aa6116466ebd06a920f9 100644
+index 6cfe0d6c46caa122db107c607d27a2bdcd82f7a8..cb05267fb287b9de9d1829e90d9bb9c9f4aac9f7 100644
--- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
+++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
@@ -66,8 +66,27 @@ public class IronGolem extends AbstractGolem implements NeutralMob {
@@ -1340,7 +1340,7 @@ index 4300fab61765dd224fab084d118aae7294fc9de6..66f80ec010909648278c4e74c80d3766
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR));
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java
-index ead5060ae2840a0519c5bf8b4b84aa12cc41b02a..9376de7391cfdd31f3f44da9a062bf23efd43561 100644
+index be554dbaa9900207753e4f67f0ba402333e21338..87a1a6ff04b40ceebded50e81aaafe67a802fa1b 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Panda.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java
@@ -114,6 +114,32 @@ public class Panda extends Animal {
@@ -1441,7 +1441,7 @@ index ead5060ae2840a0519c5bf8b4b84aa12cc41b02a..9376de7391cfdd31f3f44da9a062bf23
}
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java
-index 4c34edc55fa0e136ccf49a3aef001f413274dfac..521ce86afafe329de97c0ef8e95fb503c999edda 100644
+index f3f48225c2a1e4bd3d0091d1b4b7e4e150850ed2..06568c109d806a4e98b092016d0efd5b2cdfd359 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java
@@ -131,12 +131,68 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder entitytypes, Level world) {
@@ -2935,7 +2935,7 @@ index a59c2d1e84c522a9b86cb86491fb987f6f70dcd0..89e3c1cf179b95efe5e0e16ce703fa0b
this.dragonFight.updateDragon(this);
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
-index 1f7f6e5995c00725bf66723c75620ec416e24f87..f1f95b2a22797a8b16df1276d8fcc65cbebb165a 100644
+index ea8883b0661e894a466eca24bfc247ac37f40a81..6af131d0574a508bccc84b85d0e0b3b5bab6f795 100644
--- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
+++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
@@ -84,16 +84,30 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
@@ -3116,7 +3116,7 @@ index 1f7f6e5995c00725bf66723c75620ec416e24f87..f1f95b2a22797a8b16df1276d8fcc65c
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
-index a383c0c8b5c89ef1eef7d18edc3a09f749fdd310..d205578dbed88776c6704fec9500299ce1606152 100644
+index 586e3e92ccc275446df6dbbff9bf010a37a9aa8f..9d259d7e2aa3e44e350eb5927314cfceaffaf3f3 100644
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
@@ -70,12 +70,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
@@ -3247,7 +3247,7 @@ index 70d25bb45ad603095a1f5812cc396dfc5f16a1e1..562faf0257388d9c22146a418f25716c
public boolean doHurtTarget(Entity target) {
if (super.doHurtTarget(target)) {
diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
-index 52eb3f6a73fa99d12d5fc75bab03e47a605c653a..7b17195c3e872822f92760c2977af3afa395b183 100644
+index 51ab33d805028fb739ff9fa1a22a010e70777c1e..b3d1e3158165c940ad1081e80f5bd2dd9d0152f8 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
@@ -59,21 +59,98 @@ public class Creeper extends Monster implements PowerableMob {
@@ -3356,9 +3356,9 @@ index 52eb3f6a73fa99d12d5fc75bab03e47a605c653a..7b17195c3e872822f92760c2977af3af
+ if (!event.isIgnited()) setSwellDir(-1); // Purpur
}
}
- // Paper end
+ // Paper end - CreeperIgniteEvent
diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java
-index 485d14d71fb26e6e0d00a43da040bf63d696b66a..a72609b6b98ae730aa765b57275d2e32dbbb0eb6 100644
+index 01897af1e6253b987734a24c052daf2ce1314092..02141c89708a60c396dc89bc202bc2316a7e419f 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java
@@ -68,6 +68,23 @@ public class Drowned extends Zombie implements RangedAttackMob {
@@ -3423,7 +3423,7 @@ index 485d14d71fb26e6e0d00a43da040bf63d696b66a..a72609b6b98ae730aa765b57275d2e32
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java
-index efc1d49c5bfea7d1674b8a9de2c8b617657eda0f..37afe706c5c453003ea96e62f376f45d7b8eb4a8 100644
+index 6d4810626980ce46e02042a5660f615c58d0d5fd..dd2037d4c50e622f249406eee49add29bf261865 100644
--- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java
+++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java
@@ -36,6 +36,18 @@ public class ElderGuardian extends Guardian {
@@ -3446,7 +3446,7 @@ index efc1d49c5bfea7d1674b8a9de2c8b617657eda0f..37afe706c5c453003ea96e62f376f45d
return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D);
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
-index ebbd0031da656c4b12debbf76a347da2865d50d1..05f2b8c9813b2cdadb2aa8de445b8506ed4c2a30 100644
+index ad46881a5cba388e6ceb4e0134aa377e28d5f267..8ef8894733ead4f440de1847723cdb405bee17f8 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
@@ -98,9 +98,27 @@ public class EnderMan extends Monster implements NeutralMob {
@@ -3818,7 +3818,7 @@ index 72b8290bebe8ed9bc3c464b30cfe5d2d664310f5..bfc6dcafe79fa3bb6e450a23e91a772b
return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (MobSpawnType.isSpawner(spawnReason) || world.canSeeSky(pos));
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
-index 63fce7e3d9f59f36e29bc827a46396d73143bb8b..f83f09f7568c44a1165aac73f7127c5d1af0478f 100644
+index fb84b35e34063075e69e00e430bc00e7c3b9d62c..4d50d10016a3b574d67bdfec5aee910cede8ffc3 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java
@@ -59,10 +59,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob {
@@ -3906,7 +3906,7 @@ index 2858ea5562d06c11e5c7337a2b123f9be7a3f62e..aad51022eac584fbc058c2b25e2bf192
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
-index 5b4719dd7c3b8f93c898779f45239568f6a5fe43..34de7704ad6bf6989fb83a1e24905098d7ba0123 100644
+index 187037c43ebb5b245ffa4b50163d443490668744..98ced015ceb4f68364ff5ee6f7ee1a69251dbb04 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
@@ -61,6 +61,64 @@ public class Phantom extends FlyingMob implements Enemy {
@@ -3989,12 +3989,12 @@ index 5b4719dd7c3b8f93c898779f45239568f6a5fe43..34de7704ad6bf6989fb83a1e24905098
@@ -146,6 +206,7 @@ public class Phantom extends FlyingMob implements Enemy {
@Override
public void aiStep() {
- if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning
+ if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API
+ if (getRider() == null || !this.isControllable()) // Purpur
this.setSecondsOnFire(8);
}
-@@ -274,7 +335,7 @@ public class Phantom extends FlyingMob implements Enemy {
+@@ -273,7 +334,7 @@ public class Phantom extends FlyingMob implements Enemy {
private AttackPhase() {}
}
@@ -4003,7 +4003,7 @@ index 5b4719dd7c3b8f93c898779f45239568f6a5fe43..34de7704ad6bf6989fb83a1e24905098
private float speed = 0.1F;
-@@ -282,8 +343,19 @@ public class Phantom extends FlyingMob implements Enemy {
+@@ -281,8 +342,19 @@ public class Phantom extends FlyingMob implements Enemy {
super(entity);
}
@@ -4024,7 +4024,7 @@ index 5b4719dd7c3b8f93c898779f45239568f6a5fe43..34de7704ad6bf6989fb83a1e24905098
if (Phantom.this.horizontalCollision) {
Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F);
this.speed = 0.1F;
-@@ -329,14 +401,20 @@ public class Phantom extends FlyingMob implements Enemy {
+@@ -328,14 +400,20 @@ public class Phantom extends FlyingMob implements Enemy {
}
}
@@ -4087,7 +4087,7 @@ index cec545c3baa6599d47b9cf1a4b97de8771062a22..31d204d8d81ccc30371070af3678d82d
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false));
diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
-index 0c11d9bef8f0129c541e30ad057612e881703b24..cfa324c6a75ac83cff4ba87034677d4e9415189e 100644
+index 151acc43c96b4545ce92d3d559d8e1591874b4b5..73220bd6989855ac82420219c841421612cb3f11 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
@@ -71,14 +71,39 @@ public class Ravager extends Raider {
@@ -4223,7 +4223,7 @@ index 2c60a3765d22909e73b660492410ab8456304b68..f5dda5ed4532c8572bc4f511c49377c2
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
-index 8b818a7cb835512c4bd2ea9641d4bfd904150332..4db19589d19d1a0e488ddd0b691e81152ac236e4 100644
+index 92974452d8f63fde8524cfac305ee2ef5212f840..3568c4b7ecfa250bbeb1799685b487df53537919 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
@@ -26,6 +26,23 @@ public class Skeleton extends AbstractSkeleton {
@@ -4251,7 +4251,7 @@ index 8b818a7cb835512c4bd2ea9641d4bfd904150332..4db19589d19d1a0e488ddd0b691e8115
protected void defineSynchedData() {
super.defineSynchedData();
diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java
-index cd964e5cded6a74cb9dcf27b4134f944764062cd..5d15c491034e2bd9c136935f5b266e2de3e85729 100644
+index 2e59a32aa8afe45641a319b1a6c347ee944398a8..01416cef059e4b8d82a0676a0ced19a325a47ace 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Slime.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java
@@ -61,6 +61,7 @@ public class Slime extends Mob implements Enemy {
@@ -4381,7 +4381,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 8094c133f9e934c98eee09738220bacd87a0a364..4d0ef7d73b2c4623c9df22fd971ba8c378e8f696 100644
+index 0c68ed759421d6bce4435399f1b4980510081cac..8133ff59a1dba12542c7b582381433267ca18ce5 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 {
@@ -4603,7 +4603,7 @@ index 30ea3f64234fd1fda8dada3c7fb12be0730322a8..841fba3edf697647f59d0485b751c836
Vec3 vec3d1 = Vex.this.getDeltaMovement();
diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java
-index ad41bbbf5395ed18c2c9e1e692c7661a6e0cb98c..049e81af9d5cc746e872be9bdec80917e3137be3 100644
+index a6af5ac9d09834940d3dd4c80b16450b90484edb..e5d3bf2e8934d97760eaf165a0ac930d51a3c884 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java
@@ -58,14 +58,33 @@ public class Vindicator extends AbstractIllager {
@@ -4641,7 +4641,7 @@ index ad41bbbf5395ed18c2c9e1e692c7661a6e0cb98c..049e81af9d5cc746e872be9bdec80917
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true));
diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java
-index 580dff41d746d9591f718081d9dfe4ac77e7eeaa..c146d16acac7d3ea380b5e3591f22491c102d7a9 100644
+index 02386e7eabc6669296ce35158fa35a3c88c6b563..330974f7fcc435cd45c744cc9c8e0f1bac2305ef 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Witch.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java
@@ -59,6 +59,23 @@ public class Witch extends Raider implements RangedAttackMob {
@@ -4682,7 +4682,7 @@ index 580dff41d746d9591f718081d9dfe4ac77e7eeaa..c146d16acac7d3ea380b5e3591f22491
this.targetSelector.addGoal(2, this.healRaidersGoal);
this.targetSelector.addGoal(3, this.attackPlayersGoal);
diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java
-index 3dcd43279ce1295b37c3504ecbdaac5275df2b80..728e3c78fb17d954247cc62f05cdd970d8b5f540 100644
+index 20a65c11ededcd7170704b70118da6200151fbab..4235684e533e744bb1eb90a5cc69001e43782bc2 100644
--- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java
@@ -35,6 +35,23 @@ public class WitherSkeleton extends AbstractSkeleton {
@@ -4746,7 +4746,7 @@ index 11275a9ec6faa69c9f054683cb47312e443ba883..dc29e875c1e184c1c4553c127bb8c86d
this.level().getProfiler().pop();
this.updateActivity();
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 753defa8f8b48d004a2a53b2fc322fd9c083d95e..1d5c60c08354bb64a6d671032c2e8b885ec4ca73 100644
+index 3fa43be16cc8d35622c269db37875b4bd0a09405..aa6533c40b73bc72a4906f0533f13e74e58c091a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
@@ -107,11 +107,30 @@ public class Zombie extends Monster {
@@ -4773,7 +4773,7 @@ index 753defa8f8b48d004a2a53b2fc322fd9c083d95e..1d5c60c08354bb64a6d671032c2e8b88
@Override
protected void registerGoals() {
+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur
- if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0D, 3)); // Paper
+ if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0D, 3)); // Paper - Add zombie targets turtle egg config
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F));
this.goalSelector.addGoal(8, new RandomLookAroundGoal(this));
+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur
@@ -4809,7 +4809,7 @@ index 7de9d012e7416eaa0189b513a0972c846e93c4b6..ba391ae0f8c361fb0ffbe0b65f12a008
protected void defineSynchedData() {
super.defineSynchedData();
diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
-index 1afe8a8694c1fd0bf43ce3c0c36a83fda9aec141..252d2994fac423ea1fef36bdc7c09778203049cb 100644
+index fbabbd0808304f5d0d12f987d00c9e43a89fb1c9..2121de85765d535effb3ef4e0c4a873238dd7576 100644
--- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
@@ -64,6 +64,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob {
@@ -4837,7 +4837,7 @@ index 1afe8a8694c1fd0bf43ce3c0c36a83fda9aec141..252d2994fac423ea1fef36bdc7c09778
public void setPersistentAngerTarget(@Nullable UUID angryAt) {
this.persistentAngerTarget = angryAt;
diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
-index e703320717ff620a19ff76d1c10066117c9895d5..d040198ce528293ed95adcdb17ddf0acbc5a93e0 100644
+index 9921b160fb21f72fbd28fe81ea66fbc3dc05f83f..1d54077a7ebb463270a03bb17c342ced8874f4c2 100644
--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
@@ -69,6 +69,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
@@ -4874,7 +4874,7 @@ index e703320717ff620a19ff76d1c10066117c9895d5..d040198ce528293ed95adcdb17ddf0ac
this.level().getProfiler().pop();
HoglinAi.updateActivity(this);
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
-index cfdc1650783d6855e0d4f33ec68aab48dbee09f0..f57d7fee1ece00aba9bc7b07dda8398e7acc73c3 100644
+index 83d83e3f84bb6bd58761671c6cd4c8683545ff4c..015bb57c73c7b38622329fc3001b6369fa183cd1 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -96,6 +96,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -4947,7 +4947,7 @@ index e1be4a77fae0b9120781f460079269b85c993930..2d842c0dfce1c7e7229bd42b2a92c024
this.level().getProfiler().pop();
PiglinBruteAi.updateActivity(this);
diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
-index 58a7e61e02b7d72326ed4d57ee514adb63b3873c..63e4688d8055cf4a8883477f7943bf63520c0693 100644
+index 0a151c679b0dc943598180942d6d4b3886211688..384e7b29215cadfa40af07a183a9c9c6a5b4a80a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
+++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
@@ -123,8 +123,32 @@ public class Warden extends Monster implements VibrationSystem {
@@ -5007,7 +5007,7 @@ index 58a7e61e02b7d72326ed4d57ee514adb63b3873c..63e4688d8055cf4a8883477f7943bf63
public static void applyDarknessAround(ServerLevel world, Vec3 pos, @Nullable Entity entity, int range) {
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index 1e6d61673b0e3252129c04edcfa1d7d436e8ecbe..8102f0beb58a6055e0b21c793e913d4eae96c348 100644
+index a1769d423141e2a27d7d5ac7f2b7d36c600f1b2d..6e42633cc7393d579bfd4b756a5f651a71e2f02e 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
@@ -157,6 +157,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -5075,7 +5075,7 @@ index 1e6d61673b0e3252129c04edcfa1d7d436e8ecbe..8102f0beb58a6055e0b21c793e913d4e
this.startTrading(player);
}
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
-index 833563e237462ccfc1b730b8f5fb35340d0db854..2bed7b373813660139d2322dcd6b83f3015768f0 100644
+index 1c89f20debfad9807c90a21cc336d5790294ebce..3782209c6d3408393e91ffe64976a15cba025843 100644
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
@@ -70,6 +70,23 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
@@ -5114,7 +5114,7 @@ index 833563e237462ccfc1b730b8f5fb35340d0db854..2bed7b373813660139d2322dcd6b83f3
this.setTradingPlayer(player);
this.openTradingScreen(player, this.getDisplayName(), 1);
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 2668c3b6f752d5d8bc45f4e6e52c20cc6a36a957..19ed29dc7e4bcb9bedbb8c25174d48194132685e 100644
+index 7e77383368388f6e56159892cd483513b068e402..b33f63016fc2818b0a6a05107e435e1c9be3ca97 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -194,6 +194,19 @@ public abstract class Player extends LivingEntity {
@@ -5172,7 +5172,7 @@ index 78dd3365dc4d1265fc2102f740d75a384f5df5c5..4a2331c22a022881d66bcfd4134b0ffe
public boolean isPickable() {
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index 1c3e1153d08b59d29b3613fc3b50a4780aa7a3ac..7c8b90444aa635cddf480d49a92a180a1bfa9c34 100644
+index f16ac1d640fc97f348c244d4ea86e3278b30ae19..6f7be7d29b4654d463299c62b8a01696ca187eb2 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -1227,4 +1227,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
@@ -5204,7 +5204,7 @@ index 1c3e1153d08b59d29b3613fc3b50a4780aa7a3ac..7c8b90444aa635cddf480d49a92a180a
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index 55c26840957f69860816c917c16f59d02074b388..b3d8e795683ab186295902aba7d476a689ff0f3f 100644
+index b9e90f589749dfc9324c4aa2062c505fbd4447bc..118483d7342117c4bc172db89df9fab391f30378 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -591,6 +591,15 @@ public class CraftEventFactory {
@@ -5223,7 +5223,7 @@ index 55c26840957f69860816c917c16f59d02074b388..b3d8e795683ab186295902aba7d476a6
return event;
}
-@@ -1070,6 +1079,7 @@ public class CraftEventFactory {
+@@ -1068,6 +1077,7 @@ public class CraftEventFactory {
damageCause = DamageCause.ENTITY_EXPLOSION;
}
event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), entity.getBukkitEntity(), damageCause, modifiers, modifierFunctions, source.isCritical()); // Paper - add critical damage API
@@ -5231,7 +5231,7 @@ index 55c26840957f69860816c917c16f59d02074b388..b3d8e795683ab186295902aba7d476a6
}
event.setCancelled(cancelled);
-@@ -1184,6 +1194,7 @@ public class CraftEventFactory {
+@@ -1182,6 +1192,7 @@ public class CraftEventFactory {
} else {
entity.lastDamageCancelled = true; // SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Keep track if the event was canceled
}
@@ -5239,7 +5239,7 @@ index 55c26840957f69860816c917c16f59d02074b388..b3d8e795683ab186295902aba7d476a6
return event;
}
-@@ -1247,6 +1258,7 @@ public class CraftEventFactory {
+@@ -1245,6 +1256,7 @@ public class CraftEventFactory {
EntityDamageEvent event;
if (damager != null) {
event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, modifiers, modifierFunctions, critical); // Paper - add critical damage API
diff --git a/patches/server/0009-Configurable-entity-base-attributes.patch b/patches/server/0009-Configurable-entity-base-attributes.patch
index adc6b9c02..1670248e3 100644
--- a/patches/server/0009-Configurable-entity-base-attributes.patch
+++ b/patches/server/0009-Configurable-entity-base-attributes.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Configurable entity base attributes
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index dae5eb42eb1da596ddbbaf525818ee9601ecdc2f..960b772977adf13c8765dd115346ca53303f7823 100644
+index f0216a0ac90aa1c0851dea13dd2250a2560c0e17..036688d52541dda8d8eef6fee43823844f245124 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -159,7 +159,7 @@ import org.bukkit.plugin.PluginManager;
@@ -16,7 +16,7 @@ index dae5eb42eb1da596ddbbaf525818ee9601ecdc2f..960b772977adf13c8765dd115346ca53
+ public static javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino"); // Purpur
// CraftBukkit start
private static final int CURRENT_LEVEL = 2;
- public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation
+ public boolean preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; keep initial motion on first setPositionRotation
diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java
index 75c278b67ad2b78766efd8f89c4c2ca7eb7cdcb2..dc99e7f0e6f173c1313c0d5e9ea5dd6bdbdac169 100644
--- a/src/main/java/net/minecraft/world/entity/GlowSquid.java
@@ -34,7 +34,7 @@ index 75c278b67ad2b78766efd8f89c4c2ca7eb7cdcb2..dc99e7f0e6f173c1313c0d5e9ea5dd6b
protected ParticleOptions getInkParticle() {
return ParticleTypes.GLOW_SQUID_INK;
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index bc83444129f9bd606450c8721bc0e65d3855cdb5..3b7897cc4e282b682e83109a639b987a2c78fa07 100644
+index b225b9823e5edf81dfc916c3817caab93927118d..ea7cb84dab429f1a9495b05e578775ac9d94f08a 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -286,6 +286,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -55,7 +55,7 @@ index bc83444129f9bd606450c8721bc0e65d3855cdb5..3b7897cc4e282b682e83109a639b987a
return this.brain;
}
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
-index 384fa039b11fb70c2d04df447b689aef3e808968..92777e7f6c6293c5b5689cfa5f992335629d05eb 100644
+index f8c2e2a7065a3ad5b306ebab3d04a12f362c2ea1..8910aaaa1fdabecec4740d6212db3114bd1197fc 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
@@ -268,6 +268,18 @@ public class Bat extends AmbientCreature {
@@ -78,7 +78,7 @@ index 384fa039b11fb70c2d04df447b689aef3e808968..92777e7f6c6293c5b5689cfa5f992335
public void readAdditionalSaveData(CompoundTag nbt) {
super.readAdditionalSaveData(nbt);
diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java
-index 8f906101afa436b891f4a751b184d6eb89668948..9496bf72eb4cda6c2675daabe5ad82e90d12e173 100644
+index 78e802a4bd994b6988ae415cf2958bb828830964..c1f71bf53dac227e6b8c6dbd88473fe79b6a2c64 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java
@@ -478,6 +478,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
@@ -94,7 +94,7 @@ index 8f906101afa436b891f4a751b184d6eb89668948..9496bf72eb4cda6c2675daabe5ad82e9
public int getRemainingPersistentAngerTime() {
return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME);
diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java
-index 3e89e788c796fe168e43a6b78c0d6c1fc077fc78..87642c1c2c1f39a1c2029797bab73f60c19a1080 100644
+index 25636efbdb55605303e390f63276ef0bfd4929ba..83e715c9604efc9586171fd32c7cd2b339bc2349 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
@@ -123,6 +123,11 @@ public class Cat extends TamableAnimal implements VariantHolder {
@@ -158,7 +158,7 @@ index b0cff23aa6f841ad291437964ea5bebb6395de84..f440eabffb1abe4c7370bf7badf6137a
protected void registerGoals() {
this.goalSelector.addGoal(0, new FloatGoal(this));
diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
-index e818cf94d0a7def1f0abc8519e3b8ff4e7918aef..519e52b303cb9a2d4b1cae84d8436f2057003fcb 100644
+index 2412cdb1bdaf7a558ad7235fca7ea5c74eeaad3f..f3a145be1970dd1e78e04b2ea0d77c6339a42fd8 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
@@ -158,6 +158,11 @@ public class Dolphin extends WaterAnimal {
@@ -174,7 +174,7 @@ index e818cf94d0a7def1f0abc8519e3b8ff4e7918aef..519e52b303cb9a2d4b1cae84d8436f20
@Override
public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) {
diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java
-index 86c7b7d3c340372a5c33f8a848a274240c0e8554..21c0431dd8abc06773b6a8ae76908a4227225326 100644
+index 9133fc6cf8ecc5670b5c3745c882430308e7c184..450a0b91fdeef9a868063c9501aa531ce3f8b3b7 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Fox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java
@@ -182,6 +182,11 @@ public class Fox extends Animal implements VariantHolder {
@@ -190,7 +190,7 @@ index 86c7b7d3c340372a5c33f8a848a274240c0e8554..21c0431dd8abc06773b6a8ae76908a42
protected void defineSynchedData() {
super.defineSynchedData();
diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
-index 6815d7350a82c6d32f60aa6116466ebd06a920f9..95ff109511c97d603aeaf9e73c49397a841fcbce 100644
+index cb05267fb287b9de9d1829e90d9bb9c9f4aac9f7..46e28d807a72b6d302d29d65c52ab0813cd82b1a 100644
--- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
+++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
@@ -81,6 +81,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob {
@@ -238,7 +238,7 @@ index 66f80ec010909648278c4e74c80d3766b9cf6c6a..14daac1a87e32e0ff0a610aef256e20c
return (Boolean) this.entityData.get(Ocelot.DATA_TRUSTING);
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java
-index f944a35c97e0a63714e04393ed6f44727c3fed2b..58dc720a0003055608b784c466c0ef17b39f4408 100644
+index 87a1a6ff04b40ceebded50e81aaafe67a802fa1b..846cbac0f862ec881347325dcd6db8eaedbd0e75 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Panda.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java
@@ -140,6 +140,12 @@ public class Panda extends Animal {
@@ -267,7 +267,7 @@ index f944a35c97e0a63714e04393ed6f44727c3fed2b..58dc720a0003055608b784c466c0ef17
if (this.isLazy()) {
diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java
-index 521ce86afafe329de97c0ef8e95fb503c999edda..c3e8d3f2212a8e8d12e8d233c9d12463f8a44439 100644
+index 06568c109d806a4e98b092016d0efd5b2cdfd359..9334fb348e559ee27ba38bbd51c30876206c2af4 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java
@@ -193,6 +193,11 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder getModelRotationValues() {
return this.modelRotationValues;
diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
-index 79f4a2d607a1cab694afb5cc571dbf59bc3cc7fa..3b94e5550681adaeb2a3c636d21456ae42426c47 100644
+index a1a382a4cc96ff1156bbd8cbc8298e4ae6540990..aace7991c198ccfe1338625e7b64b88921cefe0c 100644
--- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
+++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
@@ -320,6 +320,23 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Saddl
@@ -503,7 +503,7 @@ index 79f4a2d607a1cab694afb5cc571dbf59bc3cc7fa..3b94e5550681adaeb2a3c636d21456ae
protected SoundEvent getAmbientSound() {
return SoundEvents.CAMEL_AMBIENT;
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
-index dc6cda07d2ae7beb5361e3b20eb1fd073f70ad55..b50d30a22704efade7b87d4cf5817b2068a18084 100644
+index 41777079871eef2bb4d319f28c8f441d7f2607a1..24fb38499092d8cbee3818bf5c873a55465b1edb 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
@@ -162,6 +162,44 @@ public abstract class AbstractHorse extends Animal implements ContainerListener,
@@ -613,7 +613,7 @@ index 3e50581033e88e8eddcbd85bfa890cbe0b88a7e6..92339f5a07dcb6bf7eb1bce6d584464e
protected void randomizeAttributes(RandomSource random) {
this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt));
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
-index 40f2510f71608975eff411c632d6f36399130648..576b09328e956db0ed6e4ac28093429e4dcaab90 100644
+index 1c6be506804b9622c4d0094814939f894ca857df..34d87ab749a62c5d897b7bc66b116a801324b6a7 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
@@ -124,6 +124,21 @@ public class Llama extends AbstractChestedHorse implements VariantHolder brainProvider() {
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
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 1d5c60c08354bb64a6d671032c2e8b885ec4ca73..f75900e33a08bd6eb13fd480fe62b49346f47bac 100644
+index aa6533c40b73bc72a4906f0533f13e74e58c091a..65a22067af226751053c9df5e0771a960439f5fe 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
@@ -124,6 +124,11 @@ public class Zombie extends Monster {
@@ -1378,7 +1378,7 @@ index 1d5c60c08354bb64a6d671032c2e8b885ec4ca73..f75900e33a08bd6eb13fd480fe62b493
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
-index 3396acd9d361e05b8d7696d823c36c4fda945a23..6c96ca4bb3f94aaeaff87ae44500e87516fbf54f 100644
+index ba391ae0f8c361fb0ffbe0b65f12a008c21e4676..9fb70aabb68d5d14ab15420d8677e46c399912b2 100644
--- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -99,6 +99,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
@@ -1399,7 +1399,7 @@ index 3396acd9d361e05b8d7696d823c36c4fda945a23..6c96ca4bb3f94aaeaff87ae44500e875
protected void defineSynchedData() {
super.defineSynchedData();
diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
-index 252d2994fac423ea1fef36bdc7c09778203049cb..fa5fa58ee03243054a38475634a6aa67815ca77d 100644
+index 2121de85765d535effb3ef4e0c4a873238dd7576..9d1d8b5a3f2bac29f8058f68e2ded4d790a50321 100644
--- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
@@ -81,6 +81,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob {
@@ -1424,7 +1424,7 @@ index 252d2994fac423ea1fef36bdc7c09778203049cb..fa5fa58ee03243054a38475634a6aa67
@Nullable
diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
-index d040198ce528293ed95adcdb17ddf0acbc5a93e0..22788892f7286f3fa6b40059b2bedaf0c6ec5ef3 100644
+index 1d54077a7ebb463270a03bb17c342ced8874f4c2..9748b32692b14bffde1506e88149939c4ed25900 100644
--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
@@ -86,6 +86,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
@@ -1440,7 +1440,7 @@ index d040198ce528293ed95adcdb17ddf0acbc5a93e0..22788892f7286f3fa6b40059b2bedaf0
public boolean canBeLeashed(Player player) {
return !this.isLeashed();
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
-index f57d7fee1ece00aba9bc7b07dda8398e7acc73c3..d9b1bde3ce458b7e50f7645d07ee578d13006a0a 100644
+index 015bb57c73c7b38622329fc3001b6369fa183cd1..b5e6a48192592e9bc5a7c0a2775e5d78f06cd46a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -113,6 +113,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -1472,7 +1472,7 @@ index 2d842c0dfce1c7e7229bd42b2a92c024a4162b68..04e54c241078e6cd6419a21ba1bf913f
return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D);
}
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index 4ae36a344143c5aed4266dfef2920ff3d83b1b48..c21b06edb9507ddf9e5a1de56164d9c187f83cab 100644
+index 6e42633cc7393d579bfd4b756a5f651a71e2f02e..0d3ce8b8cc3a431ff28837179cd3e0080fe47649 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
@@ -179,6 +179,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -1488,7 +1488,7 @@ index 4ae36a344143c5aed4266dfef2920ff3d83b1b48..c21b06edb9507ddf9e5a1de56164d9c1
public Brain getBrain() {
return (Brain) super.getBrain(); // CraftBukkit - decompile error
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
-index 2bed7b373813660139d2322dcd6b83f3015768f0..731bf43e2685554174d7ff295b5561ecf9dd70fa 100644
+index 3782209c6d3408393e91ffe64976a15cba025843..5184939949ab54504f178f86fffba4507a895568 100644
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
@@ -87,6 +87,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
diff --git a/patches/server/0010-Barrels-and-enderchests-6-rows.patch b/patches/server/0010-Barrels-and-enderchests-6-rows.patch
index 64b74a08c..22bf57dca 100644
--- a/patches/server/0010-Barrels-and-enderchests-6-rows.patch
+++ b/patches/server/0010-Barrels-and-enderchests-6-rows.patch
@@ -5,13 +5,13 @@ Subject: [PATCH] Barrels and enderchests 6 rows
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 1fd58b708bb1d4ea374819a1fe4decf382589c76..d67557141f9ceb7d9eff63f8bfe1025b3716dc20 100644
+index 2a4b63ead77cf6117b1ebefe9d9dbd6c73ed4d95..9cc88489e9545b6d2de410d702a8395ccf101f89 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -1189,6 +1189,27 @@ public abstract class PlayerList {
player.getBukkitEntity().recalculatePermissions(); // CraftBukkit
this.server.getCommands().sendCommands(player);
- } // Paper
+ } // Paper - Add sendOpLevel API
+
+ // Purpur start
+ if (org.purpurmc.purpur.PurpurConfig.enderChestSixRows && org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) {
@@ -37,7 +37,7 @@ index 1fd58b708bb1d4ea374819a1fe4decf382589c76..d67557141f9ceb7d9eff63f8bfe1025b
public boolean isWhiteListed(GameProfile profile) {
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 19ed29dc7e4bcb9bedbb8c25174d48194132685e..b494e11e21e88228cb4986fb8685184913275e95 100644
+index b33f63016fc2818b0a6a05107e435e1c9be3ca97..1f7022c086c88d9a7b8672ede2a5a14f85999461 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -183,6 +183,7 @@ public abstract class Player extends LivingEntity {
diff --git a/patches/server/0012-AFK-API.patch b/patches/server/0012-AFK-API.patch
index 5c93d33fa..0950df7a3 100644
--- a/patches/server/0012-AFK-API.patch
+++ b/patches/server/0012-AFK-API.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] AFK API
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index c0b18bf97c8da4e843e08ccd39d4ef6d43295e54..23084dd2f99f893138a3b24879ed1ae3358c0b3b 100644
+index 6c6f084fcb2e9da843365ed4eac4f1c2d7550f33..d561f388a2e157c7e8846d1f987e8bcabe45426e 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -2234,8 +2234,68 @@ public class ServerPlayer extends Player {
@@ -78,7 +78,7 @@ index c0b18bf97c8da4e843e08ccd39d4ef6d43295e54..23084dd2f99f893138a3b24879ed1ae3
return this.stats;
}
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 671b5deba9eb3afddc4d0af7ce5e61c11cddd303..5c20086f0eb457568f8e091a240e7fc5e5364643 100644
+index d9f34bfb22f8b3ca444002acc861eeb5bd3b69e1..7c829f26b29bb3e02248bfd8d63b600c232ebd3e 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -325,6 +325,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@@ -105,7 +105,7 @@ index 671b5deba9eb3afddc4d0af7ce5e61c11cddd303..5c20086f0eb457568f8e091a240e7fc5
@@ -392,6 +406,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
}
- if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits.
+ if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits
+ // Purpur start
+ this.player.setAfk(true);
+ if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) {
@@ -115,7 +115,7 @@ index 671b5deba9eb3afddc4d0af7ce5e61c11cddd303..5c20086f0eb457568f8e091a240e7fc5
this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854
this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause
}
-@@ -642,6 +662,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -639,6 +659,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
this.lastYaw = to.getYaw();
this.lastPitch = to.getPitch();
@@ -124,7 +124,7 @@ index 671b5deba9eb3afddc4d0af7ce5e61c11cddd303..5c20086f0eb457568f8e091a240e7fc5
Location oldTo = to.clone();
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
this.cserver.getPluginManager().callEvent(event);
-@@ -1496,7 +1518,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1491,7 +1513,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
if (!event.isAllowed()) {
flag2 = true; // Paper - diff on change, this should be moved wrongly
if (event.getLogWarning())
@@ -133,7 +133,7 @@ index 671b5deba9eb3afddc4d0af7ce5e61c11cddd303..5c20086f0eb457568f8e091a240e7fc5
}
// Paper end - Add fail move event
}
-@@ -1566,6 +1588,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1561,6 +1583,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
this.lastYaw = to.getYaw();
this.lastPitch = to.getPitch();
@@ -165,7 +165,7 @@ index 823efad652d8ff9e96b99375b102fef6f017716e..caa8a69bde0c212c36dd990a67836ac2
}
// CraftBukkit start
diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java
-index dbbce471c35849ea7d7ad07e9db9b7d8d85690df..5eb63d857fea0f1c4dc1e6e4c7af8ea653dc7963 100644
+index b350d41a724048af06f9aa9bbef039d3d719c3a8..4f25d52e70752d56c0c03d437651638ac57fa576 100644
--- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
+++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
@@ -40,6 +40,7 @@ public final class EntitySelector {
@@ -177,7 +177,7 @@ index dbbce471c35849ea7d7ad07e9db9b7d8d85690df..5eb63d857fea0f1c4dc1e6e4c7af8ea6
private EntitySelector() {}
// Paper start
diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java
-index ac5e5676b194a2a99e5cf53eb89c1152cac963b8..872454743f6dedc27519a13566559195c47cc9f8 100644
+index 3c4f4af85a3f2d4f9f52827164e63727b916c33a..aa4dec55c1d4cd9796587ea3a3343131a4d2f0a4 100644
--- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java
+++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java
@@ -64,6 +64,10 @@ public class TargetingConditions {
@@ -192,7 +192,7 @@ index ac5e5676b194a2a99e5cf53eb89c1152cac963b8..872454743f6dedc27519a13566559195
if (baseEntity == null) {
if (this.isCombat && (!targetEntity.canBeSeenAsEnemy() || targetEntity.level().getDifficulty() == Difficulty.PEACEFUL)) {
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 b494e11e21e88228cb4986fb8685184913275e95..71c0a6c896b0f608bc8bc494810723242e291c32 100644
+index 1f7022c086c88d9a7b8672ede2a5a14f85999461..59da5e5437fd060279584d6b16071dcd92ac9d33 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -189,6 +189,13 @@ public abstract class Player extends LivingEntity {
@@ -223,7 +223,7 @@ index ff0b7b9e4ae3aa0c170d05bc51fd7ff26e7531ee..53d4000593d4c79de8e8ab04bfd614b7
if (range < 0.0D || d < range * range) {
return true;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 69f8a65a396890176e5f1106f5560a3f5589f742..d678d2f374cc10d19879a4ebfcd601f34bb5edbc 100644
+index 4ab63267c4ec808d3daf94478a1425b5aa70b75f..833d20484c3bd5b59fff64141f2aa352742a3d5f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -524,10 +524,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -317,7 +317,7 @@ index e248395ad5f5f012aeefecf367d54f90cade0996..70f53ccb22de2c05c9ead68f8bd29d0b
public boolean untamedTamablesAreRidable = true;
public boolean useNightVisionWhenRiding = false;
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
-index 651063863b451d24ffe39f0a4d8db296e58ff585..9c1452a4125af81c045933fce78ceb3963b787bf 100644
+index a69814d3a6214af734d670fe5545518a5f8a8dc5..a2227d7148910631c9cec73aef2c24e223385963 100644
--- a/src/main/java/org/spigotmc/ActivationRange.java
+++ b/src/main/java/org/spigotmc/ActivationRange.java
@@ -203,6 +203,7 @@ public class ActivationRange
diff --git a/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch
index 8ffcaf0bb..a4716e9ce 100644
--- a/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch
+++ b/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch
@@ -17,13 +17,13 @@ index f655e0ae4a287886d0291cd0089bad2000249d0f..fcb5965ff0a9623a8e63a4b7413ad554
} else {
this.startProgress(advancementholder, advancementprogress);
diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
-index 277c8e429481ca9763ddac9e700735d25aba78e9..3632957dfd39dc5dcb288fb86c0cadc37f1b4d27 100644
+index 5ece375eaf6bcc61864997a389bb5e24625e4505..aee4ab6c7ea09006bec4a1c6df0005718c6d86bd 100644
--- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java
+++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
@@ -318,6 +318,7 @@ public class WorldGenRegion implements WorldGenLevel {
return true;
} else {
- // Paper start
+ // Paper start - Buffer OOB setBlock calls
+ if (!org.purpurmc.purpur.PurpurConfig.loggerSuppressSetBlockFarChunk) // Purpur
if (!hasSetFarWarned) {
Util.logAndPauseIfInIde("Detected setBlock in a far chunk [" + i + ", " + j + "], pos: " + pos + ", status: " + this.generatingStatus + (this.currentlyGenerating == null ? "" : ", currently generating: " + (String) this.currentlyGenerating.get()));
diff --git a/patches/server/0025-Zombie-horse-naturally-spawn.patch b/patches/server/0025-Zombie-horse-naturally-spawn.patch
index d5ca64cce..141a89c14 100644
--- a/patches/server/0025-Zombie-horse-naturally-spawn.patch
+++ b/patches/server/0025-Zombie-horse-naturally-spawn.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Zombie horse naturally spawn
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index e2f722b2c5f27a3dca5e8745a9b51d2abc748c22..7beac121beb299deb412419a0c329152bb4286e2 100644
+index a129e8ef37fef6fa289e6457b68a221947ef0348..a89a84f0955c5f3bee8abf529b585f04d5349de2 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1021,10 +1021,18 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1016,10 +1016,18 @@ public class ServerLevel extends Level implements WorldGenLevel {
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
if (flag1) {
diff --git a/patches/server/0032-Add-option-to-set-armorstand-step-height.patch b/patches/server/0032-Add-option-to-set-armorstand-step-height.patch
index c46c8454d..54ce4727d 100644
--- a/patches/server/0032-Add-option-to-set-armorstand-step-height.patch
+++ b/patches/server/0032-Add-option-to-set-armorstand-step-height.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add option to set armorstand step height
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 960b772977adf13c8765dd115346ca53303f7823..08b01dd22f4cef8e866a05f6a281afee8cd1d95e 100644
+index 036688d52541dda8d8eef6fee43823844f245124..7ca03d221e33cec1df99b6dcd60fcdd401530938 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -337,7 +337,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -336,7 +336,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public double xOld;
public double yOld;
public double zOld;
@@ -18,7 +18,7 @@ index 960b772977adf13c8765dd115346ca53303f7823..08b01dd22f4cef8e866a05f6a281afee
public final RandomSource random;
public int tickCount;
diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
-index a9c1f99ba2461333bd154ac16e812031f234f7a6..86e6b4e52a346f4e0370d0bad48ba4643daaadd7 100644
+index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..61a2048625df012f563d3a0db567630bdfe489c3 100644
--- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
+++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
@@ -677,6 +677,7 @@ public class ArmorStand extends LivingEntity {
@@ -26,7 +26,7 @@ index a9c1f99ba2461333bd154ac16e812031f234f7a6..86e6b4e52a346f4e0370d0bad48ba464
@Override
public void tick() {
+ maxUpStep = level().purpurConfig.armorstandStepHeight;
- // Paper start
+ // Paper start - Allow ArmorStands not to tick
if (!this.canTick) {
if (this.noTickPoseDirty) {
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
diff --git a/patches/server/0039-Allow-soil-to-moisten-from-water-directly-under-it.patch b/patches/server/0039-Allow-soil-to-moisten-from-water-directly-under-it.patch
index 4e95f5d51..fb452fea2 100644
--- a/patches/server/0039-Allow-soil-to-moisten-from-water-directly-under-it.patch
+++ b/patches/server/0039-Allow-soil-to-moisten-from-water-directly-under-it.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Allow soil to moisten from water directly under it
diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java
-index 59bbdead2ebd8965d222540c7243dde051bbcc4b..bcc864cbfb9f24ad654da1fcbf7d7c76ed494ce3 100644
+index 47eb8bf604a63259c0200cada1403dc005a6cbac..4837453b2186d50da0bbcbcdc0bfe562c9f36039 100644
--- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java
@@ -171,7 +171,7 @@ public class FarmBlock extends Block {
@@ -14,11 +14,11 @@ index 59bbdead2ebd8965d222540c7243dde051bbcc4b..bcc864cbfb9f24ad654da1fcbf7d7c76
- return false;
+ return ((ServerLevel) world).purpurConfig.farmlandGetsMoistFromBelow && world.getFluidState(pos.relative(Direction.DOWN)).is(FluidTags.WATER); // Purpur;
+ // Paper end - Perf: remove abstract block iteration
}
- @Override
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 10572cc8cae0902a050e62e568b29b96d9c54a21..ae393a6c34e79ea3ac0f4a17792f296f18c3f06b 100644
+index f9768a250a4a1543caa3aeab7e745e289d18d2e4..113d827713b409cc3093c39a56439d7c0d04e129 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -145,6 +145,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0044-Skip-events-if-there-s-no-listeners.patch b/patches/server/0044-Skip-events-if-there-s-no-listeners.patch
index 9fc44407d..e05b2489d 100644
--- a/patches/server/0044-Skip-events-if-there-s-no-listeners.patch
+++ b/patches/server/0044-Skip-events-if-there-s-no-listeners.patch
@@ -5,13 +5,13 @@ Subject: [PATCH] Skip events if there's no listeners
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
-index 8fe48c6bf65db6b11fcd0674aad01d5bb8d17a5f..8572142117fbc469199a538c4624b2f064e8cb6f 100644
+index 92e8aed5efd5c6f7f8baf44f4712209acd58cf83..ac63c371eb5a24bccec561826913a39c6e96694d 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
@@ -507,6 +507,7 @@ public class Commands {
private void runSync(ServerPlayer player, Collection bukkit, RootCommandNode rootcommandnode) {
- // Paper end - Async command map building
- new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper
+ // Paper end - Perf: Async command map building
+ new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper - Brigadier API
+ if (PlayerCommandSendEvent.getHandlerList().getRegisteredListeners().length > 0) { // Purpur - skip all this crap if there's nothing listening
PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit));
event.getPlayer().getServer().getPluginManager().callEvent(event);
diff --git a/patches/server/0050-Allow-leashing-villagers.patch b/patches/server/0050-Allow-leashing-villagers.patch
index c84bc7b6f..1b83a7452 100644
--- a/patches/server/0050-Allow-leashing-villagers.patch
+++ b/patches/server/0050-Allow-leashing-villagers.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Allow leashing villagers
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index f17b7e83a04a2cd738f7d708891fec2e341f3f96..a36994947d3a4f06f102bb143e44d0d7510f8338 100644
+index 749de94a6e41d44a6041f67c7d0e2205e10a26ab..3cbfdb6cc09ef6fc13ecb110c751c93f93ab01bf 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -1317,6 +1317,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
@@ -14,10 +14,10 @@ index f17b7e83a04a2cd738f7d708891fec2e341f3f96..a36994947d3a4f06f102bb143e44d0d7
} else if (this.getLeashHolder() == player) {
+ if (hand == InteractionHand.OFF_HAND && (level().purpurConfig.villagerCanBeLeashed || level().purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.AbstractVillager) return InteractionResult.CONSUME; // Purpur
// CraftBukkit start - fire PlayerUnleashEntityEvent
- // Paper start - drop leash variable
+ // Paper start - Expand EntityUnleashEvent
org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.getAbilities().instabuild);
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index a39457752612fc0dbbb022cb7faebc73bc2ad5e5..f4ed6ae7e8f122a0a2ce7f4488b0fe1ed0c7da3d 100644
+index 3a9de6da37bf12a86723f185a9cfefde123047be..1c75cbd9f998829f200c9ad679b9cd0213915607 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
@@ -185,6 +185,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -33,7 +33,7 @@ index a39457752612fc0dbbb022cb7faebc73bc2ad5e5..f4ed6ae7e8f122a0a2ce7f4488b0fe1e
public Brain getBrain() {
return (Brain) super.getBrain(); // CraftBukkit - decompile error
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
-index 64dd35573db3feae6507fc05086ed08c60f5ea01..ad7a32169b0decad1d3a2bd98e25b07731a33d03 100644
+index 8ead6c74e598eeeccb5f24cc3d1e86f03d2fe46a..8ab868c88e37fad978ffcf151ad527e57bdf4cb5 100644
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
@@ -92,6 +92,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
diff --git a/patches/server/0051-Implement-infinite-liquids.patch b/patches/server/0051-Implement-infinite-liquids.patch
index 3d0d9ab99..8dd81a462 100644
--- a/patches/server/0051-Implement-infinite-liquids.patch
+++ b/patches/server/0051-Implement-infinite-liquids.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Implement infinite liquids
diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
-index c55f51e6db55f9fa66f53eef0e7a56af5f81d742..74688f4672936cd2ac629b9f2f404163df6730e9 100644
+index 6411aa4ff6bd4cabb25c426fa8f4a7eedb969c03..0fe597d32a0e15ea67b32925c1a62e8c143ff81d 100644
--- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
+++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java
-@@ -228,7 +228,7 @@ public abstract class FlowingFluid extends Fluid {
+@@ -227,7 +227,7 @@ public abstract class FlowingFluid extends Fluid {
}
}
@@ -17,7 +17,7 @@ index c55f51e6db55f9fa66f53eef0e7a56af5f81d742..74688f4672936cd2ac629b9f2f404163
BlockState iblockdata2 = world.getBlockState(pos.below());
FluidState fluid1 = iblockdata2.getFluidState();
-@@ -337,6 +337,12 @@ public abstract class FlowingFluid extends Fluid {
+@@ -336,6 +336,12 @@ public abstract class FlowingFluid extends Fluid {
protected abstract boolean canConvertToSource(Level world);
@@ -31,7 +31,7 @@ index c55f51e6db55f9fa66f53eef0e7a56af5f81d742..74688f4672936cd2ac629b9f2f404163
if (state.getBlock() instanceof LiquidBlockContainer) {
((LiquidBlockContainer) state.getBlock()).placeLiquid(world, pos, state, fluidState);
diff --git a/src/main/java/net/minecraft/world/level/material/LavaFluid.java b/src/main/java/net/minecraft/world/level/material/LavaFluid.java
-index c3f8e1e2dd89c168b8b4a15b589109db486bc8d7..2076e4b433e0a57e3ae7053c1df77e0cdc457fc9 100644
+index 3bb4a9a1a6249e8ba2de237f801210e7f4fd5825..4c230136d832d50ae16ffa037b0b30ff1101b50a 100644
--- a/src/main/java/net/minecraft/world/level/material/LavaFluid.java
+++ b/src/main/java/net/minecraft/world/level/material/LavaFluid.java
@@ -198,6 +198,13 @@ public abstract class LavaFluid extends FlowingFluid {
@@ -49,7 +49,7 @@ index c3f8e1e2dd89c168b8b4a15b589109db486bc8d7..2076e4b433e0a57e3ae7053c1df77e0c
protected boolean canConvertToSource(Level world) {
return world.getGameRules().getBoolean(GameRules.RULE_LAVA_SOURCE_CONVERSION);
diff --git a/src/main/java/net/minecraft/world/level/material/WaterFluid.java b/src/main/java/net/minecraft/world/level/material/WaterFluid.java
-index d280c98aed5262c4ce39526c917de884f25a8584..e7d9f6802520620a1dcf0938256ffe80fc72a6f0 100644
+index cde93efaecd42b9081405638af3ba91cb5e184c9..c664fd77dd865037293a3e86699fd1fa6b703882 100644
--- a/src/main/java/net/minecraft/world/level/material/WaterFluid.java
+++ b/src/main/java/net/minecraft/world/level/material/WaterFluid.java
@@ -64,6 +64,13 @@ public abstract class WaterFluid extends FlowingFluid {
@@ -63,11 +63,11 @@ index d280c98aed5262c4ce39526c917de884f25a8584..e7d9f6802520620a1dcf0938256ffe80
+ }
+ // Purpur end
+
- // Paper start
+ // Paper start - Add BlockBreakBlockEvent
@Override
protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) {
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 5ac666f1a71770891b3b437b2d68b0c5a952358f..e1fd29d376fc52e7519d93073b3823e616cea2c1 100644
+index 40a0cd68b1e35894360f0edc45bc30a5bd47622f..783c238cc0e68e52b0f20ea535a208d3bec663de 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -221,6 +221,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0054-Configurable-void-damage-height-and-damage.patch b/patches/server/0054-Configurable-void-damage-height-and-damage.patch
index ee1488f7f..a4b20b03f 100644
--- a/patches/server/0054-Configurable-void-damage-height-and-damage.patch
+++ b/patches/server/0054-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 94f5c8de371fba03debf37e36fb1c9fc9c8ce78c..f4b22c7916c79275f44079ca9796099b5e142f37 100644
+index 7ca03d221e33cec1df99b6dcd60fcdd401530938..9f354cbc17e66c425a274b00f15e6cf51cdb2cee 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -903,7 +903,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -902,7 +902,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public void checkBelowWorld() {
// Paper start - Configurable nether ceiling damage
@@ -18,7 +18,7 @@ index 94f5c8de371fba03debf37e36fb1c9fc9c8ce78c..f4b22c7916c79275f44079ca9796099b
&& (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
// Paper end
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 65a3949679b3d600b972eb6058af6eebc7367d6a..ae710015f2ef933fc61de4978f773e0014a80023 100644
+index c27e254d42697f028f3aca902bcb58ba33f95ce4..d668fd41d2bc2ab6a782cf5415507cbd83754c18 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -2541,7 +2541,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
diff --git a/patches/server/0055-Add-canSaveToDisk-to-Entity.patch b/patches/server/0055-Add-canSaveToDisk-to-Entity.patch
index 6faffa19a..1e6bf3f8b 100644
--- a/patches/server/0055-Add-canSaveToDisk-to-Entity.patch
+++ b/patches/server/0055-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 b4d249de8471499f17fc61a21b9d738f7d329f38..872f88d8d3c3b7b0ce82fda15017b32280bfef4a 100644
+index 9f354cbc17e66c425a274b00f15e6cf51cdb2cee..96e79ca690a3951dd24601673703f914465c48a3 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -499,6 +499,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -498,6 +498,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return false;
}
@@ -36,15 +36,15 @@ index 4a2331c22a022881d66bcfd4134b0ffe421a0633..d57ef27df0a3597416564f8723b4b986
public boolean isPickable() {
return false;
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
-index 060e064625969610539dbf969ce773b877a7c579..32cd9df202704cdfb8fa06aaf0e738d483054feb 100644
+index 23dc37ff1f92951817864963bf93220d5aae91bb..af563ffb67c43b50555951fe1b5e4320d429a7f1 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/EntityStorage.java
@@ -112,6 +112,7 @@ public class EntityStorage implements EntityPersistentStorage {
ListTag listTag = new ListTag();
- final java.util.Map, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper
+ final java.util.Map, Integer> savedEntityCounts = new java.util.HashMap<>(); // Paper - Entity load/save limit per chunk
entities.forEach((entity) -> { // diff here: use entities parameter
+ if (!entity.canSaveToDisk()) return; // Purpur
- // Paper start
+ // Paper start - Entity load/save limit per chunk
final EntityType> entityType = entity.getType();
final int saveLimit = level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1);
diff --git a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java
diff --git a/patches/server/0060-Implement-elytra-settings.patch b/patches/server/0060-Implement-elytra-settings.patch
index d0175571a..a3e77c30e 100644
--- a/patches/server/0060-Implement-elytra-settings.patch
+++ b/patches/server/0060-Implement-elytra-settings.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Implement elytra settings
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index ae710015f2ef933fc61de4978f773e0014a80023..1abf3eb5a32cf67212e74be69ab008af772eb378 100644
+index d668fd41d2bc2ab6a782cf5415507cbd83754c18..579f3d49c2804f1a7de687426402cdf9d950fad9 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -3567,7 +3567,16 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -27,7 +27,7 @@ index ae710015f2ef933fc61de4978f773e0014a80023..1abf3eb5a32cf67212e74be69ab008af
});
}
diff --git a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
-index 82b0bda3e35ec2157a477e1a17b2b46baadc97d9..0fc45b1048a1c4e0dc2bd1ae0437eecbe113cf96 100644
+index 0821c06a4c66edc8fcee09fc192335a588d2944b..56d7c05c93bc074f6caba51b1741f25d6f0861cd 100644
--- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
+++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java
@@ -15,6 +15,7 @@ import net.minecraft.util.ByIdMap;
@@ -54,7 +54,7 @@ index 82b0bda3e35ec2157a477e1a17b2b46baadc97d9..0fc45b1048a1c4e0dc2bd1ae0437eecb
itemStack.shrink(1);
} else ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory();
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
-index 1d2a706a4eee7523bbe89bc18b6d9ddd80581c3a..ee621bad75053831d5c88c783fd8af6359d2c281 100644
+index 65d1b22d3d3670f009308750013347a15d082e18..345ca7da64f646f1d6f0cde68269b697926cf17e 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
@@ -641,7 +641,7 @@ public final class ItemStack {
@@ -67,7 +67,7 @@ index 1d2a706a4eee7523bbe89bc18b6d9ddd80581c3a..ee621bad75053831d5c88c783fd8af63
for (int l = 0; j > 0 && l < amount; ++l) {
@@ -696,6 +696,12 @@ public final class ItemStack {
- if (this.hurt(amount, entity.getRandom(), entity /*instanceof ServerPlayer ? (ServerPlayer) entity : null*/)) { // Paper - pass LivingEntity for EntityItemDamageEvent
+ if (this.hurt(amount, entity.getRandom(), entity /*instanceof ServerPlayer ? (ServerPlayer) entity : null*/)) { // Paper - Add EntityDamageItemEvent
breakCallback.accept(entity);
Item item = this.getItem();
+ // Purpur start
@@ -80,7 +80,7 @@ index 1d2a706a4eee7523bbe89bc18b6d9ddd80581c3a..ee621bad75053831d5c88c783fd8af63
if (this.count == 1 && entity instanceof net.minecraft.world.entity.player.Player) {
org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((net.minecraft.world.entity.player.Player) entity, this);
diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java
-index 5fab851b319847035fb1eefd0ab999de3ccc2cd8..f1d6db9382bec49f61657168fe56b06784d02cf5 100644
+index fa876ddf54780728e7f3ecfe02aa8a16b8ef6f8d..75cf58919ac787b389286b41a9f0b5a945e71649 100644
--- a/src/main/java/net/minecraft/world/item/TridentItem.java
+++ b/src/main/java/net/minecraft/world/item/TridentItem.java
@@ -131,6 +131,14 @@ public class TridentItem extends Item implements Vanishable {
diff --git a/patches/server/0061-Item-entity-immunities.patch b/patches/server/0061-Item-entity-immunities.patch
index c2b35c396..5ea8975e3 100644
--- a/patches/server/0061-Item-entity-immunities.patch
+++ b/patches/server/0061-Item-entity-immunities.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Item entity immunities
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
-index e385a62058204ba3b01ce594e7c180f9cc6cf664..92ca330bee2f58bde93c8da12a8f5c14e29de540 100644
+index 79914528f6d255355284b04253218a7c4dec1ead..2568b4ad72a7b99484aaa048257a3b5465b63b9d 100644
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
@@ -73,7 +73,7 @@ public class ServerEntity {
@@ -18,12 +18,12 @@ index e385a62058204ba3b01ce594e7c180f9cc6cf664..92ca330bee2f58bde93c8da12a8f5c14
public ServerEntity(ServerLevel worldserver, Entity entity, int i, boolean flag, Consumer> consumer, Set trackedPlayers) {
this.trackedPlayers = trackedPlayers;
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
-index c34c698d389da29c9cfaa56cb8023e30416a14ba..7844ee584b917485ce5e490ad040c2c1d732eb1d 100644
+index 635f93b4205bd11a8080fbc1db53aa2430aacb77..f4bf401f53e420a6b0635a616dce386d0ab56be7 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
@@ -58,6 +58,12 @@ public class ItemEntity extends Entity implements TraceableEntity {
public boolean canMobPickup = true; // Paper
- private int despawnRate = -1; // Paper
+ private int despawnRate = -1; // Paper - Alternative item-despawn-rate
public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
+ // Purpur start
+ public boolean immuneToCactus = false;
@@ -55,7 +55,7 @@ index c34c698d389da29c9cfaa56cb8023e30416a14ba..7844ee584b917485ce5e490ad040c2c1
@@ -567,6 +582,12 @@ public class ItemEntity extends Entity implements TraceableEntity {
public void setItem(ItemStack stack) {
this.getEntityData().set(ItemEntity.DATA_ITEM, stack);
- this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper
+ this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate
+ // Purpur start
+ if (level().purpurConfig.itemImmuneToCactus.contains(stack.getItem())) immuneToCactus = true;
+ if (level().purpurConfig.itemImmuneToExplosion.contains(stack.getItem())) immuneToExplosion = true;
@@ -66,7 +66,7 @@ index c34c698d389da29c9cfaa56cb8023e30416a14ba..7844ee584b917485ce5e490ad040c2c1
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
-index 81498941748d646ebe6495f4a7ce6953532144c6..14d6ff11c8b8b047ada5d308515e9d214cf77b69 100644
+index 832def3c518be8d6d81e71f6022566e6179e2d17..e99007570a89eebe3c85ad549cf24286514306f8 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
@@ -151,4 +151,46 @@ public class CraftItem extends CraftEntity implements Item {
diff --git a/patches/server/0066-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0066-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
index 797c7a03d..6aa570d76 100644
--- a/patches/server/0066-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
+++ b/patches/server/0066-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
-index ffc5b68c4246a7111845230a75552bb15875a209..ef0098e46bda8abc456f2bb5929d874c6aeb8698 100644
+index c99ab157e43fc990549fc06f5b6fb1e227014fde..4f0e1a653a117687b5b330ff424873d01f574bee 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
@@ -30,6 +30,12 @@ public class EndCrystal extends Entity {
@@ -21,11 +21,11 @@ index ffc5b68c4246a7111845230a75552bb15875a209..ef0098e46bda8abc456f2bb5929d874c
public EndCrystal(EntityType extends EndCrystal> type, Level world) {
super(type, world);
-@@ -79,7 +85,50 @@ public class EndCrystal extends Entity {
- // Paper end
+@@ -158,6 +164,49 @@ public class EndCrystal extends Entity {
+ }
}
-+ // Purpur start
++ // Purpur start
+ if (level().purpurConfig.phantomAttackedByCrystalRadius <= 0 || --idleCooldown > 0) {
+ return; // on cooldown
+ }
@@ -67,13 +67,12 @@ index ffc5b68c4246a7111845230a75552bb15875a209..ef0098e46bda8abc456f2bb5929d874c
+ phantomBeamTicks = 0;
+ phantomDamageCooldown = 0;
+ idleCooldown = 60;
- }
+ // Purpur end
+ }
- @Override
- protected void addAdditionalSaveData(CompoundTag nbt) {
+ public void setBeamTarget(@Nullable BlockPos beamTarget) {
diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
-index 8446ce22139fa2473c789cab67f4031a23f0d31d..ef41a462b102981d30207299d0279fd51b433a22 100644
+index 6819acda60e783ee57dd8b9b5d27bc1e105425c3..4153b621c04168f1f78c526f31a46d9b1fecf3a7 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
@@ -50,6 +50,7 @@ public class Phantom extends FlyingMob implements Enemy {
@@ -131,7 +130,7 @@ index 8446ce22139fa2473c789cab67f4031a23f0d31d..ef41a462b102981d30207299d0279fd5
this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal());
}
-@@ -353,6 +377,124 @@ public class Phantom extends FlyingMob implements Enemy {
+@@ -352,6 +376,124 @@ public class Phantom extends FlyingMob implements Enemy {
private AttackPhase() {}
}
@@ -257,7 +256,7 @@ index 8446ce22139fa2473c789cab67f4031a23f0d31d..ef41a462b102981d30207299d0279fd5
private float speed = 0.1F;
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 5fd4129889b3006018612204bc527738a78a0d35..262c6a2b63316fda5fa98fa4fcfbc0985951f6ee 100644
+index 5c83d5b665bfccd7c54c18012d4bec7d975de3f2..522ffc7b0d7a028436c385da4809070fb6095c4c 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -1065,6 +1065,9 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0067-Add-phantom-spawning-options.patch b/patches/server/0067-Add-phantom-spawning-options.patch
index fc584d85e..72e52ca6c 100644
--- a/patches/server/0067-Add-phantom-spawning-options.patch
+++ b/patches/server/0067-Add-phantom-spawning-options.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add phantom spawning options
diff --git a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java
-index 7d7d37334321c844958ce09e77547dd61dcba6c8..e731fd6f196116f4995dc6de8ad06b1985abe22b 100644
+index ed80960777b18faca2d6a99783e53daf5fa19e09..0847aef56d8608cb1403485f231f30b2527f35ab 100644
--- a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java
+++ b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java
@@ -49,7 +49,7 @@ public class PhantomSpawner implements CustomSpawner {
@@ -18,7 +18,7 @@ index 7d7d37334321c844958ce09e77547dd61dcba6c8..e731fd6f196116f4995dc6de8ad06b19
} else {
int i = 0;
@@ -61,10 +61,10 @@ public class PhantomSpawner implements CustomSpawner {
- if (!entityplayer.isSpectator() && (!world.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !entityplayer.isCreative())) { // Paper
+ if (!entityplayer.isSpectator() && (!world.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !entityplayer.isCreative())) { // Paper - Add phantom creative and insomniac controls
BlockPos blockposition = entityplayer.blockPosition();
- if (!world.dimensionType().hasSkyLight() || blockposition.getY() >= world.getSeaLevel() && world.canSeeSky(blockposition)) {
@@ -38,7 +38,7 @@ index 7d7d37334321c844958ce09e77547dd61dcba6c8..e731fd6f196116f4995dc6de8ad06b19
+ int k = world.purpurConfig.phantomSpawnMinPerAttempt + world.random.nextInt((world.purpurConfig.phantomSpawnMaxPerAttempt < 0 ? difficultydamagescaler.getDifficulty().getId() : world.purpurConfig.phantomSpawnMaxPerAttempt - world.purpurConfig.phantomSpawnMinPerAttempt) + 1); // Purpur
for (int l = 0; l < k; ++l) {
- // Paper start
+ // Paper start - PhantomPreSpawnEvent
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
index 522ffc7b0d7a028436c385da4809070fb6095c4c..28c92b79be65b35b691661f6d63c2f66c9a3a337 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
diff --git a/patches/server/0070-Add-allow-water-in-end-world-option.patch b/patches/server/0070-Add-allow-water-in-end-world-option.patch
index 10e65f39c..7c3b50191 100644
--- a/patches/server/0070-Add-allow-water-in-end-world-option.patch
+++ b/patches/server/0070-Add-allow-water-in-end-world-option.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add allow water in end world option
diff --git a/src/main/java/net/minecraft/world/item/BucketItem.java b/src/main/java/net/minecraft/world/item/BucketItem.java
-index aa0f09a18ea781e027ea70928b30d3e93061120f..5cb8f1e13f4889792395d6b498c0ade22a33b446 100644
+index 6371f326fc86cfc53e39bf8ed13b646f7705fbbc..3dec0c5fc8dece5341634eaf8e94fe1964bf4038 100644
--- a/src/main/java/net/minecraft/world/item/BucketItem.java
+++ b/src/main/java/net/minecraft/world/item/BucketItem.java
@@ -195,7 +195,7 @@ public class BucketItem extends Item implements DispensibleContainerItem {
@@ -27,10 +27,10 @@ index aa0f09a18ea781e027ea70928b30d3e93061120f..5cb8f1e13f4889792395d6b498c0ade2
return true;
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index 6ed3b2803c22ddac4234d573cecbaa5991a320d9..f0d9c35062983b0308820feee621caf6e4a6648a 100644
+index 5b5ac2d194cb9377f5ea3441505aefd3f7dbce8b..1c8653222f07f5aa12639a95c13fdcdfd5dd87c0 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -1914,4 +1914,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1913,4 +1913,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
}
// Paper end - notify observers even if grow failed
@@ -46,12 +46,12 @@ index 6ed3b2803c22ddac4234d573cecbaa5991a320d9..f0d9c35062983b0308820feee621caf6
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/level/block/IceBlock.java b/src/main/java/net/minecraft/world/level/block/IceBlock.java
-index 9ebe74e235d425fde985a6180857dc4039ecfedf..2c21888c477b93f38adaf18abe62732b08e1c9c2 100644
+index 9c8c1df5187daefb1c8098b4d4a0976c71a7bbfd..cf4c1097d54c84b309ab02e9892d1b9e39d57490 100644
--- a/src/main/java/net/minecraft/world/level/block/IceBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/IceBlock.java
@@ -41,7 +41,7 @@ public class IceBlock extends HalfTransparentBlock {
public void afterDestroy(Level world, BlockPos pos, ItemStack tool) {
- // Paper end
+ // Paper end - Improve Block#breakNaturally API
if (EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) == 0) {
- if (world.dimensionType().ultraWarm()) {
+ if (world.isNether() || (world.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) { // Purpur
diff --git a/patches/server/0071-Allow-color-codes-in-books.patch b/patches/server/0071-Allow-color-codes-in-books.patch
index 8bf3e6835..89fece660 100644
--- a/patches/server/0071-Allow-color-codes-in-books.patch
+++ b/patches/server/0071-Allow-color-codes-in-books.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Allow color codes in books
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 534b072024d6d2f6a23b3e8fde7fe685c961d4c9..3255e7d874a397dadf7dbc3ee3f994e5f41f4900 100644
+index 7c829f26b29bb3e02248bfd8d63b600c232ebd3e..063a1a979755d63bd3d099f07348c7a587adbe3d 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1234,13 +1234,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1231,13 +1231,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
itemstack1.setTag(nbttagcompound.copy());
}
@@ -28,7 +28,7 @@ index 534b072024d6d2f6a23b3e8fde7fe685c961d4c9..3255e7d874a397dadf7dbc3ee3f994e5
this.updateBookPages(pages, (s) -> {
return Component.Serializer.toJson(Component.literal(s));
-@@ -1252,10 +1255,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1249,10 +1252,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
private void updateBookPages(List list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit
ListTag nbttaglist = new ListTag();
@@ -44,7 +44,7 @@ index 534b072024d6d2f6a23b3e8fde7fe685c961d4c9..3255e7d874a397dadf7dbc3ee3f994e5
Objects.requireNonNull(nbttaglist);
stream.forEach(nbttaglist::add);
-@@ -1265,11 +1271,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1262,11 +1268,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
for (int j = list.size(); i < j; ++i) {
FilteredText filteredtext = (FilteredText) list.get(i);
@@ -58,7 +58,7 @@ index 534b072024d6d2f6a23b3e8fde7fe685c961d4c9..3255e7d874a397dadf7dbc3ee3f994e5
}
}
-@@ -1282,6 +1288,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1279,6 +1285,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(this.player, slot, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent)
}
diff --git a/patches/server/0072-Entity-lifespan.patch b/patches/server/0072-Entity-lifespan.patch
index df26795f3..f4910e443 100644
--- a/patches/server/0072-Entity-lifespan.patch
+++ b/patches/server/0072-Entity-lifespan.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entity lifespan
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 3255e7d874a397dadf7dbc3ee3f994e5f41f4900..2979e843ba65fece078a3d5ab5256d5e656f8912 100644
+index 063a1a979755d63bd3d099f07348c7a587adbe3d..2cb344c02a3812225679d7392b9f557309d05010 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2751,6 +2751,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2746,6 +2746,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
AABB axisalignedbb = entity.getBoundingBox();
if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.MAX_INTERACTION_DISTANCE) {
@@ -17,7 +17,7 @@ index 3255e7d874a397dadf7dbc3ee3f994e5f41f4900..2979e843ba65fece078a3d5ab5256d5e
private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit
ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand);
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index bbac0cf5e2c216b6ac61e4fcd2b15d28bbf648ec..f36f0291002dae00eceee96f9f9d210ccea8da31 100644
+index 8352b81387a9c558e377dee294e781d12aba45b0..53b193c0f4c1990055106b60874c24036571e951 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -136,6 +136,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
diff --git a/patches/server/0075-Phantoms-burn-in-light.patch b/patches/server/0075-Phantoms-burn-in-light.patch
index 87039d62b..38a37551d 100644
--- a/patches/server/0075-Phantoms-burn-in-light.patch
+++ b/patches/server/0075-Phantoms-burn-in-light.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Phantoms burn in light
diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
-index ef41a462b102981d30207299d0279fd51b433a22..6849b2ad3b2db840a1af35ef069490506449c861 100644
+index 4153b621c04168f1f78c526f31a46d9b1fecf3a7..fd9cb719c0380993a506bd803128cb2d7f0c37cb 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
@@ -50,6 +50,7 @@ public class Phantom extends FlyingMob implements Enemy {
@@ -20,17 +20,17 @@ index ef41a462b102981d30207299d0279fd51b433a22..6849b2ad3b2db840a1af35ef06949050
@Override
public void aiStep() {
-- if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning
+- if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API
+ // Purpur start
+ boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight;
+ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight;
-+ if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - Configurable Burning
++ if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API
+ if (getRider() == null || !this.isControllable())
-+ // Purpur end
++ // Purpur end
if (getRider() == null || !this.isControllable()) // Purpur
this.setSecondsOnFire(8);
}
-@@ -661,6 +667,12 @@ public class Phantom extends FlyingMob implements Enemy {
+@@ -660,6 +666,12 @@ public class Phantom extends FlyingMob implements Enemy {
return false;
} else if (!entityliving.isAlive()) {
return false;
@@ -43,7 +43,7 @@ index ef41a462b102981d30207299d0279fd51b433a22..6849b2ad3b2db840a1af35ef06949050
} else {
if (entityliving instanceof Player) {
Player entityhuman = (Player) entityliving;
-@@ -806,6 +818,7 @@ public class Phantom extends FlyingMob implements Enemy {
+@@ -805,6 +817,7 @@ public class Phantom extends FlyingMob implements Enemy {
this.nextScanTick = reducedTickDelay(60);
List list = Phantom.this.level().getNearbyPlayers(this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D));
@@ -52,7 +52,7 @@ index ef41a462b102981d30207299d0279fd51b433a22..6849b2ad3b2db840a1af35ef06949050
list.sort(Comparator.comparing((Entity e) -> { return e.getY(); }).reversed()); // CraftBukkit - decompile error
Iterator iterator = list.iterator();
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 3557d668d5117aaaef2fde0792b58c7e58546c22..81dd8666fd997f92972da2c6980c6ce515582fbc 100644
+index c87c7feb140864771cbef3dcee1f89319c9a1f83..a0477b47563214152483423121523f836827306b 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -1123,6 +1123,9 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0084-Stop-squids-floating-on-top-of-water.patch b/patches/server/0084-Stop-squids-floating-on-top-of-water.patch
index 721bcc6d2..ac8df3dec 100644
--- a/patches/server/0084-Stop-squids-floating-on-top-of-water.patch
+++ b/patches/server/0084-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 667b560c5b414d174f265778038942e87d4451ef..9a790f72307e4e044a2ae9aded57025e3974c278 100644
+index 96e79ca690a3951dd24601673703f914465c48a3..46dfa64da35505ca8be525d0eca0e2840840f776 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -4454,6 +4454,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4451,6 +4451,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.yRotO = this.getYRot();
}
diff --git a/patches/server/0086-Entities-can-use-portals-configuration.patch b/patches/server/0086-Entities-can-use-portals-configuration.patch
index 9f1226539..9e626d409 100644
--- a/patches/server/0086-Entities-can-use-portals-configuration.patch
+++ b/patches/server/0086-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 9a790f72307e4e044a2ae9aded57025e3974c278..efadee43018d6d22b11ed59169a89d91192af3cc 100644
+index 46dfa64da35505ca8be525d0eca0e2840840f776..cc7cdb842df3a9d9cb9dc86b589c9893e06577ce 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3153,7 +3153,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3152,7 +3152,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public void handleInsidePortal(BlockPos pos) {
if (this.isOnPortalCooldown()) {
this.setPortalCooldown();
@@ -17,17 +17,17 @@ index 9a790f72307e4e044a2ae9aded57025e3974c278..efadee43018d6d22b11ed59169a89d91
if (!this.level().isClientSide && !pos.equals(this.portalEntrancePos)) {
this.portalEntrancePos = pos.immutable();
}
-@@ -3862,7 +3862,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3859,7 +3859,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public boolean canChangeDimensions() {
-- return !this.isPassenger() && !this.isVehicle() && isAlive() && valid; // Paper
-+ return !this.isPassenger() && !this.isVehicle() && isAlive() && valid && (level().purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Paper // Purpur
+- return !this.isPassenger() && !this.isVehicle() && isAlive() && valid; // Paper - Fix item duplication and teleport issues
++ return !this.isPassenger() && !this.isVehicle() && isAlive() && valid && (level().purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Paper - Fix item duplication and teleport issues // Purpur
}
public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) {
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index d6b6d112da049e26ee867d81e37baa8f7bd4cda0..6b45e9aa4575892005765af9e202c61f50d4b1b6 100644
+index cb1d95f6f786df7a8825016b70c3c6b718f60358..4ffd1263f48a426e5f7a79fd266a0f445975dc2e 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -98,6 +98,7 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0089-Allow-toggling-special-MobSpawners-per-world.patch b/patches/server/0089-Allow-toggling-special-MobSpawners-per-world.patch
index 067c982f5..21b109b70 100644
--- a/patches/server/0089-Allow-toggling-special-MobSpawners-per-world.patch
+++ b/patches/server/0089-Allow-toggling-special-MobSpawners-per-world.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Allow toggling special MobSpawners per world
In vanilla, these are all hardcoded on for world type 0 (overworld) and hardcoded off for every other world type. Default config behaviour matches this.
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 7beac121beb299deb412419a0c329152bb4286e2..45de633b7547646193f6cd34b9557cd54df013f5 100644
+index a89a84f0955c5f3bee8abf529b585f04d5349de2..cd54fd87fc48ee0423263c4365ac7660a9ece741 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -713,7 +713,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -708,7 +708,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.dragonParts = new Int2ObjectOpenHashMap();
this.tickTime = flag1;
this.server = minecraftserver;
@@ -36,7 +36,7 @@ index 7beac121beb299deb412419a0c329152bb4286e2..45de633b7547646193f6cd34b9557cd5
ChunkGenerator chunkgenerator = worlddimension.generator();
// CraftBukkit start
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
-index 8385eb1d60f377da94e3178ab506feefb43563fd..a5443f92786427c42092aec8350e7ab37704db7a 100644
+index d7bddedb19c10f62fd1f7d3128453ad706ed16be..752b38d45d59d8b3cd492246e5aa4f378a78734d 100644
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
@@ -159,7 +159,17 @@ public class WanderingTraderSpawner implements CustomSpawner {
diff --git a/patches/server/0092-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0092-Add-option-to-disable-zombie-aggressiveness-towards-.patch
index ab1c0a096..d380f267c 100644
--- a/patches/server/0092-Add-option-to-disable-zombie-aggressiveness-towards-.patch
+++ b/patches/server/0092-Add-option-to-disable-zombie-aggressiveness-towards-.patch
@@ -20,16 +20,16 @@ index cfe6a6f6bcfd7a3b29ab25f5a6745d31c18f338d..c168658d4d4ec1ddd80425e786d4435f
ignored.add("goal_selector_1");
ignored.add("goal_selector_2");
diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java
-index ebfbf67d65dc5a54e9235f44ab391147c23ddd0f..162ecea875d99115cdd742524ce65ee74cc0d47e 100644
+index cb9bc542ae73950c56fd883787f026d92dda4834..e6751c1a834453be66e891d7eb94bbb66f36008c 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java
@@ -120,7 +120,19 @@ public class Drowned extends Zombie implements RangedAttackMob {
this.goalSelector.addGoal(7, new RandomStrollGoal(this, 1.0D));
this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Drowned.class})).setAlertOthers(ZombifiedPiglin.class));
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::okTarget));
-- if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Paper
+- if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Paper - Check drowned for villager aggression config
+ // Purpur start
-+ if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Spigot
++ if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Paper - Check drowned for villager aggression config
+ @Override
+ public boolean canUse() {
+ return (level().purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level().getServer().server.isLagging()) && super.canUse();
@@ -45,7 +45,7 @@ index ebfbf67d65dc5a54e9235f44ab391147c23ddd0f..162ecea875d99115cdd742524ce65ee7
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Axolotl.class, true, false));
this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR));
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 52f2d2df03314c8ddf70b240dca82cafa44c6b07..624e4007f031b5781e34f4cb6614e8c767999ee2 100644
+index 9c49b930d80a97ad76f0b93cb883f832974c76fd..1bb5eb0f75dc4509377cf54054eba34e4ffd02a9 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
@@ -157,7 +157,19 @@ public class Zombie extends Monster {
diff --git a/patches/server/0096-Configurable-daylight-cycle.patch b/patches/server/0096-Configurable-daylight-cycle.patch
index 0e8120d98..08f54b125 100644
--- a/patches/server/0096-Configurable-daylight-cycle.patch
+++ b/patches/server/0096-Configurable-daylight-cycle.patch
@@ -18,7 +18,7 @@ index 9ec6145fe04ec64bbee8ec6a837719caebdbc6f5..358d610ad020cada1bb83e393deeeaae
public ClientboundSetTimePacket(long time, long timeOfDay, boolean doDaylightCycle) {
this.gameTime = time;
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index d14a5d68ab1b03d44eec991b4e5e58769e034beb..7835f5f53cd50d87013d7a85cbe1dc771faf606d 100644
+index 6dda652c76130b477b3d47bc53761a36ef55c1d7..dde0affb3b966ea3160a9f28b2921d128b6c1b92 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1693,7 +1693,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause
return;
}
-@@ -1181,6 +1186,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1178,6 +1183,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
if (byteTotal > byteAllowed) {
ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size());
diff --git a/patches/server/0122-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0122-Add-mobGriefing-bypass-to-everything-affected.patch
index aad561448..d41648361 100644
--- a/patches/server/0122-Add-mobGriefing-bypass-to-everything-affected.patch
+++ b/patches/server/0122-Add-mobGriefing-bypass-to-everything-affected.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add mobGriefing bypass to everything affected
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index a58e5dc0b1216f7f8cfc93c7a3f967cdd3b70df0..29260e8898bb68f4bf31e0bb4b7c721eb5a94344 100644
+index 43428fecf9b29cbf53ee18567ac797b9e84da6ad..e3723269a5651d02521da5cc0bca615bb3c81c61 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -1808,7 +1808,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -18,7 +18,7 @@ index a58e5dc0b1216f7f8cfc93c7a3f967cdd3b70df0..29260e8898bb68f4bf31e0bb4b7c721e
BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState();
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 99c8999852f05b92795bbc2f243d7220b0869858..7203384094de96ceea810b3e2da21c145c12a31d 100644
+index aa9c5397361bc109d9d910b9c9510ca7394a4da4..4383b2555cb416fce7b62b046211dbc3e8c75601 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -705,7 +705,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
@@ -92,7 +92,7 @@ index 5580a396a56c6e0f364a5368985ee99b9e2be0a8..3facfd6eee17cb0b59425494c966e198
} else if (this.nextStartTick > 0) {
--this.nextStartTick;
diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java
-index 25937f3da809151bddc2d7fa058303d4f7602d65..95fcde9f1e8bb1567e117b386240c68c9a9999e8 100644
+index 78558d24d0434fd6d90af81c38d8d9d03d79253f..292504cb09ac94f593fdde317030c7662f9e500c 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Fox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java
@@ -1385,7 +1385,7 @@ public class Fox extends Animal implements VariantHolder {
@@ -131,7 +131,7 @@ index 6fac5dbbbd9600e82b1dd1496680f551ab44313e..fd64a12c7f215f47d366af60882981c2
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
-index f76a96f79e8adac39b31e8a167ef280391571bd9..d276009a7c4f641f565bfaa97774e2c55750f9bd 100644
+index 277e0ef0c5dfd61ea21de7898bfe3ffdb7f7e17b..066dc828681ac665e807038d1a2afccb886c3ca6 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
@@ -604,7 +604,7 @@ public class EnderDragon extends Mob implements Enemy {
@@ -144,7 +144,7 @@ index f76a96f79e8adac39b31e8a167ef280391571bd9..d276009a7c4f641f565bfaa97774e2c5
// flag1 = this.level().removeBlock(blockposition, false) || flag1;
flag1 = true;
diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
-index 935adddc0ba26c93026b079747dd9c3e97d7421b..9acfdc58c93ec06346e717f4a0f80c6dd7f586ee 100644
+index 6bc0713a8bc8ac86f1febe3414bed135c1cd5336..a655c38eccc41d97cfb6d329e104bad6d9ccbc95 100644
--- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
+++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
@@ -493,7 +493,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
@@ -157,7 +157,7 @@ index 935adddc0ba26c93026b079747dd9c3e97d7421b..9acfdc58c93ec06346e717f4a0f80c6d
j = Mth.floor(this.getX());
int i1 = Mth.floor(this.getZ());
diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
-index 9fe10040e67c2679cda4254205217a363c10f883..cfcf37696e2eaf7a8341135fd5c28ad5ebccf80a 100644
+index 1851cd59230447f0d2beed10846de96d497e8a04..4ed9592387531d0880ba322b07ea776cd0b05f03 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
@@ -549,7 +549,15 @@ public class EnderMan extends Monster implements NeutralMob {
@@ -208,7 +208,7 @@ index 30a04ea1f66fe5dbbae27a48764e4bd0f66bf0b1..a7e77eae357e0fd146f340f8c3981f1a
} else {
List list = Evoker.this.level().getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D));
diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
-index 28795558000d76fd255faabc79cc45600efa2c92..5aa00878c4c7be4a38137a93b1a2cf1c468422ea 100644
+index 226b44ba4cd3a08562c8cb0d79c1d880cfac34ec..056fa8b12368dac5d1a12962b8ee92e87e4149b3 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
@@ -176,7 +176,7 @@ public class Ravager extends Raider {
@@ -243,7 +243,7 @@ index 1738f0a251e4cab2eb3f122e83366afb02201765..49a37d294bac8205ac0a795daa300ccc
BlockPos blockposition = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ()).relative(this.selectedDirection);
BlockState iblockdata = this.mob.level().getBlockState(blockposition);
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
-index d9b1bde3ce458b7e50f7645d07ee578d13006a0a..d133820c47ecda733aa8242acdb2cd3ba0f0b677 100644
+index b5e6a48192592e9bc5a7c0a2775e5d78f06cd46a..03b58860ecb72976ecce99f368d16942557236b9 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -424,7 +424,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -284,7 +284,7 @@ index 6b67eec90cd0dc1b20762514eac97f75fdbdf182..2dec28091d1816e9d4c749a5155e8303
// CraftBukkit start - fire ExplosionPrimeEvent
ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity());
diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
-index f0a6251cc8f612b898231e505c47fd5b2bbb4973..8e13b5d3e89e49994ad9763be7e4f35dd58a9c5e 100644
+index 2d09d39a5971615a40b33baa0991c3e432f3ca18..f0c72be4a0dacad52ded87fa051b8505c1b79eae 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
@@ -334,7 +334,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
@@ -310,7 +310,7 @@ index 9d43c8520953d6fe0d0948f9dbe14e0650ee01c2..deee9fffe6981d7e728621cc799a812d
// CraftBukkit end
}
diff --git a/src/main/java/net/minecraft/world/entity/raid/Raider.java b/src/main/java/net/minecraft/world/entity/raid/Raider.java
-index cdbc925ef61b8b439415f0a89368227890bcecb2..300411e88cdaef7e0ce280edbd5f18fa8d004a33 100644
+index 226fb5c88dd43c8008c5237299ef80db9e847af7..2da00acac01e333c23f7d155594011dceeb50f64 100644
--- a/src/main/java/net/minecraft/world/entity/raid/Raider.java
+++ b/src/main/java/net/minecraft/world/entity/raid/Raider.java
@@ -319,7 +319,7 @@ public abstract class Raider extends PatrollingMonster {
@@ -323,20 +323,20 @@ index cdbc925ef61b8b439415f0a89368227890bcecb2..300411e88cdaef7e0ce280edbd5f18fa
if (this.mob.hasActiveRaid() && !this.mob.getCurrentRaid().isOver() && this.mob.canBeLeader() && !ItemStack.matches(this.mob.getItemBySlot(EquipmentSlot.HEAD), Raid.getLeaderBannerInstance())) {
diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java
-index 9550ce8588c6aa3ba4cbbbb86912eae2b452eb01..059582e872f9f3c47187e12dbe174541aa934787 100644
+index 5b96d1ae4bd8546311e986bc312b1f85883a67f4..07b148fc31aee3ce009d1d768ae16d98268339cc 100644
--- a/src/main/java/net/minecraft/world/level/block/CropBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java
@@ -179,7 +179,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock {
@Override
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
- if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
- if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit
+ if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur
world.destroyBlock(pos, true, entity);
}
diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java
-index 73310204ed1fa4d72d2ec6239bb6e29319bb97cd..bcef88bf7e9d4fa09c4ebec26464b5bfb96d865d 100644
+index 386841341b59f05be0473bbfd2baf14c9b8e94c8..7f2943caa60fd8607fb525b746663a761bf1951c 100644
--- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java
@@ -110,7 +110,7 @@ public class FarmBlock extends Block {
@@ -349,7 +349,7 @@ index 73310204ed1fa4d72d2ec6239bb6e29319bb97cd..bcef88bf7e9d4fa09c4ebec26464b5bf
org.bukkit.event.Cancellable cancellable;
if (entity instanceof Player) {
diff --git a/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java b/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java
-index f579911b06b66e94e6311d970e93cca33fa089c6..2c63579226409a1823d2e8990e7ffc4250b83afb 100644
+index 0dfcac8cfcbb09fe04486bff60119f7985714454..2dbf71e421156093c8bc387941eae991f5e6c957 100644
--- a/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java
@@ -80,7 +80,7 @@ public class PowderSnowBlock extends Block implements BucketPickup {
diff --git a/patches/server/0124-Add-EntityTeleportHinderedEvent.patch b/patches/server/0124-Add-EntityTeleportHinderedEvent.patch
index 405bcc937..3ab399bbe 100644
--- a/patches/server/0124-Add-EntityTeleportHinderedEvent.patch
+++ b/patches/server/0124-Add-EntityTeleportHinderedEvent.patch
@@ -17,12 +17,12 @@ 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/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
-index c82ebcac07033d887af499f81520982fbe5ed4f1..bc73d1051749339b44ff6765162ab6a76663a628 100644
+index a0c1db8cfebaa0344012cc0af18d6231cdcdcbb8..a5a8bd6813b68ab2e913fc3ae30c9950c242beb3 100644
--- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
@@ -54,6 +54,14 @@ public class EndPortalBlock extends BaseEntityBlock {
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
- if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (world instanceof ServerLevel && entity.canChangeDimensions() && Shapes.joinIsNotEmpty(Shapes.create(entity.getBoundingBox().move((double) (-pos.getX()), (double) (-pos.getY()), (double) (-pos.getZ()))), state.getShape(world, pos), BooleanOp.AND)) {
+ // Purpur start
+ if (entity.isPassenger() || entity.isVehicle()) {
@@ -36,12 +36,12 @@ index c82ebcac07033d887af499f81520982fbe5ed4f1..bc73d1051749339b44ff6765162ab6a7
ServerLevel worldserver = ((ServerLevel) world).getServer().getLevel(resourcekey);
diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java
-index ee998d06804e344ea9d5b84ef0074b84aaba04c2..c51ac562d642061ce60db66ae9a86eecd9d85ecb 100644
+index 1b5cc5d6aa0b4313da980ce175c54145852d0db0..613df7b174ba4cb87314a631ebc7dfeda8ede58f 100644
--- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java
@@ -92,6 +92,14 @@ public class NetherPortalBlock extends Block {
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
- if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
if (entity.canChangeDimensions()) {
+ // Purpur start
+ if (entity.isPassenger() || entity.isVehicle()) {
@@ -55,7 +55,7 @@ index ee998d06804e344ea9d5b84ef0074b84aaba04c2..c51ac562d642061ce60db66ae9a86eec
EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
world.getCraftServer().getPluginManager().callEvent(event);
diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java
-index 2e264b8b13df9da9163a80b3dd4345af3cff431c..7b27852682909b7d19942bbb517e6107534f61c2 100644
+index f5f464e69bfb00f5ea493d109bdd96e459fcad46..c3d25a26883f7cbe7106c2f3415af0b18f534ee2 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java
@@ -178,6 +178,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity {
@@ -74,7 +74,7 @@ index 2e264b8b13df9da9163a80b3dd4345af3cff431c..7b27852682909b7d19942bbb517e6107
blockEntity.teleportCooldown = 100;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index 1c89cbf1a582604ed4be0849bd65dae5eb17f28a..98d2ef7870c921093a9dbaf0f4de77d86ef81d44 100644
+index 6f7be7d29b4654d463299c62b8a01696ca187eb2..c3880875f5148d869d7e067fe78cbd1b9492b501 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -252,6 +252,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
@@ -89,7 +89,7 @@ index 1c89cbf1a582604ed4be0849bd65dae5eb17f28a..98d2ef7870c921093a9dbaf0f4de77d8
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 5f8b485ed8e0444c8c7e2a438cb65113d35bec68..df8f06c898155955fed05c0b41b8ce14b13ec920 100644
+index 833d20484c3bd5b59fff64141f2aa352742a3d5f..9cf6f19312242d3efac0b689cc8b31b9256694f0 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -1368,6 +1368,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -104,7 +104,7 @@ index 5f8b485ed8e0444c8c7e2a438cb65113d35bec68..df8f06c898155955fed05c0b41b8ce14
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 647b58652a87d1d1b4b022853052ea19afa80152..68a3f2be0b4d99041dcdb9e37c0e1dbcb9c1ae87 100644
+index ed61bb01ef1235df2d89bb8f173cbcda4bb65d44..5f13cfd5ebc40793242136570948a87dce867f59 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -117,6 +117,7 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0126-Movement-options-for-armor-stands.patch b/patches/server/0126-Movement-options-for-armor-stands.patch
index 19b861b14..f9c46c451 100644
--- a/patches/server/0126-Movement-options-for-armor-stands.patch
+++ b/patches/server/0126-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 49770fba1b986769d44793d7fadc8b098dbe6740..645aed66d9b17a6ee30e5f329d8e29b56d48be11 100644
+index cc7cdb842df3a9d9cb9dc86b589c9893e06577ce..7e92c7a9c5792cb0d4c6c4370449aa0cf36d7dc5 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -1876,7 +1876,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1875,7 +1875,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return this.isInWater() || flag;
}
@@ -30,18 +30,18 @@ index 49770fba1b986769d44793d7fadc8b098dbe6740..645aed66d9b17a6ee30e5f329d8e29b5
if (entity instanceof Boat) {
diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
-index 1ce5b80e5d7d50ccc50b7c862c6819a8b0e3c174..69f8fc750d37b14a88aaf41fd20890c58156809d 100644
+index 728814649f8d6837586cd5400b271d25b8306e35..53f36e281e42a2bfc174f06f448f1eb85eb02aff 100644
--- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
+++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
@@ -99,10 +99,12 @@ public class ArmorStand extends LivingEntity {
private boolean noTickPoseDirty = false;
private boolean noTickEquipmentDirty = false;
- // Paper end
+ // Paper end - Allow ArmorStands not to tick
+ public boolean canMovementTick = true; // Purpur
public ArmorStand(EntityType extends ArmorStand> type, Level world) {
super(type, world);
- if (world != null) this.canTick = world.paperConfig().entities.armorStands.tick; // Paper - armour stand ticking
+ if (world != null) this.canTick = world.paperConfig().entities.armorStands.tick; // Paper - Allow ArmorStands not to tick
+ if (world != null) this.canMovementTick = world.purpurConfig.armorstandMovement; // Purpur
this.handItems = NonNullList.withSize(2, ItemStack.EMPTY);
this.armorItems = NonNullList.withSize(4, ItemStack.EMPTY);
diff --git a/patches/server/0127-Fix-stuck-in-portals.patch b/patches/server/0127-Fix-stuck-in-portals.patch
index 703ca1256..d77c53435 100644
--- a/patches/server/0127-Fix-stuck-in-portals.patch
+++ b/patches/server/0127-Fix-stuck-in-portals.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Fix stuck in portals
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index e7b654c1991348a7f73ca8bc950d776e4e708779..487e4ab76e255e10369f7968d73d41956e99ae66 100644
+index 58b531c14c36bec725891c899b3f3586b5c11d9e..921738689a367c231e99eff6bc9fc305ebb31012 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -1271,6 +1271,7 @@ public class ServerPlayer extends Player {
@@ -17,10 +17,10 @@ index e7b654c1991348a7f73ca8bc950d776e4e708779..487e4ab76e255e10369f7968d73d4195
// 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 2919e79d24eecb3114d1a32991e12c39ac88f6b8..07a9f53448e6adbb45d941a72759187fefe30313 100644
+index 7e92c7a9c5792cb0d4c6c4370449aa0cf36d7dc5..a040e92c3b3700461e630cd5299ff6c7400c273f 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3150,12 +3150,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3149,12 +3149,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return Vec3.directionFromRotation(this.getRotationVector());
}
@@ -37,7 +37,7 @@ index 2919e79d24eecb3114d1a32991e12c39ac88f6b8..07a9f53448e6adbb45d941a72759187f
this.isInsidePortal = true;
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 08136dfa12437d4d4bf7b5d3d9404db671e6925c..7d576796981ce7b6a292499ed755d86c86bf51db 100644
+index 54775a4c13dd8b03373bb1e47bb591ac0a2f82c7..cd4a14bd5d13b41d02ad68ddf31fd3648f933850 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -333,6 +333,7 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0128-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0128-Toggle-for-water-sensitive-mob-damage.patch
index 8b1b14af6..c97ac36a7 100644
--- a/patches/server/0128-Toggle-for-water-sensitive-mob-damage.patch
+++ b/patches/server/0128-Toggle-for-water-sensitive-mob-damage.patch
@@ -21,7 +21,7 @@ index 19f95ddb2fa9dd264947a8b0033dd7437ee66c7f..d04e48d6a0a6dc7825a3e3d4cf854e29
protected ParticleOptions getInkParticle() {
return ParticleTypes.GLOW_SQUID_INK;
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
-index 92777e7f6c6293c5b5689cfa5f992335629d05eb..39dc169eedc407284452380a883e8a2735cc46cb 100644
+index 8910aaaa1fdabecec4740d6212db3114bd1197fc..3c7db09c5fbcb9d57febc937158b50634d68a082 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
@@ -280,6 +280,11 @@ public class Bat extends AmbientCreature {
@@ -37,11 +37,11 @@ index 92777e7f6c6293c5b5689cfa5f992335629d05eb..39dc169eedc407284452380a883e8a27
public void readAdditionalSaveData(CompoundTag nbt) {
super.readAdditionalSaveData(nbt);
diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java
-index 6d3e16e9fb043d538b9c093fb79d092fce90d75a..0db5e35b8e4a186c8ef150a1b0f072e10573136e 100644
+index 2b69a3e860f95d4294dda8d05126f431eb7dd5b6..52a7a8b35cf0f7b52d5de253b21f7713ab261544 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java
@@ -180,7 +180,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
- // Paper end
+ // Paper end - Fix MC-167279
this.lookControl = new Bee.BeeLookControl(this);
this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, -1.0F);
- this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F);
@@ -62,7 +62,7 @@ index 6d3e16e9fb043d538b9c093fb79d092fce90d75a..0db5e35b8e4a186c8ef150a1b0f072e1
public int getRemainingPersistentAngerTime() {
return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME);
diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java
-index fff1da136b618ca8b9256b55996dc1d01dacd7b8..9279eb3c7a8affbecba1a8b27ca0685021676f39 100644
+index fba85c1a43b184ada6c1bb499997322030f59665..a4b3d724f30ccf0eddfb41d6997d0aa9b1847b7a 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
@@ -133,6 +133,11 @@ public class Cat extends TamableAnimal implements VariantHolder {
@@ -126,7 +126,7 @@ index c501704251e5b23f697efc307ebdc906cd2e5acd..f76b0d92150fd985a8fc699f6f884527
protected void registerGoals() {
this.goalSelector.addGoal(0, new FloatGoal(this));
diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
-index ff11643193495f0646de4bcf13b7f1e57731e4fb..75585a6b275fafbc5ef112d9de4926b77fcb3781 100644
+index cdbe66bc89a64f8d41ea496f2da85159f48bb8c5..a5759b711d1853ac41713dd9fe11f3da5af286ef 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
@@ -163,6 +163,11 @@ public class Dolphin extends WaterAnimal {
@@ -142,7 +142,7 @@ index ff11643193495f0646de4bcf13b7f1e57731e4fb..75585a6b275fafbc5ef112d9de4926b7
@Override
public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) {
diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java
-index fc3ec667aa2b8c3fe537cda0aeddd2192c0bbedf..c8efa4029136d0cd54a5f73f003e022511cc7c8b 100644
+index 292504cb09ac94f593fdde317030c7662f9e500c..9a34a59300c4ad5dfbd327aa4fd42992f73da89a 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Fox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java
@@ -193,6 +193,11 @@ public class Fox extends Animal implements VariantHolder {
@@ -158,7 +158,7 @@ index fc3ec667aa2b8c3fe537cda0aeddd2192c0bbedf..c8efa4029136d0cd54a5f73f003e0225
protected void defineSynchedData() {
super.defineSynchedData();
diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
-index 95ff109511c97d603aeaf9e73c49397a841fcbce..58539d29b8e2a8c0676cc574f64e7d61613e1451 100644
+index 46e28d807a72b6d302d29d65c52ab0813cd82b1a..669132fb78d3fd72f73d4c20370f0213879baeaa 100644
--- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
+++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java
@@ -88,6 +88,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob {
@@ -174,7 +174,7 @@ index 95ff109511c97d603aeaf9e73c49397a841fcbce..58539d29b8e2a8c0676cc574f64e7d61
protected void registerGoals() {
if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur
diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
-index db0170fb22ee8424c29fc0d4f3c93c9eac79611c..7bd539ed5fea0d4db8e97722bd9bd37e6563185d 100644
+index 56427c987439c2d6d5652dae0f2c0a72d4eba26e..f01d93c6f88f543b51420ceca7a4a95829368a20 100644
--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
@@ -90,6 +90,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder getModelRotationValues() {
return this.modelRotationValues;
diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
-index 93295d9683293121f2267350194f18e97b2421c2..26062173d137e26abdc452f7b2e0be0ee6dddfa3 100644
+index 0282498c7375a73b6982efb02f3cf3215f4211b0..5b3126168e9406f6cbd0607b6b7cc2de4ab68b65 100644
--- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
@@ -114,6 +114,11 @@ public class Goat extends Animal {
@@ -475,7 +475,7 @@ index 0251ded48eb5bdf96f0e67f6456aa15909c8a4ff..f8dbea402f723bf38d7ab3f2468d1b02
protected void randomizeAttributes(RandomSource random) {
this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt));
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
-index 6045f29c641d1958371c77701e9514d9ca44b85e..58175824dc315134b03b9dabfcae04e192af0b86 100644
+index e11fc274f893d501235422839301a5128268199d..fb2b0ebd9314ab7fc911e842767bd60b1db92b96 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
@@ -145,6 +145,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder brainProvider() {
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
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 624e4007f031b5781e34f4cb6614e8c767999ee2..52a576a16bfeb7dc6ec97280f9a5e0f408d71e46 100644
+index 1bb5eb0f75dc4509377cf54054eba34e4ffd02a9..edc47e077fe44d1b817b791ddde86e052a5bf831 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
@@ -141,6 +141,11 @@ public class Zombie extends Monster {
@@ -1085,7 +1085,7 @@ index 624e4007f031b5781e34f4cb6614e8c767999ee2..52a576a16bfeb7dc6ec97280f9a5e0f4
protected void registerGoals() {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur
diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
-index b71c47c275a3726eb5028c9524013ebc608a21ea..135ce8822ed7e3d6182755deca37a2c0531960c6 100644
+index 259cbfc821b12663876ff2821635ce0ccd7e33c6..438302f6705bcf3d60f27dde279de010bd95aad4 100644
--- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -109,6 +109,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
@@ -1101,7 +1101,7 @@ index b71c47c275a3726eb5028c9524013ebc608a21ea..135ce8822ed7e3d6182755deca37a2c0
public boolean jockeyOnlyBaby() {
return level().purpurConfig.zombieVillagerJockeyOnlyBaby;
diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
-index b2d77117309e81db60e7e50911247793fa829755..3574a1e641d8af34a0ff7ea8dcfb08641cf6ace0 100644
+index e73fb1027acd592c7e028e1797042fe38c6c04a3..e6b653c75a4c3306e06bfcadb4c4b53bccd5aad2 100644
--- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java
@@ -86,6 +86,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob {
@@ -1117,7 +1117,7 @@ index b2d77117309e81db60e7e50911247793fa829755..3574a1e641d8af34a0ff7ea8dcfb0864
public boolean jockeyOnlyBaby() {
return level().purpurConfig.zombifiedPiglinJockeyOnlyBaby;
diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
-index 80f91a11c04763c1c9ed2bd242b88b5a473560d7..d0144c99cf5c755c81fc0f9457b462c98ff3e804 100644
+index fae14f6ab139e7d7a0e8625488c472f0d0c1a1e2..7a167887c40eccea4c216eb906a4a69006f72114 100644
--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
@@ -96,6 +96,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
@@ -1133,7 +1133,7 @@ index 80f91a11c04763c1c9ed2bd242b88b5a473560d7..d0144c99cf5c755c81fc0f9457b462c9
public boolean canBeLeashed(Player player) {
return !this.isLeashed();
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
-index d133820c47ecda733aa8242acdb2cd3ba0f0b677..e506dcf390ecb5cce8ae6993df7ec91b3ebc125e 100644
+index 03b58860ecb72976ecce99f368d16942557236b9..20ecfcbe948d02bb61b8f673f5330d2f9e60c387 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -118,6 +118,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -1165,7 +1165,7 @@ index 04e54c241078e6cd6419a21ba1bf913fd3b413d1..b63d87df0f48dd63c89118f91b31dc4e
return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D);
}
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index 833db485054338cd4a5e626b35ec050c35f15477..9ed51efc1a42a792b652e7c958c06fa5b572e4bf 100644
+index b8675cb1a69f675585c040b2f47172dfe9235d08..cd59f262572df87b28b33f98a3dc667b4c5b3072 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
@@ -190,6 +190,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -1181,7 +1181,7 @@ index 833db485054338cd4a5e626b35ec050c35f15477..9ed51efc1a42a792b652e7c958c06fa5
public Brain getBrain() {
return (Brain) super.getBrain(); // CraftBukkit - decompile error
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
-index ad7a32169b0decad1d3a2bd98e25b07731a33d03..5a373ba4d9e404c064bc158718d02c0cd2aca548 100644
+index 8ab868c88e37fad978ffcf151ad527e57bdf4cb5..027e86e504d0e4291deae0641f0e5b40686e6ccb 100644
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
@@ -97,6 +97,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
diff --git a/patches/server/0130-End-crystal-explosion-options.patch b/patches/server/0130-End-crystal-explosion-options.patch
index 9be626ee7..5f774c9bd 100644
--- a/patches/server/0130-End-crystal-explosion-options.patch
+++ b/patches/server/0130-End-crystal-explosion-options.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] End crystal explosion options
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
-index ef0098e46bda8abc456f2bb5929d874c6aeb8698..564d17bc460e2a04947ff9676fbf4c8b1569659c 100644
+index 4f0e1a653a117687b5b330ff424873d01f574bee..9d86ce2012a93d9fb0d52dc6db796ae31d4f0e21 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
@@ -48,6 +48,22 @@ public class EndCrystal extends Entity {
@@ -31,7 +31,7 @@ index ef0098e46bda8abc456f2bb5929d874c6aeb8698..564d17bc460e2a04947ff9676fbf4c8b
@Override
protected Entity.MovementEmission getMovementEmission() {
return Entity.MovementEmission.NONE;
-@@ -173,16 +189,18 @@ public class EndCrystal extends Entity {
+@@ -130,16 +146,18 @@ public class EndCrystal extends Entity {
// CraftBukkit end
this.remove(Entity.RemovalReason.KILLED);
if (!source.is(DamageTypeTags.IS_EXPLOSION)) {
@@ -53,7 +53,7 @@ index ef0098e46bda8abc456f2bb5929d874c6aeb8698..564d17bc460e2a04947ff9676fbf4c8b
this.onDestroyedBy(source);
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index bab096e2c073510f4e91ab34c4555fad966b7141..f7ca9e256524e1b080631d7cda5ed80edeeaf73b 100644
+index 0d3725563f58b523482bac44134f54e13d017ce8..4d7d111a2cb6f02d3263174af9e70548be0fe971 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -464,6 +464,43 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0132-Dont-run-with-scissors.patch b/patches/server/0132-Dont-run-with-scissors.patch
index 4742791aa..e36ac453e 100644
--- a/patches/server/0132-Dont-run-with-scissors.patch
+++ b/patches/server/0132-Dont-run-with-scissors.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Dont run with scissors!
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 23cc99227c802368a4bfb9e7c6eda43357dd0576..5c933996fe4cf45e3cb072fe2573419cc2fe92af 100644
+index afcf996540d2482b0a1afac5b2656beb53b41619..5f6a3fac5157f2baddff4d83ac56a01172c410d6 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1647,6 +1647,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1642,6 +1642,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
this.player.resetFallDistance();
}
@@ -22,7 +22,7 @@ index 23cc99227c802368a4bfb9e7c6eda43357dd0576..5c933996fe4cf45e3cb072fe2573419c
this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5);
this.lastGoodX = this.player.getX();
this.lastGoodY = this.player.getY();
-@@ -1698,6 +1705,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1693,6 +1700,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
return false;
}
// Paper end - optimise out extra getCubes
@@ -53,7 +53,7 @@ index 9c99b2e365aacb8309f29acb9025faccd2c676b3..9e3608650c44ef5fa724c3aea86603d7
}
}
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
-index 14fcfd7c1d3a62833978e163f4e0d6f9b2203042..33210bc66dcc5fdf03fbf438ce8734b31c4e7975 100644
+index dad8d358e60902eb186cbc5686219f66d3babf89..189664637d3d73b141c84823f0099bcda9b607e3 100644
--- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
@@ -54,6 +54,8 @@ public class DamageSource {
@@ -66,7 +66,7 @@ index 14fcfd7c1d3a62833978e163f4e0d6f9b2203042..33210bc66dcc5fdf03fbf438ce8734b3
return "DamageSource (" + this.type().msgId() + ")";
}
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
-index 4604f8b38460e9113e966889a679d4547f24aff6..813916852774d6482791989252ecb67b945a8f84 100644
+index f339475185645f7be30963e4f980ce81a6f7e536..6a7fe56485f0da9094c816f9fd5aacf7e5946730 100644
--- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
@@ -267,4 +267,11 @@ public class DamageSources {
diff --git a/patches/server/0134-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server/0134-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
index 959e59a45..cfefd96f6 100644
--- a/patches/server/0134-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
+++ b/patches/server/0134-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
@@ -30,7 +30,7 @@ index af4da25c9b13c114179fab3254aea5323210d7da..f9cd39a4f8ec5cdade311984d863b64f
}
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
-index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..897c202c0905040072a06fdfa2032a7f9461b088 100644
+index 8c8cf8705107c95d9a4eab28b5845ae13c4ffb3c..a0c2650678848416829c7185a530fcd63bb68039 100644
--- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java
+++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
@@ -36,7 +36,7 @@ public class EnderpearlItem extends Item {
@@ -40,10 +40,10 @@ index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..897c202c0905040072a06fdfa2032a7f
- user.getCooldowns().addCooldown(this, 20);
+ user.getCooldowns().addCooldown(this, user.getAbilities().instabuild ? world.purpurConfig.enderPearlCooldownCreative : world.purpurConfig.enderPearlCooldown); // Purpur
} else {
- // Paper end
+ // Paper end - PlayerLaunchProjectileEvent
if (user instanceof net.minecraft.server.level.ServerPlayer) {
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index a58369d384604e37906cc0d15aad40a9e44019da..c4c1e27efbc121f120f68a554cd5bf37443923e1 100644
+index bf2ab21a5390ac0876b0c2c5e6708cc3d6c564da..3a61e40ec6dfc49413a85b059efca9a261373a7c 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -201,6 +201,10 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0138-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch b/patches/server/0138-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
index 4a11dbbb0..ab5da3984 100644
--- a/patches/server/0138-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
+++ b/patches/server/0138-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
@@ -7,11 +7,11 @@ Prevents Enderman from becoming aggresive towards players that are wearing a Dra
Adds functionality to a useless item!
diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
-index cf9eb1ac36a5c9d3c73b981e1649bb23c7bfaf39..ca0269c2977b07cf77f7e0e1faa4cb16008ac74d 100644
+index 3fbe607e763910f7520604d3b8b8207086ba7f90..627cbec30c15fa4d11689cb85add6ad61d58b47a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
@@ -271,7 +271,7 @@ public class EnderMan extends Monster implements NeutralMob {
- // Paper end
+ // Paper end - EndermanAttackPlayerEvent
ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3);
- if (itemstack.is(Blocks.CARVED_PUMPKIN.asItem())) {
@@ -20,7 +20,7 @@ index cf9eb1ac36a5c9d3c73b981e1649bb23c7bfaf39..ca0269c2977b07cf77f7e0e1faa4cb16
} else {
Vec3 vec3d = player.getViewVector(1.0F).normalize();
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index f64597083c7505d27b57a0fb31d52ee347151e8a..59a46ebdf7c96d388251ad87b8420088729e94fe 100644
+index 5d1dd1c3572365e2054b0848548fe736d4f21d55..414838cf7fe3796e8d829609ac126e5b9c4afd50 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -999,6 +999,8 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0139-Tick-fluids-config.patch b/patches/server/0139-Tick-fluids-config.patch
index b921947fb..f1ca89396 100644
--- a/patches/server/0139-Tick-fluids-config.patch
+++ b/patches/server/0139-Tick-fluids-config.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Tick fluids config
diff --git a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java
-index 2bd097203f1e92d3fc343f91dc37220e09dd5066..016fe816819ab9022fd03c50427b62abbcd18b3c 100644
+index 9b3dcf1a4d4cece92a629506d341f6bfe79d13d0..0ed39daf88a98f7fa887fb45d4f7c0348a607551 100644
--- a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java
@@ -139,7 +139,7 @@ public class LiquidBlock extends Block implements BucketPickup {
@@ -14,7 +14,7 @@ index 2bd097203f1e92d3fc343f91dc37220e09dd5066..016fe816819ab9022fd03c50427b62ab
public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) {
- if (this.shouldSpreadLiquid(world, pos, state)) {
+ if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur
- world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper
+ world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava
}
@@ -167,7 +167,7 @@ public class LiquidBlock extends Block implements BucketPickup {
@@ -32,11 +32,11 @@ index 2bd097203f1e92d3fc343f91dc37220e09dd5066..016fe816819ab9022fd03c50427b62ab
public void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) {
- if (this.shouldSpreadLiquid(world, pos, state)) {
+ if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur
- world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper
+ world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 59a46ebdf7c96d388251ad87b8420088729e94fe..90ee419cc60748233ac8b8903ca154182bfe727d 100644
+index 414838cf7fe3796e8d829609ac126e5b9c4afd50..0b60f77cfbe2247586d51999ac94f4f5cb011847 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -129,6 +129,7 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0142-Configurable-ravager-griefable-blocks-list.patch b/patches/server/0142-Configurable-ravager-griefable-blocks-list.patch
index fc17761e7..33aea6975 100644
--- a/patches/server/0142-Configurable-ravager-griefable-blocks-list.patch
+++ b/patches/server/0142-Configurable-ravager-griefable-blocks-list.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Configurable ravager griefable blocks list
diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
-index 0992e3729fdfa945660affb7eb7efcff63f37210..5e717433ef29d02669ee2e95454c69c36cbafc24 100644
+index db5e55f2bca1d0706d24ebf7c0b5c2592b04f0bc..03ed7c56bb7f2d32722ebedb8eb07765ab39079a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
@@ -191,7 +191,7 @@ public class Ravager extends Raider {
@@ -18,20 +18,20 @@ index 0992e3729fdfa945660affb7eb7efcff63f37210..5e717433ef29d02669ee2e95454c69c3
if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state
continue;
diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java
-index 059582e872f9f3c47187e12dbe174541aa934787..0e06958657201806f425990ac01a5f8acc540f3e 100644
+index 07b148fc31aee3ce009d1d768ae16d98268339cc..55e28eef76d9d534037d888d85c0609052478118 100644
--- a/src/main/java/net/minecraft/world/level/block/CropBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java
@@ -179,7 +179,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock {
@Override
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
- if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper
+ if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
- if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur
+ if (entity instanceof Ravager && world.purpurConfig.ravagerGriefableBlocks.contains(world.getBlockState(pos).getBlock()) && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur
world.destroyBlock(pos, true, entity);
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 44b98e5030bef02ab05a9686fdfc711fa78ec072..a855bb2e4f04a64e47611b20342e1eb484f6bf22 100644
+index b9903d3794fc5f25f5be2e3ebd2c4b7188a507d9..70b740ae9efc960266900a1c5b1d478d1794f5eb 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -1703,6 +1703,7 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0144-Config-for-skipping-night.patch b/patches/server/0144-Config-for-skipping-night.patch
index fbce19347..58c87895f 100644
--- a/patches/server/0144-Config-for-skipping-night.patch
+++ b/patches/server/0144-Config-for-skipping-night.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Config for skipping night
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 586a46dc9f9e65e1f88bcfefc2f4e59d9cda55e9..3bce997b0fe372fd4bf172a879bce80996246278 100644
+index d92c809cb8dff4d146e98f20daf286180f0c43a6..5af5a22e725bdae1cc15702b37982f585c46286f 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -845,7 +845,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -840,7 +840,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE);
long j;
diff --git a/patches/server/0146-Allow-infinity-on-crossbows.patch b/patches/server/0146-Allow-infinity-on-crossbows.patch
index fce993e23..07dadfea9 100644
--- a/patches/server/0146-Allow-infinity-on-crossbows.patch
+++ b/patches/server/0146-Allow-infinity-on-crossbows.patch
@@ -5,15 +5,15 @@ Subject: [PATCH] Allow infinity on crossbows
diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java
-index eede02c3f125d230af537bb67bebed9b88f7d1b4..1ae5e17b95d994d69b060fc06c0a807c40a90f17 100644
+index 06689ee8799079510a1a4e7b68029b9629e318fb..fdf9972bb9374789b063d191d9d419cca5975b23 100644
--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java
+++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java
@@ -114,7 +114,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable {
- // Paper end
+ // Paper end - Add EntityLoadCrossbowEvent
int i = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.MULTISHOT, crossbow);
int j = i == 0 ? 1 : 3;
-- boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild; // Paper - add consume
-+ boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild || (org.purpurmc.purpur.PurpurConfig.allowCrossbowInfinity && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.INFINITY_ARROWS, crossbow) > 0); // Paper - add consume // Purpur
+- boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild; // Paper - Add EntityLoadCrossbowEvent
++ boolean flag = !consume || shooter instanceof Player && ((Player) shooter).getAbilities().instabuild || (org.purpurmc.purpur.PurpurConfig.allowCrossbowInfinity && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.INFINITY_ARROWS, crossbow) > 0); // Paper - Add EntityLoadCrossbowEvent // Purpur
ItemStack itemstack1 = shooter.getProjectile(crossbow);
ItemStack itemstack2 = itemstack1.copy();
@@ -65,7 +65,7 @@ index 246516e67db0b8b197b287c067d5a0163d8bde22..859435f747ceef860cb4e9e825a7353e
public abstract boolean canEnchant(Item item);
diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
-index 4daf2c54c7127e8e091ffc49362f288594956143..f81faaf6d69b09f635d71491303fca1d494001c5 100644
+index 92465b2a9f1483be76004c9f80a1fe15913b3b8b..37688a6908bbad7455ee2c26bba91f282859d272 100644
--- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
+++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
@@ -80,6 +80,7 @@ public class CraftEnchantment extends Enchantment {
diff --git a/patches/server/0147-Drowning-Settings.patch b/patches/server/0147-Drowning-Settings.patch
index da8844ca6..e09faf044 100644
--- a/patches/server/0147-Drowning-Settings.patch
+++ b/patches/server/0147-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 07a9f53448e6adbb45d941a72759187fefe30313..9c4c5aa169b4a9943a096ad84d0bd66fad15c55d 100644
+index a040e92c3b3700461e630cd5299ff6c7400c273f..1bb50f182fa6274cb0c631e0d4e79288443b3a53 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3399,7 +3399,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3398,7 +3398,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public int getMaxAirSupply() {
@@ -18,7 +18,7 @@ index 07a9f53448e6adbb45d941a72759187fefe30313..9c4c5aa169b4a9943a096ad84d0bd66f
public int getAirSupply() {
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 4ba269d7c63a8e2df498a5ab7253c3a9fbc44103..385bc1cb2c1b00e80ecfcb0a59a24670407af5cd 100644
+index 06a647ae44423e14f4266c9cc25ff78ee16bc3c8..95a004d6b0581cf9aa6805f08a34a04baefef8fa 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -438,7 +438,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -40,7 +40,7 @@ index 4ba269d7c63a8e2df498a5ab7253c3a9fbc44103..385bc1cb2c1b00e80ecfcb0a59a24670
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index fce3d4c4af444860c72b5058fcd7276838299f89..d002bc3c3a99253a990aac0ae117de078475d144 100644
+index 9aa6a3f69afb0fd70ac60ca0d50d564dd7d3fe54..91f224d89bf1af363162e0a39ca61a440bc07b96 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -164,6 +164,15 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0148-Break-individual-slabs-when-sneaking.patch b/patches/server/0148-Break-individual-slabs-when-sneaking.patch
index 01da86043..c1a8765ef 100644
--- a/patches/server/0148-Break-individual-slabs-when-sneaking.patch
+++ b/patches/server/0148-Break-individual-slabs-when-sneaking.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] Break individual slabs when sneaking
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
-index ecf0b6f30d5791f6c7097d352eafa8ecbcdf4aa8..5de06447de2ab2c45debf314aecd39722d4a7af6 100644
+index 4a7134c6da15bd69f7d4e3ffe452e5915abb738e..587bf8027765ab678ea15a24e7953f81dd4e6d64 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
@@ -397,6 +397,7 @@ public class ServerPlayerGameMode {
- } else {capturedBlockEntity = true;} // Paper end
+ } else {capturedBlockEntity = true;} // Paper - Send block entities after destroy prediction
return false;
}
+ if (this.player.level().purpurConfig.slabHalfBreak && this.player.isShiftKeyDown() && iblockdata.getBlock() instanceof net.minecraft.world.level.block.SlabBlock && ((net.minecraft.world.level.block.SlabBlock) iblockdata.getBlock()).halfBreak(iblockdata, pos, this.player)) return true; // Purpur
@@ -47,7 +47,7 @@ index adc7eba4bb5e8f7c507a16cdbd7497338a7658cf..512c528e0f2f3aa0da0253698a018941
+ // Purpur end
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index d002bc3c3a99253a990aac0ae117de078475d144..0f13f4727ee854fa66df7ec9f49d33622a05e252 100644
+index 91f224d89bf1af363162e0a39ca61a440bc07b96..1df92111b03b3cb56989dfe17e4c5597c7988c46 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -600,6 +600,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0154-Projectile-offset-config.patch b/patches/server/0154-Projectile-offset-config.patch
index b6de9f1d4..2dd4919d3 100644
--- a/patches/server/0154-Projectile-offset-config.patch
+++ b/patches/server/0154-Projectile-offset-config.patch
@@ -18,7 +18,7 @@ index 33df0ca406dc8321b76b393f317bbd1c8ebe6366..220513d3fd5645322886522ea4f6b8c5
entityarrow.setCritArrow(true);
}
diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java
-index 1ae5e17b95d994d69b060fc06c0a807c40a90f17..0a0f19f73a6a4e5aece7c17089dc4d31ed2a5299 100644
+index fdf9972bb9374789b063d191d9d419cca5975b23..b112845e94d354bbadff67673ea0b4939672bd3e 100644
--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java
+++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java
@@ -64,7 +64,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable {
@@ -31,7 +31,7 @@ index 1ae5e17b95d994d69b060fc06c0a807c40a90f17..0a0f19f73a6a4e5aece7c17089dc4d31
return InteractionResultHolder.consume(itemstack);
} else if (!user.getProjectile(itemstack).isEmpty()) {
diff --git a/src/main/java/net/minecraft/world/item/EggItem.java b/src/main/java/net/minecraft/world/item/EggItem.java
-index 58cb992c5defec2f092755cbde661ff10f38bf9d..52f48681407d23f0925f4c9c072d5f0a2a6b1778 100644
+index a3bd507793994e9cc87a956871a8afbb8ca9460d..ef2197a23aef0a4215fae09bd4618e449e14c64e 100644
--- a/src/main/java/net/minecraft/world/item/EggItem.java
+++ b/src/main/java/net/minecraft/world/item/EggItem.java
@@ -24,7 +24,7 @@ public class EggItem extends Item {
@@ -40,11 +40,11 @@ index 58cb992c5defec2f092755cbde661ff10f38bf9d..52f48681407d23f0925f4c9c072d5f0a
entityegg.setItem(itemstack);
- entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
+ entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.eggProjectileOffset); // Purpur
- // Paper start
+ // Paper start - PlayerLaunchProjectileEvent
com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityegg.getBukkitEntity());
if (event.callEvent() && world.addFreshEntity(entityegg)) {
diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
-index 897c202c0905040072a06fdfa2032a7f9461b088..6b27d98d06b163243bb0e1bb979aad03f48d7770 100644
+index a0c2650678848416829c7185a530fcd63bb68039..8031e38c66468676b3b4a7443d6678eec6b1e8a4 100644
--- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java
+++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java
@@ -24,7 +24,7 @@ public class EnderpearlItem extends Item {
@@ -53,11 +53,11 @@ index 897c202c0905040072a06fdfa2032a7f9461b088..6b27d98d06b163243bb0e1bb979aad03
entityenderpearl.setItem(itemstack);
- entityenderpearl.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
+ entityenderpearl.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.enderPearlProjectileOffset); // Purpur
- // Paper start
- com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityenderpearl.getBukkitEntity());
+ // Paper start - PlayerLaunchProjectileEvent
+ com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entityenderpearl.getBukkitEntity());
if (event.callEvent() && world.addFreshEntity(entityenderpearl)) {
diff --git a/src/main/java/net/minecraft/world/item/SnowballItem.java b/src/main/java/net/minecraft/world/item/SnowballItem.java
-index ef3f90a5bcdd7b9815a4053cff166f9d2552f55d..e7e5e1cc92f56e3daba8fa09c59188febec5e8f2 100644
+index bc8186a5bc3a98b35fad570729dd4ba52efab238..caab0c1e2bc5696080750797cbf1c93f57799f7d 100644
--- a/src/main/java/net/minecraft/world/item/SnowballItem.java
+++ b/src/main/java/net/minecraft/world/item/SnowballItem.java
@@ -25,7 +25,7 @@ public class SnowballItem extends Item {
@@ -66,11 +66,11 @@ index ef3f90a5bcdd7b9815a4053cff166f9d2552f55d..e7e5e1cc92f56e3daba8fa09c59188fe
entitysnowball.setItem(itemstack);
- entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F);
+ entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.snowballProjectileOffset); // Purpur
- // Paper start
+ // Paper start - PlayerLaunchProjectileEvent
com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Projectile) entitysnowball.getBukkitEntity());
if (event.callEvent() && world.addFreshEntity(entitysnowball)) {
diff --git a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
-index de5bdceb4c8578fb972a2fd5ee0dfdae509e46dc..bcf63ccb6e679cb97d658780b2663aafa3568bcb 100644
+index f47f793c62a919fb65c081ddb82d597a978d3b20..3bbb44ae3da68afbd6012df68dee277a7dbf98c0 100644
--- a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
+++ b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java
@@ -18,7 +18,7 @@ public class ThrowablePotionItem extends PotionItem {
@@ -79,11 +79,11 @@ index de5bdceb4c8578fb972a2fd5ee0dfdae509e46dc..bcf63ccb6e679cb97d658780b2663aaf
thrownPotion.setItem(itemStack);
- thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, 1.0F);
+ thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, (float) world.purpurConfig.throwablePotionProjectileOffset); // Purpur
- // Paper start
+ // Paper start - PlayerLaunchProjectileEvent
com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.getBukkitEntity());
if (event.callEvent() && world.addFreshEntity(thrownPotion)) {
diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java
-index f1d6db9382bec49f61657168fe56b06784d02cf5..07695068fafd170ca88ad109d83dea93c387d794 100644
+index 75cf58919ac787b389286b41a9f0b5a945e71649..3f922008f928ed077e9ddfd4384ed7bbf7cb293d 100644
--- a/src/main/java/net/minecraft/world/item/TridentItem.java
+++ b/src/main/java/net/minecraft/world/item/TridentItem.java
@@ -77,7 +77,7 @@ public class TridentItem extends Item implements Vanishable {
@@ -96,7 +96,7 @@ index f1d6db9382bec49f61657168fe56b06784d02cf5..07695068fafd170ca88ad109d83dea93
entitythrowntrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY;
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index ff6c402f69072ffa781593a28fc7fa0637e7e612..bdac4ecd881b9469a319275f9c0f074ccffe48c2 100644
+index 1de0fbb72819f6de3897d9c165e2f07c3b9a5280..88dd3e74675886789abc29b65bd2931a50c0a9c1 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -422,6 +422,23 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0173-API-for-any-mob-to-burn-daylight.patch b/patches/server/0173-API-for-any-mob-to-burn-daylight.patch
index 083d2122d..d63fc2337 100644
--- a/patches/server/0173-API-for-any-mob-to-burn-daylight.patch
+++ b/patches/server/0173-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 6fd094b30b0d8eee70674283ff6523133ee322ba..cc7c2463ef24b44f44575f245a27c5439c0b9be8 100644
+index 1bb50f182fa6274cb0c631e0d4e79288443b3a53..ac0fc8b7184ba1b6d40261cc15d81a7936f728d4 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -503,6 +503,21 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -502,6 +502,21 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return true;
}
@@ -32,7 +32,7 @@ index 6fd094b30b0d8eee70674283ff6523133ee322ba..cc7c2463ef24b44f44575f245a27c543
return this.hardCollides;
}
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 4154eb08be0d6492cfba931761671a6384390d1b..338e9bef962f9090070a9c76e565c6aeab66975e 100644
+index d72838fe8a0a9540750bfc3a26202e93493c98f3..6eb7a1398d1ce63ec6c11d9865f4c16b51c361de 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -262,6 +262,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -92,7 +92,7 @@ index 4154eb08be0d6492cfba931761671a6384390d1b..338e9bef962f9090070a9c76e565c6ae
public boolean isSensitiveToWater() {
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 7203384094de96ceea810b3e2da21c145c12a31d..9caee3db19fa76e8e311ead8f892d0f8bebfe6b2 100644
+index 4383b2555cb416fce7b62b046211dbc3e8c75601..c029752141efbc48005dae0e3c1a071ba039b3a7 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -1758,17 +1758,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
@@ -115,7 +115,7 @@ index 7203384094de96ceea810b3e2da21c145c12a31d..9caee3db19fa76e8e311ead8f892d0f8
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
-index d205578dbed88776c6704fec9500299ce1606152..30fae50f81ec09707b0cb3ed469ae11695fbb540 100644
+index 9d259d7e2aa3e44e350eb5927314cfceaffaf3f3..3f9e81c0bdd85bec24a1209ad3fd3dc43d988a4f 100644
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
@@ -66,6 +66,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
@@ -129,16 +129,16 @@ index d205578dbed88776c6704fec9500299ce1606152..30fae50f81ec09707b0cb3ed469ae116
@@ -101,35 +102,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
}
- // Paper start
+ // Paper start - shouldBurnInDay API
- private boolean shouldBurnInDay = true;
+ // private boolean shouldBurnInDay = true; // Purpur - moved to LivingEntity - keep methods for ABI compatibility
public boolean shouldBurnInDay() { return shouldBurnInDay; }
public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; }
- // Paper end
+ // Paper end - shouldBurnInDay API
@Override
public void aiStep() {
-- boolean flag = shouldBurnInDay && this.isSunBurnTick(); // Paper - Configurable Burning
+- boolean flag = shouldBurnInDay && this.isSunBurnTick(); // Paper - shouldBurnInDay API
-
- if (flag) {
- ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD);
@@ -174,12 +174,12 @@ index d205578dbed88776c6704fec9500299ce1606152..30fae50f81ec09707b0cb3ed469ae116
@@ -238,7 +217,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
this.reassessWeaponGoal();
- // Paper start
+ // Paper start - shouldBurnInDay API
if (nbt.contains("Paper.ShouldBurnInDay")) {
- this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay");
+ // this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay"); // Purpur - implemented in LivingEntity
}
- // Paper end
+ // Paper end - shouldBurnInDay API
}
@@ -247,7 +226,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
@Override
@@ -188,7 +188,7 @@ index d205578dbed88776c6704fec9500299ce1606152..30fae50f81ec09707b0cb3ed469ae116
- nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay);
+ // nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity
}
- // Paper end
+ // Paper end - shouldBurnInDay API
diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java
index f6d6df27c2ca7a33ed3ca8e299725b6a5c4aafc3..5ac87650e357f3ac48e37713b9b0b18ad4d6feb6 100644
@@ -212,7 +212,7 @@ index f6d6df27c2ca7a33ed3ca8e299725b6a5c4aafc3..5ac87650e357f3ac48e37713b9b0b18a
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
-index 030b81dd8c52ddb300e73d792f9c4cea4e8a8d46..1d4a292a37069408420ca90b1c2784229781f93f 100644
+index 637b229817f9f2c3ad224f300b56a6bee4c8a341..bcb1912ea218fbb4b849ab84a7025202100b82c3 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java
@@ -61,6 +61,7 @@ public class Phantom extends FlyingMob implements Enemy {
@@ -230,9 +230,9 @@ index 030b81dd8c52ddb300e73d792f9c4cea4e8a8d46..1d4a292a37069408420ca90b1c278422
- // Purpur start
- boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight;
- boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight;
-- if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - Configurable Burning
+- if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API
- if (getRider() == null || !this.isControllable())
-- // Purpur end
+- // Purpur end
- if (getRider() == null || !this.isControllable()) // Purpur
- this.setSecondsOnFire(8);
- }
@@ -259,12 +259,13 @@ index 030b81dd8c52ddb300e73d792f9c4cea4e8a8d46..1d4a292a37069408420ca90b1c278422
// Paper end
}
-@@ -378,8 +370,14 @@ public class Phantom extends FlyingMob implements Enemy {
+@@ -377,8 +369,15 @@ public class Phantom extends FlyingMob implements Enemy {
+ return spawningEntity;
}
public void setSpawningEntity(java.util.UUID entity) { this.spawningEntity = entity; }
-
- private boolean shouldBurnInDay = true;
- public boolean shouldBurnInDay() { return shouldBurnInDay; }
++
+ // private boolean shouldBurnInDay = true; // Purpur - moved to LivingEntity - keep methods for ABI compatibility
+ // Purpur start
+ public boolean shouldBurnInDay() {
@@ -277,19 +278,19 @@ index 030b81dd8c52ddb300e73d792f9c4cea4e8a8d46..1d4a292a37069408420ca90b1c278422
// Paper end
private static enum AttackPhase {
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 52a576a16bfeb7dc6ec97280f9a5e0f408d71e46..9b1ae2fa1681f1212b6a09d5b10b16634ce65470 100644
+index edc47e077fe44d1b817b791ddde86e052a5bf831..2dad874c0a425cf2d0a385b6061ab79d81b82c86 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
@@ -96,11 +96,12 @@ public class Zombie extends Monster {
private int inWaterTime;
public int conversionTime;
private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field
-- private boolean shouldBurnInDay = true; // Paper
-+ // private boolean shouldBurnInDay = true; // Paper // Purpur - implemented in LivingEntity
+- private boolean shouldBurnInDay = true; // Paper - Add more Zombie API
++ // private boolean shouldBurnInDay = true; // Paper - Add more Zombie API // Purpur - implemented in LivingEntity
public Zombie(EntityType extends Zombie> type, Level world) {
super(type, world);
- this.breakDoorGoal = new BreakDoorGoal(this, com.google.common.base.Predicates.in(world.paperConfig().entities.behavior.doorBreakingDifficulty.getOrDefault(type, world.paperConfig().entities.behavior.doorBreakingDifficulty.get(EntityType.ZOMBIE)))); // Paper
+ this.breakDoorGoal = new BreakDoorGoal(this, com.google.common.base.Predicates.in(world.paperConfig().entities.behavior.doorBreakingDifficulty.getOrDefault(type, world.paperConfig().entities.behavior.doorBreakingDifficulty.get(EntityType.ZOMBIE)))); // Paper - Configurable door breaking difficulty
+ this.setShouldBurnInDay(true); // Purpur
}
@@ -332,28 +333,28 @@ index 52a576a16bfeb7dc6ec97280f9a5e0f408d71e46..9b1ae2fa1681f1212b6a09d5b10b1663
+ public boolean shouldBurnInDay() { return isSunSensitive(); } // Purpur - for ABI compatibility
public boolean isSunSensitive() {
- return this.shouldBurnInDay; // Paper - use api value instead
+ return this.shouldBurnInDay; // Paper - Add more Zombie API
}
@@ -486,7 +465,7 @@ public class Zombie extends Monster {
nbt.putBoolean("CanBreakDoors", this.canBreakDoors());
nbt.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1);
nbt.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1);
-- nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper
-+ // nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper // Purpur - implemented in LivingEntity
+- nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API
++ // nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API // Purpur - implemented in LivingEntity
}
@Override
@@ -500,7 +479,7 @@ public class Zombie extends Monster {
}
- // Paper start
+ // Paper start - Add more Zombie API
if (nbt.contains("Paper.ShouldBurnInDay")) {
- this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay");
+ // this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay"); // Purpur - implemented in LivingEntity
}
- // Paper end
+ // Paper end - Add more Zombie API
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index 001b9d5aef4c2d9fb272dd187d0d0bd001de5693..ea5ac1f53309fdd30aad40fd4a092f297d76fd61 100644
+index c3880875f5148d869d7e067fe78cbd1b9492b501..2ef6dc2390ed622eda284e3b4c85ec64e057c981 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -83,6 +83,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
@@ -369,7 +370,7 @@ index 001b9d5aef4c2d9fb272dd187d0d0bd001de5693..ea5ac1f53309fdd30aad40fd4a092f29
Preconditions.checkArgument(entity != null, "Unknown entity");
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-index 12c7505c2ce562b3188c079952e57ae1fab5268b..10ca0fdb5b92cc4f1d346540c9129d5c55732985 100644
+index 9bad55be51db41252f60fd976b2c1e54945a5b01..aa45eea710cdb4bd7aa0e12eacc879826b2e98c6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -1135,5 +1135,15 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
diff --git a/patches/server/0177-Add-toggle-for-end-portal-safe-teleporting.patch b/patches/server/0177-Add-toggle-for-end-portal-safe-teleporting.patch
index a81ead1c3..5c5520efb 100644
--- a/patches/server/0177-Add-toggle-for-end-portal-safe-teleporting.patch
+++ b/patches/server/0177-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 dff80441f192449f8d8e3a666af3e842f77b99ed..a7efbf24ca52d2303323ae2406cfe4beb7a72d4c 100644
+index ac0fc8b7184ba1b6d40261cc15d81a7936f728d4..57376b7c0d281a7950a69348b5aa869e89719232 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3224,7 +3224,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3223,7 +3223,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
this.processPortalCooldown();
@@ -18,7 +18,7 @@ index dff80441f192449f8d8e3a666af3e842f77b99ed..a7efbf24ca52d2303323ae2406cfe4be
}
diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
-index bc73d1051749339b44ff6765162ab6a76663a628..0b45bc1db5f57a4381c470a563aa81ac0d3a1be7 100644
+index a5a8bd6813b68ab2e913fc3ae30c9950c242beb3..f277a4a21b15627c45061e51c8f6c0812a176a10 100644
--- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
@@ -69,6 +69,22 @@ public class EndPortalBlock extends BaseEntityBlock {
@@ -45,7 +45,7 @@ index bc73d1051749339b44ff6765162ab6a76663a628..0b45bc1db5f57a4381c470a563aa81ac
entity.portalWorld = ((ServerLevel)world);
entity.portalBlock = pos.immutable();
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 7f69260fc1286c243ecc46311e1188a465f9d481..1e82dea915cdbf09cca47c753dc181c3e51a6fc1 100644
+index 77fa5b91ac5a65d2dce6195214c39dbff4aa6c8b..9940ba58d5f32a4ffe68a99270dda87ff34b977a 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -631,6 +631,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0178-Make-lightning-rod-range-configurable.patch b/patches/server/0178-Make-lightning-rod-range-configurable.patch
index 54f479a80..e76bad449 100644
--- a/patches/server/0178-Make-lightning-rod-range-configurable.patch
+++ b/patches/server/0178-Make-lightning-rod-range-configurable.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Make lightning rod range configurable
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 3bce997b0fe372fd4bf172a879bce80996246278..eea2d34a8a0a66ce90e347cd0fb271853098431c 100644
+index 5af5a22e725bdae1cc15702b37982f585c46286f..8a695b29d9c641dbd35d6faa1c2f97c0c83c99bb 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1197,7 +1197,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1192,7 +1192,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
return holder.is(PoiTypes.LIGHTNING_ROD);
}, (blockposition1) -> {
return blockposition1.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockposition1.getX(), blockposition1.getZ()) - 1;
diff --git a/patches/server/0191-Customizable-sleeping-actionbar-messages.patch b/patches/server/0191-Customizable-sleeping-actionbar-messages.patch
index e62103b5d..30f8bb4f7 100644
--- a/patches/server/0191-Customizable-sleeping-actionbar-messages.patch
+++ b/patches/server/0191-Customizable-sleeping-actionbar-messages.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Customizable sleeping actionbar messages
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index eea2d34a8a0a66ce90e347cd0fb271853098431c..cb1e59ed73f91a448346820cf47e083ebf81259d 100644
+index 8a695b29d9c641dbd35d6faa1c2f97c0c83c99bb..6971ce789c329d733bbc373422000fa0efff7ef6 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1246,11 +1246,27 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1241,11 +1241,27 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (this.canSleepThroughNights()) {
if (!this.getServer().isSingleplayer() || this.getServer().isPublished()) {
int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE);
@@ -38,7 +38,7 @@ index eea2d34a8a0a66ce90e347cd0fb271853098431c..cb1e59ed73f91a448346820cf47e083e
}
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 386a74f8a6f61fb745a1e36d8955d26bfc2ad78a..71dc8baa9eb93728c982139dde16f1c4567d1925 100644
+index 9e6b399584d21aeca1beeb84e67dee10424e8f19..88a8fda97854e19e658c52434eb25542f3699f35 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -1469,7 +1469,19 @@ public class ServerPlayer extends Player {
diff --git a/patches/server/0196-Add-compass-command.patch b/patches/server/0196-Add-compass-command.patch
index 16b251891..a48836a9a 100644
--- a/patches/server/0196-Add-compass-command.patch
+++ b/patches/server/0196-Add-compass-command.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add compass command
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
-index bf51f5e414ab45e33efa4057ab251120290b43e1..428dd75450bdd5daf902a1fbaca7031a9bc585a8 100644
+index f6d6c3d96056a744fffb4883240e991896348e0c..7e266a126180000dcad4b3bd8606349bdc95c30b 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
@@ -255,6 +255,7 @@ public class Commands {
@@ -17,11 +17,11 @@ index bf51f5e414ab45e33efa4057ab251120290b43e1..428dd75450bdd5daf902a1fbaca7031a
if (environment.includeIntegrated) {
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 71dc8baa9eb93728c982139dde16f1c4567d1925..cd449e35bbc689ce6d2595693a4fbe1f226998c8 100644
+index 88a8fda97854e19e658c52434eb25542f3699f35..d9911426361684a20e3559f8a6694a52b30d7479 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -283,6 +283,7 @@ public class ServerPlayer extends Player {
- public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event
+ public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event
public boolean purpurClient = false; // Purpur
private boolean tpsBar = false; // Purpur
+ private boolean compassBar = false; // Purpur
@@ -89,7 +89,7 @@ index 6aa225252d1026979fe88c273652e3d9ebdeb5f3..477639dddb7c5ae0c9cc45a6eca73d82
hideHiddenPlayersFromEntitySelector = getBoolean("settings.command.hide-hidden-players-from-entity-selector", hideHiddenPlayersFromEntitySelector);
uptimeFormat = getString("settings.command.uptime.format", uptimeFormat);
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index f78716c6d8635c21dacb216760a5ba0ebc33b73f..cc5e11524928bdec5402263eb68a51128b0503df 100644
+index f626232a488a38ba6dd2a491afbfa7dbaf4ff3bf..fd07ab7ce9eaec09429ecd75c93c57db437d5aa5 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -222,6 +222,7 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0209-Added-the-ability-to-add-combustible-items.patch b/patches/server/0209-Added-the-ability-to-add-combustible-items.patch
index bc81a285c..7e75b06cd 100644
--- a/patches/server/0209-Added-the-ability-to-add-combustible-items.patch
+++ b/patches/server/0209-Added-the-ability-to-add-combustible-items.patch
@@ -24,11 +24,11 @@ index 1af7e1548f0648890a1ef2fc0ff4e4c3a56c947c..decea1697c075e7549ccc7501c8e5935
} else if (this.isFuel(itemstack1)) {
if (!this.moveItemStackTo(itemstack1, 1, 2, false)) {
diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
-index 4fa77dbb02b5b2ad679f022ad10702453af0d178..af66c7eec6291b0bc9575f59c8210cd7f697232a 100644
+index acfacda5001ef188acfef8ac0d319d66ce1883fb..1d179e9485df78657ce67ab7ca4c4b1bcaf6c4ea 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java
@@ -209,6 +209,22 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit
- // Paper end
+ // Paper end - cache burn durations
}
+ // Purpur start
@@ -51,7 +51,7 @@ index 4fa77dbb02b5b2ad679f022ad10702453af0d178..af66c7eec6291b0bc9575f59c8210cd7
private int maxStack = MAX_STACK;
public List transaction = new java.util.ArrayList();
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index a675368062510a699ef18fb8064f0909930618d5..25105e2de0ac8a0b98212818029dafe2c864f383 100644
+index acf930d1d30e924177e49cde6d41a3ada1f16e5d..c1d1d5b561470e3ff1b75b41d83116ae05bef19e 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1573,6 +1573,19 @@ public final class CraftServer implements Server {
diff --git a/patches/server/0210-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch b/patches/server/0210-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch
index 3fb229aba..9d30fb24b 100644
--- a/patches/server/0210-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch
+++ b/patches/server/0210-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch
@@ -5,23 +5,23 @@ Subject: [PATCH] Option for if rain and thunder should stop on sleep
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index cb1e59ed73f91a448346820cf47e083ebf81259d..6ccbf43edf0177b4d32c080c34d3df3ca35fe957 100644
+index 6971ce789c329d733bbc373422000fa0efff7ef6..e675d7e82245e1b7ef94fc55f393002ab572e2ba 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1406,6 +1406,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1401,6 +1401,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@VisibleForTesting
public void resetWeatherCycle() {
// CraftBukkit start
+ if (this.purpurConfig.rainStopsAfterSleep) // Purpur
- this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - when passing the night
+ this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents
// If we stop due to everyone sleeping we should reset the weather duration to some other random value.
// Not that everyone ever manages to get the whole server to sleep at the same time....
-@@ -1413,6 +1414,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1408,6 +1409,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.serverLevelData.setRainTime(0);
}
// CraftBukkit end
+ if (this.purpurConfig.thunderStopsAfterSleep) // Purpur
- this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - when passing the night
+ this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents
// CraftBukkit start
// If we stop due to everyone sleeping we should reset the weather duration to some other random value.
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
diff --git a/patches/server/0212-Shift-right-click-to-use-exp-for-mending.patch b/patches/server/0212-Shift-right-click-to-use-exp-for-mending.patch
index 6e49ea195..1f5ff8ee0 100644
--- a/patches/server/0212-Shift-right-click-to-use-exp-for-mending.patch
+++ b/patches/server/0212-Shift-right-click-to-use-exp-for-mending.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Shift right click to use exp for mending
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
-index f5cd726ba56f2ecec0a0cf613ad720b8271afead..5e18507e6d799e51f555ffc0a5f14cb76959023d 100644
+index 587bf8027765ab678ea15a24e7953f81dd4e6d64..096884909a21472806592356abf272bb3ddeedf0 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
@@ -517,6 +517,7 @@ public class ServerPlayerGameMode {
@@ -36,10 +36,10 @@ index f5cd726ba56f2ecec0a0cf613ad720b8271afead..5e18507e6d799e51f555ffc0a5f14cb7
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 5c933996fe4cf45e3cb072fe2573419cc2fe92af..044b8d517b68cc7103ba7f2a57b26c8c3413b412 100644
+index 5f6a3fac5157f2baddff4d83ac56a01172c410d6..8b0a8bd1dab67ea440fc3af0a1b13c81dd738e25 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2057,6 +2057,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2052,6 +2052,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
boolean cancelled;
if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) {
diff --git a/patches/server/0216-Halloween-options-and-optimizations.patch b/patches/server/0216-Halloween-options-and-optimizations.patch
index 42e869702..41072497e 100644
--- a/patches/server/0216-Halloween-options-and-optimizations.patch
+++ b/patches/server/0216-Halloween-options-and-optimizations.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Halloween options and optimizations
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
-index 39dc169eedc407284452380a883e8a2735cc46cb..980f2426a5052117f03ebb1ed3f7882b236ad86e 100644
+index 3c7db09c5fbcb9d57febc937158b50634d68a082..08190c45b0807079b77c41203502e355ecaf2e14 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
@@ -304,7 +304,7 @@ public class Bat extends AmbientCreature {
@@ -26,12 +26,12 @@ index 39dc169eedc407284452380a883e8a2735cc46cb..980f2426a5052117f03ebb1ed3f7882b
if (net.minecraft.server.MinecraftServer.currentTick - lastSpookyCheck > ONE_HOUR) {
LocalDate localdate = LocalDate.now();
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
-index f35637a105d5aa12fb57c2456f2b2a7db12a49f0..f3e1fa62d9f067c0fe8aacb88bf30b01ee0562c1 100644
+index 3f9e81c0bdd85bec24a1209ad3fd3dc43d988a4f..cb378b343f721c16868a6673aba59856574c7133 100644
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
@@ -143,11 +143,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
this.reassessWeaponGoal();
- this.setCanPickUpLoot(this.level().paperConfig().entities.behavior.mobsCanAlwaysPickUpLoot.skeletons || randomsource.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); // Paper
+ this.setCanPickUpLoot(this.level().paperConfig().entities.behavior.mobsCanAlwaysPickUpLoot.skeletons || randomsource.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); // Paper - Add world settings for mobs picking up loot
if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) {
- LocalDate localdate = LocalDate.now();
- int i = localdate.get(ChronoField.DAY_OF_MONTH);
@@ -43,7 +43,7 @@ index f35637a105d5aa12fb57c2456f2b2a7db12a49f0..f3e1fa62d9f067c0fe8aacb88bf30b01
this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F;
}
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 9b1ae2fa1681f1212b6a09d5b10b16634ce65470..728f4f2d7c37e253b0dab752f627a7b6c4e8339c 100644
+index 2dad874c0a425cf2d0a385b6061ab79d81b82c86..47b5a928574a57107dfaeaecf49459496a64a036 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java
@@ -586,11 +586,7 @@ public class Zombie extends Monster {
@@ -60,7 +60,7 @@ index 9b1ae2fa1681f1212b6a09d5b10b16634ce65470..728f4f2d7c37e253b0dab752f627a7b6
this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F;
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 83e4255059ca68f1fef3a8915662db28a98109b3..285ea8571af68d86579e786912f1145dc0b83955 100644
+index 82522611cbca7ce08b9a12e514fb8286a3280550..9e3181b5f2329d44025f7d811f1865d353cb6a96 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -1684,6 +1684,13 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0218-UPnP-Port-Forwarding.patch b/patches/server/0218-UPnP-Port-Forwarding.patch
index 0a3ebd1ea..d16085d8e 100644
--- a/patches/server/0218-UPnP-Port-Forwarding.patch
+++ b/patches/server/0218-UPnP-Port-Forwarding.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] UPnP Port Forwarding
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 22cacc9491edcbbe3f107829d898bc16aab53902..187a529eaaac8ceec54419d6c4886705a2f810f7 100644
+index 2eb14b686effe22721b377c55f5dede050ddd616..dec396d4d8b603d1d5282d9273c0258964b27389 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -309,6 +309,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 16) {
return false;
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
diff --git a/patches/server/0234-Give-bee-counts-in-beehives-to-Purpur-clients.patch b/patches/server/0234-Give-bee-counts-in-beehives-to-Purpur-clients.patch
index e8979ed0f..3326a0d3d 100644
--- a/patches/server/0234-Give-bee-counts-in-beehives-to-Purpur-clients.patch
+++ b/patches/server/0234-Give-bee-counts-in-beehives-to-Purpur-clients.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Give bee counts in beehives to Purpur clients
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 4ac5205cb47dbe9d8fec7da19467f2060436cd9c..878a1d7bd73924b0d311fcc1f3e9fd23dbfa649a 100644
+index dec396d4d8b603d1d5282d9273c0258964b27389..d0391cfb2476ce6d045883bc99907d1c7ceb97ec 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1065,6 +1065,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> {
- private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper
- private static int joinAttemptsThisTick; // Paper
- private static int currTick; // Paper
+ private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world
+ private static int joinAttemptsThisTick; // Paper - Buffer joins to world
+ private static int currTick; // Paper - Buffer joins to world
+ private static int tickSecond; // Purpur
public void tick() {
this.flushQueue();
- // Paper start
+ // Paper start - Buffer joins to world
if (Connection.currTick != net.minecraft.server.MinecraftServer.currentTick) {
Connection.currTick = net.minecraft.server.MinecraftServer.currentTick;
+ // Purpur start
@@ -29,7 +29,7 @@ index 2ae08b21c63490bbf8cd870f9585d82ed131f815..b7a6c7e737e7aba0324a5c3c61bbfbcc
+ // Purpur end
Connection.joinAttemptsThisTick = 0;
}
- // Paper end
+ // Paper end - Buffer joins to world
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
index 590286e593fec706a3f16f0080b35aa0637ca06d..f17b160b304b1adbde80690ae482986309f3befe 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
diff --git a/patches/server/0241-Configurable-minimum-demand-for-trades.patch b/patches/server/0241-Configurable-minimum-demand-for-trades.patch
index 3902f4aa0..97af82010 100644
--- a/patches/server/0241-Configurable-minimum-demand-for-trades.patch
+++ b/patches/server/0241-Configurable-minimum-demand-for-trades.patch
@@ -9,7 +9,7 @@ This patch adds a config option to allow the minimum demand to instead
be configurable.
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index 9c86dc4b9cd558f0e8f97b63d6cab746bd30d10c..cb6ca99d429b395c0c79b57b1709eb1b8899da82 100644
+index 4902a2cb7f71e3f2fa6ae22e0d6746ca79ff8623..00e60eacf10b76f9d7020324df436b2c315486be 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
@@ -546,7 +546,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -22,19 +22,19 @@ index 9c86dc4b9cd558f0e8f97b63d6cab746bd30d10c..cb6ca99d429b395c0c79b57b1709eb1b
}
diff --git a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
-index 4f7457578ab3118d10e0d5dfc23d79c9b20c2f44..e03ce53b93d1b9366f2a7f14f341750a163ae0db 100644
+index 02feea12c998f37098b72becf6bfaf6b27d155de..9c89a85d934955c9388cfe1361f13e70e699d279 100644
--- a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
+++ b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
@@ -149,7 +149,12 @@ public class MerchantOffer {
}
public void updateDemand() {
-- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper
+- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962
+ // Purpur start
+ this.updateDemand(0);
+ }
+ public void updateDemand(int minimumDemand) {
-+ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses));
++ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962
+ // Purpur end
}
diff --git a/patches/server/0244-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch b/patches/server/0244-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch
index 42734a599..df171ee28 100644
--- a/patches/server/0244-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch
+++ b/patches/server/0244-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch
@@ -5,13 +5,13 @@ Subject: [PATCH] MC-238526 - Fix spawner not spawning water animals correctly
diff --git a/src/main/java/net/minecraft/world/entity/animal/WaterAnimal.java b/src/main/java/net/minecraft/world/entity/animal/WaterAnimal.java
-index 827912174ee08cd19249797d351887149b25c880..5b02848ea9f14060353014cada2d55397609e5ac 100644
+index 9b897cf53f4bb5d366e6ac88dbed93c59d8fe541..fc61f93e04e5bc893b89c746deb2b89c5be0d602 100644
--- a/src/main/java/net/minecraft/world/entity/animal/WaterAnimal.java
+++ b/src/main/java/net/minecraft/world/entity/animal/WaterAnimal.java
@@ -77,6 +77,6 @@ public abstract class WaterAnimal extends PathfinderMob {
i = world.getMinecraftWorld().paperConfig().entities.spawning.wateranimalSpawnHeight.maximum.or(i);
j = world.getMinecraftWorld().paperConfig().entities.spawning.wateranimalSpawnHeight.minimum.or(j);
- // Paper end
+ // Paper end - Make water animal spawn height configurable
- return pos.getY() >= j && pos.getY() <= i && world.getFluidState(pos.below()).is(FluidTags.WATER) && world.getBlockState(pos.above()).is(Blocks.WATER);
+ return ((reason == MobSpawnType.SPAWNER && world.getMinecraftWorld().purpurConfig.spawnerFixMC238526) || (pos.getY() >= j && pos.getY() <= i)) && world.getFluidState(pos.below()).is(FluidTags.WATER) && world.getBlockState(pos.above()).is(Blocks.WATER); // Purpur
}
diff --git a/patches/server/0257-Option-to-disable-kick-for-out-of-order-chat.patch b/patches/server/0257-Option-to-disable-kick-for-out-of-order-chat.patch
index 0ae0570f4..d14c1dbc9 100644
--- a/patches/server/0257-Option-to-disable-kick-for-out-of-order-chat.patch
+++ b/patches/server/0257-Option-to-disable-kick-for-out-of-order-chat.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Option to disable kick for out of order chat
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 044b8d517b68cc7103ba7f2a57b26c8c3413b412..1e9e035b873d9d1f5909ea6879f0a47c6eca47f9 100644
+index 8b0a8bd1dab67ea440fc3af0a1b13c81dd738e25..b33d6d1fbf483d9293c7be317f3419e799abe84f 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1722,7 +1722,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1717,7 +1717,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
do {
if (!iterator.hasNext()) {
diff --git a/patches/server/0261-Add-toggle-for-RNG-manipulation.patch b/patches/server/0261-Add-toggle-for-RNG-manipulation.patch
index 571013346..26a029dea 100644
--- a/patches/server/0261-Add-toggle-for-RNG-manipulation.patch
+++ b/patches/server/0261-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 5c9bc22fad1cb8de99fa30d86ac4204960e93d49..f574a59593ccbcf051a1c22756b6e05a8643ab31 100644
+index 57376b7c0d281a7950a69348b5aa869e89719232..376acce7e0fd5dedfdf10fa94ced41bc473b7815 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -600,7 +600,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -599,7 +599,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.bb = Entity.INITIAL_AABB;
this.stuckSpeedMultiplier = Vec3.ZERO;
this.nextStep = 1.0F;
diff --git a/patches/server/0264-Remove-Timings.patch b/patches/server/0264-Remove-Timings.patch
index b363761dc..34727a3dc 100644
--- a/patches/server/0264-Remove-Timings.patch
+++ b/patches/server/0264-Remove-Timings.patch
@@ -43,7 +43,7 @@ index b66a7d4aab887309579154815a0d4abf9de506b0..e6f56bc5b129699bab60db9c97c7f73b
return executedUnloadTask | canSaveChunk | canSaveEntities | canSavePOI ? new SaveStat(executedUnloadTask || canSaveChunk, canSaveEntities, canSavePOI): null;
}
diff --git a/src/main/java/net/minecraft/network/protocol/PacketUtils.java b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
-index c5c734b9eb80d1cdf0e9fd8a043f2b6d1f4cbffe..21c98c7511faed997c1352b0842c8795719dcc2b 100644
+index 3e2d5dcd62775b6ed7c0ce0ba51a71b635b1d644..166cd0f8e72189d10e56cd7bc095409aa919840e 100644
--- a/src/main/java/net/minecraft/network/protocol/PacketUtils.java
+++ b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
@@ -50,7 +50,7 @@ public class PacketUtils {
@@ -56,7 +56,7 @@ index c5c734b9eb80d1cdf0e9fd8a043f2b6d1f4cbffe..21c98c7511faed997c1352b0842c8795
} catch (Exception exception) {
label25:
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 6cfdb98969b1461912c857b6b8ae38f532f3bc9e..5a7f1e27b9e4d36789a0a835fd81ef117c6802c1 100644
+index 01a235831914698850befd777ec8b012006a95ec..1818e844e94522c9239b9a5cad812c09adeba636 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1427,7 +1427,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop list = Lists.newArrayList();
List list1 = this.level.players();
ObjectIterator objectiterator = this.entityMap.values().iterator();
@@ -297,7 +297,7 @@ index 5996b5ae5b53f2c9ed2c2c9f5a3c25e300f5e90f..c2a1a05ace909576a160574ea98f89d6
ChunkMap.TrackedEntity playerchunkmap_entitytracker;
-@@ -1212,17 +1212,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1208,17 +1208,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
playerchunkmap_entitytracker.serverEntity.sendChanges();
}
}
@@ -319,13 +319,13 @@ index 5996b5ae5b53f2c9ed2c2c9f5a3c25e300f5e90f..c2a1a05ace909576a160574ea98f89d6
}
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index 5cf74fe0214191d42e74fc104eba150a95894e0f..9f438b41b61ee1174d8f23bcb7d93380ad932e9c 100644
+index ad8e79c72841ff80f8af3580d2cdb89c13f6d688..e828f3d14af21318a716b9eba4b9bf80e377b073 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
@@ -296,10 +296,10 @@ public class ServerChunkCache extends ChunkSource {
io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.pushChunkWait(this.level, x1, z1); // Paper - rewrite chunk system
// Paper end
- com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x1, z1); // Paper - sync load info
+ com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x1, z1); // Paper - Add debug for sync chunk loads
- this.level.timings.syncChunkLoad.startTiming(); // Paper
+ //this.level.timings.syncChunkLoad.startTiming(); // Paper // Purpur
chunkproviderserver_b.managedBlock(completablefuture::isDone);
@@ -346,7 +346,7 @@ index 5cf74fe0214191d42e74fc104eba150a95894e0f..9f438b41b61ee1174d8f23bcb7d93380
+ //} // Paper - Timings // Purpur
}
- // Paper start - duplicate save, but call incremental
+ // Paper start - Incremental chunk and player saving; duplicate save, but call incremental
public void saveIncrementally() {
this.runDistanceManagerUpdates();
- try (co.aikar.timings.Timing timed = level.timings.chunkSaveData.startTiming()) { // Paper - Timings
@@ -355,9 +355,9 @@ index 5cf74fe0214191d42e74fc104eba150a95894e0f..9f438b41b61ee1174d8f23bcb7d93380
- } // Paper - Timings
+ //} // Paper - Timings // Purpur
}
- // Paper end
+ // Paper end - Incremental chunk and player saving
-@@ -488,23 +488,23 @@ public class ServerChunkCache extends ChunkSource {
+@@ -495,23 +495,23 @@ public class ServerChunkCache extends ChunkSource {
@Override
public void tick(BooleanSupplier shouldKeepTicking, boolean tickChunks) {
this.level.getProfiler().push("purge");
@@ -387,7 +387,7 @@ index 5cf74fe0214191d42e74fc104eba150a95894e0f..9f438b41b61ee1174d8f23bcb7d93380
this.level.getProfiler().pop();
this.clearCache();
}
-@@ -520,14 +520,14 @@ public class ServerChunkCache extends ChunkSource {
+@@ -527,14 +527,14 @@ public class ServerChunkCache extends ChunkSource {
gameprofilerfiller.push("pollingChunks");
gameprofilerfiller.push("filteringLoadedChunks");
// Paper - optimise chunk tick iteration
@@ -402,18 +402,18 @@ index 5cf74fe0214191d42e74fc104eba150a95894e0f..9f438b41b61ee1174d8f23bcb7d93380
- this.level.timings.countNaturalMobs.startTiming(); // Paper - timings
+ //this.level.timings.countNaturalMobs.startTiming(); // Paper - timings // Purpur
int k = this.distanceManager.getNaturalSpawnChunkCount();
- // Paper start - per player mob spawning
+ // Paper start - Optional per player mob spawns
int naturalSpawnChunkCount = k;
-@@ -557,7 +557,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -564,7 +564,7 @@ public class ServerChunkCache extends ChunkSource {
// Pufferfish end
}
- // Paper end
+ // Paper end - Optional per player mob spawns
- this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings
+ // this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur
// this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously
gameprofilerfiller.popPush("spawnAndTick");
-@@ -666,19 +666,19 @@ public class ServerChunkCache extends ChunkSource {
+@@ -673,19 +673,19 @@ public class ServerChunkCache extends ChunkSource {
}
}
// Paper end - optimise chunk tick iteration
@@ -437,7 +437,7 @@ index 5cf74fe0214191d42e74fc104eba150a95894e0f..9f438b41b61ee1174d8f23bcb7d93380
// Paper start - optimise chunk tick iteration
if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) {
it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone();
-@@ -692,7 +692,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -699,7 +699,7 @@ public class ServerChunkCache extends ChunkSource {
}
}
// Paper end - optimise chunk tick iteration
@@ -447,10 +447,10 @@ index 5cf74fe0214191d42e74fc104eba150a95894e0f..9f438b41b61ee1174d8f23bcb7d93380
gameprofilerfiller.pop();
gameprofilerfiller.pop();
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694acbc5ed3b 100644
+index e2c5a03bcf008db05e6170184c6167d2ca1555fb..0fe2457de7a6f3842ff80512dac1bd2d3bbc04aa 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -871,7 +871,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -866,7 +866,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
gameprofilerfiller.popPush("tickPending");
@@ -459,7 +459,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
if (!this.isDebug() && flag) {
j = this.getGameTime();
gameprofilerfiller.push("blockTicks");
-@@ -880,24 +880,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -875,24 +875,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.fluidTicks.tick(j, 65536, this::tickFluid);
gameprofilerfiller.pop();
}
@@ -491,7 +491,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
}
this.handlingTick = false;
-@@ -910,7 +910,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -905,7 +905,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (flag1 || this.emptyTime++ < 300) {
gameprofilerfiller.push("entities");
@@ -500,7 +500,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
if (this.dragonFight != null && flag) {
gameprofilerfiller.push("dragonFight");
this.dragonFight.tick();
-@@ -918,7 +918,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -913,7 +913,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
org.spigotmc.ActivationRange.activateEntities(this); // Spigot
@@ -509,7 +509,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
this.entityTickList.forEach((entity) -> {
entity.activatedPriorityReset = false; // Pufferfish - DAB
if (!entity.isRemoved()) {
-@@ -959,8 +959,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -954,8 +954,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
}
});
@@ -520,7 +520,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
gameprofilerfiller.pop();
this.tickBlockEntities();
}
-@@ -1104,7 +1104,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1099,7 +1099,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
} // Paper
gameprofilerfiller.popPush("tickBlocks");
@@ -529,7 +529,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
if (randomTickSpeed > 0) {
// Paper start - optimize random block ticking
LevelChunkSection[] sections = chunk.getSections();
-@@ -1138,7 +1138,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1133,7 +1133,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
// Paper end - optimise random block ticking
@@ -538,7 +538,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
gameprofilerfiller.pop();
}
-@@ -1482,8 +1482,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1477,8 +1477,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Spigot end
// Paper start- timings
final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity);
@@ -549,7 +549,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
// Paper end - timings
entity.setOldPosAndRot();
ProfilerFiller gameprofilerfiller = this.getProfiler();
-@@ -1499,7 +1499,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1494,7 +1494,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
entity.postTick(); // CraftBukkit
} else { entity.inactiveTick(); } // Paper - EAR 2
this.getProfiler().pop();
@@ -558,7 +558,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
Iterator iterator = entity.getPassengers().iterator();
while (iterator.hasNext()) {
-@@ -1522,8 +1522,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1517,8 +1517,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (passenger instanceof Player || this.entityTickList.contains(passenger)) {
// Paper - EAR 2
final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger);
@@ -569,7 +569,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
// Paper end
passenger.setOldPosAndRot();
++passenger.tickCount;
-@@ -1553,7 +1553,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1548,7 +1548,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.tickPassenger(passenger, entity2);
}
@@ -578,14 +578,14 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
}
} else {
passenger.stopRiding();
-@@ -1573,14 +1573,14 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1568,14 +1568,14 @@ public class ServerLevel extends Level implements WorldGenLevel {
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld()));
}
- try (co.aikar.timings.Timing ignored = this.timings.worldSave.startTiming()) {
+ //try (co.aikar.timings.Timing ignored = this.timings.worldSave.startTiming()) { // Purpur
if (doFull) {
- this.saveLevelData(true); // Pufferfish
+ this.saveLevelData(true); // Paper - Write SavedData IO async
}
- this.timings.worldSaveChunks.startTiming(); // Paper
@@ -596,16 +596,16 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
// Copied from save()
// CraftBukkit start - moved from MinecraftServer.saveChunks
-@@ -1592,7 +1592,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1587,7 +1587,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData());
}
// CraftBukkit end
- }
+ //} // Purpur
}
- // Paper end
+ // Paper end - Incremental chunk and player saving
-@@ -1606,7 +1606,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1601,7 +1601,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (!savingDisabled) {
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(this.getWorld())); // CraftBukkit
@@ -614,7 +614,7 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
if (progressListener != null) {
progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel"));
}
-@@ -1616,11 +1616,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1611,11 +1611,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
progressListener.progressStage(Component.translatable("menu.savingChunks"));
}
@@ -630,10 +630,10 @@ index d81fab38fccaf0e6a6164e2c7bb24fa4d97353a0..25e9bb866bb7c07c0a1f32a85441694a
} else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 1e9e035b873d9d1f5909ea6879f0a47c6eca47f9..35240470ee13099dcd857831cf2e863e53af52a7 100644
+index b33d6d1fbf483d9293c7be317f3419e799abe84f..3451fc27983d6ae2bc53568843d9f87f4e456b57 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2462,7 +2462,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2457,7 +2457,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
public void handleCommand(String s) { // Paper - private -> public
org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher
@@ -642,7 +642,7 @@ index 1e9e035b873d9d1f5909ea6879f0a47c6eca47f9..35240470ee13099dcd857831cf2e863e
if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot
this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s);
-@@ -2472,7 +2472,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2467,7 +2467,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
this.cserver.getPluginManager().callEvent(event);
if (event.isCancelled()) {
@@ -651,7 +651,7 @@ index 1e9e035b873d9d1f5909ea6879f0a47c6eca47f9..35240470ee13099dcd857831cf2e863e
return;
}
-@@ -2485,7 +2485,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2480,7 +2480,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
return;
} finally {
@@ -661,7 +661,7 @@ index 1e9e035b873d9d1f5909ea6879f0a47c6eca47f9..35240470ee13099dcd857831cf2e863e
}
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 834d2e66850ea907b48f7c0f0c1f8ecc396762ca..ae8db4b212b85adff85c761b2e2083a6ccce7cea 100644
+index d03b0efd15a77d54f23661ea0426d69dcf5b26aa..e2f58fe299694db1b8975a502b42c832ef23ffb9 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -1274,7 +1274,7 @@ public abstract class PlayerList {
@@ -675,7 +675,7 @@ index 834d2e66850ea907b48f7c0f0c1f8ecc396762ca..ae8db4b212b85adff85c761b2e2083a6
for (int i = 0; i < this.players.size(); ++i) {
@@ -1285,7 +1285,7 @@ public abstract class PlayerList {
}
- // Paper end
+ // Paper end - Incremental chunk and player saving
}
- MinecraftTimings.savePlayers.stopTiming(); // Paper
+ //MinecraftTimings.savePlayers.stopTiming(); // Paper // Purpur
@@ -683,7 +683,7 @@ index 834d2e66850ea907b48f7c0f0c1f8ecc396762ca..ae8db4b212b85adff85c761b2e2083a6
}
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java
-index 57ef7fbba3028c28231abf7b7ae78aa019323536..651c156dc8a5aad04d461add02e22147af657d07 100644
+index 1e71cde7cb7654f1c21ae5e27e2fad7b58f593eb..4f3a1c2bfaec6787c8fc62c7df13c512dfc2cb7a 100644
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java
@@ -58,9 +58,9 @@ public abstract class Behavior implements BehaviorContro
@@ -732,10 +732,10 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..7094701d213c73ba47ace806962244c1
}
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index 1df81be711afc2adeb6908c86c7952580f3c8f0a..ca3b05db0a1cfdbac1307ff95bacd1acb83cb616 100644
+index 29ff1ca5180aee623cd56c7310c2c0843f9a0b0a..81dcd8d608ff1b882817e3992c8c93b56dff325f 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -1318,15 +1318,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1317,15 +1317,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
ProfilerFiller gameprofilerfiller = this.getProfiler();
gameprofilerfiller.push("blockEntities");
@@ -754,7 +754,7 @@ index 1df81be711afc2adeb6908c86c7952580f3c8f0a..ca3b05db0a1cfdbac1307ff95bacd1ac
// Spigot start
// Iterator iterator = this.blockEntityTickers.iterator();
boolean flag = this.tickRateManager().runsNormally();
-@@ -1355,7 +1355,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1354,7 +1354,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
this.blockEntityTickers.removeAll(toRemove);
@@ -764,7 +764,7 @@ index 1df81be711afc2adeb6908c86c7952580f3c8f0a..ca3b05db0a1cfdbac1307ff95bacd1ac
co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper
gameprofilerfiller.pop();
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
-index 3fb96de68b93e8d33bd5ab9137e5d4facc94d788..9a0a16d09a4cda3c2303dabe70db6c3018f3dd08 100644
+index 2c300e3769acf534ee3bed91663374eca0acf5df..4e786cd3bc65d762c122f61ccb450bcd0887a745 100644
--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java
+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
@@ -133,7 +133,7 @@ public final class NaturalSpawner {
@@ -786,7 +786,7 @@ index 3fb96de68b93e8d33bd5ab9137e5d4facc94d788..9a0a16d09a4cda3c2303dabe70db6c30
}
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index 76a4708464d35dd7782b1032288b52d61ee8fffc..757dc4292d371e697f336c4665427b3b4a3aa73b 100644
+index c3fb622845770bcee9ddd6ebbeee174b06ee16eb..134d2d56af71aceb1ca33d7bb708124655c5d319 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
@@ -799,7 +799,7 @@ public class LevelChunk extends ChunkAccess {
@@ -903,7 +903,7 @@ index b3e1adeb932da9b3bed16acd94e2f16da48a7c72..d3ec817e95628f1fc8be4a29c9a0f13c
// Paper end - add timings for scoreboard search
}
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
-index d85982831fabc4643d8273ea27cf6dd0d05fee7c..9357539c71e3a8408b1f055527ffd192b5f9f1d9 100644
+index 1085d90f6db968760a52f9d00a25299618264c5f..9113c8ebff5e71f859a19f024969582052c57546 100644
--- a/src/main/java/org/spigotmc/ActivationRange.java
+++ b/src/main/java/org/spigotmc/ActivationRange.java
@@ -170,7 +170,7 @@ public class ActivationRange
diff --git a/patches/server/0265-Remove-Mojang-Profiler.patch b/patches/server/0265-Remove-Mojang-Profiler.patch
index 15ed74547..4cc55f60f 100644
--- a/patches/server/0265-Remove-Mojang-Profiler.patch
+++ b/patches/server/0265-Remove-Mojang-Profiler.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Remove Mojang Profiler
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
-index d3646cfc4d694d216dccb41f540a76e44050320a..9c370e3ad78f016c49b62488c9d0c861c4ad31e6 100644
+index 7e266a126180000dcad4b3bd8606349bdc95c30b..819f2cba19e3a0c2a6a8087f2346ebe4782aeb8c 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
@@ -165,7 +165,7 @@ public class Commands {
@@ -89,7 +89,7 @@ index 821dc4aeaf48460000682604fba51b340b9738e7..3aa2ce6a2a3d3cdfc372a60419a09f49
}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 5a7f1e27b9e4d36789a0a835fd81ef117c6802c1..9424785e55c8f31bd6c6029e2d3a6f9fa5e571df 100644
+index 1818e844e94522c9239b9a5cad812c09adeba636..c6403274658ccaa2ed27e586cc35d13c760f2040 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -344,13 +344,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper
+ worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
worldserver.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur
- this.profiler.push(() -> {
@@ -254,7 +254,7 @@ index 5a7f1e27b9e4d36789a0a835fd81ef117c6802c1..9424785e55c8f31bd6c6029e2d3a6f9f
+ //this.profiler.pop(); // Purpur
worldserver.explosionDensityCache.clear(); // Paper - Optimize explosions
}
- this.isIteratingOverLevels = false; // Paper
+ this.isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
- this.profiler.popPush("connection");
+ //this.profiler.popPush("connection"); // Purpur
@@ -448,7 +448,7 @@ index df0c15f6b5b2224d53e4f8fad42b9a1e5f33dc25..5dd0dcb47211cec69189115bf4eab1df
}
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 87bbf12563d035b2b63a4d36095dc1cd8b624671..172c7b94830c13835e48d68a039bd66e7e7622b0 100644
+index a9f933cf827f7973e6b881b071108050b99f80f3..6e7e71c7962d43f2d4fbd218f2017557ddd53eb2 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -545,20 +545,20 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -477,7 +477,7 @@ index 87bbf12563d035b2b63a4d36095dc1cd8b624671..172c7b94830c13835e48d68a039bd66e
public boolean hasWork() {
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae4b2c1d26 100644
+index e828f3d14af21318a716b9eba4b9bf80e377b073..a5067485fb6683e3255681a9c5a6df86c90ce0fa 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
@@ -73,7 +73,7 @@ public class ServerChunkCache extends ChunkSource {
@@ -492,7 +492,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
@@ -277,16 +277,16 @@ public class ServerChunkCache extends ChunkSource {
return ifLoaded;
}
- // Paper end
+ // Paper end - Perf: Optimise getChunkAt calls for loaded chunks
- ProfilerFiller gameprofilerfiller = this.level.getProfiler();
+ //ProfilerFiller gameprofilerfiller = this.level.getProfiler(); // Purpur
@@ -509,7 +509,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
CompletableFuture> completablefuture = this.getChunkFutureMainThread(x, z, leastStatus, create, true); // Paper
ServerChunkCache.MainThreadExecutor chunkproviderserver_b = this.mainThreadProcessor;
-@@ -475,24 +475,24 @@ public class ServerChunkCache extends ChunkSource {
+@@ -482,24 +482,24 @@ public class ServerChunkCache extends ChunkSource {
// CraftBukkit start - modelled on below
public void purgeUnload() {
if (true) return; // Paper - tickets will be removed later, this behavior isn't really well accounted for by the chunk system
@@ -539,7 +539,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
if (tickChunks) {
//this.level.timings.chunks.startTiming(); // Paper - timings // Purpur
this.chunkMap.level.playerChunkLoader.tick(); // Paper - replace player chunk loader - this is mostly required to account for view distance changes
-@@ -502,10 +502,10 @@ public class ServerChunkCache extends ChunkSource {
+@@ -509,10 +509,10 @@ public class ServerChunkCache extends ChunkSource {
}
//this.level.timings.doChunkUnload.startTiming(); // Spigot // Purpur
@@ -552,7 +552,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
this.clearCache();
}
-@@ -515,10 +515,10 @@ public class ServerChunkCache extends ChunkSource {
+@@ -522,10 +522,10 @@ public class ServerChunkCache extends ChunkSource {
this.lastInhabitedUpdate = i;
if (!this.level.isDebug()) {
@@ -566,7 +566,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
// Paper - optimise chunk tick iteration
//if (this.level.getServer().tickRateManager().runsNormally()) this.level.timings.chunkTicks.startTiming(); // Paper // Purpur
-@@ -526,7 +526,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -533,7 +533,7 @@ public class ServerChunkCache extends ChunkSource {
this.level.resetIceAndSnowTick(); // Pufferfish - reset ice & snow tick random
if (this.level.getServer().tickRateManager().runsNormally()) {
@@ -574,8 +574,8 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
+ // gameprofilerfiller.popPush("naturalSpawnCount"); // Purpur
//this.level.timings.countNaturalMobs.startTiming(); // Paper - timings // Purpur
int k = this.distanceManager.getNaturalSpawnChunkCount();
- // Paper start - per player mob spawning
-@@ -560,7 +560,7 @@ public class ServerChunkCache extends ChunkSource {
+ // Paper start - Optional per player mob spawns
+@@ -567,7 +567,7 @@ public class ServerChunkCache extends ChunkSource {
// this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur
// this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously
@@ -584,7 +584,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit
// Paper start - optimise chunk tick iteration
-@@ -668,7 +668,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -675,7 +675,7 @@ public class ServerChunkCache extends ChunkSource {
// Paper end - optimise chunk tick iteration
// this.level.timings.chunkTicks.stopTiming(); // Paper // Purpur
@@ -593,7 +593,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
if (flag) {
//try (co.aikar.timings.Timing ignored = this.level.timings.miscMobSpawning.startTiming()) { // Paper - timings // Purpur
this.level.tickCustomSpawners(this.spawnEnemies, this.spawnFriendlies);
-@@ -676,7 +676,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -683,7 +683,7 @@ public class ServerChunkCache extends ChunkSource {
}
}
@@ -602,7 +602,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
// Paper - optimise chunk tick iteration
//this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing // Purpur
// Paper start - optimise chunk tick iteration
-@@ -694,10 +694,10 @@ public class ServerChunkCache extends ChunkSource {
+@@ -701,10 +701,10 @@ public class ServerChunkCache extends ChunkSource {
// Paper end - optimise chunk tick iteration
//this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing // Purpur
// Paper - optimise chunk tick iteration
@@ -616,7 +616,7 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
// Pufferfish start - optimize mob spawning
if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning) {
for (ServerPlayer player : this.level.players) {
-@@ -901,7 +901,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -908,7 +908,7 @@ public class ServerChunkCache extends ChunkSource {
@Override
protected void doRunTask(Runnable task) {
@@ -626,10 +626,10 @@ index 9f438b41b61ee1174d8f23bcb7d93380ad932e9c..c3c47857515a7f75d69c718f352d8bae
}
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29ef1da3a01 100644
+index 0fe2457de7a6f3842ff80512dac1bd2d3bbc04aa..65a60983be85707883bd330e79a8c1f03428f2c9 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -829,16 +829,16 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -824,16 +824,16 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
public void tick(BooleanSupplier shouldKeepTicking) {
@@ -649,7 +649,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
this.advanceWeatherCycle();
}
-@@ -870,30 +870,30 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -865,30 +865,30 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.tickTime();
}
@@ -687,7 +687,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
if (flag) {
// this.timings.doSounds.startTiming(); // Spigot // Purpur
this.runBlockEvents();
-@@ -901,7 +901,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -896,7 +896,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
this.handlingTick = false;
@@ -696,7 +696,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
boolean flag1 = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players
if (flag1) {
-@@ -909,12 +909,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -904,12 +904,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
if (flag1 || this.emptyTime++ < 300) {
@@ -712,7 +712,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
}
org.spigotmc.ActivationRange.activateEntities(this); // Spigot
-@@ -925,9 +925,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -920,9 +920,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed
entity.discard();
} else if (!tickratemanager.isEntityFrozen(entity)) {
@@ -724,7 +724,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
if (true || this.chunkSource.chunkMap.getDistanceManager().inEntityTickingRange(entity.chunkPosition().toLong())) { // Paper - now always true if in the ticking list
Entity entity1 = entity.getVehicle();
-@@ -939,7 +939,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -934,7 +934,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
entity.stopRiding();
}
@@ -733,7 +733,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
// Pufferfish start - copied from this.guardEntityTick
try {
this.tickNonPassenger(entity); // Pufferfish - changed
-@@ -954,20 +954,19 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -949,20 +949,19 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Paper end
}
// Pufferfish end
@@ -757,7 +757,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
}
@Override
-@@ -1049,9 +1048,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1044,9 +1043,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
boolean flag = this.isRaining();
int j = chunkcoordintpair.getMinBlockX();
int k = chunkcoordintpair.getMinBlockZ();
@@ -769,7 +769,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
final BlockPos.MutableBlockPos blockposition = this.chunkTickMutablePosition; // Paper - use mutable to reduce allocation rate, final to force compile fail on change
if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && /*this.random.nextInt(this.spigotConfig.thunderChance) == 0 &&*/ chunk.shouldDoLightning(this.random)) { // Spigot // Paper - disable thunder // Pufferfish - replace random with shouldDoLightning
-@@ -1090,7 +1089,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1085,7 +1084,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
}
@@ -778,7 +778,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
if (!this.paperConfig().environment.disableIceAndSnow) { // Paper
for (int l = 0; l < randomTickSpeed; ++l) {
-@@ -1103,7 +1102,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1098,7 +1097,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
} // Paper
@@ -787,7 +787,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
//timings.chunkTicksBlocks.startTiming(); // Paper // Purpur
if (randomTickSpeed > 0) {
// Paper start - optimize random block ticking
-@@ -1139,7 +1138,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1134,7 +1133,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Paper end - optimise random block ticking
//timings.chunkTicksBlocks.stopTiming(); // Paper // Purpur
@@ -796,7 +796,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
}
@VisibleForTesting
-@@ -1486,19 +1485,19 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1481,19 +1480,19 @@ public class ServerLevel extends Level implements WorldGenLevel {
//try { // Purpur
// Paper end - timings
entity.setOldPosAndRot();
@@ -821,7 +821,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
//} finally { timer.stopTiming(); } // Paper - timings // Purpur
Iterator iterator = entity.getPassengers().iterator();
-@@ -1527,12 +1526,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1522,12 +1521,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Paper end
passenger.setOldPosAndRot();
++passenger.tickCount;
@@ -838,7 +838,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
// Paper start - EAR 2
if (isActive) {
passenger.rideTick();
-@@ -1544,7 +1543,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1539,7 +1538,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
vehicle.positionRider(passenger);
}
// Paper end - EAR 2
@@ -848,7 +848,7 @@ index 3a06bf55d48ed96556ad9d389ab5ebaefeb078d9..1309c9e63095a0484ee0fa119a41c29e
while (iterator.hasNext()) {
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 5ca339100cb311faa87b978b3c8df36d24fea112..97fa5c65bb6fe53bada4c42d54a9f7c22dbfca38 100644
+index 52d0c1e6ae4891bccd08cbd34a36e7fb6afd09d6..516ff3e5141df57938c43adee902a48e07048302 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -1240,7 +1240,7 @@ public class ServerPlayer extends Player {
@@ -881,7 +881,7 @@ index 5ca339100cb311faa87b978b3c8df36d24fea112..97fa5c65bb6fe53bada4c42d54a9f7c2
this.connection.send(new ClientboundPlayerAbilitiesPacket(this.getAbilities()));
playerlist.sendLevelInfo(this, worldserver);
diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-index 97914d9c0d8f9ad58fbc79db2afd9cba57bf93b6..da499e0b21eba40d24d95047e3a9220567d4bae7 100644
+index 4ff11fa980b89c8721f792139a5bea0cc31907c2..fa5107deb090a779ddc2fdd0fd6de05e1fcf85b9 100644
--- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
@@ -222,7 +222,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@@ -890,7 +890,7 @@ index 97914d9c0d8f9ad58fbc79db2afd9cba57bf93b6..da499e0b21eba40d24d95047e3a92205
protected void keepConnectionAlive() {
- this.server.getProfiler().push("keepAlive");
+ //this.server.getProfiler().push("keepAlive"); // Purpur
- // Paper Start - give clients a longer time to respond to pings as per pre 1.12.2 timings
+ // Paper start - give clients a longer time to respond to pings as per pre 1.12.2 timings
// This should effectively place the keepalive handling back to "as it was" before 1.12.2
long currentTime = Util.getMillis();
@@ -258,7 +258,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@@ -1107,19 +1107,19 @@ 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 d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e466bb75e 100644
+index 376acce7e0fd5dedfdf10fa94ced41bc473b7815..805991ef816ad5ae82ed26781ec265173a8f192c 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -852,7 +852,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -851,7 +851,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
// CraftBukkit end
public void baseTick() {
- this.level().getProfiler().push("entityBaseTick");
+ //this.level().getProfiler().push("entityBaseTick"); // Purpur
- if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Update last hurt when ticking
+ if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Prevent entity loading causing async lookups
this.feetBlockState = null;
if (this.isPassenger() && this.getVehicle().isRemoved()) {
-@@ -913,7 +913,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -912,7 +912,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
this.firstTick = false;
@@ -1128,7 +1128,7 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
}
public void setSharedFlagOnFire(boolean onFire) {
-@@ -1132,7 +1132,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1131,7 +1131,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
}
@@ -1137,7 +1137,7 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7D) {
movement = movement.multiply(this.stuckSpeedMultiplier);
this.stuckSpeedMultiplier = Vec3.ZERO;
-@@ -1141,7 +1141,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1140,7 +1140,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);
@@ -1146,7 +1146,7 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
return;
}
// Paper end
-@@ -1162,8 +1162,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1161,8 +1161,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.setPos(this.getX() + vec3d1.x, this.getY() + vec3d1.y, this.getZ() + vec3d1.z);
}
@@ -1157,7 +1157,7 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
boolean flag = !Mth.equal(movement.x, vec3d1.x);
boolean flag1 = !Mth.equal(movement.z, vec3d1.z);
-@@ -1182,7 +1182,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1181,7 +1181,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.checkFallDamage(vec3d1.y, this.onGround(), iblockdata, blockposition);
if (this.isRemoved()) {
@@ -1166,7 +1166,7 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
} else {
if (this.horizontalCollision) {
Vec3 vec3d2 = this.getDeltaMovement();
-@@ -1320,7 +1320,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1319,7 +1319,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.setRemainingFireTicks(-this.getFireImmuneTicks());
}
@@ -1175,27 +1175,27 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
}
}
// Paper start - detailed watchdog information
-@@ -3191,7 +3191,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3190,7 +3190,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
ServerLevel worldserver1 = minecraftserver.getLevel(resourcekey);
if (true && !this.isPassenger() && this.portalTime++ >= i) { // CraftBukkit
- this.level().getProfiler().push("portal");
+ //this.level().getProfiler().push("portal"); // Purpur
this.portalTime = i;
- // Paper start
+ // Paper start - Add EntityPortalReadyEvent
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);
-@@ -3209,7 +3209,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3208,7 +3208,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
- } // Paper
+ } // Paper - Add EntityPortalReadyEvent
// CraftBukkit end
- this.level().getProfiler().pop();
+ //this.level().getProfiler().pop(); // Purpur
}
this.isInsidePortal = false;
-@@ -3684,14 +3684,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3683,14 +3683,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
- // Paper end
+ // Paper end - Fix item duplication and teleport issues
if (this.level() instanceof ServerLevel && !this.isRemoved()) {
- this.level().getProfiler().push("changeDimension");
+ //this.level().getProfiler().push("changeDimension"); // Purpur
@@ -1210,16 +1210,16 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
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) {
-@@ -3730,7 +3730,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3729,7 +3729,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.unRide();
// CraftBukkit end
- this.level().getProfiler().popPush("reloading");
+ //this.level().getProfiler().popPush("reloading"); // Purpur
- // Paper start - Change lead drop timing to prevent dupe
+ // Paper start - Fix item duplication and teleport issues
if (this instanceof Mob) {
((Mob) this).dropLeash(true, true); // Paper drop lead
-@@ -3757,10 +3757,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3756,10 +3756,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
this.removeAfterChangingDimensions();
@@ -1233,7 +1233,7 @@ index d5f60a9e2557f687d3c1218559601526f349ecbe..ed7bc379d55b7fd8be1d18e388356a7e
}
} else {
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 4c75007bc1b700b9c4b79dce0b63c21fec6a742e..46230c0fbcfd565163abca17313a6f0ea5e63249 100644
+index b6422365998bb6008f2efbae209171da4455e8cf..830998da41f38ab799db863ea088e0476b9fad5c 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -409,7 +409,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -1340,11 +1340,11 @@ index 4c75007bc1b700b9c4b79dce0b63c21fec6a742e..46230c0fbcfd565163abca17313a6f0e
this.pushEntities();
- this.level().getProfiler().pop();
+ //this.level().getProfiler().pop(); // Purpur
- // Paper start
+ // Paper start - Add EntityMoveEvent
// Purpur start
if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) {
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 9caee3db19fa76e8e311ead8f892d0f8bebfe6b2..4c0d710d20e074ad4a0fdd1cd4c0c3d3383b68a5 100644
+index c029752141efbc48005dae0e3c1a071ba039b3a7..faff4cbeaacf0beaae1ec488f6f233326f415975 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -367,13 +367,13 @@ public abstract class Mob extends LivingEntity implements Targeting {
@@ -1501,7 +1501,7 @@ index 1635818fc4b1788c0d397085239df6dd75b210ab..02978315bc2b828cc603ce7478408f3f
public Set getAvailableGoals() {
diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
-index b37415d45dda8e658c8995a4519e552dc378bb41..0e36e3e672de4c806e2d534b437489a3a349a722 100644
+index a9922074b6aa6a9898615385bb11d2a758662970..9ffbe784a0d45b494f29ab1555841b4be9f58128 100644
--- a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
+++ b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
@@ -172,12 +172,12 @@ public abstract class PathNavigation {
@@ -1558,7 +1558,7 @@ index 09f796ec491f21520e1fcc454249e4696dad3b1b..9bf06cf7b3706f8883e1a0ceac8b1aeb
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java
-index b7eaa9e99688ae300c2e9176991c29828d1cc800..e4d529825e681bbc656113b1fd44894338e23d21 100644
+index e73d7b47327da59dbf49c2160acd0b3ebb2a4232..472b76d6ec721fa46857097589aa879f237e3e0d 100644
--- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java
+++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java
@@ -315,13 +315,13 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder optional = this.getBrain().getMemory(MemoryModuleType.PLAY_DEAD_TICKS);
diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
-index 30b19b64fdc9b03f15341831235492f4cdd9823a..b46942c5fafe216039426531a4dbb19bda02c084 100644
+index d1ada87d222e5b35c2df5a0e7b0075ec3413fa66..fb50a3f3665cca4bb2e586fbd73c580a5d691f69 100644
--- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
+++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
@@ -158,13 +158,13 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Saddl
@@ -1645,7 +1645,7 @@ index 3103df74b7ae5a5ed841bf97794284cd43ad59de..14135dac80dec4224715e21cef6556d2
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
-index fba00cab2c4b234dd2e85b5f4dcd0db34183c1a2..806b207e5246db7daa03bebabd7aa574d8b0dab7 100644
+index f7730ec3a6c8818baf2a7a738e5a49a56d17c0e8..566f117ba6742ba17ffb8a2673a8c320c39549f7 100644
--- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
@@ -226,13 +226,13 @@ public class Goat extends Animal {
@@ -1667,7 +1667,7 @@ index fba00cab2c4b234dd2e85b5f4dcd0db34183c1a2..806b207e5246db7daa03bebabd7aa574
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java
-index 42bfc59462f320e95c13075c8541c4c4c98a6879..dcb10e2ea1e0c7d0479adae5bc2ff57ece172aad 100644
+index 4d1071546f523c63b9c981e90a09393e9e4400fa..5e7d76dcdc170b809ab82f6e2259c9b4d3d741be 100644
--- a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java
+++ b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java
@@ -517,11 +517,11 @@ public class Sniffer extends Animal {
@@ -1721,7 +1721,7 @@ index ab183a7d94a27d5235ff33ce7784c92d66d40b89..94431d5c789a9f558c16c0d1fc8f1f74
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
-index e326e753cc6bca1bd00287d16c9796b9f3dd4d14..9d6c4f13c4a444c6c815c6c4f2114142f166b9bb 100644
+index 510ee1aee1dd106b5129c375ebb59c7950b8b989..5c160d6aa4e3d51c1161f82e92e5e8c1e809a574 100644
--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java
@@ -168,10 +168,10 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
@@ -1738,7 +1738,7 @@ index e326e753cc6bca1bd00287d16c9796b9f3dd4d14..9d6c4f13c4a444c6c815c6c4f2114142
if (this.isConverting()) {
++this.timeInOverworld;
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
-index 9ca1618ab945ad834c5fc221ada49058f806e79c..8e829d522a6012f409161ad5a9a06721a942d7e4 100644
+index 141fa7d4e1b81e90f4d63a3459c9a72bc595d30b..1422c0f4ff6a3e61f229574cd7b50971bdbd8451 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -335,10 +335,10 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -1772,7 +1772,7 @@ index 61e8f2d030fc50840c3f80dfb6fc810797ec440f..856e6e02c9424a6c06e310262cb4f5bd
PiglinBruteAi.maybePlayActivitySound(this);
super.customServerAiStep();
diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
-index 63e4688d8055cf4a8883477f7943bf63520c0693..22263f219ce9e9f014abb76c43297c528acb36eb 100644
+index 384e7b29215cadfa40af07a183a9c9c6a5b4a80a..bf7ef72a7d92db8f11789a69583270644de0dac7 100644
--- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
+++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
@@ -302,10 +302,10 @@ public class Warden extends Monster implements VibrationSystem {
@@ -1789,7 +1789,7 @@ index 63e4688d8055cf4a8883477f7943bf63520c0693..22263f219ce9e9f014abb76c43297c52
if ((this.tickCount + this.getId()) % 120 == 0) {
Warden.applyDarknessAround(worldserver, this.position(), this, 20);
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index fb8fe6b74bf8c392192c846e05c109dbb364c0a9..27ebfda79d9c4463f157b99c2c56e256839b3a31 100644
+index c8aa886f7f7457ba160b9e29528f9f5d18ed005a..c137f8f1a2566690f2b2e82b16e7186eaa711f38 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
@@ -342,7 +342,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -1811,7 +1811,7 @@ index fb8fe6b74bf8c392192c846e05c109dbb364c0a9..27ebfda79d9c4463f157b99c2c56e256
this.assignProfessionWhenSpawned = false;
}
diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
-index 210b6d71207b99e66ba014b176b2c1445053b1d1..82a58ca092371866566bac5f1efcca4964e59e60 100644
+index 1fa02130dcb65b3109fde0cb612b538b1c4cd4cb..353ee2d2ea86ba98052acb2edb5d0b3d9393f3ca 100644
--- a/src/main/java/net/minecraft/world/level/Explosion.java
+++ b/src/main/java/net/minecraft/world/level/Explosion.java
@@ -659,7 +659,7 @@ public class Explosion {
@@ -1833,10 +1833,10 @@ index 210b6d71207b99e66ba014b176b2c1445053b1d1..82a58ca092371866566bac5f1efcca49
if (this.fire) {
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index fd0a9350e4b08daff437d4d054803d72aec5c950..b58402221840a9e72b30a31d884b0fb2d86883fd 100644
+index 81dcd8d608ff1b882817e3992c8c93b56dff325f..f638224f8ae018030fa00962cd3c75fc31ab2488 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -1315,9 +1315,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1314,9 +1314,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
protected void tickBlockEntities() {
@@ -1848,7 +1848,7 @@ index fd0a9350e4b08daff437d4d054803d72aec5c950..b58402221840a9e72b30a31d884b0fb2
//this.timings.tileEntityPending.startTiming(); // Spigot // Purpur
this.tickingBlockEntities = true;
if (!this.pendingBlockEntityTickers.isEmpty()) {
-@@ -1358,7 +1358,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1357,7 +1357,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
//this.timings.tileEntityTick.stopTiming(); // Spigot // Purpur
this.tickingBlockEntities = false;
co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper
@@ -1857,7 +1857,7 @@ index fd0a9350e4b08daff437d4d054803d72aec5c950..b58402221840a9e72b30a31d884b0fb2
this.spigotConfig.currentPrimedTnt = 0; // Spigot
}
-@@ -1568,7 +1568,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1567,7 +1567,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@Override
public List getEntities(@Nullable Entity except, AABB box, Predicate super Entity> predicate) {
@@ -1866,7 +1866,7 @@ index fd0a9350e4b08daff437d4d054803d72aec5c950..b58402221840a9e72b30a31d884b0fb2
List list = Lists.newArrayList();
((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call
return list;
-@@ -1587,7 +1587,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1586,7 +1586,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
public void getEntities(EntityTypeTest filter, AABB box, Predicate super T> predicate, List super T> result, int limit) {
@@ -1875,7 +1875,7 @@ index fd0a9350e4b08daff437d4d054803d72aec5c950..b58402221840a9e72b30a31d884b0fb2
// Paper start - optimise this call
//TODO use limit
if (filter instanceof net.minecraft.world.entity.EntityType entityTypeTest) {
-@@ -1846,7 +1846,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1845,7 +1845,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
public ProfilerFiller getProfiler() {
@@ -1885,7 +1885,7 @@ index fd0a9350e4b08daff437d4d054803d72aec5c950..b58402221840a9e72b30a31d884b0fb2
}
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
-index 9a0a16d09a4cda3c2303dabe70db6c3018f3dd08..5a31e0e13a49faa96c0a8927aebb131cb30dacbc 100644
+index 4e786cd3bc65d762c122f61ccb450bcd0887a745..de48cdb665a43f1df94bfbe740d32b4e3609eec8 100644
--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java
+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
@@ -132,7 +132,7 @@ public final class NaturalSpawner {
@@ -1905,9 +1905,9 @@ index 9a0a16d09a4cda3c2303dabe70db6c3018f3dd08..5a31e0e13a49faa96c0a8927aebb131c
+ //world.getProfiler().pop(); // Purpur
}
- // Paper start
+ // Paper start - Add mobcaps commands
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index 757dc4292d371e697f336c4665427b3b4a3aa73b..c37aa33134b8602caae5ecff00439ad5e0005d18 100644
+index 134d2d56af71aceb1ca33d7bb708124655c5d319..f782fee9243129d0990777dcd2d74735ceb5e64e 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
@@ -457,11 +457,11 @@ public class LevelChunk extends ChunkAccess {
@@ -1947,12 +1947,12 @@ index 757dc4292d371e697f336c4665427b3b4a3aa73b..c37aa33134b8602caae5ecff00439ad5
if (throwable instanceof ThreadDeath) throw throwable; // Paper
// Paper start - Prevent tile entity and entity crashes
diff --git a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java
-index d23481453717f715124156b5d83f6448f720d049..a8af51a25b0f99c3a64d9150fdfcd6b818aa7581 100644
+index eb18494bd7257fa5eb00dea16cf4d5667b796f2b..f039d6109ee6f55542adc8f30476ba9a9e4974bf 100644
--- a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java
+++ b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java
@@ -53,8 +53,8 @@ public class PathFinder {
@Nullable
- // Paper start - optimize collection
+ // Paper start - Perf: remove streams and optimize collection
private Path findPath(ProfilerFiller profiler, Node startNode, List> positions, float followRange, int distance, float rangeMultiplier) {
- profiler.push("find_path");
- profiler.markForCharting(MetricCategory.PATH_FINDING);
diff --git a/patches/server/0266-Add-more-logger-output-for-invalid-movement-kicks.patch b/patches/server/0266-Add-more-logger-output-for-invalid-movement-kicks.patch
index 89e52f4f9..618477cb5 100644
--- a/patches/server/0266-Add-more-logger-output-for-invalid-movement-kicks.patch
+++ b/patches/server/0266-Add-more-logger-output-for-invalid-movement-kicks.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add more logger output for invalid movement kicks
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 35240470ee13099dcd857831cf2e863e53af52a7..99d31feec32881c1c5729230ac81a986c2b2baeb 100644
+index 3451fc27983d6ae2bc53568843d9f87f4e456b57..dc2c43794841af062b325a90fd5f68f581b99317 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -737,6 +737,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -734,6 +734,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
if (packet.getId() == this.awaitingTeleport) {
if (this.awaitingPositionFromClient == null) {
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
@@ -16,7 +16,7 @@ index 35240470ee13099dcd857831cf2e863e53af52a7..99d31feec32881c1c5729230ac81a986
return;
}
-@@ -1353,8 +1354,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -1350,8 +1351,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@Override
public void handleMovePlayer(ServerboundMovePlayerPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
diff --git a/patches/server/0275-Add-item-packet-serialize-event.patch b/patches/server/0275-Add-item-packet-serialize-event.patch
index 63aadd36b..58e0a6159 100644
--- a/patches/server/0275-Add-item-packet-serialize-event.patch
+++ b/patches/server/0275-Add-item-packet-serialize-event.patch
@@ -36,22 +36,22 @@ index b863249ff7e13cf4939c8961601f0564c62fd661..bdcfd80f937c34956911373905d66424
this.writeId(BuiltInRegistries.ITEM, item);
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 9424785e55c8f31bd6c6029e2d3a6f9fa5e571df..6f94f01da0a2294f6fdc564653dde1fdbf508153 100644
+index c6403274658ccaa2ed27e586cc35d13c760f2040..16b5f59dd3658bb9fc5be629aa4e1bc0ce356243 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1719,6 +1719,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Purpur
- Iterator iterator = this.getAllLevels().iterator(); // Paper - move down
+ Iterator iterator = this.getAllLevels().iterator(); // Paper - Throw exception on world create while being ticked; move down
while (iterator.hasNext()) {
ServerLevel worldserver = (ServerLevel) iterator.next();
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 99d31feec32881c1c5729230ac81a986c2b2baeb..099bc9d4c1bbf677e633377a0b69e234a0685385 100644
+index dc2c43794841af062b325a90fd5f68f581b99317..d7ff08767fe6b14f18386651666c42903a52ec1c 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -3382,6 +3382,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -3377,6 +3377,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
}
}
}
diff --git a/patches/server/0276-Add-an-option-to-fix-MC-3304-projectile-looting.patch b/patches/server/0276-Add-an-option-to-fix-MC-3304-projectile-looting.patch
index 6b8f51c09..7d1f05d58 100644
--- a/patches/server/0276-Add-an-option-to-fix-MC-3304-projectile-looting.patch
+++ b/patches/server/0276-Add-an-option-to-fix-MC-3304-projectile-looting.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add an option to fix MC-3304 (projectile looting)
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
-index 8127456194ef6bdd6212553d0d78618519e6a429..e352dc0fa07f0b5431c4d4b2cff95fa3485d31dd 100644
+index 00ec6661f07d9b8dc3744c4d2d128643f680c8d8..56c150d037964e82d9aa3fac2008dc1e14cced8c 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
@@ -74,6 +74,7 @@ public abstract class AbstractArrow extends Projectile {
@@ -48,7 +48,7 @@ index 220513d3fd5645322886522ea4f6b8c55d043b3c..d45a2f49c82d00801578c34e5f5277fc
org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, stack, itemstack1, entityarrow, entityhuman.getUsedItemHand(), f, !flag1);
if (event.isCancelled()) {
diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java
-index 0a0f19f73a6a4e5aece7c17089dc4d31ed2a5299..2c51a73ebfd05af21b0f5d731fc9f1df77fed1a1 100644
+index b112845e94d354bbadff67673ea0b4939672bd3e..62f291abef664d8bccd682db9de8d0ae6fe2b9bd 100644
--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java
+++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java
@@ -291,6 +291,14 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable {
@@ -67,7 +67,7 @@ index 0a0f19f73a6a4e5aece7c17089dc4d31ed2a5299..2c51a73ebfd05af21b0f5d731fc9f1df
}
diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java
-index 07695068fafd170ca88ad109d83dea93c387d794..ec5daeef857fdad6c7659130fb42f52cf6eb491f 100644
+index 3f922008f928ed077e9ddfd4384ed7bbf7cb293d..dcd6f241271beecf9601e34547225d7921958c20 100644
--- a/src/main/java/net/minecraft/world/item/TridentItem.java
+++ b/src/main/java/net/minecraft/world/item/TridentItem.java
@@ -82,6 +82,14 @@ public class TridentItem extends Item implements Vanishable {
@@ -83,7 +83,7 @@ index 07695068fafd170ca88ad109d83dea93c387d794..ec5daeef857fdad6c7659130fb42f52c
+ // Purpur end
+
// CraftBukkit start
- // Paper start
+ // Paper start - PlayerLaunchProjectileEvent
com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), (org.bukkit.entity.Projectile) entitythrowntrident.getBukkitEntity());
diff --git a/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java b/src/main/java/net/minecraft/world/level/storage/loot/functions/LootingEnchantFunction.java
index 3fb1e558c3510243c94981211f9a0e5e0ef1895b..e5177e5ffcac360f935f2139db4554c6586b551e 100644
diff --git a/patches/server/0284-Fire-Immunity-API.patch b/patches/server/0284-Fire-Immunity-API.patch
index 4b57f96e5..35678fba8 100644
--- a/patches/server/0284-Fire-Immunity-API.patch
+++ b/patches/server/0284-Fire-Immunity-API.patch
@@ -5,10 +5,10 @@ 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 8982bed656387e469e324097d627c892a36907d0..3e08ac7243b8c75ce203252c5bdaebdc540687a3 100644
+index 805991ef816ad5ae82ed26781ec265173a8f192c..66e99e9aceb1c44ecfdecea992bead1e1c42cbed 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -424,6 +424,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -423,6 +423,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
private UUID originWorld;
public boolean freezeLocked = false; // Paper - Freeze Tick Lock API
public boolean fixedPose = false; // Paper - Expand Pose API
@@ -16,7 +16,7 @@ index 8982bed656387e469e324097d627c892a36907d0..3e08ac7243b8c75ce203252c5bdaebdc
public void setOrigin(@javax.annotation.Nonnull Location location) {
this.origin = location.toVector();
-@@ -1818,7 +1819,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1817,7 +1818,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public boolean fireImmune() {
@@ -25,7 +25,7 @@ index 8982bed656387e469e324097d627c892a36907d0..3e08ac7243b8c75ce203252c5bdaebdc
}
public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
-@@ -2510,6 +2511,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -2509,6 +2510,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
nbttagcompound.putBoolean("Paper.FreezeLock", true);
}
// Paper end
@@ -37,7 +37,7 @@ index 8982bed656387e469e324097d627c892a36907d0..3e08ac7243b8c75ce203252c5bdaebdc
return nbttagcompound;
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT");
-@@ -2657,6 +2663,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -2656,6 +2662,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
freezeLocked = nbt.getBoolean("Paper.FreezeLock");
}
// Paper end
@@ -50,7 +50,7 @@ index 8982bed656387e469e324097d627c892a36907d0..3e08ac7243b8c75ce203252c5bdaebdc
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT");
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index ea5ac1f53309fdd30aad40fd4a092f297d76fd61..315c9be5841d55910500fcc225b5e42f271cf2cb 100644
+index 2ef6dc2390ed622eda284e3b4c85ec64e057c981..6a24595db93c834955df3a5566705b1c5066acc6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -83,6 +83,16 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
@@ -71,7 +71,7 @@ index ea5ac1f53309fdd30aad40fd4a092f297d76fd61..315c9be5841d55910500fcc225b5e42f
public boolean isInDaylight() {
return getHandle().isSunBurnTick();
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
-index 14d6ff11c8b8b047ada5d308515e9d214cf77b69..ba33fb0b049a670851004022da18fe744dca27eb 100644
+index e99007570a89eebe3c85ad549cf24286514306f8..480adbfdd084a6291ee0108e5350ea418e08ff6f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
@@ -173,9 +173,14 @@ public class CraftItem extends CraftEntity implements Item {
diff --git a/patches/server/0285-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch b/patches/server/0285-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch
index 6384f3c2d..169bd45e3 100644
--- a/patches/server/0285-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch
+++ b/patches/server/0285-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 3e08ac7243b8c75ce203252c5bdaebdc540687a3..94f1d86a5d2197f55a210084ba913f4403c7d1ab 100644
+index 66e99e9aceb1c44ecfdecea992bead1e1c42cbed..f10933fc78cbb0ead042c1870d93d0447f640896 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -927,6 +927,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -926,6 +926,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
diff --git a/patches/server/0288-End-Crystal-Cramming.patch b/patches/server/0288-End-Crystal-Cramming.patch
index f972b87aa..649be02ba 100644
--- a/patches/server/0288-End-Crystal-Cramming.patch
+++ b/patches/server/0288-End-Crystal-Cramming.patch
@@ -5,17 +5,17 @@ Subject: [PATCH] End Crystal Cramming
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
-index 564d17bc460e2a04947ff9676fbf4c8b1569659c..440add62fcfa62d483409e1aecfc91591ba476c3 100644
+index 85ae4790e9079c60a266a029c9c19bd0955300b2..c52b3d9dec7d04305cd4515e0af74d2f201702d4 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
@@ -99,6 +99,7 @@ public class EndCrystal extends Entity {
}
}
- // Paper end
+ // Paper end - Fix invulnerable end crystals
+ if (this.level().purpurConfig.endCrystalCramming > 0 && this.level().getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level().purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur
}
- // Purpur start
+ }
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
index 029e989caeb427997821216d14ef03b2099bcd58..cd0ce2e5e80ab2519247d8e6cfa2084455101034 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
diff --git a/patches/server/0289-Option-to-allow-beacon-effects-when-covered-by-tinte.patch b/patches/server/0289-Option-to-allow-beacon-effects-when-covered-by-tinte.patch
index 03fc4c199..a255686cc 100644
--- a/patches/server/0289-Option-to-allow-beacon-effects-when-covered-by-tinte.patch
+++ b/patches/server/0289-Option-to-allow-beacon-effects-when-covered-by-tinte.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Option to allow beacon effects when covered by tinted glass
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
-index a5f9747be5503dd24abd98f11cfa8229448ca3bf..99ef8d7e3ee0ee9777d12ad825e728c38d886114 100644
+index 39b15512dbff3739f0339278cf350006429fdbbd..4f4568c4ed1c3d6551467a18200f8eafb0a54351 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
@@ -174,6 +174,7 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name
@@ -32,7 +32,7 @@ index a5f9747be5503dd24abd98f11cfa8229448ca3bf..99ef8d7e3ee0ee9777d12ad825e728c3
- if (blockEntity.levels > 0 && !blockEntity.beamSections.isEmpty()) {
+ if (blockEntity.levels > 0 && (!blockEntity.beamSections.isEmpty() || (world.purpurConfig.beaconAllowEffectsWithTintedGlass && isTintedGlass))) {
- BeaconBlockEntity.applyEffects(world, pos, blockEntity.levels, blockEntity.primaryPower, blockEntity.secondaryPower, blockEntity); // Paper
+ BeaconBlockEntity.applyEffects(world, pos, blockEntity.levels, blockEntity.primaryPower, blockEntity.secondaryPower, blockEntity); // Paper - Custom beacon ranges
BeaconBlockEntity.playSound(world, pos, SoundEvents.BEACON_AMBIENT);
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
diff --git a/patches/server/0296-Make-GUI-Great-Again.patch b/patches/server/0296-Make-GUI-Great-Again.patch
index 42a745a79..bf4761b74 100644
--- a/patches/server/0296-Make-GUI-Great-Again.patch
+++ b/patches/server/0296-Make-GUI-Great-Again.patch
@@ -96,7 +96,7 @@ index 0000000000000000000000000000000000000000..15a226e3854d731f7724025ea3459c8a
+ }
+}
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-index d56fab50babe37865d0a40b7088b011c8ff6af88..d21260dd1b7305949f063123b427dec1f5a00ae5 100644
+index 21e7099755b72dbc3489eb9fcb97910b0605e2a2..043a48d8c90e2e008b06fb5a643378a0fa948aaa 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -99,6 +99,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -108,7 +108,7 @@ index d56fab50babe37865d0a40b7088b011c8ff6af88..d21260dd1b7305949f063123b427dec1
/*
jline.console.ConsoleReader bufferedreader = DedicatedServer.this.reader;
diff --git a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
-index dd9f611efc95f7d06fd3011fedd5d0317b1d0a85..64e12201e164f4dc8070711605dcfcb6e56421f6 100644
+index c42a9949c4d37d45883867a54222a7ab33944b39..7f07ffab0835d45d4d170fe171d7fa996d5913d9 100644
--- a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
+++ b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
@@ -43,6 +43,11 @@ public class MinecraftServerGui extends JComponent {
@@ -136,10 +136,10 @@ index dd9f611efc95f7d06fd3011fedd5d0317b1d0a85..64e12201e164f4dc8070711605dcfcb6
jframe.pack();
jframe.setLocationRelativeTo((Component) null);
jframe.setVisible(true);
-- jframe.setName("Minecraft server"); // Paper
-+ jframe.setName("Purpur Minecraft server"); // Paper // Purpur
+- jframe.setName("Minecraft server"); // Paper - Improve ServerGUI
++ jframe.setName("Purpur Minecraft server"); // Paper - Improve ServerGUI // Purpur
- // Paper start - Add logo as frame image
+ // Paper start - Improve ServerGUI
try {
@@ -71,7 +76,7 @@ public class MinecraftServerGui extends JComponent {
jframe.addWindowListener(new WindowAdapter() {
diff --git a/patches/server/0297-Stored-Bee-API.patch b/patches/server/0297-Stored-Bee-API.patch
index 4ff9f6b4e..fa37357ce 100644
--- a/patches/server/0297-Stored-Bee-API.patch
+++ b/patches/server/0297-Stored-Bee-API.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Stored Bee API
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java
-index 8a163b5d3c7759abe4fe84bfec788a15fddc1e44..f5bcfece7bba52234964da646370bc271043a631 100644
+index 1b47b0ff7b42373ca25d13fdfbaf2bfd92337632..f9b4ac5acaf809e1eb9d10d87dd0e17c63d1e3c5 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java
@@ -130,6 +130,22 @@ public class BeehiveBlockEntity extends BlockEntity {
@@ -54,7 +54,7 @@ index 8a163b5d3c7759abe4fe84bfec788a15fddc1e44..f5bcfece7bba52234964da646370bc27
- final CompoundTag entityData;
+ public final CompoundTag entityData; // Purpur - make public
int ticksInHive;
- int exitTickCounter; // Paper - separate counter for checking if bee should exit to reduce exit attempts
+ int exitTickCounter; // Paper - Fix bees aging inside hives; separate counter for checking if bee should exit to reduce exit attempts
final int minOccupationTicks;
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java
index 2e51fab98d95c93d2095f7be6dbb5d5474158bfb..32285c8e0f42897793759fba85a1e8658750c843 100644
diff --git a/patches/server/0304-Add-hover-lines-API.patch b/patches/server/0304-Add-hover-lines-API.patch
index 0bdf3ec07..453474d45 100644
--- a/patches/server/0304-Add-hover-lines-API.patch
+++ b/patches/server/0304-Add-hover-lines-API.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add hover lines API
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
-index 090ba0b85fe72419c419cc72b5584ec391c0cfa1..e46018774aa99453f6fbb5dbb19513469d808700 100644
+index 71aac5d4cf29cea9daa378fc8ac584750de4d1ca..0496871db7437322d3932ca3d3504d84af832d90 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
-@@ -597,4 +597,17 @@ public final class CraftItemFactory implements ItemFactory {
+@@ -596,4 +596,17 @@ public final class CraftItemFactory implements ItemFactory {
return CraftItemStack.asCraftMirror(enchanted);
}
// Paper end - enchantWithLevels API