aboutsummaryrefslogtreecommitdiffhomepage
path: root/paper-server/patches
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2024-12-21 13:45:04 +0100
committerNassim Jahnke <[email protected]>2024-12-21 13:45:04 +0100
commit3b0b3a0aef5863b37f252bfffef7ff5b9b266445 (patch)
treed6088aef454eff0d163847ebdcc5eb349fcac9bb /paper-server/patches
parent82216a59fef17863c86192c2754417480baa71c1 (diff)
downloadPaper-3b0b3a0aef5863b37f252bfffef7ff5b9b266445.tar.gz
Paper-3b0b3a0aef5863b37f252bfffef7ff5b9b266445.zip
and some more
Diffstat (limited to 'paper-server/patches')
-rw-r--r--paper-server/patches/features/0001-Optimize-Network-Manager-and-add-advanced-packet-sup.patch (renamed from paper-server/patches/features/0004-Optimize-Network-Manager-and-add-advanced-packet-sup.patch)12
-rw-r--r--paper-server/patches/features/0002-Allow-Saving-of-Oversized-Chunks.patch (renamed from paper-server/patches/features/0005-Allow-Saving-of-Oversized-Chunks.patch)0
-rw-r--r--paper-server/patches/features/0003-Entity-Activation-Range-2.0.patch (renamed from paper-server/patches/features/0006-Entity-Activation-Range-2.0.patch)28
-rw-r--r--paper-server/patches/features/0004-Anti-Xray.patch (renamed from paper-server/patches/features/0007-Anti-Xray.patch)10
-rw-r--r--paper-server/patches/features/0005-Use-Velocity-compression-and-cipher-natives.patch (renamed from paper-server/patches/features/0008-Use-Velocity-compression-and-cipher-natives.patch)10
-rw-r--r--paper-server/patches/features/0006-Optimize-Collision-to-not-load-chunks.patch (renamed from paper-server/patches/features/0009-Optimize-Collision-to-not-load-chunks.patch)2
-rw-r--r--paper-server/patches/features/0007-Optimize-GoalSelector-Goal.Flag-Set-operations.patch (renamed from paper-server/patches/features/0010-Optimize-GoalSelector-Goal.Flag-Set-operations.patch)0
-rw-r--r--paper-server/patches/features/0008-Optimize-Voxel-Shape-Merging.patch (renamed from paper-server/patches/features/0011-Optimize-Voxel-Shape-Merging.patch)0
-rw-r--r--paper-server/patches/features/0009-Fix-entity-type-tags-suggestions-in-selectors.patch (renamed from paper-server/patches/features/0012-Fix-entity-type-tags-suggestions-in-selectors.patch)2
-rw-r--r--paper-server/patches/features/0010-Handle-Oversized-block-entities-in-chunks.patch (renamed from paper-server/patches/features/0013-Handle-Oversized-block-entities-in-chunks.patch)0
-rw-r--r--paper-server/patches/features/0011-optimize-dirt-and-snow-spreading.patch (renamed from paper-server/patches/features/0015-optimize-dirt-and-snow-spreading.patch)0
-rw-r--r--paper-server/patches/features/0012-Optimise-getChunkAt-calls-for-loaded-chunks.patch (renamed from paper-server/patches/features/0016-Optimise-getChunkAt-calls-for-loaded-chunks.patch)2
-rw-r--r--paper-server/patches/features/0013-Optimize-Bit-Operations-by-inlining.patch (renamed from paper-server/patches/features/0017-Optimize-Bit-Operations-by-inlining.patch)0
-rw-r--r--paper-server/patches/features/0014-Remove-streams-from-hot-code.patch (renamed from paper-server/patches/features/0018-Remove-streams-from-hot-code.patch)0
-rw-r--r--paper-server/patches/features/0015-Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch (renamed from paper-server/patches/features/0019-Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch)0
-rw-r--r--paper-server/patches/features/0016-Rewrite-dataconverter-system.patch (renamed from paper-server/patches/features/0020-Rewrite-dataconverter-system.patch)12
-rw-r--r--paper-server/patches/features/0017-Moonrise-optimisation-patches.patch (renamed from paper-server/patches/features/0021-Moonrise-optimisation-patches.patch)87
-rw-r--r--paper-server/patches/features/0018-Fix-entity-tracker-desync-when-new-players-are-added.patch (renamed from paper-server/patches/features/0022-Fix-entity-tracker-desync-when-new-players-are-added.patch)2
-rw-r--r--paper-server/patches/features/0019-Eigencraft-redstone-implementation.patch (renamed from paper-server/patches/features/0024-Eigencraft-redstone-implementation.patch)0
-rw-r--r--paper-server/patches/features/0020-Add-Alternate-Current-redstone-implementation.patch (renamed from paper-server/patches/features/0025-Add-Alternate-Current-redstone-implementation.patch)6
-rw-r--r--paper-server/patches/features/0021-Improve-exact-choice-recipe-ingredients.patch (renamed from paper-server/patches/features/0026-Improve-exact-choice-recipe-ingredients.patch)0
-rw-r--r--paper-server/patches/features/0022-Only-write-chunk-data-to-disk-if-it-serializes-witho.patch (renamed from paper-server/patches/features/0027-Only-write-chunk-data-to-disk-if-it-serializes-witho.patch)0
-rw-r--r--paper-server/patches/features/0023-Entity-load-save-limit-per-chunk.patch (renamed from paper-server/patches/features/0030-Entity-load-save-limit-per-chunk.patch)0
-rw-r--r--paper-server/patches/features/0023-Lag-compensation-ticks.patch128
-rw-r--r--paper-server/patches/features/0024-Attempt-to-recalculate-regionfile-header-if-it-is-co.patch (renamed from paper-server/patches/features/0031-Attempt-to-recalculate-regionfile-header-if-it-is-co.patch)0
-rw-r--r--paper-server/patches/features/0025-Incremental-chunk-and-player-saving.patch (renamed from paper-server/patches/features/0032-Incremental-chunk-and-player-saving.patch)8
-rw-r--r--paper-server/patches/features/0026-Optimise-general-POI-access.patch (renamed from paper-server/patches/features/0033-Optimise-general-POI-access.patch)0
-rw-r--r--paper-server/patches/features/0027-Optional-per-player-mob-spawns.patch (renamed from paper-server/patches/features/0034-Optional-per-player-mob-spawns.patch)2
-rw-r--r--paper-server/patches/features/0028-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch (renamed from paper-server/patches/features/0035-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch)2
-rw-r--r--paper-server/patches/features/0028-Improved-Watchdog-Support.patch317
-rw-r--r--paper-server/patches/features/0029-Detail-more-information-in-watchdog-dumps.patch223
-rw-r--r--paper-server/patches/features/0029-Optimize-Hoppers.patch (renamed from paper-server/patches/features/0036-Optimize-Hoppers.patch)4
-rw-r--r--paper-server/patches/features/0030-Optimise-collision-checking-in-player-move-packet-ha.patch (renamed from paper-server/patches/features/0037-Optimise-collision-checking-in-player-move-packet-ha.patch)2
-rw-r--r--paper-server/patches/sources/net/minecraft/network/Connection.java.patch8
-rw-r--r--paper-server/patches/sources/net/minecraft/network/protocol/PacketUtils.java.patch40
-rw-r--r--paper-server/patches/sources/net/minecraft/server/Main.java.patch3
-rw-r--r--paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch76
-rw-r--r--paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch14
-rw-r--r--paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch54
-rw-r--r--paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch5
-rw-r--r--paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch2
-rw-r--r--paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch68
-rw-r--r--paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch54
43 files changed, 389 insertions, 794 deletions
diff --git a/paper-server/patches/features/0004-Optimize-Network-Manager-and-add-advanced-packet-sup.patch b/paper-server/patches/features/0001-Optimize-Network-Manager-and-add-advanced-packet-sup.patch
index df7d1df9fc..02589fdaae 100644
--- a/paper-server/patches/features/0004-Optimize-Network-Manager-and-add-advanced-packet-sup.patch
+++ b/paper-server/patches/features/0001-Optimize-Network-Manager-and-add-advanced-packet-sup.patch
@@ -28,7 +28,7 @@ and then catch exceptions and close if they fire.
Part of this commit was authored by: Spottedleaf, sandtechnology
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
-index 18f25bc6ada79fd51eb7522a917236299616a371..1672bd0eeea8db44016bbbccf9a332c7f45fdb54 100644
+index 42f44c7cb0bd55ddfacd18acb0e596e7a953870e..ad8f8428b75e37097487cdfbd0db2421ee4cbe37 100644
--- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java
@@ -85,7 +85,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
@@ -206,7 +206,7 @@ index 18f25bc6ada79fd51eb7522a917236299616a371..1672bd0eeea8db44016bbbccf9a332c7
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
-@@ -557,6 +647,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+@@ -563,6 +653,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
public void disconnect(DisconnectionDetails disconnectionDetails) {
this.preparing = false; // Spigot
@@ -214,7 +214,7 @@ index 18f25bc6ada79fd51eb7522a917236299616a371..1672bd0eeea8db44016bbbccf9a332c7
if (this.channel == null) {
this.delayedDisconnect = disconnectionDetails;
}
-@@ -745,7 +836,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+@@ -751,7 +842,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
public void handleDisconnection() {
if (this.channel != null && !this.channel.isOpen()) {
if (this.disconnectionHandled) {
@@ -223,7 +223,7 @@ index 18f25bc6ada79fd51eb7522a917236299616a371..1672bd0eeea8db44016bbbccf9a332c7
} else {
this.disconnectionHandled = true;
PacketListener packetListener = this.getPacketListener();
-@@ -756,7 +847,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+@@ -762,7 +853,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
);
packetListener1.onDisconnect(disconnectionDetails);
}
@@ -232,7 +232,7 @@ index 18f25bc6ada79fd51eb7522a917236299616a371..1672bd0eeea8db44016bbbccf9a332c7
// Paper start - Add PlayerConnectionCloseEvent
if (packetListener instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl commonPacketListener) {
/* Player was logged in, either game listener or configuration listener */
-@@ -791,4 +882,93 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+@@ -797,4 +888,93 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
public void setBandwidthLogger(LocalSampleLogger bandwithLogger) {
this.bandwidthDebugMonitor = new BandwidthDebugMonitor(bandwithLogger);
}
@@ -364,7 +364,7 @@ index 65ff8b9112ec76eeac48c679044fc02ae7d4ffeb..e4789584cbe43959681a8522c66eab58
+ // Paper end
}
diff --git a/net/minecraft/server/network/ServerConnectionListener.java b/net/minecraft/server/network/ServerConnectionListener.java
-index 18fa53903cd6500ae65d993a6fe7f49d6b069339..b68adf37af7172671163d4a8074d2bfa97724b4b 100644
+index b873af7183d9b1aabc87e63d254a4326f17b21c9..7de11ba404f0b60e7f7b7c16954811a343688219 100644
--- a/net/minecraft/server/network/ServerConnectionListener.java
+++ b/net/minecraft/server/network/ServerConnectionListener.java
@@ -66,11 +66,13 @@ public class ServerConnectionListener {
diff --git a/paper-server/patches/features/0005-Allow-Saving-of-Oversized-Chunks.patch b/paper-server/patches/features/0002-Allow-Saving-of-Oversized-Chunks.patch
index 950f460736..950f460736 100644
--- a/paper-server/patches/features/0005-Allow-Saving-of-Oversized-Chunks.patch
+++ b/paper-server/patches/features/0002-Allow-Saving-of-Oversized-Chunks.patch
diff --git a/paper-server/patches/features/0006-Entity-Activation-Range-2.0.patch b/paper-server/patches/features/0003-Entity-Activation-Range-2.0.patch
index e4ddc69055..adff760447 100644
--- a/paper-server/patches/features/0006-Entity-Activation-Range-2.0.patch
+++ b/paper-server/patches/features/0003-Entity-Activation-Range-2.0.patch
@@ -338,7 +338,7 @@ index 0000000000000000000000000000000000000000..bd888ef719b9bfc93bace0b1d0fb771a
+ }
+}
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
-index 8569f0670c13e3f635ef529f00e636bf7bca38b5..76e59a8b07ac58a38f368386e03aaa3d8586e21d 100644
+index d95413af04121fe91ca0f3b0c70025b9808acef9..ad665c7535c615d2b03a3e7864be435f933235dd 100644
--- a/net/minecraft/server/level/ChunkMap.java
+++ b/net/minecraft/server/level/ChunkMap.java
@@ -4,7 +4,6 @@ import com.google.common.collect.ImmutableList;
@@ -366,7 +366,7 @@ index 8569f0670c13e3f635ef529f00e636bf7bca38b5..76e59a8b07ac58a38f368386e03aaa3d
import org.slf4j.Logger;
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 2e479c02794de1eb9753b6f1e59afc2d9d6981ba..7702004b68b7735043914f93b54b4413cd21ba41 100644
+index 3164f3784131babf9a6663335517a12df7e88a7b..da8848e2a3e3745949eb2356a049451d30f763a7 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -551,6 +551,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -377,7 +377,7 @@ index 2e479c02794de1eb9753b6f1e59afc2d9d6981ba..7702004b68b7735043914f93b54b4413
this.entityTickList
.forEach(
entity -> {
-@@ -960,16 +961,19 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -979,12 +980,15 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
entity.tickCount++;
profilerFiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType()).toString());
profilerFiller.incrementCounter("tickNonPassenger");
@@ -392,6 +392,10 @@ index 2e479c02794de1eb9753b6f1e59afc2d9d6981ba..7702004b68b7735043914f93b54b4413
- this.tickPassenger(entity, entity1);
+ this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2
}
+ // Paper start - log detailed entity tick information
+ } finally {
+@@ -995,7 +999,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+ // Paper end - log detailed entity tick information
}
- private void tickPassenger(Entity ridingEntity, Entity passengerEntity) {
@@ -399,7 +403,7 @@ index 2e479c02794de1eb9753b6f1e59afc2d9d6981ba..7702004b68b7735043914f93b54b4413
if (passengerEntity.isRemoved() || passengerEntity.getVehicle() != ridingEntity) {
passengerEntity.stopRiding();
} else if (passengerEntity instanceof Player || this.entityTickList.contains(passengerEntity)) {
-@@ -978,12 +982,21 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1004,12 +1008,21 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
ProfilerFiller profilerFiller = Profiler.get();
profilerFiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(passengerEntity.getType()).toString());
profilerFiller.incrementCounter("tickPassenger");
@@ -451,7 +455,7 @@ index a9f01e616ef6b0d74caf57cd68eb371a4fd30fd5..179f4e4b9b1eb57f78bbb2f9fa34b11e
public void aiStep() {
super.aiStep();
diff --git a/net/minecraft/world/entity/AreaEffectCloud.java b/net/minecraft/world/entity/AreaEffectCloud.java
-index b4a1202a9f43525caf215d2f5c86ad92ea4f6de7..47db6ac3ef23fd0da127cfb5a4d3ba9ebd2ab54d 100644
+index 24735284fda151414d99faad401d25ba60995f9a..23b342cc31c7e72ade0e1ccad86a9ccf34380f13 100644
--- a/net/minecraft/world/entity/AreaEffectCloud.java
+++ b/net/minecraft/world/entity/AreaEffectCloud.java
@@ -128,6 +128,16 @@ public class AreaEffectCloud extends Entity implements TraceableEntity {
@@ -472,7 +476,7 @@ index b4a1202a9f43525caf215d2f5c86ad92ea4f6de7..47db6ac3ef23fd0da127cfb5a4d3ba9e
public void tick() {
super.tick();
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
-index 61b779fc48d88a2ba0cb7c289e7c031877bac61b..32ca912230a5999ea244cdf1c5c54855844f571b 100644
+index e7889c9c7b155db46730f5e168bb7fd3d1732a8c..334859c5ff7023c730513301cc11c9837b2c7823 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -380,6 +380,15 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@@ -505,7 +509,7 @@ index 61b779fc48d88a2ba0cb7c289e7c031877bac61b..32ca912230a5999ea244cdf1c5c54855
SynchedEntityData.Builder builder = new SynchedEntityData.Builder(this);
builder.define(DATA_SHARED_FLAGS_ID, (byte)0);
builder.define(DATA_AIR_SUPPLY_ID, this.getMaxAirSupply());
-@@ -946,6 +962,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -981,6 +997,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
} else {
this.wasOnFire = this.isOnFire();
if (type == MoverType.PISTON) {
@@ -514,7 +518,7 @@ index 61b779fc48d88a2ba0cb7c289e7c031877bac61b..32ca912230a5999ea244cdf1c5c54855
movement = this.limitPistonMovement(movement);
if (movement.equals(Vec3.ZERO)) {
return;
-@@ -959,6 +977,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -994,6 +1012,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
this.stuckSpeedMultiplier = Vec3.ZERO;
this.setDeltaMovement(Vec3.ZERO);
}
@@ -529,10 +533,10 @@ index 61b779fc48d88a2ba0cb7c289e7c031877bac61b..32ca912230a5999ea244cdf1c5c54855
movement = this.maybeBackOffFromEdge(movement, type);
Vec3 vec3 = this.collide(movement);
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
-index e76889ab9766294e64afa2b89006d2efd218027c..9bf5addb07f40cc50e80a46c0ee7944e938620fb 100644
+index a71a153a91de5a564b946091d8d3ccbb330e4b89..195e1151f7b2a32d6c4eb67edd1952e38f58b266 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
-@@ -3086,6 +3086,14 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3094,6 +3094,14 @@ public abstract class LivingEntity extends Entity implements Attackable {
return false;
}
@@ -647,7 +651,7 @@ index 789fea258d70e60d38271ebb31270562dc7eb3ab..d0ab3db7bbd2942db19f473474371b20
}
}
diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java
-index a9c7cf74174a2c998c182da149bdfeb87cca7b8d..e346edacf7705faf867430c9c44b8322a2bd9d72 100644
+index 8b034b6bda937b25dbb3d09b8293fed6d7dc512c..52a7ed0d991758bad0dcedcb7f97fb15ac6c6d04 100644
--- a/net/minecraft/world/entity/item/ItemEntity.java
+++ b/net/minecraft/world/entity/item/ItemEntity.java
@@ -124,6 +124,29 @@ public class ItemEntity extends Entity implements TraceableEntity {
@@ -824,7 +828,7 @@ index c553cf0592dfa606dbbb1e6854d3377b9feb5efb..8341e7f01606fca90e69384c16fc19bb
+
}
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
-index b6342c7161c2539b316be53e72640d44ce576b79..13dbd0da80b2199519370ac6e993ace53f42c1ea 100644
+index 32f184288f6065259c921293922c1b0163df4dc4..0f346faa82b988e86834c38837f6f11bea7f31c6 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -153,6 +153,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
diff --git a/paper-server/patches/features/0007-Anti-Xray.patch b/paper-server/patches/features/0004-Anti-Xray.patch
index 46c23e31dd..1991ec6d25 100644
--- a/paper-server/patches/features/0007-Anti-Xray.patch
+++ b/paper-server/patches/features/0004-Anti-Xray.patch
@@ -153,7 +153,7 @@ index 3a384175f8e7f204234bbaf3081bdc20c47a0d4b..5699bc15eba92e22433a20cb8326b59f
private ClientboundLevelChunkWithLightPacket(RegistryFriendlyByteBuf buffer) {
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index a43b8febcf616aa1662ea126ce60f7973799ea46..cdda7f6272cfc48638df4e0e51b496e91ed77ba5 100644
+index da8848e2a3e3745949eb2356a049451d30f763a7..192977dd661ee795ada13db895db770293e9b402 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -348,7 +348,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -166,10 +166,10 @@ index a43b8febcf616aa1662ea126ce60f7973799ea46..cdda7f6272cfc48638df4e0e51b496e9
this.levelStorageAccess = levelStorageAccess;
this.uuid = org.bukkit.craftbukkit.util.WorldUUID.getUUID(levelStorageAccess.levelDirectory.path().toFile());
diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java
-index 1178af2ba50ad71556e0a5cbde3e5dc290396148..bf2a4c03afb73367a6d2530c78ff9f7c06f7f6a6 100644
+index 47ed3ad5c0b4753f58e0bafff5e5e70b2f0bb40b..623c069f1fe079e020c6391a3db1a3d95cd3dbf5 100644
--- a/net/minecraft/server/level/ServerPlayerGameMode.java
+++ b/net/minecraft/server/level/ServerPlayerGameMode.java
-@@ -298,6 +298,7 @@ public class ServerPlayerGameMode {
+@@ -299,6 +299,7 @@ public class ServerPlayerGameMode {
org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDamageAbortEvent(this.player, pos, this.player.getInventory().getSelected()); // CraftBukkit
}
}
@@ -196,7 +196,7 @@ index 342bc843c384761e883de861044f4f8930ae8763..14878690a88fd4de3e2c127086607e6c
if (io.papermc.paper.event.packet.PlayerChunkLoadEvent.getHandlerList().getRegisteredListeners().length > 0) {
new io.papermc.paper.event.packet.PlayerChunkLoadEvent(new org.bukkit.craftbukkit.CraftChunk(chunk), packetListener.getPlayer().getBukkitEntity()).callEvent();
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 0837c732e60d82c36793a5a030f56d9004a5a83f..b0df94fb5f933491af8b024cc8ecf8b98e448f16 100644
+index 38fb0f569ffcd96e0eb6cb6f0769155a17d62874..3d5d84c1c1d431e9b369aa727ab0876f90ff5d61 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -403,7 +403,7 @@ public abstract class PlayerList {
@@ -209,7 +209,7 @@ index 0837c732e60d82c36793a5a030f56d9004a5a83f..b0df94fb5f933491af8b024cc8ecf8b9
}
// Paper end - Send empty chunk
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
-index 13dbd0da80b2199519370ac6e993ace53f42c1ea..0e4ab448755632696c4326f1df9f3855cd38a64d 100644
+index 0f346faa82b988e86834c38837f6f11bea7f31c6..771d6ed6a7c889c09efd4ff6e20298c851eaa79f 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -168,6 +168,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
diff --git a/paper-server/patches/features/0008-Use-Velocity-compression-and-cipher-natives.patch b/paper-server/patches/features/0005-Use-Velocity-compression-and-cipher-natives.patch
index cf7d0a06be..9011d342f0 100644
--- a/paper-server/patches/features/0008-Use-Velocity-compression-and-cipher-natives.patch
+++ b/paper-server/patches/features/0005-Use-Velocity-compression-and-cipher-natives.patch
@@ -269,10 +269,10 @@ index bc674b08a41d5529fe06c6d3f077051cf4138f73..ea8a894158c44c2e7943dea43ecd8e1f
+ // Paper end - Use Velocity cipher
}
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
-index 1672bd0eeea8db44016bbbccf9a332c7f45fdb54..bfdc637a750602c00919422ca0e3943ba34db832 100644
+index ad8f8428b75e37097487cdfbd0db2421ee4cbe37..208efae06c7c44f220d4192219a86ec55c98a2fe 100644
--- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java
-@@ -766,11 +766,22 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+@@ -772,11 +772,22 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
return connection;
}
@@ -299,7 +299,7 @@ index 1672bd0eeea8db44016bbbccf9a332c7f45fdb54..bfdc637a750602c00919422ca0e3943b
public boolean isEncrypted() {
return this.encrypted;
-@@ -809,16 +820,17 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+@@ -815,16 +826,17 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
// Paper end - add proper async disconnect
public void setupCompression(int threshold, boolean validateDecompressed) {
if (threshold >= 0) {
@@ -321,7 +321,7 @@ index 1672bd0eeea8db44016bbbccf9a332c7f45fdb54..bfdc637a750602c00919422ca0e3943b
this.channel.pipeline().fireUserEventTriggered(io.papermc.paper.network.ConnectionEvent.COMPRESSION_THRESHOLD_SET); // Paper - Add Channel initialization listeners
} else {
diff --git a/net/minecraft/server/network/ServerConnectionListener.java b/net/minecraft/server/network/ServerConnectionListener.java
-index b68adf37af7172671163d4a8074d2bfa97724b4b..9d9f1b93a68bbc3e201408a3669bba7f73006218 100644
+index 7de11ba404f0b60e7f7b7c16954811a343688219..bd07e6a5aa1883786d789ea71711a0c0c0a95c26 100644
--- a/net/minecraft/server/network/ServerConnectionListener.java
+++ b/net/minecraft/server/network/ServerConnectionListener.java
@@ -108,6 +108,10 @@ public class ServerConnectionListener {
@@ -336,7 +336,7 @@ index b68adf37af7172671163d4a8074d2bfa97724b4b..9d9f1b93a68bbc3e201408a3669bba7f
this.channels
.add(
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index d5d1cdc0759338ce1554b19689fca90d2573189e..507c6b2628cab56e00b64fe1b21f873e717eda2d 100644
+index bb28453d230921d662ed69c8dd48021f428ef060..6689aeacf50d1498e8d23cce696fb4fecbd1cf39 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
@@ -276,11 +276,9 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
diff --git a/paper-server/patches/features/0009-Optimize-Collision-to-not-load-chunks.patch b/paper-server/patches/features/0006-Optimize-Collision-to-not-load-chunks.patch
index 940badfeb9..ca6297da96 100644
--- a/paper-server/patches/features/0009-Optimize-Collision-to-not-load-chunks.patch
+++ b/paper-server/patches/features/0006-Optimize-Collision-to-not-load-chunks.patch
@@ -14,7 +14,7 @@ movement will load only the chunk the player enters anyways and avoids loading
massive amounts of surrounding chunks due to large AABB lookups.
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
-index 2e5f1dc15ea6a20f8cbdef97ecbf00e5d56603cf..5a67aa9f1fe103e5622ed6fa93bc4bc25ddbb688 100644
+index 334859c5ff7023c730513301cc11c9837b2c7823..45f69a914d5a0565196c4105d61541047301470f 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -218,6 +218,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
diff --git a/paper-server/patches/features/0010-Optimize-GoalSelector-Goal.Flag-Set-operations.patch b/paper-server/patches/features/0007-Optimize-GoalSelector-Goal.Flag-Set-operations.patch
index 8d68059b74..8d68059b74 100644
--- a/paper-server/patches/features/0010-Optimize-GoalSelector-Goal.Flag-Set-operations.patch
+++ b/paper-server/patches/features/0007-Optimize-GoalSelector-Goal.Flag-Set-operations.patch
diff --git a/paper-server/patches/features/0011-Optimize-Voxel-Shape-Merging.patch b/paper-server/patches/features/0008-Optimize-Voxel-Shape-Merging.patch
index b9255fa095..b9255fa095 100644
--- a/paper-server/patches/features/0011-Optimize-Voxel-Shape-Merging.patch
+++ b/paper-server/patches/features/0008-Optimize-Voxel-Shape-Merging.patch
diff --git a/paper-server/patches/features/0012-Fix-entity-type-tags-suggestions-in-selectors.patch b/paper-server/patches/features/0009-Fix-entity-type-tags-suggestions-in-selectors.patch
index 5e8077c3dd..cd578f9f57 100644
--- a/paper-server/patches/features/0012-Fix-entity-type-tags-suggestions-in-selectors.patch
+++ b/paper-server/patches/features/0009-Fix-entity-type-tags-suggestions-in-selectors.patch
@@ -60,7 +60,7 @@ index fa8c5ba4e0efd0c36613aaa8eaafba0cb70ceb87..19ccf3abf14c67f72a1ca065e4a304f5
}
diff --git a/net/minecraft/commands/arguments/EntityArgument.java b/net/minecraft/commands/arguments/EntityArgument.java
-index ba9a7636e158222bcfb50ae8487f29df6fdbdd0c..8957b99116cb087198fe372d4d2c2b3397fed19f 100644
+index 0a01df6ebd14afe79bc76364cb1df5e0c5c08074..7a06ad9940d25e163178370bfa9ccc3bbd3d1189 100644
--- a/net/minecraft/commands/arguments/EntityArgument.java
+++ b/net/minecraft/commands/arguments/EntityArgument.java
@@ -138,7 +138,7 @@ public class EntityArgument implements ArgumentType<EntitySelector> {
diff --git a/paper-server/patches/features/0013-Handle-Oversized-block-entities-in-chunks.patch b/paper-server/patches/features/0010-Handle-Oversized-block-entities-in-chunks.patch
index 3ae9000bc3..3ae9000bc3 100644
--- a/paper-server/patches/features/0013-Handle-Oversized-block-entities-in-chunks.patch
+++ b/paper-server/patches/features/0010-Handle-Oversized-block-entities-in-chunks.patch
diff --git a/paper-server/patches/features/0015-optimize-dirt-and-snow-spreading.patch b/paper-server/patches/features/0011-optimize-dirt-and-snow-spreading.patch
index 2423e0adc9..2423e0adc9 100644
--- a/paper-server/patches/features/0015-optimize-dirt-and-snow-spreading.patch
+++ b/paper-server/patches/features/0011-optimize-dirt-and-snow-spreading.patch
diff --git a/paper-server/patches/features/0016-Optimise-getChunkAt-calls-for-loaded-chunks.patch b/paper-server/patches/features/0012-Optimise-getChunkAt-calls-for-loaded-chunks.patch
index 5d23cbf347..6b1a406c1e 100644
--- a/paper-server/patches/features/0016-Optimise-getChunkAt-calls-for-loaded-chunks.patch
+++ b/paper-server/patches/features/0012-Optimise-getChunkAt-calls-for-loaded-chunks.patch
@@ -7,7 +7,7 @@ bypass the need to get a player chunk, then get the either,
then unwrap it...
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
-index d310e7489fc4ecede8deef59241444769d87b0a1..796b5f8541b0cf84482ab2b5a60adde544d43593 100644
+index c3553385074108d686425a7637b8975076d906b9..2f49dbc919f7f5eea9abce6106723c72f5ae45fb 100644
--- a/net/minecraft/server/level/ServerChunkCache.java
+++ b/net/minecraft/server/level/ServerChunkCache.java
@@ -218,6 +218,12 @@ public class ServerChunkCache extends ChunkSource {
diff --git a/paper-server/patches/features/0017-Optimize-Bit-Operations-by-inlining.patch b/paper-server/patches/features/0013-Optimize-Bit-Operations-by-inlining.patch
index 688e72d605..688e72d605 100644
--- a/paper-server/patches/features/0017-Optimize-Bit-Operations-by-inlining.patch
+++ b/paper-server/patches/features/0013-Optimize-Bit-Operations-by-inlining.patch
diff --git a/paper-server/patches/features/0018-Remove-streams-from-hot-code.patch b/paper-server/patches/features/0014-Remove-streams-from-hot-code.patch
index afbe9f1e4c..afbe9f1e4c 100644
--- a/paper-server/patches/features/0018-Remove-streams-from-hot-code.patch
+++ b/paper-server/patches/features/0014-Remove-streams-from-hot-code.patch
diff --git a/paper-server/patches/features/0019-Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch b/paper-server/patches/features/0015-Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch
index 84bcbe2f2e..84bcbe2f2e 100644
--- a/paper-server/patches/features/0019-Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch
+++ b/paper-server/patches/features/0015-Optimize-Pathfinder-Remove-Streams-Optimized-collect.patch
diff --git a/paper-server/patches/features/0020-Rewrite-dataconverter-system.patch b/paper-server/patches/features/0016-Rewrite-dataconverter-system.patch
index 6168b4106d..1f0f67af84 100644
--- a/paper-server/patches/features/0020-Rewrite-dataconverter-system.patch
+++ b/paper-server/patches/features/0016-Rewrite-dataconverter-system.patch
@@ -30560,7 +30560,7 @@ index 0000000000000000000000000000000000000000..5a6536377c9c1e1753e930ff2a6bb98e
+ }
+}
diff --git a/ca/spottedleaf/moonrise/paper/PaperHooks.java b/ca/spottedleaf/moonrise/paper/PaperHooks.java
-index 0e21efc60e7dd7d348fd024d713772069951ccd4..504a5f8626b42817f04088e2539a6941cd9c6d9d 100644
+index 729eb5d052465e4093e9d8c5d4fe8463b2efaca6..5577287398db2bb9d21f14409ef580b8ab9ea018 100644
--- a/ca/spottedleaf/moonrise/paper/PaperHooks.java
+++ b/ca/spottedleaf/moonrise/paper/PaperHooks.java
@@ -204,6 +204,43 @@ public final class PaperHooks extends BaseChunkSystemHooks implements PlatformHo
@@ -30621,11 +30621,11 @@ index 1110ca4075a1bbaa46b66686435dab91b275c945..c2218630c3074c8b3f82364e37503b12
return structureTemplate.save(new CompoundTag());
}
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index 7b233bd4c5c373fe38585e0f8d3e6367dd357741..fd6fdb6d7e15633bd01d4f930ee3b15c0dd2ca06 100644
+index 0d65bf24f515b80701150fdc430f324a533cb478..b92a3da5c325e69f5601416d4205fb33429742b3 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
-@@ -303,6 +303,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- private final Set<String> pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping
+@@ -305,6 +305,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
+ ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system
@@ -30728,7 +30728,7 @@ index 408ba448c2f127e27e30bfcc6f35f0bdcf86d298..80533af16a59e9ad7e38d1c37b213529
}
diff --git a/net/minecraft/world/level/storage/LevelStorageSource.java b/net/minecraft/world/level/storage/LevelStorageSource.java
-index ed6ea17e9cf3498591f2acd232a48107564b774b..117e8a155937ed5312d544b6de748206c255c84f 100644
+index feb4cd21e26598509dc140028496a6f4254c0680..de43e54698125ce9f319d4889dd49f7029fe95e0 100644
--- a/net/minecraft/world/level/storage/LevelStorageSource.java
+++ b/net/minecraft/world/level/storage/LevelStorageSource.java
@@ -227,7 +227,7 @@ public class LevelStorageSource {
@@ -30741,7 +30741,7 @@ index ed6ea17e9cf3498591f2acd232a48107564b774b..117e8a155937ed5312d544b6de748206
}
diff --git a/net/minecraft/world/level/storage/PlayerDataStorage.java b/net/minecraft/world/level/storage/PlayerDataStorage.java
-index 6ac8f16500e44069b84d862d5f0e5c5cbc07387e..5682f6d601cbf8a7eb0d76eafd52095435252579 100644
+index 6c9640f5432e9110e7811b6db246d268c6243feb..45f2800c4862a726490048576fca8e1f24252676 100644
--- a/net/minecraft/world/level/storage/PlayerDataStorage.java
+++ b/net/minecraft/world/level/storage/PlayerDataStorage.java
@@ -115,7 +115,7 @@ public class PlayerDataStorage {
diff --git a/paper-server/patches/features/0021-Moonrise-optimisation-patches.patch b/paper-server/patches/features/0017-Moonrise-optimisation-patches.patch
index 4e71dab65e..08d7f1080b 100644
--- a/paper-server/patches/features/0021-Moonrise-optimisation-patches.patch
+++ b/paper-server/patches/features/0017-Moonrise-optimisation-patches.patch
@@ -297,7 +297,7 @@ index 0000000000000000000000000000000000000000..1b8193587814225c2ef2c5d9e667436e
+ }
+}
diff --git a/ca/spottedleaf/moonrise/paper/PaperHooks.java b/ca/spottedleaf/moonrise/paper/PaperHooks.java
-index c2dfbce23af5741b7f78ddd6df9bcbce69915ae9..5955a56a63e91edafbac07ac1f0c640a4f7cbb26 100644
+index 5577287398db2bb9d21f14409ef580b8ab9ea018..4d344559a20a0c35c181e297e81788c747363ec9 100644
--- a/ca/spottedleaf/moonrise/paper/PaperHooks.java
+++ b/ca/spottedleaf/moonrise/paper/PaperHooks.java
@@ -268,7 +268,7 @@ public final class PaperHooks extends BaseChunkSystemHooks implements PlatformHo
@@ -310,7 +310,7 @@ index c2dfbce23af5741b7f78ddd6df9bcbce69915ae9..5955a56a63e91edafbac07ac1f0c640a
@Override
diff --git a/ca/spottedleaf/moonrise/paper/util/BaseChunkSystemHooks.java b/ca/spottedleaf/moonrise/paper/util/BaseChunkSystemHooks.java
-index 34b45bc11124efb22f0f3ae5b2ad8f445c719476..62a9e62711a46283931d22b0e72b2b1903d973a1 100644
+index 2a03573a6a6753f1c87dbde26ff5208c827aa13a..ece1261b67033e946dfc20a96872708755bffe0a 100644
--- a/ca/spottedleaf/moonrise/paper/util/BaseChunkSystemHooks.java
+++ b/ca/spottedleaf/moonrise/paper/util/BaseChunkSystemHooks.java
@@ -23,218 +23,59 @@ import java.util.function.Consumer;
@@ -677,6 +677,7 @@ index 34b45bc11124efb22f0f3ae5b2ad8f445c719476..62a9e62711a46283931d22b0e72b2b19
+ ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)world).moonrise$getPlayerChunkLoader().updatePlayer(player);
}
}
+\ No newline at end of file
diff --git a/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingBitStorage.java b/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingBitStorage.java
new file mode 100644
index 0000000000000000000000000000000000000000..93bc56daec4526f373c84763b8c7ccb4a30e800b
@@ -23539,10 +23540,10 @@ index 47b1fafd91b39e73c4e9134b0b8048000fba108a..76994c1491221c06cca5405ba239e6ff
}
}
diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java
-index 47c62090b421ebea1253ee3f1c896ed84119cea6..e738405e5112584e02e01df2d5ede2676fa1bffb 100644
+index 2b46ca9a2a046063cad422bec00d76107537b091..9aa664537cc37e44db46d5a2a64ae3116938c681 100644
--- a/net/minecraft/server/Main.java
+++ b/net/minecraft/server/Main.java
-@@ -320,6 +320,7 @@ public class Main {
+@@ -321,6 +321,7 @@ public class Main {
WorldData worldData = worldStem.worldData();
levelStorageAccess.saveDataTag(frozen, worldData);
*/
@@ -23551,7 +23552,7 @@ index 47c62090b421ebea1253ee3f1c896ed84119cea6..e738405e5112584e02e01df2d5ede267
thread1 -> {
DedicatedServer dedicatedServer1 = new DedicatedServer(
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae6d15ef2c 100644
+index b92a3da5c325e69f5601416d4205fb33429742b3..d967d605c2e4227ae980c30f1c8b86edbc680d6d 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -173,7 +173,7 @@ import net.minecraft.world.phys.Vec2;
@@ -23563,7 +23564,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
private static MinecraftServer SERVER; // Paper
public static final Logger LOGGER = LogUtils.getLogger();
public static final net.kyori.adventure.text.logger.slf4j.ComponentLogger COMPONENT_LOGGER = net.kyori.adventure.text.logger.slf4j.ComponentLogger.logger(LOGGER.getName()); // Paper
-@@ -318,6 +318,77 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -320,6 +320,77 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
return minecraftServer;
}
@@ -23641,7 +23642,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
public MinecraftServer(
// CraftBukkit start
joptsimple.OptionSet options,
-@@ -648,7 +719,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -651,7 +722,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
this.forceDifficulty();
for (ServerLevel serverLevel : this.getAllLevels()) {
this.prepareLevels(serverLevel.getChunkSource().chunkMap.progressListener, serverLevel);
@@ -23650,7 +23651,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(serverLevel.getWorld()));
}
-@@ -847,6 +918,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -850,6 +921,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
public abstract boolean shouldRconBroadcast();
public boolean saveAllChunks(boolean suppressLog, boolean flush, boolean forced) {
@@ -23662,7 +23663,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
boolean flag = false;
for (ServerLevel serverLevel : this.getAllLevels()) {
-@@ -854,7 +930,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -857,7 +933,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
LOGGER.info("Saving chunks for level '{}'/{}", serverLevel, serverLevel.dimension().location());
}
@@ -23671,7 +23672,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
flag = true;
}
-@@ -945,7 +1021,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -950,7 +1026,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
}
@@ -23680,7 +23681,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
this.nextTickTimeNanos = Util.getNanos() + TimeUtil.NANOSECONDS_PER_MILLISECOND;
for (ServerLevel serverLevelx : this.getAllLevels()) {
-@@ -956,17 +1032,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -961,17 +1037,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
this.waitUntilNextTick();
}
@@ -23699,7 +23700,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
this.isSaving = false;
this.resources.close();
-@@ -986,6 +1052,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -991,6 +1057,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
this.getProfileCache().save(false); // Paper - Perf: Async GameProfileCache saving
}
// Spigot end
@@ -23711,10 +23712,10 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
+ ca.spottedleaf.moonrise.common.util.MoonriseCommon.haltExecutors();
+ }
+ // Paper end - rewrite chunk system
- }
-
- public String getLocalIp() {
-@@ -1150,6 +1224,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ // Paper start - Improved watchdog support - move final shutdown items here
+ Util.shutdownExecutors();
+ try {
+@@ -1175,6 +1249,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
profilerFiller.push("tick");
this.tickFrame.start();
this.tickServer(flag ? () -> false : this::haveTime);
@@ -23728,7 +23729,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
this.tickFrame.end();
profilerFiller.popPush("nextTickWait");
this.mayHaveDelayedTasks = true;
-@@ -1322,6 +1403,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1345,6 +1426,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
private boolean pollTaskInternal() {
if (super.pollTask()) {
@@ -23736,7 +23737,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
return true;
} else {
boolean ret = false; // Paper - force execution of all worlds, do not just bias the first
-@@ -2442,6 +2524,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -2472,6 +2554,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
}
@@ -23750,7 +23751,7 @@ index 768d287be8040797130499b021b2cfd3970f44e5..9c5305b4542483efeeeab19a79eb8eae
// CraftBukkit start
public boolean isDebugging() {
diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
-index 72409db938babd2da64a20746911cb8d45452d7f..55d3f79af2e683b983d4d3f731bb9649dfe76f59 100644
+index f8c81d795b19e73d56d6e0196c75e441ab4c2bef..97a294d2f5c1ddf0af7ffec3e1425eb329c5751b 100644
--- a/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/net/minecraft/server/dedicated/DedicatedServer.java
@@ -433,7 +433,33 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -26734,7 +26735,7 @@ index 70f6d068b3f3665b282d9750310c883839120ab2..870b9efd445ddadb3725e88351555ad9
if (!passengers.equals(this.lastPassengers)) {
this.broadcastAndSend(new ClientboundSetPassengersPacket(this.entity)); // CraftBukkit
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82ef1934903 100644
+index 192977dd661ee795ada13db895db770293e9b402..95a4e37a3c93f9b3c56c7a7376ed521cd46fbb6f 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -170,7 +170,7 @@ import net.minecraft.world.phys.shapes.VoxelShape;
@@ -27303,8 +27304,8 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
+
}
- public void tickNonPassenger(Entity entity) {
-@@ -1007,6 +1290,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+ // Paper start - log detailed entity tick information
+@@ -1033,6 +1316,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
public void save(@Nullable ProgressListener progress, boolean flush, boolean skipSave) {
@@ -27316,7 +27317,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
ServerChunkCache chunkSource = this.getChunkSource();
if (!skipSave) {
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(this.getWorld())); // CraftBukkit
-@@ -1019,13 +1307,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1045,13 +1333,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
progress.progressStage(Component.translatable("menu.savingChunks"));
}
@@ -27340,7 +27341,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
// CraftBukkit start - moved from MinecraftServer.saveChunks
ServerLevel worldserver1 = this;
-@@ -1156,7 +1449,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1182,7 +1475,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
this.removePlayerImmediately((ServerPlayer)entity, Entity.RemovalReason.DISCARDED);
}
@@ -27349,7 +27350,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
}
// CraftBukkit start
-@@ -1187,7 +1480,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1213,7 +1506,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
// CraftBukkit end
@@ -27358,7 +27359,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
}
}
-@@ -1198,7 +1491,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1224,7 +1517,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public boolean tryAddFreshEntityWithPassengers(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
// CraftBukkit end
@@ -27367,7 +27368,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
return false;
} else {
this.addFreshEntityWithPassengers(entity, reason); // CraftBukkit
-@@ -1933,7 +2226,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1959,7 +2252,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
}
@@ -27376,7 +27377,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
bufferedWriter.write(String.format(Locale.ROOT, "block_entity_tickers: %d\n", this.blockEntityTickers.size()));
bufferedWriter.write(String.format(Locale.ROOT, "block_ticks: %d\n", this.getBlockTicks().count()));
bufferedWriter.write(String.format(Locale.ROOT, "fluid_ticks: %d\n", this.getFluidTicks().count()));
-@@ -1951,13 +2244,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -1977,13 +2270,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
Path path1 = path.resolve("chunks.csv");
try (Writer bufferedWriter2 = Files.newBufferedWriter(path1)) {
@@ -27392,7 +27393,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
}
Path path3 = path.resolve("entities.csv");
-@@ -2066,8 +2359,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2092,8 +2385,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
Locale.ROOT,
"players: %s, entities: %s [%s], block_entities: %d [%s], block_ticks: %d, fluid_ticks: %d, chunk_source: %s",
this.players.size(),
@@ -27403,7 +27404,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
this.blockEntityTickers.size(),
getTypeCount(this.blockEntityTickers, TickingBlockEntity::getType),
this.getBlockTicks().count(),
-@@ -2099,15 +2392,25 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2125,15 +2418,25 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@Override
public LevelEntityGetter<Entity> getEntities() {
org.spigotmc.AsyncCatcher.catchOp("Chunk getEntities call"); // Spigot
@@ -27432,7 +27433,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
}
public void startTickingChunk(LevelChunk chunk) {
-@@ -2125,32 +2428,45 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2151,32 +2454,45 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@Override
public void close() throws IOException {
super.close();
@@ -27485,7 +27486,7 @@ index cdda7f6272cfc48638df4e0e51b496e91ed77ba5..bbb4bb0940765a12c45a99c8234ca82e
}
@Override
-@@ -2204,7 +2520,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2230,7 +2546,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@Override
public CrashReportCategory fillReportDetails(CrashReport report) {
CrashReportCategory crashReportCategory = super.fillReportDetails(report);
@@ -27975,7 +27976,7 @@ index 4eb040006f5d41b47e5ac9df5d9f19c4315d6343..7fa41dea184b01891f45d8e404bc1cba
this.generatingStep = generatingStep;
this.cache = cache;
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index b0df94fb5f933491af8b024cc8ecf8b98e448f16..0a2f4af548561144607d24d3bd92270ce630fc95 100644
+index 3d5d84c1c1d431e9b369aa727ab0876f90ff5d61..6abe5fd39583663af0feb98607cff75c42d96729 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -1317,7 +1317,7 @@ public abstract class PlayerList {
@@ -28371,7 +28372,7 @@ index 8cc5c0716392ba06501542ff5cbe71ee43979e5d..09fd99c9cbd23b5f3c899bfb00c9b896
+ // Paper end - block counting
}
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
-index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0ebdfc56a 100644
+index 45f69a914d5a0565196c4105d61541047301470f..f42bdae2f80805e5069212bd16e3ab6814aef9ee 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -135,7 +135,7 @@ import net.minecraft.world.scores.ScoreHolder;
@@ -28622,7 +28623,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
public Entity(EntityType<?> entityType, Level level) {
this.type = entityType;
-@@ -1285,35 +1391,77 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -1327,35 +1433,77 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
return distance;
}
@@ -28724,7 +28725,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
}
private static float[] collectCandidateStepUpHeights(AABB box, List<VoxelShape> colliders, float deltaY, float maxUpStep) {
-@@ -2622,23 +2770,110 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -2664,23 +2812,110 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
}
public boolean isInWall() {
@@ -28848,7 +28849,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
}
public InteractionResult interact(Player player, InteractionHand hand) {
-@@ -4062,15 +4297,17 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -4104,15 +4339,17 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
}
public Iterable<Entity> getIndirectPassengers() {
@@ -28874,7 +28875,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
}
public int countPlayerPassengers() {
-@@ -4208,77 +4445,136 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -4250,77 +4487,136 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
return Mth.lerp(partialTick, this.yRotO, this.yRot);
}
@@ -29065,7 +29066,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
public boolean touchingUnloadedChunk() {
AABB aabb = this.getBoundingBox().inflate(1.0);
-@@ -4429,6 +4725,15 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -4473,6 +4769,15 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
this.setPosRaw(x, y, z, false);
}
public final void setPosRaw(double x, double y, double z, boolean forceBoundingBoxUpdate) {
@@ -29081,7 +29082,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
if (!checkPosition(this, x, y, z)) {
return;
}
-@@ -4557,6 +4862,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -4603,6 +4908,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@Override
public final void setRemoved(Entity.RemovalReason removalReason, org.bukkit.event.entity.EntityRemoveEvent.Cause cause) {
@@ -29094,7 +29095,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
org.bukkit.craftbukkit.event.CraftEventFactory.callEntityRemoveEvent(this, cause);
// CraftBukkit end
final boolean alreadyRemoved = this.removalReason != null; // Paper - Folia schedulers
-@@ -4568,7 +4879,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -4614,7 +4925,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
this.stopRiding();
}
@@ -29103,7 +29104,7 @@ index 2b53c5f8ff2ce1097e38ea7cb6f83fbb1d661831..c166a0ec56ff2d4885459d789ddcd5f0
this.levelCallback.onRemove(removalReason);
this.onRemoval(removalReason);
// Paper start - Folia schedulers
-@@ -4602,7 +4913,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+@@ -4648,7 +4959,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
public boolean shouldBeSaved() {
return (this.removalReason == null || this.removalReason.shouldSave())
&& !this.isPassenger()
@@ -29502,7 +29503,7 @@ index 300f3ed58109219d97846082941b860585f66fed..e81195df621159da67136f020fa7a6d3
// Paper start - Affects Spawning API
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
-index 0e4ab448755632696c4326f1df9f3855cd38a64d..aff78499b73a98f7405aead0886c51e8ac262884 100644
+index 771d6ed6a7c889c09efd4ff6e20298c851eaa79f..8331b49185500ab3b4307e9ae05126b4f83a318a 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -79,6 +79,7 @@ import net.minecraft.world.level.storage.LevelData;
diff --git a/paper-server/patches/features/0022-Fix-entity-tracker-desync-when-new-players-are-added.patch b/paper-server/patches/features/0018-Fix-entity-tracker-desync-when-new-players-are-added.patch
index ff28bdb87b..1059713e9f 100644
--- a/paper-server/patches/features/0022-Fix-entity-tracker-desync-when-new-players-are-added.patch
+++ b/paper-server/patches/features/0018-Fix-entity-tracker-desync-when-new-players-are-added.patch
@@ -48,7 +48,7 @@ index db31989ebe3d7021cfd2311439e9a00f819b0841..1373977b339405ef59bb3ea03d195285
serverEntity.getLastSentYRot(),
entity.getType(),
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
-index 9faf0ece0f074b8709b4e4fad0cab3e9c2224276..d22459cb1d46ea7c969aa05cb9d7d12466e173da 100644
+index 3dff97f13586be3b52bbe786852c185f6753a019..ff6503bf8eb88d1264c3d848a89d0255b4b3ae68 100644
--- a/net/minecraft/server/level/ChunkMap.java
+++ b/net/minecraft/server/level/ChunkMap.java
@@ -1208,6 +1208,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
diff --git a/paper-server/patches/features/0024-Eigencraft-redstone-implementation.patch b/paper-server/patches/features/0019-Eigencraft-redstone-implementation.patch
index 9b2677a63c..9b2677a63c 100644
--- a/paper-server/patches/features/0024-Eigencraft-redstone-implementation.patch
+++ b/paper-server/patches/features/0019-Eigencraft-redstone-implementation.patch
diff --git a/paper-server/patches/features/0025-Add-Alternate-Current-redstone-implementation.patch b/paper-server/patches/features/0020-Add-Alternate-Current-redstone-implementation.patch
index 07537f7485..98d1bff65a 100644
--- a/paper-server/patches/features/0025-Add-Alternate-Current-redstone-implementation.patch
+++ b/paper-server/patches/features/0020-Add-Alternate-Current-redstone-implementation.patch
@@ -2326,7 +2326,7 @@ index 0000000000000000000000000000000000000000..298076a0db4e6ee6e4775ac43bf749d9
+ }
+}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 651a65aaa37f2cf26d54f75529cbda71e6fc2bc4..61347004cb5b220e5596c053181a01ba5dd2b744 100644
+index 95a4e37a3c93f9b3c56c7a7376ed521cd46fbb6f..46dfaed12c998c219a20c711a06531aed2c68012 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -214,6 +214,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -2337,7 +2337,7 @@ index 651a65aaa37f2cf26d54f75529cbda71e6fc2bc4..61347004cb5b220e5596c053181a01ba
public LevelChunk getChunkIfLoaded(int x, int z) {
return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately
-@@ -2529,6 +2530,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
+@@ -2555,6 +2556,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
return this.chunkSource.getGenerator().getSeaLevel();
}
@@ -2352,7 +2352,7 @@ index 651a65aaa37f2cf26d54f75529cbda71e6fc2bc4..61347004cb5b220e5596c053181a01ba
@Override
public void onCreated(Entity entity) {
diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
-index 72646473019424de969756ae1d0e9f789310889b..d5d18ff7c4c75ab50b3af624b831cb077584f9d1 100644
+index 8331b49185500ab3b4307e9ae05126b4f83a318a..2bbebb4335d927f240abcac67a5b423e38dc33d7 100644
--- a/net/minecraft/world/level/Level.java
+++ b/net/minecraft/world/level/Level.java
@@ -2099,6 +2099,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
diff --git a/paper-server/patches/features/0026-Improve-exact-choice-recipe-ingredients.patch b/paper-server/patches/features/0021-Improve-exact-choice-recipe-ingredients.patch
index 19c90b0017..19c90b0017 100644
--- a/paper-server/patches/features/0026-Improve-exact-choice-recipe-ingredients.patch
+++ b/paper-server/patches/features/0021-Improve-exact-choice-recipe-ingredients.patch
diff --git a/paper-server/patches/features/0027-Only-write-chunk-data-to-disk-if-it-serializes-witho.patch b/paper-server/patches/features/0022-Only-write-chunk-data-to-disk-if-it-serializes-witho.patch
index 454bf1d95d..454bf1d95d 100644
--- a/paper-server/patches/features/0027-Only-write-chunk-data-to-disk-if-it-serializes-witho.patch
+++ b/paper-server/patches/features/0022-Only-write-chunk-data-to-disk-if-it-serializes-witho.patch
diff --git a/paper-server/patches/features/0030-Entity-load-save-limit-per-chunk.patch b/paper-server/patches/features/0023-Entity-load-save-limit-per-chunk.patch
index 7f3828e1a2..7f3828e1a2 100644
--- a/paper-server/patches/features/0030-Entity-load-save-limit-per-chunk.patch
+++ b/paper-server/patches/features/0023-Entity-load-save-limit-per-chunk.patch
diff --git a/paper-server/patches/features/0023-Lag-compensation-ticks.patch b/paper-server/patches/features/0023-Lag-compensation-ticks.patch
deleted file mode 100644
index 0e33a6864f..0000000000
--- a/paper-server/patches/features/0023-Lag-compensation-ticks.patch
+++ /dev/null
@@ -1,128 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Spottedleaf <[email protected]>
-Date: Sat, 23 Sep 2023 22:05:35 -0700
-Subject: [PATCH] Lag compensation ticks
-
-Areas affected by lag comepnsation:
- - Block breaking and destroying
- - Eating food items
-
-diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index 9c5305b4542483efeeeab19a79eb8eae6d15ef2c..ddd23354d68f5cbdc9f72c11246ab26a6c0bbe16 100644
---- a/net/minecraft/server/MinecraftServer.java
-+++ b/net/minecraft/server/MinecraftServer.java
-@@ -301,6 +301,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- public final io.papermc.paper.configuration.PaperConfigurations paperConfigurations; // Paper - add paper configuration files
- public boolean isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
- private final Set<String> pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping
-+ public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation
-
- public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
- ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system
-@@ -1663,6 +1664,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- for (ServerLevel serverLevel : this.getAllLevels()) {
- serverLevel.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent
- serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
-+ serverLevel.updateLagCompensationTick(); // Paper - lag compensation
- profilerFiller.push(() -> serverLevel + " " + serverLevel.dimension().location());
- /* Drop global time updates
- if (this.tickCount % 20 == 0) {
-diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index bbb4bb0940765a12c45a99c8234ca82ef1934903..7dbf6113d79ab826ba5bb9b648b557f625e2b438 100644
---- a/net/minecraft/server/level/ServerLevel.java
-+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -2678,4 +2678,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
- return this.server.getPlayerList().getPlayer(uuid);
- }
- // Paper end - check global player list where appropriate
-+
-+ // Paper start - lag compensation
-+ private long lagCompensationTick = MinecraftServer.SERVER_INIT;
-+
-+ public long getLagCompensationTick() {
-+ return this.lagCompensationTick;
-+ }
-+
-+ public void updateLagCompensationTick() {
-+ this.lagCompensationTick = (System.nanoTime() - MinecraftServer.SERVER_INIT) / (java.util.concurrent.TimeUnit.MILLISECONDS.toNanos(50L));
-+ }
-+ // Paper end - lag compensation
- }
-diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java
-index bf2a4c03afb73367a6d2530c78ff9f7c06f7f6a6..6207f45e7b84af4e6a2e4eb7b9fabf6b1e22a63a 100644
---- a/net/minecraft/server/level/ServerPlayerGameMode.java
-+++ b/net/minecraft/server/level/ServerPlayerGameMode.java
-@@ -111,7 +111,7 @@ public class ServerPlayerGameMode {
- }
-
- public void tick() {
-- this.gameTicks = net.minecraft.server.MinecraftServer.currentTick; // CraftBukkit
-+ this.gameTicks = (int) this.level.getLagCompensationTick(); // Paper - lag compensation
- if (this.hasDelayedDestroy) {
- BlockState blockState = this.level.getBlockStateIfLoaded(this.delayedDestroyPos); // Paper - Don't allow digging into unloaded chunks
- if (blockState == null || blockState.isAir()) { // Paper - Don't allow digging into unloaded chunks
-diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
-index 635e6e49483194c43b0ab47b5e1bacfe84613c3a..195e1151f7b2a32d6c4eb67edd1952e38f58b266 100644
---- a/net/minecraft/world/entity/LivingEntity.java
-+++ b/net/minecraft/world/entity/LivingEntity.java
-@@ -3828,6 +3828,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
- this.resendPossiblyDesyncedDataValues(java.util.List.of(DATA_LIVING_ENTITY_FLAGS), serverPlayer);
- }
- // Paper end - Properly cancel usable items
-+ // Paper start - lag compensate eating
-+ protected long eatStartTime;
-+ protected int totalEatTimeTicks;
-+ // Paper end - lag compensate eating
- private void updatingUsingItem() {
- if (this.isUsingItem()) {
- if (ItemStack.isSameItem(this.getItemInHand(this.getUsedItemHand()), this.useItem)) {
-@@ -3841,7 +3845,12 @@ public abstract class LivingEntity extends Entity implements Attackable {
-
- protected void updateUsingItem(ItemStack usingItem) {
- usingItem.onUseTick(this.level(), this, this.getUseItemRemainingTicks());
-- if (--this.useItemRemaining == 0 && !this.level().isClientSide && !usingItem.useOnRelease()) {
-+ // Paper start - lag compensate eating
-+ // we add 1 to the expected time to avoid lag compensating when we should not
-+ final boolean shouldLagCompensate = this.useItem.has(DataComponents.FOOD) && this.eatStartTime != -1 && (System.nanoTime() - this.eatStartTime) > ((1L + this.totalEatTimeTicks) * 50L * (1000L * 1000L));
-+ if ((--this.useItemRemaining == 0 || shouldLagCompensate) && !this.level().isClientSide && !usingItem.useOnRelease()) {
-+ this.useItemRemaining = 0;
-+ // Paper end - lag compensate eating
- this.completeUsingItem();
- }
- }
-@@ -3875,7 +3884,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
- ItemStack itemInHand = this.getItemInHand(hand);
- if (!itemInHand.isEmpty() && !this.isUsingItem() || forceUpdate) { // Paper - Prevent consuming the wrong itemstack
- this.useItem = itemInHand;
-- this.useItemRemaining = itemInHand.getUseDuration(this);
-+ // Paper start - lag compensate eating
-+ this.useItemRemaining = this.totalEatTimeTicks = itemInHand.getUseDuration(this);
-+ this.eatStartTime = System.nanoTime();
-+ // Paper end - lag compensate eating
- if (!this.level().isClientSide) {
- this.setLivingEntityFlag(1, true);
- this.setLivingEntityFlag(2, hand == InteractionHand.OFF_HAND);
-@@ -3899,7 +3911,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
- }
- } else if (!this.isUsingItem() && !this.useItem.isEmpty()) {
- this.useItem = ItemStack.EMPTY;
-- this.useItemRemaining = 0;
-+ // Paper start - lag compensate eating
-+ this.useItemRemaining = this.totalEatTimeTicks = 0;
-+ this.eatStartTime = -1L;
-+ // Paper end - lag compensate eating
- }
- }
- }
-@@ -4023,7 +4038,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
- }
-
- this.useItem = ItemStack.EMPTY;
-- this.useItemRemaining = 0;
-+ // Paper start - lag compensate eating
-+ this.useItemRemaining = this.totalEatTimeTicks = 0;
-+ this.eatStartTime = -1L;
-+ // Paper end - lag compensate eating
- }
-
- public boolean isBlocking() {
diff --git a/paper-server/patches/features/0031-Attempt-to-recalculate-regionfile-header-if-it-is-co.patch b/paper-server/patches/features/0024-Attempt-to-recalculate-regionfile-header-if-it-is-co.patch
index e35d6a31a9..e35d6a31a9 100644
--- a/paper-server/patches/features/0031-Attempt-to-recalculate-regionfile-header-if-it-is-co.patch
+++ b/paper-server/patches/features/0024-Attempt-to-recalculate-regionfile-header-if-it-is-co.patch
diff --git a/paper-server/patches/features/0032-Incremental-chunk-and-player-saving.patch b/paper-server/patches/features/0025-Incremental-chunk-and-player-saving.patch
index 964ec03fd8..9d7ae4524f 100644
--- a/paper-server/patches/features/0032-Incremental-chunk-and-player-saving.patch
+++ b/paper-server/patches/features/0025-Incremental-chunk-and-player-saving.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Incremental chunk and player saving
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index 3f880bdfd95f7556d1d76e4602a6d24dda78438c..79d050947960b26ef375c6f1986b617ad2ff081b 100644
+index d967d605c2e4227ae980c30f1c8b86edbc680d6d..6dbae12bbfd47cd4e75bc3089561e8e226e9e604 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -960,7 +960,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -17,7 +17,7 @@ index 3f880bdfd95f7556d1d76e4602a6d24dda78438c..79d050947960b26ef375c6f1986b617a
var4 = this.saveAllChunks(suppressLog, flush, forced);
} finally {
this.isSaving = false;
-@@ -1550,9 +1550,29 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1533,9 +1533,29 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
this.ticksUntilAutosave--;
@@ -50,7 +50,7 @@ index 3f880bdfd95f7556d1d76e4602a6d24dda78438c..79d050947960b26ef375c6f1986b617a
ProfilerFiller profilerFiller = Profiler.get();
this.runAllTasks(); // Paper - move runAllTasks() into full server tick (previously for timings)
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 9caa06f09409d36abf9e0a770ba004f4049e8e09..fc3b0db0f0a85fb42cb5fa8a1d78d4c4691ab519 100644
+index 46dfaed12c998c219a20c711a06531aed2c68012..ebeeb63c3dca505a3ce8b88feaa5d2ca20ec24a2 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -1316,6 +1316,28 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -95,7 +95,7 @@ index e61fe83479f095e8addbd3e8f1d5179c998ae1eb..0a7e5106a1d39150326e7c323030df5d
private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10;
private static final int FLY_STAT_RECORDING_SPEED = 25;
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 42c1f5d0f384e0e4f348e161b4461858a6d84227..2f7f5f933cf3adb6022664a0ad9b97c8f8bc8fd4 100644
+index 6abe5fd39583663af0feb98607cff75c42d96729..65c16eddff43c875be72b08f61d6f321a6876a48 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -482,6 +482,7 @@ public abstract class PlayerList {
diff --git a/paper-server/patches/features/0033-Optimise-general-POI-access.patch b/paper-server/patches/features/0026-Optimise-general-POI-access.patch
index 7387de347a..7387de347a 100644
--- a/paper-server/patches/features/0033-Optimise-general-POI-access.patch
+++ b/paper-server/patches/features/0026-Optimise-general-POI-access.patch
diff --git a/paper-server/patches/features/0034-Optional-per-player-mob-spawns.patch b/paper-server/patches/features/0027-Optional-per-player-mob-spawns.patch
index 6ee8bdf5ed..500d8debd1 100644
--- a/paper-server/patches/features/0034-Optional-per-player-mob-spawns.patch
+++ b/paper-server/patches/features/0027-Optional-per-player-mob-spawns.patch
@@ -78,7 +78,7 @@ index 87d4291a3944f706a694536da6de0f28c548ab8d..5576bf1d1d70ab7a010653d3207909b5
profiler.popPush("spawnAndTick");
boolean _boolean = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index a97b0b177a1fb0557af2af4d1f192513d7c0390d..4f8ef57d66a4562df0f5447988797cbdfbd3c9d5 100644
+index 0a7e5106a1d39150326e7c323030df5d32ecef1e..a63702dd7e86fc8b9f78c2ae23e23b65b6b2ee24 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
@@ -368,6 +368,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
diff --git a/paper-server/patches/features/0035-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch b/paper-server/patches/features/0028-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch
index a3eacdf9c5..2da69ced08 100644
--- a/paper-server/patches/features/0035-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch
+++ b/paper-server/patches/features/0028-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch
@@ -60,7 +60,7 @@ index 5576bf1d1d70ab7a010653d3207909b5de867e70..6540b2d6a1062d883811ce240c49d30d
spawnState = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, null, true);
} else {
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index 4f8ef57d66a4562df0f5447988797cbdfbd3c9d5..e350c6ba7bd638d27abe34afd375903e603ad682 100644
+index a63702dd7e86fc8b9f78c2ae23e23b65b6b2ee24..6d75a641431c7deb7e8ddbf02cdc919015a3a7dc 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
@@ -372,6 +372,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
diff --git a/paper-server/patches/features/0028-Improved-Watchdog-Support.patch b/paper-server/patches/features/0028-Improved-Watchdog-Support.patch
deleted file mode 100644
index 4a0d417552..0000000000
--- a/paper-server/patches/features/0028-Improved-Watchdog-Support.patch
+++ /dev/null
@@ -1,317 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar <[email protected]>
-Date: Sun, 12 Apr 2020 15:50:48 -0400
-Subject: [PATCH] Improved Watchdog Support
-
-Forced Watchdog Crash support and Improve Async Shutdown
-
-If the request to shut down the server is received while we are in
-a watchdog hang, immediately treat it as a crash and begin the shutdown
-process. Shutdown process is now improved to also shutdown cleanly when
-not using restart scripts either.
-
-If a server is deadlocked, a server owner can send SIGUP (or any other signal
-the JVM understands to shut down as it currently does) and the watchdog
-will no longer need to wait until the full timeout, allowing you to trigger
-a close process and try to shut the server down gracefully, saving player and
-world data.
-
-Previously there was no way to trigger this outside of waiting for a full watchdog
-timeout, which may be set to a really long time...
-
-Additionally, fix everything to do with shutting the server down asynchronously.
-
-Previously, nearly everything about the process was fragile and unsafe. Main might
-not have actually been frozen, and might still be manipulating state.
-
-Or, some reuest might ask main to do something in the shutdown but main is dead.
-
-Or worse, other things might start closing down items such as the Console or Thread Pool
-before we are fully shutdown.
-
-This change tries to resolve all of these issues by moving everything into the stop
-method and guaranteeing only one thread is stopping the server.
-
-We then issue Thread Death to the main thread of another thread initiates the stop process.
-We have to ensure Thread Death propagates correctly though to stop main completely.
-
-This is to ensure that if main isn't truely stuck, it's not manipulating state we are trying to save.
-
-This also moves all plugins who register "delayed init" tasks to occur just before "Done" so they
-are properly accounted for and wont trip watchdog on init.
-
-diff --git a/io/papermc/paper/util/LogManagerShutdownThread.java b/io/papermc/paper/util/LogManagerShutdownThread.java
-new file mode 100644
-index 0000000000000000000000000000000000000000..3d7df554b89cff23f64da7ad48b5e4d26ac2baf7
---- /dev/null
-+++ b/io/papermc/paper/util/LogManagerShutdownThread.java
-@@ -0,0 +1,29 @@
-+package io.papermc.paper.util;
-+
-+import org.apache.logging.log4j.LogManager;
-+
-+public final class LogManagerShutdownThread extends Thread {
-+
-+ static LogManagerShutdownThread INSTANCE = new LogManagerShutdownThread();
-+
-+ public static void hook() {
-+ if (INSTANCE == null) {
-+ throw new IllegalStateException("Cannot re-hook after being unhooked");
-+ }
-+ Runtime.getRuntime().addShutdownHook(INSTANCE);
-+ }
-+
-+ public static void unhook() {
-+ Runtime.getRuntime().removeShutdownHook(INSTANCE);
-+ INSTANCE = null;
-+ }
-+
-+ private LogManagerShutdownThread() {
-+ super("Log4j2 Shutdown Thread");
-+ }
-+
-+ @Override
-+ public void run() {
-+ LogManager.shutdown();
-+ }
-+}
-diff --git a/net/minecraft/CrashReport.java b/net/minecraft/CrashReport.java
-index 3e0e88afcf010d9a3d46e48bca5cbdf98fe97544..8bd7999c17c8772451f873966f8c90969aee1482 100644
---- a/net/minecraft/CrashReport.java
-+++ b/net/minecraft/CrashReport.java
-@@ -205,6 +205,7 @@ public class CrashReport {
- }
-
- public static CrashReport forThrowable(Throwable cause, String description) {
-+ if (cause instanceof ThreadDeath) com.destroystokyo.paper.util.SneakyThrow.sneaky(cause); // Paper
- while (cause instanceof CompletionException && cause.getCause() != null) {
- cause = cause.getCause();
- }
-diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java
-index e738405e5112584e02e01df2d5ede2676fa1bffb..560d80cb1177297210646b44ce25fd2fa3766d40 100644
---- a/net/minecraft/server/Main.java
-+++ b/net/minecraft/server/Main.java
-@@ -68,6 +68,7 @@ public class Main {
- )
- @DontObfuscate
- public static void main(final OptionSet optionSet) { // CraftBukkit - replaces main(String[] args)
-+ io.papermc.paper.util.LogManagerShutdownThread.hook(); // Paper
- SharedConstants.tryDetectVersion();
- /* CraftBukkit start - Replace everything
- OptionParser optionParser = new OptionParser();
-diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index ddd23354d68f5cbdc9f72c11246ab26a6c0bbe16..3f880bdfd95f7556d1d76e4602a6d24dda78438c 100644
---- a/net/minecraft/server/MinecraftServer.java
-+++ b/net/minecraft/server/MinecraftServer.java
-@@ -298,6 +298,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- // Spigot end
- public volatile boolean hasFullyShutdown; // Paper - Improved watchdog support
- public volatile boolean abnormalExit; // Paper - Improved watchdog support
-+ public volatile Thread shutdownThread; // Paper - Improved watchdog support
- public final io.papermc.paper.configuration.PaperConfigurations paperConfigurations; // Paper - add paper configuration files
- public boolean isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
- private final Set<String> pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping
-@@ -466,6 +467,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- }
- */
- // Paper end
-+ io.papermc.paper.util.LogManagerShutdownThread.unhook(); // Paper
- Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this));
- // CraftBukkit end
- this.paperConfigurations = services.paperConfigurations(); // Paper - add paper configuration files
-@@ -990,6 +992,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- this.hasStopped = true;
- }
- if (!hasLoggedStop && isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging
-+ // Paper start - kill main thread, and kill it hard
-+ shutdownThread = Thread.currentThread();
-+ org.spigotmc.WatchdogThread.doStop(); // Paper
-+ // Paper end
- // CraftBukkit end
- if (this.metricsRecorder.isRecording()) {
- this.cancelRecordingMetrics();
-@@ -1061,6 +1067,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- ca.spottedleaf.moonrise.common.util.MoonriseCommon.haltExecutors();
- }
- // Paper end - rewrite chunk system
-+ // Paper start - Improved watchdog support - move final shutdown items here
-+ Util.shutdownExecutors();
-+ try {
-+ net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Use TerminalConsoleAppender
-+ } catch (final Exception ignored) {
-+ }
-+ io.papermc.paper.log.CustomLogManager.forceReset(); // Paper - Reset loggers after shutdown
-+ this.onServerExit();
-+ // Paper end - Improved watchdog support - move final shutdown items here
- }
-
- public String getLocalIp() {
-@@ -1147,6 +1162,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
-
- protected void runServer() {
- try {
-+ long serverStartTime = Util.getNanos(); // Paper
- if (!this.initServer()) {
- throw new IllegalStateException("Failed to initialize server");
- }
-@@ -1157,6 +1173,17 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
-
- this.server.spark.enableBeforePlugins(); // Paper - spark
- // Spigot start
-+ // Paper start - Improved Watchdog Support
-+ LOGGER.info("Running delayed init tasks");
-+ this.server.getScheduler().mainThreadHeartbeat(); // run all 1 tick delay tasks during init,
-+ // this is going to be the first thing the tick process does anyways, so move done and run it after
-+ // everything is init before watchdog tick.
-+ // anything at 3+ won't be caught here but also will trip watchdog....
-+ // tasks are default scheduled at -1 + delay, and first tick will tick at 1
-+ final long actualDoneTimeMs = System.currentTimeMillis() - org.bukkit.craftbukkit.Main.BOOT_TIME.toEpochMilli(); // Paper - Add total time
-+ LOGGER.info("Done ({})! For help, type \"help\"", String.format(java.util.Locale.ROOT, "%.3fs", actualDoneTimeMs / 1000.00D)); // Paper - Add total time
-+ org.spigotmc.WatchdogThread.tick();
-+ // Paper end - Improved Watchdog Support
- org.spigotmc.WatchdogThread.hasStarted = true; // Paper
- Arrays.fill(this.recentTps, 20);
- // Paper start - further improve server tick loop
-@@ -1253,6 +1280,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- JvmProfiler.INSTANCE.onServerTick(this.smoothedTickTimeMillis);
- }
- } catch (Throwable var69) {
-+ // Paper start
-+ if (var69 instanceof ThreadDeath) {
-+ MinecraftServer.LOGGER.error("Main thread terminated by WatchDog due to hard crash", var69);
-+ return;
-+ }
-+ // Paper end
- LOGGER.error("Encountered an unexpected exception", var69);
- CrashReport crashReport = constructOrExtractCrashReport(var69);
- this.fillSystemReport(crashReport.getSystemReport());
-@@ -1275,15 +1308,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- this.services.profileCache().clearExecutor();
- }
-
-- org.spigotmc.WatchdogThread.doStop(); // Spigot
-+ //org.spigotmc.WatchdogThread.doStop(); // Spigot // Paper - move into stop
- // CraftBukkit start - Restore terminal to original settings
- try {
-- net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Use TerminalConsoleAppender
-+ //net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Move into stop
- } catch (Exception ignored) {
- }
- // CraftBukkit end
-- io.papermc.paper.log.CustomLogManager.forceReset(); // Paper - Reset loggers after shutdown
-- this.onServerExit();
-+ //io.papermc.paper.log.CustomLogManager.forceReset(); // Paper - Reset loggers after shutdown
-+ //this.onServerExit(); // Paper - moved into stop
- }
- }
- }
-@@ -1387,6 +1420,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
-
- @Override
- public TickTask wrapRunnable(Runnable runnable) {
-+ // Paper start - anything that does try to post to main during watchdog crash, run on watchdog
-+ if (this.hasStopped && Thread.currentThread().equals(shutdownThread)) {
-+ runnable.run();
-+ runnable = () -> {};
-+ }
-+ // Paper end
- return new TickTask(this.tickCount, runnable);
- }
-
-@@ -2184,7 +2223,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- this.resources.managers.updateStaticRegistryTags();
- this.resources.managers.getRecipeManager().finalizeRecipeLoading(this.worldData.enabledFeatures());
- this.potionBrewing = this.potionBrewing.reload(this.worldData.enabledFeatures()); // Paper - Custom Potion Mixes
-- this.getPlayerList().saveAll();
-+ // Paper start
-+ if (Thread.currentThread() != this.serverThread) {
-+ return;
-+ }
-+ // this.getPlayerList().saveAll(); // Paper - we don't need to save everything, just advancements // TODO Move this to a different patch
-+ for (ServerPlayer player : this.getPlayerList().getPlayers()) {
-+ player.getAdvancements().save();
-+ }
-+ // Paper end
- this.getPlayerList().reloadResources();
- this.functionManager.replaceLibrary(this.resources.managers.getFunctionLibrary());
- this.structureTemplateManager.onResourceManagerReload(this.resources.resourceManager);
-diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
-index 55d3f79af2e683b983d4d3f731bb9649dfe76f59..d900469dafd430ec3eba10d6f83bd8759f7a7edf 100644
---- a/net/minecraft/server/dedicated/DedicatedServer.java
-+++ b/net/minecraft/server/dedicated/DedicatedServer.java
-@@ -322,7 +322,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
- this.loadLevel(this.storageSource.getLevelId()); // CraftBukkit
- long l = Util.getNanos() - nanos;
- String string = String.format(Locale.ROOT, "%.3fs", l / 1.0E9);
-- LOGGER.info("Done ({})! For help, type \"help\"", string);
-+ LOGGER.info("Done preparing level \"{}\" ({})", this.getLevelIdName(), string); // Paper - clarify startup log messages & add total time
- if (properties.announcePlayerAchievements != null) {
- this.getGameRules().getRule(GameRules.RULE_ANNOUNCE_ADVANCEMENTS).set(properties.announcePlayerAchievements, this.overworld()); // CraftBukkit - per-world
- }
-@@ -419,7 +419,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
- }
-
- this.hasFullyShutdown = true; // Paper - Improved watchdog support
-- System.exit(0); // CraftBukkit
-+ System.exit(this.abnormalExit ? 70 : 0); // CraftBukkit // Paper
- }
-
- @Override
-@@ -753,7 +753,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
- @Override
- public void stopServer() {
- super.stopServer();
-- Util.shutdownExecutors();
-+ //Util.shutdownExecutors(); // Paper - moved into super
- SkullBlockEntity.clear();
- }
-
-diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 0a2f4af548561144607d24d3bd92270ce630fc95..42c1f5d0f384e0e4f348e161b4461858a6d84227 100644
---- a/net/minecraft/server/players/PlayerList.java
-+++ b/net/minecraft/server/players/PlayerList.java
-@@ -512,7 +512,7 @@ public abstract class PlayerList {
- this.cserver.getPluginManager().callEvent(playerQuitEvent);
- player.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage());
-
-- player.doTick(); // SPIGOT-924
-+ if (this.server.isSameThread()) player.doTick(); // SPIGOT-924 // Paper - don't tick during emergency shutdowns (Watchdog)
- // CraftBukkit end
-
- // Paper start - Configurable player collision; Remove from collideRule team if needed
-diff --git a/net/minecraft/util/thread/BlockableEventLoop.java b/net/minecraft/util/thread/BlockableEventLoop.java
-index 186c1b2e3599770385150eb7acdcd890aa5835eb..bfea9a2ae5e0bd5dae2873f715d192dfcbe97ee5 100644
---- a/net/minecraft/util/thread/BlockableEventLoop.java
-+++ b/net/minecraft/util/thread/BlockableEventLoop.java
-@@ -169,6 +169,6 @@ public abstract class BlockableEventLoop<R extends Runnable> implements Profiler
- public static boolean isNonRecoverable(Throwable error) {
- return error instanceof ReportedException reportedException
- ? isNonRecoverable(reportedException.getCause())
-- : error instanceof OutOfMemoryError || error instanceof StackOverflowError;
-+ : error instanceof OutOfMemoryError || error instanceof StackOverflowError || error instanceof ThreadDeath; // Paper
- }
- }
-diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java
-index 2c7b6034852216fc5aa5c3f42a70ebd8e8317a17..3bf79eedfc358f54bfe23b5a75b3ad121558f6c6 100644
---- a/net/minecraft/world/level/Level.java
-+++ b/net/minecraft/world/level/Level.java
-@@ -1498,6 +1498,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl
- try {
- consumerEntity.accept(entity);
- } catch (Throwable var6) {
-+ if (var6 instanceof ThreadDeath) throw var6; // Paper
- // Paper start - Prevent block entity and entity crashes
- final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level().getWorld().getName(), entity.getX(), entity.getY(), entity.getZ());
- MinecraftServer.LOGGER.error(msg, var6);
-diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java
-index c1ae7755e8d6fa8501d2210dab7605d993c55722..b10890c5a7e42163e419e74596b952525c3ed3eb 100644
---- a/net/minecraft/world/level/chunk/LevelChunk.java
-+++ b/net/minecraft/world/level/chunk/LevelChunk.java
-@@ -929,6 +929,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p
-
- profilerFiller.pop();
- } catch (Throwable var5) {
-+ if (var5 instanceof ThreadDeath) throw var5; // Paper
- // Paper start - Prevent block entity and entity crashes
- final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", LevelChunk.this.getLevel().getWorld().getName(), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ());
- net.minecraft.server.MinecraftServer.LOGGER.error(msg, var5);
diff --git a/paper-server/patches/features/0029-Detail-more-information-in-watchdog-dumps.patch b/paper-server/patches/features/0029-Detail-more-information-in-watchdog-dumps.patch
deleted file mode 100644
index 0f0a58ea62..0000000000
--- a/paper-server/patches/features/0029-Detail-more-information-in-watchdog-dumps.patch
+++ /dev/null
@@ -1,223 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Spottedleaf <[email protected]>
-Date: Thu, 26 Mar 2020 21:59:32 -0700
-Subject: [PATCH] Detail more information in watchdog dumps
-
-- Dump position, world, velocity, and uuid for currently ticking entities
-- Dump player name, player uuid, position, and world for packet handling
-
-diff --git a/io/papermc/paper/FeatureHooks.java b/io/papermc/paper/FeatureHooks.java
-index 460bb584db04b582f3297ae419183f430aff1ec0..c2d2bfa3c18daf27c163e5d11e8cea1f31b86c0a 100644
---- a/io/papermc/paper/FeatureHooks.java
-+++ b/io/papermc/paper/FeatureHooks.java
-@@ -93,9 +93,6 @@ public final class FeatureHooks {
- ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(server, isLongTimeout); // Paper - rewrite chunk system
- }
-
-- private static void dumpEntity(final Entity entity) {
-- }
--
- public static org.bukkit.entity.Entity[] getChunkEntities(net.minecraft.server.level.ServerLevel world, int chunkX, int chunkZ) {
- return world.getChunkEntities(chunkX, chunkZ); // Paper - rewrite chunk system
- }
-@@ -184,4 +181,4 @@ public final class FeatureHooks {
- ((ca.spottedleaf.moonrise.patches.chunk_system.player.ChunkSystemServerPlayer)player).moonrise$getViewDistanceHolder().setSendViewDistance(distance); // Paper - rewrite chunk system
- }
-
--}
-\ No newline at end of file
-+}
-diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
-index bfdc637a750602c00919422ca0e3943ba34db832..208efae06c7c44f220d4192219a86ec55c98a2fe 100644
---- a/net/minecraft/network/Connection.java
-+++ b/net/minecraft/network/Connection.java
-@@ -601,7 +601,13 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
- if (!(this.packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl loginPacketListener)
- || loginPacketListener.state != net.minecraft.server.network.ServerLoginPacketListenerImpl.State.VERIFYING
- || Connection.joinAttemptsThisTick++ < MAX_PER_TICK) {
-+ // Paper start - detailed watchdog information
-+ net.minecraft.network.protocol.PacketUtils.packetProcessing.push(this.packetListener);
-+ try {
- tickablePacketListener.tick();
-+ } finally {
-+ net.minecraft.network.protocol.PacketUtils.packetProcessing.pop();
-+ } // Paper end - detailed watchdog information
- } // Paper end - Buffer joins to world
- }
-
-diff --git a/net/minecraft/network/protocol/PacketUtils.java b/net/minecraft/network/protocol/PacketUtils.java
-index e65c62dbe4c1560ae153e4c4344e9194c783a2f4..4535858701b2bb232b9d2feb2af6551526232ddc 100644
---- a/net/minecraft/network/protocol/PacketUtils.java
-+++ b/net/minecraft/network/protocol/PacketUtils.java
-@@ -21,6 +21,8 @@ public class PacketUtils {
- public static <T extends PacketListener> void ensureRunningOnSameThread(Packet<T> packet, T processor, BlockableEventLoop<?> executor) throws RunningOnDifferentThreadException {
- if (!executor.isSameThread()) {
- executor.executeIfPossible(() -> {
-+ packetProcessing.push(processor); // Paper - detailed watchdog information
-+ try { // Paper - detailed watchdog information
- if (processor instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl serverCommonPacketListener && serverCommonPacketListener.processedDisconnect) return; // Paper - Don't handle sync packets for kicked players
- if (processor.shouldHandleMessage(packet)) {
- try {
-@@ -35,6 +37,12 @@ public class PacketUtils {
- } else {
- LOGGER.debug("Ignoring packet due to disconnection: {}", packet);
- }
-+ // Paper start - detailed watchdog information
-+ } finally {
-+ totalMainThreadPacketsProcessed.getAndIncrement();
-+ packetProcessing.pop();
-+ }
-+ // Paper end - detailed watchdog information
- });
- throw RunningOnDifferentThreadException.RUNNING_ON_DIFFERENT_THREAD;
- }
-@@ -61,4 +69,22 @@ public class PacketUtils {
-
- packetListener.fillCrashReport(crashReport);
- }
-+
-+ // Paper start - detailed watchdog information
-+ public static final java.util.concurrent.ConcurrentLinkedDeque<PacketListener> packetProcessing = new java.util.concurrent.ConcurrentLinkedDeque<>();
-+ static final java.util.concurrent.atomic.AtomicLong totalMainThreadPacketsProcessed = new java.util.concurrent.atomic.AtomicLong();
-+
-+ public static long getTotalProcessedPackets() {
-+ return totalMainThreadPacketsProcessed.get();
-+ }
-+
-+ public static java.util.List<PacketListener> getCurrentPacketProcessors() {
-+ java.util.List<PacketListener> listeners = new java.util.ArrayList<>(4);
-+ for (PacketListener listener : packetProcessing) {
-+ listeners.add(listener);
-+ }
-+
-+ return listeners;
-+ }
-+ // Paper end - detailed watchdog information
- }
-diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index 131ebdaec9ff09635689001e3b85bbe5845fbf98..9caa06f09409d36abf9e0a770ba004f4049e8e09 100644
---- a/net/minecraft/server/level/ServerLevel.java
-+++ b/net/minecraft/server/level/ServerLevel.java
-@@ -1239,7 +1239,26 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
-
- }
-
-+ // Paper start - log detailed entity tick information
-+ // TODO replace with varhandle
-+ static final java.util.concurrent.atomic.AtomicReference<Entity> currentlyTickingEntity = new java.util.concurrent.atomic.AtomicReference<>();
-+
-+ public static List<Entity> getCurrentlyTickingEntities() {
-+ Entity ticking = currentlyTickingEntity.get();
-+ List<Entity> ret = java.util.Arrays.asList(ticking == null ? new Entity[0] : new Entity[] { ticking });
-+
-+ return ret;
-+ }
-+ // Paper end - log detailed entity tick information
-+
- public void tickNonPassenger(Entity entity) {
-+ // Paper start - log detailed entity tick information
-+ ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot tick an entity off-main");
-+ try {
-+ if (currentlyTickingEntity.get() == null) {
-+ currentlyTickingEntity.lazySet(entity);
-+ }
-+ // Paper end - log detailed entity tick information
- entity.setOldPosAndRot();
- ProfilerFiller profilerFiller = Profiler.get();
- entity.tickCount++;
-@@ -1255,6 +1274,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
- for (Entity entity1 : entity.getPassengers()) {
- this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2
- }
-+ // Paper start - log detailed entity tick information
-+ } finally {
-+ if (currentlyTickingEntity.get() == entity) {
-+ currentlyTickingEntity.lazySet(null);
-+ }
-+ }
-+ // Paper end - log detailed entity tick information
- }
-
- private void tickPassenger(Entity ridingEntity, Entity passengerEntity, final boolean isActive) { // Paper - EAR 2
-diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
-index 3fd7f6bcdeff271a9843b2f2454f92d92069f539..3cefe3de62e3d6af7b514eb2f3df8e63c5aa5c1f 100644
---- a/net/minecraft/world/entity/Entity.java
-+++ b/net/minecraft/world/entity/Entity.java
-@@ -1062,8 +1062,43 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
- return this.onGround;
- }
-
-+ // Paper start - detailed watchdog information
-+ public final Object posLock = new Object(); // Paper - log detailed entity tick information
-+
-+ private Vec3 moveVector;
-+ private double moveStartX;
-+ private double moveStartY;
-+ private double moveStartZ;
-+
-+ public final Vec3 getMoveVector() {
-+ return this.moveVector;
-+ }
-+
-+ public final double getMoveStartX() {
-+ return this.moveStartX;
-+ }
-+
-+ public final double getMoveStartY() {
-+ return this.moveStartY;
-+ }
-+
-+ public final double getMoveStartZ() {
-+ return this.moveStartZ;
-+ }
-+ // Paper end - detailed watchdog information
-+
- public void move(MoverType type, Vec3 movement) {
- final Vec3 originalMovement = movement; // Paper - Expose pre-collision velocity
-+ // Paper start - detailed watchdog information
-+ ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot move an entity off-main");
-+ synchronized (this.posLock) {
-+ this.moveStartX = this.getX();
-+ this.moveStartY = this.getY();
-+ this.moveStartZ = this.getZ();
-+ this.moveVector = movement;
-+ }
-+ try {
-+ // Paper end - detailed watchdog information
- if (this.noPhysics) {
- this.setPos(this.getX() + movement.x, this.getY() + movement.y, this.getZ() + movement.z);
- } else {
-@@ -1181,6 +1216,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
- profilerFiller.pop();
- }
- }
-+ // Paper start - detailed watchdog information
-+ } finally {
-+ synchronized (this.posLock) { // Paper
-+ this.moveVector = null;
-+ } // Paper
-+ }
-+ // Paper end - detailed watchdog information
- }
-
- private void applyMovementEmissionAndPlaySound(Entity.MovementEmission movementEmission, Vec3 movement, BlockPos pos, BlockState state) {
-@@ -4643,7 +4685,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
- }
-
- public void setDeltaMovement(Vec3 deltaMovement) {
-+ synchronized (this.posLock) { // Paper
- this.deltaMovement = deltaMovement;
-+ } // Paper
- }
-
- public void addDeltaMovement(Vec3 addend) {
-@@ -4749,7 +4793,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
- }
- // Paper end - Fix MC-4
- if (this.position.x != x || this.position.y != y || this.position.z != z) {
-+ synchronized (this.posLock) { // Paper
- this.position = new Vec3(x, y, z);
-+ } // Paper
- int floor = Mth.floor(x);
- int floor1 = Mth.floor(y);
- int floor2 = Mth.floor(z);
diff --git a/paper-server/patches/features/0036-Optimize-Hoppers.patch b/paper-server/patches/features/0029-Optimize-Hoppers.patch
index bb158407dc..c81544a817 100644
--- a/paper-server/patches/features/0036-Optimize-Hoppers.patch
+++ b/paper-server/patches/features/0029-Optimize-Hoppers.patch
@@ -48,10 +48,10 @@ index 0000000000000000000000000000000000000000..24a2090e068ad3c0d08705050944abdf
+ }
+}
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index 79d050947960b26ef375c6f1986b617ad2ff081b..12f14284655845d59d44c52c65435fa91e2d7d6f 100644
+index 6dbae12bbfd47cd4e75bc3089561e8e226e9e604..9c859025302ddb2c20cf6457fa4e4eaf7fbafdd7 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
-@@ -1724,6 +1724,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1707,6 +1707,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
serverLevel.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent
serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
serverLevel.updateLagCompensationTick(); // Paper - lag compensation
diff --git a/paper-server/patches/features/0037-Optimise-collision-checking-in-player-move-packet-ha.patch b/paper-server/patches/features/0030-Optimise-collision-checking-in-player-move-packet-ha.patch
index a2b8f8a47e..5ab3533b9d 100644
--- a/paper-server/patches/features/0037-Optimise-collision-checking-in-player-move-packet-ha.patch
+++ b/paper-server/patches/features/0030-Optimise-collision-checking-in-player-move-packet-ha.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Optimise collision checking in player move packet handling
Move collision logic to just the hasNewCollision call instead of getCubes + hasNewCollision
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index e4869774b2a8096467e5913d73af5bde93dbcccf..e3c855b9335f3d86ba933e7acdd3fa2981919c99 100644
+index 96d36b2e285ec0a518b15ccdff4d7d1850b0a7e2..9a0a2a628d76a4e0410839d919a8bf38ff73a650 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -561,7 +561,7 @@ public class ServerGamePacketListenerImpl
diff --git a/paper-server/patches/sources/net/minecraft/network/Connection.java.patch b/paper-server/patches/sources/net/minecraft/network/Connection.java.patch
index e0c2fff5dd..f34c32dc5a 100644
--- a/paper-server/patches/sources/net/minecraft/network/Connection.java.patch
+++ b/paper-server/patches/sources/net/minecraft/network/Connection.java.patch
@@ -192,7 +192,7 @@
} catch (RejectedExecutionException var6) {
this.disconnect(Component.translatable("multiplayer.disconnect.server_shutdown"));
} catch (ClassCastException var7) {
-@@ -385,10 +_,24 @@
+@@ -385,10 +_,30 @@
}
}
@@ -212,7 +212,13 @@
+ if (!(this.packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl loginPacketListener)
+ || loginPacketListener.state != net.minecraft.server.network.ServerLoginPacketListenerImpl.State.VERIFYING
+ || Connection.joinAttemptsThisTick++ < MAX_PER_TICK) {
++ // Paper start - detailed watchdog information
++ net.minecraft.network.protocol.PacketUtils.packetProcessing.push(this.packetListener);
++ try {
tickablePacketListener.tick();
++ } finally {
++ net.minecraft.network.protocol.PacketUtils.packetProcessing.pop();
++ } // Paper end - detailed watchdog information
+ } // Paper end - Buffer joins to world
}
diff --git a/paper-server/patches/sources/net/minecraft/network/protocol/PacketUtils.java.patch b/paper-server/patches/sources/net/minecraft/network/protocol/PacketUtils.java.patch
index 0eaf929602..b2abd03b83 100644
--- a/paper-server/patches/sources/net/minecraft/network/protocol/PacketUtils.java.patch
+++ b/paper-server/patches/sources/net/minecraft/network/protocol/PacketUtils.java.patch
@@ -1,10 +1,48 @@
--- a/net/minecraft/network/protocol/PacketUtils.java
+++ b/net/minecraft/network/protocol/PacketUtils.java
-@@ -21,6 +_,7 @@
+@@ -21,6 +_,9 @@
public static <T extends PacketListener> void ensureRunningOnSameThread(Packet<T> packet, T processor, BlockableEventLoop<?> executor) throws RunningOnDifferentThreadException {
if (!executor.isSameThread()) {
executor.executeIfPossible(() -> {
++ packetProcessing.push(processor); // Paper - detailed watchdog information
++ try { // Paper - detailed watchdog information
+ if (processor instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl serverCommonPacketListener && serverCommonPacketListener.processedDisconnect) return; // Paper - Don't handle sync packets for kicked players
if (processor.shouldHandleMessage(packet)) {
try {
packet.handle(processor);
+@@ -34,6 +_,12 @@
+ } else {
+ LOGGER.debug("Ignoring packet due to disconnection: {}", packet);
+ }
++ // Paper start - detailed watchdog information
++ } finally {
++ totalMainThreadPacketsProcessed.getAndIncrement();
++ packetProcessing.pop();
++ }
++ // Paper end - detailed watchdog information
+ });
+ throw RunningOnDifferentThreadException.RUNNING_ON_DIFFERENT_THREAD;
+ }
+@@ -60,4 +_,22 @@
+
+ packetListener.fillCrashReport(crashReport);
+ }
++
++ // Paper start - detailed watchdog information
++ public static final java.util.concurrent.ConcurrentLinkedDeque<PacketListener> packetProcessing = new java.util.concurrent.ConcurrentLinkedDeque<>();
++ static final java.util.concurrent.atomic.AtomicLong totalMainThreadPacketsProcessed = new java.util.concurrent.atomic.AtomicLong();
++
++ public static long getTotalProcessedPackets() {
++ return totalMainThreadPacketsProcessed.get();
++ }
++
++ public static java.util.List<PacketListener> getCurrentPacketProcessors() {
++ java.util.List<PacketListener> listeners = new java.util.ArrayList<>(4);
++ for (PacketListener listener : packetProcessing) {
++ listeners.add(listener);
++ }
++
++ return listeners;
++ }
++ // Paper end - detailed watchdog information
+ }
diff --git a/paper-server/patches/sources/net/minecraft/server/Main.java.patch b/paper-server/patches/sources/net/minecraft/server/Main.java.patch
index 886690bbbd..b9d9570fdd 100644
--- a/paper-server/patches/sources/net/minecraft/server/Main.java.patch
+++ b/paper-server/patches/sources/net/minecraft/server/Main.java.patch
@@ -1,11 +1,12 @@
--- a/net/minecraft/server/Main.java
+++ b/net/minecraft/server/Main.java
-@@ -67,8 +_,9 @@
+@@ -67,8 +_,10 @@
reason = "System.out needed before bootstrap"
)
@DontObfuscate
- public static void main(String[] args) {
+ public static void main(final OptionSet optionSet) { // CraftBukkit - replaces main(String[] args)
++ io.papermc.paper.util.LogManagerShutdownThread.hook(); // Paper - Improved watchdog support
SharedConstants.tryDetectVersion();
+ /* CraftBukkit start - Replace everything
OptionParser optionParser = new OptionParser();
diff --git a/paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch b/paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch
index 55497abf8a..d8518cce12 100644
--- a/paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch
+++ b/paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch
@@ -41,7 +41,7 @@
@Nullable
private KeyPair keyPair;
@Nullable
-@@ -271,10 +_,35 @@
+@@ -271,10 +_,37 @@
private final SuppressedExceptionCollector suppressedExceptions = new SuppressedExceptionCollector();
private final DiscontinuousFrame tickFrame;
@@ -65,9 +65,11 @@
+ // Spigot end
+ public volatile boolean hasFullyShutdown; // Paper - Improved watchdog support
+ public volatile boolean abnormalExit; // Paper - Improved watchdog support
++ public volatile Thread shutdownThread; // Paper - Improved watchdog support
+ public final io.papermc.paper.configuration.PaperConfigurations paperConfigurations; // Paper - add paper configuration files
+ public boolean isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
+ private final Set<String> pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping
++ public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation
+
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {
AtomicReference<S> atomicReference = new AtomicReference<>();
@@ -110,7 +112,7 @@
this.tickRateManager = new ServerTickRateManager(this);
this.progressListenerFactory = progressListenerFactory;
this.storageSource = storageSource;
-@@ -328,6 +_,37 @@
+@@ -328,6 +_,38 @@
this.fuelValues = FuelValues.vanillaBurnTimes(this.registries.compositeAccess(), this.worldData.enabledFeatures());
this.tickFrame = TracyClient.createDiscontinuousFrame("Server Tick");
}
@@ -142,6 +144,7 @@
+ }
+ */
+ // Paper end
++ io.papermc.paper.util.LogManagerShutdownThread.unhook(); // Paper - Improved watchdog support
+ Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this));
+ // CraftBukkit end
+ this.paperConfigurations = services.paperConfigurations(); // Paper - add paper configuration files
@@ -595,7 +598,7 @@
if (flush) {
for (ServerLevel serverLevel2 : this.getAllLevels()) {
LOGGER.info("ThreadedAnvilChunkStorage ({}): All chunks are saved", serverLevel2.getChunkSource().chunkMap.getStorageName());
-@@ -593,18 +_,46 @@
+@@ -593,18 +_,48 @@
this.stopServer();
}
@@ -617,6 +620,8 @@
+ this.hasStopped = true;
+ }
+ if (!hasLoggedStop && isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging
++ shutdownThread = Thread.currentThread(); // Paper - Improved watchdog support
++ org.spigotmc.WatchdogThread.doStop(); // Paper - Improved watchdog support
+ // CraftBukkit end
if (this.metricsRecorder.isRecording()) {
this.cancelRecordingMetrics();
@@ -643,7 +648,7 @@
}
LOGGER.info("Saving worlds");
-@@ -646,6 +_,16 @@
+@@ -646,6 +_,25 @@
} catch (IOException var4) {
LOGGER.error("Failed to unlock level {}", this.storageSource.getLevelId(), var4);
}
@@ -657,6 +662,15 @@
+ this.getProfileCache().save(false); // Paper - Perf: Async GameProfileCache saving
+ }
+ // Spigot end
++ // Paper start - Improved watchdog support - move final shutdown items here
++ Util.shutdownExecutors();
++ try {
++ net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Use TerminalConsoleAppender
++ } catch (final Exception ignored) {
++ }
++ io.papermc.paper.log.CustomLogManager.forceReset(); // Paper - Reset loggers after shutdown
++ this.onServerExit();
++ // Paper end - Improved watchdog support - move final shutdown items here
}
public String getLocalIp() {
@@ -733,12 +747,23 @@
protected void runServer() {
try {
if (!this.initServer()) {
-@@ -681,6 +_,24 @@
+@@ -681,6 +_,35 @@
this.statusIcon = this.loadStatusIcon().orElse(null);
this.status = this.buildServerStatus();
+ this.server.spark.enableBeforePlugins(); // Paper - spark
+ // Spigot start
++ // Paper start
++ LOGGER.info("Running delayed init tasks");
++ this.server.getScheduler().mainThreadHeartbeat(); // run all 1 tick delay tasks during init,
++ // this is going to be the first thing the tick process does anyways, so move done and run it after
++ // everything is init before watchdog tick.
++ // anything at 3+ won't be caught here but also will trip watchdog....
++ // tasks are default scheduled at -1 + delay, and first tick will tick at 1
++ final long actualDoneTimeMs = System.currentTimeMillis() - org.bukkit.craftbukkit.Main.BOOT_TIME.toEpochMilli(); // Paper - Improve startup message
++ LOGGER.info("Done ({})! For help, type \"help\"", String.format(java.util.Locale.ROOT, "%.3fs", actualDoneTimeMs / 1000.00D)); // Paper - Improve startup message
++ org.spigotmc.WatchdogThread.tick();
++ // Paper end
+ org.spigotmc.WatchdogThread.hasStarted = true; // Paper
+ Arrays.fill(this.recentTps, 20);
+ // Paper start - further improve server tick loop
@@ -798,21 +823,15 @@
this.nextTickTimeNanos += l;
try (Profiler.Scope scope = Profiler.use(this.createProfiler())) {
-@@ -755,6 +_,14 @@
+@@ -755,7 +_,7 @@
this.services.profileCache().clearExecutor();
}
-+ org.spigotmc.WatchdogThread.doStop(); // Spigot
-+ // CraftBukkit start - Restore terminal to original settings
-+ try {
-+ net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Use TerminalConsoleAppender
-+ } catch (Exception ignored) {
-+ }
-+ // CraftBukkit end
-+ io.papermc.paper.log.CustomLogManager.forceReset(); // Paper - Reset loggers after shutdown
- this.onServerExit();
+- this.onServerExit();
++ //this.onServerExit(); // Paper - Improved watchdog support; moved into stop
}
}
+ }
@@ -807,7 +_,14 @@
}
@@ -829,6 +848,19 @@
}
public static boolean throwIfFatalException() {
+@@ -852,6 +_,12 @@
+
+ @Override
+ public TickTask wrapRunnable(Runnable runnable) {
++ // Paper start - anything that does try to post to main during watchdog crash, run on watchdog
++ if (this.hasStopped && Thread.currentThread().equals(shutdownThread)) {
++ runnable.run();
++ runnable = () -> {};
++ }
++ // Paper end
+ return new TickTask(this.tickCount, runnable);
+ }
+
@@ -871,15 +_,16 @@
if (super.pollTask()) {
return true;
@@ -952,7 +984,7 @@
ObjectArrayList<GameProfile> list = new ObjectArrayList<>(min);
int randomInt = Mth.nextInt(this.random, 0, players.size() - min);
-@@ -1046,17 +_,64 @@
+@@ -1046,17 +_,65 @@
protected void tickChildren(BooleanSupplier hasTimeLeft) {
ProfilerFiller profilerFiller = Profiler.get();
this.getPlayerList().getPlayers().forEach(serverPlayer1 -> serverPlayer1.connection.suspendFlushing());
@@ -1006,6 +1038,7 @@
for (ServerLevel serverLevel : this.getAllLevels()) {
+ serverLevel.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent
+ serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
++ serverLevel.updateLagCompensationTick(); // Paper - lag compensation
profilerFiller.push(() -> serverLevel + " " + serverLevel.dimension().location());
+ /* Drop global time updates
if (this.tickCount % 20 == 0) {
@@ -1168,12 +1201,19 @@
this.resources.close();
this.resources = reloadableResources;
this.packRepository.setSelected(selectedIds);
-@@ -1529,11 +_,23 @@
+@@ -1529,11 +_,29 @@
this.worldData.setDataConfiguration(worldDataConfiguration);
this.resources.managers.updateStaticRegistryTags();
this.resources.managers.getRecipeManager().finalizeRecipeLoading(this.worldData.enabledFeatures());
+- this.getPlayerList().saveAll();
+ this.potionBrewing = this.potionBrewing.reload(this.worldData.enabledFeatures()); // Paper - Custom Potion Mixes
- this.getPlayerList().saveAll();
++ if (Thread.currentThread() != this.serverThread) return; // Paper
++ // Paper start - we don't need to save everything, just advancements
++ // this.getPlayerList().saveAll();
++ for (final ServerPlayer player : this.getPlayerList().getPlayers()) {
++ player.getAdvancements().save();
++ }
++ // Paper end - we don't need to save everything, just advancements
this.getPlayerList().reloadResources();
this.functionManager.replaceLibrary(this.resources.managers.getFunctionLibrary());
this.structureTemplateManager.onResourceManagerReload(this.resources.resourceManager);
diff --git a/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch b/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch
index 2f25d642a3..a71879d2eb 100644
--- a/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch
+++ b/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch
@@ -263,7 +263,8 @@
+ this.loadLevel(this.storageSource.getLevelId()); // CraftBukkit
long l = Util.getNanos() - nanos;
String string = String.format(Locale.ROOT, "%.3fs", l / 1.0E9);
- LOGGER.info("Done ({})! For help, type \"help\"", string);
+- LOGGER.info("Done ({})! For help, type \"help\"", string);
++ LOGGER.info("Done preparing level \"{}\" ({})", this.getLevelIdName(), string); // Paper - Improve startup message, add total time
if (properties.announcePlayerAchievements != null) {
- this.getGameRules().getRule(GameRules.RULE_ANNOUNCE_ADVANCEMENTS).set(properties.announcePlayerAchievements, this);
+ this.getGameRules().getRule(GameRules.RULE_ANNOUNCE_ADVANCEMENTS).set(properties.announcePlayerAchievements, this.overworld()); // CraftBukkit - per-world
@@ -315,7 +316,7 @@
}
+
+ this.hasFullyShutdown = true; // Paper - Improved watchdog support
-+ System.exit(0); // CraftBukkit
++ System.exit(this.abnormalExit ? 70 : 0); // CraftBukkit // Paper - Improved watchdog support
}
@Override
@@ -417,6 +418,15 @@
}
public void storeUsingWhiteList(boolean isStoreUsingWhiteList) {
+@@ -532,7 +_,7 @@
+ @Override
+ public void stopServer() {
+ super.stopServer();
+- Util.shutdownExecutors();
++ //Util.shutdownExecutors(); // Paper - Improved watchdog support; moved into super
+ SkullBlockEntity.clear();
+ }
+
@@ -626,4 +_,15 @@
}
}
diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch
index 6bb71f81a0..acc43a7716 100644
--- a/paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch
+++ b/paper-server/patches/sources/net/minecraft/server/level/ServerLevel.java.patch
@@ -456,7 +456,33 @@
}
public void resetEmptyTime() {
-@@ -753,6 +_,7 @@
+@@ -746,18 +_,45 @@
+ }
+ }
+
++ // Paper start - log detailed entity tick information
++ // TODO replace with varhandle
++ static final java.util.concurrent.atomic.AtomicReference<Entity> currentlyTickingEntity = new java.util.concurrent.atomic.AtomicReference<>();
++
++ public static List<Entity> getCurrentlyTickingEntities() {
++ Entity ticking = currentlyTickingEntity.get();
++ List<Entity> ret = java.util.Arrays.asList(ticking == null ? new Entity[0] : new Entity[] { ticking });
++
++ return ret;
++ }
++ // Paper end - log detailed entity tick information
++
+ public void tickNonPassenger(Entity entity) {
++ // Paper start - log detailed entity tick information
++ ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot tick an entity off-main");
++ try {
++ if (currentlyTickingEntity.get() == null) {
++ currentlyTickingEntity.lazySet(entity);
++ }
++ // Paper end - log detailed entity tick information
+ entity.setOldPosAndRot();
+ ProfilerFiller profilerFiller = Profiler.get();
+ entity.tickCount++;
profilerFiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType()).toString());
profilerFiller.incrementCounter("tickNonPassenger");
entity.tick();
@@ -464,6 +490,18 @@
profilerFiller.pop();
for (Entity entity1 : entity.getPassengers()) {
+ this.tickPassenger(entity, entity1);
+ }
++ // Paper start - log detailed entity tick information
++ } finally {
++ if (currentlyTickingEntity.get() == entity) {
++ currentlyTickingEntity.lazySet(null);
++ }
++ }
++ // Paper end - log detailed entity tick information
+ }
+
+ private void tickPassenger(Entity ridingEntity, Entity passengerEntity) {
@@ -770,6 +_,7 @@
profilerFiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(passengerEntity.getType()).toString());
profilerFiller.incrementCounter("tickPassenger");
@@ -1137,7 +1175,7 @@
}
@Override
-@@ -1792,4 +_,12 @@
+@@ -1792,4 +_,24 @@
entity.updateDynamicGameEventListener(DynamicGameEventListener::move);
}
}
@@ -1149,4 +1187,16 @@
+ return this.server.getPlayerList().getPlayer(uuid);
+ }
+ // Paper end - check global player list where appropriate
++
++ // Paper start - lag compensation
++ private long lagCompensationTick = MinecraftServer.SERVER_INIT;
++
++ public long getLagCompensationTick() {
++ return this.lagCompensationTick;
++ }
++
++ public void updateLagCompensationTick() {
++ this.lagCompensationTick = (System.nanoTime() - MinecraftServer.SERVER_INIT) / (java.util.concurrent.TimeUnit.MILLISECONDS.toNanos(50L));
++ }
++ // Paper end - lag compensation
}
diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch
index f61fcfdd62..df18866114 100644
--- a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch
+++ b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch
@@ -54,12 +54,13 @@
}
}
-@@ -90,10 +_,10 @@
+@@ -90,10 +_,11 @@
}
public void tick() {
- this.gameTicks++;
-+ this.gameTicks = net.minecraft.server.MinecraftServer.currentTick; // CraftBukkit
++ // this.gameTicks = net.minecraft.server.MinecraftServer.currentTick; // CraftBukkit
++ this.gameTicks = (int) this.level.getLagCompensationTick(); // Paper - lag compensate eating
if (this.hasDelayedDestroy) {
- BlockState blockState = this.level.getBlockState(this.delayedDestroyPos);
- if (blockState.isAir()) {
diff --git a/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch b/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch
index 2ddcf75909..65cec1e1fc 100644
--- a/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch
+++ b/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch
@@ -371,7 +371,7 @@
+ this.cserver.getPluginManager().callEvent(playerQuitEvent);
+ player.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage());
+
-+ player.doTick(); // SPIGOT-924
++ if (this.server.isSameThread()) player.doTick(); // SPIGOT-924 // Paper - Improved watchdog support; don't tick during emergency shutdowns
+ // CraftBukkit end
+
+ // Paper start - Configurable player collision; Remove from collideRule team if needed
diff --git a/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch
index 3576351376..f1de578de1 100644
--- a/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch
@@ -501,11 +501,47 @@
}
public boolean isFree(double x, double y, double z) {
-@@ -627,6 +_,7 @@
+@@ -626,7 +_,43 @@
+ return this.onGround;
}
++ // Paper start - detailed watchdog information
++ public final Object posLock = new Object(); // Paper - log detailed entity tick information
++
++ private Vec3 moveVector;
++ private double moveStartX;
++ private double moveStartY;
++ private double moveStartZ;
++
++ public final Vec3 getMoveVector() {
++ return this.moveVector;
++ }
++
++ public final double getMoveStartX() {
++ return this.moveStartX;
++ }
++
++ public final double getMoveStartY() {
++ return this.moveStartY;
++ }
++
++ public final double getMoveStartZ() {
++ return this.moveStartZ;
++ }
++ // Paper end - detailed watchdog information
++
public void move(MoverType type, Vec3 movement) {
+ final Vec3 originalMovement = movement; // Paper - Expose pre-collision velocity
++ // Paper start - detailed watchdog information
++ ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot move an entity off-main");
++ synchronized (this.posLock) {
++ this.moveStartX = this.getX();
++ this.moveStartY = this.getY();
++ this.moveStartZ = this.getZ();
++ this.moveVector = movement;
++ }
++ try {
++ // Paper end - detailed watchdog information
if (this.noPhysics) {
this.setPos(this.getX() + movement.x, this.getY() + movement.y, this.getZ() + movement.z);
} else {
@@ -538,6 +574,20 @@
if (!this.level().isClientSide() || this.isControlledByLocalInstance()) {
Entity.MovementEmission movementEmission = this.getMovementEmission();
if (movementEmission.emitsAnything() && !this.isPassenger()) {
+@@ -713,6 +_,13 @@
+ profilerFiller.pop();
+ }
+ }
++ // Paper start - detailed watchdog information
++ } finally {
++ synchronized (this.posLock) { // Paper
++ this.moveVector = null;
++ } // Paper
++ }
++ // Paper end - detailed watchdog information
+ }
+
+ private void applyMovementEmissionAndPlaySound(Entity.MovementEmission movementEmission, Vec3 movement, BlockPos pos, BlockState state) {
@@ -850,7 +_,7 @@
}
@@ -1601,7 +1651,17 @@
}
}
}
-@@ -3480,7 +_,39 @@
+@@ -3417,7 +_,9 @@
+ }
+
+ public void setDeltaMovement(Vec3 deltaMovement) {
++ synchronized (this.posLock) { // Paper - detailed watchdog information
+ this.deltaMovement = deltaMovement;
++ } // Paper - detailed watchdog information
+ }
+
+ public void addDeltaMovement(Vec3 addend) {
+@@ -3480,9 +_,43 @@
return this.getZ((2.0 * this.random.nextDouble() - 1.0) * scale);
}
@@ -1639,8 +1699,12 @@
+ }
+ // Paper end - Fix MC-4
if (this.position.x != x || this.position.y != y || this.position.z != z) {
++ synchronized (this.posLock) { // Paper - detailed watchdog information
this.position = new Vec3(x, y, z);
++ } // Paper - detailed watchdog information
int floor = Mth.floor(x);
+ int floor1 = Mth.floor(y);
+ int floor2 = Mth.floor(z);
@@ -3496,6 +_,12 @@
this.levelCallback.onMove();
diff --git a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch
index 84c9704c87..6e41390320 100644
--- a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch
+++ b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch
@@ -1535,7 +1535,7 @@
}
protected void internalSetAbsorptionAmount(float absorptionAmount) {
-@@ -3115,6 +_,11 @@
+@@ -3115,6 +_,15 @@
return (this.entityData.get(DATA_LIVING_ENTITY_FLAGS) & 2) > 0 ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND;
}
@@ -1544,10 +1544,28 @@
+ this.resendPossiblyDesyncedDataValues(java.util.List.of(DATA_LIVING_ENTITY_FLAGS), serverPlayer);
+ }
+ // Paper end - Properly cancel usable items
++ // Paper start - lag compensate eating
++ protected long eatStartTime;
++ protected int totalEatTimeTicks;
++ // Paper end - lag compensate eating
private void updatingUsingItem() {
if (this.isUsingItem()) {
if (ItemStack.isSameItem(this.getItemInHand(this.getUsedItemHand()), this.useItem)) {
-@@ -3154,8 +_,13 @@
+@@ -3128,7 +_,12 @@
+
+ protected void updateUsingItem(ItemStack usingItem) {
+ usingItem.onUseTick(this.level(), this, this.getUseItemRemainingTicks());
+- if (--this.useItemRemaining == 0 && !this.level().isClientSide && !usingItem.useOnRelease()) {
++ // Paper start - lag compensate eating
++ // we add 1 to the expected time to avoid lag compensating when we should not
++ final boolean shouldLagCompensate = this.useItem.has(DataComponents.FOOD) && this.eatStartTime != -1 && (System.nanoTime() - this.eatStartTime) > ((1L + this.totalEatTimeTicks) * 50L * (1000L * 1000L));
++ if ((--this.useItemRemaining == 0 || shouldLagCompensate) && !this.level().isClientSide && !usingItem.useOnRelease()) {
++ this.useItemRemaining = 0;
++ // Paper end - lag compensate eating
+ this.completeUsingItem();
+ }
+ }
+@@ -3154,10 +_,18 @@
}
public void startUsingItem(InteractionHand hand) {
@@ -1560,8 +1578,26 @@
- if (!itemInHand.isEmpty() && !this.isUsingItem()) {
+ if (!itemInHand.isEmpty() && !this.isUsingItem() || forceUpdate) { // Paper - Prevent consuming the wrong itemstack
this.useItem = itemInHand;
- this.useItemRemaining = itemInHand.getUseDuration(this);
+- this.useItemRemaining = itemInHand.getUseDuration(this);
++ // Paper start - lag compensate eating
++ this.useItemRemaining = this.totalEatTimeTicks = itemInHand.getUseDuration(this);
++ this.eatStartTime = System.nanoTime();
++ // Paper end - lag compensate eating
if (!this.level().isClientSide) {
+ this.setLivingEntityFlag(1, true);
+ this.setLivingEntityFlag(2, hand == InteractionHand.OFF_HAND);
+@@ -3181,7 +_,10 @@
+ }
+ } else if (!this.isUsingItem() && !this.useItem.isEmpty()) {
+ this.useItem = ItemStack.EMPTY;
+- this.useItemRemaining = 0;
++ // Paper start - lag compensate eating
++ this.useItemRemaining = this.totalEatTimeTicks = 0;
++ this.eatStartTime = -1L;
++ // Paper end - lag compensate eating
+ }
+ }
+ }
@@ -3220,12 +_,49 @@
this.releaseUsingItem();
} else {
@@ -1621,6 +1657,18 @@
this.useItem.releaseUsing(this.level(), this, this.getUseItemRemainingTicks());
if (this.useItem.useOnRelease()) {
this.updatingUsingItem();
+@@ -3267,7 +_,10 @@
+ }
+
+ this.useItem = ItemStack.EMPTY;
+- this.useItemRemaining = 0;
++ // Paper start - lag compensate eating
++ this.useItemRemaining = this.totalEatTimeTicks = 0;
++ this.eatStartTime = -1L;
++ // Paper end - lag compensate eating
+ }
+
+ public boolean isBlocking() {
@@ -3281,12 +_,69 @@
if (item.getUseAnimation(this.useItem) != ItemUseAnimation.BLOCK) {
return null;