aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2021-11-26 17:25:35 +0100
committerMiniDigger | Martin <[email protected]>2021-11-30 19:26:33 +0100
commit134a61c11124940ce0c21a41963777dbe8272a19 (patch)
treec45f3e38bb3d7ee1b298163ba0a3918a40a87ea5
parent738788079b2f82298be2dd0a9f67a2381828c5c4 (diff)
downloadPaper-134a61c11124940ce0c21a41963777dbe8272a19.tar.gz
Paper-134a61c11124940ce0c21a41963777dbe8272a19.zip
Readd incremental chunk saving, merge with player saving
-rw-r--r--patches/server/0456-incremental-chunk-saving.patch (renamed from patches/removed/1.18/0455-incremental-chunk-saving.patch)221
-rw-r--r--patches/server/0457-Stop-copy-on-write-operations-for-updating-light-dat.patch (renamed from patches/server/0456-Stop-copy-on-write-operations-for-updating-light-dat.patch)0
-rw-r--r--patches/server/0458-Support-old-UUID-format-for-NBT.patch (renamed from patches/server/0457-Support-old-UUID-format-for-NBT.patch)0
-rw-r--r--patches/server/0459-Clean-up-duplicated-GameProfile-Properties.patch (renamed from patches/server/0458-Clean-up-duplicated-GameProfile-Properties.patch)0
-rw-r--r--patches/server/0460-Convert-legacy-attributes-in-Item-Meta.patch (renamed from patches/server/0459-Convert-legacy-attributes-in-Item-Meta.patch)0
-rw-r--r--patches/server/0461-Remove-some-streams-from-structures.patch (renamed from patches/server/0460-Remove-some-streams-from-structures.patch)0
-rw-r--r--patches/server/0462-Remove-streams-from-classes-related-villager-gossip.patch (renamed from patches/server/0461-Remove-streams-from-classes-related-villager-gossip.patch)0
-rw-r--r--patches/server/0463-Optimize-NibbleArray-to-use-pooled-buffers.patch (renamed from patches/server/0462-Optimize-NibbleArray-to-use-pooled-buffers.patch)0
-rw-r--r--patches/server/0464-Support-components-in-ItemMeta.patch (renamed from patches/server/0463-Support-components-in-ItemMeta.patch)0
-rw-r--r--patches/server/0465-Improve-EntityTargetLivingEntityEvent-for-1.16-mobs.patch (renamed from patches/server/0464-Improve-EntityTargetLivingEntityEvent-for-1.16-mobs.patch)0
-rw-r--r--patches/server/0466-Add-entity-liquid-API.patch (renamed from patches/server/0465-Add-entity-liquid-API.patch)0
-rw-r--r--patches/server/0467-Update-itemstack-legacy-name-and-lore.patch (renamed from patches/server/0466-Update-itemstack-legacy-name-and-lore.patch)0
-rw-r--r--patches/server/0468-Spawn-player-in-correct-world-on-login.patch (renamed from patches/server/0467-Spawn-player-in-correct-world-on-login.patch)2
-rw-r--r--patches/server/0469-Add-PrepareResultEvent.patch (renamed from patches/server/0468-Add-PrepareResultEvent.patch)0
-rw-r--r--patches/server/0470-Don-t-check-chunk-for-portal-on-world-gen-entity-add.patch (renamed from patches/server/0469-Don-t-check-chunk-for-portal-on-world-gen-entity-add.patch)0
-rw-r--r--patches/server/0471-Implement-Chunk-Priority-Urgency-System-for-Chunks.patch (renamed from patches/server/0470-Implement-Chunk-Priority-Urgency-System-for-Chunks.patch)56
-rw-r--r--patches/server/0472-Optimize-NetworkManager-Exception-Handling.patch (renamed from patches/server/0471-Optimize-NetworkManager-Exception-Handling.patch)0
-rw-r--r--patches/server/0473-Optimize-the-advancement-data-player-iteration-to-be.patch (renamed from patches/server/0472-Optimize-the-advancement-data-player-iteration-to-be.patch)0
-rw-r--r--patches/server/0474-Fix-arrows-never-despawning-MC-125757.patch (renamed from patches/server/0473-Fix-arrows-never-despawning-MC-125757.patch)0
-rw-r--r--patches/server/0475-Thread-Safe-Vanilla-Command-permission-checking.patch (renamed from patches/server/0474-Thread-Safe-Vanilla-Command-permission-checking.patch)0
-rw-r--r--patches/server/0476-Move-range-check-for-block-placing-up.patch (renamed from patches/server/0475-Move-range-check-for-block-placing-up.patch)0
-rw-r--r--patches/server/0477-Fix-SPIGOT-5989.patch (renamed from patches/server/0476-Fix-SPIGOT-5989.patch)10
-rw-r--r--patches/server/0478-Fix-SPIGOT-5824-Bukkit-world-container-is-not-used.patch (renamed from patches/server/0477-Fix-SPIGOT-5824-Bukkit-world-container-is-not-used.patch)0
-rw-r--r--patches/server/0479-Fix-SPIGOT-5885-Unable-to-disable-advancements.patch (renamed from patches/server/0478-Fix-SPIGOT-5885-Unable-to-disable-advancements.patch)0
-rw-r--r--patches/server/0480-Fix-AdvancementDataPlayer-leak-due-from-quitting-ear.patch (renamed from patches/server/0479-Fix-AdvancementDataPlayer-leak-due-from-quitting-ear.patch)0
-rw-r--r--patches/server/0481-Add-missing-strikeLighting-call-to-World-spigot-stri.patch (renamed from patches/server/0480-Add-missing-strikeLighting-call-to-World-spigot-stri.patch)0
-rw-r--r--patches/server/0482-Fix-some-rails-connecting-improperly.patch (renamed from patches/server/0481-Fix-some-rails-connecting-improperly.patch)0
-rw-r--r--patches/server/0483-Fix-regex-mistake-in-CB-NBT-int-deserialization.patch (renamed from patches/server/0482-Fix-regex-mistake-in-CB-NBT-int-deserialization.patch)0
-rw-r--r--patches/server/0484-Do-not-let-the-server-load-chunks-from-newer-version.patch (renamed from patches/server/0483-Do-not-let-the-server-load-chunks-from-newer-version.patch)0
-rw-r--r--patches/server/0485-Brand-support.patch (renamed from patches/server/0484-Brand-support.patch)0
-rw-r--r--patches/server/0486-Add-setMaxPlayers-API.patch (renamed from patches/server/0485-Add-setMaxPlayers-API.patch)2
-rw-r--r--patches/server/0487-Add-playPickupItemAnimation-to-LivingEntity.patch (renamed from patches/server/0486-Add-playPickupItemAnimation-to-LivingEntity.patch)0
-rw-r--r--patches/server/0488-Don-t-require-FACING-data.patch (renamed from patches/server/0487-Don-t-require-FACING-data.patch)0
-rw-r--r--patches/server/0489-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch (renamed from patches/server/0488-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch)4
-rw-r--r--patches/server/0490-Add-moon-phase-API.patch (renamed from patches/server/0489-Add-moon-phase-API.patch)0
-rw-r--r--patches/server/0491-Improve-Chunk-Status-Transition-Speed.patch (renamed from patches/server/0490-Improve-Chunk-Status-Transition-Speed.patch)14
-rw-r--r--patches/server/0492-Prevent-headless-pistons-from-being-created.patch (renamed from patches/server/0491-Prevent-headless-pistons-from-being-created.patch)9
-rw-r--r--patches/server/0493-Add-BellRingEvent.patch (renamed from patches/server/0492-Add-BellRingEvent.patch)0
-rw-r--r--patches/server/0494-Add-zombie-targets-turtle-egg-config.patch (renamed from patches/server/0493-Add-zombie-targets-turtle-egg-config.patch)2
-rw-r--r--patches/server/0495-Buffer-joins-to-world.patch (renamed from patches/server/0494-Buffer-joins-to-world.patch)2
-rw-r--r--patches/server/0496-Optimize-redstone-algorithm.patch (renamed from patches/server/0495-Optimize-redstone-algorithm.patch)2
-rw-r--r--patches/server/0497-Fix-hex-colors-not-working-in-some-kick-messages.patch (renamed from patches/server/0496-Fix-hex-colors-not-working-in-some-kick-messages.patch)0
-rw-r--r--patches/server/0498-PortalCreateEvent-needs-to-know-its-entity.patch (renamed from patches/server/0497-PortalCreateEvent-needs-to-know-its-entity.patch)0
-rw-r--r--patches/server/0499-Fix-CraftTeam-null-check.patch (renamed from patches/server/0498-Fix-CraftTeam-null-check.patch)0
-rw-r--r--patches/server/0500-Add-more-Evoker-API.patch (renamed from patches/server/0499-Add-more-Evoker-API.patch)0
-rw-r--r--patches/server/0500-Incremental-player-saving.patch126
-rw-r--r--patches/server/0503-Cache-block-data-strings.patch4
-rw-r--r--patches/server/0507-Extend-block-drop-capture-to-capture-all-items-added.patch4
-rw-r--r--patches/server/0508-Don-t-mark-dirty-in-invalid-locations-SPIGOT-6086.patch4
-rw-r--r--patches/server/0512-Fix-deop-kicking-non-whitelisted-player-when-white-l.patch4
-rw-r--r--patches/server/0568-Added-ServerResourcesReloadedEvent.patch6
-rw-r--r--patches/server/0569-Added-world-settings-for-mobs-picking-up-loot.patch4
-rw-r--r--patches/server/0576-Remove-stale-POIs.patch4
-rw-r--r--patches/server/0584-Configurable-max-leash-distance.patch4
-rw-r--r--patches/server/0588-Add-toggle-for-always-placing-the-dragon-egg.patch4
-rw-r--r--patches/server/0591-Skip-distance-map-update-when-spawning-disabled.patch4
-rw-r--r--patches/server/0594-EntityMoveEvent.patch6
-rw-r--r--patches/server/0595-added-option-to-disable-pathfinding-updates-on-block.patch10
-rw-r--r--patches/server/0614-Allow-using-signs-inside-spawn-protection.patch4
-rw-r--r--patches/server/0621-forced-whitelist-use-configurable-kick-message.patch4
-rw-r--r--patches/server/0667-Limit-item-frame-cursors-on-maps.patch4
-rw-r--r--patches/server/0668-Add-PlayerKickEvent-causes.patch8
-rw-r--r--patches/server/0672-Add-option-to-fix-items-merging-through-walls.patch4
-rw-r--r--patches/server/0674-Fix-invulnerable-end-crystals.patch4
-rw-r--r--patches/server/0678-Make-item-validations-configurable.patch6
-rw-r--r--patches/server/0680-add-per-world-spawn-limits.patch4
-rw-r--r--patches/server/0688-Fix-commands-from-signs-not-firing-command-events.patch4
-rw-r--r--patches/server/0691-Add-config-for-mobs-immune-to-default-effects.patch4
-rw-r--r--patches/server/0694-Don-t-apply-cramming-damage-to-players.patch4
-rw-r--r--patches/server/0695-Rate-options-and-timings-for-sensors-and-behaviors.patch4
-rw-r--r--patches/server/0712-Configurable-item-frame-map-cursor-update-interval.patch4
-rw-r--r--patches/server/0736-Make-CallbackExecutor-strict-again.patch4
-rw-r--r--patches/server/0737-Do-not-allow-the-server-to-unload-chunks-at-request-.patch4
-rw-r--r--patches/server/0738-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch4
-rw-r--r--patches/server/0739-Correctly-handle-recursion-for-chunkholder-updates.patch6
-rw-r--r--patches/server/0741-Fix-chunks-refusing-to-unload-at-low-TPS.patch4
-rw-r--r--patches/server/0742-Do-not-allow-ticket-level-changes-while-unloading-pl.patch12
-rw-r--r--patches/server/0743-Do-not-allow-ticket-level-changes-when-updating-chun.patch6
-rw-r--r--patches/server/0751-Execute-chunk-tasks-mid-tick.patch6
-rw-r--r--patches/server/0752-Do-not-copy-visible-chunks.patch28
-rw-r--r--patches/server/0764-Consolidate-flush-calls-for-entity-tracker-packets.patch4
-rw-r--r--patches/server/0769-Oprimise-map-impl-for-tracked-players.patch6
-rw-r--r--patches/server/0774-Optimise-nearby-player-lookups.patch22
-rw-r--r--patches/server/0775-Optimise-WorldServer-notify.patch14
-rw-r--r--patches/server/0783-Fix-merchant-inventory-not-closing-on-entity-removal.patch4
-rw-r--r--patches/server/0793-Do-not-overload-I-O-threads-with-chunk-data-while-fl.patch8
-rw-r--r--patches/server/0794-Preserve-overstacked-loot.patch4
-rw-r--r--patches/server/0801-Configurable-feature-seeds.patch4
88 files changed, 331 insertions, 375 deletions
diff --git a/patches/removed/1.18/0455-incremental-chunk-saving.patch b/patches/server/0456-incremental-chunk-saving.patch
index 9eba7113bd..b9952cab04 100644
--- a/patches/removed/1.18/0455-incremental-chunk-saving.patch
+++ b/patches/server/0456-incremental-chunk-saving.patch
@@ -4,11 +4,30 @@ Date: Sun, 9 Jun 2019 03:53:22 +0100
Subject: [PATCH] incremental chunk saving
+diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
+index ebbbffd209c6796bc608992e293035141a122d1f..4fb6b2153117f54a2b0ca940de4c0ee2fa85e20e 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
++++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
+@@ -458,4 +458,14 @@ public class PaperConfig {
+ set("settings.unsupported-settings.allow-tnt-duplication", null);
+ }
+
++ public static int playerAutoSaveRate = -1;
++ public static int maxPlayerAutoSavePerTick = 10;
++ private static void playerAutoSaveRate() {
++ playerAutoSaveRate = getInt("settings.player-auto-save-rate", -1);
++ maxPlayerAutoSavePerTick = getInt("settings.max-player-auto-save-per-tick", -1);
++ if (maxPlayerAutoSavePerTick == -1) { // -1 Automatic / "Recommended"
++ // 10 should be safe for everyone unless you mass spamming player auto save
++ maxPlayerAutoSavePerTick = (playerAutoSaveRate == -1 || playerAutoSaveRate > 100) ? 10 : 20;
++ }
++ }
+ }
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 22a04bfddccd5a118d6297ca88a5e396b6a884f9..f9caed53ffc10300511b576cf822864b101df83d 100644
+index 845f105457d659a4bd88d4a8ce91b20d6abb7865..bf0c6e1b2b1934bc3fa5c17c414b3730c5ac0833 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -63,6 +63,21 @@ public class PaperWorldConfig {
+@@ -62,6 +62,21 @@ public class PaperWorldConfig {
log( "Keep Spawn Loaded Range: " + (keepLoadedRange/16));
}
@@ -31,51 +50,57 @@ index 22a04bfddccd5a118d6297ca88a5e396b6a884f9..f9caed53ffc10300511b576cf822864b
config.addDefault("world-settings.default." + path, def);
return config.getBoolean("world-settings." + worldName + "." + path, config.getBoolean("world-settings.default." + path));
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 4d9326099bdff037e5fe9a6ee14f8610c482ac7a..f07dd72d2ba1b3e1d30dab5973ca3785ea517471 100644
+index 4351dd9c293d1db48c87c5df28bcb2b9a59583f7..8a3583bcf2d2a694b30718062bc7f2e1158c9b4f 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -298,6 +298,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- public static int currentTick = 0; // Paper - Further improve tick loop
- public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
- public int autosavePeriod;
-+ public boolean serverAutoSave = false; // Paper
- public Commands vanillaCommandDispatcher;
- public boolean forceTicks; // Paper
- // CraftBukkit end
-@@ -1416,14 +1417,23 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- this.status.getPlayers().setSample(agameprofile);
+@@ -901,7 +901,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+
+ try {
+ this.isSaving = true;
+- this.getPlayerList().saveAll();
++ this.getPlayerList().saveAll(); // Diff on change
+ flag3 = this.saveAllChunks(suppressLogs, flush, force);
+ } finally {
+ this.isSaving = false;
+@@ -1408,13 +1408,27 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ }
}
- if (this.autosavePeriod > 0 && this.tickCount % this.autosavePeriod == 0) { // CraftBukkit
- MinecraftServer.LOGGER.debug("Autosave started");
-+ // if (this.autosavePeriod > 0 && this.tickCount % this.autosavePeriod == 0) { // CraftBukkit // Paper - move down
-+ // MinecraftServer.LOGGER.debug("Autosave started"); // Paper
-+ serverAutoSave = (autosavePeriod > 0 && this.tickCount % autosavePeriod == 0); // Paper
- this.profiler.push("save");
-+ if (this.autosavePeriod > 0 && this.tickCount % this.autosavePeriod == 0) { // Paper - moved from above
- this.playerList.saveAll();
-- this.saveAllChunks(true, false, false);
+- this.profiler.push("save");
+- this.saveEverything(true, false, false);
- this.profiler.pop();
- MinecraftServer.LOGGER.debug("Autosave finished");
-+ // this.saveAllChunks(true, false, false); // Paper - saved incrementally below
-+ } // Paper start
-+ for (ServerLevel level : this.getAllLevels()) {
-+ if (level.paperConfig.autoSavePeriod > 0) {
-+ level.saveIncrementally(this.serverAutoSave);
-+ }
++ // Paper start - incremental chunk and player saving
++ int playerSaveInterval = com.destroystokyo.paper.PaperConfig.playerAutoSaveRate;
++ if (playerSaveInterval < 0) {
++ playerSaveInterval = autosavePeriod;
}
++ this.profiler.push("save");
++ try {
++ this.isSaving = true;
++ if (playerSaveInterval > 0) {
++ this.playerList.saveAll(playerSaveInterval);
++ }
++ for (ServerLevel level : this.getAllLevels()) {
++ if (level.paperConfig.autoSavePeriod > 0) {
++ level.saveIncrementally(autosavePeriod > 0 && this.tickCount % autosavePeriod == 0);
++ }
++ }
++ } finally {
++ this.isSaving = false;
++ }
++ this.profiler.pop();
+ // Paper end
-+ this.profiler.pop();
-+ // MinecraftServer.LOGGER.debug("Autosave finished"); // Paper
-+ //} // Paper
-
- this.profiler.push("snooper");
- if (((DedicatedServer) this).getProperties().snooperEnabled && !this.snooper.isStarted() && this.tickCount > 100) { // Spigot
+ io.papermc.paper.util.CachedLists.reset(); // Paper
+ // Paper start - move executeAll() into full server tick timing
+ try (co.aikar.timings.Timing ignored = MinecraftTimings.processTasksTimer.startTiming()) {
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-index b9e9bfb6c73cfb309c5d9399817546399b333a12..467449049359c721c27b7cd249b03acc5fb8f3cc 100644
+index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..bab59dc2747a24ce6b48c8f962f81c50a316d89e 100644
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-@@ -111,6 +111,8 @@ public class ChunkHolder {
+@@ -84,6 +84,8 @@ public class ChunkHolder {
this.playersInChunkTickRange = this.chunkMap.playerChunkTickRangeMap.getObjectsInRange(key);
}
// Paper end - optimise isOutsideOfRange
@@ -84,7 +109,7 @@ index b9e9bfb6c73cfb309c5d9399817546399b333a12..467449049359c721c27b7cd249b03acc
public ChunkHolder(ChunkPos pos, int level, LevelHeightAccessor world, LevelLightEngine lightingProvider, ChunkHolder.LevelChangeListener levelUpdateListener, ChunkHolder.PlayerProvider playersWatchingChunkProvider) {
this.futures = new AtomicReferenceArray(ChunkHolder.CHUNK_STATUSES.size());
-@@ -524,7 +526,19 @@ public class ChunkHolder {
+@@ -463,7 +465,19 @@ public class ChunkHolder {
boolean flag2 = playerchunk_state.isOrAfter(ChunkHolder.FullChunkStatus.BORDER);
boolean flag3 = playerchunk_state1.isOrAfter(ChunkHolder.FullChunkStatus.BORDER);
@@ -104,7 +129,7 @@ index b9e9bfb6c73cfb309c5d9399817546399b333a12..467449049359c721c27b7cd249b03acc
if (!flag2 && flag3) {
int expectCreateCount = ++this.fullChunkCreateCount; // Paper
this.fullChunkFuture = chunkStorage.prepareAccessibleChunk(this);
-@@ -664,9 +678,33 @@ public class ChunkHolder {
+@@ -594,9 +608,33 @@ public class ChunkHolder {
}
public void refreshAccessibility() {
@@ -139,18 +164,18 @@ index b9e9bfb6c73cfb309c5d9399817546399b333a12..467449049359c721c27b7cd249b03acc
for (int i = 0; i < this.futures.length(); ++i) {
CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = (CompletableFuture) this.futures.get(i);
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index d372fb640e34cd451cf79f5b4e03b47c5cb034ab..d70d977290b07fca61fea965a907c9f60a393ba7 100644
+index 4ceeec4bc9faad457c2a3389cbe0ce3353bb54cb..7b5c49f17c2a69a45a77423f89bf7c31cbd26c23 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -97,6 +97,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureMana
+@@ -100,6 +100,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureMana
import net.minecraft.world.level.storage.DimensionDataStorage;
import net.minecraft.world.level.storage.LevelStorageSource;
import net.minecraft.world.phys.Vec3;
+import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet; // Paper
import org.apache.commons.lang3.mutable.MutableBoolean;
+ import org.apache.commons.lang3.mutable.MutableObject;
import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
-@@ -710,6 +711,64 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -666,6 +667,64 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
@@ -215,15 +240,16 @@ index d372fb640e34cd451cf79f5b4e03b47c5cb034ab..d70d977290b07fca61fea965a907c9f6
protected void saveAllChunks(boolean flush) {
if (flush) {
List<ChunkHolder> list = (List) this.visibleChunkMap.values().stream().filter(ChunkHolder::wasAccessibleSinceLastSave).peek(ChunkHolder::refreshAccessibility).collect(Collectors.toList());
-@@ -847,6 +906,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
- asyncSaveData, chunk);
-
- chunk.setUnsaved(false);
-+ chunk.setLastSaved(this.level.getGameTime()); // Paper - track last saved time
- }
- // Paper end
+@@ -761,7 +820,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+ int l = 0;
+ ObjectIterator objectiterator = this.visibleChunkMap.values().iterator();
-@@ -884,6 +944,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+- while (l < 20 && shouldKeepTicking.getAsBoolean() && objectiterator.hasNext()) {
++ while (false && l < 20 && shouldKeepTicking.getAsBoolean() && objectiterator.hasNext()) { // Paper - incremental chunk and player saving
+ if (this.saveChunkIfNeeded((ChunkHolder) objectiterator.next())) {
+ ++l;
+ }
+@@ -803,6 +862,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.level.unload(chunk);
}
@@ -231,7 +257,15 @@ index d372fb640e34cd451cf79f5b4e03b47c5cb034ab..d70d977290b07fca61fea965a907c9f6
this.lightEngine.updateChunkStatus(ichunkaccess.getPos());
this.lightEngine.tryScheduleUpdate();
-@@ -1228,6 +1289,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1206,6 +1266,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+ asyncSaveData, chunk);
+
+ chunk.setUnsaved(false);
++ chunk.setLastSaved(this.level.getGameTime()); // Paper - track last saved time
+ }
+ // Paper end
+
+@@ -1215,6 +1276,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
if (!chunk.isUnsaved()) {
return false;
} else {
@@ -240,10 +274,10 @@ index d372fb640e34cd451cf79f5b4e03b47c5cb034ab..d70d977290b07fca61fea965a907c9f6
ChunkPos chunkcoordintpair = chunk.getPos();
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index 0ce86c72cb829b816ec7bfb8f0d19396e1b12eb6..e5317a994cb9b30293ad54b8fc537f703ef994dc 100644
+index c3875acfad91c50a7fec4b1f8e06e8a32e2ea037..3f9366019d19f8fb5f636f1b301c2824a54865cd 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-@@ -836,6 +836,15 @@ public class ServerChunkCache extends ChunkSource {
+@@ -825,6 +825,15 @@ public class ServerChunkCache extends ChunkSource {
} // Paper - Timings
}
@@ -260,10 +294,10 @@ index 0ce86c72cb829b816ec7bfb8f0d19396e1b12eb6..e5317a994cb9b30293ad54b8fc537f70
public void close() throws IOException {
// CraftBukkit start
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 320cd209ab725a9ad4d5dff70987d7efabae5798..012ac1089205411a56576b26c90ff9122146725e 100644
+index a5f0fe87bd5d75bf9a12ef284b0d635d8f6dd3a1..d55d2627b7e0c847250c551989d438280bef9ab8 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1050,6 +1050,37 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1055,6 +1055,37 @@ public class ServerLevel extends Level implements WorldGenLevel {
return !this.server.isUnderSpawnProtection(this, pos, player) && this.getWorldBorder().isWithinBounds(pos);
}
@@ -298,36 +332,83 @@ index 320cd209ab725a9ad4d5dff70987d7efabae5798..012ac1089205411a56576b26c90ff912
+ }
+ // Paper end
+
- public void save(@Nullable ProgressListener progressListener, boolean flush, boolean flag1) {
+ public void save(@Nullable ProgressListener progressListener, boolean flush, boolean savingDisabled) {
ServerChunkCache chunkproviderserver = this.getChunkSource();
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 2f13055a39c26fe12d2c1094103186635e536166..4b83617a81db1749faaf49fc3ee77e44846dce1a 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -171,6 +171,7 @@ public class ServerPlayer extends Player {
+ public final int getViewDistance() { return this.getLevel().getChunkSource().chunkMap.viewDistance - 1; } // Paper - placeholder
+
+ private static final Logger LOGGER = LogManager.getLogger();
++ public long lastSave = MinecraftServer.currentTick; // Paper
+ private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32;
+ private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10;
+ public ServerGamePacketListenerImpl connection;
+diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
+index 30fa9ac91be2ecc55efeee9222835cbedc53acff..a40ca089d92df8f3ea0a444e3293531e787b196b 100644
+--- a/src/main/java/net/minecraft/server/players/PlayerList.java
++++ b/src/main/java/net/minecraft/server/players/PlayerList.java
+@@ -556,6 +556,7 @@ public abstract class PlayerList {
+ protected void save(ServerPlayer player) {
+ if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit
+ if (!player.didPlayerJoinEvent) return; // Paper - If we never fired PJE, we disconnected during login. Data has not changed, and additionally, our saved vehicle is not loaded! If we save now, we will lose our vehicle (CraftBukkit bug)
++ player.lastSave = MinecraftServer.currentTick; // Paper
+ this.playerIo.save(player);
+ ServerStatsCounter serverstatisticmanager = (ServerStatsCounter) player.getStats(); // CraftBukkit
+
+@@ -1158,10 +1159,22 @@ public abstract class PlayerList {
+ }
+
+ public void saveAll() {
++ // Paper start - incremental player saving
++ this.saveAll(-1);
++ }
++
++ public void saveAll(int interval) {
+ net.minecraft.server.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main
+ MinecraftTimings.savePlayers.startTiming(); // Paper
++ int numSaved = 0;
++ long now = MinecraftServer.currentTick;
+ for (int i = 0; i < this.players.size(); ++i) {
+- this.save(this.players.get(i));
++ ServerPlayer entityplayer = this.players.get(i);
++ if (interval == -1 || now - entityplayer.lastSave >= interval) {
++ this.save(entityplayer);
++ if (interval != -1 && ++numSaved <= com.destroystokyo.paper.PaperConfig.maxPlayerAutoSavePerTick) { break; }
++ }
++ // Paper end
+ }
+ MinecraftTimings.savePlayers.stopTiming(); // Paper
+ return null; }); // Paper - ensure main
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
-index 12d11a249c759e99568a76c791cc0d65adfcfe94..8393950a0b38ec7897d7643803d5accdb1f983f3 100644
+index 04b58d6aec04cc98777f88c2bcc9a820c5fd2f57..a44901edc49259ebbbb4367b0d10b8daa76b07cd 100644
--- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
+++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
-@@ -29,6 +29,7 @@ public interface ChunkAccess extends BlockGetter, FeatureAccess {
- return GameEventDispatcher.NOOP;
+@@ -451,6 +451,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom
+ public LevelHeightAccessor getHeightAccessorForGeneration() {
+ return this;
}
++ public void setLastSaved(long ticks) {} // Paper
-+ default void setLastSaved(long ticks) {}
- // Paper start
- default boolean generateFlatBedrock() {
- if (this.getLevel() != null) {
+ // CraftBukkit start - decompile error
+ public static record TicksToSave(SerializableTickContainer<Block> blocks, SerializableTickContainer<Fluid> fluids) {
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index 1de1566b76c73ddfaf7e022296068db02044d5f3..a84b75a53a0324fab9aeb9b80bf74eb0a84ecd2e 100644
+index b92da719a5d35a60a2e13ccb0f55c41b242f9b50..6a881c2abdbc23366a1b0ac69e363b196b99197b 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-@@ -108,6 +108,13 @@ public class LevelChunk implements ChunkAccess {
- private final ShortList[] postProcessing;
- private TickList<Block> blockTicks;
- private TickList<Fluid> liquidTicks;
+@@ -87,6 +87,12 @@ public class LevelChunk extends ChunkAccess {
+ private final Int2ObjectMap<GameEventDispatcher> gameEventDispatcherSections;
+ private final LevelChunkTicks<Block> blockTicks;
+ private final LevelChunkTicks<Fluid> fluidTicks;
+ // Paper start - track last save time
+ public long lastSaveTime;
-+ @Override
+ public void setLastSaved(long ticks) {
+ this.lastSaveTime = ticks;
+ }
+ // Paper end
- private volatile boolean unsaved;
- private long inhabitedTime;
- @Nullable
+
+ public LevelChunk(Level world, ChunkPos pos) {
+ this(world, pos, UpgradeData.EMPTY, new LevelChunkTicks<>(), new LevelChunkTicks<>(), 0L, (LevelChunkSection[]) null, (LevelChunk.PostLoadProcessor) null, (BlendingData) null);
diff --git a/patches/server/0456-Stop-copy-on-write-operations-for-updating-light-dat.patch b/patches/server/0457-Stop-copy-on-write-operations-for-updating-light-dat.patch
index 3fe4a3693e..3fe4a3693e 100644
--- a/patches/server/0456-Stop-copy-on-write-operations-for-updating-light-dat.patch
+++ b/patches/server/0457-Stop-copy-on-write-operations-for-updating-light-dat.patch
diff --git a/patches/server/0457-Support-old-UUID-format-for-NBT.patch b/patches/server/0458-Support-old-UUID-format-for-NBT.patch
index 607a1ac12a..607a1ac12a 100644
--- a/patches/server/0457-Support-old-UUID-format-for-NBT.patch
+++ b/patches/server/0458-Support-old-UUID-format-for-NBT.patch
diff --git a/patches/server/0458-Clean-up-duplicated-GameProfile-Properties.patch b/patches/server/0459-Clean-up-duplicated-GameProfile-Properties.patch
index d9c0d0a1c7..d9c0d0a1c7 100644
--- a/patches/server/0458-Clean-up-duplicated-GameProfile-Properties.patch
+++ b/patches/server/0459-Clean-up-duplicated-GameProfile-Properties.patch
diff --git a/patches/server/0459-Convert-legacy-attributes-in-Item-Meta.patch b/patches/server/0460-Convert-legacy-attributes-in-Item-Meta.patch
index 1225ad8355..1225ad8355 100644
--- a/patches/server/0459-Convert-legacy-attributes-in-Item-Meta.patch
+++ b/patches/server/0460-Convert-legacy-attributes-in-Item-Meta.patch
diff --git a/patches/server/0460-Remove-some-streams-from-structures.patch b/patches/server/0461-Remove-some-streams-from-structures.patch
index b4ec016db8..b4ec016db8 100644
--- a/patches/server/0460-Remove-some-streams-from-structures.patch
+++ b/patches/server/0461-Remove-some-streams-from-structures.patch
diff --git a/patches/server/0461-Remove-streams-from-classes-related-villager-gossip.patch b/patches/server/0462-Remove-streams-from-classes-related-villager-gossip.patch
index 23c4519a7b..23c4519a7b 100644
--- a/patches/server/0461-Remove-streams-from-classes-related-villager-gossip.patch
+++ b/patches/server/0462-Remove-streams-from-classes-related-villager-gossip.patch
diff --git a/patches/server/0462-Optimize-NibbleArray-to-use-pooled-buffers.patch b/patches/server/0463-Optimize-NibbleArray-to-use-pooled-buffers.patch
index e85cb4e1ec..e85cb4e1ec 100644
--- a/patches/server/0462-Optimize-NibbleArray-to-use-pooled-buffers.patch
+++ b/patches/server/0463-Optimize-NibbleArray-to-use-pooled-buffers.patch
diff --git a/patches/server/0463-Support-components-in-ItemMeta.patch b/patches/server/0464-Support-components-in-ItemMeta.patch
index df4ac6171f..df4ac6171f 100644
--- a/patches/server/0463-Support-components-in-ItemMeta.patch
+++ b/patches/server/0464-Support-components-in-ItemMeta.patch
diff --git a/patches/server/0464-Improve-EntityTargetLivingEntityEvent-for-1.16-mobs.patch b/patches/server/0465-Improve-EntityTargetLivingEntityEvent-for-1.16-mobs.patch
index 9a07cce833..9a07cce833 100644
--- a/patches/server/0464-Improve-EntityTargetLivingEntityEvent-for-1.16-mobs.patch
+++ b/patches/server/0465-Improve-EntityTargetLivingEntityEvent-for-1.16-mobs.patch
diff --git a/patches/server/0465-Add-entity-liquid-API.patch b/patches/server/0466-Add-entity-liquid-API.patch
index bf3caa4be9..bf3caa4be9 100644
--- a/patches/server/0465-Add-entity-liquid-API.patch
+++ b/patches/server/0466-Add-entity-liquid-API.patch
diff --git a/patches/server/0466-Update-itemstack-legacy-name-and-lore.patch b/patches/server/0467-Update-itemstack-legacy-name-and-lore.patch
index b98004d198..b98004d198 100644
--- a/patches/server/0466-Update-itemstack-legacy-name-and-lore.patch
+++ b/patches/server/0467-Update-itemstack-legacy-name-and-lore.patch
diff --git a/patches/server/0467-Spawn-player-in-correct-world-on-login.patch b/patches/server/0468-Spawn-player-in-correct-world-on-login.patch
index e91f9af4e9..d8241f19f1 100644
--- a/patches/server/0467-Spawn-player-in-correct-world-on-login.patch
+++ b/patches/server/0468-Spawn-player-in-correct-world-on-login.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Spawn player in correct world on login
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 30fa9ac91be2ecc55efeee9222835cbedc53acff..4710c9d12feb12b75c497373c172ce0d4f4ab96e 100644
+index a40ca089d92df8f3ea0a444e3293531e787b196b..ed4e13528cf0fe48384efcb3f55cb5149f4cf681 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -196,7 +196,18 @@ public abstract class PlayerList {
diff --git a/patches/server/0468-Add-PrepareResultEvent.patch b/patches/server/0469-Add-PrepareResultEvent.patch
index 14a6bd3437..14a6bd3437 100644
--- a/patches/server/0468-Add-PrepareResultEvent.patch
+++ b/patches/server/0469-Add-PrepareResultEvent.patch
diff --git a/patches/server/0469-Don-t-check-chunk-for-portal-on-world-gen-entity-add.patch b/patches/server/0470-Don-t-check-chunk-for-portal-on-world-gen-entity-add.patch
index 22a49a5fd4..22a49a5fd4 100644
--- a/patches/server/0469-Don-t-check-chunk-for-portal-on-world-gen-entity-add.patch
+++ b/patches/server/0470-Don-t-check-chunk-for-portal-on-world-gen-entity-add.patch
diff --git a/patches/server/0470-Implement-Chunk-Priority-Urgency-System-for-Chunks.patch b/patches/server/0471-Implement-Chunk-Priority-Urgency-System-for-Chunks.patch
index 04d6e42446..201fbdfd4e 100644
--- a/patches/server/0470-Implement-Chunk-Priority-Urgency-System-for-Chunks.patch
+++ b/patches/server/0471-Implement-Chunk-Priority-Urgency-System-for-Chunks.patch
@@ -80,7 +80,7 @@ index 2fe519d4059fac06781c30e140895b604e13104f..35949e9c15eb998aa89842d34d0999cd
chunkData.addProperty("queued-for-unload", chunkMap.toDrop.contains(playerChunk.pos.longKey));
chunkData.addProperty("status", status == null ? "unloaded" : status.toString());
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9decd6ed8 100644
+index bab59dc2747a24ce6b48c8f962f81c50a316d89e..05814028d205f7a1e468bdaaae9e9916047ff4ce 100644
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
@@ -57,7 +57,7 @@ public class ChunkHolder {
@@ -100,7 +100,7 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
boolean isUpdateQueued = false; // Paper
private final ChunkMap chunkMap; // Paper
-@@ -407,12 +408,18 @@ public class ChunkHolder {
+@@ -409,12 +410,18 @@ public class ChunkHolder {
});
}
@@ -119,7 +119,7 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
ChunkStatus chunkstatus = ChunkHolder.getStatus(this.oldTicketLevel);
ChunkStatus chunkstatus1 = ChunkHolder.getStatus(this.ticketLevel);
boolean flag = this.oldTicketLevel <= ChunkMap.MAX_CHUNK_DISTANCE;
-@@ -423,9 +430,22 @@ public class ChunkHolder {
+@@ -425,9 +432,22 @@ public class ChunkHolder {
// ChunkUnloadEvent: Called before the chunk is unloaded: isChunkLoaded is still true and chunk can still be modified by plugins.
if (playerchunk_state.isOrAfter(ChunkHolder.FullChunkStatus.BORDER) && !playerchunk_state1.isOrAfter(ChunkHolder.FullChunkStatus.BORDER)) {
this.getFutureIfPresentUnchecked(ChunkStatus.FULL).thenAccept((either) -> {
@@ -143,7 +143,7 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
// Minecraft will apply the chunks tick lists to the world once the chunk got loaded, and then store the tick
// lists again inside the chunk once the chunk becomes inaccessible and set the chunk's needsSaving flag.
// These actions may however happen deferred, so we manually set the needsSaving flag already here.
-@@ -470,12 +490,14 @@ public class ChunkHolder {
+@@ -484,12 +504,14 @@ public class ChunkHolder {
this.scheduleFullChunkPromotion(chunkStorage, this.fullChunkFuture, executor, ChunkHolder.FullChunkStatus.BORDER);
// Paper start - cache ticking ready status
this.fullChunkFuture.thenAccept(either -> {
@@ -158,7 +158,7 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
}
});
this.updateChunkToSave(this.fullChunkFuture, "full");
-@@ -496,6 +518,7 @@ public class ChunkHolder {
+@@ -510,6 +532,7 @@ public class ChunkHolder {
this.scheduleFullChunkPromotion(chunkStorage, this.tickingChunkFuture, executor, ChunkHolder.FullChunkStatus.TICKING);
// Paper start - cache ticking ready status
this.tickingChunkFuture.thenAccept(either -> {
@@ -166,7 +166,7 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
either.ifLeft(chunk -> {
// note: Here is a very good place to add callbacks to logic waiting on this.
ChunkHolder.this.isTickingReady = true;
-@@ -531,6 +554,7 @@ public class ChunkHolder {
+@@ -545,6 +568,7 @@ public class ChunkHolder {
this.scheduleFullChunkPromotion(chunkStorage, this.entityTickingChunkFuture, executor, ChunkHolder.FullChunkStatus.ENTITY_TICKING);
// Paper start - cache ticking ready status
this.entityTickingChunkFuture.thenAccept(either -> {
@@ -174,7 +174,7 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
either.ifLeft(chunk -> {
ChunkHolder.this.isEntityTickingReady = true;
// Paper start - entity ticking chunk set
-@@ -557,16 +581,45 @@ public class ChunkHolder {
+@@ -571,16 +595,45 @@ public class ChunkHolder {
this.demoteFullChunk(chunkStorage, playerchunk_state1);
}
@@ -223,7 +223,7 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
});
}
}).exceptionally((throwable) -> {
-@@ -657,7 +710,134 @@ public class ChunkHolder {
+@@ -695,7 +748,134 @@ public class ChunkHolder {
};
}
@@ -360,10 +360,10 @@ index 347cf5d00d986ae8ad60af7f6eabde9fbfd78561..64fa9affc32057f09268a6f92dbc88c9
return this.isEntityTickingReady;
}
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9baf3977316 100644
+index 771f34b8a8b4d46343264be59da47ed4bb4cfdf5..d3d5041bddafd03e053c1bc04883c67d7d98556f 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -126,6 +126,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -127,6 +127,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
public final ServerLevel level;
private final ThreadedLevelLightEngine lightEngine;
private final BlockableEventLoop<Runnable> mainThreadExecutor;
@@ -371,7 +371,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
public ChunkGenerator generator;
public final Supplier<DimensionDataStorage> overworldDataStorage;
private final PoiManager poiManager;
-@@ -300,6 +301,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -301,6 +302,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.level = world;
this.generator = chunkGenerator;
this.mainThreadExecutor = mainThreadExecutor;
@@ -387,7 +387,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
ProcessorMailbox<Runnable> threadedmailbox = ProcessorMailbox.create(executor, "worldgen");
Objects.requireNonNull(mainThreadExecutor);
-@@ -411,6 +421,37 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -412,6 +422,37 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
});
}
@@ -425,7 +425,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
// Paper start
public void updatePlayerMobTypeMap(Entity entity) {
if (!this.level.paperConfig.perPlayerMobSpawns) {
-@@ -552,6 +593,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -553,6 +594,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
List<CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>>> list = Lists.newArrayList();
int j = centerChunk.x;
int k = centerChunk.z;
@@ -433,7 +433,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
for (int l = -margin; l <= margin; ++l) {
for (int i1 = -margin; i1 <= margin; ++i1) {
-@@ -570,6 +612,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -571,6 +613,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
ChunkStatus chunkstatus = (ChunkStatus) distanceToStatus.apply(j1);
CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = playerchunk.getOrScheduleFuture(chunkstatus, this);
@@ -448,7 +448,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
list.add(completablefuture);
}
-@@ -842,11 +892,19 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -902,11 +952,19 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
if (requiredStatus == ChunkStatus.EMPTY) {
return this.scheduleChunkLoad(chunkcoordintpair);
} else {
@@ -469,7 +469,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
if (optional.isPresent() && ((ChunkAccess) optional.get()).getStatus().isOrAfter(requiredStatus)) {
CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = requiredStatus.load(this.level, this.structureManager, this.lightEngine, (ichunkaccess) -> {
-@@ -858,6 +916,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -918,6 +976,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
} else {
return this.scheduleChunkGeneration(holder, requiredStatus);
}
@@ -477,7 +477,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
}
}
-@@ -914,14 +973,24 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -974,14 +1033,24 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
};
CompletableFuture<CompoundTag> chunkSaveFuture = this.level.asyncChunkTaskManager.getChunkSaveFuture(pos.x, pos.z);
@@ -507,7 +507,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
return ret;
// Paper end
}
-@@ -973,7 +1042,10 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1033,7 +1102,10 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.releaseLightTicket(chunkcoordintpair);
return CompletableFuture.completedFuture(Either.right(playerchunk_failure));
});
@@ -519,7 +519,7 @@ index 0bd55c5a43bfed7d5c80f6859b2827b7da3d0804..373ac9909666302fd6b9c6891866a9ba
}
protected void releaseLightTicket(ChunkPos pos) {
-@@ -1057,7 +1129,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1117,7 +1189,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
long i = chunkHolder.getPos().toLong();
Objects.requireNonNull(chunkHolder);
@@ -711,7 +711,7 @@ index 84dc1e94b4f7b8315d8422634dd49b1f85044d18..451d5e9b5906e662a0c2e04b407068ea
Ticket<ChunkPos> ticket = new Ticket<>(TicketType.FORCED, 31, pos);
long i = pos.toLong();
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index c3875acfad91c50a7fec4b1f8e06e8a32e2ea037..ca3ccf2631587a896f6b909d63889708e6f72f27 100644
+index 3f9366019d19f8fb5f636f1b301c2824a54865cd..58c22ed8e37b22b3b304139b1746b5bc8ba6f45a 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
@@ -601,6 +601,26 @@ public class ServerChunkCache extends ChunkSource {
@@ -796,10 +796,10 @@ index c3875acfad91c50a7fec4b1f8e06e8a32e2ea037..ca3ccf2631587a896f6b909d63889708
boolean flag1 = this.chunkMap.promoteChunkMap();
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 2f13055a39c26fe12d2c1094103186635e536166..84f78e2b3bf51eae1d486852464df032861c5a0b 100644
+index 4b83617a81db1749faaf49fc3ee77e44846dce1a..968b8180f92066a43f06bff8dd1d49b03bd08f5b 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-@@ -185,6 +185,7 @@ public class ServerPlayer extends Player {
+@@ -186,6 +186,7 @@ public class ServerPlayer extends Player {
private int lastRecordedArmor = Integer.MIN_VALUE;
private int lastRecordedLevel = Integer.MIN_VALUE;
private int lastRecordedExperience = Integer.MIN_VALUE;
@@ -807,7 +807,7 @@ index 2f13055a39c26fe12d2c1094103186635e536166..84f78e2b3bf51eae1d486852464df032
private float lastSentHealth = -1.0E8F;
private int lastSentFood = -99999999;
private boolean lastFoodSaturationZero = true;
-@@ -328,6 +329,21 @@ public class ServerPlayer extends Player {
+@@ -329,6 +330,21 @@ public class ServerPlayer extends Player {
this.maxHealthCache = this.getMaxHealth();
this.cachedSingleMobDistanceMap = new com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper
}
@@ -1128,7 +1128,7 @@ index 8770fe0db46b01e8b608637df4f1a669a3f4cdde..3c1698ba0d3bc412ab957777d9b5211d
private final String name;
private final Comparator<T> comparator;
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 4710c9d12feb12b75c497373c172ce0d4f4ab96e..338e89a2951f6f79d4dd7abf0b378b6e2ddf1f58 100644
+index ed4e13528cf0fe48384efcb3f55cb5149f4cf681..55b7036a7b7fe45f2b8694bf8ab039d92de1c3bb 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -175,6 +175,7 @@ public abstract class PlayerList {
@@ -1164,10 +1164,10 @@ index fb2d5c768b7dc5255db7dc7199ed750809a8fb94..9b254d00eb0cf0c4d4fe73e7a955b0b6
public float yRotO;
public float xRotO;
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index b92da719a5d35a60a2e13ccb0f55c41b242f9b50..875977f11678b34465abac30463675f57cf9fc4e 100644
+index 6a881c2abdbc23366a1b0ac69e363b196b99197b..ddf362fc14fcf83b22536b76cfc6ac1387b4c57a 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-@@ -137,7 +137,7 @@ public class LevelChunk extends ChunkAccess {
+@@ -143,7 +143,7 @@ public class LevelChunk extends ChunkAccess {
return NEIGHBOUR_CACHE_RADIUS;
}
@@ -1176,7 +1176,7 @@ index b92da719a5d35a60a2e13ccb0f55c41b242f9b50..875977f11678b34465abac30463675f5
private long neighbourChunksLoadedBitset;
private final LevelChunk[] loadedNeighbourChunks = new LevelChunk[(NEIGHBOUR_CACHE_RADIUS * 2 + 1) * (NEIGHBOUR_CACHE_RADIUS * 2 + 1)];
-@@ -675,6 +675,7 @@ public class LevelChunk extends ChunkAccess {
+@@ -681,6 +681,7 @@ public class LevelChunk extends ChunkAccess {
// CraftBukkit start
public void loadCallback() {
@@ -1184,7 +1184,7 @@ index b92da719a5d35a60a2e13ccb0f55c41b242f9b50..875977f11678b34465abac30463675f5
// Paper start - neighbour cache
int chunkX = this.chunkPos.x;
int chunkZ = this.chunkPos.z;
-@@ -729,6 +730,7 @@ public class LevelChunk extends ChunkAccess {
+@@ -735,6 +736,7 @@ public class LevelChunk extends ChunkAccess {
}
public void unloadCallback() {
diff --git a/patches/server/0471-Optimize-NetworkManager-Exception-Handling.patch b/patches/server/0472-Optimize-NetworkManager-Exception-Handling.patch
index 79d4327e4f..79d4327e4f 100644
--- a/patches/server/0471-Optimize-NetworkManager-Exception-Handling.patch
+++ b/patches/server/0472-Optimize-NetworkManager-Exception-Handling.patch
diff --git a/patches/server/0472-Optimize-the-advancement-data-player-iteration-to-be.patch b/patches/server/0473-Optimize-the-advancement-data-player-iteration-to-be.patch
index f60ffe8b92..f60ffe8b92 100644
--- a/patches/server/0472-Optimize-the-advancement-data-player-iteration-to-be.patch
+++ b/patches/server/0473-Optimize-the-advancement-data-player-iteration-to-be.patch
diff --git a/patches/server/0473-Fix-arrows-never-despawning-MC-125757.patch b/patches/server/0474-Fix-arrows-never-despawning-MC-125757.patch
index 85c6131304..85c6131304 100644
--- a/patches/server/0473-Fix-arrows-never-despawning-MC-125757.patch
+++ b/patches/server/0474-Fix-arrows-never-despawning-MC-125757.patch
diff --git a/patches/server/0474-Thread-Safe-Vanilla-Command-permission-checking.patch b/patches/server/0475-Thread-Safe-Vanilla-Command-permission-checking.patch
index 834506f5be..834506f5be 100644
--- a/patches/server/0474-Thread-Safe-Vanilla-Command-permission-checking.patch
+++ b/patches/server/0475-Thread-Safe-Vanilla-Command-permission-checking.patch
diff --git a/patches/server/0475-Move-range-check-for-block-placing-up.patch b/patches/server/0476-Move-range-check-for-block-placing-up.patch
index f7c7d2dd76..f7c7d2dd76 100644
--- a/patches/server/0475-Move-range-check-for-block-placing-up.patch
+++ b/patches/server/0476-Move-range-check-for-block-placing-up.patch
diff --git a/patches/server/0476-Fix-SPIGOT-5989.patch b/patches/server/0477-Fix-SPIGOT-5989.patch
index 14228d6834..1d73b6dc79 100644
--- a/patches/server/0476-Fix-SPIGOT-5989.patch
+++ b/patches/server/0477-Fix-SPIGOT-5989.patch
@@ -10,7 +10,7 @@ This fixes that by checking if the modified spawn location is
still at a respawn anchor.
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 338e89a2951f6f79d4dd7abf0b378b6e2ddf1f58..2320731041fdef4eb29888a55e11126fb345d9ea 100644
+index 55b7036a7b7fe45f2b8694bf8ab039d92de1c3bb..e655c806504d6e127e15dca479271d9b211975a3 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -78,6 +78,7 @@ import net.minecraft.world.level.GameRules;
@@ -21,7 +21,7 @@ index 338e89a2951f6f79d4dd7abf0b378b6e2ddf1f58..2320731041fdef4eb29888a55e11126f
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.border.BorderChangeListener;
import net.minecraft.world.level.border.WorldBorder;
-@@ -829,6 +830,7 @@ public abstract class PlayerList {
+@@ -830,6 +831,7 @@ public abstract class PlayerList {
// Paper start
boolean isBedSpawn = false;
boolean isRespawn = false;
@@ -29,7 +29,7 @@ index 338e89a2951f6f79d4dd7abf0b378b6e2ddf1f58..2320731041fdef4eb29888a55e11126f
// Paper end
// CraftBukkit start - fire PlayerRespawnEvent
-@@ -839,7 +841,7 @@ public abstract class PlayerList {
+@@ -840,7 +842,7 @@ public abstract class PlayerList {
Optional optional;
if (blockposition != null) {
@@ -38,7 +38,7 @@ index 338e89a2951f6f79d4dd7abf0b378b6e2ddf1f58..2320731041fdef4eb29888a55e11126f
} else {
optional = Optional.empty();
}
-@@ -883,7 +885,12 @@ public abstract class PlayerList {
+@@ -884,7 +886,12 @@ public abstract class PlayerList {
}
// Spigot End
@@ -52,7 +52,7 @@ index 338e89a2951f6f79d4dd7abf0b378b6e2ddf1f58..2320731041fdef4eb29888a55e11126f
if (!flag) entityplayer.reset(); // SPIGOT-4785
isRespawn = true; // Paper
} else {
-@@ -921,8 +928,12 @@ public abstract class PlayerList {
+@@ -922,8 +929,12 @@ public abstract class PlayerList {
}
// entityplayer1.initInventoryMenu();
entityplayer1.setHealth(entityplayer1.getHealth());
diff --git a/patches/server/0477-Fix-SPIGOT-5824-Bukkit-world-container-is-not-used.patch b/patches/server/0478-Fix-SPIGOT-5824-Bukkit-world-container-is-not-used.patch
index 86102faf60..86102faf60 100644
--- a/patches/server/0477-Fix-SPIGOT-5824-Bukkit-world-container-is-not-used.patch
+++ b/patches/server/0478-Fix-SPIGOT-5824-Bukkit-world-container-is-not-used.patch
diff --git a/patches/server/0478-Fix-SPIGOT-5885-Unable-to-disable-advancements.patch b/patches/server/0479-Fix-SPIGOT-5885-Unable-to-disable-advancements.patch
index 5f3e63546b..5f3e63546b 100644
--- a/patches/server/0478-Fix-SPIGOT-5885-Unable-to-disable-advancements.patch
+++ b/patches/server/0479-Fix-SPIGOT-5885-Unable-to-disable-advancements.patch
diff --git a/patches/server/0479-Fix-AdvancementDataPlayer-leak-due-from-quitting-ear.patch b/patches/server/0480-Fix-AdvancementDataPlayer-leak-due-from-quitting-ear.patch
index 0cccf4b597..0cccf4b597 100644
--- a/patches/server/0479-Fix-AdvancementDataPlayer-leak-due-from-quitting-ear.patch
+++ b/patches/server/0480-Fix-AdvancementDataPlayer-leak-due-from-quitting-ear.patch
diff --git a/patches/server/0480-Add-missing-strikeLighting-call-to-World-spigot-stri.patch b/patches/server/0481-Add-missing-strikeLighting-call-to-World-spigot-stri.patch
index 88219897ac..88219897ac 100644
--- a/patches/server/0480-Add-missing-strikeLighting-call-to-World-spigot-stri.patch
+++ b/patches/server/0481-Add-missing-strikeLighting-call-to-World-spigot-stri.patch
diff --git a/patches/server/0481-Fix-some-rails-connecting-improperly.patch b/patches/server/0482-Fix-some-rails-connecting-improperly.patch
index 8de7ddf603..8de7ddf603 100644
--- a/patches/server/0481-Fix-some-rails-connecting-improperly.patch
+++ b/patches/server/0482-Fix-some-rails-connecting-improperly.patch
diff --git a/patches/server/0482-Fix-regex-mistake-in-CB-NBT-int-deserialization.patch b/patches/server/0483-Fix-regex-mistake-in-CB-NBT-int-deserialization.patch
index be48fd5ae2..be48fd5ae2 100644
--- a/patches/server/0482-Fix-regex-mistake-in-CB-NBT-int-deserialization.patch
+++ b/patches/server/0483-Fix-regex-mistake-in-CB-NBT-int-deserialization.patch
diff --git a/patches/server/0483-Do-not-let-the-server-load-chunks-from-newer-version.patch b/patches/server/0484-Do-not-let-the-server-load-chunks-from-newer-version.patch
index 2fa64e3aff..2fa64e3aff 100644
--- a/patches/server/0483-Do-not-let-the-server-load-chunks-from-newer-version.patch
+++ b/patches/server/0484-Do-not-let-the-server-load-chunks-from-newer-version.patch
diff --git a/patches/server/0484-Brand-support.patch b/patches/server/0485-Brand-support.patch
index 03b69330c8..03b69330c8 100644
--- a/patches/server/0484-Brand-support.patch
+++ b/patches/server/0485-Brand-support.patch
diff --git a/patches/server/0485-Add-setMaxPlayers-API.patch b/patches/server/0486-Add-setMaxPlayers-API.patch
index d06bf0fdf3..aabc588375 100644
--- a/patches/server/0485-Add-setMaxPlayers-API.patch
+++ b/patches/server/0486-Add-setMaxPlayers-API.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add #setMaxPlayers API
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 2320731041fdef4eb29888a55e11126fb345d9ea..310bed27c04ef812aa8607c9dca789db13341d25 100644
+index e655c806504d6e127e15dca479271d9b211975a3..5c829538a008f1a737380627f7b88c7a0914050f 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -144,7 +144,7 @@ public abstract class PlayerList {
diff --git a/patches/server/0486-Add-playPickupItemAnimation-to-LivingEntity.patch b/patches/server/0487-Add-playPickupItemAnimation-to-LivingEntity.patch
index 9efead6d4e..9efead6d4e 100644
--- a/patches/server/0486-Add-playPickupItemAnimation-to-LivingEntity.patch
+++ b/patches/server/0487-Add-playPickupItemAnimation-to-LivingEntity.patch
diff --git a/patches/server/0487-Don-t-require-FACING-data.patch b/patches/server/0488-Don-t-require-FACING-data.patch
index e1c274797e..e1c274797e 100644
--- a/patches/server/0487-Don-t-require-FACING-data.patch
+++ b/patches/server/0488-Don-t-require-FACING-data.patch
diff --git a/patches/server/0488-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch b/patches/server/0489-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch
index 2e27feae73..62329967f5 100644
--- a/patches/server/0488-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch
+++ b/patches/server/0489-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Fix SpawnChangeEvent not firing for all use-cases
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index a5f0fe87bd5d75bf9a12ef284b0d635d8f6dd3a1..64f5901049258c327e3fef8723da58756ce05cc6 100644
+index d55d2627b7e0c847250c551989d438280bef9ab8..5c98b61c08464cc78be34d1567eff7005f6ab2df 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1689,6 +1689,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1720,6 +1720,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
//ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(new BlockPosition(this.worldData.a(), 0, this.worldData.c()));
this.levelData.setSpawn(pos, angle);
diff --git a/patches/server/0489-Add-moon-phase-API.patch b/patches/server/0490-Add-moon-phase-API.patch
index 1d31d3db9a..1d31d3db9a 100644
--- a/patches/server/0489-Add-moon-phase-API.patch
+++ b/patches/server/0490-Add-moon-phase-API.patch
diff --git a/patches/server/0490-Improve-Chunk-Status-Transition-Speed.patch b/patches/server/0491-Improve-Chunk-Status-Transition-Speed.patch
index 0dd52b7752..48697d05b7 100644
--- a/patches/server/0490-Improve-Chunk-Status-Transition-Speed.patch
+++ b/patches/server/0491-Improve-Chunk-Status-Transition-Speed.patch
@@ -36,13 +36,13 @@ scenario / path:
Previously would have hopped to SERVER around 12+ times there extra.
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-index 64fa9affc32057f09268a6f92dbc88c9decd6ed8..6782e2b100b1619016c637a9e71f9e880ff974e1 100644
+index 05814028d205f7a1e468bdaaae9e9916047ff4ce..8950470bbaa57ac0ef6ca4d6e3796a712e0b6cd6 100644
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-@@ -85,6 +85,13 @@ public class ChunkHolder {
- this.playersInChunkTickRange = this.chunkMap.playerChunkTickRangeMap.getObjectsInRange(key);
- }
+@@ -87,6 +87,13 @@ public class ChunkHolder {
// Paper end - optimise isOutsideOfRange
+ long lastAutoSaveTime; // Paper - incremental autosave
+ long inactiveTimeStart; // Paper - incremental autosave
+ // Paper start - optimize chunk status progression without jumping through thread pool
+ public boolean canAdvanceStatus() {
+ ChunkStatus status = getChunkHolderStatus();
@@ -54,10 +54,10 @@ index 64fa9affc32057f09268a6f92dbc88c9decd6ed8..6782e2b100b1619016c637a9e71f9e88
public ChunkHolder(ChunkPos pos, int level, LevelHeightAccessor world, LevelLightEngine lightingProvider, ChunkHolder.LevelChangeListener levelUpdateListener, ChunkHolder.PlayerProvider playersWatchingChunkProvider) {
this.futures = new AtomicReferenceArray(ChunkHolder.CHUNK_STATUSES.size());
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 373ac9909666302fd6b9c6891866a9baf3977316..c637a9b0a978700a0cd941be22208ae3c01f6eb2 100644
+index d3d5041bddafd03e053c1bc04883c67d7d98556f..b75ad5ee074489e3c66ef6524106241c6d577916 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -662,7 +662,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -663,7 +663,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
return either.mapLeft((list) -> {
return (LevelChunk) list.get(list.size() / 2);
});
@@ -66,7 +66,7 @@ index 373ac9909666302fd6b9c6891866a9baf3977316..c637a9b0a978700a0cd941be22208ae3
}
@Nullable
-@@ -1013,6 +1013,12 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1073,6 +1073,12 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
return "chunkGenerate " + requiredStatus.getName();
});
Executor executor = (runnable) -> {
diff --git a/patches/server/0491-Prevent-headless-pistons-from-being-created.patch b/patches/server/0492-Prevent-headless-pistons-from-being-created.patch
index 1858ab2753..9361ff6c4a 100644
--- a/patches/server/0491-Prevent-headless-pistons-from-being-created.patch
+++ b/patches/server/0492-Prevent-headless-pistons-from-being-created.patch
@@ -6,13 +6,14 @@ Subject: [PATCH] Prevent headless pistons from being created
Prevent headless pistons from being created by explosions or tree/mushroom growth.
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
-index ebbbffd209c6796bc608992e293035141a122d1f..fdd8bf9eb44829c41483cf2de4c977a32face97f 100644
+index 4fb6b2153117f54a2b0ca940de4c0ee2fa85e20e..09755771f8a3b2f696dc9c33916546fc1d5ac4ba 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
-@@ -458,4 +458,9 @@ public class PaperConfig {
- set("settings.unsupported-settings.allow-tnt-duplication", null);
+@@ -468,4 +468,10 @@ public class PaperConfig {
+ maxPlayerAutoSavePerTick = (playerAutoSaveRate == -1 || playerAutoSaveRate > 100) ? 10 : 20;
+ }
}
-
++
+ public static boolean allowHeadlessPistons;
+ private static void allowHeadlessPistons() {
+ config.set("settings.unsupported-settings.allow-headless-pistons-readme", "This setting controls if players should be able to create headless pistons.");
diff --git a/patches/server/0492-Add-BellRingEvent.patch b/patches/server/0493-Add-BellRingEvent.patch
index e101aa373c..e101aa373c 100644
--- a/patches/server/0492-Add-BellRingEvent.patch
+++ b/patches/server/0493-Add-BellRingEvent.patch
diff --git a/patches/server/0493-Add-zombie-targets-turtle-egg-config.patch b/patches/server/0494-Add-zombie-targets-turtle-egg-config.patch
index 9abdec115c..8fd9834dc6 100644
--- a/patches/server/0493-Add-zombie-targets-turtle-egg-config.patch
+++ b/patches/server/0494-Add-zombie-targets-turtle-egg-config.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add zombie targets turtle egg config
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 845f105457d659a4bd88d4a8ce91b20d6abb7865..0521d5f9eba13ade77b578dd4eb5addd267dd4b9 100644
+index bf0c6e1b2b1934bc3fa5c17c414b3730c5ac0833..fc788071f01310647a227d12c81dc62a43e64ef5 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -56,6 +56,11 @@ public class PaperWorldConfig {
diff --git a/patches/server/0494-Buffer-joins-to-world.patch b/patches/server/0495-Buffer-joins-to-world.patch
index 707da7529f..80114c30ef 100644
--- a/patches/server/0494-Buffer-joins-to-world.patch
+++ b/patches/server/0495-Buffer-joins-to-world.patch
@@ -8,7 +8,7 @@ the world per tick, this attempts to reduce the impact that join floods
has on the server
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
-index fdd8bf9eb44829c41483cf2de4c977a32face97f..9a66cddbf9863aa6ff566a337153883c07c08e41 100644
+index 09755771f8a3b2f696dc9c33916546fc1d5ac4ba..16d6ce24031590ff9dfba5c938aeb9755704798d 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
@@ -91,6 +91,11 @@ public class PaperConfig {
diff --git a/patches/server/0495-Optimize-redstone-algorithm.patch b/patches/server/0496-Optimize-redstone-algorithm.patch
index aed88ac1e3..18f92de509 100644
--- a/patches/server/0495-Optimize-redstone-algorithm.patch
+++ b/patches/server/0496-Optimize-redstone-algorithm.patch
@@ -19,7 +19,7 @@ Aside from making the obvious class/function renames and obfhelpers I didn't nee
Just added Bukkit's event system and took a few liberties with dead code and comment misspellings.
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 0521d5f9eba13ade77b578dd4eb5addd267dd4b9..bc93318246eab1da5462aa3fa0cde4c100622f4e 100644
+index fc788071f01310647a227d12c81dc62a43e64ef5..aee981e967bfb32a531d5d79213c5d165bb64ad0 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -61,6 +61,16 @@ public class PaperWorldConfig {
diff --git a/patches/server/0496-Fix-hex-colors-not-working-in-some-kick-messages.patch b/patches/server/0497-Fix-hex-colors-not-working-in-some-kick-messages.patch
index 31e71d4263..31e71d4263 100644
--- a/patches/server/0496-Fix-hex-colors-not-working-in-some-kick-messages.patch
+++ b/patches/server/0497-Fix-hex-colors-not-working-in-some-kick-messages.patch
diff --git a/patches/server/0497-PortalCreateEvent-needs-to-know-its-entity.patch b/patches/server/0498-PortalCreateEvent-needs-to-know-its-entity.patch
index d1abf96af1..d1abf96af1 100644
--- a/patches/server/0497-PortalCreateEvent-needs-to-know-its-entity.patch
+++ b/patches/server/0498-PortalCreateEvent-needs-to-know-its-entity.patch
diff --git a/patches/server/0498-Fix-CraftTeam-null-check.patch b/patches/server/0499-Fix-CraftTeam-null-check.patch
index 61de747dfd..61de747dfd 100644
--- a/patches/server/0498-Fix-CraftTeam-null-check.patch
+++ b/patches/server/0499-Fix-CraftTeam-null-check.patch
diff --git a/patches/server/0499-Add-more-Evoker-API.patch b/patches/server/0500-Add-more-Evoker-API.patch
index 367e900e25..367e900e25 100644
--- a/patches/server/0499-Add-more-Evoker-API.patch
+++ b/patches/server/0500-Add-more-Evoker-API.patch
diff --git a/patches/server/0500-Incremental-player-saving.patch b/patches/server/0500-Incremental-player-saving.patch
deleted file mode 100644
index 998a6a69f9..0000000000
--- a/patches/server/0500-Incremental-player-saving.patch
+++ /dev/null
@@ -1,126 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar <[email protected]>
-Date: Sun, 9 Aug 2020 08:59:25 +0300
-Subject: [PATCH] Incremental player saving
-
-
-diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
-index 9a66cddbf9863aa6ff566a337153883c07c08e41..b6c7aec1516a4db4fde8c9ec2772cd982ed5e304 100644
---- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
-+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
-@@ -468,4 +468,15 @@ public class PaperConfig {
- config.set("settings.unsupported-settings.allow-headless-pistons-readme", "This setting controls if players should be able to create headless pistons.");
- allowHeadlessPistons = getBoolean("settings.unsupported-settings.allow-headless-pistons", false);
- }
-+
-+ public static int playerAutoSaveRate = -1;
-+ public static int maxPlayerAutoSavePerTick = 10;
-+ private static void playerAutoSaveRate() {
-+ playerAutoSaveRate = getInt("settings.player-auto-save-rate", -1);
-+ maxPlayerAutoSavePerTick = getInt("settings.max-player-auto-save-per-tick", -1);
-+ if (maxPlayerAutoSavePerTick == -1) { // -1 Automatic / "Recommended"
-+ // 10 should be safe for everyone unless you mass spamming player auto save
-+ maxPlayerAutoSavePerTick = (playerAutoSaveRate == -1 || playerAutoSaveRate > 100) ? 10 : 20;
-+ }
-+ }
- }
-diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 4351dd9c293d1db48c87c5df28bcb2b9a59583f7..7f733bd666e42f8ba80bfda233f662564bfc0e24 100644
---- a/src/main/java/net/minecraft/server/MinecraftServer.java
-+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -896,12 +896,17 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- return flag3;
- }
-
-+ // Paper start
- public boolean saveEverything(boolean suppressLogs, boolean flush, boolean force) {
-+ return saveEverything(suppressLogs, flush, force, -1);
-+ }
-+ public boolean saveEverything(boolean suppressLogs, boolean flush, boolean force, int playerSaveInterval) {
-+ // Paper end
- boolean flag3;
-
- try {
- this.isSaving = true;
-- this.getPlayerList().saveAll();
-+ this.getPlayerList().saveAll(playerSaveInterval); // Paper
- flag3 = this.saveAllChunks(suppressLogs, flush, force);
- } finally {
- this.isSaving = false;
-@@ -963,7 +968,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- this.isSaving = true;
- if (this.playerList != null) {
- MinecraftServer.LOGGER.info("Saving players");
-- this.playerList.saveAll();
- this.playerList.removeAll(this.isRestarting); // Paper
- try { Thread.sleep(100); } catch (InterruptedException ex) {} // CraftBukkit - SPIGOT-625 - give server at least a chance to send packets
- }
-@@ -1408,13 +1412,19 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- }
- }
-
-+ // Paper start
-+ int playerSaveInterval = com.destroystokyo.paper.PaperConfig.playerAutoSaveRate;
-+ if (playerSaveInterval < 0) {
-+ playerSaveInterval = autosavePeriod;
-+ }
-+ // Paper end
- if (this.autosavePeriod > 0 && this.tickCount % this.autosavePeriod == 0) { // CraftBukkit
- MinecraftServer.LOGGER.debug("Autosave started");
- this.profiler.push("save");
-- this.saveEverything(true, false, false);
-+ this.saveEverything(true, false, false, playerSaveInterval); // Paper
- this.profiler.pop();
- MinecraftServer.LOGGER.debug("Autosave finished");
-- }
-+ } else this.getPlayerList().saveAll(playerSaveInterval); // Paper
- io.papermc.paper.util.CachedLists.reset(); // Paper
- // Paper start - move executeAll() into full server tick timing
- try (co.aikar.timings.Timing ignored = MinecraftTimings.processTasksTimer.startTiming()) {
-diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 84f78e2b3bf51eae1d486852464df032861c5a0b..968b8180f92066a43f06bff8dd1d49b03bd08f5b 100644
---- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
-+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-@@ -171,6 +171,7 @@ public class ServerPlayer extends Player {
- public final int getViewDistance() { return this.getLevel().getChunkSource().chunkMap.viewDistance - 1; } // Paper - placeholder
-
- private static final Logger LOGGER = LogManager.getLogger();
-+ public long lastSave = MinecraftServer.currentTick; // Paper
- private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32;
- private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10;
- public ServerGamePacketListenerImpl connection;
-diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 310bed27c04ef812aa8607c9dca789db13341d25..2cd1dace84b6e821df69d28aa7cdb7ff41c8f076 100644
---- a/src/main/java/net/minecraft/server/players/PlayerList.java
-+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -569,6 +569,7 @@ public abstract class PlayerList {
- protected void save(ServerPlayer player) {
- if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit
- if (!player.didPlayerJoinEvent) return; // Paper - If we never fired PJE, we disconnected during login. Data has not changed, and additionally, our saved vehicle is not loaded! If we save now, we will lose our vehicle (CraftBukkit bug)
-+ player.lastSave = MinecraftServer.currentTick; // Paper
- this.playerIo.save(player);
- ServerStatsCounter serverstatisticmanager = (ServerStatsCounter) player.getStats(); // CraftBukkit
-
-@@ -1181,10 +1182,21 @@ public abstract class PlayerList {
- }
-
- public void saveAll() {
-+ // Paper start - incremental player saving
-+ saveAll(-1);
-+ }
-+ public void saveAll(int interval) {
- net.minecraft.server.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main
- MinecraftTimings.savePlayers.startTiming(); // Paper
-+ int numSaved = 0;
-+ long now = MinecraftServer.currentTick;
- for (int i = 0; i < this.players.size(); ++i) {
-- this.save(this.players.get(i));
-+ ServerPlayer entityplayer = this.players.get(i);
-+ if (interval == -1 || now - entityplayer.lastSave >= interval) {
-+ this.save(entityplayer);
-+ if (interval != -1 && ++numSaved <= com.destroystokyo.paper.PaperConfig.maxPlayerAutoSavePerTick) { break; }
-+ }
-+ // Paper end
- }
- MinecraftTimings.savePlayers.stopTiming(); // Paper
- return null; }); // Paper - ensure main
diff --git a/patches/server/0503-Cache-block-data-strings.patch b/patches/server/0503-Cache-block-data-strings.patch
index cde2b222d4..335ba40e3f 100644
--- a/patches/server/0503-Cache-block-data-strings.patch
+++ b/patches/server/0503-Cache-block-data-strings.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Cache block data strings
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 7f733bd666e42f8ba80bfda233f662564bfc0e24..4d90ebf13e8ad2dd77175fcdc15a0e84a58ff081 100644
+index 8a3583bcf2d2a694b30718062bc7f2e1158c9b4f..807fd27bc1fa0ddb7b6bde63b15c331944d51ded 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1973,6 +1973,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1977,6 +1977,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
this.getPlayerList().reloadResources();
this.functionManager.replaceLibrary(this.resources.getFunctionLibrary());
this.structureManager.onResourceManagerReload(this.resources.getResourceManager());
diff --git a/patches/server/0507-Extend-block-drop-capture-to-capture-all-items-added.patch b/patches/server/0507-Extend-block-drop-capture-to-capture-all-items-added.patch
index f6c5ab16ac..16a20d8a79 100644
--- a/patches/server/0507-Extend-block-drop-capture-to-capture-all-items-added.patch
+++ b/patches/server/0507-Extend-block-drop-capture-to-capture-all-items-added.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Extend block drop capture to capture all items added to the
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 64f5901049258c327e3fef8723da58756ce05cc6..22e8a349254bcf6ba39fcede60bc59d5b7190cf2 100644
+index 5c98b61c08464cc78be34d1567eff7005f6ab2df..313a368eb5d09b0c4d45b5da34d72390d86332c5 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1226,6 +1226,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1257,6 +1257,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
// WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getKey(entity.getType())); // CraftBukkit
return false;
} else {
diff --git a/patches/server/0508-Don-t-mark-dirty-in-invalid-locations-SPIGOT-6086.patch b/patches/server/0508-Don-t-mark-dirty-in-invalid-locations-SPIGOT-6086.patch
index 093dedd6d9..7d017eb965 100644
--- a/patches/server/0508-Don-t-mark-dirty-in-invalid-locations-SPIGOT-6086.patch
+++ b/patches/server/0508-Don-t-mark-dirty-in-invalid-locations-SPIGOT-6086.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Don't mark dirty in invalid locations (SPIGOT-6086)
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-index 6782e2b100b1619016c637a9e71f9e880ff974e1..41333234cdda8127a239f591d8d2cd304e341852 100644
+index 8950470bbaa57ac0ef6ca4d6e3796a712e0b6cd6..b493769dd420f0dd93fdf8184c452c53cb63e95b 100644
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-@@ -227,6 +227,7 @@ public class ChunkHolder {
+@@ -229,6 +229,7 @@ public class ChunkHolder {
}
public void blockChanged(BlockPos pos) {
diff --git a/patches/server/0512-Fix-deop-kicking-non-whitelisted-player-when-white-l.patch b/patches/server/0512-Fix-deop-kicking-non-whitelisted-player-when-white-l.patch
index 1e9c0f3536..be5e6cf57f 100644
--- a/patches/server/0512-Fix-deop-kicking-non-whitelisted-player-when-white-l.patch
+++ b/patches/server/0512-Fix-deop-kicking-non-whitelisted-player-when-white-l.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Fix deop kicking non-whitelisted player when white list is
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 4d90ebf13e8ad2dd77175fcdc15a0e84a58ff081..d8c1bb347608eaea3741525602613bebd5f54c6b 100644
+index 807fd27bc1fa0ddb7b6bde63b15c331944d51ded..ff1bbd57c6a3e7a3ab78b9c0c0106230a9d13d35 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -2039,13 +2039,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -2043,13 +2043,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
if (this.isEnforceWhitelist()) {
PlayerList playerlist = source.getServer().getPlayerList();
UserWhiteList whitelist = playerlist.getWhiteList();
diff --git a/patches/server/0568-Added-ServerResourcesReloadedEvent.patch b/patches/server/0568-Added-ServerResourcesReloadedEvent.patch
index 119113d900..cf80df01d5 100644
--- a/patches/server/0568-Added-ServerResourcesReloadedEvent.patch
+++ b/patches/server/0568-Added-ServerResourcesReloadedEvent.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Added ServerResourcesReloadedEvent
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index d8c1bb347608eaea3741525602613bebd5f54c6b..0a09dbbd062df44062c19b8e6898a858f94377ac 100644
+index ff1bbd57c6a3e7a3ab78b9c0c0106230a9d13d35..b9edcaf7aecd73e3fea605088b8577126f03f380 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1952,7 +1952,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1956,7 +1956,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
return this.functionManager;
}
@@ -22,7 +22,7 @@ index d8c1bb347608eaea3741525602613bebd5f54c6b..0a09dbbd062df44062c19b8e6898a858
CompletableFuture<Void> completablefuture = CompletableFuture.supplyAsync(() -> {
Stream<String> stream = datapacks.stream(); // CraftBukkit - decompile error
PackRepository resourcepackrepository = this.packRepository;
-@@ -1968,6 +1974,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1972,6 +1978,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
this.packRepository.setSelected(datapacks);
this.worldData.setDataPackConfig(MinecraftServer.getSelectedPacks(this.packRepository));
datapackresources.updateGlobals();
diff --git a/patches/server/0569-Added-world-settings-for-mobs-picking-up-loot.patch b/patches/server/0569-Added-world-settings-for-mobs-picking-up-loot.patch
index 6e7384c817..536d06472d 100644
--- a/patches/server/0569-Added-world-settings-for-mobs-picking-up-loot.patch
+++ b/patches/server/0569-Added-world-settings-for-mobs-picking-up-loot.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Added world settings for mobs picking up loot
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 98e7bd4c85ed9f6bb063dfc3b0e4b80150a86835..53681d342935feb4d0f0428df751a4f8004e783e 100644
+index 3ad93abb830d307a0d2cf8cb4554bf3fa37cb91d..556bf08491466a061119338a05d6165d041e6668 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -673,6 +673,14 @@ public class PaperWorldConfig {
+@@ -688,6 +688,14 @@ public class PaperWorldConfig {
phantomOnlyAttackInsomniacs = getBoolean("phantoms-only-attack-insomniacs", phantomOnlyAttackInsomniacs);
}
diff --git a/patches/server/0576-Remove-stale-POIs.patch b/patches/server/0576-Remove-stale-POIs.patch
index fbe61a418b..1de2e35ea1 100644
--- a/patches/server/0576-Remove-stale-POIs.patch
+++ b/patches/server/0576-Remove-stale-POIs.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Remove stale POIs
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 22e8a349254bcf6ba39fcede60bc59d5b7190cf2..e50d5850f02a8217c3ff56b3ff1627ade8546980 100644
+index 313a368eb5d09b0c4d45b5da34d72390d86332c5..2dddc0160c758decc257aeada11adeeaaad59629 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1769,6 +1769,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1800,6 +1800,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
});
optional1.ifPresent((villageplacetype) -> {
this.getServer().execute(() -> {
diff --git a/patches/server/0584-Configurable-max-leash-distance.patch b/patches/server/0584-Configurable-max-leash-distance.patch
index 8441617582..f434b74aa4 100644
--- a/patches/server/0584-Configurable-max-leash-distance.patch
+++ b/patches/server/0584-Configurable-max-leash-distance.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Configurable max leash distance
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 44319f7ebd5e97435b4a4068d638946b74159cf1..64109ad34919f851d112df5f39aba31bfc386957 100644
+index a1c0b9770f4f9b84778db9b42c097af146485420..e1bb630f2352a30e351c7e1535ff82fd93849609 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -287,6 +287,12 @@ public class PaperWorldConfig {
+@@ -302,6 +302,12 @@ public class PaperWorldConfig {
}
}
diff --git a/patches/server/0588-Add-toggle-for-always-placing-the-dragon-egg.patch b/patches/server/0588-Add-toggle-for-always-placing-the-dragon-egg.patch
index d698cc3ffc..8df477f130 100644
--- a/patches/server/0588-Add-toggle-for-always-placing-the-dragon-egg.patch
+++ b/patches/server/0588-Add-toggle-for-always-placing-the-dragon-egg.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add toggle for always placing the dragon egg
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 64109ad34919f851d112df5f39aba31bfc386957..686a649b23e81c36ae392c79c736eafe22be0c54 100644
+index e1bb630f2352a30e351c7e1535ff82fd93849609..d891a7d54688a10fe4fe16f2f5037a57a9c58e86 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -706,6 +706,11 @@ public class PaperWorldConfig {
+@@ -721,6 +721,11 @@ public class PaperWorldConfig {
perPlayerMobSpawns = getBoolean("per-player-mob-spawns", true);
}
diff --git a/patches/server/0591-Skip-distance-map-update-when-spawning-disabled.patch b/patches/server/0591-Skip-distance-map-update-when-spawning-disabled.patch
index ac94ef25b7..d41b951efc 100644
--- a/patches/server/0591-Skip-distance-map-update-when-spawning-disabled.patch
+++ b/patches/server/0591-Skip-distance-map-update-when-spawning-disabled.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Skip distance map update when spawning disabled.
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index ca3ccf2631587a896f6b909d63889708e6f72f27..930291a0844acbd0491e641008727223b0010a60 100644
+index 58c22ed8e37b22b3b304139b1746b5bc8ba6f45a..59d7f93c9364571edf2e7b613a57f8f28989cb56 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-@@ -957,7 +957,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -966,7 +966,7 @@ public class ServerChunkCache extends ChunkSource {
int l = this.distanceManager.getNaturalSpawnChunkCount();
// Paper start - per player mob spawning
NaturalSpawner.SpawnState spawnercreature_d; // moved down
diff --git a/patches/server/0594-EntityMoveEvent.patch b/patches/server/0594-EntityMoveEvent.patch
index 1ff3b72221..53599239e4 100644
--- a/patches/server/0594-EntityMoveEvent.patch
+++ b/patches/server/0594-EntityMoveEvent.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] EntityMoveEvent
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 0a09dbbd062df44062c19b8e6898a858f94377ac..6fcd166096ad94954ec0868e5d26dc0b76cfd3d2 100644
+index b9edcaf7aecd73e3fea605088b8577126f03f380..643b4901b854d48275cbc8e8d5ff7a28d9b0aa00 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1499,6 +1499,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1503,6 +1503,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
while (iterator.hasNext()) {
ServerLevel worldserver = (ServerLevel) iterator.next();
worldserver.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper
@@ -17,7 +17,7 @@ index 0a09dbbd062df44062c19b8e6898a858f94377ac..6fcd166096ad94954ec0868e5d26dc0b
this.profiler.push(() -> {
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index e50d5850f02a8217c3ff56b3ff1627ade8546980..bfedc4aab1a991d0cffca8e7a816c87c81c6f8d9 100644
+index 2dddc0160c758decc257aeada11adeeaaad59629..f7bccad8b029133377f0e3ae81619ec72055d265 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -205,6 +205,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
diff --git a/patches/server/0595-added-option-to-disable-pathfinding-updates-on-block.patch b/patches/server/0595-added-option-to-disable-pathfinding-updates-on-block.patch
index 16852f19da..554e8dd7f3 100644
--- a/patches/server/0595-added-option-to-disable-pathfinding-updates-on-block.patch
+++ b/patches/server/0595-added-option-to-disable-pathfinding-updates-on-block.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] added option to disable pathfinding updates on block changes
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 686a649b23e81c36ae392c79c736eafe22be0c54..168dd88fd1fabff8e63e6429e989dabe2c40cbfa 100644
+index d891a7d54688a10fe4fe16f2f5037a57a9c58e86..84a3d8ee365d05fb2ab7c8550e4880fd5d332846 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -711,6 +711,11 @@ public class PaperWorldConfig {
+@@ -726,6 +726,11 @@ public class PaperWorldConfig {
enderDragonsDeathAlwaysPlacesDragonEgg = getBoolean("ender-dragons-death-always-places-dragon-egg", enderDragonsDeathAlwaysPlacesDragonEgg);
}
@@ -21,10 +21,10 @@ index 686a649b23e81c36ae392c79c736eafe22be0c54..168dd88fd1fabff8e63e6429e989dabe
public boolean phantomOnlyAttackInsomniacs = true;
private void phantomSettings() {
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index bfedc4aab1a991d0cffca8e7a816c87c81c6f8d9..3a776dc937d5ea08f5f7343799b00a67af197d2f 100644
+index f7bccad8b029133377f0e3ae81619ec72055d265..955f1f14ba7dca04d928a35db83c9b55133caa85 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1360,6 +1360,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1391,6 +1391,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@Override
public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) {
this.getChunkSource().blockChanged(pos);
@@ -32,7 +32,7 @@ index bfedc4aab1a991d0cffca8e7a816c87c81c6f8d9..3a776dc937d5ea08f5f7343799b00a67
VoxelShape voxelshape = oldState.getCollisionShape(this, pos);
VoxelShape voxelshape1 = newState.getCollisionShape(this, pos);
-@@ -1387,6 +1388,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1418,6 +1419,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
}
diff --git a/patches/server/0614-Allow-using-signs-inside-spawn-protection.patch b/patches/server/0614-Allow-using-signs-inside-spawn-protection.patch
index f7223693e9..4706835e36 100644
--- a/patches/server/0614-Allow-using-signs-inside-spawn-protection.patch
+++ b/patches/server/0614-Allow-using-signs-inside-spawn-protection.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Allow using signs inside spawn protection
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 168dd88fd1fabff8e63e6429e989dabe2c40cbfa..85203627790204cf899f955781b4e876e23e0809 100644
+index 84a3d8ee365d05fb2ab7c8550e4880fd5d332846..9fc14f3102e2ceb10b80974fabb5c4513e17e63f 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -736,4 +736,9 @@ public class PaperWorldConfig {
+@@ -751,4 +751,9 @@ public class PaperWorldConfig {
expMergeMaxValue = getInt("experience-merge-max-value", -1);
log("Experience Merge Max Value: " + expMergeMaxValue);
}
diff --git a/patches/server/0621-forced-whitelist-use-configurable-kick-message.patch b/patches/server/0621-forced-whitelist-use-configurable-kick-message.patch
index 0b700af29f..264c69cdd7 100644
--- a/patches/server/0621-forced-whitelist-use-configurable-kick-message.patch
+++ b/patches/server/0621-forced-whitelist-use-configurable-kick-message.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] forced whitelist: use configurable kick message
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 6fcd166096ad94954ec0868e5d26dc0b76cfd3d2..f1713ceace84ecbe2e4a0dcde050c43a636e3595 100644
+index 643b4901b854d48275cbc8e8d5ff7a28d9b0aa00..80e101301f148520a04dfc914caa58ea3a6653d2 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -73,7 +73,6 @@ import net.minecraft.nbt.NbtOps;
@@ -16,7 +16,7 @@ index 6fcd166096ad94954ec0868e5d26dc0b76cfd3d2..f1713ceace84ecbe2e4a0dcde050c43a
import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket;
import net.minecraft.network.protocol.game.ClientboundSetTimePacket;
import net.minecraft.network.protocol.status.ServerStatus;
-@@ -2055,7 +2054,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -2059,7 +2058,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
ServerPlayer entityplayer = (ServerPlayer) iterator.next();
if (!whitelist.isWhiteListed(entityplayer.getGameProfile()) && !this.getPlayerList().isOp(entityplayer.getGameProfile())) { // Paper - Fix kicking ops when whitelist is reloaded (MC-171420)
diff --git a/patches/server/0667-Limit-item-frame-cursors-on-maps.patch b/patches/server/0667-Limit-item-frame-cursors-on-maps.patch
index a1183b3a17..29f729e93c 100644
--- a/patches/server/0667-Limit-item-frame-cursors-on-maps.patch
+++ b/patches/server/0667-Limit-item-frame-cursors-on-maps.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Limit item frame cursors on maps
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index f754ca5e10cc7709fc2a67eb48861da01300292f..6a09852bcc4466c4e182153c04107ce20a9dafce 100644
+index cc4c067ad70375f76ddede403b88e76f3c8f37da..7d79d4caa299961fd5c54ae924d7658ad37d464b 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -776,4 +776,9 @@ public class PaperWorldConfig {
+@@ -791,4 +791,9 @@ public class PaperWorldConfig {
private void allowUsingSignsInsideSpawnProtection() {
allowUsingSignsInsideSpawnProtection = getBoolean("allow-using-signs-inside-spawn-protection", allowUsingSignsInsideSpawnProtection);
}
diff --git a/patches/server/0668-Add-PlayerKickEvent-causes.patch b/patches/server/0668-Add-PlayerKickEvent-causes.patch
index 68fb513bcd..ecef9afce0 100644
--- a/patches/server/0668-Add-PlayerKickEvent-causes.patch
+++ b/patches/server/0668-Add-PlayerKickEvent-causes.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add PlayerKickEvent causes
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index fcdae82ecaaa86854a5cddcb652ed3bc388e33c3..f4b7488963a6f16016d6ede80072bd3722c0caa3 100644
+index 6715920dcbc7cd895f8662d9c7b9dbb8b8790323..ad92755203d62bb76d259d4c1eba960c04d90a1e 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -2058,7 +2058,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -2062,7 +2062,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
ServerPlayer entityplayer = (ServerPlayer) iterator.next();
if (!whitelist.isWhiteListed(entityplayer.getGameProfile()) && !this.getPlayerList().isOp(entityplayer.getGameProfile())) { // Paper - Fix kicking ops when whitelist is reloaded (MC-171420)
@@ -318,7 +318,7 @@ index 311df240858d4416306a795d893bdf7da403e90b..85e24920e774e84f9fa63a4fb088c07c
}
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 53fa2fbaeacc333ab28392df4613819719a55d2e..8679eb594c6f001de19788e3b08c3c979dfeffe3 100644
+index f61c31a028c286399f0921c516b5d94ad52f88b5..13f68b8d241a0b2532a1bd9d9554d2e615780383 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -715,7 +715,7 @@ public abstract class PlayerList {
@@ -330,7 +330,7 @@ index 53fa2fbaeacc333ab28392df4613819719a55d2e..8679eb594c6f001de19788e3b08c3c97
}
// Instead of kicking then returning, we need to store the kick reason
-@@ -1345,8 +1345,8 @@ public abstract class PlayerList {
+@@ -1346,8 +1346,8 @@ public abstract class PlayerList {
// Paper end
// CraftBukkit start - disconnect safely
for (ServerPlayer player : this.players) {
diff --git a/patches/server/0672-Add-option-to-fix-items-merging-through-walls.patch b/patches/server/0672-Add-option-to-fix-items-merging-through-walls.patch
index 8306249cfa..d1018af9a7 100644
--- a/patches/server/0672-Add-option-to-fix-items-merging-through-walls.patch
+++ b/patches/server/0672-Add-option-to-fix-items-merging-through-walls.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add option to fix items merging through walls
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 6a09852bcc4466c4e182153c04107ce20a9dafce..e28fd9f75b4dba55f5c9d765c368c1ad0c43a960 100644
+index 7d79d4caa299961fd5c54ae924d7658ad37d464b..8494e3147295f997e826025f13a6da29684f3c38 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -781,4 +781,9 @@ public class PaperWorldConfig {
+@@ -796,4 +796,9 @@ public class PaperWorldConfig {
private void mapItemFrameCursorLimit() {
mapItemFrameCursorLimit = getInt("map-item-frame-cursor-limit", mapItemFrameCursorLimit);
}
diff --git a/patches/server/0674-Fix-invulnerable-end-crystals.patch b/patches/server/0674-Fix-invulnerable-end-crystals.patch
index 7953ad7013..eb6660b927 100644
--- a/patches/server/0674-Fix-invulnerable-end-crystals.patch
+++ b/patches/server/0674-Fix-invulnerable-end-crystals.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Fix invulnerable end crystals
MC-108513
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index e28fd9f75b4dba55f5c9d765c368c1ad0c43a960..12f8e5abab4a1f3ab1e1f71746b5bf0b3bf1506c 100644
+index 8494e3147295f997e826025f13a6da29684f3c38..83674565d280f5aa2504cdaee027386f3f377291 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -786,4 +786,9 @@ public class PaperWorldConfig {
+@@ -801,4 +801,9 @@ public class PaperWorldConfig {
private void fixItemsMergingThroughWalls() {
fixItemsMergingThroughWalls = getBoolean("fix-items-merging-through-walls", fixItemsMergingThroughWalls);
}
diff --git a/patches/server/0678-Make-item-validations-configurable.patch b/patches/server/0678-Make-item-validations-configurable.patch
index 6c41b5cdcd..48a1f4174b 100644
--- a/patches/server/0678-Make-item-validations-configurable.patch
+++ b/patches/server/0678-Make-item-validations-configurable.patch
@@ -5,12 +5,12 @@ Subject: [PATCH] Make item validations configurable
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
-index bf256ffaf9311d04712fdba38d529283a5330b09..90e29dd8452c052dfd32fb065094721be0a750f3 100644
+index ae7ca7fbed3a1a4532a78bb8a029bb7fc642bcb3..0460fe8700ee09543263045edaea7a09bd5be035 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
@@ -503,4 +503,19 @@ public class PaperConfig {
- maxPlayerAutoSavePerTick = (playerAutoSaveRate == -1 || playerAutoSaveRate > 100) ? 10 : 20;
- }
+ config.set("settings.unsupported-settings.allow-headless-pistons-readme", "This setting controls if players should be able to create headless pistons.");
+ allowHeadlessPistons = getBoolean("settings.unsupported-settings.allow-headless-pistons", false);
}
+
+ public static int itemValidationDisplayNameLength = 8192;
diff --git a/patches/server/0680-add-per-world-spawn-limits.patch b/patches/server/0680-add-per-world-spawn-limits.patch
index f9914764c6..7704320275 100644
--- a/patches/server/0680-add-per-world-spawn-limits.patch
+++ b/patches/server/0680-add-per-world-spawn-limits.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] add per world spawn limits
Taken from #2982. Credit to Chasewhip8
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 12f8e5abab4a1f3ab1e1f71746b5bf0b3bf1506c..5d1d042cb2214951025512fa6751ee5899bdd7d7 100644
+index 83674565d280f5aa2504cdaee027386f3f377291..24f784209109f599fab11ba8c905f16c304dba3c 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -12,6 +12,7 @@ import net.minecraft.world.Difficulty;
@@ -29,7 +29,7 @@ index 12f8e5abab4a1f3ab1e1f71746b5bf0b3bf1506c..5d1d042cb2214951025512fa6751ee58
}
if (needsSave) {
-@@ -671,6 +677,21 @@ public class PaperWorldConfig {
+@@ -686,6 +692,21 @@ public class PaperWorldConfig {
zombieVillagerInfectionChance = getDouble("zombie-villager-infection-chance", zombieVillagerInfectionChance);
}
diff --git a/patches/server/0688-Fix-commands-from-signs-not-firing-command-events.patch b/patches/server/0688-Fix-commands-from-signs-not-firing-command-events.patch
index ccb7da2f55..9d0fa730b4 100644
--- a/patches/server/0688-Fix-commands-from-signs-not-firing-command-events.patch
+++ b/patches/server/0688-Fix-commands-from-signs-not-firing-command-events.patch
@@ -10,10 +10,10 @@ This patch changes sign command logic so that `run_command` click events:
- sends failure messages to the player who clicked the sign
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 5d1d042cb2214951025512fa6751ee5899bdd7d7..496d1669718c405b441d9280df755ab44aec69f4 100644
+index 24f784209109f599fab11ba8c905f16c304dba3c..c4ee757e4c8e796b402a56803d4031e90a85d916 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -812,4 +812,9 @@ public class PaperWorldConfig {
+@@ -827,4 +827,9 @@ public class PaperWorldConfig {
private void fixInvulnerableEndCrystalExploit() {
fixInvulnerableEndCrystalExploit = getBoolean("unsupported-settings.fix-invulnerable-end-crystal-exploit", fixInvulnerableEndCrystalExploit);
}
diff --git a/patches/server/0691-Add-config-for-mobs-immune-to-default-effects.patch b/patches/server/0691-Add-config-for-mobs-immune-to-default-effects.patch
index d68af96ab1..5e4b533004 100644
--- a/patches/server/0691-Add-config-for-mobs-immune-to-default-effects.patch
+++ b/patches/server/0691-Add-config-for-mobs-immune-to-default-effects.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add config for mobs immune to default effects
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 496d1669718c405b441d9280df755ab44aec69f4..ad51b56279c723538ba71c47f22b96f45f82204e 100644
+index c4ee757e4c8e796b402a56803d4031e90a85d916..ed2b33afffdf975513c07ba8db6439810e444852 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -667,6 +667,21 @@ public class PaperWorldConfig {
+@@ -682,6 +682,21 @@ public class PaperWorldConfig {
log("Hopper Ignore Occluding Blocks: " + (hoppersIgnoreOccludingBlocks ? "enabled" : "disabled"));
}
diff --git a/patches/server/0694-Don-t-apply-cramming-damage-to-players.patch b/patches/server/0694-Don-t-apply-cramming-damage-to-players.patch
index fb04119b33..40efb31eca 100644
--- a/patches/server/0694-Don-t-apply-cramming-damage-to-players.patch
+++ b/patches/server/0694-Don-t-apply-cramming-damage-to-players.patch
@@ -11,10 +11,10 @@ It does not make a lot of sense to damage players if they get crammed,
For those who really want it a config option is provided.
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index ad51b56279c723538ba71c47f22b96f45f82204e..c6d9b4368446c4e97ab746e0b4d067dfd646edf4 100644
+index ed2b33afffdf975513c07ba8db6439810e444852..24a14b9f2d6e070fe9220bfb6e709f58368390f6 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -832,4 +832,9 @@ public class PaperWorldConfig {
+@@ -847,4 +847,9 @@ public class PaperWorldConfig {
private void showSignClickCommandFailureMessagesToPlayer() {
showSignClickCommandFailureMessagesToPlayer = getBoolean("show-sign-click-command-failure-msgs-to-player", showSignClickCommandFailureMessagesToPlayer);
}
diff --git a/patches/server/0695-Rate-options-and-timings-for-sensors-and-behaviors.patch b/patches/server/0695-Rate-options-and-timings-for-sensors-and-behaviors.patch
index a2c0f146e2..1692e8e3e9 100644
--- a/patches/server/0695-Rate-options-and-timings-for-sensors-and-behaviors.patch
+++ b/patches/server/0695-Rate-options-and-timings-for-sensors-and-behaviors.patch
@@ -28,7 +28,7 @@ index b47b7dce26805badd422c1867733ff4bfd00e9f4..b27021a42cbed3f0648a8d0903d00d03
* Get a named timer for the specified tile entity type to track type specific timings.
* @param entity
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index c6d9b4368446c4e97ab746e0b4d067dfd646edf4..b27b25b22d062e32b56b3fd1b28c2d3597e9023a 100644
+index 24a14b9f2d6e070fe9220bfb6e709f58368390f6..9a866ab0b887f2db1cf0e6802a44c2e8b0912b74 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -7,13 +7,18 @@ import it.unimi.dsi.fastutil.objects.Reference2IntMap;
@@ -50,7 +50,7 @@ index c6d9b4368446c4e97ab746e0b4d067dfd646edf4..b27b25b22d062e32b56b3fd1b28c2d35
import org.bukkit.configuration.file.YamlConfiguration;
import org.spigotmc.SpigotWorldConfig;
-@@ -837,4 +842,57 @@ public class PaperWorldConfig {
+@@ -852,4 +857,57 @@ public class PaperWorldConfig {
private void playerCrammingDamage() {
allowPlayerCrammingDamage = getBoolean("allow-player-cramming-damage", allowPlayerCrammingDamage);
}
diff --git a/patches/server/0712-Configurable-item-frame-map-cursor-update-interval.patch b/patches/server/0712-Configurable-item-frame-map-cursor-update-interval.patch
index 7cb33fcb32..bff9dd9df4 100644
--- a/patches/server/0712-Configurable-item-frame-map-cursor-update-interval.patch
+++ b/patches/server/0712-Configurable-item-frame-map-cursor-update-interval.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Configurable item frame map cursor update interval
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 0c430c1ef426bf2127e94063c966ba0935b3a39f..8cb3767551d36cc2c7c07548182d817f9843bf50 100644
+index 10a52ee6177d5eb463a9a08302099b5dbc7b1a18..4d85af9d021291e813daa3a44e8bae340fc568fb 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -828,6 +828,11 @@ public class PaperWorldConfig {
+@@ -843,6 +843,11 @@ public class PaperWorldConfig {
mapItemFrameCursorLimit = getInt("map-item-frame-cursor-limit", mapItemFrameCursorLimit);
}
diff --git a/patches/server/0736-Make-CallbackExecutor-strict-again.patch b/patches/server/0736-Make-CallbackExecutor-strict-again.patch
index bd553fabdc..54594efbd0 100644
--- a/patches/server/0736-Make-CallbackExecutor-strict-again.patch
+++ b/patches/server/0736-Make-CallbackExecutor-strict-again.patch
@@ -10,10 +10,10 @@ schedules. Effectively, use the callback executor as a tool of
finding issues rather than hiding these issues.
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index c637a9b0a978700a0cd941be22208ae3c01f6eb2..e4005ead8dafb4ae02ad5bbfb8e7721dbc734758 100644
+index b75ad5ee074489e3c66ef6524106241c6d577916..75de80747ecd26c5cb91e6be25cada16aa206b8b 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -158,17 +158,28 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -159,17 +159,28 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
public final CallbackExecutor callbackExecutor = new CallbackExecutor();
public static final class CallbackExecutor implements java.util.concurrent.Executor, Runnable {
diff --git a/patches/server/0737-Do-not-allow-the-server-to-unload-chunks-at-request-.patch b/patches/server/0737-Do-not-allow-the-server-to-unload-chunks-at-request-.patch
index f8647890e9..83aeeea374 100644
--- a/patches/server/0737-Do-not-allow-the-server-to-unload-chunks-at-request-.patch
+++ b/patches/server/0737-Do-not-allow-the-server-to-unload-chunks-at-request-.patch
@@ -10,10 +10,10 @@ to be unloaded will simply be unloaded next tick, rather than
immediately.
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index 930291a0844acbd0491e641008727223b0010a60..1a27a694fde340082c9ab60a63abce39bab22739 100644
+index 59d7f93c9364571edf2e7b613a57f8f28989cb56..804aaa62d9c39bc4340a83a9ed88ab7d04c47059 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-@@ -875,6 +875,7 @@ public class ServerChunkCache extends ChunkSource {
+@@ -884,6 +884,7 @@ public class ServerChunkCache extends ChunkSource {
// CraftBukkit start - modelled on below
public void purgeUnload() {
diff --git a/patches/server/0738-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch b/patches/server/0738-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch
index fa9789c8eb..0670923974 100644
--- a/patches/server/0738-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch
+++ b/patches/server/0738-Do-not-run-close-logic-for-inventories-on-chunk-unlo.patch
@@ -9,10 +9,10 @@ chunk through it. This should also be OK from a leak prevention/
state desync POV because the TE is getting unloaded anyways.
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 5fd96595d44a47b43c5787c9dd1f4f5cfe6943fa..5d57431a369207a2f207f89682f0861027906370 100644
+index 2b3c54737a203401c6f03bba9c9d969e95102298..3748dae9bbb80e70bb9a0547868e02d91d9c85c6 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -1272,9 +1272,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1303,9 +1303,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Spigot Start
for (net.minecraft.world.level.block.entity.BlockEntity tileentity : chunk.getBlockEntities().values()) {
if (tileentity instanceof net.minecraft.world.Container) {
diff --git a/patches/server/0739-Correctly-handle-recursion-for-chunkholder-updates.patch b/patches/server/0739-Correctly-handle-recursion-for-chunkholder-updates.patch
index be9a9e31a7..a1ab433609 100644
--- a/patches/server/0739-Correctly-handle-recursion-for-chunkholder-updates.patch
+++ b/patches/server/0739-Correctly-handle-recursion-for-chunkholder-updates.patch
@@ -8,10 +8,10 @@ cause a recursive call which would handle the increase but then
the caller would think the chunk would be unloaded.
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-index 41333234cdda8127a239f591d8d2cd304e341852..0b4c10b71d29d01408cafb38cdc7e48e6f90d8a8 100644
+index b493769dd420f0dd93fdf8184c452c53cb63e95b..75166c2db7e86c54787a085c6a58762b30bc2863 100644
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-@@ -426,8 +426,10 @@ public class ChunkHolder {
+@@ -428,8 +428,10 @@ public class ChunkHolder {
playerchunkmap.onFullChunkStatusChange(this.pos, playerchunk_state);
}
@@ -22,7 +22,7 @@ index 41333234cdda8127a239f591d8d2cd304e341852..0b4c10b71d29d01408cafb38cdc7e48e
ChunkStatus chunkstatus = ChunkHolder.getStatus(this.oldTicketLevel);
ChunkStatus chunkstatus1 = ChunkHolder.getStatus(this.ticketLevel);
boolean flag = this.oldTicketLevel <= ChunkMap.MAX_CHUNK_DISTANCE;
-@@ -469,6 +471,12 @@ public class ChunkHolder {
+@@ -471,6 +473,12 @@ public class ChunkHolder {
// Run callback right away if the future was already done
chunkStorage.callbackExecutor.run();
diff --git a/patches/server/0741-Fix-chunks-refusing-to-unload-at-low-TPS.patch b/patches/server/0741-Fix-chunks-refusing-to-unload-at-low-TPS.patch
index 6b98e4afbb..99d564c3e8 100644
--- a/patches/server/0741-Fix-chunks-refusing-to-unload-at-low-TPS.patch
+++ b/patches/server/0741-Fix-chunks-refusing-to-unload-at-low-TPS.patch
@@ -10,10 +10,10 @@ chunk future to complete. We can simply schedule to the immediate
executor to get this effect, rather than the main mailbox.
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index e4005ead8dafb4ae02ad5bbfb8e7721dbc734758..cda41112ce58f4572c36c5d33e16cf13bc10b1ec 100644
+index 75de80747ecd26c5cb91e6be25cada16aa206b8b..1667e1074294cc3d1d286066917555289234a33d 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -1226,9 +1226,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1286,9 +1286,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
return chunk;
});
diff --git a/patches/server/0742-Do-not-allow-ticket-level-changes-while-unloading-pl.patch b/patches/server/0742-Do-not-allow-ticket-level-changes-while-unloading-pl.patch
index 59345055f6..2591b63463 100644
--- a/patches/server/0742-Do-not-allow-ticket-level-changes-while-unloading-pl.patch
+++ b/patches/server/0742-Do-not-allow-ticket-level-changes-while-unloading-pl.patch
@@ -8,10 +8,10 @@ Sync loading the chunk at this stage would cause it to load
older data, as well as screwing our region state.
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index cda41112ce58f4572c36c5d33e16cf13bc10b1ec..f67a7ba5e95a3ba4d3589c6df1012bdc98559747 100644
+index 1667e1074294cc3d1d286066917555289234a33d..8a890c17521049a79295e180538451ba4f2b7fc1 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -294,6 +294,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -295,6 +295,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
// Paper end
@@ -19,7 +19,7 @@ index cda41112ce58f4572c36c5d33e16cf13bc10b1ec..f67a7ba5e95a3ba4d3589c6df1012bdc
public ChunkMap(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureManager structureManager, Executor executor, BlockableEventLoop<Runnable> mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier<DimensionDataStorage> persistentStateManagerFactory, int viewDistance, boolean dsync) {
super(session.getDimensionPath(world.dimension()).resolve("region"), dataFixer, dsync);
this.visibleChunkMap = this.updatingChunkMap.clone();
-@@ -678,6 +679,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -679,6 +680,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@Nullable
ChunkHolder updateChunkScheduling(long pos, int level, @Nullable ChunkHolder holder, int k) {
@@ -27,7 +27,7 @@ index cda41112ce58f4572c36c5d33e16cf13bc10b1ec..f67a7ba5e95a3ba4d3589c6df1012bdc
if (k > ChunkMap.MAX_CHUNK_DISTANCE && level > ChunkMap.MAX_CHUNK_DISTANCE) {
return holder;
} else {
-@@ -838,6 +840,12 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -897,6 +899,12 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
if (completablefuture1 != completablefuture) {
this.scheduleUnload(pos, holder);
} else {
@@ -40,7 +40,7 @@ index cda41112ce58f4572c36c5d33e16cf13bc10b1ec..f67a7ba5e95a3ba4d3589c6df1012bdc
// Paper start
boolean removed;
if ((removed = this.pendingUnloads.remove(pos, holder)) && ichunkaccess != null) {
-@@ -873,6 +881,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -933,6 +941,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.regionManagers.get(index).removeChunk(holder.pos.x, holder.pos.z);
}
} // Paper end
@@ -49,7 +49,7 @@ index cda41112ce58f4572c36c5d33e16cf13bc10b1ec..f67a7ba5e95a3ba4d3589c6df1012bdc
}
};
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index 1a27a694fde340082c9ab60a63abce39bab22739..a2f7f3a153b512bf1cd96ec4bbe3173aa467825a 100644
+index 804aaa62d9c39bc4340a83a9ed88ab7d04c47059..7dfccd2e72ac5ec8b03b3439b034975ddadd759e 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
@@ -820,6 +820,7 @@ public class ServerChunkCache extends ChunkSource {
diff --git a/patches/server/0743-Do-not-allow-ticket-level-changes-when-updating-chun.patch b/patches/server/0743-Do-not-allow-ticket-level-changes-when-updating-chun.patch
index e3a6543fe8..5cfc1dab05 100644
--- a/patches/server/0743-Do-not-allow-ticket-level-changes-when-updating-chun.patch
+++ b/patches/server/0743-Do-not-allow-ticket-level-changes-when-updating-chun.patch
@@ -8,10 +8,10 @@ This WILL cause state corruption if it happens. So, don't
allow it.
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-index 0b4c10b71d29d01408cafb38cdc7e48e6f90d8a8..dcd95e4cb169fa5eefc34b6fff8f21893052576b 100644
+index 75166c2db7e86c54787a085c6a58762b30bc2863..223f6e0dd7df135f0d15fc8a9e78cb426cda911d 100644
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-@@ -406,7 +406,13 @@ public class ChunkHolder {
+@@ -408,7 +408,13 @@ public class ChunkHolder {
CompletableFuture<Void> completablefuture1 = new CompletableFuture();
completablefuture1.thenRunAsync(() -> {
@@ -25,7 +25,7 @@ index 0b4c10b71d29d01408cafb38cdc7e48e6f90d8a8..dcd95e4cb169fa5eefc34b6fff8f2189
}, executor);
this.pendingFullStateConfirmation = completablefuture1;
completablefuture.thenAccept((either) -> {
-@@ -423,7 +429,12 @@ public class ChunkHolder {
+@@ -425,7 +431,12 @@ public class ChunkHolder {
private void demoteFullChunk(ChunkMap playerchunkmap, ChunkHolder.FullChunkStatus playerchunk_state) {
this.pendingFullStateConfirmation.cancel(false);
diff --git a/patches/server/0751-Execute-chunk-tasks-mid-tick.patch b/patches/server/0751-Execute-chunk-tasks-mid-tick.patch
index 7d825bd555..e4a4e18841 100644
--- a/patches/server/0751-Execute-chunk-tasks-mid-tick.patch
+++ b/patches/server/0751-Execute-chunk-tasks-mid-tick.patch
@@ -19,7 +19,7 @@ index b27021a42cbed3f0648a8d0903d00d03922ae221..eada966d7f108a6081be7a848f5c1dfc
private MinecraftTimings() {}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index f4b7488963a6f16016d6ede80072bd3722c0caa3..7e15aa7c156096decdaa8596f242a4b2e5ea97b4 100644
+index ad92755203d62bb76d259d4c1eba960c04d90a1e..743dd0253e9dffddee28c142d8b5ebdc2a8e670a 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -331,6 +331,76 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -99,7 +99,7 @@ index f4b7488963a6f16016d6ede80072bd3722c0caa3..7e15aa7c156096decdaa8596f242a4b2
public MinecraftServer(OptionSet options, DataPackConfig datapackconfiguration, Thread thread, RegistryAccess.RegistryHolder iregistrycustom_dimension, LevelStorageSource.LevelStorageAccess convertable_conversionsession, WorldData savedata, PackRepository resourcepackrepository, Proxy proxy, DataFixer datafixer, ServerResources datapackresources, @Nullable MinecraftSessionService minecraftsessionservice, @Nullable GameProfileRepository gameprofilerepository, @Nullable GameProfileCache usercache, ChunkProgressListenerFactory worldloadlistenerfactory) {
super("Server");
SERVER = this; // Paper - better singleton
-@@ -1315,6 +1385,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+@@ -1311,6 +1381,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
private boolean pollTaskInternal() {
if (super.pollTask()) {
@@ -108,7 +108,7 @@ index f4b7488963a6f16016d6ede80072bd3722c0caa3..7e15aa7c156096decdaa8596f242a4b2
} else {
if (this.haveTime()) {
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 7ae0065139e19c900812c0332cd69a516aa0e36c..cd2e3de1709d9c5c278b5cb616462daad2167f77 100644
+index 7a5b6bd84f1a7becdebe03b0bd07f8481eb27ecd..f9f1e2f9eb1a682b3c4c50b5ab4839bf595b0a73 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -198,7 +198,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
diff --git a/patches/server/0752-Do-not-copy-visible-chunks.patch b/patches/server/0752-Do-not-copy-visible-chunks.patch
index dbfdb8321e..b3a1f21d69 100644
--- a/patches/server/0752-Do-not-copy-visible-chunks.patch
+++ b/patches/server/0752-Do-not-copy-visible-chunks.patch
@@ -35,10 +35,10 @@ index 35949e9c15eb998aa89842d34d0999cd973590e0..15f0c85ba9f4f9666e94e67dde43eb2e
List<ChunkHolder> allChunks = new ArrayList<>(visibleChunks.values());
List<ServerPlayer> players = world.players;
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376dbadd447d 100644
+index 6ade79dba07435f3ccc19554e48574bb3bcb2f9c..594f5f3303c21439707f70426baa900af6d94a04 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -118,9 +118,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -119,9 +119,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
private static final int MIN_VIEW_DISTANCE = 3;
public static final int MAX_VIEW_DISTANCE = 33;
public static final int MAX_CHUNK_DISTANCE = 33 + ChunkStatus.maxDistance();
@@ -52,7 +52,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
private final Long2ObjectLinkedOpenHashMap<ChunkHolder> pendingUnloads;
public final LongSet entitiesInLevel;
public final ServerLevel level;
-@@ -297,7 +299,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -298,7 +300,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
boolean unloadingPlayerChunk = false; // Paper - do not allow ticket level changes while unloading chunks
public ChunkMap(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureManager structureManager, Executor executor, BlockableEventLoop<Runnable> mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier<DimensionDataStorage> persistentStateManagerFactory, int viewDistance, boolean dsync) {
super(session.getDimensionPath(world.dimension()).resolve("region"), dataFixer, dsync);
@@ -61,7 +61,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
this.pendingUnloads = new Long2ObjectLinkedOpenHashMap();
this.entitiesInLevel = new LongOpenHashSet();
this.toDrop = new LongOpenHashSet();
-@@ -552,12 +554,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -553,12 +555,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@Nullable
public ChunkHolder getUpdatingChunkIfPresent(long pos) {
@@ -81,7 +81,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
}
protected IntSupplier getChunkQueueLevel(long pos) {
-@@ -709,7 +716,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -710,7 +717,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
// Paper end
}
@@ -90,7 +90,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
this.modified = true;
}
-@@ -731,7 +738,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -790,7 +797,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
protected void saveAllChunks(boolean flush) {
if (flush) {
@@ -99,7 +99,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
MutableBoolean mutableboolean = new MutableBoolean();
do {
-@@ -762,7 +769,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -821,7 +828,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
//this.flushWorker(); // Paper - nuke IOWorker
this.level.asyncChunkTaskManager.flush(); // Paper - flush to preserve behavior compat with pre-async behaviour
} else {
@@ -108,7 +108,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
}
}
-@@ -796,7 +803,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -855,7 +862,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
while (longiterator.hasNext()) { // Spigot
long j = longiterator.nextLong();
longiterator.remove(); // Spigot
@@ -117,16 +117,16 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
if (playerchunk != null) {
this.pendingUnloads.put(j, playerchunk);
-@@ -822,7 +829,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -881,7 +888,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
int l = 0;
- ObjectIterator objectiterator = this.visibleChunkMap.values().iterator();
+ Iterator objectiterator = this.updatingChunks.getVisibleValuesCopy().iterator(); // Paper
- while (l < 20 && shouldKeepTicking.getAsBoolean() && objectiterator.hasNext()) {
+ while (false && l < 20 && shouldKeepTicking.getAsBoolean() && objectiterator.hasNext()) { // Paper - incremental chunk and player saving
if (this.saveChunkIfNeeded((ChunkHolder) objectiterator.next())) {
-@@ -900,7 +907,12 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -960,7 +967,12 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
if (!this.modified) {
return false;
} else {
@@ -140,7 +140,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
this.modified = false;
return true;
}
-@@ -1382,7 +1394,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1444,7 +1456,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.viewDistance = j;
this.distanceManager.updatePlayerTickets(this.viewDistance);
@@ -149,7 +149,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
while (objectiterator.hasNext()) {
ChunkHolder playerchunk = (ChunkHolder) objectiterator.next();
-@@ -1424,7 +1436,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1486,7 +1498,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
public int size() {
@@ -158,7 +158,7 @@ index f67a7ba5e95a3ba4d3589c6df1012bdc98559747..0c629a4f835c735f9ff9e5f687c8376d
}
public DistanceManager getDistanceManager() {
-@@ -1432,13 +1444,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -1494,13 +1506,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
protected Iterable<ChunkHolder> getChunks() {
diff --git a/patches/server/0764-Consolidate-flush-calls-for-entity-tracker-packets.patch b/patches/server/0764-Consolidate-flush-calls-for-entity-tracker-packets.patch
index e819c08d79..d558e7aa8f 100644
--- a/patches/server/0764-Consolidate-flush-calls-for-entity-tracker-packets.patch
+++ b/patches/server/0764-Consolidate-flush-calls-for-entity-tracker-packets.patch
@@ -22,10 +22,10 @@ With this change I could get all 200 on at 0ms ping.
So in general this patch should reduce Netty I/O thread load.
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index 204fc634fdbcff8ff9f4b570c50a76401dcc8bd6..573a7fc1543f4dbdbc6d83d1dc123ab952840c88 100644
+index c3dc87998400bf57ddd31a29a3a4e506407adcb8..f46aa97e00c9238daeeb9730551949959c750a0b 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-@@ -1031,7 +1031,24 @@ public class ServerChunkCache extends ChunkSource {
+@@ -1040,7 +1040,24 @@ public class ServerChunkCache extends ChunkSource {
});
gameprofilerfiller.pop();
gameprofilerfiller.pop();
diff --git a/patches/server/0769-Oprimise-map-impl-for-tracked-players.patch b/patches/server/0769-Oprimise-map-impl-for-tracked-players.patch
index 46d6e0fe24..ee2bde2657 100644
--- a/patches/server/0769-Oprimise-map-impl-for-tracked-players.patch
+++ b/patches/server/0769-Oprimise-map-impl-for-tracked-players.patch
@@ -7,10 +7,10 @@ Reference2BooleanOpenHashMap is going to have
better lookups than HashMap.
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 0c629a4f835c735f9ff9e5f687c8376dbadd447d..cde82f240924640575d4261d862052af03f31849 100644
+index 82c46feffefb9b27c793625e392472bcf8e1b54d..edb94ce747afae854fcfa63e08467b18982f6db7 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -106,6 +106,7 @@ import org.apache.logging.log4j.LogManager;
+@@ -107,6 +107,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bukkit.entity.Player;
// CraftBukkit end
@@ -18,7 +18,7 @@ index 0c629a4f835c735f9ff9e5f687c8376dbadd447d..cde82f240924640575d4261d862052af
public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider {
-@@ -2069,7 +2070,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -2131,7 +2132,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
final Entity entity;
private final int range;
SectionPos lastSectionPos;
diff --git a/patches/server/0774-Optimise-nearby-player-lookups.patch b/patches/server/0774-Optimise-nearby-player-lookups.patch
index a41c49229d..1ebfb7ebe9 100644
--- a/patches/server/0774-Optimise-nearby-player-lookups.patch
+++ b/patches/server/0774-Optimise-nearby-player-lookups.patch
@@ -9,7 +9,7 @@ since the penalty of a map lookup could outweigh the benefits of
searching less players (as it basically did in the outside range patch).
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
-index dcd95e4cb169fa5eefc34b6fff8f21893052576b..380f8f133cc38fa005548bad23e12fa873e7349f 100644
+index 223f6e0dd7df135f0d15fc8a9e78cb426cda911d..c3d1adaf7abfafa8e4c5d173c0d2ec40ca655cfb 100644
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
@@ -83,6 +83,12 @@ public class ChunkHolder {
@@ -24,12 +24,12 @@ index dcd95e4cb169fa5eefc34b6fff8f21893052576b..380f8f133cc38fa005548bad23e12fa8
+ // Paper end - optimise checkDespawn
}
// Paper end - optimise isOutsideOfRange
- // Paper start - optimize chunk status progression without jumping through thread pool
+ long lastAutoSaveTime; // Paper - incremental autosave
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index cde82f240924640575d4261d862052af03f31849..3d6d68b1f52d507a1f4db9a0c5da09072624046e 100644
+index edb94ce747afae854fcfa63e08467b18982f6db7..399a98437ea632b8768a7c153dee7723c8499317 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -157,6 +157,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -158,6 +158,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
int viewDistance;
public final com.destroystokyo.paper.util.PlayerMobDistanceMap playerMobDistanceMap; // Paper
@@ -43,7 +43,7 @@ index cde82f240924640575d4261d862052af03f31849..3d6d68b1f52d507a1f4db9a0c5da0907
// CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback()
public final CallbackExecutor callbackExecutor = new CallbackExecutor();
public static final class CallbackExecutor implements java.util.concurrent.Executor, Runnable {
-@@ -237,6 +244,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -238,6 +245,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.playerChunkTickRangeMap.update(player, chunkX, chunkZ, DistanceManager.MOB_SPAWN_RANGE);
this.playerChunkTickRangeMap.add(player, chunkX, chunkZ, DistanceManager.MOB_SPAWN_RANGE);
// Paper end - optimise PlayerChunkMap#isOutsideRange
@@ -51,7 +51,7 @@ index cde82f240924640575d4261d862052af03f31849..3d6d68b1f52d507a1f4db9a0c5da0907
}
void removePlayerFromDistanceMaps(ServerPlayer player) {
-@@ -249,6 +257,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -250,6 +258,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
this.playerMobSpawnMap.remove(player);
this.playerChunkTickRangeMap.remove(player);
// Paper end - optimise PlayerChunkMap#isOutsideRange
@@ -59,7 +59,7 @@ index cde82f240924640575d4261d862052af03f31849..3d6d68b1f52d507a1f4db9a0c5da0907
}
void updateMaps(ServerPlayer player) {
-@@ -264,6 +273,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -265,6 +274,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
// Paper end - use distance map to optimise entity tracker
this.playerChunkTickRangeMap.update(player, chunkX, chunkZ, DistanceManager.MOB_SPAWN_RANGE); // Paper - optimise PlayerChunkMap#isOutsideRange
@@ -67,7 +67,7 @@ index cde82f240924640575d4261d862052af03f31849..3d6d68b1f52d507a1f4db9a0c5da0907
}
// Paper end
// Paper start
-@@ -419,6 +429,23 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -420,6 +430,23 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}
});
// Paper end - optimise PlayerChunkMap#isOutsideRange
@@ -92,7 +92,7 @@ index cde82f240924640575d4261d862052af03f31849..3d6d68b1f52d507a1f4db9a0c5da0907
protected ChunkGenerator generator() {
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 1c92416c3dc07d2348f092eee663e0226d43c8ba..dec294b771966ac42fd89fe5788af503c1f2ba8b 100644
+index 94ba82b4c7d4a308eec0475d3fe790f0498dbe29..d47b21b5edc2734cdd45ed3282df98babe0045c0 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -396,6 +396,83 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -309,10 +309,10 @@ index 63ba93538d990fdd4c9e8c491bb715adc8d57986..e9a37fc6791366ea421f2766a36dc2e0
private static Boolean isValidSpawnPostitionForType(ServerLevel world, MobCategory group, StructureFeatureManager structureAccessor, ChunkGenerator chunkGenerator, MobSpawnSettings.SpawnerData spawnEntry, BlockPos.MutableBlockPos pos, double squaredDistance) { // Paper
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index 875977f11678b34465abac30463675f57cf9fc4e..65541807d19cb3e14d86f72bed843b0d2d2d4511 100644
+index ddf362fc14fcf83b22536b76cfc6ac1387b4c57a..0435c750ec03f65bad3f904070960d56c2ed4832 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-@@ -231,6 +231,93 @@ public class LevelChunk extends ChunkAccess {
+@@ -237,6 +237,93 @@ public class LevelChunk extends ChunkAccess {
}
}
// Paper end
diff --git a/patches/server/0775-Optimise-WorldServer-notify.patch b/patches/server/0775-Optimise-WorldServer-notify.patch
index 9ce0c434db..54f02d8d84 100644
--- a/patches/server/0775-Optimise-WorldServer-notify.patch
+++ b/patches/server/0775-Optimise-WorldServer-notify.patch
@@ -8,10 +8,10 @@ Instead, only iterate over navigators in the current region that are
eligible for repathing.
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 3d6d68b1f52d507a1f4db9a0c5da09072624046e..3c5210e8454e3a482b2f4973c88349899f00f3a0 100644
+index 399a98437ea632b8768a7c153dee7723c8499317..0b8a222e88794a4c54fc0010842b46a5df800068 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -281,15 +281,81 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -282,15 +282,81 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
public final io.papermc.paper.chunk.SingleThreadChunkRegionManager dataRegionManager;
public static final class DataRegionData implements io.papermc.paper.chunk.SingleThreadChunkRegionManager.RegionData {
@@ -93,7 +93,7 @@ index 3d6d68b1f52d507a1f4db9a0c5da09072624046e..3c5210e8454e3a482b2f4973c8834989
}
@Override
-@@ -299,6 +365,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -300,6 +366,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
final DataRegionSectionData sectionData = (DataRegionSectionData)section.sectionData;
final DataRegionData oldRegionData = oldRegion == null ? null : (DataRegionData)oldRegion.regionData;
final DataRegionData newRegionData = (DataRegionData)newRegion.regionData;
@@ -110,7 +110,7 @@ index 3d6d68b1f52d507a1f4db9a0c5da09072624046e..3c5210e8454e3a482b2f4973c8834989
}
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index dec294b771966ac42fd89fe5788af503c1f2ba8b..ac7fe0d08b1d44303d6578bb45c83a9cb7925b6e 100644
+index d47b21b5edc2734cdd45ed3282df98babe0045c0..3b5dd838bc8759bd849f5dd2ee0f260a65d17adb 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -1090,6 +1090,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -121,7 +121,7 @@ index dec294b771966ac42fd89fe5788af503c1f2ba8b..ac7fe0d08b1d44303d6578bb45c83a9c
try {
if (currentlyTickingEntity.get() == null) {
currentlyTickingEntity.lazySet(entity);
-@@ -1504,9 +1505,19 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1535,9 +1536,19 @@ public class ServerLevel extends Level implements WorldGenLevel {
VoxelShape voxelshape1 = newState.getCollisionShape(this, pos);
if (Shapes.joinIsNotEmpty(voxelshape, voxelshape1, BooleanOp.NOT_SAME)) {
@@ -143,7 +143,7 @@ index dec294b771966ac42fd89fe5788af503c1f2ba8b..ac7fe0d08b1d44303d6578bb45c83a9c
// CraftBukkit start - fix SPIGOT-6362
Mob entityinsentient;
try {
-@@ -1525,6 +1536,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -1556,6 +1567,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
navigationabstract.recomputePath(pos);
}
}
@@ -155,7 +155,7 @@ index dec294b771966ac42fd89fe5788af503c1f2ba8b..ac7fe0d08b1d44303d6578bb45c83a9c
}
} // Paper
-@@ -2320,10 +2336,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -2351,10 +2367,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
public void onTickingStart(Entity entity) {
ServerLevel.this.entityTickList.add(entity);
diff --git a/patches/server/0783-Fix-merchant-inventory-not-closing-on-entity-removal.patch b/patches/server/0783-Fix-merchant-inventory-not-closing-on-entity-removal.patch
index 40cbedda52..b586f3f4db 100644
--- a/patches/server/0783-Fix-merchant-inventory-not-closing-on-entity-removal.patch
+++ b/patches/server/0783-Fix-merchant-inventory-not-closing-on-entity-removal.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Fix merchant inventory not closing on entity removal
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index ac7fe0d08b1d44303d6578bb45c83a9cb7925b6e..1cf809480d9ad7dd24c697d79621106544d32146 100644
+index 3b5dd838bc8759bd849f5dd2ee0f260a65d17adb..53c3b1abc1acf0b847fa2e52b9941bd003971342 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -2409,6 +2409,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
+@@ -2440,6 +2440,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Spigot end
// Spigot Start
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder) {
diff --git a/patches/server/0793-Do-not-overload-I-O-threads-with-chunk-data-while-fl.patch b/patches/server/0793-Do-not-overload-I-O-threads-with-chunk-data-while-fl.patch
index 5cd0bf352c..50bd45e23a 100644
--- a/patches/server/0793-Do-not-overload-I-O-threads-with-chunk-data-while-fl.patch
+++ b/patches/server/0793-Do-not-overload-I-O-threads-with-chunk-data-while-fl.patch
@@ -12,11 +12,11 @@ time to save, as flush saving performs a full flush at
the end anyways.
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 3c5210e8454e3a482b2f4973c88349899f00f3a0..3947e1f2823e8d077350b7e781c04a4b46a83939 100644
+index 0b8a222e88794a4c54fc0010842b46a5df800068..8dbbb09cac61da0d252974f2df85ce6aa655a853 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
-@@ -840,6 +840,16 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
- }
+@@ -899,6 +899,16 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+ // Paper end
protected void saveAllChunks(boolean flush) {
+ // Paper start - do not overload I/O threads with too much work when saving
@@ -32,7 +32,7 @@ index 3c5210e8454e3a482b2f4973c88349899f00f3a0..3947e1f2823e8d077350b7e781c04a4b
if (flush) {
List<ChunkHolder> list = (List) this.updatingChunks.getVisibleValuesCopy().stream().filter(ChunkHolder::wasAccessibleSinceLastSave).peek(ChunkHolder::refreshAccessibility).collect(Collectors.toList()); // Paper
MutableBoolean mutableboolean = new MutableBoolean();
-@@ -862,6 +872,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
+@@ -921,6 +931,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
}).filter((ichunkaccess) -> {
return ichunkaccess instanceof ImposterProtoChunk || ichunkaccess instanceof LevelChunk;
}).filter(this::save).forEach((ichunkaccess) -> {
diff --git a/patches/server/0794-Preserve-overstacked-loot.patch b/patches/server/0794-Preserve-overstacked-loot.patch
index f6dd6e0b54..b3b8f80f18 100644
--- a/patches/server/0794-Preserve-overstacked-loot.patch
+++ b/patches/server/0794-Preserve-overstacked-loot.patch
@@ -10,10 +10,10 @@ chunk bans via the large amount of NBT created by unstacking the items.
Fixes GH-5140 and GH-4748.
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 8cb3767551d36cc2c7c07548182d817f9843bf50..e5543b3a261f80bd9b0346d595a62b5458d9b229 100644
+index 4d85af9d021291e813daa3a44e8bae340fc568fb..dd3a0903f9a26986edca4d1d6a78d0404069e990 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -853,6 +853,11 @@ public class PaperWorldConfig {
+@@ -868,6 +868,11 @@ public class PaperWorldConfig {
allowPlayerCrammingDamage = getBoolean("allow-player-cramming-damage", allowPlayerCrammingDamage);
}
diff --git a/patches/server/0801-Configurable-feature-seeds.patch b/patches/server/0801-Configurable-feature-seeds.patch
index fc94173a6b..5384fb04f3 100644
--- a/patches/server/0801-Configurable-feature-seeds.patch
+++ b/patches/server/0801-Configurable-feature-seeds.patch
@@ -19,10 +19,10 @@ index ee53453440177537fc653ea156785d7591498614..5e3b7fb2e0b7608610555cd23e7ad25a
}
final Object val = config.get(key);
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index e5543b3a261f80bd9b0346d595a62b5458d9b229..45abadeb2568566b3646004d03e7ba8c1766c18a 100644
+index dd3a0903f9a26986edca4d1d6a78d0404069e990..82a6b481c745cc6f70e2afa922b6c362161069fa 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -898,6 +898,55 @@ public class PaperWorldConfig {
+@@ -913,6 +913,55 @@ public class PaperWorldConfig {
return table;
}