diff --git a/gradle.properties b/gradle.properties index 72b4a2c..4d324cf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ group=dev.folia -version=1.21.3-R0.1-SNAPSHOT -mcVersion=1.21.3 +version=1.21.4-R0.1-SNAPSHOT +mcVersion=1.21.4 -paperRef=c2294d7067959d264eb8ad275557f194a3e2656f +paperRef=5a362b875938eb0764f6e8f5bf1352722aa15a98 org.gradle.caching=true org.gradle.parallel=true diff --git a/patches/api/0002-Region-scheduler-API.patch b/patches/api/0002-Region-scheduler-API.patch index 19f59bf..9ea5e80 100644 --- a/patches/api/0002-Region-scheduler-API.patch +++ b/patches/api/0002-Region-scheduler-API.patch @@ -7,7 +7,7 @@ Add both a location based scheduler, an entity based scheduler, and a global region scheduler. diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index b878e7167cfcdea0e224c182b40abeadd339d3b3..9611e8e254b4fa9579dc9ffd5198182c43819c56 100644 +index 001465eedafa51ac027a4db51cba6223edfe1171..468f5646da7bc413a6e91e82379e6554cc8b459d 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -557,9 +557,9 @@ public final class SimplePluginManager implements PluginManager { @@ -23,7 +23,7 @@ index b878e7167cfcdea0e224c182b40abeadd339d3b3..9611e8e254b4fa9579dc9ffd5198182c } diff --git a/src/main/java/org/bukkit/scheduler/BukkitScheduler.java b/src/main/java/org/bukkit/scheduler/BukkitScheduler.java -index 487b5ca23159b531475c3d650894be707b49914e..31b90d1c2259a8f200b0589909dbbfe4cc526989 100644 +index 5c277ac7a61df8106f7c13a1ad8ccb1509338699..446c115f19c4dde0d5e269f8d120bc51ad3898e0 100644 --- a/src/main/java/org/bukkit/scheduler/BukkitScheduler.java +++ b/src/main/java/org/bukkit/scheduler/BukkitScheduler.java @@ -7,6 +7,15 @@ import java.util.function.Consumer; diff --git a/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch b/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch index 77c6b43..0d1e360 100644 --- a/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch +++ b/patches/api/0003-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch @@ -31,7 +31,7 @@ index 3c768d5ccf490e962d9638e92d4ea7c85670bad8..2dbc9fc268850c85e4e8d38da05586a0 + } diff --git a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java b/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java -index a857e46fa6f0c212db93193e1fdd8b0ea9c33c38..90cd9568363a7532d600b627de605c12a7b816c7 100644 +index 6dfd51996893ca82b11a540cc18234e0b504f7ba..ff313bf0374c318971860a26f1629f708a5fec26 100644 --- a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java +++ b/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java @@ -267,6 +267,19 @@ public final class PluginDescriptionFile implements io.papermc.paper.plugin.conf diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch index 850dc53..76c362b 100644 --- a/patches/server/0001-Build-changes.patch +++ b/patches/server/0001-Build-changes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Build changes diff --git a/build.gradle.kts b/build.gradle.kts -index faf3e3fd72e8c915e7a4803dacbe1bb576c6663e..142714c7d47eb5de937ad385c81968148a7e4828 100644 +index 2da91ed6363c0851e4c459188f5e8ef5475e0c97..8d2b5fec6fe27dca3ce01ba1ce50506179fc3b4d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,7 @@ abstract class MockitoAgentProvider : CommandLineArgumentProvider { @@ -14,10 +14,10 @@ index faf3e3fd72e8c915e7a4803dacbe1bb576c6663e..142714c7d47eb5de937ad385c8196814 dependencies { - implementation(project(":paper-api")) + implementation(project(":folia-api")) // Folia + implementation("ca.spottedleaf:concurrentutil:0.0.2") // Paper - Add ConcurrentUtil dependency // Paper start implementation("org.jline:jline-terminal-ffm:3.27.1") // use ffm on java 22+ - implementation("org.jline:jline-terminal-jni:3.27.1") // fall back to jni on java 21 -@@ -99,14 +99,14 @@ tasks.jar { +@@ -100,14 +100,14 @@ tasks.jar { val gitBranch = git("rev-parse", "--abbrev-ref", "HEAD").getText().trim() // Paper attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", @@ -36,7 +36,7 @@ index faf3e3fd72e8c915e7a4803dacbe1bb576c6663e..142714c7d47eb5de937ad385c8196814 "Build-Number" to (build ?: ""), "Build-Time" to Instant.now().toString(), "Git-Branch" to gitBranch, // Paper -@@ -172,7 +172,7 @@ fun TaskContainer.registerRunTask( +@@ -173,7 +173,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { diff --git a/patches/server/0003-Threaded-Regions.patch b/patches/server/0003-Threaded-Regions.patch index 7849070..da883b4 100644 --- a/patches/server/0003-Threaded-Regions.patch +++ b/patches/server/0003-Threaded-Regions.patch @@ -269,7 +269,7 @@ index 217d1f908a36a5177ba3cbb80a33f73d4dab0fa0..301cc1c0d91f5e755f74ace60dbe5551 } } diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java -index 93335de8cf514dc8417e4b9b2d495663deda2904..404081147b504ebc6d0dba8bbf37dc4fba309eb0 100644 +index 7554c109c35397bc1a43dd80e87764fd78645bbf..db16fe8d664f9b04710200d63439564cb97c0066 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/EntityLookup.java @@ -460,6 +460,19 @@ public abstract class EntityLookup implements LevelEntityGetter { @@ -292,7 +292,7 @@ index 93335de8cf514dc8417e4b9b2d495663deda2904..404081147b504ebc6d0dba8bbf37dc4f protected void removeEntity(final Entity entity) { final int sectionX = ((ChunkSystemEntity)entity).moonrise$getSectionX(); final int sectionY = ((ChunkSystemEntity)entity).moonrise$getSectionY(); -@@ -1067,6 +1080,9 @@ public abstract class EntityLookup implements LevelEntityGetter { +@@ -986,6 +999,9 @@ public abstract class EntityLookup implements LevelEntityGetter { EntityLookup.this.removeEntityCallback(entity); this.entity.setLevelCallback(NoOpCallback.INSTANCE); @@ -414,7 +414,7 @@ index 7eafc5b7cba23d8dec92ecc1050afe3fd8c9e309..4bfcae47ed76346e6200514ebce5b04f \ No newline at end of file +} diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java -index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa497b590657 100644 +index 3990834a41116682d6ae779a3bf24b0fd989d97d..dbb5b6ee36a54d6682b2a6d9389aee721b95d506 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java @@ -57,6 +57,14 @@ import java.util.concurrent.atomic.AtomicReference; @@ -557,10 +557,10 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 MoonriseRegionFileIO.flush(this.world); if (halt) { -@@ -219,28 +287,35 @@ public final class ChunkHolderManager { - LOGGER.error("Failed to close '" + type.name() + "' regionfile cache for world '" + WorldUtil.getWorldName(this.world) + "'", ex); - } +@@ -221,28 +289,35 @@ public final class ChunkHolderManager { } + + this.taskScheduler.setShutdown(true); + } // Folia - region threading } @@ -600,7 +600,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 holder.lastAutoSave = currentTick; if (holder.save(false) != null) { -@@ -254,15 +329,38 @@ public final class ChunkHolderManager { +@@ -256,15 +331,38 @@ public final class ChunkHolderManager { for (final NewChunkHolder holder : reschedule) { if (holder.getChunkStatus().isOrAfter(FullChunkStatus.FULL)) { @@ -642,7 +642,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 LOGGER.info("Saving all chunkholders for world '" + WorldUtil.getWorldName(this.world) + "'"); } -@@ -291,6 +389,12 @@ public final class ChunkHolderManager { +@@ -293,6 +391,12 @@ public final class ChunkHolderManager { } for (int i = 0, len = holders.size(); i < len; ++i) { final NewChunkHolder holder = holders.get(i); @@ -655,7 +655,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 try { final NewChunkHolder.SaveStat saveStat = holder.save(shutdown); if (saveStat != null) { -@@ -326,7 +430,7 @@ public final class ChunkHolderManager { +@@ -328,7 +432,7 @@ public final class ChunkHolderManager { } } } @@ -664,7 +664,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 MoonriseRegionFileIO.flush(this.world); try { MoonriseRegionFileIO.flushRegionStorages(this.world); -@@ -731,7 +835,13 @@ public final class ChunkHolderManager { +@@ -733,7 +837,13 @@ public final class ChunkHolderManager { } public void tick() { @@ -679,7 +679,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 final int sectionShift = ((ChunkSystemServerLevel)this.world).moonrise$getRegionChunkShift(); -@@ -745,7 +855,7 @@ public final class ChunkHolderManager { +@@ -747,7 +857,7 @@ public final class ChunkHolderManager { return removeDelay <= 0L; }; @@ -688,7 +688,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 final long sectionKey = iterator.nextLong(); if (!this.sectionToChunkToExpireCount.containsKey(sectionKey)) { -@@ -1030,26 +1140,56 @@ public final class ChunkHolderManager { +@@ -1032,26 +1142,56 @@ public final class ChunkHolderManager { if (changedFullStatus.isEmpty()) { return; } @@ -758,7 +758,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 ChunkSystem.onChunkHolderDelete(this.world, holder.vanillaChunkHolder); this.chunkHolders.remove(CoordinateUtils.getChunkKey(holder.chunkX, holder.chunkZ)); } -@@ -1062,7 +1202,7 @@ public final class ChunkHolderManager { +@@ -1064,7 +1204,7 @@ public final class ChunkHolderManager { throw new IllegalStateException("Cannot unload chunks recursively"); } final int sectionShift = this.unloadQueue.coordinateShift; // sectionShift <= lock shift @@ -767,7 +767,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 int unloadCountTentative = 0; for (final ChunkUnloadQueue.SectionToUnload sectionRef : unloadSectionsForRegion) { final ChunkUnloadQueue.UnloadSection section -@@ -1380,7 +1520,13 @@ public final class ChunkHolderManager { +@@ -1382,7 +1522,13 @@ public final class ChunkHolderManager { // only call on tick thread private boolean processPendingFullUpdate() { @@ -782,7 +782,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 boolean ret = false; -@@ -1391,9 +1537,7 @@ public final class ChunkHolderManager { +@@ -1393,9 +1539,7 @@ public final class ChunkHolderManager { ret |= holder.handleFullStatusChange(changedFullStatus); if (!changedFullStatus.isEmpty()) { @@ -794,7 +794,7 @@ index 91a6f57f35fc1553159cca138a0619e703b2b014..3a476713964002734a9e67fd9b6dfa49 } } diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java -index b0bfe655922877676948d9b6ff3fa5a6ebb7a640..9b49234ae3c15585e4d8081a9cbd4388b1624c8d 100644 +index 67532b85073b7978254a0b04caadfe822679e61f..cba2d16c0cb5adc92952990ef95b1c979eafd40f 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java @@ -122,7 +122,7 @@ public final class ChunkTaskScheduler { @@ -806,7 +806,7 @@ index b0bfe655922877676948d9b6ff3fa5a6ebb7a640..9b49234ae3c15585e4d8081a9cbd4388 public final ChunkHolderManager chunkHolderManager; -@@ -327,14 +327,13 @@ public final class ChunkTaskScheduler { +@@ -337,14 +337,13 @@ public final class ChunkTaskScheduler { }; // this may not be good enough, specifically thanks to stupid ass plugins swallowing exceptions @@ -823,7 +823,7 @@ index b0bfe655922877676948d9b6ff3fa5a6ebb7a640..9b49234ae3c15585e4d8081a9cbd4388 } public void raisePriority(final int x, final int z, final Priority priority) { -@@ -812,7 +811,7 @@ public final class ChunkTaskScheduler { +@@ -829,7 +828,7 @@ public final class ChunkTaskScheduler { */ @Deprecated public PrioritisedExecutor.PrioritisedTask scheduleChunkTask(final Runnable run, final Priority priority) { @@ -832,7 +832,7 @@ index b0bfe655922877676948d9b6ff3fa5a6ebb7a640..9b49234ae3c15585e4d8081a9cbd4388 } public PrioritisedExecutor.PrioritisedTask createChunkTask(final int chunkX, final int chunkZ, final Runnable run) { -@@ -821,7 +820,7 @@ public final class ChunkTaskScheduler { +@@ -838,7 +837,7 @@ public final class ChunkTaskScheduler { public PrioritisedExecutor.PrioritisedTask createChunkTask(final int chunkX, final int chunkZ, final Runnable run, final Priority priority) { @@ -841,7 +841,7 @@ index b0bfe655922877676948d9b6ff3fa5a6ebb7a640..9b49234ae3c15585e4d8081a9cbd4388 } public PrioritisedExecutor.PrioritisedTask scheduleChunkTask(final int chunkX, final int chunkZ, final Runnable run) { -@@ -830,9 +829,27 @@ public final class ChunkTaskScheduler { +@@ -847,9 +846,27 @@ public final class ChunkTaskScheduler { public PrioritisedExecutor.PrioritisedTask scheduleChunkTask(final int chunkX, final int chunkZ, final Runnable run, final Priority priority) { @@ -7906,7 +7906,7 @@ index 8aae1d113e84dfad9f2b6f0bcd203ca6c68bc5ce..ca98699f4225192bb3364397402b0700 } diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 0d12605dc84dad49faa18bf1fd058c3c168623ee..fa673b087eea4b48edf3c9ac48720fafc8d6f6ba 100644 +index c9d7ac819ce26f5301df7df56edce59b7ef377e0..fd5f2864c670c1580e07d67c47bc61d8b354a687 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java @@ -111,7 +111,7 @@ public interface DispenseItemBehavior { @@ -8122,7 +8122,7 @@ index 8f9fde5489c0e1d0a91203536caddec5a9c96f6c..d43489fa1f69f025d44b881205afba39 } diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index e693a003ea8f022eef8b49e4332025b769333b30..4c3961a10691362657b894a757d201069842d8d7 100644 +index 3c866432c8a938c677a315612f3e159bda67a2a2..30e3d0d7b0ca8cfa30efb60eefa73d94c65c4690 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java @@ -93,7 +93,7 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -8489,7 +8489,7 @@ index 1f7f68aad97ee73763c042837f239bdc7167db55..d6eb8f495688a1b65a4c419aa3ee655c } } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 4158473fd553a16fec23bcbcf9a278d413120600..28b3a1d2d2bb4bac8abc6f7ca877ce133110a455 100644 +index ab4f1bd1ebf0af54f3fa88ee9e2007d20445e7e9..9fa5c1628f2df441de47a38e732e7b033c3e2448 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -216,7 +216,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system AtomicReference atomicreference = new AtomicReference(); - Thread thread = new ca.spottedleaf.moonrise.common.util.TickThread(() -> { // Paper - rewrite chunk system -@@ -367,46 +410,30 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 ? Mth.square(ChunkProgressListener.calculateDiameter(i)) : 0; @@ -8706,7 +8706,7 @@ index 4158473fd553a16fec23bcbcf9a278d413120600..28b3a1d2d2bb4bac8abc6f7ca877ce13 // Iterator iterator = this.levels.values().iterator(); if (true) { -@@ -937,7 +976,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop true, false); } // Paper end - avoid issues with certain tasks not processing during sleep @@ -8977,7 +8977,7 @@ index 4158473fd553a16fec23bcbcf9a278d413120600..28b3a1d2d2bb4bac8abc6f7ca877ce13 // Paper start - Incremental chunk and player saving final ProfilerFiller profiler = Profiler.get(); int playerSaveInterval = io.papermc.paper.configuration.GlobalConfiguration.get().playerAutoSave.rate; -@@ -1676,15 +1804,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { String s = String.valueOf(worldserver); -@@ -1873,7 +1964,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop getAttributeModifiers(Entity target, Holder attribute) throws CommandSyntaxException { +@@ -301,11 +340,22 @@ public class AttributeCommand { + } + private static int setAttributeBase(CommandSourceStack source, Entity target, Holder attribute, double value) throws CommandSyntaxException { - getAttributeInstance(target, attribute).setBaseValue(value); + // Folia start - region threading @@ -9450,6 +9454,8 @@ index 2122fcbbe84a8a797be56e3bdc799f1f33b1617d..c376f0365771f554943f607fd04fbde4 + // Folia end - region threading } + private static int resetAttributeBase(CommandSourceStack source, Entity target, Holder attribute) throws CommandSyntaxException { +@@ -324,35 +374,57 @@ public class AttributeCommand { private static int addModifier( CommandSourceStack source, Entity target, Holder attribute, ResourceLocation id, double value, AttributeModifier.Operation operation ) throws CommandSyntaxException { @@ -9755,7 +9761,7 @@ index cf0a5943f457c532958f40b4989fa18f967abae6..10422cbac32c7dfbd65cda3157f30b4d + // Folia end - region threading } diff --git a/src/main/java/net/minecraft/server/commands/ExperienceCommand.java b/src/main/java/net/minecraft/server/commands/ExperienceCommand.java -index a1f6d753e99e5a6a775e2dcf2a180b76d6445608..82a22e59a02333a763f36f445f3a5f4301f131dd 100644 +index b4578e25286a245bba84543fac50c415dc20ba36..89cc58ba70930822f7a678577b8b7c7077a35791 100644 --- a/src/main/java/net/minecraft/server/commands/ExperienceCommand.java +++ b/src/main/java/net/minecraft/server/commands/ExperienceCommand.java @@ -131,14 +131,18 @@ public class ExperienceCommand { @@ -10052,7 +10058,7 @@ index e8ab673921c8089a35a2e678d7a6efed1f728cd7..287681a351f49eabd4f480396314a882 if (targets.size() == 1) { diff --git a/src/main/java/net/minecraft/server/commands/PlaceCommand.java b/src/main/java/net/minecraft/server/commands/PlaceCommand.java -index 07fb6f43a5a0e26b3192ac38b18f5de8d2cbf769..fd4321372985213c0605dd83221caa98e826e96d 100644 +index 89f89c0d223961a5aabfe60150893984f5894ff9..7f55ea913e557d99cf575ae4604523ca6d0c1f17 100644 --- a/src/main/java/net/minecraft/server/commands/PlaceCommand.java +++ b/src/main/java/net/minecraft/server/commands/PlaceCommand.java @@ -88,12 +88,25 @@ public class PlaceCommand { @@ -10139,8 +10145,8 @@ index 07fb6f43a5a0e26b3192ac38b18f5de8d2cbf769..fd4321372985213c0605dd83221caa98 + ca.spottedleaf.concurrentutil.util.Priority.NORMAL, + (chunks) -> { + try { -+ // Folia end - region threading - StructureStart structurestart = structure1.generate(source.registryAccess(), chunkgenerator, chunkgenerator.getBiomeSource(), worldserver.getChunkSource().randomState(), worldserver.getStructureManager(), worldserver.getSeed(), new ChunkPos(pos), 0, worldserver, (holder) -> { ++ // Folia end - region threading + StructureStart structurestart = structure1.generate(structure, worldserver.dimension(), source.registryAccess(), chunkgenerator, chunkgenerator.getBiomeSource(), worldserver.getChunkSource().randomState(), worldserver.getStructureManager(), worldserver.getSeed(), new ChunkPos(pos), 0, worldserver, (holder) -> { return true; }); @@ -146,12 +189,27 @@ public class PlaceCommand { @@ -10350,7 +10356,7 @@ index c13b6f14c3061710c2b27034db240cc94ec0fcb5..854897f5fcc8109a69cabc7d4fef1a23 boolean result; if (target instanceof ServerPlayer player) { diff --git a/src/main/java/net/minecraft/server/commands/TimeCommand.java b/src/main/java/net/minecraft/server/commands/TimeCommand.java -index 44fcd43a466fb47d31ab05e44bafbef3c4cae63f..2989750a75b3dd244cf8f9ca78769308f982374b 100644 +index 8b83d747de831878ff45dc74b4ae7cd9efb21d8c..81a1797c7bbfba6420c160f5558ca79496787561 100644 --- a/src/main/java/net/minecraft/server/commands/TimeCommand.java +++ b/src/main/java/net/minecraft/server/commands/TimeCommand.java @@ -58,6 +58,7 @@ public class TimeCommand { @@ -10368,8 +10374,8 @@ index 44fcd43a466fb47d31ab05e44bafbef3c4cae63f..2989750a75b3dd244cf8f9ca78769308 + }); // Folia - region threading } - source.sendSuccess(() -> { -@@ -79,6 +81,7 @@ public class TimeCommand { + source.getServer().forceTimeSynchronization(); +@@ -80,6 +82,7 @@ public class TimeCommand { while (iterator.hasNext()) { ServerLevel worldserver = (ServerLevel) iterator.next(); @@ -10377,7 +10383,7 @@ index 44fcd43a466fb47d31ab05e44bafbef3c4cae63f..2989750a75b3dd244cf8f9ca78769308 // CraftBukkit start TimeSkipEvent event = new TimeSkipEvent(worldserver.getWorld(), TimeSkipEvent.SkipReason.COMMAND, time); Bukkit.getPluginManager().callEvent(event); -@@ -86,13 +89,16 @@ public class TimeCommand { +@@ -87,14 +90,17 @@ public class TimeCommand { worldserver.setDayTime(worldserver.getDayTime() + event.getSkipAmount()); } // CraftBukkit end @@ -10385,6 +10391,7 @@ index 44fcd43a466fb47d31ab05e44bafbef3c4cae63f..2989750a75b3dd244cf8f9ca78769308 } + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading + source.getServer().forceTimeSynchronization(); int j = TimeCommand.getDayTime(source.getLevel()); source.sendSuccess(() -> { @@ -10960,7 +10967,7 @@ index 746f61661e22d22f2acbbe54a5933e57fbca45b2..f6015f2ac77aeddbd900226d183bf24c public String getDebugStatus() { diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665bc12d3431 100644 +index 1c87904bb99cc40bafc9357fb2fc1703b759c3df..1a43c6fba5eea514dd6cf406f600dc254282da35 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -62,18 +62,14 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon @@ -10996,7 +11003,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b final ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler chunkTaskScheduler = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)this.level).moonrise$getChunkTaskScheduler(); final CompletableFuture completable = new CompletableFuture<>(); chunkTaskScheduler.scheduleChunkLoad( -@@ -322,6 +323,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -329,6 +330,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } public CompletableFuture> getChunkFuture(int chunkX, int chunkZ, ChunkStatus leastStatus, boolean create) { @@ -11004,7 +11011,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b boolean flag1 = Thread.currentThread() == this.mainThread; CompletableFuture completablefuture; -@@ -475,16 +477,17 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -482,16 +484,17 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } private void tickChunks() { @@ -11026,7 +11033,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b try { gameprofilerfiller.push("filteringTickingChunks"); -@@ -507,8 +510,9 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -514,8 +517,9 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } private void broadcastChangedChunks(ProfilerFiller profiler) { @@ -11037,7 +11044,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b while (iterator.hasNext()) { ChunkHolder playerchunk = (ChunkHolder) iterator.next(); -@@ -519,14 +523,14 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -526,14 +530,14 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } } @@ -11054,7 +11061,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b final ServerChunkCache.ChunkAndHolder[] raw = tickingChunks.getRawDataUnchecked(); final int size = tickingChunks.size(); -@@ -547,6 +551,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -554,6 +558,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } private void tickChunks(ProfilerFiller profiler, long timeDelta, List chunks) { @@ -11062,7 +11069,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b profiler.popPush("naturalSpawnCount"); int j = this.distanceManager.getNaturalSpawnChunkCount(); // Paper start - Optional per player mob spawns -@@ -554,7 +559,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -561,7 +566,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon NaturalSpawner.SpawnState spawnercreature_d; // moved down if ((this.spawnFriendlies || this.spawnEnemies) && this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { // don't count mobs when animals and monsters are disabled // re-set mob counts @@ -11071,7 +11078,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b // Paper start - per player mob spawning backoff for (int ii = 0; ii < ServerPlayer.MOBCATEGORY_TOTAL_ENUMS; ii++) { player.mobCounts[ii] = 0; -@@ -567,28 +572,28 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -574,28 +579,28 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } // Paper end - per player mob spawning backoff } @@ -11106,7 +11113,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b list1 = NaturalSpawner.getFilteredSpawningCategories(spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1, this.level); // CraftBukkit } else { -@@ -662,21 +667,26 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -669,21 +674,26 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon ChunkHolder playerchunk = this.getVisibleChunkIfPresent(ChunkPos.asLong(i, j)); if (playerchunk != null && playerchunk.blockChanged(pos)) { @@ -11137,7 +11144,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b } public void addRegionTicket(TicketType ticketType, ChunkPos pos, int radius, T argument) { -@@ -760,7 +770,8 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -767,7 +777,8 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon @Nullable @VisibleForDebug public NaturalSpawner.SpawnState getLastSpawnState() { @@ -11147,7 +11154,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b } public void removeTicketsOnClosing() { -@@ -769,7 +780,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -776,7 +787,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon public void onChunkReadyToSend(ChunkHolder chunkHolder) { if (chunkHolder.hasChangesToBroadcast()) { @@ -11156,7 +11163,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b } } -@@ -807,8 +818,59 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -814,8 +825,59 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon return ServerChunkCache.this.mainThread; } @@ -11216,7 +11223,7 @@ index d021cd5b6136f0125076513977f430c6d4dd4f9f..16001634fef7573e5363d2903e2b665b Profiler.get().incrementCounter("runTask"); super.doRunTask(task); } -@@ -816,12 +878,17 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -823,12 +885,17 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon @Override // CraftBukkit start - process pending Chunk loadCallback() and unloadCallback() after each run task public boolean pollTask() { @@ -11270,10 +11277,10 @@ index 296059746fe9f5c35fedd8ca1dea488da519ac05..7df954d6375abb83cb0b140a16336b47 list.add(player); } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c2081dc5f78f 100644 +index 7270a94246df73ee195156fc7b62470d090a337a..6fe476d8014ab7540309d0b1c7ef6377cea94d8c 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -195,42 +195,40 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -196,42 +196,40 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private static final Logger LOGGER = LogUtils.getLogger(); private static final int EMPTY_TIME_NO_TICK = 300; private static final int MAX_SCHEDULED_TICKS_PER_TICK = 65536; @@ -11327,7 +11334,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 public LevelChunk getChunkIfLoaded(int x, int z) { return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately -@@ -258,6 +256,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -259,6 +257,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe int minChunkZ = minBlockZ >> 4; int maxChunkZ = maxBlockZ >> 4; @@ -11341,7 +11348,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 ServerChunkCache chunkProvider = this.getChunkSource(); for (int cx = minChunkX; cx <= maxChunkX; ++cx) { -@@ -313,11 +318,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -314,11 +319,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private final ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler chunkTaskScheduler; private long lastMidTickFailure; private long tickedBlocksOrFluids; @@ -11354,7 +11361,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 @Override public final LevelChunk moonrise$getFullChunkIfLoaded(final int chunkX, final int chunkZ) { -@@ -375,7 +376,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -376,7 +377,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @Override public final int moonrise$getRegionChunkShift() { @@ -11363,7 +11370,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } @Override -@@ -474,22 +475,22 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -475,22 +476,22 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @Override public final ca.spottedleaf.moonrise.common.misc.NearbyPlayers moonrise$getNearbyPlayers() { @@ -11390,7 +11397,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } @Override -@@ -509,91 +510,96 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -510,91 +511,96 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper end - rewrite chunk system // Paper start - chunk tick iteration private static final ServerChunkCache.ChunkAndHolder[] EMPTY_PLAYER_CHUNK_HOLDERS = new ServerChunkCache.ChunkAndHolder[0]; @@ -11542,7 +11549,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // Add env and gen to constructor, IWorldDataServer -> WorldDataServer public ServerLevel(MinecraftServer minecraftserver, Executor executor, LevelStorageSource.LevelStorageAccess convertable_conversionsession, PrimaryLevelData iworlddataserver, ResourceKey resourcekey, LevelStem worlddimension, ChunkProgressListener worldloadlistener, boolean flag, long i, List list, boolean flag1, @Nullable RandomSequences randomsequences, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { -@@ -638,7 +644,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -639,7 +645,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe }); this.chunkSource.getGeneratorState().ensureStructuresGenerated(); this.portalForcer = new PortalForcer(this); @@ -11551,7 +11558,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 this.prepareWeather(); this.getWorldBorder().setAbsoluteMaxSize(minecraftserver.getAbsoluteMaxWorldSize()); this.raids = (Raids) this.getDataStorage().computeIfAbsent(Raids.factory(this), Raids.getFileId(this.dimensionTypeRegistration())); -@@ -676,7 +682,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -677,7 +683,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.chunkDataController = new ca.spottedleaf.moonrise.patches.chunk_system.io.datacontroller.ChunkDataController((ServerLevel)(Object)this, this.chunkTaskScheduler); // Paper end - rewrite chunk system this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit @@ -11566,7 +11573,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // Paper start @Override -@@ -705,60 +718,44 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -706,60 +719,44 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe return this.getChunkSource().getGenerator().getBiomeSource().getNoiseBiome(biomeX, biomeY, biomeZ, this.getChunkSource().randomState().sampler()); } @@ -11639,7 +11646,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 gameprofilerfiller.pop(); } -@@ -774,9 +771,9 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -775,9 +772,9 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.runBlockEvents(); } @@ -11651,7 +11658,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 if (flag1) { this.resetEmptyTime(); -@@ -785,17 +782,27 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -786,17 +783,27 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe if (flag1 || this.emptyTime++ < 300) { gameprofilerfiller.push("entities"); if (this.dragonFight != null && flag) { @@ -11680,7 +11687,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 gameprofilerfiller.pop(); if (true) { // Paper - rewrite chunk system Entity entity1 = entity.getVehicle(); -@@ -824,6 +831,31 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -825,6 +832,31 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe gameprofilerfiller.pop(); } @@ -11712,7 +11719,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 @Override public boolean shouldTickBlocksAt(long chunkPos) { // Paper start - rewrite chunk system -@@ -834,13 +866,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -835,13 +867,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe protected void tickTime() { if (this.tickTime) { @@ -11731,7 +11738,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 this.setDayTime(this.levelData.getDayTime() + 1L); } -@@ -865,17 +898,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -866,17 +899,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private void wakeUpAllPlayers() { this.sleepStatus.removeAllSleepers(); (this.players.stream().filter(LivingEntity::isSleeping).collect(Collectors.toList())).forEach((entityplayer) -> { // CraftBukkit - decompile error @@ -11759,7 +11766,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294(); final ChunkPos cpos = chunk.getPos(); -@@ -922,7 +962,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -923,7 +963,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper end - optimise random ticking public void tickChunk(LevelChunk chunk, int randomTickSpeed) { @@ -11768,7 +11775,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 ChunkPos chunkcoordintpair = chunk.getPos(); boolean flag = this.isRaining(); int j = chunkcoordintpair.getMinBlockX(); -@@ -1060,7 +1100,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1061,7 +1101,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } public boolean isHandlingTick() { @@ -11777,7 +11784,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } public boolean canSleepThroughNights() { -@@ -1092,6 +1132,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1093,6 +1133,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } public void updateSleepingPlayerList() { @@ -11792,7 +11799,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 if (!this.players.isEmpty() && this.sleepStatus.update(this.players)) { this.announceSleepStatus(); } -@@ -1103,7 +1151,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1104,7 +1152,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe return this.server.getScoreboard(); } @@ -11801,7 +11808,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 boolean flag = this.isRaining(); if (this.dimensionType().hasSkyLight()) { -@@ -1189,23 +1237,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1190,23 +1238,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.THUNDER_LEVEL_CHANGE, this.thunderLevel)); } // */ @@ -11835,7 +11842,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } } // CraftBukkit end -@@ -1267,13 +1316,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1268,13 +1317,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper start - log detailed entity tick information // TODO replace with varhandle @@ -11851,7 +11858,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } // Paper end - log detailed entity tick information -@@ -1281,9 +1327,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1282,9 +1328,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper start - log detailed entity tick information ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot tick an entity off-main"); try { @@ -11862,7 +11869,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // Paper end - log detailed entity tick information // Spigot start /*if (!org.spigotmc.ActivationRange.checkIfActive(entity)) { // Paper - comment out EAR 2 -@@ -1303,7 +1347,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1304,7 +1348,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity); // Paper - EAR 2 if (isActive) { // Paper - EAR 2 entity.tick(); @@ -11880,7 +11887,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } else { entity.inactiveTick(); } // Paper - EAR 2 gameprofilerfiller.pop(); Iterator iterator = entity.getPassengers().iterator(); -@@ -1316,16 +1369,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1317,16 +1370,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper start - log detailed entity tick information } finally { @@ -11899,7 +11906,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 passenger.setOldPosAndRot(); ++passenger.tickCount; ProfilerFiller gameprofilerfiller = Profiler.get(); -@@ -1337,7 +1388,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1338,7 +1389,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper start - EAR 2 if (isActive) { passenger.rideTick(); @@ -11917,7 +11924,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } else { passenger.setDeltaMovement(Vec3.ZERO); passenger.inactiveTick(); -@@ -1422,19 +1482,20 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1423,19 +1483,20 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } // Paper end - add close param @@ -11946,7 +11953,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 DimensionDataStorage worldpersistentdata = this.getChunkSource().getDataStorage(); -@@ -1496,6 +1557,19 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1497,6 +1558,19 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe return list; } @@ -11966,7 +11973,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 @Nullable public ServerPlayer getRandomPlayer() { List list = this.getPlayers(LivingEntity::isAlive); -@@ -1580,8 +1654,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1581,8 +1655,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } else { if (entity instanceof net.minecraft.world.entity.item.ItemEntity itemEntity && itemEntity.getItem().isEmpty()) return false; // Paper - Prevent empty items from being added // Paper start - capture all item additions to the world @@ -11977,7 +11984,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 return true; } // Paper end - capture all item additions to the world -@@ -1750,21 +1824,22 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1751,21 +1825,22 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @Override public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { @@ -12003,7 +12010,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 while (iterator.hasNext()) { // CraftBukkit start - fix SPIGOT-6362 -@@ -1787,7 +1862,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1788,7 +1863,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } try { @@ -12012,7 +12019,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 iterator = list.iterator(); while (iterator.hasNext()) { -@@ -1796,7 +1871,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1797,7 +1872,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe navigationabstract1.recomputePath(); } } finally { @@ -12021,7 +12028,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } } -@@ -1805,29 +1880,29 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1806,29 +1881,29 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @Override public void updateNeighborsAt(BlockPos pos, Block block) { @@ -12057,7 +12064,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } @Override -@@ -1897,7 +1972,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1898,7 +1973,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } // CraftBukkit end ParticleOptions particleparam2 = serverexplosion.isSmall() ? particleparam : particleparam1; @@ -12066,7 +12073,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 while (iterator.hasNext()) { ServerPlayer entityplayer = (ServerPlayer) iterator.next(); -@@ -1918,25 +1993,28 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1919,25 +1994,28 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @Override public void blockEvent(BlockPos pos, Block block, int type, int data) { @@ -12101,7 +12108,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } private boolean doBlockEvent(BlockEventData event) { -@@ -1947,12 +2025,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1948,12 +2026,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @Override public LevelTicks getBlockTicks() { @@ -12116,16 +12123,16 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } @Nonnull -@@ -1976,7 +2054,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1977,7 +2055,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - public int sendParticles(ServerPlayer sender, T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, boolean force) { + public int sendParticlesSource(ServerPlayer sender, T t0, boolean flag, boolean flag1, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { // Paper start - Particle API -- return sendParticles(players, sender, t0, d0, d1, d2, i, d3, d4, d5, d6, force); -+ return sendParticles(this.getLocalPlayers(), sender, t0, d0, d1, d2, i, d3, d4, d5, d6, force); // Folia - region threading +- return this.sendParticlesSource(this.players, sender, t0, flag, flag1, d0, d1, d2, i, d3, d4, d5, d6); ++ return this.sendParticlesSource(this.getLocalPlayers(), sender, t0, flag, flag1, d0, d1, d2, i, d3, d4, d5, d6); // Folia - region threading } - public int sendParticles(List receivers, @Nullable ServerPlayer sender, T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, boolean force) { + public int sendParticlesSource(List receivers, @Nullable ServerPlayer sender, T t0, boolean flag, boolean flag1, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { // Paper end - Particle API -@@ -2029,7 +2107,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2035,7 +2113,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public Entity getEntityOrPart(int id) { Entity entity = (Entity) this.getEntities().get(id); @@ -12140,8 +12147,8 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 + // Folia end - region threading } - @Nullable -@@ -2084,6 +2169,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + @Override +@@ -2090,6 +2175,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper start - Call missing map initialize event and set id final DimensionDataStorage storage = this.getServer().overworld().getDataStorage(); @@ -12149,7 +12156,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 final Optional cacheEntry = storage.cache.get(id.key()); if (cacheEntry == null) { // Cache did not contain, try to load and may init final MapItemSavedData worldmap = storage.get(MapItemSavedData.factory(), id.key()); // get populates the cache -@@ -2103,6 +2189,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2109,6 +2195,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } return null; @@ -12157,7 +12164,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // Paper end - Call missing map initialize event and set id } -@@ -2160,6 +2247,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2166,6 +2253,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } public boolean setChunkForced(int x, int z, boolean forced) { @@ -12165,7 +12172,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 ForcedChunksSavedData forcedchunk = (ForcedChunksSavedData) this.getDataStorage().computeIfAbsent(ForcedChunksSavedData.factory(), "chunks"); ChunkPos chunkcoordintpair = new ChunkPos(x, z); long k = chunkcoordintpair.toLong(); -@@ -2168,7 +2256,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2174,7 +2262,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe if (forced) { flag1 = forcedchunk.getChunks().add(k); if (flag1) { @@ -12174,7 +12181,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } } else { flag1 = forcedchunk.getChunks().remove(k); -@@ -2196,13 +2284,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2202,13 +2290,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe BlockPos blockposition1 = pos.immutable(); optional.ifPresent((holder) -> { @@ -12196,7 +12203,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // Paper start - Remove stale POIs if (optional.isEmpty() && this.getPoiManager().exists(blockposition1, poiType -> true)) { this.getPoiManager().remove(blockposition1); -@@ -2210,7 +2303,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2216,7 +2309,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper end - Remove stale POIs this.getPoiManager().add(blockposition1, holder); DebugPackets.sendPoiAddedPacket(this, blockposition1); @@ -12210,7 +12217,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 }); } } -@@ -2257,7 +2355,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2263,7 +2361,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe BufferedWriter bufferedwriter = Files.newBufferedWriter(path.resolve("stats.txt")); try { @@ -12219,7 +12226,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 NaturalSpawner.SpawnState spawnercreature_d = this.getChunkSource().getLastSpawnState(); if (spawnercreature_d != null) { -@@ -2271,7 +2369,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2277,7 +2375,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } bufferedwriter.write(String.format(Locale.ROOT, "entities: %s\n", this.moonrise$getEntityLookup().getDebugInfo())); // Paper - rewrite chunk system @@ -12228,7 +12235,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 bufferedwriter.write(String.format(Locale.ROOT, "block_ticks: %d\n", this.getBlockTicks().count())); bufferedwriter.write(String.format(Locale.ROOT, "fluid_ticks: %d\n", this.getFluidTicks().count())); bufferedwriter.write("distance_manager: " + playerchunkmap.getDistanceManager().getDebugStatus() + "\n"); -@@ -2417,7 +2515,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2423,7 +2521,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private void dumpBlockEntityTickers(Writer writer) throws IOException { CsvOutput csvwriter = CsvOutput.builder().addColumn("x").addColumn("y").addColumn("z").addColumn("type").build(writer); @@ -12237,7 +12244,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 while (iterator.hasNext()) { TickingBlockEntity tickingblockentity = (TickingBlockEntity) iterator.next(); -@@ -2430,7 +2528,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2436,7 +2534,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @VisibleForTesting public void clearBlockEvents(BoundingBox box) { @@ -12246,7 +12253,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 return box.isInside(blockactiondata.pos()); }); } -@@ -2439,7 +2537,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2445,7 +2543,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public void blockUpdated(BlockPos pos, Block block) { if (!this.isDebug()) { // CraftBukkit start @@ -12255,7 +12262,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 return; } // CraftBukkit end -@@ -2482,9 +2580,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2488,9 +2586,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @VisibleForTesting public String getWatchdogStats() { @@ -12266,7 +12273,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } private static String getTypeCount(Iterable items, Function classifier) { -@@ -2534,17 +2630,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2540,17 +2636,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } public void startTickingChunk(LevelChunk chunk) { @@ -12290,7 +12297,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } @Override -@@ -2564,7 +2661,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2570,7 +2667,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe return this.moonrise$getAnyChunkIfLoaded(ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkX(chunkPos), ca.spottedleaf.moonrise.common.util.CoordinateUtils.getChunkZ(chunkPos)) != null; // Paper - rewrite chunk system } @@ -12299,7 +12306,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // Paper start - rewrite chunk system final ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder chunkHolder = this.moonrise$getChunkTaskScheduler().chunkHolderManager.getChunkHolder(chunkPos); // isTicking implies the chunk is loaded, and the chunk is loaded now implies the entities are loaded -@@ -2659,7 +2756,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2665,7 +2762,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Paper start - optimize redstone (Alternate Current) @Override public alternate.current.wire.WireHandler getWireHandler() { @@ -12308,7 +12315,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } // Paper end - optimize redstone (Alternate Current) -@@ -2670,16 +2767,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2676,16 +2773,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public void onCreated(Entity entity) {} public void onDestroyed(Entity entity) { @@ -12328,7 +12335,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // Paper start - Reset pearls when they stop being ticked if (ServerLevel.this.paperConfig().fixes.disableUnloadedChunkEnderpearlExploit && ServerLevel.this.paperConfig().misc.legacyEnderPearlBehavior && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) { pearl.cachedOwner = null; -@@ -2690,6 +2787,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2696,6 +2793,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public void onTrackingStart(Entity entity) { org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot @@ -12336,7 +12343,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server; moved down below valid=true if (entity instanceof ServerPlayer entityplayer) { ServerLevel.this.players.add(entityplayer); -@@ -2703,7 +2801,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2709,7 +2807,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -12345,7 +12352,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } if (entity instanceof EnderDragon entityenderdragon) { -@@ -2713,7 +2811,9 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2719,7 +2817,9 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -12355,7 +12362,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } } -@@ -2735,16 +2835,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2741,16 +2841,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public void onTrackingEnd(Entity entity) { org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot @@ -12381,7 +12388,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 map.carriedByPlayers.remove( (Player) entity ); for ( Iterator iter = (Iterator) map.carriedBy.iterator(); iter.hasNext(); ) { -@@ -2754,6 +2862,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2760,6 +2868,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe iter.remove(); } } @@ -12389,7 +12396,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } } } ); -@@ -2784,7 +2893,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2790,7 +2899,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -12398,7 +12405,7 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 } if (entity instanceof EnderDragon entityenderdragon) { -@@ -2794,13 +2903,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2800,13 +2909,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -12416,10 +12423,10 @@ index 585e2b43a0326f0b81597fa1234d3c67c76af550..cb2c0358fb462c4a5ebf94299119c208 for (ServerPlayer player : ServerLevel.this.server.getPlayerList().players) { // Paper - call onEntityRemove for all online players player.getBukkitEntity().onEntityRemove(entity); diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 5a8f396d47577f087abb415c972fd4f51e50faba..cb34ed2fe8d1bc087d57eca39f71286d81c7bb71 100644 +index 8aff5b7dd14b835788348b22b1fec4d381df816f..ea3b3f624ab9f4fbdc6ff4e90076b5616728f6ca 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -221,7 +221,7 @@ import org.bukkit.inventory.MainHand; +@@ -220,7 +220,7 @@ import org.bukkit.inventory.MainHand; public class ServerPlayer extends net.minecraft.world.entity.player.Player implements ca.spottedleaf.moonrise.patches.chunk_system.player.ChunkSystemServerPlayer { // Paper - rewrite chunk system private static final Logger LOGGER = LogUtils.getLogger(); @@ -12428,7 +12435,7 @@ index 5a8f396d47577f087abb415c972fd4f51e50faba..cb34ed2fe8d1bc087d57eca39f71286d private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32; private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10; private static final int FLY_STAT_RECORDING_SPEED = 25; -@@ -543,8 +543,149 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -541,8 +541,149 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple } // CraftBukkit end @@ -12578,7 +12585,7 @@ index 5a8f396d47577f087abb415c972fd4f51e50faba..cb34ed2fe8d1bc087d57eca39f71286d AABB axisalignedbb = this.getDimensions(Pose.STANDING).makeBoundingBox(Vec3.ZERO); BlockPos blockposition1 = basePos; -@@ -885,11 +1026,18 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -883,11 +1024,18 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple if (worldserver != null) { Entity entity = EntityType.loadEntityRecursive(nbttagcompound, worldserver, EntitySpawnReason.LOAD, (entity1) -> { @@ -12599,7 +12606,7 @@ index 5a8f396d47577f087abb415c972fd4f51e50faba..cb34ed2fe8d1bc087d57eca39f71286d } else { ServerPlayer.LOGGER.warn("Failed to spawn player ender pearl in level ({}), skipping", optional1.get()); } -@@ -1581,6 +1729,323 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1572,6 +1720,323 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple } @@ -12923,7 +12930,7 @@ index 5a8f396d47577f087abb415c972fd4f51e50faba..cb34ed2fe8d1bc087d57eca39f71286d @Nullable @Override public ServerPlayer teleport(TeleportTransition teleportTarget) { -@@ -2625,6 +3090,12 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -2605,6 +3070,12 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple public void setCamera(@Nullable Entity entity) { Entity entity1 = this.getCamera(); @@ -12936,7 +12943,7 @@ index 5a8f396d47577f087abb415c972fd4f51e50faba..cb34ed2fe8d1bc087d57eca39f71286d this.camera = (Entity) (entity == null ? this : entity); if (entity1 != this.camera) { // Paper start - Add PlayerStartSpectatingEntityEvent and PlayerStopSpectatingEntity -@@ -3118,11 +3589,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -3098,11 +3569,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple } public void registerEnderPearl(ThrownEnderpearl enderPearl) { @@ -12950,7 +12957,7 @@ index 5a8f396d47577f087abb415c972fd4f51e50faba..cb34ed2fe8d1bc087d57eca39f71286d } public Set getEnderPearls() { -@@ -3281,7 +3752,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -3261,7 +3732,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple this.experienceLevel = this.newLevel; this.totalExperience = this.newTotalExp; this.experienceProgress = 0; @@ -13002,13 +13009,13 @@ index a96f859a5d0c6ec692d4627a69f3c9ee49199dbc..ad8da6726b4113068b200426ab1ac1e2 org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, state, this.player, itemsToDrop); // Paper - capture all item additions to the world } diff --git a/src/main/java/net/minecraft/server/level/TicketType.java b/src/main/java/net/minecraft/server/level/TicketType.java -index e701f57ac8b0efdf739389f9be7a255220bb3e21..acf6287da9a44796c0ba48297d682b9d2488bfd9 100644 +index 4d3f7d4a8e05a8d84aa5202134eda1ce9621712e..02e97634932f4aea6ea36a8e6479ec90cbba0a54 100644 --- a/src/main/java/net/minecraft/server/level/TicketType.java +++ b/src/main/java/net/minecraft/server/level/TicketType.java @@ -26,6 +26,14 @@ public class TicketType { - public static final TicketType UNKNOWN = TicketType.create("unknown", Comparator.comparingLong(ChunkPos::toLong), 1); public static final TicketType PLUGIN = TicketType.create("plugin", (a, b) -> 0); // CraftBukkit public static final TicketType PLUGIN_TICKET = TicketType.create("plugin_ticket", (plugin1, plugin2) -> plugin1.getClass().getName().compareTo(plugin2.getClass().getName())); // CraftBukkit + public static final TicketType POST_TELEPORT = TicketType.create("post_teleport", Integer::compare, 5); // Paper - post teleport ticket type + // Folia start - region threading + public static final TicketType LOGIN = create("folia:login", (u1, u2) -> 0, 20); + public static final TicketType DELAYED = create("folia:delay", (u1, u2) -> 0, 5); @@ -13238,10 +13245,10 @@ index 3a9e25b436f366fffe08c3b0c1fce11ed42ee646..ae88c6e2635b1608383f8c74813d723f Collections.shuffle( this.connections ); } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65cc3497250 100644 +index 2fbe3d8722eeacc3b27ce38145aeffa610f9daab..5a58b1218d787276d2ac95f77df78d18c762d746 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -310,7 +310,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -312,7 +312,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl private final LastSeenMessagesValidator lastSeenMessages = new LastSeenMessagesValidator(20); private final MessageSignatureCache messageSignatureCache = MessageSignatureCache.createDefault(); private final FutureChain chatMessageChain; @@ -13250,7 +13257,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c private static final int MAX_SIGN_LINE_LENGTH = Integer.getInteger("Paper.maxSignLength", 80); // Paper - Limit client sign length public ServerGamePacketListenerImpl(MinecraftServer server, Connection connection, ServerPlayer player, CommonListenerCookie clientData) { -@@ -327,10 +327,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -329,10 +329,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // CraftBukkit start - add fields and methods @@ -13264,7 +13271,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c private int dropCount = 0; private boolean hasMoved = false; -@@ -342,8 +342,21 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -344,8 +344,21 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl private boolean justTeleported = false; // CraftBukkit end @@ -13286,7 +13293,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c if (this.ackBlockChangesUpTo > -1) { this.send(new ClientboundBlockChangedAckPacket(this.ackBlockChangesUpTo)); this.ackBlockChangesUpTo = -1; -@@ -392,7 +405,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -394,7 +407,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.aboveGroundVehicleTickCount = 0; } @@ -13295,7 +13302,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c this.chatSpamThrottler.tick(); this.tabSpamThrottler.tick(); // Paper - configurable tab spam limits this.recipeSpamPackets.tick(); // Paper - auto recipe limit -@@ -430,6 +443,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -432,6 +445,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); this.lastGoodZ = this.player.getZ(); @@ -13315,7 +13322,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c } @Override -@@ -536,9 +562,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -538,9 +564,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // Paper end - fix large move vectors killing the server // CraftBukkit start - handle custom speeds and skipped ticks @@ -13328,7 +13335,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c ++this.receivedMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount; -@@ -612,7 +639,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -614,7 +641,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } entity.absMoveTo(d3, d4, d5, f, f1); @@ -13337,13 +13344,13 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c // Paper start - optimise out extra getCubes boolean teleportBack = flag2; // violating this is always a fail -@@ -625,11 +652,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -627,11 +654,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } if (teleportBack) { // Paper end - optimise out extra getCubes entity.absMoveTo(d0, d1, d2, f, f1); - this.player.absMoveTo(d0, d1, d2, this.player.getYRot(), this.player.getXRot()); // CraftBukkit + //this.player.absMoveTo(d0, d1, d2, this.player.getYRot(), this.player.getXRot()); // CraftBukkit // Folia - not needed, the player is no longer updated - this.send(new ClientboundMoveVehiclePacket(entity)); + this.send(ClientboundMoveVehiclePacket.fromEntity(entity)); return; } @@ -13358,7 +13365,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c // CraftBukkit start - fire PlayerMoveEvent Player player = this.getCraftPlayer(); if (!this.hasMoved) { -@@ -669,7 +704,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -662,7 +697,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { @@ -13367,7 +13374,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c return; } -@@ -677,7 +712,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -670,7 +705,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. // We only do this if the Event was not cancelled. if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { @@ -13376,7 +13383,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c return; } -@@ -840,7 +875,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -838,7 +873,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // This needs to be on main @@ -13385,7 +13392,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c } else if (!completions.isEmpty()) { final com.mojang.brigadier.suggestion.SuggestionsBuilder builder0 = new com.mojang.brigadier.suggestion.SuggestionsBuilder(packet.getCommand(), stringreader.getTotalLength()); final com.mojang.brigadier.suggestion.SuggestionsBuilder builder = builder0.createOffset(builder0.getInput().lastIndexOf(' ') + 1); -@@ -1211,11 +1246,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1264,11 +1299,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // Paper end - Book size limits // CraftBukkit start @@ -13399,7 +13406,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c // CraftBukkit end int i = packet.slot(); -@@ -1232,7 +1267,22 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1285,7 +1320,22 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.updateBookContents(list1, i); }; @@ -13423,7 +13430,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c } } -@@ -1380,9 +1430,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1433,9 +1483,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl int i = this.receivedMovePacketCount - this.knownMovePacketCount; // CraftBukkit start - handle custom speeds and skipped ticks @@ -13436,7 +13443,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c if (i > Math.max(this.allowedPlayerTicks, 5)) { ServerGamePacketListenerImpl.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", this.player.getName().getString(), i); -@@ -1574,7 +1625,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1627,7 +1678,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { @@ -13445,7 +13452,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c return; } -@@ -1582,7 +1633,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1635,7 +1686,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. // We only do this if the Event was not cancelled. if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { @@ -13454,37 +13461,37 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c return; } -@@ -1828,9 +1879,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - if (!this.player.isSpectator()) { - // limit how quickly items can be dropped - // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. -- if (this.lastDropTick != MinecraftServer.currentTick) { -+ if (this.lastDropTick != io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick()) { - this.dropCount = 0; -- this.lastDropTick = MinecraftServer.currentTick; -+ this.lastDropTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); - } else { - // Else we increment the drop count and check the amount. - this.dropCount++; -@@ -1858,7 +1909,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - case ABORT_DESTROY_BLOCK: - case STOP_DESTROY_BLOCK: - // Paper start - Don't allow digging into unloaded chunks -- if (this.player.level().getChunkIfLoadedImmediately(blockposition.getX() >> 4, blockposition.getZ() >> 4) == null) { -+ if (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(this.player.serverLevel(), blockposition.getX() >> 4, blockposition.getZ() >> 4, 8) || this.player.level().getChunkIfLoadedImmediately(blockposition.getX() >> 4, blockposition.getZ() >> 4) == null) { // Folia - region threading - don't destroy blocks not owned - this.player.connection.ackBlockChangesUpTo(packet.getSequence()); - return; - } -@@ -1941,7 +1992,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1882,9 +1933,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + if (!this.player.isSpectator()) { + // limit how quickly items can be dropped + // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. +- if (this.lastDropTick != MinecraftServer.currentTick) { ++ if (this.lastDropTick != io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick()) { // Folia - region threading + this.dropCount = 0; +- this.lastDropTick = MinecraftServer.currentTick; ++ this.lastDropTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - region threading + } else { + // Else we increment the drop count and check the amount. + this.dropCount++; +@@ -1912,7 +1963,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + case ABORT_DESTROY_BLOCK: + case STOP_DESTROY_BLOCK: + // Paper start - Don't allow digging into unloaded chunks +- if (this.player.level().getChunkIfLoadedImmediately(blockposition.getX() >> 4, blockposition.getZ() >> 4) == null) { ++ if (!ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(this.player.serverLevel(), blockposition.getX() >> 4, blockposition.getZ() >> 4, 8) || this.player.level().getChunkIfLoadedImmediately(blockposition.getX() >> 4, blockposition.getZ() >> 4) == null) { // Folia - region threading - don't destroy blocks not owned + this.player.connection.ackBlockChangesUpTo(packet.getSequence()); + return; + } +@@ -1997,7 +2048,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // Paper end - improve distance check - BlockPos blockposition = movingobjectpositionblock.getBlockPos(); + BlockPos blockposition = movingobjectpositionblock.getBlockPos(); -- if (this.player.canInteractWithBlock(blockposition, 1.0D)) { -+ if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(this.player.serverLevel(), blockposition.getX() >> 4, blockposition.getZ() >> 4, 8) && this.player.canInteractWithBlock(blockposition, 1.0D)) { // Folia - do not allow players to interact with blocks outside the current region - Vec3 vec3d1 = vec3d.subtract(Vec3.atCenterOf(blockposition)); - double d0 = 1.0000001D; +- if (this.player.canInteractWithBlock(blockposition, 1.0D)) { ++ if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(this.player.serverLevel(), blockposition.getX() >> 4, blockposition.getZ() >> 4, 8) && this.player.canInteractWithBlock(blockposition, 1.0D)) { // Folia - do not allow players to interact with blocks outside the current region + Vec3 vec3d1 = vec3d.subtract(Vec3.atCenterOf(blockposition)); + double d0 = 1.0000001D; -@@ -2072,7 +2123,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2131,7 +2182,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Entity entity = packet.getEntity(worldserver); if (entity != null) { @@ -13493,7 +13500,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c return; } } -@@ -2107,7 +2158,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2166,7 +2217,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // CraftBukkit end ServerGamePacketListenerImpl.LOGGER.info("{} lost connection: {}", this.player.getName().getString(), info.reason().getString()); @@ -13502,7 +13509,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c super.onDisconnect(info, quitMessage); // Paper - Fix kick event leave message not being sent } -@@ -2116,6 +2167,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2175,6 +2226,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.removePlayerFromWorld(null); } @@ -13511,7 +13518,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c private void removePlayerFromWorld(@Nullable net.kyori.adventure.text.Component quitMessage) { // Paper end - Fix kick event leave message not being sent this.chatMessageChain.close(); -@@ -2128,6 +2181,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2187,6 +2240,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.disconnect(); // Paper start - Adventure quitMessage = quitMessage == null ? this.server.getPlayerList().remove(this.player) : this.server.getPlayerList().remove(this.player, quitMessage); // Paper - pass in quitMessage to fix kick message not being used @@ -13520,7 +13527,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c if ((quitMessage != null) && !quitMessage.equals(net.kyori.adventure.text.Component.empty())) { this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(quitMessage), false); // Paper end -@@ -2384,7 +2439,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2443,7 +2498,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetLastActionTime(); // CraftBukkit start if (sync) { @@ -13529,7 +13536,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c } else { runnable.run(); } -@@ -2442,7 +2497,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2501,7 +2556,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl String originalFormat = event.getFormat(), originalMessage = event.getMessage(); this.cserver.getPluginManager().callEvent(event); @@ -13538,7 +13545,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c // Evil plugins still listening to deprecated event final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); queueEvent.setCancelled(event.isCancelled()); -@@ -2540,6 +2595,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2599,6 +2654,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (s.isEmpty()) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send an empty message"); } else if (this.getCraftPlayer().isConversing()) { @@ -13546,7 +13553,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c final String conversationInput = s; this.server.processQueue.add(new Runnable() { @Override -@@ -2773,8 +2829,25 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2837,8 +2893,25 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // Spigot End public void switchToConfig() { @@ -13573,16 +13580,16 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c this.send(ClientboundStartConfigurationPacket.INSTANCE); this.connection.setupOutboundProtocol(ConfigurationProtocols.CLIENTBOUND); } -@@ -2800,7 +2873,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2865,7 +2938,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - this.player.resetLastActionTime(); - this.player.setShiftKeyDown(packet.isUsingSecondaryAction()); -- if (entity != null) { -+ if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(entity) && entity != null) { // Folia - region threading - do not allow interaction of entities outside the current region - if (!worldserver.getWorldBorder().isWithinBounds(entity.blockPosition())) { - return; - } -@@ -2947,6 +3020,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + this.player.resetLastActionTime(); + this.player.setShiftKeyDown(packet.isUsingSecondaryAction()); +- if (entity != null) { ++ if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(entity) && entity != null) { // Folia - region threading - do not allow interaction of entities outside the current region + if (!worldserver.getWorldBorder().isWithinBounds(entity.blockPosition())) { + return; + } +@@ -3013,6 +3086,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl switch (packetplayinclientcommand_enumclientcommand) { case PERFORM_RESPAWN: if (this.player.wonGame) { @@ -13595,7 +13602,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c this.player.wonGame = false; this.player = this.server.getPlayerList().respawn(this.player, true, Entity.RemovalReason.CHANGED_DIMENSION, RespawnReason.END_PORTAL); // CraftBukkit this.resetPosition(); -@@ -2956,6 +3035,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -3022,6 +3101,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return; } @@ -13613,7 +13620,7 @@ index cd1b6b539a62fa5237d6dab2d1c09a2e631d9941..4d013b3e99a7bf7891dea3b6397de65c this.player = this.server.getPlayerList().respawn(this.player, false, Entity.RemovalReason.KILLED, RespawnReason.DEATH); // CraftBukkit this.resetPosition(); if (this.server.isHardcore()) { -@@ -3538,7 +3628,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -3584,7 +3674,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.filterTextPacket(list).thenAcceptAsync((list1) -> { this.updateSignText(packet, list1); @@ -13734,7 +13741,7 @@ index 653856d0b8dcf2baf4cc77a276f17c8cc1fa717e..3f5639f26f249ca10e03826231d087ab date1 = fallback; } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 1a956249828156fdc273888de59128c3d1a0b898..384c876fd25340ea7099bcfb9939e9e475c186a0 100644 +index 9b71655a425356132afb786eff623f558e1e3498..b449de44b1911e2ff0701956bfba53fb5d2ed44e 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -134,10 +134,10 @@ public abstract class PlayerList { @@ -14191,10 +14198,10 @@ index c038da20b76c0b7b1c18471b20be01e849d29f3a..87114cc9ce7489ff8e29e2d88ebb0d47 } } diff --git a/src/main/java/net/minecraft/util/SpawnUtil.java b/src/main/java/net/minecraft/util/SpawnUtil.java -index 34c3bf85473b3ad89355ebc21b68c59b3c683b84..3704a5b541210936e1f6414f2b322d51faff7e2a 100644 +index a8903f087c75c851e8111b96e5aa9f271d618392..27fb5cd80b33fdca0ff8785072c469ff9a42aa6a 100644 --- a/src/main/java/net/minecraft/util/SpawnUtil.java +++ b/src/main/java/net/minecraft/util/SpawnUtil.java -@@ -59,7 +59,7 @@ public class SpawnUtil { +@@ -61,7 +61,7 @@ public class SpawnUtil { return Optional.of(t0); } @@ -14344,7 +14351,7 @@ index e9df8f8541b8a1b85c7d2925ff3cba813007a1ef..d3f2775a68121ca80ef55ea4c280a0c9 return blockToFallLocation(blockState); } else { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa5674b9fd 100644 +index 27618d07d718cb2a5783536e11d56f712303487b..75929ae02677637500229b7b635479f92e3bd177 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -186,7 +186,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -14404,7 +14411,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa if (tracker == null) { return; } -@@ -883,7 +895,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -887,7 +899,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess public void postTick() { // No clean way to break out of ticking once the entity has been copied to a new world, so instead we move the portalling later in the tick cycle if (!(this instanceof ServerPlayer) && this.isAlive()) { // Paper - don't attempt to teleport dead entities @@ -14413,7 +14420,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa } } // CraftBukkit end -@@ -902,7 +914,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -906,7 +918,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess --this.boardingCooldown; } @@ -14422,7 +14429,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); } -@@ -1178,8 +1190,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1186,8 +1198,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } else { this.wasOnFire = this.isOnFire(); if (type == MoverType.PISTON) { @@ -14433,7 +14440,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa movement = this.limitPistonMovement(movement); if (movement.equals(Vec3.ZERO)) { return; -@@ -1488,7 +1500,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1501,7 +1513,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess if (movement.lengthSqr() <= 1.0E-7D) { return movement; } else { @@ -14442,7 +14449,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa if (i != this.pistonDeltasGameTime) { Arrays.fill(this.pistonDeltas, 0.0D); -@@ -3294,7 +3306,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3324,7 +3336,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.passengers = ImmutableList.copyOf(list); } @@ -14451,7 +14458,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa } } -@@ -3342,7 +3354,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3372,7 +3384,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } entity.boardingCooldown = 60; @@ -14460,7 +14467,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa } return true; // CraftBukkit } -@@ -3429,7 +3441,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3459,7 +3471,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } } @@ -14469,7 +14476,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa Level world = this.level(); if (world instanceof ServerLevel worldserver) { -@@ -3440,23 +3452,21 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3470,23 +3482,21 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess gameprofilerfiller.push("portal"); this.setPortalCooldown(); @@ -14501,7 +14508,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa } public int getDimensionChangingDelay() { -@@ -3597,6 +3607,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3627,6 +3637,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @Nullable public PlayerTeam getTeam() { @@ -14513,7 +14520,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof Player)) { return null; } // Paper - Perf: Disable Scoreboards for non players by default return this.level().getScoreboard().getPlayersTeam(this.getScoreboardName()); } -@@ -3890,8 +3905,778 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3920,8 +3935,780 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.portalProcess = original.portalProcess; } @@ -14945,7 +14952,9 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa + } + + public void preChangeDimension() { -+ ++ if (this instanceof Leashable leashable) { ++ leashable.dropLeash(); ++ } + } + + public void postChangeDimension() { @@ -15292,7 +15301,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa Level world = this.level(); // Paper start - Fix item duplication and teleport issues -@@ -4096,6 +4881,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4126,6 +4913,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } @@ -15305,7 +15314,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa protected void removeAfterChangingDimensions() { this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION, null); // CraftBukkit - add Bukkit remove cause if (this instanceof Leashable leashable && leashable.isLeashed()) { // Paper - only call if it is leashed -@@ -5029,7 +5820,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5059,7 +5852,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } } // Paper end - Fix MC-4 @@ -15315,7 +15324,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa synchronized (this.posLock) { // Paper this.position = new Vec3(x, y, z); } // Paper -@@ -5050,7 +5842,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5080,7 +5874,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // Paper start - Block invalid positions and bounding box; don't allow desync of pos and AABB // hanging has its own special logic @@ -15324,7 +15333,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa this.setBoundingBox(this.makeBoundingBox()); } // Paper end - Block invalid positions and bounding box -@@ -5133,6 +5925,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5163,6 +5957,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return this.removalReason != null; } @@ -15337,7 +15346,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa @Nullable public Entity.RemovalReason getRemovalReason() { return this.removalReason; -@@ -5155,6 +5953,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5185,6 +5985,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess CraftEventFactory.callEntityRemoveEvent(this, cause); // CraftBukkit end final boolean alreadyRemoved = this.removalReason != null; // Paper - Folia schedulers @@ -15347,7 +15356,7 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa if (this.removalReason == null) { this.removalReason = entity_removalreason; } -@@ -5178,6 +5979,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5208,6 +6011,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.removalReason = null; } @@ -15359,10 +15368,10 @@ index a15546e433ebba6c0de01bdaaef201a3d99a87b5..ad358909318a7e52d43e9dfb5cc7e6aa /** * Invoked only when the entity is truly removed from the server, never to be added to any world. diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c5613a9a7300 100644 +index 96b4fbe4a4655777ff10b32e3257e2fac2aba12a..e6871fb4b58910043e88ea45564363aa854eb0ca 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -276,7 +276,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -274,7 +274,7 @@ public abstract class LivingEntity extends Entity implements Attackable { private Optional lastClimbablePos; @Nullable private DamageSource lastDamageSource; @@ -15371,7 +15380,7 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 protected int autoSpinAttackTicks; protected float autoSpinAttackDmg; @Nullable -@@ -310,6 +310,21 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -308,6 +308,21 @@ public abstract class LivingEntity extends Entity implements Attackable { ++this.noActionTime; // Above all the floats } // Spigot end @@ -15439,7 +15448,7 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 if (this.isTickingEffects) { this.effectsToProcess.add(new ProcessableEffect(mobeffect, cause)); return true; -@@ -1628,7 +1647,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1596,7 +1615,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (flag2) { this.lastDamageSource = source; @@ -15448,7 +15457,7 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 Iterator iterator = this.getActiveEffects().iterator(); while (iterator.hasNext()) { -@@ -1737,7 +1756,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1748,7 +1767,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Nullable public DamageSource getLastDamageSource() { @@ -15457,7 +15466,7 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 this.lastDamageSource = null; } -@@ -2549,7 +2568,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2560,7 +2579,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Nullable public LivingEntity getKillCredit() { @@ -15466,7 +15475,7 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 } public final float getMaxHealth() { -@@ -2626,7 +2645,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2637,7 +2656,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } this.lastDamageSource = damageSource; @@ -15475,7 +15484,7 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 } @Override -@@ -3692,7 +3711,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3703,7 +3722,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); gameprofilerfiller.pop(); // Paper start - Add EntityMoveEvent @@ -15484,7 +15493,7 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); -@@ -4406,7 +4425,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4413,7 +4432,7 @@ public abstract class LivingEntity extends Entity implements Attackable { BlockPos blockposition = BlockPos.containing(d0, d1, d2); Level world = this.level(); @@ -15494,25 +15503,10 @@ index f36a075dbee2b96d01899e02460b1d8443e91749..77eab187d4d6e22e5f8722029107c561 while (!flag2 && blockposition.getY() > world.getMinY()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index dbd321f3dc3cc80737830db63aed47a6935e8e89..bd2d62f73e4f1fa1e655012d04e104acca5db198 100644 +index 5a3059cadbc9735b4b48745c6b1b11196596b06d..92bda33a8d42150e66f3d2c24bdcce6b7c42471b 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -150,6 +150,14 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab - - public boolean aware = true; // CraftBukkit - -+ // Folia start - region threading -+ @Override -+ public void preChangeDimension() { -+ super.preChangeDimension(); -+ this.dropLeash(true, true); -+ } -+ // Folia end - region threading -+ - protected Mob(EntityType type, Level world) { - super(type, world); - this.handItems = NonNullList.withSize(2, ItemStack.EMPTY); -@@ -296,8 +304,20 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -292,9 +292,21 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @Nullable @Override public LivingEntity getTarget() { @@ -15522,18 +15516,19 @@ index dbd321f3dc3cc80737830db63aed47a6935e8e89..bd2d62f73e4f1fa1e655012d04e104ac + return null; + } + // Folia end - region threading -+ return this.target; -+ } -+ -+ // Folia start - region threading -+ public LivingEntity getTargetRaw() { return this.target; } -+ // Folia end - region threading ++ // Folia start - region threading ++ public LivingEntity getTargetRaw() { ++ return this.target; ++ } ++ // Folia end - region threading ++ @Nullable protected final LivingEntity getTargetFromBrain() { -@@ -310,7 +330,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + return (LivingEntity) this.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).orElse(null); // CraftBukkit - decompile error +@@ -306,7 +318,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab } public boolean setTarget(LivingEntity entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) { @@ -15542,7 +15537,7 @@ index dbd321f3dc3cc80737830db63aed47a6935e8e89..bd2d62f73e4f1fa1e655012d04e104ac if (fireEvent) { if (reason == EntityTargetEvent.TargetReason.UNKNOWN && this.getTarget() != null && entityliving == null) { reason = this.getTarget().isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; -@@ -1776,16 +1796,22 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -1777,16 +1789,22 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab this.goalSelector.removeAllGoals(predicate); } @@ -15586,10 +15581,10 @@ index b4a8249964786d484aa0767d0e73d71d2156f0e8..0ee15cb6cc2698c511b2ba274f976d32 return this.portal.getLocalTransition(); } diff --git a/src/main/java/net/minecraft/world/entity/TamableAnimal.java b/src/main/java/net/minecraft/world/entity/TamableAnimal.java -index 332ae836826270507110f1e0438aaa36d6e9deb5..ae6098741088f89a693e5aaedbf64d33dc74eb69 100644 +index 68224d1cdabdaf04e4d26dd07e222a312e8fc898..d66795269c955db6b871143a63b5e7fde3d68289 100644 --- a/src/main/java/net/minecraft/world/entity/TamableAnimal.java +++ b/src/main/java/net/minecraft/world/entity/TamableAnimal.java -@@ -281,6 +281,11 @@ public abstract class TamableAnimal extends Animal implements OwnableEntity { +@@ -288,6 +288,11 @@ public abstract class TamableAnimal extends Animal implements OwnableEntity { LivingEntity entityliving = this.getOwner(); if (entityliving != null) { @@ -15601,7 +15596,7 @@ index 332ae836826270507110f1e0438aaa36d6e9deb5..ae6098741088f89a693e5aaedbf64d33 this.teleportToAroundBlockPos(entityliving.blockPosition()); } -@@ -318,7 +323,22 @@ public abstract class TamableAnimal extends Animal implements OwnableEntity { +@@ -325,7 +330,22 @@ public abstract class TamableAnimal extends Animal implements OwnableEntity { return false; } Location to = event.getTo(); @@ -15678,10 +15673,10 @@ index 15d7be9ed4a973044dd4399db46aaa244730b836..df4cce1d3baef0ad386f5bc201663ae5 @Override diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java -index f73b559b8e60859020f762dab88b67b8c912bf8f..9ca11453b99febb14177ec2a5f50bb542c953166 100644 +index 2796df7af365c452b28373adfd7daf1d6730bac5..45b68a139956f2d59c8b9658692d01f1f79d33cc 100644 --- a/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java +++ b/src/main/java/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java -@@ -43,6 +43,11 @@ public class GroundPathNavigation extends PathNavigation { +@@ -42,6 +42,11 @@ public class GroundPathNavigation extends PathNavigation { @Override public Path createPath(BlockPos target, @javax.annotation.Nullable Entity entity, int distance) { // Paper - EntityPathfindEvent @@ -15943,10 +15938,10 @@ index 63a94b6068fdaef8bb26675c2927cb729ced1dac..f3f98e6276dda3bc4f290fc2d80569f7 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 42276acfeadec6e7aa9a91d3f446f4fedb04829d..aaa3e1e5fa2e34078500f20934e9709784353e70 100644 +index ca706f1ac5f4248164daa613eef81e46b3e5a210..4690611c9db99156735dd60ebd180160bed61c5c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -1095,6 +1095,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1129,6 +1129,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @Override public boolean canBeeUse() { @@ -15958,7 +15953,7 @@ index 42276acfeadec6e7aa9a91d3f446f4fedb04829d..aaa3e1e5fa2e34078500f20934e97097 return Bee.this.hivePos != null && !Bee.this.isTooFarAway(Bee.this.hivePos) && !Bee.this.hasRestriction() && Bee.this.wantsToEnterHive() && !this.hasReachedTarget(Bee.this.hivePos) && Bee.this.level().getBlockState(Bee.this.hivePos).is(BlockTags.BEEHIVES); } -@@ -1208,6 +1213,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1242,6 +1247,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @Override public boolean canBeeUse() { @@ -15971,10 +15966,10 @@ index 42276acfeadec6e7aa9a91d3f446f4fedb04829d..aaa3e1e5fa2e34078500f20934e97097 } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 471d5727b964922d8e898be9e1d5c30f9d3bac97..665ee9dc2cb129ea67b2f3ec454a0fd99be237a4 100644 +index 989b7be74eaeba7f40eac87c7ee7f252cb0c05c9..d3110cbb22995fb197739cdbcf480f584507fc26 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -366,7 +366,7 @@ public class Cat extends TamableAnimal implements VariantHolder 1) { placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(world, entityhuman, enumhand, blocks, blockposition.getX(), blockposition.getY(), blockposition.getZ()); } else if (blocks.size() == 1 && item != Items.POWDER_SNOW_BUCKET) { // Paper - Fix cancelled powdered snow bucket placement -@@ -497,15 +498,15 @@ public final class ItemStack implements DataComponentHolder { +@@ -502,15 +503,15 @@ public final class ItemStack implements DataComponentHolder { enuminteractionresult = InteractionResult.FAIL; // cancel placement // PAIL: Remove this when MC-99075 fixed placeEvent.getPlayer().updateInventory(); -- world.capturedTileEntities.clear(); // Paper - Allow chests to be placed with NBT data; clear out block entities as chests and such will pop loot -+ worldData.capturedTileEntities.clear(); // Paper - Allow chests to be placed with NBT data; clear out block entities as chests and such will pop loot // Folia - region threading +- world.capturedTileEntities.clear(); // Paper - Allow chests to be placed with NBT data; clear out block entities as chests and such will pop loot ++ worldData.capturedTileEntities.clear(); // Paper - Allow chests to be placed with NBT data; clear out block entities as chests and such will pop loot // Folia - region threading // revert back all captured blocks - world.preventPoiUpdated = true; // CraftBukkit - SPIGOT-5710 - world.isBlockPlaceCancelled = true; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent @@ -16968,7 +16963,7 @@ index 33e7d2884195677c4d6340d8b84c1dd85c636ec1..78fa9641be942539ba3a0b3f439dc917 // Brute force all possible updates // Paper start - Don't resync blocks -@@ -514,7 +515,7 @@ public final class ItemStack implements DataComponentHolder { +@@ -519,7 +520,7 @@ public final class ItemStack implements DataComponentHolder { // ((ServerPlayer) entityhuman).connection.send(new ClientboundBlockUpdatePacket(world, placedPos.relative(dir))); // } // Paper end - Don't resync blocks @@ -16977,7 +16972,7 @@ index 33e7d2884195677c4d6340d8b84c1dd85c636ec1..78fa9641be942539ba3a0b3f439dc917 } else { // Change the stack to its new contents if it hasn't been tampered with. if (this.getCount() == oldCount && Objects.equals(this.components.asPatch(), oldData)) { -@@ -522,7 +523,7 @@ public final class ItemStack implements DataComponentHolder { +@@ -527,7 +528,7 @@ public final class ItemStack implements DataComponentHolder { this.setCount(newCount); } @@ -16986,7 +16981,7 @@ index 33e7d2884195677c4d6340d8b84c1dd85c636ec1..78fa9641be942539ba3a0b3f439dc917 world.setBlockEntity(e.getValue()); } -@@ -557,15 +558,15 @@ public final class ItemStack implements DataComponentHolder { +@@ -562,15 +563,15 @@ public final class ItemStack implements DataComponentHolder { } // SPIGOT-4678 @@ -17006,7 +17001,7 @@ index 33e7d2884195677c4d6340d8b84c1dd85c636ec1..78fa9641be942539ba3a0b3f439dc917 } } -@@ -594,8 +595,8 @@ public final class ItemStack implements DataComponentHolder { +@@ -599,8 +600,8 @@ public final class ItemStack implements DataComponentHolder { } } } @@ -17018,7 +17013,7 @@ index 33e7d2884195677c4d6340d8b84c1dd85c636ec1..78fa9641be942539ba3a0b3f439dc917 return enuminteractionresult; diff --git a/src/main/java/net/minecraft/world/item/MapItem.java b/src/main/java/net/minecraft/world/item/MapItem.java -index 571f2540a1e9422025efe651167e26b44b437daa..58f3c9598301a5b34142ddf958aa7a4db634be3d 100644 +index 8ff50a4c7461bbd9f469d503f6b5ee482d2463d7..65d1af43b8bc740a9dc77dd8d5ba99de000fe57a 100644 --- a/src/main/java/net/minecraft/world/item/MapItem.java +++ b/src/main/java/net/minecraft/world/item/MapItem.java @@ -68,6 +68,7 @@ public class MapItem extends Item { @@ -17220,10 +17215,10 @@ index 952c866bed29b412a48332ba1d98515f0f069781..68710af738fe6de115b75135f0f30176 } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48f2fc73be 100644 +index 27f9d167b5ae9ce5117798ea44324107df59425f..fc180c3f68a40e909f7e357a6fcd06858b870e97 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -118,10 +118,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -119,10 +119,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public static final int TICKS_PER_DAY = 24000; public static final int MAX_ENTITY_SPAWN_Y = 20000000; public static final int MIN_ENTITY_SPAWN_Y = -20000000; @@ -17238,7 +17233,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 public final Thread thread; private final boolean isDebug; private int skyDarken; -@@ -131,7 +131,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -132,7 +132,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public float rainLevel; protected float oThunderLevel; public float thunderLevel; @@ -17247,7 +17242,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 /** @deprecated */ @Deprecated private final RandomSource threadSafeRandom = RandomSource.createThreadSafe(); -@@ -143,28 +143,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -144,28 +144,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl private final ResourceKey dimension; private final RegistryAccess registryAccess; private final DamageSources damageSources; @@ -17280,7 +17275,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 public final org.spigotmc.SpigotWorldConfig spigotConfig; // Spigot // Paper start - add paper world config private final io.papermc.paper.configuration.WorldConfiguration paperConfig; -@@ -177,9 +166,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -178,9 +167,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; private org.spigotmc.TickLimiter tileLimiter; @@ -17293,7 +17288,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 public CraftWorld getWorld() { return this.world; -@@ -829,6 +818,32 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -830,6 +819,32 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl return chunk != null ? chunk.getNoiseBiome(x, y, z) : this.getUncachedNoiseBiome(x, y, z); } // Paper end - optimise random ticking @@ -17326,7 +17321,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config & Anti-Xray // Paper start - getblock optimisations - cache world height/sections -@@ -878,7 +893,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -879,7 +894,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl this.thread = Thread.currentThread(); this.biomeManager = new BiomeManager(this, i); this.isDebug = flag1; @@ -17335,7 +17330,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 this.registryAccess = iregistrycustom; this.damageSources = new DamageSources(iregistrycustom); // CraftBukkit start -@@ -1023,8 +1038,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1024,8 +1039,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Nullable public final BlockState getBlockStateIfLoaded(BlockPos pos) { // CraftBukkit start - tree generation @@ -17346,7 +17341,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 if (previous != null) { return previous.getHandle(); } -@@ -1086,16 +1101,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1087,16 +1102,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { @@ -17368,7 +17363,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 } blockstate.setData(state); blockstate.setFlag(flags); -@@ -1112,10 +1129,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1113,10 +1130,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl // CraftBukkit start - capture blockstates boolean captured = false; @@ -17381,7 +17376,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 captured = true; } // CraftBukkit end -@@ -1125,8 +1142,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1126,8 +1143,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl if (iblockdata1 == null) { // CraftBukkit start - remove blockstate if failed (or the same) @@ -17392,7 +17387,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 } // CraftBukkit end return false; -@@ -1163,7 +1180,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1164,7 +1181,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl */ // CraftBukkit start @@ -17401,7 +17396,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 // Modularize client and physic updates // Spigot start try { -@@ -1208,7 +1225,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1209,7 +1226,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl iblockdata1.updateIndirectNeighbourShapes(this, blockposition, k, j - 1); // Don't call an event for the old block to limit event spam CraftWorld world = ((ServerLevel) this).getWorld(); boolean cancelledUpdates = false; // Paper - Fix block place logic @@ -17410,7 +17405,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata)); this.getCraftServer().getPluginManager().callEvent(event); -@@ -1222,7 +1239,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1223,7 +1240,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } // CraftBukkit start - SPIGOT-5710 @@ -17419,7 +17414,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 this.onBlockStateChange(blockposition, iblockdata1, iblockdata2); } // CraftBukkit end -@@ -1308,7 +1325,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1309,7 +1326,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public void neighborShapeChanged(Direction direction, BlockPos pos, BlockPos neighborPos, BlockState neighborState, int flags, int maxUpdateDepth) { @@ -17428,7 +17423,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 } @Override -@@ -1333,11 +1350,34 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1334,11 +1351,34 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl return this.getChunkSource().getLightEngine(); } @@ -17465,7 +17460,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 if (previous != null) { return previous.getHandle(); } -@@ -1436,18 +1476,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1437,18 +1477,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } public void addBlockEntityTicker(TickingBlockEntity ticker) { @@ -17489,7 +17484,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 // Spigot start // Iterator iterator = this.blockEntityTickers.iterator(); -@@ -1458,9 +1497,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1459,9 +1498,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl int tilesThisCycle = 0; var toRemove = new it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet(); // Paper - Fix MC-117075; use removeAll toRemove.add(null); // Paper - Fix MC-117075 @@ -17501,7 +17496,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 // Spigot end if (tickingblockentity.isRemoved()) { -@@ -1477,11 +1515,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1478,11 +1516,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl // Paper end - rewrite chunk system } } @@ -17516,7 +17511,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 } public void guardEntityTick(Consumer tickConsumer, T entity) { -@@ -1493,7 +1531,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1494,7 +1532,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level().getWorld().getName(), entity.getX(), entity.getY(), entity.getZ()); MinecraftServer.LOGGER.error(msg, throwable); getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, throwable))); // Paper - ServerExceptionEvent @@ -17526,7 +17521,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 // Paper end - Prevent block entity and entity crashes } this.moonrise$midTickTasks(); // Paper - rewrite chunk system -@@ -1554,9 +1593,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1555,9 +1594,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Nullable public BlockEntity getBlockEntity(BlockPos blockposition, boolean validate) { @@ -17542,7 +17537,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 return blockEntity; } // Paper end - Perf: Optimize capturedTileEntities lookup -@@ -1569,8 +1613,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1570,8 +1614,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl if (!this.isOutsideBuildHeight(blockposition)) { // CraftBukkit start @@ -17553,7 +17548,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 return; } // CraftBukkit end -@@ -1650,6 +1694,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1651,6 +1695,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { @@ -17561,7 +17556,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 Profiler.get().incrementCounter("getEntities"); List list = Lists.newArrayList(); -@@ -1680,6 +1725,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1681,6 +1726,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public void getEntities(final EntityTypeTest entityTypeTest, final AABB boundingBox, final Predicate predicate, final List into, final int maxCount) { @@ -17569,7 +17564,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 Profiler.get().incrementCounter("getEntities"); if (entityTypeTest instanceof net.minecraft.world.entity.EntityType byType) { -@@ -1777,13 +1823,34 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1780,13 +1826,34 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public void disconnect() {} @@ -17606,7 +17601,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 public boolean mayInteract(Player player, BlockPos pos) { return true; -@@ -1976,8 +2043,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1979,8 +2046,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public abstract RecipeAccess recipeAccess(); public BlockPos getBlockRandomPos(int x, int y, int z, int l) { @@ -17616,7 +17611,7 @@ index 0de2b79481352b52438dde284262019b29949ad8..35b18a9ecce6c7b743badbf384f40b48 return new BlockPos(x + (i1 & 15), y + (i1 >> 16 & l), z + (i1 >> 8 & 15)); } -@@ -1999,7 +2065,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -2002,7 +2068,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public long nextSubTickCount() { @@ -17700,10 +17695,10 @@ index c1b76a1ebc1eea7ab70cf61d8175a31794dd122a..5403794f9613ecd976769240ccecd3c1 } diff --git a/src/main/java/net/minecraft/world/level/ServerExplosion.java b/src/main/java/net/minecraft/world/level/ServerExplosion.java -index bbbd451ff184be8fa13bd93d53c89a9502f9951a..93b2bf5f518084c18cfeef0cbc9edc61225e67f9 100644 +index 685ccfb73bf7125585ef90b6a0f51b2f81daa428..0b49da093cdae2c2738f7977f38b39f1e8a29876 100644 --- a/src/main/java/net/minecraft/world/level/ServerExplosion.java +++ b/src/main/java/net/minecraft/world/level/ServerExplosion.java -@@ -791,17 +791,18 @@ public class ServerExplosion implements Explosion { +@@ -795,17 +795,18 @@ public class ServerExplosion implements Explosion { if (!this.level.paperConfig().environment.optimizeExplosions) { return this.getSeenFraction(vec3d, entity, this.directMappedBlockCache, this.mutablePos); // Paper - collision optimisations } @@ -17792,10 +17787,10 @@ index 03adb02297911e5a5051edac14453d7e3eeac29c..cd2785d084225e8a166b21324d830cf2 } diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index c02c4834ace843633b77fb43eeadd3ddc7b1f743..3f33bd3f0536676e8e8dd8e71cc247e1771311ca 100644 +index be700995c3e7f63e0471712c3cd6fd83db583491..421403e714949739d4bab2fba7b7896d73cbd99a 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java -@@ -367,7 +367,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock +@@ -362,7 +362,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock world.setBlock(blockposition1, (BlockState) state.setValue(BedBlock.PART, BedPart.HEAD), 3); // CraftBukkit start - SPIGOT-7315: Don't updated if we capture block states @@ -17805,7 +17800,7 @@ index c02c4834ace843633b77fb43eeadd3ddc7b1f743..3f33bd3f0536676e8e8dd8e71cc247e1 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index b6d6c2cb9b227a17fb4ce42bc75f92206fbea043..fc40cad05ec033f8d2c469054f10b7ebbfdcc1d2 100644 +index c0b1f903962b25d8ff6c2b4fcd2be0e45de09b35..9b952e74ee705256cbe9390553432f6364d4f2c1 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java @@ -382,8 +382,8 @@ public class Block extends BlockBehaviour implements ItemLike { @@ -17833,10 +17828,10 @@ index eb324fda54ada3ed7941713a784ed2d686ec8c4b..b66ff600fbad81679f1f5b6108abccab } } diff --git a/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java b/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java -index 7fd7f20d524fa980ed8ff8e0ca8adb9af203ccda..6f1805dd76dc7fb3a2d005672fc3a81d31824fc5 100644 +index 6e63ecbf425950f71bee9bf416cb6a77b6005ab6..7eca80ae9d5f8c3582d8c4de5cfae3705cadaecc 100644 --- a/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DaylightDetectorBlock.java -@@ -119,7 +119,7 @@ public class DaylightDetectorBlock extends BaseEntityBlock { +@@ -114,7 +114,7 @@ public class DaylightDetectorBlock extends BaseEntityBlock { } private static void tickEntity(Level world, BlockPos pos, BlockState state, DaylightDetectorBlockEntity blockEntity) { @@ -17846,7 +17841,7 @@ index 7fd7f20d524fa980ed8ff8e0ca8adb9af203ccda..6f1805dd76dc7fb3a2d005672fc3a81d } diff --git a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java -index 5a6c153fa2873aecba0d0d02be2cc2a514f445e3..d45b3344dfc147a725d03faab410ebe56d54ab2d 100644 +index 01584d77a8877528c3ec65971a1a6377c09e763b..0537418c9337d95acdc80eead47c9cbf397e7042 100644 --- a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java @@ -52,7 +52,7 @@ public class DispenserBlock extends BaseEntityBlock { @@ -17881,10 +17876,10 @@ index 4fe83bd0f355549847b66afb7e61f6f2a6d97016..fa140ec5a02cb9204a498864638e2da0 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java b/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java -index a7a21f071161fb7e73a046717d2462f871ab653c..9e3b9b61cd51299ff13587ccc8cd2a7c875d3544 100644 +index af46f2885ead1e3ec1734504d8ba134c886e04fb..d3848662cf2b2d4fc47c3bf321b9a25106cd572b 100644 --- a/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java -@@ -120,9 +120,35 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { +@@ -120,12 +120,38 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { if (tileentity instanceof TheEndGatewayBlockEntity tileentityendgateway) { Vec3 vec3d = tileentityendgateway.getPortalPosition(world, pos); @@ -17894,7 +17889,7 @@ index a7a21f071161fb7e73a046717d2462f871ab653c..9e3b9b61cd51299ff13587ccc8cd2a7c return null; } } -+ + + // Folia start - region threading + public static TeleportTransition getTeleportTransition(ServerLevel world, Entity entity, Vec3 targetPos) { + return (entity instanceof ThrownEnderpearl ? new TeleportTransition(world, targetPos, Vec3.ZERO, 0.0F, 0.0F, Set.of(), TeleportTransition.PLACE_PORTAL_TICKET, PlayerTeleportEvent.TeleportCause.END_GATEWAY) : new TeleportTransition(world, targetPos, Vec3.ZERO, 0.0F, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), TeleportTransition.PLACE_PORTAL_TICKET, PlayerTeleportEvent.TeleportCause.END_GATEWAY)); // CraftBukkit @@ -17920,9 +17915,12 @@ index a7a21f071161fb7e73a046717d2462f871ab653c..9e3b9b61cd51299ff13587ccc8cd2a7c + ); + } + // Folia end - region threading - } ++ + @Override + protected RenderShape getRenderShape(BlockState state) { + return RenderShape.INVISIBLE; diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java -index 4aa14f975e1ceedf3d4a427e0daefb58b12fcafe..403cced72fa043a9084afb5bb8fa037ccb511d41 100644 +index 8cb4142562db0be1f1a7d961ec5a10d4abf31692..45b8ac1418864ea32bd625b0d57fcec288ea5b0c 100644 --- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java @@ -75,15 +75,7 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { @@ -18034,7 +18032,7 @@ index 7900856c9e86afe907c00c9ac31bec93ece50abe..c0843e7a0c173a734f5eab21172b5bbb return true; } else { diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -index 2b31bf586c1c0bd393d2aa8d0b6635dd9f22f21c..7face3645915f88e10ddaa64f97b6727c3834f15 100644 +index 3e9642e5236d9a1cc8e8f3b375d76810f4bc7c6c..88e33ae16848afe9885684537ef32e1836425fa3 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java @@ -178,6 +178,33 @@ public class NetherPortalBlock extends Block implements Portal { @@ -18289,7 +18287,7 @@ index d262a5a6da57ef9ba9a6fe0dfbc88f577105e74f..e842c05cfe5991ba33582b9399610aff if (treeType != null) { event = new StructureGrowEvent(location, treeType, false, null, blocks); diff --git a/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java b/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java -index a94c164fbf8fc3bb7669799a53f7e5528d921e7c..01a56fe814a0c7d930c437619289e50621978697 100644 +index 4e38d2e0ce156b4edbef67c82c845ceeebbbcd59..5e761ca2a8f1edaba2305c99f1310f3d7cab9cac 100644 --- a/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java @@ -54,7 +54,7 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock { @@ -18337,10 +18335,10 @@ index 0e0d178f2793ab014358f534c8dc53218b89f083..7144c4dd1091edc3bbaa0f862763e3e6 continue; } diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index 1f929b467a0ece3143af58a657cf5983c07a8d51..fe25d2864c0e494c6d2809cdc6adfaba67273077 100644 +index 1f664c10138a6e19bdc0051fa80575516d5602e7..edb7b9391855eba5d693f3d64b6fb14a1b1c4949 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -@@ -34,7 +34,7 @@ import org.bukkit.inventory.InventoryHolder; +@@ -33,7 +33,7 @@ import org.bukkit.inventory.InventoryHolder; // CraftBukkit end public abstract class BlockEntity { @@ -18349,7 +18347,7 @@ index 1f929b467a0ece3143af58a657cf5983c07a8d51..fe25d2864c0e494c6d2809cdc6adfaba // CraftBukkit start - data containers private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry(); -@@ -49,6 +49,12 @@ public abstract class BlockEntity { +@@ -48,6 +48,12 @@ public abstract class BlockEntity { private BlockState blockState; private DataComponentMap components; @@ -18362,7 +18360,7 @@ index 1f929b467a0ece3143af58a657cf5983c07a8d51..fe25d2864c0e494c6d2809cdc6adfaba public BlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { this.components = DataComponentMap.EMPTY; this.type = type; -@@ -226,7 +232,7 @@ public abstract class BlockEntity { +@@ -216,7 +222,7 @@ public abstract class BlockEntity { public void setChanged() { if (this.level != null) { @@ -18372,7 +18370,7 @@ index 1f929b467a0ece3143af58a657cf5983c07a8d51..fe25d2864c0e494c6d2809cdc6adfaba } diff --git a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java -index a02c5feb8f2ffe6bb6070650a45762476e1ff9ac..2348dc05644bc0cfc4389051c3209a6267eae5a9 100644 +index e2123f1c5852a34fb92e900f25591284625f3494..a6009ce84f0f7795f132b5b7f9517ff1bd2da971 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/CommandBlockEntity.java @@ -61,6 +61,13 @@ public class CommandBlockEntity extends BlockEntity { @@ -18839,7 +18837,7 @@ index 28e3b73507b988f7234cbf29c4024c88180d0aef..c8facee29ee08e0975528083f89b64f0 + BlockEntity getTileEntity(); // Folia - region threading } diff --git a/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java b/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java -index 2fec480b6ca12a95013d920852db58722579caf1..04c1803c43b6c677f4c4534b97fbc5e467f8aa5b 100644 +index 2d7e9909f73922083a81dda21261e167d0fa6834..1cc9aa360f6210429d4af1711ce8eccc3e2cb64c 100644 --- a/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java +++ b/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java @@ -175,55 +175,57 @@ public final class TreeGrower { @@ -19013,10 +19011,10 @@ index 807a097a7b6399f24ede741f94ce98eb67e55add..c2a0cd1c25b6d775b55f8c3aacca9837 // Paper end - Bound treasure maps to world border diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java -index b5114f84b2df2f4606702b892d32d484225d9dcf..213d1abc8fdd7702285b6cdd85ad47ee09000d3a 100644 +index e0cb360ece042c4fc6aa0d10106923fe25288f5c..7f6dd454e0794739dc1861f768aaed86c484afe7 100644 --- a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java -@@ -325,7 +325,7 @@ public abstract class ChunkGenerator { +@@ -326,7 +326,7 @@ public abstract class ChunkGenerator { } private static boolean tryAddReference(StructureManager structureAccessor, StructureStart start) { @@ -19026,10 +19024,10 @@ index b5114f84b2df2f4606702b892d32d484225d9dcf..213d1abc8fdd7702285b6cdd85ad47ee return true; } else { 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 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431e1240ed6 100644 +index 97937e3bd211997f0a0a3e9e671a1c59712d0003..2c421ddb759eae4fbf2f2420d3b8cab22e854b85 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -61,6 +61,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -62,6 +62,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p @Override public void tick() {} @@ -19043,7 +19041,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 @Override public boolean isRemoved() { return true; -@@ -218,12 +225,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -223,12 +230,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p @Override public void markUnsaved() { @@ -19057,7 +19055,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 } -@@ -375,6 +377,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -380,6 +382,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p @Nullable public BlockState setBlockState(BlockPos blockposition, BlockState iblockdata, boolean flag, boolean doPlace) { @@ -19065,7 +19063,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 // CraftBukkit end int i = blockposition.getY(); LevelChunkSection chunksection = this.getSection(this.getSectionIndex(i)); -@@ -416,7 +419,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -421,7 +424,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p boolean flag3 = iblockdata1.hasBlockEntity(); @@ -19074,7 +19072,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 iblockdata1.onRemove(this.level, blockposition, iblockdata, flag); } else if (!iblockdata1.is(block) && flag3) { this.removeBlockEntity(blockposition); -@@ -426,7 +429,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -431,7 +434,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p return null; } else { // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. @@ -19083,7 +19081,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 iblockdata.onPlace(this.level, blockposition, iblockdata1, flag); } -@@ -478,7 +481,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -483,7 +486,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p @Nullable public BlockEntity getBlockEntity(BlockPos pos, LevelChunk.EntityCreationType creationType) { // CraftBukkit start @@ -19092,7 +19090,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 if (tileentity == null) { tileentity = (BlockEntity) this.blockEntities.get(pos); } -@@ -700,13 +703,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -705,13 +708,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p org.bukkit.World world = this.level.getWorld(); if (world != null) { @@ -19108,7 +19106,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 } } server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk)); -@@ -732,7 +735,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -737,7 +740,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p @Override public boolean isUnsaved() { // Paper start - rewrite chunk system @@ -19117,7 +19115,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 if (((ca.spottedleaf.moonrise.patches.chunk_system.ticks.ChunkSystemLevelChunkTicks)this.blockTicks).moonrise$isDirty(gameTime) || ((ca.spottedleaf.moonrise.patches.chunk_system.ticks.ChunkSystemLevelChunkTicks)this.fluidTicks).moonrise$isDirty(gameTime)) { return true; -@@ -1015,6 +1018,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -1020,6 +1023,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p this.ticker = wrapped; } @@ -19131,7 +19129,7 @@ index 4640baec5bed6c2d53cc0f8ca1d273cc115abe9b..877f68f9abfc659f489d6571efc1b431 @Override public void tick() { this.ticker.tick(); -@@ -1051,6 +1061,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -1056,6 +1066,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p this.ticker = blockentityticker; } @@ -19638,10 +19636,10 @@ index ae321b3b8d98e42ef07fd1f0f738c1a2b428f6db..ed258986f2bdec9f78aa41d7dc49a5ec } } diff --git a/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java b/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java -index 8212f2dfba5c2eee5a823b5217fb43dc870d228a..e1b1e4a339264f7c88b651c75cda5c82b0f0967d 100644 +index 9272c91e0ee489091fdf1fedcf3801c070e9e82a..188aac988659e8ee36d0990acb001868ba398a3c 100644 --- a/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java +++ b/src/main/java/net/minecraft/world/level/storage/DimensionDataStorage.java -@@ -46,6 +46,7 @@ public class DimensionDataStorage implements AutoCloseable { +@@ -51,6 +51,7 @@ public class DimensionDataStorage implements AutoCloseable { } public T computeIfAbsent(SavedData.Factory type, String id) { @@ -19649,7 +19647,7 @@ index 8212f2dfba5c2eee5a823b5217fb43dc870d228a..e1b1e4a339264f7c88b651c75cda5c82 T savedData = this.get(type, id); if (savedData != null) { return savedData; -@@ -54,10 +55,12 @@ public class DimensionDataStorage implements AutoCloseable { +@@ -59,10 +60,12 @@ public class DimensionDataStorage implements AutoCloseable { this.set(id, savedData2); return savedData2; } @@ -19662,7 +19660,7 @@ index 8212f2dfba5c2eee5a823b5217fb43dc870d228a..e1b1e4a339264f7c88b651c75cda5c82 Optional optional = this.cache.get(id); if (optional == null) { optional = Optional.ofNullable(this.readSavedData(type.deserializer(), type.type(), id)); -@@ -65,6 +68,7 @@ public class DimensionDataStorage implements AutoCloseable { +@@ -70,6 +73,7 @@ public class DimensionDataStorage implements AutoCloseable { } return (T)optional.orElse(null); @@ -19670,7 +19668,7 @@ index 8212f2dfba5c2eee5a823b5217fb43dc870d228a..e1b1e4a339264f7c88b651c75cda5c82 } @Nullable -@@ -83,8 +87,10 @@ public class DimensionDataStorage implements AutoCloseable { +@@ -88,8 +92,10 @@ public class DimensionDataStorage implements AutoCloseable { } public void set(String id, SavedData state) { @@ -19900,10 +19898,10 @@ index ac8af406180bc680d46e8edc3da0fc2e5211345a..7cc63a4a9759d3926f843cfedbc79986 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873ef4f7568 100644 +index a9f7ac8d1f5e184687d53ab3e8b348bb7f4f2ba0..ec70a4dcb9f12d55af039c008bfe47ab355daecf 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -231,7 +231,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -232,7 +232,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getTickableTileEntityCount() { @@ -19912,7 +19910,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 } @Override -@@ -298,7 +298,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -299,7 +299,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start - per world spawn limits for (SpawnCategory spawnCategory : SpawnCategory.values()) { if (CraftSpawnCategory.isValidForLimits(spawnCategory)) { @@ -19921,7 +19919,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 } } // Paper end - per world spawn limits -@@ -368,6 +368,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -369,6 +369,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public Chunk getChunkAt(int x, int z) { @@ -19929,7 +19927,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 warnUnsafeChunk("getting a faraway chunk", x, z); // Paper net.minecraft.world.level.chunk.LevelChunk chunk = (net.minecraft.world.level.chunk.LevelChunk) this.world.getChunk(x, z, ChunkStatus.FULL, true); return new CraftChunk(chunk); -@@ -398,10 +399,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -399,10 +400,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean isChunkGenerated(int x, int z) { // Paper start - Fix this method @@ -19942,7 +19940,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 } ChunkAccess chunk = world.getChunkSource().getChunkAtImmediately(x, z); if (chunk != null) { -@@ -458,7 +459,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -459,7 +460,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { } private boolean unloadChunk0(int x, int z, boolean save) { @@ -19951,7 +19949,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 if (!this.isChunkLoaded(x, z)) { return true; } -@@ -475,7 +476,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -476,7 +477,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean regenerateChunk(int x, int z) { @@ -19960,7 +19958,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 throw new UnsupportedOperationException("Not supported in this Minecraft version! Unless you can fix it, this is not a bug :)"); /* if (!unloadChunk0(x, z, false)) { -@@ -502,6 +503,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -503,6 +504,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean refreshChunk(int x, int z) { @@ -19968,7 +19966,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 ChunkHolder playerChunk = this.world.getChunkSource().chunkMap.getVisibleChunkIfPresent(ChunkPos.asLong(x, z)); if (playerChunk == null) return false; -@@ -562,7 +564,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -563,7 +565,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean loadChunk(int x, int z, boolean generate) { @@ -19977,7 +19975,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 warnUnsafeChunk("loading a faraway chunk", x, z); // Paper ChunkAccess chunk = this.world.getChunkSource().getChunk(x, z, generate || isChunkGenerated(x, z) ? ChunkStatus.FULL : ChunkStatus.EMPTY, true); // Paper -@@ -603,7 +605,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -604,7 +606,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { DistanceManager chunkDistanceManager = this.world.getChunkSource().chunkMap.distanceManager; if (chunkDistanceManager.addRegionTicketAtDistance(TicketType.PLUGIN_TICKET, new ChunkPos(x, z), 2, plugin)) { // keep in-line with force loading, add at level 31 @@ -19986,7 +19984,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 return true; } -@@ -814,13 +816,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -815,13 +817,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -20007,7 +20005,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 BlockPos position = ((CraftBlockState) blockstate).getPosition(); net.minecraft.world.level.block.state.BlockState oldBlock = this.world.getBlockState(position); int flag = ((CraftBlockState) blockstate).getFlag(); -@@ -828,10 +832,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -829,10 +833,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { net.minecraft.world.level.block.state.BlockState newBlock = this.world.getBlockState(position); this.world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, newBlock, flag, 512); } @@ -20020,7 +20018,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 return false; } } -@@ -865,6 +869,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -866,6 +870,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setTime(long time) { @@ -20028,7 +20026,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 long margin = (time - this.getFullTime()) % 24000; if (margin < 0) margin += 24000; this.setFullTime(this.getFullTime() + margin); -@@ -877,6 +882,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -878,6 +883,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setFullTime(long time) { @@ -20036,7 +20034,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 // Notify anyone who's listening TimeSkipEvent event = new TimeSkipEvent(this, TimeSkipEvent.SkipReason.CUSTOM, time - this.world.getDayTime()); this.server.getPluginManager().callEvent(event); -@@ -904,7 +910,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -905,7 +911,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public long getGameTime() { @@ -20045,7 +20043,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 } @Override -@@ -929,6 +935,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -930,6 +936,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { } public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source, Consumer configurator) { // Paper end - expand explosion API @@ -20053,7 +20051,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 net.minecraft.world.level.Level.ExplosionInteraction explosionType; if (!breakBlocks) { explosionType = net.minecraft.world.level.Level.ExplosionInteraction.NONE; // Don't break blocks -@@ -938,6 +945,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -939,6 +946,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { explosionType = net.minecraft.world.level.Level.ExplosionInteraction.MOB; // Respect mobGriefing gamerule } @@ -20061,7 +20059,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 net.minecraft.world.entity.Entity entity = (source == null) ? null : ((CraftEntity) source).getHandle(); return !this.world.explode0(entity, Explosion.getDefaultDamageSource(this.world, entity), null, x, y, z, power, setFire, explosionType, ParticleTypes.EXPLOSION, ParticleTypes.EXPLOSION_EMITTER, SoundEvents.GENERIC_EXPLODE, configurator).wasCanceled; // Paper - expand explosion API } -@@ -1020,6 +1028,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1021,6 +1029,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getHighestBlockYAt(int x, int z, org.bukkit.HeightMap heightMap) { @@ -20069,7 +20067,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 warnUnsafeChunk("getting a faraway chunk", x >> 4, z >> 4); // Paper // Transient load for this tick return this.world.getChunk(x >> 4, z >> 4).getHeight(CraftHeightMap.toNMS(heightMap), x, z); -@@ -1050,6 +1059,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1051,6 +1060,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setBiome(int x, int y, int z, Holder bb) { BlockPos pos = new BlockPos(x, 0, z); @@ -20077,7 +20075,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 if (this.world.hasChunkAt(pos)) { net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkAt(pos); -@@ -1360,6 +1370,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1361,6 +1371,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setStorm(boolean hasStorm) { @@ -20085,7 +20083,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.world.serverLevelData.setRaining(hasStorm, org.bukkit.event.weather.WeatherChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setWeatherDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1372,6 +1383,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1373,6 +1384,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setWeatherDuration(int duration) { @@ -20093,7 +20091,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.world.serverLevelData.setRainTime(duration); } -@@ -1382,6 +1394,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1383,6 +1395,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThundering(boolean thundering) { @@ -20101,7 +20099,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.world.serverLevelData.setThundering(thundering, org.bukkit.event.weather.ThunderChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setThunderDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1394,6 +1407,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1395,6 +1408,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThunderDuration(int duration) { @@ -20109,7 +20107,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.world.serverLevelData.setThunderTime(duration); } -@@ -1404,6 +1418,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1405,6 +1419,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setClearWeatherDuration(int duration) { @@ -20117,7 +20115,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.world.serverLevelData.setClearWeatherTime(duration); } -@@ -1598,6 +1613,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1603,6 +1618,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setKeepSpawnInMemory(boolean keepLoaded) { @@ -20125,7 +20123,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 if (keepLoaded) { this.setGameRule(GameRule.SPAWN_CHUNK_RADIUS, this.getGameRuleDefault(GameRule.SPAWN_CHUNK_RADIUS)); } else { -@@ -1666,6 +1682,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1671,6 +1687,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setHardcore(boolean hardcore) { @@ -20133,7 +20131,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.world.serverLevelData.settings.hardcore = hardcore; } -@@ -1678,6 +1695,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1683,6 +1700,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) { @@ -20141,7 +20139,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setTicksPerSpawns(SpawnCategory.ANIMAL, ticksPerAnimalSpawns); } -@@ -1690,6 +1708,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1695,6 +1713,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) { @@ -20149,7 +20147,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setTicksPerSpawns(SpawnCategory.MONSTER, ticksPerMonsterSpawns); } -@@ -1702,6 +1721,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1707,6 +1726,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) { @@ -20157,7 +20155,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setTicksPerSpawns(SpawnCategory.WATER_ANIMAL, ticksPerWaterSpawns); } -@@ -1714,6 +1734,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1719,6 +1739,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterAmbientSpawns(int ticksPerWaterAmbientSpawns) { @@ -20165,7 +20163,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setTicksPerSpawns(SpawnCategory.WATER_AMBIENT, ticksPerWaterAmbientSpawns); } -@@ -1726,6 +1747,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1731,6 +1752,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterUndergroundCreatureSpawns(int ticksPerWaterUndergroundCreatureSpawns) { @@ -20173,7 +20171,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setTicksPerSpawns(SpawnCategory.WATER_UNDERGROUND_CREATURE, ticksPerWaterUndergroundCreatureSpawns); } -@@ -1738,11 +1760,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1743,11 +1765,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) { @@ -20187,7 +20185,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 Preconditions.checkArgument(spawnCategory != null, "SpawnCategory cannot be null"); Preconditions.checkArgument(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory.%s are not supported", spawnCategory); -@@ -1759,21 +1783,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1764,21 +1788,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { @@ -20213,7 +20211,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.server.getWorldMetadata().removeMetadata(this, metadataKey, owningPlugin); } -@@ -1786,6 +1814,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1791,6 +1819,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setMonsterSpawnLimit(int limit) { @@ -20221,7 +20219,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setSpawnLimit(SpawnCategory.MONSTER, limit); } -@@ -1798,6 +1827,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1803,6 +1832,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAnimalSpawnLimit(int limit) { @@ -20229,7 +20227,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setSpawnLimit(SpawnCategory.ANIMAL, limit); } -@@ -1810,6 +1840,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1815,6 +1845,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAnimalSpawnLimit(int limit) { @@ -20237,7 +20235,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setSpawnLimit(SpawnCategory.WATER_ANIMAL, limit); } -@@ -1822,6 +1853,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1827,6 +1858,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAmbientSpawnLimit(int limit) { @@ -20245,7 +20243,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setSpawnLimit(SpawnCategory.WATER_AMBIENT, limit); } -@@ -1834,6 +1866,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1839,6 +1871,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterUndergroundCreatureSpawnLimit(int limit) { @@ -20253,7 +20251,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setSpawnLimit(SpawnCategory.WATER_UNDERGROUND_CREATURE, limit); } -@@ -1846,6 +1879,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1851,6 +1884,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAmbientSpawnLimit(int limit) { @@ -20261,7 +20259,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 this.setSpawnLimit(SpawnCategory.AMBIENT, limit); } -@@ -1868,6 +1902,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1873,6 +1907,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setSpawnLimit(SpawnCategory spawnCategory, int limit) { @@ -20269,7 +20267,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 Preconditions.checkArgument(spawnCategory != null, "SpawnCategory cannot be null"); Preconditions.checkArgument(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory.%s are not supported", spawnCategory); -@@ -1950,7 +1985,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1955,7 +1990,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(CraftSound.bukkitToMinecraftHolder(sound), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); @@ -20278,7 +20276,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -1971,7 +2006,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1976,7 +2011,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(Holder.direct(SoundEvent.createVariableRangeEvent(ResourceLocation.parse(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); @@ -20287,7 +20285,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -2054,6 +2089,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2059,6 +2094,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRuleValue(String rule, String value) { @@ -20295,7 +20293,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 // No null values allowed if (rule == null || value == null) return false; -@@ -2096,6 +2132,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2101,6 +2137,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRule(GameRule rule, T newValue) { @@ -20303,7 +20301,7 @@ index 8f234b46c24a0ae08aa5f8190c5b27e1f62dfbab..e255a8e1a3c07d62fae6589b45f9f873 Preconditions.checkArgument(rule != null, "GameRule cannot be null"); Preconditions.checkArgument(newValue != null, "GameRule value cannot be null"); -@@ -2322,6 +2359,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2327,6 +2364,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void sendGameEvent(Entity sourceEntity, org.bukkit.GameEvent gameEvent, Vector position) { @@ -20569,7 +20567,7 @@ index a45e658996e483e9a21cfd8178153ddb7b87ae69..25303f144422469350fdc6f84320b16b List offers = waitable.get(); if (offers == null) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index ddabaed899c755925ad8618b78c33dacaf2126ac..5168cf0d58013aecfd80d37fb698014f38f8e08d 100644 +index b25b10c24a379097233e61bcc10add841b6a7115..5168cf0d58013aecfd80d37fb698014f38f8e08d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -80,6 +80,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -20633,20 +20631,11 @@ index ddabaed899c755925ad8618b78c33dacaf2126ac..5168cf0d58013aecfd80d37fb698014f - - world.loadChunksForMoveAsync(getHandle().getBoundingBoxAt(locationClone.getX(), locationClone.getY(), locationClone.getZ()), - this instanceof CraftPlayer ? ca.spottedleaf.concurrentutil.util.Priority.HIGHER : ca.spottedleaf.concurrentutil.util.Priority.NORMAL, (list) -> { -- net.minecraft.server.level.ServerChunkCache chunkProviderServer = world.getChunkSource(); -- for (net.minecraft.world.level.chunk.ChunkAccess chunk : list) { -- chunkProviderServer.addTicketAtLevel(net.minecraft.server.level.TicketType.POST_TELEPORT, chunk.getPos(), 33, CraftEntity.this.getEntityId()); -+ java.util.function.Consumer run = (Entity nmsEntity) -> { -+ boolean success = nmsEntity.teleportAsync( -+ ((CraftWorld)locationClone.getWorld()).getHandle(), -+ new net.minecraft.world.phys.Vec3(locationClone.getX(), locationClone.getY(), locationClone.getZ()), -+ locationClone.getYaw(), locationClone.getPitch(), net.minecraft.world.phys.Vec3.ZERO, -+ cause == null ? TeleportCause.UNKNOWN : cause, -+ Entity.TELEPORT_FLAG_LOAD_CHUNK | Entity.TELEPORT_FLAG_TELEPORT_PASSENGERS, // preserve behavior with old API: dismount the entity so it can teleport -+ (Entity entityTp) -> { -+ ret.complete(Boolean.TRUE); - } - net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> { +- final net.minecraft.server.level.ServerChunkCache chunkCache = world.getChunkSource(); +- for (final net.minecraft.world.level.chunk.ChunkAccess chunk : list) { +- chunkCache.addTicketAtLevel(net.minecraft.server.level.TicketType.POST_TELEPORT, chunk.getPos(), 33, CraftEntity.this.getEntityId()); +- } - try { - ret.complete(CraftEntity.this.teleport(locationClone, cause, teleportFlags) ? Boolean.TRUE : Boolean.FALSE); - } catch (Throwable throwable) { @@ -20658,6 +20647,16 @@ index ddabaed899c755925ad8618b78c33dacaf2126ac..5168cf0d58013aecfd80d37fb698014f - } - }); - }); ++ java.util.function.Consumer run = (Entity nmsEntity) -> { ++ boolean success = nmsEntity.teleportAsync( ++ ((CraftWorld)locationClone.getWorld()).getHandle(), ++ new net.minecraft.world.phys.Vec3(locationClone.getX(), locationClone.getY(), locationClone.getZ()), ++ locationClone.getYaw(), locationClone.getPitch(), net.minecraft.world.phys.Vec3.ZERO, ++ cause == null ? TeleportCause.UNKNOWN : cause, ++ Entity.TELEPORT_FLAG_LOAD_CHUNK | Entity.TELEPORT_FLAG_TELEPORT_PASSENGERS, // preserve behavior with old API: dismount the entity so it can teleport ++ (Entity entityTp) -> { ++ ret.complete(Boolean.TRUE); ++ } + ); + if (!success) { + ret.complete(Boolean.FALSE); @@ -20697,7 +20696,7 @@ index ddabaed899c755925ad8618b78c33dacaf2126ac..5168cf0d58013aecfd80d37fb698014f return java.util.Collections.emptySet(); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index d4e497961578bb693275cdf95915b60b2cc76eb7..33e710ed34832876edb138b13cf259c18052333a 100644 +index 84c494ca81b8f58604b372ac7236147776817a4f..5ebcd6b8edc76572a3fffead4735fd5824a083f1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -656,7 +656,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -20739,7 +20738,7 @@ index d4e497961578bb693275cdf95915b60b2cc76eb7..33e710ed34832876edb138b13cf259c1 if (entry != null && !entry.seenBy.contains(this.getHandle().connection)) { entry.updatePlayer(this.getHandle()); } -@@ -3369,7 +3374,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3354,7 +3359,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { { if ( CraftPlayer.this.getHealth() <= 0 && CraftPlayer.this.isOnline() ) { @@ -20780,10 +20779,10 @@ index e37aaf77f94b97b736cc20ef070cefdff0400188..ebbe224d81f6a96f3b05e3379cd0c5b5 return itemStack; } diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -index 6fef86e47e37eab6721cfd67d494afb25a2ded68..3a5d9fb6ceba1944b74bf6d5b2949a199af1b985 100644 +index 1354ccfbf525e5e64483ac5f443cc2325ba63850..fad85bea8643a3a88ec5c4194de7a5060e81c136 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -@@ -518,6 +518,7 @@ public class CraftScheduler implements BukkitScheduler { +@@ -514,6 +514,7 @@ public class CraftScheduler implements BukkitScheduler { } protected CraftTask handle(final CraftTask task, final long delay) { // Paper @@ -20792,7 +20791,7 @@ index 6fef86e47e37eab6721cfd67d494afb25a2ded68..3a5d9fb6ceba1944b74bf6d5b2949a19 if (!this.isAsyncScheduler && !task.isSync()) { this.asyncScheduler.handle(task, delay); diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 507f908916cbeb592496f963b46e4c2121a7b5e3..02de9ae7b8a3b7ef465351b02ff574cc6cacab99 100644 +index 15892c7769caa15f3d52a1ee2147cf9615aa0e25..f546cbe867d524f402491901df7d08e56668f406 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -370,6 +370,12 @@ public final class CraftMagicNumbers implements UnsafeValues { diff --git a/patches/server/0004-Max-pending-logins.patch b/patches/server/0004-Max-pending-logins.patch index b7939e0..9db9e3e 100644 --- a/patches/server/0004-Max-pending-logins.patch +++ b/patches/server/0004-Max-pending-logins.patch @@ -19,7 +19,7 @@ index 7fdb9304de7cf1979d57e3fac32415d7c674609d..227d62a69a453d49c28568ecb41ecef8 // CraftBukkit start diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 384c876fd25340ea7099bcfb9939e9e475c186a0..c5b67dccdd15d3d8a7d950d397eeffba392bec17 100644 +index b449de44b1911e2ff0701956bfba53fb5d2ed44e..c1574cdea90731dec4d24b15979209cce0c581af 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -175,6 +175,17 @@ public abstract class PlayerList { diff --git a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index 73f7a0c..73a3c63 100644 --- a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -29,10 +29,10 @@ index 41bf71d116ffc5431586ce54abba7f8def6c1dcf..1cf9a7677449ab8f03fb23d835e3fadc } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index ad358909318a7e52d43e9dfb5cc7e6aa5674b9fd..451d4cf162e39acd7ed215f82a5a84f6be6e166a 100644 +index 75929ae02677637500229b7b635479f92e3bd177..20fe53cc8e9edfc7b7d50f23379e0044e520c84d 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3214,6 +3214,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3244,6 +3244,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess if (!force && (!this.canRide(entity) || !entity.canAddPassenger(this))) { return false; } else { @@ -40,7 +40,7 @@ index ad358909318a7e52d43e9dfb5cc7e6aa5674b9fd..451d4cf162e39acd7ed215f82a5a84f6 // CraftBukkit start if (entity.getBukkitEntity() instanceof Vehicle && this.getBukkitEntity() instanceof LivingEntity) { VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.getBukkitEntity()); -@@ -3235,6 +3236,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3265,6 +3266,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return false; } // CraftBukkit end @@ -48,7 +48,7 @@ index ad358909318a7e52d43e9dfb5cc7e6aa5674b9fd..451d4cf162e39acd7ed215f82a5a84f6 if (this.isPassenger()) { this.stopRiding(); } -@@ -3318,6 +3320,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3348,6 +3350,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); } else { // CraftBukkit start @@ -56,7 +56,7 @@ index ad358909318a7e52d43e9dfb5cc7e6aa5674b9fd..451d4cf162e39acd7ed215f82a5a84f6 CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) { -@@ -3345,6 +3348,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3375,6 +3378,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return false; } // CraftBukkit end @@ -742,27 +742,6 @@ index 267f3c85058ef7c73e372c04493cfa6c907e44bb..df838d551fa08895e390eb793506e2f3 return (Creaking) this.entity; } -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreakingTransient.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreakingTransient.java -index 17d55c41fa9c5f836e47e3c2a6947960411417c2..f1c6c8df621bca8c84af41cccd546f8925f4b104 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreakingTransient.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreakingTransient.java -@@ -9,8 +9,16 @@ public class CraftCreakingTransient extends CraftCreaking implements org.bukkit. - super(server, entity); - } - -+ // Folia start - region threading -+ @Override -+ public CreakingTransient getHandleRaw() { -+ return (CreakingTransient)this.entity; -+ } -+ // Folia end - region threading -+ - @Override - public CreakingTransient getHandle() { -+ ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading - return (CreakingTransient) this.entity; - } - diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java index 664d9c1793b823ed03f198a936f2ebd9b7695898..6cbe6b6438296b6137ceea01b21ab6a69da2cc9c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java @@ -1731,7 +1710,7 @@ index e9f471e60af0725ec34e2985d63ae9ea9f88590a..cd824fc65ac2b1fe55710da4700f7c31 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index d0c409f4efad289e3e325f44b500fc72589d89d4..828d371cda28d68246c721a44331bd3f145db3a5 100644 +index 4f98d138a275a6c34528b7a5148ef265bc38d6b5..228f7fbce72b7828905e21f21525371a92ec07d4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -487,6 +487,13 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -1968,10 +1947,10 @@ index e8ece01669373ecf6552d33b2ed72668524e2650..fbb5c2e2a136cd03eb1f4b4b5ef289d6 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java -index 1fe06d3958295acc8211b7837b172262beb87f92..a35f88cf511c7d0231b1d973250b90b72eaec78c 100644 +index 15184e7fc3aeb388fb9de6be2ad72f98fee52044..f18093c5ccacfb55e7c6133cf5212c464e41ead4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java -@@ -62,8 +62,16 @@ public final class CraftMinecartTNT extends CraftMinecart implements ExplosiveMi +@@ -72,8 +72,16 @@ public final class CraftMinecartTNT extends CraftMinecart implements ExplosiveMi this.getHandle().explode(power); } @@ -2309,7 +2288,7 @@ index 2638c341bc02f201f7ab17fdebcdbdf3a7ec05bf..074b2919be2b5544b0a46e6cd32f6c57 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 33e710ed34832876edb138b13cf259c18052333a..b18a2733a03d908b4faa16b2d829d1b96b2d9411 100644 +index 5ebcd6b8edc76572a3fffead4735fd5824a083f1..95047bf77be54af6968a6e77f13dd01aa989b4d8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -674,7 +674,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch b/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch index 1979e6d..3ef413e 100644 --- a/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch +++ b/patches/server/0010-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch @@ -9,10 +9,10 @@ add explicit block update suppression techniques, it's better than the server crashing. diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 35b18a9ecce6c7b743badbf384f40b48f2fc73be..54bafb8f67361525484c5c58ee8e6568c0801477 100644 +index fc180c3f68a40e909f7e357a6fcd06858b870e97..7c18c298e26b2920ea588fc6a16c0baaea9f6fe5 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1966,7 +1966,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1969,7 +1969,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl Direction enumdirection = (Direction) iterator.next(); BlockPos blockposition1 = pos.relative(enumdirection); diff --git a/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch b/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch index 5214e7b..ca1c664 100644 --- a/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch +++ b/patches/server/0012-Skip-worldstate-access-when-waking-players-up-during.patch @@ -9,10 +9,10 @@ data deserialization and is racey even in Vanilla. But in Folia, some accesses may throw and as such we need to fix this directly. diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index cb34ed2fe8d1bc087d57eca39f71286d81c7bb71..8c4f658ce87ef49d2b46e50d5957933e1b912b82 100644 +index ea3b3f624ab9f4fbdc6ff4e90076b5616728f6ca..759eb33a5b63cae7913907f06e67e0736f50dc13 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -796,7 +796,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -794,7 +794,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple this.getBukkitEntity().readExtraData(nbt); // CraftBukkit if (this.isSleeping()) { @@ -22,10 +22,10 @@ index cb34ed2fe8d1bc087d57eca39f71286d81c7bb71..8c4f658ce87ef49d2b46e50d5957933e // CraftBukkit start diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 77eab187d4d6e22e5f8722029107c5613a9a7300..b63393c131f736cd51666c675ac18918e038eca6 100644 +index e6871fb4b58910043e88ea45564363aa854eb0ca..73af15d18180b4df3fa0614b323f2397f5543db5 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -4605,6 +4605,11 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4612,6 +4612,11 @@ public abstract class LivingEntity extends Entity implements Attackable { } }); diff --git a/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch b/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch index d030244..9f1aedb 100644 --- a/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch +++ b/patches/server/0016-Sync-vehicle-position-to-player-position-on-player-d.patch @@ -7,10 +7,10 @@ This allows the player to be re-positioned before logging into the world without causing thread checks to trip on Folia. diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 8c4f658ce87ef49d2b46e50d5957933e1b912b82..fb3ea176726fa01c2ab7220432121db4ad5e54ae 100644 +index 759eb33a5b63cae7913907f06e67e0736f50dc13..b6f3078fa688ca61cfd45d856b95c160cfe7b2da 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -922,7 +922,13 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -920,7 +920,13 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple if (world instanceof ServerLevel) { ServerLevel worldserver = (ServerLevel) world; CompoundTag nbttagcompound = ((CompoundTag) nbt.get()).getCompound("RootVehicle"); diff --git a/patches/server/0017-Region-profiler.patch b/patches/server/0017-Region-profiler.patch index 728fd27..ad3aff2 100644 --- a/patches/server/0017-Region-profiler.patch +++ b/patches/server/0017-Region-profiler.patch @@ -1015,10 +1015,10 @@ index 0000000000000000000000000000000000000000..6e9b04613c5c867a74fa4f266a8ae8e6 + ) {} +} diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java -index 3a476713964002734a9e67fd9b6dfa497b590657..e176d2d2387e171ff163853131dcf8d1af9a268d 100644 +index dbb5b6ee36a54d6682b2a6d9389aee721b95d506..811479551bad422123ad1b09329e6fc8e12c7c4e 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java -@@ -1459,7 +1459,9 @@ public final class ChunkHolderManager { +@@ -1461,7 +1461,9 @@ public final class ChunkHolderManager { } public boolean processTicketUpdates() { @@ -1463,10 +1463,10 @@ index d6eb8f495688a1b65a4c419aa3ee655cd8eb322a..f338b273613840ed366ab13b528373e7 if (exception instanceof ReportedException) { ReportedException reportedexception = (ReportedException) exception; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 28b3a1d2d2bb4bac8abc6f7ca877ce133110a455..ce51c9e98aabf6d4a2a5c8c4eff80608c0dc9bd3 100644 +index 9fa5c1628f2df441de47a38e732e7b033c3e2448..be6dc4c066efd66279301f5796451105e323089a 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1713,6 +1713,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 && io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() % autosavePeriod == 0; // Folia - region threading @@ -1519,7 +1519,7 @@ index 28b3a1d2d2bb4bac8abc6f7ca877ce133110a455..ce51c9e98aabf6d4a2a5c8c4eff80608 try { this.isSaving = true; if (playerSaveInterval > 0) { -@@ -1818,6 +1830,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop chunks) { io.papermc.paper.threadedregions.RegionizedWorldData regionizedWorldData = this.level.getCurrentWorldData(); // Folia - region threading @@ -1679,7 +1679,7 @@ index 16001634fef7573e5363d2903e2b665bc12d3431..a5fc3187438467d24a3143a01188824b if ((this.spawnFriendlies || this.spawnEnemies) && this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { // don't count mobs when animals and monsters are disabled // re-set mob counts for (ServerPlayer player : this.level.getLocalPlayers()) { // Folia - region threading -@@ -576,6 +590,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -583,6 +597,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } else { spawnercreature_d = NaturalSpawner.createState(naturalSpawnChunkCount, regionizedWorldData.getLoadedEntities(), this::getFullChunk, !this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new LocalMobCapCalculator(this.chunkMap) : null, false); // Folia - region threading - note: function only cares about loaded entities, doesn't need all } @@ -1687,7 +1687,7 @@ index 16001634fef7573e5363d2903e2b665bc12d3431..a5fc3187438467d24a3143a01188824b // Paper end - Optional per player mob spawns regionizedWorldData.lastSpawnState = spawnercreature_d; // Folia - region threading -@@ -602,6 +617,9 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -609,6 +624,9 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon Iterator iterator = chunks.iterator(); @@ -1697,7 +1697,7 @@ index 16001634fef7573e5363d2903e2b665bc12d3431..a5fc3187438467d24a3143a01188824b while (iterator.hasNext()) { LevelChunk chunk = (LevelChunk) iterator.next(); ChunkPos chunkcoordintpair = chunk.getPos(); -@@ -615,10 +633,15 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -622,10 +640,15 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon this.level.tickChunk(chunk, k); } } @@ -1714,10 +1714,10 @@ index 16001634fef7573e5363d2903e2b665bc12d3431..a5fc3187438467d24a3143a01188824b } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1a53ea80a 100644 +index 6fe476d8014ab7540309d0b1c7ef6377cea94d8c..c682c92842168d47856075dd84e53d2c180298a0 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -725,6 +725,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -726,6 +726,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public void tick(BooleanSupplier shouldKeepTicking, io.papermc.paper.threadedregions.TickRegions.TickRegionData region) { // Folia - regionised ticking final io.papermc.paper.threadedregions.RegionizedWorldData regionizedWorldData = this.getCurrentWorldData(); // Folia - regionised ticking @@ -1725,7 +1725,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 ProfilerFiller gameprofilerfiller = Profiler.get(); regionizedWorldData.setHandlingTick(true); // Folia - regionised ticking -@@ -753,22 +754,32 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -754,22 +755,32 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe if (!this.isDebug() && flag) { j = regionizedWorldData.getRedstoneGameTime(); // Folia - region threading gameprofilerfiller.push("blockTicks"); @@ -1758,7 +1758,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 } regionizedWorldData.setHandlingTick(false); // Folia - regionised ticking -@@ -782,6 +793,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -783,6 +794,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe if (flag1 || this.emptyTime++ < 300) { gameprofilerfiller.push("entities"); if (this.dragonFight != null && flag) { @@ -1766,7 +1766,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 if (ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(this, this.dragonFight.origin)) { // Folia - region threading gameprofilerfiller.push("dragonFight"); this.dragonFight.tick(); -@@ -794,9 +806,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -795,9 +807,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe fightCenter ); } // Folia end - region threading @@ -1780,7 +1780,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 regionizedWorldData.forEachTickingEntity((entity) -> { // Folia - regionised ticking if (!entity.isRemoved()) { if (!tickratemanager.isEntityFrozen(entity)) { -@@ -822,8 +838,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -823,8 +839,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } } }); @@ -1792,7 +1792,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 } gameprofilerfiller.push("entityManagement"); -@@ -885,12 +904,15 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -886,12 +905,15 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } public void tickCustomSpawners(boolean spawnMonsters, boolean spawnAnimals) { @@ -1808,7 +1808,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 } } -@@ -1345,6 +1367,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1346,6 +1368,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe }); gameprofilerfiller.incrementCounter("tickNonPassenger"); final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity); // Paper - EAR 2 @@ -1821,7 +1821,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 if (isActive) { // Paper - EAR 2 entity.tick(); // Folia start - region threading -@@ -1359,6 +1387,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1360,6 +1388,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // Folia end - region threading } else { entity.inactiveTick(); } // Paper - EAR 2 gameprofilerfiller.pop(); @@ -1829,7 +1829,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 Iterator iterator = entity.getPassengers().iterator(); while (iterator.hasNext()) { -@@ -1377,6 +1406,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1378,6 +1407,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private void tickPassenger(Entity vehicle, Entity passenger, boolean isActive) { // Paper - EAR 2 if (!passenger.isRemoved() && passenger.getVehicle() == vehicle) { if (passenger instanceof Player || this.getCurrentWorldData().hasEntityTickingEntity(passenger)) { // Folia - region threading @@ -1842,7 +1842,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 passenger.setOldPosAndRot(); ++passenger.tickCount; ProfilerFiller gameprofilerfiller = Profiler.get(); -@@ -1414,6 +1449,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1415,6 +1450,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.tickPassenger(passenger, entity2, isActive); // Paper - EAR 2 } @@ -1851,7 +1851,7 @@ index cb2c0358fb462c4a5ebf94299119c2081dc5f78f..cd1af13c91b215d896618fa0f2790da1 } else { passenger.stopRiding(); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index c5b67dccdd15d3d8a7d950d397eeffba392bec17..995ea080be9ee8e3b246723e115e312d2f0984bb 100644 +index c1574cdea90731dec4d24b15979209cce0c581af..a809622f43a45fd77bbb07a24f21c841a90dc07a 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1258,6 +1258,7 @@ public abstract class PlayerList { @@ -1873,7 +1873,7 @@ index c5b67dccdd15d3d8a7d950d397eeffba392bec17..995ea080be9ee8e3b246723e115e312d } // Paper end - Incremental chunk and player saving diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index c8c2394558952d7ca57d29874485251b8f2b3400..0d18403c6c25555f78e2d6810520839f30258c8e 100644 +index d23914a3ab3723d532ae867db6b954c843030f75..635c9c7a8c8307c2bc845a8e1f24aacb526a3c92 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -412,7 +412,20 @@ public class EntityType implements FeatureElement, EntityTypeT @@ -1898,7 +1898,7 @@ index c8c2394558952d7ca57d29874485251b8f2b3400..0d18403c6c25555f78e2d6810520839f this.builtInRegistryHolder = BuiltInRegistries.ENTITY_TYPE.createIntrusiveHolder(this); this.factory = factory; this.category = spawnGroup; -@@ -963,7 +976,7 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -977,7 +990,7 @@ public class EntityType implements FeatureElement, EntityTypeT Util.fetchChoiceType(References.ENTITY_TREE, registryKey.location().toString()); } @@ -1908,10 +1908,10 @@ index c8c2394558952d7ca57d29874485251b8f2b3400..0d18403c6c25555f78e2d6810520839f } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 54bafb8f67361525484c5c58ee8e6568c0801477..3d96f7ae648b47cc7494578d9776e7ea6dee0964 100644 +index 7c18c298e26b2920ea588fc6a16c0baaea9f6fe5..456f15e44e41d65338c0346594be2b0042b84005 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -204,6 +204,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -205,6 +205,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public final ca.spottedleaf.moonrise.patches.chunk_system.level.entity.EntityLookup moonrise$getEntityLookup() { return this.entityLookup; } @@ -1921,7 +1921,7 @@ index 54bafb8f67361525484c5c58ee8e6568c0801477..3d96f7ae648b47cc7494578d9776e7ea @Override public final void moonrise$setEntityLookup(final ca.spottedleaf.moonrise.patches.chunk_system.level.entity.EntityLookup entityLookup) { -@@ -936,6 +939,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -937,6 +940,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl this.tileLimiter = new org.spigotmc.TickLimiter(this.spigotConfig.tileMaxTickTime); this.chunkPacketBlockController = this.paperConfig().anticheat.antiXray.enabled ? new com.destroystokyo.paper.antixray.ChunkPacketBlockControllerAntiXray(this, executor) : com.destroystokyo.paper.antixray.ChunkPacketBlockController.NO_OPERATION_INSTANCE; // Paper - Anti-Xray this.entityLookup = new ca.spottedleaf.moonrise.patches.chunk_system.level.entity.dfl.DefaultEntityLookup(this); // Paper - rewrite chunk system @@ -1931,7 +1931,7 @@ index 54bafb8f67361525484c5c58ee8e6568c0801477..3d96f7ae648b47cc7494578d9776e7ea } // Paper start - Cancel hit for vanished players -@@ -1480,14 +1486,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1481,14 +1487,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } protected void tickBlockEntities() { @@ -1950,7 +1950,7 @@ index 54bafb8f67361525484c5c58ee8e6568c0801477..3d96f7ae648b47cc7494578d9776e7ea // Spigot start // Iterator iterator = this.blockEntityTickers.iterator(); boolean flag = this.tickRateManager().runsNormally(); -@@ -1516,6 +1526,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1517,6 +1527,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } } blockEntityTickers.removeAll(toRemove); // Paper - Fix MC-117075 // Folia - regionised ticking @@ -1959,31 +1959,33 @@ index 54bafb8f67361525484c5c58ee8e6568c0801477..3d96f7ae648b47cc7494578d9776e7ea regionizedWorldData.seTtickingBlockEntities(false); // Folia - regionised ticking gameprofilerfiller.pop(); diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntityType.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntityType.java -index dea945a9b278353647dca3ed001158c198dab668..422c9aeb761092496089a1b2e1dd9c5fe8f5b2bc 100644 +index 63c5bc786010d96dc121ee14dbac99253b3c8168..47e9a10c8d1f12dff335cda787ce720357bdd969 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntityType.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntityType.java -@@ -245,10 +245,14 @@ public class BlockEntityType { +@@ -81,11 +81,14 @@ public class BlockEntityType { + BlockEntityType.LOGGER.warn("Block entity type {} requires at least one valid block to be defined!", id); } - Util.fetchChoiceType(References.BLOCK_ENTITY, id); -- return Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, id, new BlockEntityType<>(blockEntitySupplier, Set.of(blocks))); -+ return Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, id, new BlockEntityType<>(blockEntitySupplier, Set.of(blocks), id)); // Folia - profiler - } +- Util.fetchChoiceType(References.BLOCK_ENTITY, id); +- return (BlockEntityType) Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, id, new BlockEntityType<>(factory, Set.of(blocks))); +- } - private BlockEntityType(BlockEntityType.BlockEntitySupplier factory, Set blocks) { ++ return (BlockEntityType) Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, id, new BlockEntityType<>(factory, Set.of(blocks), id)); // Folia - profiler ++ } + // Folia start - profiler + public final int tileEntityTimingId; + private BlockEntityType(BlockEntityType.BlockEntitySupplier factory, Set blocks, String id) { + this.tileEntityTimingId = ca.spottedleaf.leafprofiler.LProfilerRegistry.GLOBAL_REGISTRY.getOrCreateTimer("Tile Entity Tick: " + id); + // Folia end - profiler + this.builtInRegistryHolder = BuiltInRegistries.BLOCK_ENTITY_TYPE.createIntrusiveHolder(this); this.factory = factory; this.validBlocks = blocks; - } 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 877f68f9abfc659f489d6571efc1b431e1240ed6..4bccb94cf953ebd4dfd4f1620ad1784ef235356f 100644 +index 2c421ddb759eae4fbf2f2420d3b8cab22e854b85..6003e3495e61073c39928918b9d9f4c2e20f3a49 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -1074,10 +1074,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -1079,10 +1079,13 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p BlockPos blockposition = this.blockEntity.getBlockPos(); if (LevelChunk.this.isTicking(blockposition)) { @@ -1997,7 +1999,7 @@ index 877f68f9abfc659f489d6571efc1b431e1240ed6..4bccb94cf953ebd4dfd4f1620ad1784e BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); if (this.blockEntity.getType().isValid(iblockdata)) { -@@ -1092,6 +1095,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -1097,6 +1100,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p } // Paper end - Remove the Block Entity if it's invalid }