diff --git a/gradle.properties b/gradle.properties index fb18bda..9c5716e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=dev.folia version=1.19.4-R0.1-SNAPSHOT mcVersion=1.19.4 -paperRef=cbcdfd03e7d4042a8812d70d3e20fc216bdc5e02 +paperRef=bc4a6647c99ae98c52c1c81597834be8fec6aa0d 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 6fd7423..bcd4c2e 100644 --- a/patches/api/0002-Region-scheduler-API.patch +++ b/patches/api/0002-Region-scheduler-API.patch @@ -485,10 +485,10 @@ index 0000000000000000000000000000000000000000..a6b50c9d8af589cc4747e14d343d2045 + } +} diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index a6bdd42b38454fe481f9210e1a0f5f94023a0543..aa2d0af0b0a783000e993fa622dd14e32b1914e3 100644 +index b0bc2df41506770e2854a287813f1c53f003eda1..dc94b729179b0590fe53658a7c98030933993082 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2459,6 +2459,44 @@ public final class Bukkit { +@@ -2478,6 +2478,44 @@ public final class Bukkit { return server.getPotionBrewer(); } // Paper end @@ -534,10 +534,10 @@ index a6bdd42b38454fe481f9210e1a0f5f94023a0543..aa2d0af0b0a783000e993fa622dd14e3 @NotNull public static Server.Spigot spigot() { diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index ce2ef5cff6ad10b64791e67f6d3cff328c2cf7dc..2f1d1edbe802f66962e2763d49a025fbc657c99f 100644 +index 1d1a1d087dabc9794e0062a064da2cced4062309..33426325abc9d63cc473b0e017044a3b72356069 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2139,4 +2139,36 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2162,4 +2162,36 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ @NotNull org.bukkit.potion.PotionBrewer getPotionBrewer(); // Paper end @@ -575,10 +575,10 @@ index ce2ef5cff6ad10b64791e67f6d3cff328c2cf7dc..2f1d1edbe802f66962e2763d49a025fb + // Folia end - region threading API } diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java -index 8c58018b155c52a7b2a139f784abceb6aa00a268..d8c447b4c01e82efab6f68b0c668fc10404ef202 100644 +index a2a423d4e4c2702ba5967223cab0432dd7d04732..de51553f7a03b367388aa37532f849c688447acb 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java -@@ -953,4 +953,13 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent +@@ -954,4 +954,13 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent */ boolean wouldCollideUsing(@NotNull BoundingBox boundingBox); // Paper End - Collision API @@ -593,7 +593,7 @@ index 8c58018b155c52a7b2a139f784abceb6aa00a268..d8c447b4c01e82efab6f68b0c668fc10 + // Folia end - region threading API } diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index 2b8308989fce7f8a16907f8711b362e671fdbfb6..800f954161886ca4f6332f8e0cbc4d4e8f9cbb74 100644 +index fc2dae69165776d08274e34a69962cc70445f411..06149045a44148bf0af5f52952ff0092fe2c70cb 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -544,9 +544,9 @@ public final class SimplePluginManager implements PluginManager { diff --git a/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch b/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch index 6f1c705..d226336 100644 --- a/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch +++ b/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch @@ -11,10 +11,10 @@ the schedulers depending on the result of the ownership check. diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index aa2d0af0b0a783000e993fa622dd14e32b1914e3..92678097e5255a8c7ff7b6b302ccb99f13c6f2e6 100644 +index dc94b729179b0590fe53658a7c98030933993082..dc27f6be4e89be464bc100eb849ffe063464ebdc 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2496,6 +2496,107 @@ public final class Bukkit { +@@ -2515,6 +2515,107 @@ public final class Bukkit { public static @NotNull io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler getGlobalRegionScheduler() { return server.getGlobalRegionScheduler(); } @@ -123,10 +123,10 @@ index aa2d0af0b0a783000e993fa622dd14e32b1914e3..92678097e5255a8c7ff7b6b302ccb99f @NotNull diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 2f1d1edbe802f66962e2763d49a025fbc657c99f..717635388aa449fd2e24692b14ceccc8a0f762c1 100644 +index 33426325abc9d63cc473b0e017044a3b72356069..5e427d5c5ce58927eb87b4f4f2466a27e70bc7c1 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2170,5 +2170,90 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2193,5 +2193,90 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi * @return the global region scheduler */ public @NotNull io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler getGlobalRegionScheduler(); diff --git a/patches/api/0006-Undo-making-JavaPlugin-logger-field-public.patch b/patches/api/0006-Undo-making-JavaPlugin-logger-field-public.patch deleted file mode 100644 index 34ac488..0000000 --- a/patches/api/0006-Undo-making-JavaPlugin-logger-field-public.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Emily -Date: Sun, 14 May 2023 11:32:38 -0700 -Subject: [PATCH] Undo making JavaPlugin#logger field public - - -diff --git a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java -index 6d31f3a2569ae9c522a5e6cddd38ac8f252f1bfe..2139377f7370a8352d36f2d10d2a726d528e1a47 100644 ---- a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java -+++ b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java -@@ -44,7 +44,7 @@ public abstract class JavaPlugin extends PluginBase { - private boolean naggable = true; - private FileConfiguration newConfig = null; - private File configFile = null; -- public Logger logger = null; // Paper - PluginLogger -> Logger, public -+ private Logger logger = null; // Paper - PluginLogger -> Logger - - public JavaPlugin() { - // Paper start -@@ -289,10 +289,10 @@ public abstract class JavaPlugin extends PluginBase { - .orElseThrow(); - } - public final void init(@NotNull PluginLoader loader, @NotNull Server server, @NotNull PluginDescriptionFile description, @NotNull File dataFolder, @NotNull File file, @NotNull ClassLoader classLoader) { -- init(server, description, dataFolder, file, classLoader, description); -+ init(server, description, dataFolder, file, classLoader, description, com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(description)); - this.pluginMeta = description; - } -- public final void init(@NotNull Server server, @NotNull PluginDescriptionFile description, @NotNull File dataFolder, @NotNull File file, @NotNull ClassLoader classLoader, @Nullable io.papermc.paper.plugin.configuration.PluginMeta configuration) { -+ public final void init(@NotNull Server server, @NotNull PluginDescriptionFile description, @NotNull File dataFolder, @NotNull File file, @NotNull ClassLoader classLoader, @Nullable io.papermc.paper.plugin.configuration.PluginMeta configuration, @NotNull Logger logger) { - // Paper end - this.loader = DummyPluginLoaderImplHolder.INSTANCE; // Paper - this.server = server; -@@ -302,11 +302,7 @@ public abstract class JavaPlugin extends PluginBase { - this.classLoader = classLoader; - this.configFile = new File(dataFolder, "config.yml"); - this.pluginMeta = configuration; // Paper -- // Paper start -- if (this.logger == null) { -- this.logger = com.destroystokyo.paper.utils.PaperPluginLogger.getLogger(this.description); -- } -- // Paper end -+ this.logger = logger; // Paper - } - - /** -diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java -index 1758e8a89c85eea8c2161ddcb5b0e745151a1f5e..13da387d3b59bc67c0d73e3fbd3a4034b1281527 100644 ---- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java -+++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java -@@ -270,8 +270,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm - pluginState = new IllegalStateException("Initial initialization"); - this.pluginInit = javaPlugin; - -- javaPlugin.logger = this.logger; // Paper - set logger -- javaPlugin.init(null, org.bukkit.Bukkit.getServer(), description, dataFolder, file, this); // Paper -+ javaPlugin.init(org.bukkit.Bukkit.getServer(), description, dataFolder, file, this, description, this.logger); // Paper - } - - // Paper start diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch index 1ddb8e1..5e734a7 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 9cf389defdaeb887e9cad4f0fed3f3b95667b238..dd53b1ffaff8dbaea0cf21c489a90162a496a026 100644 +index 4f2fa65ade89c5703451dad4f80eeef162b277d1..ec4ce20c9f3dfb488cbd0874b79cb612a12def6a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,12 @@ plugins { @@ -64,7 +64,7 @@ index 4b002e8b75d117b726b0de274a76d3596fce015b..58dc84b7b3b04c2d0b00fc5fac5303d3 metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> { Map> map = new HashMap<>(); diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -index bf42969859545a8a520923ef1836ffa4a5cc24a0..2ce29b6ccb9a3b520b8c1edf53aae2e9769ba252 100644 +index 9d687da5bdf398bb3f6c84cdf1249a7213d09f2e..e2f704c115fd6e00960bb56bb0779f1100c89c17 100644 --- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java @@ -31,8 +31,8 @@ public class PaperVersionFetcher implements VersionFetcher { @@ -101,10 +101,10 @@ index 9f15d9dbdfa74a0640b1a2b4ff695609d4758a4c..3219482b96cab8262e393a790c88d903 public SystemReport fillSystemReport(SystemReport details) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index f9a9d2bb7b6d1bf4a0931438de4d8c7ee0757479..e0b6c737f9de2b6e692d6813d8dea4c35f038573 100644 +index 9f2536d9a73bdb15b5b3004d4da79ca32cee205b..91c301275fa7b6a2fc16e3bdbf61b6a46eed6ef4 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -256,7 +256,7 @@ import javax.annotation.Nullable; // Paper +@@ -262,7 +262,7 @@ import javax.annotation.Nullable; // Paper import javax.annotation.Nonnull; // Paper public final class CraftServer implements Server { diff --git a/patches/server/0003-New-player-chunk-loader-system.patch b/patches/server/0003-New-player-chunk-loader-system.patch index 60127b9..13d651a 100644 --- a/patches/server/0003-New-player-chunk-loader-system.patch +++ b/patches/server/0003-New-player-chunk-loader-system.patch @@ -1398,7 +1398,7 @@ index 0000000000000000000000000000000000000000..63c69c4da5fcbd5901c9fc3427f69626 + } +} diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java -index e5d9c6f2cbe11c2ded6d8ad111fa6a8b2086dfba..c6d20bc2f0eab737338db6b88dacb63f0decb66c 100644 +index ad3560284ae79b9c6bbc8752be7d9d14b18e226e..cb12c31ffe014e17eb9f901ab0a273802e3e0245 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java @@ -1,5 +1,6 @@ @@ -1408,7 +1408,7 @@ index e5d9c6f2cbe11c2ded6d8ad111fa6a8b2086dfba..c6d20bc2f0eab737338db6b88dacb63f import ca.spottedleaf.concurrentutil.executor.standard.PrioritisedExecutor; import ca.spottedleaf.concurrentutil.map.SWMRLong2ObjectHashTable; import co.aikar.timings.Timing; -@@ -493,6 +494,21 @@ public final class ChunkHolderManager { +@@ -500,6 +501,21 @@ public final class ChunkHolderManager { } } @@ -1430,7 +1430,7 @@ index e5d9c6f2cbe11c2ded6d8ad111fa6a8b2086dfba..c6d20bc2f0eab737338db6b88dacb63f public void removeAllTicketsFor(final TicketType ticketType, final int ticketLevel, final T ticketIdentifier) { if (ticketLevel > MAX_TICKET_LEVEL) { return; -@@ -900,6 +916,142 @@ public final class ChunkHolderManager { +@@ -907,6 +923,142 @@ public final class ChunkHolderManager { } } @@ -1573,7 +1573,7 @@ index e5d9c6f2cbe11c2ded6d8ad111fa6a8b2086dfba..c6d20bc2f0eab737338db6b88dacb63f private final ThreadLocal BLOCK_TICKET_UPDATES = ThreadLocal.withInitial(() -> { return Boolean.FALSE; }); -@@ -948,6 +1100,8 @@ public final class ChunkHolderManager { +@@ -955,6 +1107,8 @@ public final class ChunkHolderManager { this.ticketLock.lock(); try { @@ -2021,7 +2021,7 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..5c7b8041e96ede9e662dfdb5285539bf return true; } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..bf1a77cf9bbea4e2104b2a8c61309e740f28d51b 100644 +index 45804711255f04110e9509df8d60900314aa10b7..7b7e2edbcb6c8eb45029e6cbf4fc9d2e9052b668 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -521,6 +521,48 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -2074,10 +2074,10 @@ index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..bf1a77cf9bbea4e2104b2a8c61309e74 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, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { // IRegistryCustom.Dimension iregistrycustom_dimension = minecraftserver.registryAccess(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 1d4d02f26391ac55c7631817f09d05e2769b0d29..4231c3fe14a621d237bdc3d56c593f0adc0a7bc6 100644 +index 98df2463bf41fc736aa6a2b6ddf89e5abde6eb39..37dfb5f2e56d8d7bf114dac6be82ccf0fbfc8a09 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -276,6 +276,48 @@ public class ServerPlayer extends Player { +@@ -278,6 +278,48 @@ public class ServerPlayer extends Player { public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event @@ -2127,10 +2127,10 @@ index 1d4d02f26391ac55c7631817f09d05e2769b0d29..4231c3fe14a621d237bdc3d56c593f0a super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); this.chatVisibility = ChatVisiblity.FULL; diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index c0c14766adaac855112f85a203a6163b8adfdded..0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2 100644 +index 92e758a286a5db079c32d53cc52c8a422457daef..7679fa8c905e6cee1906814a82f8ab4ab925b0fc 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -271,7 +271,7 @@ public abstract class PlayerList { +@@ -278,7 +278,7 @@ public abstract class PlayerList { boolean flag1 = gamerules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); // Spigot - view distance @@ -2139,7 +2139,7 @@ index c0c14766adaac855112f85a203a6163b8adfdded..0dbe182fbae5ce5ba182176eb5d5e3f1 player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit playerconnection.send(new ClientboundUpdateEnabledFeaturesPacket(FeatureFlags.REGISTRY.toNames(worldserver1.enabledFeatures()))); playerconnection.send(new ClientboundCustomPayloadPacket(ClientboundCustomPayloadPacket.BRAND, (new FriendlyByteBuf(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); -@@ -905,8 +905,8 @@ public abstract class PlayerList { +@@ -912,8 +912,8 @@ public abstract class PlayerList { // CraftBukkit start LevelData worlddata = worldserver1.getLevelData(); entityplayer1.connection.send(new ClientboundRespawnPacket(worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), (byte) i, entityplayer1.getLastDeathLocation())); @@ -2149,7 +2149,7 @@ index c0c14766adaac855112f85a203a6163b8adfdded..0dbe182fbae5ce5ba182176eb5d5e3f1 + entityplayer1.connection.send(new ClientboundSetSimulationDistancePacket(worldserver1.getWorld().getSimulationDistance())); // Spigot // Paper - replace old player chunk management entityplayer1.spawnIn(worldserver1); entityplayer1.unsetRemoved(); - entityplayer1.connection.teleport(new Location(worldserver1.getWorld(), entityplayer1.getX(), entityplayer1.getY(), entityplayer1.getZ(), entityplayer1.getYRot(), entityplayer1.getXRot())); + entityplayer1.connection.teleport(CraftLocation.toBukkit(entityplayer1.position(), worldserver1.getWorld(), entityplayer1.getYRot(), entityplayer1.getXRot())); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java index 973ecd50f9cb6b86c353586e84d15dcb118ccb60..944da18bcc993ab0488a34cbbe9df134c355301a 100644 --- a/src/main/java/net/minecraft/world/level/Level.java @@ -2164,10 +2164,10 @@ index 973ecd50f9cb6b86c353586e84d15dcb118ccb60..944da18bcc993ab0488a34cbbe9df134 // Paper end - per player view distance } 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 206dc04086a218b510930739a6c573f2653ab0fa..9599af33c683ec47e28b1c8e4dc965d30d9081a7 100644 +index d190bad5d287766ed4165ed827d9901a9d878687..6143607ad1485c552309ac3df37b3ba9adb7c07c 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -184,43 +184,6 @@ public class LevelChunk extends ChunkAccess { +@@ -177,43 +177,6 @@ public class LevelChunk extends ChunkAccess { protected void onNeighbourChange(final long bitsetBefore, final long bitsetAfter) { @@ -2211,7 +2211,7 @@ index 206dc04086a218b510930739a6c573f2653ab0fa..9599af33c683ec47e28b1c8e4dc965d3 } public final boolean isAnyNeighborsLoaded() { -@@ -906,7 +869,6 @@ public class LevelChunk extends ChunkAccess { +@@ -899,7 +862,6 @@ public class LevelChunk extends ChunkAccess { // Paper - rewrite chunk system - move into separate callback org.bukkit.Server server = this.level.getCraftServer(); // Paper - rewrite chunk system - move into separate callback @@ -2219,7 +2219,7 @@ index 206dc04086a218b510930739a6c573f2653ab0fa..9599af33c683ec47e28b1c8e4dc965d3 if (server != null) { /* * If it's a new world, the first few chunks are generated inside -@@ -1086,6 +1048,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1081,6 +1043,7 @@ public class LevelChunk extends ChunkAccess { BlockState iblockdata1 = Block.updateFromNeighbourShapes(iblockdata, this.level, blockposition); this.level.setBlock(blockposition, iblockdata1, 20); @@ -2227,7 +2227,7 @@ index 206dc04086a218b510930739a6c573f2653ab0fa..9599af33c683ec47e28b1c8e4dc965d3 } } -@@ -1105,7 +1068,6 @@ public class LevelChunk extends ChunkAccess { +@@ -1100,7 +1063,6 @@ public class LevelChunk extends ChunkAccess { this.upgradeData.upgrade(this); } finally { // Paper start - replace chunk loader system this.isPostProcessingDone = true; @@ -2236,10 +2236,10 @@ index 206dc04086a218b510930739a6c573f2653ab0fa..9599af33c683ec47e28b1c8e4dc965d3 // Paper end - replace chunk loader system } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 5e9055fdf411029ea2fed91acd6b981f79156418..ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db 100644 +index 8f0234296397ca2d4a607dcea6093c6c606dc7d2..4f0ca1621e4f1fc16d4a6601c858d74ed4d5a788 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2273,12 +2273,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2309,12 +2309,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Spigot start @Override public int getViewDistance() { @@ -2254,7 +2254,7 @@ index 5e9055fdf411029ea2fed91acd6b981f79156418..ff6559bf563f2fdcc0f2843d4f4aa24d } // Spigot end // Paper start - view distance api -@@ -2312,12 +2312,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2348,12 +2348,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getSendViewDistance() { @@ -2270,10 +2270,10 @@ index 5e9055fdf411029ea2fed91acd6b981f79156418..ff6559bf563f2fdcc0f2843d4f4aa24d // Paper end - view distance api diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 0ae1fce0c1a2e3bfbbab756a088fc76545e263fa..fec408416aa63e1022802a644bb95131601f0c3b 100644 +index be64633c8bcee96f2ad5247525cac965b7b031b1..e88d7a6b4835bdac1a247545b49e4161ade148cb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -189,44 +189,22 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -195,44 +195,22 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper start - implement view distances @Override public int getViewDistance() { @@ -2322,7 +2322,7 @@ index 0ae1fce0c1a2e3bfbbab756a088fc76545e263fa..fec408416aa63e1022802a644bb95131 } @Override -@@ -241,23 +219,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -247,23 +225,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public int getSendViewDistance() { diff --git a/patches/server/0005-Threaded-Regions.patch b/patches/server/0005-Threaded-Regions.patch index ac93a74..43c4d8d 100644 --- a/patches/server/0005-Threaded-Regions.patch +++ b/patches/server/0005-Threaded-Regions.patch @@ -1767,7 +1767,7 @@ index 22a2547810d0c029f29685faddf7ac21cde2df0b..e36b4053eb2676e934b8c9c401bf58cf // The variable 'k' holds the maximum redstone power value of any adjacent blocks. // If 'k' has the highest level of all neighbors, then the power level of this diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java -index 4d9bc4a62ebae0f3707900503576c64733de639f..9ba89a4bf4ae4e42418eca18f9d8a109e6c56a14 100644 +index 951a7df30bd70bb3051c04f592529d560be6948e..0761313364f96a2c1bdd6991a1d2ed9af6a19038 100644 --- a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -98,7 +98,7 @@ public final class ChatProcessor { @@ -1998,7 +1998,7 @@ index 61c170555c8854b102c640b0b6a615f9f732edbf..515cc130a411f218ed20628eb918be9d } diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java -index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82aa2b747f4 100644 +index cb12c31ffe014e17eb9f901ab0a273802e3e0245..1e5df2593b21b8ee7636f5df28541f9b04afa1e6 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java @@ -3,7 +3,6 @@ package io.papermc.paper.chunk.system.scheduling; @@ -2385,9 +2385,9 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a - if (flush) { + if (last && flush) { // Folia - region threading RegionFileIOThread.flush(); - } - if (logProgress) { -@@ -290,18 +478,16 @@ public final class ChunkHolderManager { + if (this.world.paperConfig().chunks.flushRegionsOnSave) { + try { +@@ -297,18 +485,16 @@ public final class ChunkHolderManager { } public boolean hasTickets() { @@ -2411,7 +2411,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a return tickets != null ? tickets.first().toString() : "no_ticket"; } finally { -@@ -312,7 +498,17 @@ public final class ChunkHolderManager { +@@ -319,7 +505,17 @@ public final class ChunkHolderManager { public Long2ObjectOpenHashMap>> getTicketsCopy() { this.ticketLock.lock(); try { @@ -2430,7 +2430,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a } finally { this.ticketLock.unlock(); } -@@ -322,7 +518,11 @@ public final class ChunkHolderManager { +@@ -329,7 +525,11 @@ public final class ChunkHolderManager { ImmutableList.Builder ret; this.ticketLock.lock(); try { @@ -2443,7 +2443,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a if (tickets == null) { return Collections.emptyList(); -@@ -375,12 +575,37 @@ public final class ChunkHolderManager { +@@ -382,12 +582,37 @@ public final class ChunkHolderManager { return false; } @@ -2483,7 +2483,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a return SortedArraySet.create(4); }); -@@ -392,25 +617,25 @@ public final class ChunkHolderManager { +@@ -399,25 +624,25 @@ public final class ChunkHolderManager { final long oldRemovalTick = current.removalTick; if (removeTick != oldRemovalTick) { if (oldRemovalTick != NO_TIMEOUT_MARKER) { @@ -2513,7 +2513,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a return new Long2IntOpenHashMap(); }).addTo(chunk, 1); } -@@ -421,6 +646,11 @@ public final class ChunkHolderManager { +@@ -428,6 +653,11 @@ public final class ChunkHolderManager { } return current == ticket; @@ -2525,7 +2525,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a } finally { this.ticketLock.unlock(); } -@@ -439,35 +669,70 @@ public final class ChunkHolderManager { +@@ -446,35 +676,70 @@ public final class ChunkHolderManager { return false; } @@ -2602,7 +2602,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a } } } -@@ -477,6 +742,11 @@ public final class ChunkHolderManager { +@@ -484,6 +749,11 @@ public final class ChunkHolderManager { } return true; @@ -2614,7 +2614,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a } finally { this.ticketLock.unlock(); } -@@ -516,24 +786,33 @@ public final class ChunkHolderManager { +@@ -523,24 +793,33 @@ public final class ChunkHolderManager { this.ticketLock.lock(); try { @@ -2655,7 +2655,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a if (toRemove == null) { return; -@@ -546,10 +825,10 @@ public final class ChunkHolderManager { +@@ -553,10 +832,10 @@ public final class ChunkHolderManager { for (final LongIterator iterator = toRemove.keySet().longIterator(); iterator.hasNext();) { final long chunk = iterator.nextLong(); @@ -2668,7 +2668,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a this.ticketLevelPropagator.removeSource(chunk); } else { this.ticketLevelPropagator.setSource(chunk, convertBetweenTicketLevels(tickets.first().getTicketLevel())); -@@ -798,30 +1077,62 @@ public final class ChunkHolderManager { +@@ -805,30 +1084,62 @@ public final class ChunkHolderManager { if (changedFullStatus.isEmpty()) { return; } @@ -2744,7 +2744,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a this.chunkHolders.remove(CoordinateUtils.getChunkKey(holder.chunkX, holder.chunkZ)); } -@@ -839,6 +1150,8 @@ public final class ChunkHolderManager { +@@ -846,6 +1157,8 @@ public final class ChunkHolderManager { throw new IllegalStateException("Cannot hold scheduling lock while calling processUnloads"); } @@ -2753,7 +2753,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a final List unloadQueue; final List scheduleList = new ArrayList<>(); this.ticketLock.lock(); -@@ -851,11 +1164,22 @@ public final class ChunkHolderManager { +@@ -858,11 +1171,22 @@ public final class ChunkHolderManager { // in order to ensure all chunks in the unload queue do not have a pending ticket level update, // process them now this.processTicketUpdates(false, false, scheduleList); @@ -2780,7 +2780,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a if (chunkHolder.isSafeToUnload() != null) { LOGGER.error("Chunkholder " + chunkHolder + " is not safe to unload but is inside the unload queue?"); continue; -@@ -1170,6 +1494,19 @@ public final class ChunkHolderManager { +@@ -1177,6 +1501,19 @@ public final class ChunkHolderManager { this.ticketLevelUpdates.clear(); } } @@ -2800,7 +2800,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a } finally { this.ticketLock.unlock(); } -@@ -1193,7 +1530,12 @@ public final class ChunkHolderManager { +@@ -1200,7 +1537,12 @@ public final class ChunkHolderManager { // only call on tick thread protected final boolean processPendingFullUpdate() { @@ -2814,7 +2814,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a boolean ret = false; -@@ -1204,9 +1546,7 @@ public final class ChunkHolderManager { +@@ -1211,9 +1553,7 @@ public final class ChunkHolderManager { ret |= holder.handleFullStatusChange(changedFullStatus); if (!changedFullStatus.isEmpty()) { @@ -2825,7 +2825,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a changedFullStatus.clear(); } } -@@ -1256,7 +1596,7 @@ public final class ChunkHolderManager { +@@ -1263,7 +1603,7 @@ public final class ChunkHolderManager { private JsonObject getDebugJsonNoLock() { final JsonObject ret = new JsonObject(); @@ -2834,7 +2834,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..9ac75b6c9d9698c6369978c4b004a82a final JsonArray unloadQueue = new JsonArray(); ret.add("unload_queue", unloadQueue); -@@ -1275,60 +1615,73 @@ public final class ChunkHolderManager { +@@ -1282,60 +1622,73 @@ public final class ChunkHolderManager { holders.add(holder.getDebugJson()); } @@ -3348,10 +3348,10 @@ index 9f5f0d8ddc8f480b48079c70e38c9c08eff403f6..3b83f25a24d6f9cdbf131d5a4432fb4a public class ChunkLoadingBasic extends ConfigurationPart { diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -index 51cf0014c4229fc8671804d885b6381996810130..f13d2e2174b3be0b0d4462406a1e00255867a790 100644 +index a33de97340f14219291c4175e9194914cdf441db..a00201eca053ef69b8d903fdb9538444baf85465 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -@@ -128,7 +128,7 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -134,7 +134,7 @@ public class WorldConfiguration extends ConfigurationPart { public boolean filterBadTileEntityNbtFromFallingBlocks = true; public List filteredEntityTagNbtPaths = NbtPathSerializer.fromString(List.of("Pos", "Motion", "SleepingX", "SleepingY", "SleepingZ")); public boolean disableMobSpawnerSpawnEggTransformation = false; @@ -3360,7 +3360,7 @@ index 51cf0014c4229fc8671804d885b6381996810130..f13d2e2174b3be0b0d4462406a1e0025 public boolean scanForLegacyEnderDragon = true; @MergeMap public Reference2IntMap spawnLimits = Util.make(new Reference2IntOpenHashMap<>(NaturalSpawner.SPAWNING_CATEGORIES.length), map -> Arrays.stream(NaturalSpawner.SPAWNING_CATEGORIES).forEach(mobCategory -> map.put(mobCategory, -1))); -@@ -405,7 +405,14 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -411,7 +411,14 @@ public class WorldConfiguration extends ConfigurationPart { public Chunks chunks; @@ -3377,10 +3377,10 @@ index 51cf0014c4229fc8671804d885b6381996810130..f13d2e2174b3be0b0d4462406a1e0025 public int maxAutoSaveChunksPerTick = 24; public int fixedChunkInhabitedTime = -1; diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java -index c0e896343c22badd97c774c4ed1daa4e274f5d44..1bca4a629fe986e5afa47d8884dc44b2be800f32 100644 +index 9c7552968b8c017c71a7a77557a66a03ed89f125..3b5572662c53715cd63772db90904dd1bed32390 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java -@@ -243,10 +243,19 @@ class PaperPluginInstanceManager { +@@ -240,10 +240,19 @@ class PaperPluginInstanceManager { + pluginName + " (Is it up to date?)", ex, plugin); // Paper } @@ -11253,10 +11253,10 @@ index 1e6ba6d9cceda1d4867b183c3dbc03d317ed287f..de8cf0f0d34708b960f1c81cb10d813a } diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217d8b21260 100644 +index 88d18d18d69876c98e199acb647c6cca9448d55d..d2e5899883ed62cc41d1bc3c4ca5c6ab8f73481b 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -@@ -222,7 +222,7 @@ public interface DispenseItemBehavior { +@@ -223,7 +223,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -11265,7 +11265,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -277,7 +277,7 @@ public interface DispenseItemBehavior { +@@ -278,7 +278,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -11274,7 +11274,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -333,7 +333,7 @@ public interface DispenseItemBehavior { +@@ -334,7 +334,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) list.get(0).getBukkitEntity()); @@ -11283,7 +11283,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 world.getCraftServer().getPluginManager().callEvent(event); } -@@ -389,7 +389,7 @@ public interface DispenseItemBehavior { +@@ -390,7 +390,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityhorseabstract.getBukkitEntity()); @@ -11292,7 +11292,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 world.getCraftServer().getPluginManager().callEvent(event); } -@@ -463,7 +463,7 @@ public interface DispenseItemBehavior { +@@ -464,7 +464,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityhorsechestedabstract.getBukkitEntity()); @@ -11301,7 +11301,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 world.getCraftServer().getPluginManager().callEvent(event); } -@@ -502,7 +502,7 @@ public interface DispenseItemBehavior { +@@ -503,7 +503,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(enumdirection.getStepX(), enumdirection.getStepY(), enumdirection.getStepZ())); @@ -11310,7 +11310,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -560,7 +560,7 @@ public interface DispenseItemBehavior { +@@ -561,7 +561,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d3, d4, d5)); @@ -11319,7 +11319,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -634,7 +634,7 @@ public interface DispenseItemBehavior { +@@ -635,7 +635,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); @@ -11328,7 +11328,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -707,7 +707,7 @@ public interface DispenseItemBehavior { +@@ -708,7 +708,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -11337,7 +11337,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -754,7 +754,7 @@ public interface DispenseItemBehavior { +@@ -755,7 +755,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack); // Paper - ignore stack size on damageable items BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -11346,7 +11346,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -815,7 +815,7 @@ public interface DispenseItemBehavior { +@@ -816,7 +816,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -11355,7 +11355,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -833,7 +833,8 @@ public interface DispenseItemBehavior { +@@ -834,7 +834,8 @@ public interface DispenseItemBehavior { } } @@ -11365,7 +11365,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 // CraftBukkit end if (!BoneMealItem.growCrop(stack, worldserver, blockposition) && !BoneMealItem.growWaterPlant(stack, worldserver, blockposition, (Direction) null)) { -@@ -842,13 +843,13 @@ public interface DispenseItemBehavior { +@@ -843,13 +844,13 @@ public interface DispenseItemBehavior { worldserver.levelEvent(1505, blockposition, 0); } // CraftBukkit start @@ -11377,7 +11377,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 + if (worldData.capturedBlockStates.size() > 0) { // Folia - region threading + TreeType treeType = SaplingBlock.treeTypeRT.get(); // Folia - region threading + SaplingBlock.treeTypeRT.set(null); // Folia - region threading - Location location = new Location(worldserver.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); + Location location = CraftLocation.toBukkit(blockposition, worldserver.getWorld()); - List blocks = new java.util.ArrayList<>(worldserver.capturedBlockStates.values()); - worldserver.capturedBlockStates.clear(); + List blocks = new java.util.ArrayList<>(worldData.capturedBlockStates.values()); // Folia - region threading @@ -11385,7 +11385,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 StructureGrowEvent structureEvent = null; if (treeType != null) { structureEvent = new StructureGrowEvent(location, treeType, false, null, blocks); -@@ -883,7 +884,7 @@ public interface DispenseItemBehavior { +@@ -884,7 +885,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D)); @@ -11394,7 +11394,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -940,7 +941,7 @@ public interface DispenseItemBehavior { +@@ -941,7 +942,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -11403,7 +11403,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -989,7 +990,7 @@ public interface DispenseItemBehavior { +@@ -990,7 +991,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -11412,7 +11412,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -1062,7 +1063,7 @@ public interface DispenseItemBehavior { +@@ -1063,7 +1064,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - only single item in event BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -11448,7 +11448,7 @@ index 0159ed9cbc644c39fa79e62327f13375193fdc98..a930c8eb64d6c7044646d6b0156e202e } diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index fa1d325034dafdb9f1da546a6f9c5e88d2b67749..61bcbcacc1718b66f5b93548b1777c536cf3916b 100644 +index f9e10bf048929886db3c414038d2c7e9f84226a6..7861c07a9ade391002f08da860e396fcd832b0fe 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java @@ -75,7 +75,7 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -11510,7 +11510,7 @@ index fa1d325034dafdb9f1da546a6f9c5e88d2b67749..61bcbcacc1718b66f5b93548b1777c53 } public void setProtocol(ConnectionProtocol state) { -@@ -375,13 +402,6 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -378,13 +405,6 @@ public class Connection extends SimpleChannelInboundHandler> { return; // Do nothing } packet.onPacketDispatch(getPlayer()); @@ -11524,7 +11524,7 @@ index fa1d325034dafdb9f1da546a6f9c5e88d2b67749..61bcbcacc1718b66f5b93548b1777c53 // write the packets to the queue, then flush - antixray hooks there already java.util.List extraPackets = InnerUtil.buildExtraPackets(packet); boolean hasExtraPackets = extraPackets != null && !extraPackets.isEmpty(); -@@ -503,66 +523,58 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -506,66 +526,58 @@ public class Connection extends SimpleChannelInboundHandler> { // Paper start - rewrite this to be safer if ran off main thread private boolean flushQueue() { // void -> boolean @@ -11630,7 +11630,7 @@ index fa1d325034dafdb9f1da546a6f9c5e88d2b67749..61bcbcacc1718b66f5b93548b1777c53 } // Paper end -@@ -571,21 +583,41 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -574,21 +586,41 @@ public class Connection extends SimpleChannelInboundHandler> { private static int currTick; // Paper public void tick() { this.flushQueue(); @@ -11680,7 +11680,7 @@ index fa1d325034dafdb9f1da546a6f9c5e88d2b67749..61bcbcacc1718b66f5b93548b1777c53 // Paper start - detailed watchdog information net.minecraft.network.protocol.PacketUtils.packetProcessing.push(this.packetListener); try { // Paper end - detailed watchdog information -@@ -625,13 +657,21 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -628,13 +660,21 @@ public class Connection extends SimpleChannelInboundHandler> { // Paper start public void clearPacketQueue() { net.minecraft.server.level.ServerPlayer player = getPlayer(); @@ -11705,7 +11705,7 @@ index fa1d325034dafdb9f1da546a6f9c5e88d2b67749..61bcbcacc1718b66f5b93548b1777c53 } // Paper end public void disconnect(Component disconnectReason) { -@@ -643,6 +683,7 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -646,6 +686,7 @@ public class Connection extends SimpleChannelInboundHandler> { this.channel.close(); // We can't wait as this may be called from an event loop. this.disconnectedReason = disconnectReason; } @@ -11713,7 +11713,7 @@ index fa1d325034dafdb9f1da546a6f9c5e88d2b67749..61bcbcacc1718b66f5b93548b1777c53 } -@@ -802,13 +843,27 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -805,13 +846,27 @@ public class Connection extends SimpleChannelInboundHandler> { final net.minecraft.server.network.ServerGamePacketListenerImpl playerConnection = (net.minecraft.server.network.ServerGamePacketListenerImpl) packetListener; new com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent(playerConnection.player.getUUID(), playerConnection.player.getScoreboardName(), ((java.net.InetSocketAddress)address).getAddress(), false).callEvent(); @@ -13543,21 +13543,20 @@ index ad435815e56ca5a8d5ea6046ee4a3ed4d3673a48..98f314064987e3c0b87e415459f6c263 public interface Filter { diff --git a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java -index b0ed00b95b273f0916cbade0e3bac47aa464d3fd..ebabc7919562acc1e43014aa702e65765567175f 100644 +index aa701e68ed81562861eba559e61e522b934d5851..5a40cbe859ddd4f1f875752a0888ccdf7ce36953 100644 --- a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java +++ b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java -@@ -35,7 +35,12 @@ public class SetSpawnCommand { - final Collection actualTargets = new java.util.ArrayList<>(); // Paper - for(ServerPlayer serverPlayer : targets) { +@@ -43,7 +43,11 @@ public class SetSpawnCommand { + ServerPlayer entityplayer = (ServerPlayer) iterator.next(); + // Paper start - PlayerSetSpawnEvent -- if (serverPlayer.setRespawnPosition(resourceKey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND)) { +- if (entityplayer.setRespawnPosition(resourcekey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND)) { + // Folia start - region threading -+ serverPlayer.getBukkitEntity().taskScheduler.schedule((ServerPlayer player) -> { -+ player.setRespawnPosition(resourceKey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND); ++ entityplayer.getBukkitEntity().taskScheduler.schedule((ServerPlayer player) -> { ++ player.setRespawnPosition(resourcekey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND); + }, null, 1L); -+ // Folia end - region threading -+ if (true) { // Folia - region threading - actualTargets.add(serverPlayer); ++ if (true) { // Folia end - region threading + actualTargets.add(entityplayer); } // Paper end diff --git a/src/main/java/net/minecraft/server/commands/SummonCommand.java b/src/main/java/net/minecraft/server/commands/SummonCommand.java @@ -14858,7 +14857,7 @@ index 5c7b8041e96ede9e662dfdb5285539bf51304650..e664c568aba954e04878c06f3671ae74 } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963ee2c64fb 100644 +index 7b7e2edbcb6c8eb45029e6cbf4fc9d2e9052b668..6db245339eaa2c72253231d1e71c363d916c30b5 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -190,35 +190,34 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -15630,7 +15629,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 return true; } // Paper end -@@ -1687,7 +1785,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1692,7 +1790,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { @@ -15639,7 +15638,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 String s = "recursive call to sendBlockUpdated"; Util.logAndPauseIfInIde("recursive call to sendBlockUpdated", new IllegalStateException("recursive call to sendBlockUpdated")); -@@ -1700,7 +1798,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1705,7 +1803,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (Shapes.joinIsNotEmpty(voxelshape, voxelshape1, BooleanOp.NOT_SAME)) { List list = new ObjectArrayList(); @@ -15648,7 +15647,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 while (iterator.hasNext()) { // CraftBukkit start - fix SPIGOT-6362 -@@ -1723,7 +1821,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1728,7 +1826,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } try { @@ -15657,7 +15656,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 iterator = list.iterator(); while (iterator.hasNext()) { -@@ -1732,7 +1830,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1737,7 +1835,7 @@ public class ServerLevel extends Level implements WorldGenLevel { navigationabstract1.recomputePath(); } } finally { @@ -15666,7 +15665,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } } -@@ -1741,23 +1839,23 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1746,23 +1844,23 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void updateNeighborsAt(BlockPos pos, Block sourceBlock) { @@ -15695,7 +15694,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } @Override -@@ -1788,7 +1886,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1793,7 +1891,7 @@ public class ServerLevel extends Level implements WorldGenLevel { explosion.clearToBlow(); } @@ -15704,7 +15703,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 while (iterator.hasNext()) { ServerPlayer entityplayer = (ServerPlayer) iterator.next(); -@@ -1803,25 +1901,28 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1808,25 +1906,28 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void blockEvent(BlockPos pos, Block block, int type, int data) { @@ -15739,7 +15738,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } private boolean doBlockEvent(BlockEventData event) { -@@ -1832,12 +1933,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1837,12 +1938,12 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public LevelTicks getBlockTicks() { @@ -15754,7 +15753,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } @Nonnull -@@ -1861,7 +1962,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1866,7 +1967,7 @@ public class ServerLevel extends Level implements WorldGenLevel { 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) { // Paper start - Particle API Expansion @@ -15763,7 +15762,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } public int sendParticles(List receivers, ServerPlayer sender, T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, boolean force) { // Paper end -@@ -1914,7 +2015,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1919,7 +2020,14 @@ public class ServerLevel extends Level implements WorldGenLevel { public Entity getEntityOrPart(int id) { Entity entity = (Entity) this.getEntities().get(id); @@ -15779,7 +15778,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } @Nullable -@@ -1922,6 +2030,61 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1927,6 +2035,61 @@ public class ServerLevel extends Level implements WorldGenLevel { return (Entity) this.getEntities().get(uuid); } @@ -15841,7 +15840,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 @Nullable public BlockPos findNearestMapStructure(TagKey structureTag, BlockPos pos, int radius, boolean skipReferencedStructures) { if (!this.serverLevelData.worldGenOptions().generateStructures()) { // CraftBukkit -@@ -2074,6 +2237,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2079,6 +2242,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } public boolean setChunkForced(int x, int z, boolean forced) { @@ -15849,7 +15848,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 ForcedChunksSavedData forcedchunk = (ForcedChunksSavedData) this.getDataStorage().computeIfAbsent(ForcedChunksSavedData::load, ForcedChunksSavedData::new, "chunks"); ChunkPos chunkcoordintpair = new ChunkPos(x, z); long k = chunkcoordintpair.toLong(); -@@ -2082,7 +2246,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2087,7 +2251,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (forced) { flag1 = forcedchunk.getChunks().add(k); if (flag1) { @@ -15858,7 +15857,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } } else { flag1 = forcedchunk.getChunks().remove(k); -@@ -2110,13 +2274,18 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2115,13 +2279,18 @@ public class ServerLevel extends Level implements WorldGenLevel { BlockPos blockposition1 = pos.immutable(); optional.ifPresent((holder) -> { @@ -15880,7 +15879,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 // Paper start if (optional.isEmpty() && this.getPoiManager().exists(blockposition1, poiType -> true)) { this.getPoiManager().remove(blockposition1); -@@ -2124,7 +2293,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2129,7 +2298,12 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper end this.getPoiManager().add(blockposition1, holder); DebugPackets.sendPoiAddedPacket(this, blockposition1); @@ -15894,7 +15893,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 }); } } -@@ -2171,7 +2345,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2176,7 +2350,7 @@ public class ServerLevel extends Level implements WorldGenLevel { BufferedWriter bufferedwriter = Files.newBufferedWriter(path.resolve("stats.txt")); try { @@ -15903,7 +15902,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 NaturalSpawner.SpawnState spawnercreature_d = this.getChunkSource().getLastSpawnState(); if (spawnercreature_d != null) { -@@ -2185,7 +2359,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2190,7 +2364,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } bufferedwriter.write(String.format(Locale.ROOT, "entities: %s\n", this.entityLookup.getDebugInfo())); // Paper - rewrite chunk system @@ -15912,7 +15911,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 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"); -@@ -2331,7 +2505,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2336,7 +2510,7 @@ public class ServerLevel extends Level implements WorldGenLevel { private void dumpBlockEntityTickers(Writer writer) throws IOException { CsvOutput csvwriter = CsvOutput.builder().addColumn("x").addColumn("y").addColumn("z").addColumn("type").build(writer); @@ -15921,7 +15920,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 while (iterator.hasNext()) { TickingBlockEntity tickingblockentity = (TickingBlockEntity) iterator.next(); -@@ -2344,7 +2518,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2349,7 +2523,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @VisibleForTesting public void clearBlockEvents(BoundingBox box) { @@ -15930,7 +15929,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 return box.isInside(blockactiondata.pos()); }); } -@@ -2353,7 +2527,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2358,7 +2532,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public void blockUpdated(BlockPos pos, Block block) { if (!this.isDebug()) { // CraftBukkit start @@ -15939,7 +15938,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 return; } // CraftBukkit end -@@ -2396,9 +2570,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2401,9 +2575,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @VisibleForTesting public String getWatchdogStats() { @@ -15950,7 +15949,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } private static String getTypeCount(Iterable items, Function classifier) { -@@ -2431,6 +2603,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2436,6 +2608,12 @@ public class ServerLevel extends Level implements WorldGenLevel { public static void makeObsidianPlatform(ServerLevel worldserver, Entity entity) { // CraftBukkit end BlockPos blockposition = ServerLevel.END_SPAWN_POINT; @@ -15963,7 +15962,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 int i = blockposition.getX(); int j = blockposition.getY() - 2; int k = blockposition.getZ(); -@@ -2443,11 +2621,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2448,11 +2626,7 @@ public class ServerLevel extends Level implements WorldGenLevel { BlockPos.betweenClosed(i - 2, j, k - 2, i + 2, j, k + 2).forEach((blockposition1) -> { blockList.setBlock(blockposition1, Blocks.OBSIDIAN.defaultBlockState(), 3); }); @@ -15976,7 +15975,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 blockList.updateList(); } // CraftBukkit end -@@ -2468,13 +2642,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2473,13 +2647,14 @@ public class ServerLevel extends Level implements WorldGenLevel { } public void startTickingChunk(LevelChunk chunk) { @@ -15995,7 +15994,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } @Override -@@ -2496,7 +2671,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2501,7 +2676,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper end - rewrite chunk system } @@ -16004,7 +16003,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 // Paper start - optimize is ticking ready type functions io.papermc.paper.chunk.system.scheduling.NewChunkHolder chunkHolder = this.chunkTaskScheduler.chunkHolderManager.getChunkHolder(chunkPos); // isTicking implies the chunk is loaded, and the chunk is loaded now implies the entities are loaded -@@ -2544,16 +2719,16 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2549,16 +2724,16 @@ public class ServerLevel extends Level implements WorldGenLevel { public void onCreated(Entity entity) {} public void onDestroyed(Entity entity) { @@ -16013,7 +16012,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } public void onTickingStart(Entity entity) { - if (entity instanceof net.minecraft.world.entity.Marker) return; // Paper - Don't tick markers + if (entity instanceof net.minecraft.world.entity.Marker && !paperConfig().entities.markers.tick) return; // Paper - Configurable marker ticking - ServerLevel.this.entityTickList.add(entity); + ServerLevel.this.getCurrentWorldData().addEntityTickingEntity(entity); // Folia - region threading } @@ -16024,7 +16023,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 // Paper start - Reset pearls when they stop being ticked if (paperConfig().fixes.disableUnloadedChunkEnderpearlExploit && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) { pearl.cachedOwner = null; -@@ -2581,7 +2756,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2586,7 +2761,7 @@ public class ServerLevel extends Level implements WorldGenLevel { Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -16033,7 +16032,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } if (entity instanceof EnderDragon) { -@@ -2592,7 +2767,9 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2597,7 +2772,9 @@ public class ServerLevel extends Level implements WorldGenLevel { for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -16043,7 +16042,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } } -@@ -2618,11 +2795,18 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2623,11 +2800,18 @@ public class ServerLevel extends Level implements WorldGenLevel { { com.google.common.collect.Streams.stream( ServerLevel.this.getServer().getAllLevels() ).map( ServerLevel::getDataStorage ).forEach( (worldData) -> { @@ -16063,7 +16062,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 map.carriedByPlayers.remove( (Player) entity ); for ( Iterator iter = (Iterator) map.carriedBy.iterator(); iter.hasNext(); ) { -@@ -2632,6 +2816,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2637,6 +2821,7 @@ public class ServerLevel extends Level implements WorldGenLevel { iter.remove(); } } @@ -16071,7 +16070,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } } } ); -@@ -2666,7 +2851,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2671,7 +2856,7 @@ public class ServerLevel extends Level implements WorldGenLevel { Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -16080,7 +16079,7 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 } if (entity instanceof EnderDragon) { -@@ -2677,13 +2862,16 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2682,13 +2867,16 @@ public class ServerLevel extends Level implements WorldGenLevel { for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -16098,10 +16097,10 @@ index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..acc8af33ad8534d812908b0feb9a1963 for (ServerPlayer player : ServerLevel.this.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 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98fca86e92 100644 +index 37dfb5f2e56d8d7bf114dac6be82ccf0fbfc8a09..c4970eefb48baf24cc51ba3cb27997984be872db 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -188,7 +188,7 @@ import org.bukkit.inventory.MainHand; +@@ -190,7 +190,7 @@ import org.bukkit.inventory.MainHand; public class ServerPlayer extends Player { private static final Logger LOGGER = LogUtils.getLogger(); @@ -16110,7 +16109,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32; private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10; public ServerGamePacketListenerImpl connection; -@@ -249,11 +249,7 @@ public class ServerPlayer extends Player { +@@ -251,11 +251,7 @@ public class ServerPlayer extends Player { public boolean queueHealthUpdatePacket = false; public net.minecraft.network.protocol.game.ClientboundSetHealthPacket queuedHealthUpdatePacket; // Paper end @@ -16123,7 +16122,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 // CraftBukkit start public String displayName; -@@ -415,7 +411,7 @@ public class ServerPlayer extends Player { +@@ -417,7 +413,7 @@ public class ServerPlayer extends Player { this.adventure$displayName = net.kyori.adventure.text.Component.text(this.getScoreboardName()); // Paper this.bukkitPickUpLoot = true; this.maxHealthCache = this.getMaxHealth(); @@ -16132,7 +16131,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 } // Yes, this doesn't match Vanilla, but it's the best we can do for now. -@@ -457,11 +453,11 @@ public class ServerPlayer extends Player { +@@ -459,11 +455,11 @@ public class ServerPlayer extends Player { } // CraftBukkit end @@ -16147,7 +16146,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 int j = Mth.floor(world.getWorldBorder().getDistanceToBorder((double) blockposition.getX(), (double) blockposition.getZ())); if (j < i) { -@@ -475,33 +471,76 @@ public class ServerPlayer extends Player { +@@ -477,33 +473,76 @@ public class ServerPlayer extends Player { long k = (long) (i * 2 + 1); long l = k * k; int i1 = l > 2147483647L ? Integer.MAX_VALUE : (int) l; @@ -16243,7 +16242,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 return horizontalSpawnArea <= 16 ? horizontalSpawnArea - 1 : 17; } -@@ -1160,6 +1199,343 @@ public class ServerPlayer extends Player { +@@ -1162,6 +1201,343 @@ public class ServerPlayer extends Player { } } @@ -16587,7 +16586,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 @Nullable @Override public Entity changeDimension(ServerLevel destination) { -@@ -1169,6 +1545,11 @@ public class ServerPlayer extends Player { +@@ -1171,6 +1547,11 @@ public class ServerPlayer extends Player { @Nullable public Entity changeDimension(ServerLevel worldserver, PlayerTeleportEvent.TeleportCause cause) { @@ -16599,7 +16598,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 // CraftBukkit end if (this.isSleeping()) return this; // CraftBukkit - SPIGOT-3154 // this.isChangingDimension = true; // CraftBukkit - Moved down and into PlayerList#changeDimension -@@ -2109,6 +2490,12 @@ public class ServerPlayer extends Player { +@@ -2111,6 +2492,12 @@ public class ServerPlayer extends Player { public void setCamera(@Nullable Entity entity) { Entity entity1 = this.getCamera(); @@ -16612,7 +16611,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 this.camera = (Entity) (entity == null ? this : entity); if (entity1 != this.camera) { // Paper start - Add PlayerStartSpectatingEntityEvent and PlayerStopSpectatingEntity Event -@@ -2291,7 +2678,7 @@ public class ServerPlayer extends Player { +@@ -2304,7 +2691,7 @@ public class ServerPlayer extends Player { } public void untrackChunk(ChunkPos chunkPos) { @@ -16621,7 +16620,7 @@ index 4231c3fe14a621d237bdc3d56c593f0adc0a7bc6..7ed0787319341573416d1152e54a6b98 this.connection.send(new ClientboundForgetLevelChunkPacket(chunkPos.x, chunkPos.z)); // Paper start if(io.papermc.paper.event.packet.PlayerChunkUnloadEvent.getHandlerList().getRegisteredListeners().length > 0){ -@@ -2570,7 +2957,7 @@ public class ServerPlayer extends Player { +@@ -2583,7 +2970,7 @@ public class ServerPlayer extends Player { this.experienceLevel = this.newLevel; this.totalExperience = this.newTotalExp; this.experienceProgress = 0; @@ -16835,10 +16834,10 @@ index 44d99e89226adb6234b9405f25ac9dab9bd84297..072634e26d32ca0b3438a5d3a03be367 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 d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf312de6277 100644 +index aa287d7f37f38d938d195114408cb6dbda59063d..e1e5573b31ca071eac727383b21a085aead4d3eb 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -322,10 +322,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -325,10 +325,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private final org.bukkit.craftbukkit.CraftServer cserver; public boolean processedDisconnect; @@ -16852,7 +16851,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 private int dropCount = 0; // Get position of last block hit for BlockDamageLevel.STOPPED -@@ -342,8 +342,40 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -345,8 +345,40 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic } // CraftBukkit end @@ -16893,7 +16892,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 if (this.ackBlockChangesUpTo > -1) { this.send(new ClientboundBlockChangedAckPacket(this.ackBlockChangesUpTo)); this.ackBlockChangesUpTo = -1; -@@ -395,22 +427,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -398,22 +430,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.server.getProfiler().push("keepAlive"); // Paper Start - give clients a longer time to respond to pings as per pre 1.12.2 timings // This should effectively place the keepalive handling back to "as it was" before 1.12.2 @@ -16917,7 +16916,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 // Paper end this.server.getProfiler().pop(); -@@ -443,6 +460,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -453,6 +470,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); this.lastGoodZ = this.player.getZ(); @@ -16937,7 +16936,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } @Override -@@ -479,24 +509,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -489,24 +519,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (this.processedDisconnect) { return; } @@ -16964,7 +16963,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return; } -@@ -527,7 +541,6 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -537,7 +551,6 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic Objects.requireNonNull(this.connection); // CraftBukkit - Don't wait @@ -16972,7 +16971,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } private CompletableFuture filterTextPacket(T text, BiFunction> filterer) { -@@ -610,9 +623,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -620,9 +633,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic // Paper end - fix large move vectors killing the server // CraftBukkit start - handle custom speeds and skipped ticks @@ -16985,7 +16984,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 ++this.receivedMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount; -@@ -750,7 +764,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -760,7 +774,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic // 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()) { @@ -16994,7 +16993,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return; } -@@ -866,13 +880,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -876,13 +890,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); // Paper - run this async // CraftBukkit start if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper start - split and make configurable @@ -17010,7 +17009,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return; } // Paper end -@@ -897,7 +911,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -907,7 +921,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (!event.isHandled()) { if (!event.isCancelled()) { @@ -17019,7 +17018,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 ParseResults parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack()); this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { -@@ -908,7 +922,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -918,7 +932,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions())); // Paper end - Brigadier API }); @@ -17028,7 +17027,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } } else if (!completions.isEmpty()) { final com.mojang.brigadier.suggestion.SuggestionsBuilder builder0 = new com.mojang.brigadier.suggestion.SuggestionsBuilder(command, stringreader.getTotalLength()); -@@ -1217,7 +1231,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1227,7 +1241,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic int byteLength = testString.getBytes(java.nio.charset.StandardCharsets.UTF_8).length; if (byteLength > 256 * 4) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send a book with with a page too large!"); @@ -17037,7 +17036,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return; } byteTotal += byteLength; -@@ -1240,17 +1254,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1250,17 +1264,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); @@ -17059,7 +17058,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 // CraftBukkit end int i = packet.getSlot(); -@@ -1270,7 +1284,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1280,7 +1294,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.updateBookContents(list1, i); }; @@ -17080,7 +17079,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } } -@@ -1437,9 +1463,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1447,9 +1473,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic int i = this.receivedMovePacketCount - this.knownMovePacketCount; // CraftBukkit start - handle custom speeds and skipped ticks @@ -17093,7 +17092,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 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); -@@ -1604,7 +1631,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1614,7 +1641,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic // 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()) { @@ -17102,7 +17101,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return; } -@@ -1819,9 +1846,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1829,9 +1856,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic 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. @@ -17114,7 +17113,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } else { // Else we increment the drop count and check the amount. this.dropCount++; -@@ -1849,7 +1876,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1859,7 +1886,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic case ABORT_DESTROY_BLOCK: case STOP_DESTROY_BLOCK: // Paper start - Don't allow digging in unloaded chunks @@ -17123,7 +17122,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 this.player.connection.ackBlockChangesUpTo(packet.getSequence()); return; } -@@ -1933,7 +1960,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1943,7 +1970,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic BlockPos blockposition = movingobjectpositionblock.getBlockPos(); Vec3 vec3d1 = Vec3.atCenterOf(blockposition); @@ -17132,7 +17131,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 Vec3 vec3d2 = vec3d.subtract(vec3d1); double d0 = 1.0000001D; -@@ -2046,7 +2073,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2056,7 +2083,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic Entity entity = packet.getEntity(worldserver); if (entity != null) { @@ -17141,7 +17140,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return; } } -@@ -2109,6 +2136,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2119,6 +2146,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic 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 @@ -17150,7 +17149,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 if ((quitMessage != null) && !quitMessage.equals(net.kyori.adventure.text.Component.empty())) { this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(quitMessage), false); // Paper end -@@ -2194,9 +2223,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2204,9 +2233,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic } // CraftBukkit end if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.message())) { @@ -17162,7 +17161,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } else { Optional optional = this.tryHandleChat(packet.message(), packet.timeStamp(), packet.lastSeenMessages()); -@@ -2230,17 +2259,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2240,23 +2269,22 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleChatCommand(ServerboundChatCommandPacket packet) { if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.command())) { @@ -17177,6 +17176,12 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 if (optional.isPresent()) { - this.server.submit(() -> { + this.player.getBukkitEntity().taskScheduler.schedule((ServerPlayer player) -> { // Folia - region threading + // CraftBukkit start - SPIGOT-7346: Prevent disconnected players from executing commands + if (this.player.hasDisconnected()) { + return; + } + // CraftBukkit end +- this.performChatCommand(packet, (LastSeenMessages) optional.get()); this.detectRateSpam("/" + packet.command()); // Spigot - }); @@ -17184,7 +17189,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } } -@@ -2314,9 +2343,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2330,9 +2358,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private Optional tryHandleChat(String message, Instant timestamp, LastSeenMessages.Update acknowledgment) { if (!this.updateChatOrder(timestamp)) { ServerGamePacketListenerImpl.LOGGER.warn("{} sent out-of-order chat: '{}': {} > {}", this.player.getName().getString(), message, this.lastChatTimeStamp.get().getEpochSecond(), timestamp.getEpochSecond()); // Paper @@ -17196,7 +17201,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return Optional.empty(); } else { Optional optional = this.unpackAndApplyLastSeen(acknowledgment); -@@ -2391,7 +2420,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2407,7 +2435,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic String originalFormat = event.getFormat(), originalMessage = event.getMessage(); this.cserver.getPluginManager().callEvent(event); @@ -17205,7 +17210,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 // Evil plugins still listening to deprecated event final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); queueEvent.setCancelled(event.isCancelled()); -@@ -2469,6 +2498,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2485,6 +2513,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic public void handleCommand(String s) { // Paper - private -> public // Paper Start if (!org.spigotmc.AsyncCatcher.shuttingDown && !org.bukkit.Bukkit.isPrimaryThread()) { @@ -17213,7 +17218,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 LOGGER.error("Command Dispatched Async: " + s); LOGGER.error("Please notify author of plugin causing this execution to fix this bug! see: http://bit.ly/1oSiM6C", new Throwable()); Waitable wait = new Waitable<>() { -@@ -2529,6 +2559,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2545,6 +2574,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (s.isEmpty()) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send an empty message"); } else if (this.getCraftPlayer().isConversing()) { @@ -17221,7 +17226,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 final String conversationInput = s; this.server.processQueue.add(new Runnable() { @Override -@@ -2770,7 +2801,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2786,7 +2816,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.player.resetLastActionTime(); this.player.setShiftKeyDown(packet.isUsingSecondaryAction()); @@ -17230,7 +17235,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 if (!worldserver.getWorldBorder().isWithinBounds(entity.blockPosition())) { return; } -@@ -2910,6 +2941,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2926,6 +2956,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic switch (packetplayinclientcommand_enumclientcommand) { case PERFORM_RESPAWN: if (this.player.wonGame) { @@ -17241,9 +17246,9 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 + } + // Folia end - region threading this.player.wonGame = false; - this.player = this.server.getPlayerList().respawn(this.player, this.server.getLevel(this.player.getRespawnDimension()), true, null, true, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag.END_PORTAL); // Paper - add isEndCreditsRespawn argument + this.player = this.server.getPlayerList().respawn(this.player, this.server.getLevel(this.player.getRespawnDimension()), true, null, true, RespawnReason.END_PORTAL, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag.END_PORTAL); // Paper - add isEndCreditsRespawn argument CriteriaTriggers.CHANGED_DIMENSION.trigger(this.player, Level.END, Level.OVERWORLD); -@@ -2918,6 +2955,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2934,6 +2970,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic return; } @@ -17259,10 +17264,10 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 + } + // Folia end - region threading + - this.player = this.server.getPlayerList().respawn(this.player, false); + this.player = this.server.getPlayerList().respawn(this.player, false, RespawnReason.DEATH); if (this.server.isHardcore()) { this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper -@@ -3270,7 +3319,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3286,7 +3334,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic // Paper start if (!org.bukkit.Bukkit.isPrimaryThread()) { if (recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) { @@ -17271,7 +17276,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 return; } } -@@ -3412,7 +3461,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3428,7 +3476,18 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.filterTextPacket(list).thenAcceptAsync((list1) -> { this.updateSignText(packet, list1); @@ -17291,7 +17296,7 @@ index d587b2c4e39bce7e098aa9fab361230f72770658..870a4a6c2a1fa0a3ae438c5ae1360cf3 } private void updateSignText(ServerboundSignUpdatePacket packet, List signText) { -@@ -3482,9 +3542,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3498,9 +3557,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.keepAlivePending = false; } else if (!this.isSingleplayerOwner()) { // Paper start - This needs to be handled on the main thread for plugins @@ -17512,10 +17517,10 @@ index 7edd4b88eb0476f0630630bc4681e859bd145b2b..f3586a5c5b5d4cae817aa7c15fc0c2fc 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 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a937acd91c 100644 +index 7679fa8c905e6cee1906814a82f8ab4ab925b0fc..7d99233f4b36d699aae81be554e78313909c9a7d 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -136,10 +136,10 @@ public abstract class PlayerList { +@@ -139,10 +139,10 @@ public abstract class PlayerList { public static final Component CHAT_FILTERED_FULL = Component.translatable("chat.filtered_full"); private static final Logger LOGGER = LogUtils.getLogger(); private static final int SEND_PLAYER_INFO_INTERVAL = 600; @@ -17528,7 +17533,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 private final UserBanList bans; private final IpBanList ipBans; private final ServerOpList ops; -@@ -161,9 +161,56 @@ public abstract class PlayerList { +@@ -164,9 +164,56 @@ public abstract class PlayerList { // CraftBukkit start private CraftServer cserver; @@ -17586,7 +17591,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 public PlayerList(MinecraftServer server, LayeredRegistryAccess registryManager, PlayerDataStorage saveHandler, int maxPlayers) { this.cserver = server.server = new CraftServer((DedicatedServer) server, this); server.console = new com.destroystokyo.paper.console.TerminalConsoleCommandSender(); // Paper -@@ -185,7 +232,7 @@ public abstract class PlayerList { +@@ -188,7 +235,7 @@ public abstract class PlayerList { } abstract public void loadAndSaveFiles(); // Paper - moved from DedicatedPlayerList constructor @@ -17595,14 +17600,15 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper GameProfile gameprofile = player.getGameProfile(); -@@ -235,8 +282,28 @@ public abstract class PlayerList { - worldserver1 = worldserver; +@@ -241,9 +288,30 @@ public abstract class PlayerList { + // Paper start + if (nbttagcompound == null) { + player.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; // set Player SpawnReason to DEFAULT on first login +- player.fudgeSpawnLocation(worldserver1); // only move to spawn on first login, otherwise, stay where you are.... ++ ServerPlayer.fudgeSpawnLocation(worldserver1, player, toComplete); // only move to spawn on first login, otherwise, stay where you are.... // Folia - region threading } - -- if (nbttagcompound == null) player.fudgeSpawnLocation(worldserver1); // Paper - only move to spawn on first login, otherwise, stay where you are.... -- + // Paper end + // Folia start - region threading - rewrite login process -+ if (nbttagcompound == null) ServerPlayer.fudgeSpawnLocation(worldserver1, player, toComplete); // Folia - only move to spawn on first login, otherwise, stay where you are.... + if (nbttagcompound != null) { + worldserver1.loadChunksForMoveAsync( + player.getBoundingBox(), @@ -17626,7 +17632,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 player.setLevel(worldserver1); String s1 = "local"; -@@ -247,7 +314,7 @@ public abstract class PlayerList { +@@ -254,7 +322,7 @@ public abstract class PlayerList { // Spigot start - spawn location event Player spawnPlayer = player.getBukkitEntity(); org.spigotmc.event.player.PlayerSpawnLocationEvent ev = new com.destroystokyo.paper.event.player.PlayerInitialSpawnEvent(spawnPlayer, spawnPlayer.getLocation()); // Paper use our duplicate event @@ -17635,7 +17641,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 Location loc = ev.getSpawnLocation(); worldserver1 = ((CraftWorld) loc.getWorld()).getHandle(); -@@ -266,6 +333,7 @@ public abstract class PlayerList { +@@ -273,6 +341,7 @@ public abstract class PlayerList { player.loadGameTypes(nbttagcompound); ServerGamePacketListenerImpl playerconnection = new ServerGamePacketListenerImpl(this.server, connection, player); @@ -17643,7 +17649,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 GameRules gamerules = worldserver1.getGameRules(); boolean flag = gamerules.getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN); boolean flag1 = gamerules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); -@@ -283,7 +351,7 @@ public abstract class PlayerList { +@@ -290,7 +359,7 @@ public abstract class PlayerList { this.sendPlayerPermissionLevel(player); player.getStats().markAllDirty(); player.getRecipeBook().sendInitialRecipeBook(player); @@ -17652,7 +17658,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 this.server.invalidateStatus(); MutableComponent ichatmutablecomponent; -@@ -325,7 +393,7 @@ public abstract class PlayerList { +@@ -332,7 +401,7 @@ public abstract class PlayerList { this.cserver.getPluginManager().callEvent(playerJoinEvent); if (!player.connection.isAcceptingMessages()) { @@ -17661,7 +17667,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); -@@ -340,8 +408,7 @@ public abstract class PlayerList { +@@ -347,8 +416,7 @@ public abstract class PlayerList { ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - use single player info update packet @@ -17671,7 +17677,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 if (entityplayer1.getBukkitEntity().canSee(bukkitPlayer)) { entityplayer1.connection.send(packet); -@@ -458,7 +525,7 @@ public abstract class PlayerList { +@@ -465,7 +533,7 @@ public abstract class PlayerList { // Paper start - Add to collideRule team if needed final Scoreboard scoreboard = this.getServer().getLevel(Level.OVERWORLD).getScoreboard(); final PlayerTeam collideRuleTeam = scoreboard.getPlayerTeam(this.collideRuleTeamName); @@ -17680,7 +17686,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } // Paper end -@@ -549,7 +616,7 @@ public abstract class PlayerList { +@@ -556,7 +624,7 @@ public abstract class PlayerList { protected void save(ServerPlayer player) { if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit @@ -17689,7 +17695,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 this.playerIo.save(player); ServerStatsCounter serverstatisticmanager = (ServerStatsCounter) player.getStats(); // CraftBukkit -@@ -589,7 +656,7 @@ public abstract class PlayerList { +@@ -596,7 +664,7 @@ public abstract class PlayerList { // CraftBukkit end // Paper start - Remove from collideRule team if needed @@ -17698,7 +17704,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 final Scoreboard scoreBoard = this.server.getLevel(Level.OVERWORLD).getScoreboard(); final PlayerTeam team = scoreBoard.getPlayersTeam(this.collideRuleTeamName); if (entityplayer.getTeam() == team && team != null) { -@@ -629,6 +696,7 @@ public abstract class PlayerList { +@@ -636,6 +704,7 @@ public abstract class PlayerList { entityplayer.unRide(); worldserver.removePlayerImmediately(entityplayer, Entity.RemovalReason.UNLOADED_WITH_PLAYER); @@ -17706,7 +17712,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 entityplayer.getAdvancements().stopListening(); this.players.remove(entityplayer); this.playersByName.remove(entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot -@@ -647,8 +715,7 @@ public abstract class PlayerList { +@@ -654,8 +723,7 @@ public abstract class PlayerList { // CraftBukkit start // this.broadcastAll(new ClientboundPlayerInfoRemovePacket(List.of(entityplayer.getUUID()))); ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(entityplayer.getUUID())); @@ -17716,7 +17722,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 if (entityplayer2.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { entityplayer2.connection.send(packet); -@@ -673,19 +740,13 @@ public abstract class PlayerList { +@@ -680,19 +748,13 @@ public abstract class PlayerList { ServerPlayer entityplayer; @@ -17738,7 +17744,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } // Instead of kicking then returning, we need to store the kick reason -@@ -704,7 +765,7 @@ public abstract class PlayerList { +@@ -711,7 +773,7 @@ public abstract class PlayerList { ichatmutablecomponent = Component.translatable("multiplayer.disconnect.banned.reason", gameprofilebanentry.getReason()); if (gameprofilebanentry.getExpires() != null) { @@ -17747,7 +17753,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } // return chatmessage; -@@ -717,14 +778,14 @@ public abstract class PlayerList { +@@ -724,14 +786,14 @@ public abstract class PlayerList { ichatmutablecomponent = Component.translatable("multiplayer.disconnect.banned_ip.reason", ipbanentry.getReason()); if (ipbanentry.getExpires() != null) { @@ -17764,9 +17770,9 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 event.disallow(PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure } } -@@ -782,6 +843,11 @@ public abstract class PlayerList { +@@ -789,6 +851,11 @@ public abstract class PlayerList { - public ServerPlayer respawn(ServerPlayer entityplayer, ServerLevel worldserver, boolean flag, Location location, boolean avoidSuffocation, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag...respawnFlags) { + public ServerPlayer respawn(ServerPlayer entityplayer, ServerLevel worldserver, boolean flag, Location location, boolean avoidSuffocation, RespawnReason reason, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag...respawnFlags) { // Paper end + // Folia start - region threading + if (true) { @@ -17776,7 +17782,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 entityplayer.stopRiding(); // CraftBukkit this.players.remove(entityplayer); this.playersByName.remove(entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot -@@ -976,10 +1042,10 @@ public abstract class PlayerList { +@@ -983,10 +1050,10 @@ public abstract class PlayerList { public void tick() { if (++this.sendAllPlayerInfoIn > 600) { // CraftBukkit start @@ -17790,7 +17796,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 @Override public boolean test(ServerPlayer input) { return target.getBukkitEntity().canSee(input.getBukkitEntity()); -@@ -1005,18 +1071,17 @@ public abstract class PlayerList { +@@ -1012,18 +1079,17 @@ public abstract class PlayerList { // CraftBukkit start - add a world/entity limited version public void broadcastAll(Packet packet, net.minecraft.world.entity.player.Player entityhuman) { @@ -17813,7 +17819,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } } -@@ -1060,8 +1125,7 @@ public abstract class PlayerList { +@@ -1067,8 +1133,7 @@ public abstract class PlayerList { if (scoreboardteambase == null) { this.broadcastSystemMessage(message, false); } else { @@ -17823,7 +17829,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 if (entityplayer.getTeam() != scoreboardteambase) { entityplayer.sendSystemMessage(message); -@@ -1072,10 +1136,12 @@ public abstract class PlayerList { +@@ -1079,10 +1144,12 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { @@ -17839,7 +17845,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } return astring; -@@ -1094,7 +1160,9 @@ public abstract class PlayerList { +@@ -1101,7 +1168,9 @@ public abstract class PlayerList { ServerPlayer entityplayer = this.getPlayer(profile.getId()); if (entityplayer != null) { @@ -17849,7 +17855,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } } -@@ -1104,7 +1172,10 @@ public abstract class PlayerList { +@@ -1111,7 +1180,10 @@ public abstract class PlayerList { ServerPlayer entityplayer = this.getPlayer(profile.getId()); if (entityplayer != null) { @@ -17860,7 +17866,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } } -@@ -1165,8 +1236,7 @@ public abstract class PlayerList { +@@ -1172,8 +1244,7 @@ public abstract class PlayerList { } public void broadcast(@Nullable net.minecraft.world.entity.player.Player player, double x, double y, double z, double distance, ResourceKey worldKey, Packet packet) { @@ -17870,7 +17876,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 // CraftBukkit start - Test if player receiving packet can see the source of the packet if (player != null && !entityplayer.getBukkitEntity().canSee(player.getBukkitEntity())) { -@@ -1196,12 +1266,21 @@ public abstract class PlayerList { +@@ -1203,12 +1274,21 @@ public abstract class PlayerList { io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main MinecraftTimings.savePlayers.startTiming(); // Paper int numSaved = 0; @@ -17888,7 +17894,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 + // Folia end - region threading + if (interval == -1 || now - entityplayer.lastSave >= timeInterval) { // Folia - region threading this.save(entityplayer); -- if (interval != -1 && ++numSaved <= io.papermc.paper.configuration.GlobalConfiguration.get().playerAutoSave.maxPerTick()) { break; } +- if (interval != -1 && ++numSaved >= io.papermc.paper.configuration.GlobalConfiguration.get().playerAutoSave.maxPerTick()) { break; } + // Folia start - region threading + if (interval != -1 && max != -1 && ++numSaved >= max) { + break; @@ -17897,7 +17903,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 } // Paper end } -@@ -1318,6 +1397,20 @@ public abstract class PlayerList { +@@ -1325,6 +1405,20 @@ public abstract class PlayerList { } public void removeAll(boolean isRestarting) { @@ -17918,7 +17924,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..c6cfc5853869d0a356947b5cb83157a9 // Paper end // CraftBukkit start - disconnect safely for (ServerPlayer player : this.players) { -@@ -1327,7 +1420,7 @@ public abstract class PlayerList { +@@ -1334,7 +1428,7 @@ public abstract class PlayerList { // CraftBukkit end // Paper start - Remove collideRule team if it exists @@ -18069,10 +18075,10 @@ index 93a1e990b0a6caae4143c2f9d09bfb368fa1d6db..ad3166481dd37f4b5380f8bf28653bb4 itemstack = entityliving2.getMainHandItem(); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c014621569e099cfc 100644 +index 280ee1838106201f5e3ba7753caced6d030f7e55..e8e6743ec078d9dd95d3583ff24cb6791abddf19 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -165,7 +165,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -166,7 +166,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // Paper start public static RandomSource SHARED_RANDOM = new RandomRandomSource(); @@ -18081,7 +18087,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 private boolean locked = false; @Override -@@ -239,17 +239,29 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -240,17 +240,29 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData; // Paper public boolean collisionLoadChunks = false; // Paper @@ -18113,7 +18119,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 @Override public CommandSender getBukkitSender(CommandSourceStack wrapper) { return this.getBukkitEntity(); -@@ -489,28 +501,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -491,28 +503,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.isLegacyTrackingEntity = isLegacyTrackingEntity; } @@ -18143,7 +18149,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 // Paper end - optimise entity tracking // Paper start - make end portalling safe public BlockPos portalBlock; -@@ -542,6 +533,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -544,6 +535,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.teleportTo(worldserver, null); } // Paper end - make end portalling safe @@ -18169,7 +18175,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 public Entity(EntityType type, Level world) { this.id = Entity.ENTITY_COUNTER.incrementAndGet(); -@@ -657,6 +667,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -659,6 +669,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public final void discard() { @@ -18181,7 +18187,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 this.remove(Entity.RemovalReason.DISCARDED); } -@@ -781,6 +796,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -783,6 +798,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // CraftBukkit start public void postTick() { @@ -18194,7 +18200,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 // 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 this.handleNetherPortal(); -@@ -803,7 +824,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -805,7 +826,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.walkDistO = this.walkDist; this.xRotO = this.getXRot(); this.yRotO = this.getYRot(); @@ -18203,7 +18209,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); } -@@ -904,11 +925,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -906,11 +927,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // This will be called every single tick the entity is in lava, so don't throw an event this.setSecondsOnFire(15, false); } @@ -18217,7 +18223,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls } -@@ -1016,8 +1037,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1018,8 +1039,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } else { this.wasOnFire = this.isOnFire(); if (movementType == MoverType.PISTON) { @@ -18228,7 +18234,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 movement = this.limitPistonMovement(movement); if (movement.equals(Vec3.ZERO)) { return; -@@ -3090,6 +3111,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3092,6 +3113,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @Nullable public Team getTeam() { @@ -18240,7 +18246,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 if (!this.level.paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof Player)) { return null; } // Paper return this.level.getScoreboard().getPlayersTeam(this.getScoreboardName()); } -@@ -3205,9 +3231,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3207,9 +3233,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { if (this.fireImmune()) { return; } @@ -18252,7 +18258,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 return; } // CraftBukkit end -@@ -3380,6 +3406,763 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3382,6 +3408,763 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.portalEntrancePos = original.portalEntrancePos; } @@ -19016,7 +19022,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 @Nullable public Entity changeDimension(ServerLevel destination) { // CraftBukkit start -@@ -3388,6 +4171,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3390,6 +4173,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @Nullable public Entity teleportTo(ServerLevel worldserver, PositionImpl location) { @@ -19028,7 +19034,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 // CraftBukkit end // Paper start - fix bad state entities causing dupes if (!isAlive() || !valid) { -@@ -3471,6 +4259,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3473,6 +4261,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } @@ -19041,7 +19047,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 protected void removeAfterChangingDimensions() { this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); } -@@ -3910,17 +4704,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3912,17 +4706,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // Paper start public void startSeenByPlayer(ServerPlayer player) { @@ -19061,7 +19067,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 } // Paper end -@@ -4411,7 +5201,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4413,7 +5203,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } // Paper end - fix MC-4 @@ -19071,7 +19077,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 synchronized (this.posLock) { // Paper this.position = new Vec3(x, y, z); } // Paper -@@ -4432,7 +5223,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4434,7 +5225,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // Paper start - never allow AABB to become desynced from position // hanging has its own special logic @@ -19080,7 +19086,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 this.setBoundingBox(this.makeBoundingBox()); } // Paper end -@@ -4519,6 +5310,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4521,6 +5312,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return this.removalReason != null; } @@ -19093,7 +19099,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 @Nullable public Entity.RemovalReason getRemovalReason() { return this.removalReason; -@@ -4543,7 +5340,23 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4545,7 +5342,23 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { if (reason != RemovalReason.UNLOADED_TO_CHUNK) this.getPassengers().forEach(Entity::stopRiding); // Paper - chunk system - don't adjust passenger state when unloading, it's just not safe (and messes with our logic in entity chunk unload) this.levelCallback.onRemove(reason); @@ -19118,7 +19124,7 @@ index 4705d7066207250c03a5f98eef61554c901f2e35..c659a574195f465ec3316f4c01462156 public void unsetRemoved() { this.removalReason = null; diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index dcfb71b5a53df789e366fea2080921d677549a2e..4f8062432cfe6480664e674fde0255f07b15c73a 100644 +index 95a27d28f73039693ca64601954af62028413634..4f8062432cfe6480664e674fde0255f07b15c73a 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -464,7 +464,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -19163,7 +19169,7 @@ index dcfb71b5a53df789e366fea2080921d677549a2e..4f8062432cfe6480664e674fde0255f0 } public boolean addEffect(MobEffectInstance mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause) { -- org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot +- // org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API + io.papermc.paper.util.TickThread.ensureTickThread(this, "Cannot add effects to entities asynchronously"); // Folia - region threading if (this.isTickingEffects) { this.effectsToProcess.add(new ProcessableEffect(mobeffect, cause)); @@ -19655,7 +19661,7 @@ index 30aec9dff249ae629b22318e52902361a9fa4099..b452b566693558fa714eca2db08ca775 }); diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java -index ce2c3c146ef64400e00084bd2245d2b87a67fbc2..c8d125955754e27da54d95fb5b1cea39ca54b618 100644 +index 536856300da929c101f50da5827677bada5feb50..b18c4f74f82a4953643f7b6bd684246ad28bccf1 100644 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java @@ -293,9 +293,9 @@ public class FallingBlockEntity extends Entity { @@ -20125,10 +20131,10 @@ index fca27f98989bf106060ba08196255fe32f850df5..98c9eda4056093d8d230ac56ac407c39 } } diff --git a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java -index d77410588a1c10d8ac902f21a8bd7e35f74fecd2..675a01ec82b31140594beace0f0b651be096f90e 100644 +index bcb0f3fd09ed064b64dc6495302b40828d906837..a39a35971748b38560cc58b6a0d9fde3b406a913 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java +++ b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java -@@ -98,7 +98,7 @@ public class FishingHook extends Projectile { +@@ -104,7 +104,7 @@ public class FishingHook extends Projectile { public FishingHook(net.minecraft.world.entity.player.Player thrower, Level world, int luckOfTheSeaLevel, int lureLevel) { this(EntityType.FISHING_BOBBER, world, luckOfTheSeaLevel, lureLevel); @@ -20137,7 +20143,7 @@ index d77410588a1c10d8ac902f21a8bd7e35f74fecd2..675a01ec82b31140594beace0f0b651b float f = thrower.getXRot(); float f1 = thrower.getYRot(); float f2 = Mth.cos(-f1 * 0.017453292F - 3.1415927F); -@@ -110,6 +110,7 @@ public class FishingHook extends Projectile { +@@ -116,6 +116,7 @@ public class FishingHook extends Projectile { double d2 = thrower.getZ() - (double) f2 * 0.3D; this.moveTo(d0, d1, d2, f1, f); @@ -20162,12 +20168,12 @@ index c4f4a26e016eea744f587461af80461074d48303..42f6481eb92a3aa91010c235f08ea658 this.preOnHit(movingobjectposition); // CraftBukkit - projectile hit event diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 8b2a3a8482018b7db7de81bc295862f783e17ce5..ad8cff8bc7f12a48e2b5c9bbc30b33676d61853b 100644 +index a211ca048dddc75afce1f83ee1700bad66e457fc..7ef5520ed4f4a133449fe34c297d097a470a766f 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -53,9 +53,20 @@ public abstract class Projectile extends Entity implements TraceableEntity { - +@@ -62,9 +62,20 @@ public abstract class Projectile extends Entity implements TraceableEntity { } + // Paper end + // Folia start - region threading + // In general, this is an entire mess. At the time of writing, there are fifty usages of getOwner. @@ -20184,9 +20190,9 @@ index 8b2a3a8482018b7db7de81bc295862f783e17ce5..ad8cff8bc7f12a48e2b5c9bbc30b3367 + public Entity getOwnerRaw() { // Folia - region threading + io.papermc.paper.util.TickThread.ensureTickThread(this, "Cannot update owner state asynchronously"); // Folia - region threading if (this.cachedOwner != null && !this.cachedOwner.isRemoved()) { + this.refreshProjectileSource(false); // Paper return this.cachedOwner; - } else if (this.ownerUUID != null && this.level instanceof ServerLevel) { -@@ -277,6 +288,6 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -288,6 +299,6 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); @@ -20549,10 +20555,10 @@ index d7a0cbde8f8c99276307502674c71463fbe7e89c..2a501b3fa8d69f627b279fd035fd2cb1 } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77ee97d415 100644 +index d81fcbadc5c0b3d4b54dde5d47a0f847d8ec6918..b9f6a441a67acaa4478398219f68446c86781351 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -334,6 +334,7 @@ public final class ItemStack { +@@ -336,6 +336,7 @@ public final class ItemStack { } public InteractionResult useOn(UseOnContext itemactioncontext, InteractionHand enumhand) { // CraftBukkit - add hand @@ -20560,7 +20566,7 @@ index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77 net.minecraft.world.entity.player.Player entityhuman = itemactioncontext.getPlayer(); BlockPos blockposition = itemactioncontext.getClickedPos(); BlockInWorld shapedetectorblock = new BlockInWorld(itemactioncontext.getLevel(), blockposition, false); -@@ -345,12 +346,13 @@ public final class ItemStack { +@@ -347,12 +348,13 @@ public final class ItemStack { CompoundTag oldData = this.getTagClone(); int oldCount = this.getCount(); ServerLevel world = (ServerLevel) itemactioncontext.getLevel(); @@ -20576,7 +20582,7 @@ index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77 } } Item item = this.getItem(); -@@ -359,14 +361,14 @@ public final class ItemStack { +@@ -361,14 +363,14 @@ public final class ItemStack { int newCount = this.getCount(); this.setCount(oldCount); this.setTagClone(oldData); @@ -20586,7 +20592,7 @@ index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77 + worldData.captureBlockStates = false; // Folia - region threading + if (enuminteractionresult.consumesAction() && worldData.captureTreeGeneration && worldData.capturedBlockStates.size() > 0) { // Folia - region threading + world.getCurrentWorldData().captureTreeGeneration = false; // Folia - region threading - Location location = new Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); + Location location = CraftLocation.toBukkit(blockposition, world.getWorld()); - TreeType treeType = SaplingBlock.treeType; - SaplingBlock.treeType = null; - List blocks = new java.util.ArrayList<>(world.capturedBlockStates.values()); @@ -20598,7 +20604,7 @@ index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77 StructureGrowEvent structureEvent = null; if (treeType != null) { boolean isBonemeal = this.getItem() == Items.BONE_MEAL; -@@ -394,12 +396,12 @@ public final class ItemStack { +@@ -396,12 +398,12 @@ public final class ItemStack { SignItem.openSign = null; // SPIGOT-6758 - Reset on early return return enuminteractionresult; } @@ -20614,7 +20620,7 @@ index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77 if (blocks.size() > 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 - don't call event twice for snow buckets -@@ -410,13 +412,13 @@ public final class ItemStack { +@@ -412,13 +414,13 @@ public final class ItemStack { enuminteractionresult = InteractionResult.FAIL; // cancel placement // PAIL: Remove this when MC-99075 fixed placeEvent.getPlayer().updateInventory(); @@ -20631,7 +20637,7 @@ index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77 // Brute force all possible updates BlockPos placedPos = ((CraftBlock) placeEvent.getBlock()).getPosition(); -@@ -431,7 +433,7 @@ public final class ItemStack { +@@ -433,7 +435,7 @@ public final class ItemStack { this.setCount(newCount); } @@ -20640,7 +20646,7 @@ index d690b8d0c1da1f56b226376df8c76c34375e3c73..6e6f73d50725057bc713bc6ae3a31b77 world.setBlockEntity(e.getValue()); } -@@ -505,8 +507,8 @@ public final class ItemStack { +@@ -512,8 +514,8 @@ public final class ItemStack { entityhuman.awardStat(Stats.ITEM_USED.get(item)); } } @@ -20859,7 +20865,7 @@ index 3b959f42d958bf0f426853aee56753d6c455fcdb..b1a6a66ed02706c1adc36dcedfa415f5 return player; } diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 59837144c2c0460aca6e8c349eb3d6528111d1dc..7f32d5d5b709e8bb0395ccbeada2322c6e89cea3 100644 +index 185f7b1d4df59f5db7b85b529a2de6402630bf35..4c75058c400ec8d5824ac53beba5da53c94aee8b 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -246,7 +246,7 @@ public class Explosion { @@ -20880,7 +20886,7 @@ index 59837144c2c0460aca6e8c349eb3d6528111d1dc..7f32d5d5b709e8bb0395ccbeada2322c if (entity.lastDamageCancelled) { // SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Skip entity if damage event was cancelled continue; } -@@ -515,17 +515,10 @@ public class Explosion { +@@ -525,17 +525,10 @@ public class Explosion { } // Paper start - Optimize explosions private float getBlockDensity(Vec3 vec3d, Entity entity) { @@ -21908,10 +21914,10 @@ index da07fce0cf7c9fbdb57d2c59e431b59bf583bf50..16e46bb6205c3f7444e864c553e8072f } } diff --git a/src/main/java/net/minecraft/world/level/block/SaplingBlock.java b/src/main/java/net/minecraft/world/level/block/SaplingBlock.java -index 901978a338f0f1b6f20ffb65aac59704bfa6f36a..4ec92ebdfd803c181cc51a71ba910ed34643a578 100644 +index d5ec1e5909c03a58add7f4597b140f787600c09a..f230d39da84304fa19bd62522b175899ad6955fd 100644 --- a/src/main/java/net/minecraft/world/level/block/SaplingBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SaplingBlock.java -@@ -26,7 +26,7 @@ public class SaplingBlock extends BushBlock implements BonemealableBlock { +@@ -27,7 +27,7 @@ public class SaplingBlock extends BushBlock implements BonemealableBlock { protected static final float AABB_OFFSET = 6.0F; protected static final VoxelShape SHAPE = Block.box(2.0D, 0.0D, 2.0D, 14.0D, 12.0D, 14.0D); private final AbstractTreeGrower treeGrower; @@ -21920,7 +21926,7 @@ index 901978a338f0f1b6f20ffb65aac59704bfa6f36a..4ec92ebdfd803c181cc51a71ba910ed3 protected SaplingBlock(AbstractTreeGrower generator, BlockBehaviour.Properties settings) { super(settings); -@@ -52,18 +52,19 @@ public class SaplingBlock extends BushBlock implements BonemealableBlock { +@@ -53,18 +53,19 @@ public class SaplingBlock extends BushBlock implements BonemealableBlock { world.setBlock(pos, (net.minecraft.world.level.block.state.BlockState) state.cycle(SaplingBlock.STAGE), 4); } else { // CraftBukkit start @@ -21940,7 +21946,7 @@ index 901978a338f0f1b6f20ffb65aac59704bfa6f36a..4ec92ebdfd803c181cc51a71ba910ed3 + if (worldData.capturedBlockStates.size() > 0) { // Folia - region threading + TreeType treeType = SaplingBlock.treeTypeRT.get(); // Folia - region threading + SaplingBlock.treeTypeRT.set(null); // Folia - region threading - Location location = new Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()); + Location location = CraftLocation.toBukkit(pos, world.getWorld()); - java.util.List blocks = new java.util.ArrayList<>(world.capturedBlockStates.values()); - world.capturedBlockStates.clear(); + java.util.List blocks = new java.util.ArrayList<>(worldData.capturedBlockStates.values()); // Folia - region threading @@ -22119,7 +22125,7 @@ index 963a596154091b79ca139af6274aa323518ad1ad..57b11cb78270a8094f772da497ad3264 } diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index cba114f554644a37339c93026630c66c43f524b9..0134370081182260d578ee1d8a16d544c03b6a0d 100644 +index aac5572c1d40a10cd1d17f89c9eb836718837577..e76d1d787a5ad73b44dd5cc5671c0d392be21bb9 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -194,12 +194,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen @@ -22251,7 +22257,7 @@ index 902f2b39104bf059849228829bfe93b6dbc757d4..9a6c51652bd2dbb3d474809372df0303 @Override diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index c73024cc62490c336ffe26313580e88d25ca7078..ce8557aa7b208c2ea85b361b68306fcb5f420369 100644 +index c2bc747e9b9dd02971c13cb88e7aebeca8c0f2aa..b60d74a5e238d800154d53b46ce1ebc9f4f34c0b 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -51,9 +51,12 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { @@ -22677,7 +22683,7 @@ index 42ecfc1237bfc724dc9134a6a8bae3670251449e..2fbfdf1fdba12417e2dbca041b9c7e29 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 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe9337d574 100644 +index 6143607ad1485c552309ac3df37b3ba9adb7c07c..e78bb4416d9fac6465738071b529564a6d47391b 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 { @@ -22694,7 +22700,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe @Override public boolean isRemoved() { return true; -@@ -233,51 +240,15 @@ public class LevelChunk extends ChunkAccess { +@@ -226,51 +233,15 @@ public class LevelChunk extends ChunkAccess { } // Paper end // Paper start - optimise checkDespawn @@ -22751,7 +22757,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe double distance = player.distanceToSqr(sourceX, sourceY, sourceZ); if (distance < closestDistance && predicate.test(player)) { -@@ -285,31 +256,17 @@ public class LevelChunk extends ChunkAccess { +@@ -278,31 +249,17 @@ public class LevelChunk extends ChunkAccess { closestDistance = distance; } } @@ -22788,7 +22794,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe if (range >= 0.0) { double distanceSquared = player.distanceToSqr(sourceX, sourceY, sourceZ); -@@ -322,6 +279,7 @@ public class LevelChunk extends ChunkAccess { +@@ -315,6 +272,7 @@ public class LevelChunk extends ChunkAccess { ret.add(player); } } @@ -22796,7 +22802,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe } // Paper end - optimise checkDespawn -@@ -557,7 +515,7 @@ public class LevelChunk extends ChunkAccess { +@@ -550,7 +508,7 @@ public class LevelChunk extends ChunkAccess { 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. @@ -22805,7 +22811,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe iblockdata.onPlace(this.level, blockposition, iblockdata1, flag); } -@@ -604,7 +562,7 @@ public class LevelChunk extends ChunkAccess { +@@ -597,7 +555,7 @@ public class LevelChunk extends ChunkAccess { @Nullable public BlockEntity getBlockEntity(BlockPos pos, LevelChunk.EntityCreationType creationType) { // CraftBukkit start @@ -22814,7 +22820,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe if (tileentity == null) { tileentity = (BlockEntity) this.blockEntities.get(pos); } -@@ -889,13 +847,13 @@ public class LevelChunk extends ChunkAccess { +@@ -883,13 +841,13 @@ public class LevelChunk extends ChunkAccess { org.bukkit.World world = this.level.getWorld(); if (world != null) { @@ -22829,8 +22835,8 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe + this.level.getCurrentWorldData().populating = false; // Folia - region threading } } - server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(this.bukkitChunk)); -@@ -944,7 +902,7 @@ public class LevelChunk extends ChunkAccess { + server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk)); +@@ -939,7 +897,7 @@ public class LevelChunk extends ChunkAccess { @Override public boolean isUnsaved() { // Paper start - add dirty system to tick lists @@ -22839,7 +22845,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe if (this.blockTicks.isDirty(gameTime) || this.fluidTicks.isDirty(gameTime)) { return true; } -@@ -1225,6 +1183,13 @@ public class LevelChunk extends ChunkAccess { +@@ -1220,6 +1178,13 @@ public class LevelChunk extends ChunkAccess { this.ticker = wrapped; } @@ -22853,7 +22859,7 @@ index 9599af33c683ec47e28b1c8e4dc965d30d9081a7..f4c4951f815062c2791531a703ed8cbe @Override public void tick() { this.ticker.tick(); -@@ -1261,6 +1226,13 @@ public class LevelChunk extends ChunkAccess { +@@ -1256,6 +1221,13 @@ public class LevelChunk extends ChunkAccess { this.ticker = blockentityticker; } @@ -23338,7 +23344,7 @@ index 9b2948b5150c8f039ca667a50765109721b93947..1b76e4edce628f2b25815e28cd4cb750 } } diff --git a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java -index 50348a5eec1e2ffabfc8405d708461376a162913..56e277f328a18e342c1adbe19660a31cbb175ba9 100644 +index 25a64250ce57fe4cd90f8b95d1e003d961662152..6263b8b680b076a79c0bf278c6eb53843984cc76 100644 --- a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java +++ b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java @@ -185,7 +185,7 @@ public class MapItemSavedData extends SavedData { @@ -23677,10 +23683,10 @@ index 1d7c663fa0e550bd0cfb9a4b83ccd7e2968666f0..f3df9c9b6cff85565514f990597f3fe5 LevelChunkTicks levelChunkTicks = this.allContainers.get(l); if (levelChunkTicks == null) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index e0b6c737f9de2b6e692d6813d8dea4c35f038573..27445d7bcfaaa34a60e65e8d339f15367d7b3b6e 100644 +index 91c301275fa7b6a2fc16e3bdbf61b6a46eed6ef4..c43248f5a8e4fe514cfcc1dcf3003baedd950904 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -303,6 +303,82 @@ public final class CraftServer implements Server { +@@ -310,6 +310,82 @@ public final class CraftServer implements Server { CraftItemFactory.instance(); } @@ -23763,7 +23769,7 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..27445d7bcfaaa34a60e65e8d339f1536 public CraftServer(DedicatedServer console, PlayerList playerList) { this.console = console; this.playerList = (DedicatedPlayerList) playerList; -@@ -856,6 +932,9 @@ public final class CraftServer implements Server { +@@ -879,6 +955,9 @@ public final class CraftServer implements Server { // NOTE: Should only be called from DedicatedServer.ah() public boolean dispatchServerCommand(CommandSender sender, ConsoleInput serverCommand) { @@ -23773,7 +23779,7 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..27445d7bcfaaa34a60e65e8d339f1536 if (sender instanceof Conversable) { Conversable conversable = (Conversable) sender; -@@ -875,12 +954,44 @@ public final class CraftServer implements Server { +@@ -898,12 +977,44 @@ public final class CraftServer implements Server { } } @@ -23818,7 +23824,7 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..27445d7bcfaaa34a60e65e8d339f1536 // Paper Start if (!org.spigotmc.AsyncCatcher.shuttingDown && !Bukkit.isPrimaryThread()) { final CommandSender fSender = sender; -@@ -2894,7 +3005,7 @@ public final class CraftServer implements Server { +@@ -2951,7 +3062,7 @@ public final class CraftServer implements Server { @Override public int getCurrentTick() { @@ -23828,10 +23834,10 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..27445d7bcfaaa34a60e65e8d339f1536 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e25894efeb2a 100644 +index 4f0ca1621e4f1fc16d4a6601c858d74ed4d5a788..58450e07930084527c4e89ba5d376f6f3a479b34 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -180,7 +180,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -184,7 +184,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getTickableTileEntityCount() { @@ -23840,7 +23846,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 } @Override -@@ -237,7 +237,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -241,7 +241,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start - per world spawn limits for (SpawnCategory spawnCategory : SpawnCategory.values()) { if (CraftSpawnCategory.isValidForLimits(spawnCategory)) { @@ -23849,24 +23855,24 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 } } // Paper end -@@ -329,6 +329,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -328,6 +328,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public Chunk getChunkAt(int x, int z) { + io.papermc.paper.util.TickThread.isTickThreadFor(this.getHandle(), x, z); // Folia - region threading warnUnsafeChunk("getting a faraway chunk", x, z); // Paper // Paper start - add ticket to hold chunk for a little while longer if plugin accesses it - net.minecraft.world.level.chunk.LevelChunk chunk = world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); -@@ -342,7 +343,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { + net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); +@@ -351,7 +352,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start private void addTicket(int x, int z) { -- io.papermc.paper.util.MCUtil.MAIN_EXECUTOR.execute(() -> world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE)); // Paper -+ world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE); // Paper // Folia - region threading - does not need to be on the main thread anymore +- io.papermc.paper.util.MCUtil.MAIN_EXECUTOR.execute(() -> this.world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE)); // Paper ++ this.world.getChunkSource().addRegionTicket(TicketType.PLUGIN, new ChunkPos(x, z), 0, Unit.INSTANCE); // Paper // Folia - region threading - does not need to be on the main thread anymore } // Paper end -@@ -361,10 +362,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -370,10 +371,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean isChunkGenerated(int x, int z) { // Paper start - Fix this method @@ -23879,7 +23885,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 } ChunkAccess chunk = world.getChunkSource().getChunkAtImmediately(x, z); if (chunk == null) { -@@ -418,7 +419,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -427,7 +428,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { } private boolean unloadChunk0(int x, int z, boolean save) { @@ -23888,7 +23894,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 if (!this.isChunkLoaded(x, z)) { return true; } -@@ -433,7 +434,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -442,7 +443,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean regenerateChunk(int x, int z) { @@ -23897,7 +23903,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 warnUnsafeChunk("regenerating a faraway chunk", x, z); // Paper // Paper start - implement regenerateChunk method final ServerLevel serverLevel = this.world; -@@ -495,6 +496,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -504,6 +505,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean refreshChunk(int x, int z) { @@ -23905,7 +23911,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 ChunkHolder playerChunk = this.world.getChunkSource().chunkMap.getVisibleChunkIfPresent(ChunkPos.asLong(x, z)); if (playerChunk == null) return false; -@@ -530,7 +532,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -539,7 +541,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean loadChunk(int x, int z, boolean generate) { @@ -23914,7 +23920,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 warnUnsafeChunk("loading a faraway chunk", x, z); // Paper // Paper start - Optimize this method ChunkPos chunkPos = new ChunkPos(x, z); -@@ -603,7 +605,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -611,7 +613,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 @@ -23923,7 +23929,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 return true; } -@@ -788,13 +790,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -796,13 +798,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -23944,7 +23950,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 BlockPos position = ((CraftBlockState) blockstate).getPosition(); net.minecraft.world.level.block.state.BlockState oldBlock = this.world.getBlockState(position); int flag = ((CraftBlockState) blockstate).getFlag(); -@@ -802,10 +806,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -810,10 +814,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); } @@ -23957,7 +23963,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 return false; } } -@@ -839,6 +843,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -847,6 +851,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setTime(long time) { @@ -23965,7 +23971,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 long margin = (time - this.getFullTime()) % 24000; if (margin < 0) margin += 24000; this.setFullTime(this.getFullTime() + margin); -@@ -851,6 +856,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -859,6 +864,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setFullTime(long time) { @@ -23973,7 +23979,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 // Notify anyone who's listening TimeSkipEvent event = new TimeSkipEvent(this, TimeSkipEvent.SkipReason.CUSTOM, time - this.world.getDayTime()); this.server.getPluginManager().callEvent(event); -@@ -878,7 +884,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -886,7 +892,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public long getGameTime() { @@ -23982,7 +23988,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 } @Override -@@ -898,11 +904,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -906,11 +912,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source) { @@ -23996,7 +24002,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 return !world.explode(source != null ? ((org.bukkit.craftbukkit.entity.CraftEntity) source).getHandle() : null, loc.getX(), loc.getY(), loc.getZ(), power, setFire, breakBlocks ? net.minecraft.world.level.Level.ExplosionInteraction.MOB : net.minecraft.world.level.Level.ExplosionInteraction.NONE).wasCanceled; } // Paper end -@@ -977,6 +985,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -980,6 +988,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getHighestBlockYAt(int x, int z, org.bukkit.HeightMap heightMap) { @@ -24004,7 +24010,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 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); -@@ -1012,6 +1021,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1010,6 +1019,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); @@ -24012,7 +24018,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 if (this.world.hasChunkAt(pos)) { net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkAt(pos); -@@ -1287,6 +1297,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1285,6 +1295,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setStorm(boolean hasStorm) { @@ -24020,7 +24026,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 world.serverLevelData.setRaining(hasStorm, org.bukkit.event.weather.WeatherChangeEvent.Cause.PLUGIN); // Paper this.setWeatherDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1299,6 +1310,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1297,6 +1308,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setWeatherDuration(int duration) { @@ -24028,7 +24034,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 world.serverLevelData.setRainTime(duration); } -@@ -1309,6 +1321,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1307,6 +1319,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThundering(boolean thundering) { @@ -24036,7 +24042,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 world.serverLevelData.setThundering(thundering, org.bukkit.event.weather.ThunderChangeEvent.Cause.PLUGIN); // Paper this.setThunderDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1321,6 +1334,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1319,6 +1332,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThunderDuration(int duration) { @@ -24044,7 +24050,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 world.serverLevelData.setThunderTime(duration); } -@@ -1331,6 +1345,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1329,6 +1343,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setClearWeatherDuration(int duration) { @@ -24052,7 +24058,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 world.serverLevelData.setClearWeatherTime(duration); } -@@ -1524,6 +1539,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1522,6 +1537,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setKeepSpawnInMemory(boolean keepLoaded) { @@ -24060,7 +24066,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 // Paper start - Configurable spawn radius if (keepLoaded == world.keepSpawnInMemory) { // do nothing, nothing has changed -@@ -1602,6 +1618,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1600,6 +1616,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setHardcore(boolean hardcore) { @@ -24068,7 +24074,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 world.serverLevelData.settings.hardcore = hardcore; } -@@ -1614,6 +1631,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1612,6 +1629,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) { @@ -24076,7 +24082,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setTicksPerSpawns(SpawnCategory.ANIMAL, ticksPerAnimalSpawns); } -@@ -1626,6 +1644,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1624,6 +1642,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) { @@ -24084,7 +24090,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setTicksPerSpawns(SpawnCategory.MONSTER, ticksPerMonsterSpawns); } -@@ -1638,6 +1657,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1636,6 +1655,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) { @@ -24092,7 +24098,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setTicksPerSpawns(SpawnCategory.WATER_ANIMAL, ticksPerWaterSpawns); } -@@ -1650,6 +1670,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1648,6 +1668,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterAmbientSpawns(int ticksPerWaterAmbientSpawns) { @@ -24100,7 +24106,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setTicksPerSpawns(SpawnCategory.WATER_AMBIENT, ticksPerWaterAmbientSpawns); } -@@ -1662,6 +1683,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1660,6 +1681,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterUndergroundCreatureSpawns(int ticksPerWaterUndergroundCreatureSpawns) { @@ -24108,7 +24114,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setTicksPerSpawns(SpawnCategory.WATER_UNDERGROUND_CREATURE, ticksPerWaterUndergroundCreatureSpawns); } -@@ -1674,11 +1696,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1672,11 +1694,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) { @@ -24122,7 +24128,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 Validate.notNull(spawnCategory, "SpawnCategory cannot be null"); Validate.isTrue(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory." + spawnCategory + " are not supported."); -@@ -1695,21 +1719,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1693,21 +1717,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { @@ -24148,7 +24154,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.server.getWorldMetadata().removeMetadata(this, metadataKey, owningPlugin); } -@@ -1722,6 +1750,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1720,6 +1748,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setMonsterSpawnLimit(int limit) { @@ -24156,7 +24162,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setSpawnLimit(SpawnCategory.MONSTER, limit); } -@@ -1734,6 +1763,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1732,6 +1761,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAnimalSpawnLimit(int limit) { @@ -24164,7 +24170,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setSpawnLimit(SpawnCategory.ANIMAL, limit); } -@@ -1746,6 +1776,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1744,6 +1774,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAnimalSpawnLimit(int limit) { @@ -24172,7 +24178,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setSpawnLimit(SpawnCategory.WATER_ANIMAL, limit); } -@@ -1758,6 +1789,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1756,6 +1787,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAmbientSpawnLimit(int limit) { @@ -24180,7 +24186,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setSpawnLimit(SpawnCategory.WATER_AMBIENT, limit); } -@@ -1770,6 +1802,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1768,6 +1800,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterUndergroundCreatureSpawnLimit(int limit) { @@ -24188,7 +24194,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setSpawnLimit(SpawnCategory.WATER_UNDERGROUND_CREATURE, limit); } -@@ -1782,6 +1815,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1780,6 +1813,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAmbientSpawnLimit(int limit) { @@ -24196,7 +24202,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 this.setSpawnLimit(SpawnCategory.AMBIENT, limit); } -@@ -1804,6 +1838,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1802,6 +1836,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setSpawnLimit(SpawnCategory spawnCategory, int limit) { @@ -24204,7 +24210,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 Validate.notNull(spawnCategory, "SpawnCategory cannot be null"); Validate.isTrue(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory." + spawnCategory + " are not supported."); -@@ -1858,7 +1893,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1856,7 +1891,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(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(CraftSound.getSoundEffect(sound)), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, this.getHandle().getRandom().nextLong()); @@ -24213,7 +24219,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -1869,7 +1904,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1867,7 +1902,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(new ResourceLocation(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, this.getHandle().getRandom().nextLong()); @@ -24222,7 +24228,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -1922,6 +1957,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1953,6 +1988,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRuleValue(String rule, String value) { @@ -24230,7 +24236,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 // No null values allowed if (rule == null || value == null) return false; -@@ -1963,6 +1999,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1994,6 +2030,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRule(GameRule rule, T newValue) { @@ -24238,7 +24244,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 Validate.notNull(rule, "GameRule cannot be null"); Validate.notNull(newValue, "GameRule value cannot be null"); -@@ -2228,6 +2265,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2259,6 +2296,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void sendGameEvent(Entity sourceEntity, org.bukkit.GameEvent gameEvent, Vector position) { @@ -24251,7 +24257,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 getHandle().gameEvent(sourceEntity != null ? ((CraftEntity) sourceEntity).getHandle(): null, net.minecraft.core.registries.BuiltInRegistries.GAME_EVENT.get(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(gameEvent.getKey())), org.bukkit.craftbukkit.util.CraftVector.toBlockPos(position)); } // Paper end -@@ -2355,7 +2398,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2391,7 +2434,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start public java.util.concurrent.CompletableFuture getChunkAtAsync(int x, int z, boolean gen, boolean urgent) { warnUnsafeChunk("getting a faraway chunk async", x, z); // Paper @@ -24259,16 +24265,16 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..2ead9af36c4d41c61b68a960ff17e258 + if (io.papermc.paper.util.TickThread.isTickThreadFor(this.getHandle(), x, z)) { // Folia - region threading net.minecraft.world.level.chunk.LevelChunk immediate = this.world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); if (immediate != null) { - return java.util.concurrent.CompletableFuture.completedFuture(immediate.getBukkitChunk()); -@@ -2372,7 +2415,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { + return java.util.concurrent.CompletableFuture.completedFuture(new CraftChunk(immediate)); +@@ -2408,7 +2451,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { java.util.concurrent.CompletableFuture ret = new java.util.concurrent.CompletableFuture<>(); io.papermc.paper.chunk.system.ChunkSystem.scheduleChunkLoad(this.getHandle(), x, z, gen, ChunkStatus.FULL, true, priority, (c) -> { - net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> { + io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(this.getHandle(), x, z, () -> { // Folia - region threading net.minecraft.world.level.chunk.LevelChunk chunk = (net.minecraft.world.level.chunk.LevelChunk)c; - if (chunk != null) addTicket(x, z); // Paper - ret.complete(chunk == null ? null : chunk.getBukkitChunk()); + if (chunk != null) this.addTicket(x, z); // Paper + ret.complete(chunk == null ? null : new CraftChunk(chunk)); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java index a3d5e319473e2f6316b3ef8edf719296e02d85a1..55abed5fdf8dc699ade5b25b1f1949417dbf7a69 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java @@ -24282,10 +24288,10 @@ index a3d5e319473e2f6316b3ef8edf719296e02d85a1..55abed5fdf8dc699ade5b25b1f194941 tileentitybeehive.addOccupantWithPresetTicks(entitybee, false, random.nextInt(599)); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a5bb945f1 100644 +index 3a201bb68ef34d53aee75ca248248c11c4a77c2c..c18803e83da8a428d3adc59f34e17d50a3f6df4a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -@@ -81,6 +81,11 @@ public class CraftBlock implements Block { +@@ -80,6 +80,11 @@ public class CraftBlock implements Block { } public net.minecraft.world.level.block.state.BlockState getNMS() { @@ -24297,7 +24303,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a return this.world.getBlockState(position); } -@@ -157,6 +162,11 @@ public class CraftBlock implements Block { +@@ -156,6 +161,11 @@ public class CraftBlock implements Block { } private void setData(final byte data, int flag) { @@ -24309,7 +24315,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a this.world.setBlock(position, CraftMagicNumbers.getBlock(this.getType(), data), flag); } -@@ -198,6 +208,11 @@ public class CraftBlock implements Block { +@@ -197,6 +207,11 @@ public class CraftBlock implements Block { } public static boolean setTypeAndData(LevelAccessor world, BlockPos position, net.minecraft.world.level.block.state.BlockState old, net.minecraft.world.level.block.state.BlockState blockData, boolean applyPhysics) { @@ -24321,7 +24327,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a // SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in tile entity cleanup if (old.hasBlockEntity() && blockData.getBlock() != old.getBlock()) { // SPIGOT-3725 remove old tile entity if block changes // SPIGOT-4612: faster - just clear tile -@@ -340,18 +355,33 @@ public class CraftBlock implements Block { +@@ -342,18 +357,33 @@ public class CraftBlock implements Block { @Override public Biome getBiome() { @@ -24355,7 +24361,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a this.getWorld().setBiome(this.getX(), this.getY(), this.getZ(), bio); } -@@ -422,6 +452,11 @@ public class CraftBlock implements Block { +@@ -424,6 +454,11 @@ public class CraftBlock implements Block { @Override public boolean isBlockFaceIndirectlyPowered(BlockFace face) { @@ -24367,7 +24373,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a int power = this.world.getMinecraftWorld().getSignal(position, CraftBlock.blockFaceToNotch(face)); Block relative = this.getRelative(face); -@@ -434,6 +469,11 @@ public class CraftBlock implements Block { +@@ -436,6 +471,11 @@ public class CraftBlock implements Block { @Override public int getBlockPower(BlockFace face) { @@ -24379,7 +24385,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a int power = 0; net.minecraft.world.level.Level world = this.world.getMinecraftWorld(); int x = this.getX(); -@@ -520,6 +560,11 @@ public class CraftBlock implements Block { +@@ -522,6 +562,11 @@ public class CraftBlock implements Block { @Override public boolean breakNaturally(ItemStack item, boolean triggerEffect, boolean dropExperience) { @@ -24391,7 +24397,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a // Paper end // Order matters here, need to drop before setting to air so skulls can get their data net.minecraft.world.level.block.state.BlockState iblockdata = this.getNMS(); -@@ -563,21 +608,27 @@ public class CraftBlock implements Block { +@@ -565,21 +610,27 @@ public class CraftBlock implements Block { @Override public boolean applyBoneMeal(BlockFace face) { @@ -24426,7 +24432,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a StructureGrowEvent structureEvent = null; if (treeType != null) { -@@ -663,6 +714,11 @@ public class CraftBlock implements Block { +@@ -665,6 +716,11 @@ public class CraftBlock implements Block { @Override public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode) { @@ -24438,7 +24444,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a Validate.notNull(start, "Start location is null!"); Validate.isTrue(this.getWorld().equals(start.getWorld()), "Start location is from different world!"); start.checkFinite(); -@@ -704,6 +760,11 @@ public class CraftBlock implements Block { +@@ -706,6 +762,11 @@ public class CraftBlock implements Block { @Override public boolean canPlace(BlockData data) { @@ -24450,7 +24456,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a Preconditions.checkArgument(data != null, "Provided block data is null!"); net.minecraft.world.level.block.state.BlockState iblockdata = ((CraftBlockData) data).getState(); net.minecraft.world.level.Level world = this.world.getMinecraftWorld(); -@@ -734,6 +795,11 @@ public class CraftBlock implements Block { +@@ -736,6 +797,11 @@ public class CraftBlock implements Block { @Override public float getDestroySpeed(ItemStack itemStack, boolean considerEnchants) { @@ -24462,7 +24468,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a net.minecraft.world.item.ItemStack nmsItemStack; if (itemStack instanceof CraftItemStack) { nmsItemStack = ((CraftItemStack) itemStack).handle; -@@ -759,6 +825,11 @@ public class CraftBlock implements Block { +@@ -761,6 +827,11 @@ public class CraftBlock implements Block { @Override public void tick() { @@ -24474,7 +24480,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a net.minecraft.world.level.block.state.BlockState blockData = this.getNMS(); net.minecraft.server.level.ServerLevel level = this.world.getMinecraftWorld(); -@@ -767,6 +838,11 @@ public class CraftBlock implements Block { +@@ -769,6 +840,11 @@ public class CraftBlock implements Block { @Override public void randomTick() { @@ -24487,10 +24493,10 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..2f0ee1fa2a250e1edc2a33e0bb91009a net.minecraft.server.level.ServerLevel level = this.world.getMinecraftWorld(); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -index a8ab1d3ee81664193be39d2735d6495136e0e310..462493e2caf576f9dbfcffd1d9a8ca696febf83e 100644 +index 577a352dab0f8a71558cb6dedce788e78053ef52..2fbd5f98862bbd179aac002f751a3e6169e67292 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -@@ -206,6 +206,12 @@ public class CraftBlockState implements BlockState { +@@ -207,6 +207,12 @@ public class CraftBlockState implements BlockState { LevelAccessor access = this.getWorldHandle(); CraftBlock block = this.getBlock(); @@ -24503,7 +24509,7 @@ index a8ab1d3ee81664193be39d2735d6495136e0e310..462493e2caf576f9dbfcffd1d9a8ca69 if (block.getType() != this.getType()) { if (!force) { return false; -@@ -343,6 +349,9 @@ public class CraftBlockState implements BlockState { +@@ -344,6 +350,9 @@ public class CraftBlockState implements BlockState { @Override public java.util.Collection getDrops(org.bukkit.inventory.ItemStack item, org.bukkit.entity.Entity entity) { @@ -24536,7 +24542,7 @@ index cd4ad8261e56365850068db1d83d6a8454026737..78f7e72f2912dae503c2dab7d1992b65 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 57a0dbb23a32123d30c3b3572f4d129be9d97847..652c28a66d45680479a38463525afcf191c55ab4 100644 +index 56c75029a94e8812c9e0ce5375aaa7cbcda90b87..fa762f490fea59e2ec21cfb1c050c4adc30d9998 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -203,6 +203,16 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -24642,10 +24648,10 @@ index 57a0dbb23a32123d30c3b3572f4d129be9d97847..652c28a66d45680479a38463525afcf1 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index fec408416aa63e1022802a644bb95131601f0c3b..c6e6ce4a077550e8e86995f18a4deda4b7b369eb 100644 +index e88d7a6b4835bdac1a247545b49e4161ade148cb..b0d9ab8088ee8b894fbee4c4b88bf081a419cb1f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -564,7 +564,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -573,7 +573,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void kickPlayer(String message) { @@ -24654,7 +24660,7 @@ index fec408416aa63e1022802a644bb95131601f0c3b..c6e6ce4a077550e8e86995f18a4deda4 if (this.getHandle().connection == null) return; this.getHandle().connection.disconnect(message == null ? "" : message, org.bukkit.event.player.PlayerKickEvent.Cause.PLUGIN); // Paper - kick event cause -@@ -1259,6 +1259,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1281,6 +1281,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean teleport(Location location, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause, io.papermc.paper.entity.TeleportFlag... flags) { @@ -24666,7 +24672,7 @@ index fec408416aa63e1022802a644bb95131601f0c3b..c6e6ce4a077550e8e86995f18a4deda4 java.util.Set relativeArguments; java.util.Set allFlags; if (flags.length == 0) { -@@ -1779,7 +1784,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1812,7 +1817,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private void unregisterEntity(Entity other) { // Paper end ChunkMap tracker = ((ServerLevel) this.getHandle().level).getChunkSource().chunkMap; @@ -24675,7 +24681,7 @@ index fec408416aa63e1022802a644bb95131601f0c3b..c6e6ce4a077550e8e86995f18a4deda4 if (entry != null) { entry.removePlayer(this.getHandle()); } -@@ -1863,7 +1868,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1896,7 +1901,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(otherPlayer))); } @@ -24685,10 +24691,10 @@ index fec408416aa63e1022802a644bb95131601f0c3b..c6e6ce4a077550e8e86995f18a4deda4 entry.updatePlayer(this.getHandle()); } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19b5f59d09 100644 +index a153c134cf26e86d49ef419eca35994539af0db3..ca9398250db23bf3198fa96bcac2beb54dda3690 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -227,8 +227,8 @@ import org.bukkit.potion.PotionEffect; +@@ -230,8 +230,8 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.event.entity.SpawnerSpawnEvent; // Spigot public class CraftEventFactory { @@ -24699,7 +24705,7 @@ index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19 // helper methods private static boolean canBuild(ServerLevel world, Player player, int x, int z) { -@@ -841,7 +841,7 @@ public class CraftEventFactory { +@@ -860,7 +860,7 @@ public class CraftEventFactory { return CraftEventFactory.handleBlockSpreadEvent(world, source, target, block, 2); } @@ -24708,7 +24714,7 @@ index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19 public static boolean handleBlockSpreadEvent(LevelAccessor world, BlockPos source, BlockPos target, net.minecraft.world.level.block.state.BlockState block, int flag) { // Suppress during worldgen if (!(world instanceof Level)) { -@@ -852,7 +852,7 @@ public class CraftEventFactory { +@@ -871,7 +871,7 @@ public class CraftEventFactory { CraftBlockState state = CraftBlockStates.getBlockState(world, target, flag); state.setData(block); @@ -24717,7 +24723,7 @@ index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19 Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { -@@ -967,8 +967,8 @@ public class CraftEventFactory { +@@ -986,8 +986,8 @@ public class CraftEventFactory { private static EntityDamageEvent handleEntityDamageEvent(Entity entity, DamageSource source, Map modifiers, Map> modifierFunctions, boolean cancelled) { if (source.is(DamageTypeTags.IS_EXPLOSION)) { DamageCause damageCause; @@ -24728,7 +24734,7 @@ index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19 EntityDamageEvent event; if (damager == null) { event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions); -@@ -1024,13 +1024,13 @@ public class CraftEventFactory { +@@ -1048,13 +1048,13 @@ public class CraftEventFactory { } return event; } else if (source.is(DamageTypes.LAVA)) { @@ -24746,7 +24752,7 @@ index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19 if (!event.isCancelled()) { event.getEntity().setLastDamageCause(event); -@@ -1038,9 +1038,9 @@ public class CraftEventFactory { +@@ -1062,9 +1062,9 @@ public class CraftEventFactory { entity.lastDamageCancelled = true; // SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Keep track if the event was canceled } return event; @@ -24758,7 +24764,7 @@ index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19 if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.STALAGMITE) || source.is(DamageTypes.FALLING_STALACTITE) || source.is(DamageTypes.FALLING_ANVIL)) { cause = DamageCause.CONTACT; } else if (source.is(DamageTypes.HOT_FLOOR)) { -@@ -1055,9 +1055,9 @@ public class CraftEventFactory { +@@ -1079,9 +1079,9 @@ public class CraftEventFactory { EntityDamageEvent event = new EntityDamageByBlockEvent(damager, entity.getBukkitEntity(), cause, modifiers, modifierFunctions); event.setCancelled(cancelled); @@ -24770,7 +24776,7 @@ index cdb8ec04f4a19ec3dbedbd5b17a7d1f3afaa238e..49c68ee30436232663b8d4dd15991e19 if (!event.isCancelled()) { event.getEntity().setLastDamageCause(event); -@@ -1065,10 +1065,10 @@ public class CraftEventFactory { +@@ -1089,10 +1089,10 @@ public class CraftEventFactory { entity.lastDamageCancelled = true; // SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Keep track if the event was canceled } return event; @@ -24797,10 +24803,10 @@ index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..9136fb30db749737e9f189d0901024fc 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 64c50c52c11214740de7903e5592b8b6b2c170b3..9f5e8a21de3785721897cf8cf75b17ce3968cb7e 100644 +index 1179e9fbff93ec8ff82aa3aae477f6bf4ce9b885..3dc2223bcdffb425f207e7418a8bcc55db26842f 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -373,6 +373,12 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -375,6 +375,12 @@ public final class CraftMagicNumbers implements UnsafeValues { String minimumVersion = MinecraftServer.getServer().server.minimumAPI; int minimumIndex = CraftMagicNumbers.SUPPORTED_API.indexOf(minimumVersion); @@ -24814,7 +24820,7 @@ index 64c50c52c11214740de7903e5592b8b6b2c170b3..9f5e8a21de3785721897cf8cf75b17ce int pluginIndex = CraftMagicNumbers.SUPPORTED_API.indexOf(pdf.getAPIVersion()); diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index e881584d38dc354204479863f004e974a0ac6c07..5b85034aeb2445a980f8d6156cea6a483ce97391 100644 +index 52780192d6417f8085566e4cdf3a895a83638520..806894e6db5d78e85c7bad48c0685151c270d0c1 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -65,26 +65,27 @@ public class ActivationRange @@ -24882,13 +24888,13 @@ index e881584d38dc354204479863f004e974a0ac6c07..5b85034aeb2445a980f8d6156cea6a48 if ( world.spigotConfig.ignoreSpectatorActivation && player.isSpectator() ) { continue; -@@ -212,10 +214,11 @@ public class ActivationRange - // Paper end +@@ -213,10 +215,11 @@ public class ActivationRange // Paper start -- java.util.List entities = world.getEntities((Entity)null, maxBB, (e) -> !(e instanceof net.minecraft.world.entity.Marker)); // Don't tick markers + java.util.function.Predicate entityPredicate = world.paperConfig().entities.markers.tick ? null : (e) -> !(e instanceof net.minecraft.world.entity.Marker); // Configurable marker ticking +- java.util.List entities = world.getEntities((Entity)null, maxBB, entityPredicate); + java.util.List entities = new java.util.ArrayList<>(); // Folia - region ticking - bypass getEntities thread check, we perform a check on the entities later -+ ((net.minecraft.server.level.ServerLevel)world).getEntityLookup().getEntities((Entity)null, maxBB, entities, (e) -> !(e instanceof net.minecraft.world.entity.Marker)); // Paper - optimise this call // Folia - region ticking - bypass getEntities thread check, we perform a check on the entities later ++ ((net.minecraft.server.level.ServerLevel)world).getEntityLookup().getEntities((Entity)null, maxBB, entities, entityPredicate); // Paper - optimise this call // Folia - region ticking - bypass getEntities thread check, we perform a check on the entities later for (int i = 0; i < entities.size(); i++) { Entity entity = entities.get(i); - ActivationRange.activateEntity(entity); @@ -24896,7 +24902,7 @@ index e881584d38dc354204479863f004e974a0ac6c07..5b85034aeb2445a980f8d6156cea6a48 } // Paper end } -@@ -229,16 +232,16 @@ public class ActivationRange +@@ -230,16 +233,16 @@ public class ActivationRange */ private static void activateEntity(Entity entity) { @@ -24916,7 +24922,7 @@ index e881584d38dc354204479863f004e974a0ac6c07..5b85034aeb2445a980f8d6156cea6a48 } } } -@@ -261,10 +264,10 @@ public class ActivationRange +@@ -262,10 +265,10 @@ public class ActivationRange if (entity.remainingFireTicks > 0) { return 2; } @@ -24929,7 +24935,7 @@ index e881584d38dc354204479863f004e974a0ac6c07..5b85034aeb2445a980f8d6156cea6a48 // Paper end // quick checks. if ( (entity.activationType != ActivationType.WATER && entity.wasTouchingWater && entity.isPushedByFluid()) ) // Paper -@@ -387,19 +390,19 @@ public class ActivationRange +@@ -388,19 +391,19 @@ public class ActivationRange } // Paper end @@ -24995,10 +25001,10 @@ index 612c3169c3463d702b85975e1db79ae6e47d60d0..6f77134ba451e7bd6bcba1000134ce8a public static int playerSample; diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index 5503ad6a93d331771a0e92c0da6adedf2ac81aff..a06408a10cb24c203cfc25f25ccd37ac1a587a1a 100644 +index bbfafb1400721251dfd2cac4dd8a31be2d682d4b..c5a04b6fb00b32752dce051f12012b9062ed4eda 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java -@@ -425,7 +425,7 @@ public class SpigotWorldConfig +@@ -429,7 +429,7 @@ public class SpigotWorldConfig this.otherMultiplier = (float) this.getDouble( "hunger.other-multiplier", 0.0 ); } diff --git a/patches/server/0006-Increase-parallelism-for-neighbour-writing-chunk-sta.patch b/patches/server/0006-Increase-parallelism-for-neighbour-writing-chunk-sta.patch index 8fb6e5f..d8a09b0 100644 --- a/patches/server/0006-Increase-parallelism-for-neighbour-writing-chunk-sta.patch +++ b/patches/server/0006-Increase-parallelism-for-neighbour-writing-chunk-sta.patch @@ -177,10 +177,10 @@ index 0b7a2b0ead4f3bc07bfd9a38c2b7cf024bd140c6..36e93fefdfbebddce4c153974c7cd81a final int chunkX = CoordinateUtils.getChunkX(coordinate); final int chunkZ = CoordinateUtils.getChunkZ(coordinate); diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java -index 9ac75b6c9d9698c6369978c4b004a82aa2b747f4..aa6dad3a41077b187ef0702cb27ca03f6d9596fb 100644 +index 1e5df2593b21b8ee7636f5df28541f9b04afa1e6..db18f2947ef9d2863e3a029f0500343920cba1db 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java -@@ -1339,17 +1339,23 @@ public final class ChunkHolderManager { +@@ -1346,17 +1346,23 @@ public final class ChunkHolderManager { } public Boolean tryDrainTicketUpdates() { diff --git a/patches/server/0008-Max-pending-logins.patch b/patches/server/0008-Max-pending-logins.patch index a6ffec5..d7f2436 100644 --- a/patches/server/0008-Max-pending-logins.patch +++ b/patches/server/0008-Max-pending-logins.patch @@ -19,10 +19,10 @@ index 2e96377d628b3a07fb565020074d665f594f32e8..75b1877f8c3e4da3183437f327ef3376 } // Folia - region threading - remove delayed accept diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index c6cfc5853869d0a356947b5cb83157a937acd91c..6af3e57e72caa0cf25b970fb08939fdde3be2fd3 100644 +index 7d99233f4b36d699aae81be554e78313909c9a7d..7416d8eed50ef7156db158c05c89d6062193bf2e 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -177,6 +177,17 @@ public abstract class PlayerList { +@@ -180,6 +180,17 @@ public abstract class PlayerList { conflictingId = this.connectionById.get(byId); if (conflictingName == null && conflictingId == null) { diff --git a/patches/server/0010-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0010-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index 00cf57d..b96f11b 100644 --- a/patches/server/0010-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0010-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -51,10 +51,10 @@ index d9687722e02dfd4088c7030abbf5008eb0a092c8..62484ebf4550b05182f693a3180bbac5 TickThread.ensureTickThread(thisEntity, "May not tick entity scheduler asynchronously"); final List toRun; diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c659a574195f465ec3316f4c014621569e099cfc..08e61a8940c142c68ed93359084ea46c7fd52310 100644 +index e8e6743ec078d9dd95d3583ff24cb6791abddf19..885805170e84ce6f26b2789e39c5b5b453c026f0 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2767,6 +2767,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2769,6 +2769,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // CraftBukkit start com.google.common.base.Preconditions.checkState(!entity.passengers.contains(this), "Circular entity riding! %s %s", this, entity); @@ -62,7 +62,7 @@ index c659a574195f465ec3316f4c014621569e099cfc..08e61a8940c142c68ed93359084ea46c CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) { -@@ -2794,6 +2795,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2796,6 +2797,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { if (event.isCancelled()) { return false; } @@ -70,7 +70,7 @@ index c659a574195f465ec3316f4c014621569e099cfc..08e61a8940c142c68ed93359084ea46c // Spigot end if (this.passengers.isEmpty()) { this.passengers = ImmutableList.of(entity); -@@ -2822,6 +2824,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2824,6 +2826,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); } else { // CraftBukkit start @@ -78,7 +78,7 @@ index c659a574195f465ec3316f4c014621569e099cfc..08e61a8940c142c68ed93359084ea46c CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) { -@@ -2849,6 +2852,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2851,6 +2854,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { if (event.isCancelled()) { return false; } @@ -87,10 +87,10 @@ index c659a574195f465ec3316f4c014621569e099cfc..08e61a8940c142c68ed93359084ea46c if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 27445d7bcfaaa34a60e65e8d339f15367d7b3b6e..788ac73125620ceaaec390a6498451b65d16d325 100644 +index c43248f5a8e4fe514cfcc1dcf3003baedd950904..0fa6d701f4a16b3a74b55bdd660accb000f06565 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -369,7 +369,7 @@ public final class CraftServer implements Server { +@@ -376,7 +376,7 @@ public final class CraftServer implements Server { @Override public final boolean isOwnedByCurrentRegion(Entity entity) { @@ -100,7 +100,7 @@ index 27445d7bcfaaa34a60e65e8d339f15367d7b3b6e..788ac73125620ceaaec390a6498451b6 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java -index 1c8d63e462f3ed3d5286659ae0d1ec04d8b55177..116341b777f898a8080cc348499159c0f01b7329 100644 +index 5e82b2d57833fea1adb342f5c8d25f55491945cb..2c46527dfe832919b055579a0876a043c06d8b67 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java @@ -1,5 +1,6 @@ @@ -131,7 +131,7 @@ index 1c8d63e462f3ed3d5286659ae0d1ec04d8b55177..116341b777f898a8080cc348499159c0 + io.papermc.paper.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading return (net.minecraft.world.entity.projectile.Projectile) entity; } - // Paper end + diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java index 299ab868252c8f326e3a56e878c9ee230c9635dc..e0f2104154f1499ef7cd388d24ffc3983aef7f42 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java @@ -218,10 +218,10 @@ index f6d9ccc993a067e554d6a7ef98c5fff1392efaef..69118f8ff00755ba1c31845a2704dd95 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java -index a0fed289f1f6b6addd60ccbd1344ad2c1202c78b..e7bd0ab46da08facea06ae86e8d21b288fe2e117 100644 +index debccfa7cb5517a877c06b13468db57534ace77e..18044b45cc001739406f8151c54f06b5d70d17e0 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAllay.java -@@ -16,8 +16,16 @@ public class CraftAllay extends CraftCreature implements org.bukkit.entity.Allay +@@ -17,8 +17,16 @@ public class CraftAllay extends CraftCreature implements org.bukkit.entity.Allay super(server, entity); } @@ -323,10 +323,10 @@ index 17d08d2c90047ebfc4098b087be091b83111a40f..f678c151938ddd3e5277a05d6d8884c1 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java -index 40ae8e43f40f9bf457d2917ac4f131b21e4f8dd2..bd473c255e13420f8d31b417ee53ff357424ce6d 100644 +index d53e1dc949359e9157e92c75d8655a1619bba568..16c55774a622b3325af091c9e7cc657cf7717d95 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java -@@ -158,8 +158,16 @@ public class CraftArrow extends AbstractProjectile implements AbstractArrow { +@@ -145,8 +145,16 @@ public class CraftArrow extends AbstractProjectile implements AbstractArrow { this.getHandle().setShotFromCrossbow(shotFromCrossbow); } @@ -386,10 +386,10 @@ index 8f25bb253c2b22e1964afeae705901e926432ef0..ebadeb928d405564d3b029246ac4f2c6 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java -index 1ae8d6e819cd9d195e1bd31ccf55d2893ba00e2a..eb0d022f50b31ae54aed72153b29b94f92f14174 100644 +index e222a6ab6afbc43a3d358a79855a818b0e481fdb..1e636646e3baa7a77c008d9109e0dccfbc497d6e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java -@@ -13,8 +13,16 @@ public class CraftBee extends CraftAnimals implements Bee { +@@ -14,8 +14,16 @@ public class CraftBee extends CraftAnimals implements Bee { super(server, entity); } @@ -701,7 +701,7 @@ index 63a8188010f045d5c17a1ecb63e8081ec86c2960..24c6c26f0930940f88bdd0353d660ff3 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java -index 864fbfef94373d7252f0e7eff4023330fa73c145..d1e7f24344ebc21fc9050e726ccf7657090451f8 100644 +index 2f7bf9963c3adfc9d2475a86e53a7dcf9f386bfe..e5ffc16d4d5595a7065119c97293f5b419b5a274 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDisplay.java @@ -13,8 +13,16 @@ public class CraftDisplay extends CraftEntity implements Display { @@ -785,10 +785,10 @@ index 6ac40fab0155f3b54a8ab7f492f42c952ee2377c..c439ab4e1db346d01c5de4ad9f2ce48e } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java -index 2dbc6bf56f3462028dd3c9cbc4a939c53e573c76..1c5a2168c150d6d819e238db3d7986f2bbd5a820 100644 +index 4c7f074a1f7aa43af6fe331bbd5d23929780ab25..d07b70f42c87a92fe662fc27a2eefa474db87bcc 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderCrystal.java -@@ -39,8 +39,16 @@ public class CraftEnderCrystal extends CraftEntity implements EnderCrystal { +@@ -40,8 +40,16 @@ public class CraftEnderCrystal extends CraftEntity implements EnderCrystal { } } @@ -869,7 +869,7 @@ index 21d5d8d4becee2709295d45b4b4fd2d1edbd3910..0cc66673866bd20ef74437866765134b } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java -index 86a5b59c2987a4faa5d29eebd978b4fb0b6cd424..26ba9f73504fc652f76b5a19baf19e3d42c4d0ac 100644 +index e3688e941d9b63b5319faf9370b8f75e0e5828ae..631dce2beaa9c8d72d45349a436d72c5417e8de7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java @@ -16,8 +16,16 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal { @@ -932,7 +932,7 @@ index 75c7645fb5732c43d1da15181cf5c7ee4c3ecd6c..6d3325436a77153438bc40aa86819562 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 652c28a66d45680479a38463525afcf191c55ab4..c6c31416fb21e180f5c05baca93630c5d14e0abb 100644 +index fa762f490fea59e2ec21cfb1c050c4adc30d9998..e4b85cab0d5e0a6d6214e7d57ab2c741439618b4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -827,7 +827,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -1023,10 +1023,10 @@ index 84899284703baeb04bfc79251941265d52ac07e8..5b8333e342c639f33acf62e5f8eb72d0 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java -index 87c413c2f3b59ae9ef36e5becc10b29a81348022..a1f7daf932a26add3fb0881223205d6574185955 100644 +index 05778023c3b2809c52c148efdfc8677dcc087a7b..92998b85df126725f376941c13dee3dfd407e96a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java -@@ -14,8 +14,16 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock { +@@ -15,8 +15,16 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock { super(server, entity); } @@ -1044,10 +1044,10 @@ index 87c413c2f3b59ae9ef36e5becc10b29a81348022..a1f7daf932a26add3fb0881223205d65 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java -index 2358e0c8a4a135d6deb47100c490a9c145f44827..00ba49ef13709d7216dcfab898356342e2f3b9d4 100644 +index 2dd2149e8af5cb47027ab24159b48e1d67b45f19..d5ce8c22474c90300ed843bf3e5021f38a4d5751 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java -@@ -60,8 +60,16 @@ public class CraftFireball extends AbstractProjectile implements Fireball { +@@ -47,8 +47,16 @@ public class CraftFireball extends AbstractProjectile implements Fireball { update(); // SPIGOT-6579 } @@ -1107,10 +1107,10 @@ index 3c64461119391ec2e987fc936104e21ef0a95ce4..d702e34f65de28df677a9d3616f38b2c } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java -index 5e0c2c5094e1578162d1a50d50701fbd25e6d961..307cb2b812cef199f36ee14cf7419d48ecc693c4 100644 +index f4591dfe799538ba8aea104793ceb9995dad0bb6..f74f4932a177ce38dc6339d9b16fca02db481444 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java -@@ -17,8 +17,16 @@ public class CraftFishHook extends CraftProjectile implements FishHook { +@@ -16,8 +16,16 @@ public class CraftFishHook extends CraftProjectile implements FishHook { super(server, entity); } @@ -1317,10 +1317,10 @@ index 79d2395b4a5efb042b80a315cc8e32d9c2521306..1ab70f244ed31eea22cc2614788072db } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java -index c3ddc2e87425f571ec38013fd8ce91e923a3b4bd..c038772fe58bc54e0bb0d028e29c48b1626c6d2b 100644 +index 2977939c0e66fbb3976e8526db82af2ecc6ffee9..1280dd6ecc53d681bbb311b6099817b517bc50db 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java -@@ -11,8 +11,16 @@ public class CraftGuardian extends CraftMonster implements Guardian { +@@ -14,8 +14,16 @@ public class CraftGuardian extends CraftMonster implements Guardian { super(server, entity); } @@ -1401,10 +1401,10 @@ index 1f474ef8f9e86da383206bd50ba00c7ed8352c5d..4dd82aef0d4e37336c076f74fe01cbd4 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index c8cccfcf4d572a9e65fce09621aeed2a7045003c..1fe7d7eb632adfb050e11138b2e775f6d9c1a970 100644 +index 1b008e5217c5bbf566a213abb92e1c7c43a3a7c2..139f4e7fb1e9fa9b21b0eddbffb05a35d54cf5cf 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -@@ -292,8 +292,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { +@@ -293,8 +293,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { this.mode = mode; } @@ -1611,7 +1611,7 @@ index e515e819774bfb31ec03f05a5502921e66f2b0e2..80cac5d7362577e53ef5ca215ab32618 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index aec588b41f19b2147a4e7267bafa417fbcf7abc0..bd115a08512e6f4c13bc30ce2b05c7378754754f 100644 +index d43859f8aa7beed82dd3a146bb1086982cd0cda7..3bc0bda187d0702694ad9d98b07aa62f5c44df8b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -419,8 +419,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -1653,7 +1653,7 @@ index 4d7a2c4c1001aefe9fcd4be8dbcb414f721bfff9..bcb06f550033e346923026141dc96b03 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java -index dd4c67f42217b5e746c4b0cf5c44116cacb321f6..69d67f0fea885aa1708c0c0e27482fefe5ad8f78 100644 +index 9b92efb9bb6905032cee43299d0fdb226dd0e598..ce153695ce561664fa5e184bad0ca8895f0344f3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlamaSpit.java @@ -11,8 +11,16 @@ public class CraftLlamaSpit extends AbstractProjectile implements LlamaSpit { @@ -1822,14 +1822,13 @@ index 67fe56cc4c2af24f6bd883c6e14851019b0b9523..31665297fc24f6d2e86e206ef1ddf46d } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java -index 5e3f0180accf633aa28ae87fe07464edfde50bff..1ad6c76dd5c45b2865dfe752891906a545e920b2 100644 +index e5cad4d149af18104266a6ccff55787891d31f0b..dce230dc9dc44040e925e9ab5ab95529561ba464 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartTNT.java -@@ -20,8 +20,17 @@ public final class CraftMinecartTNT extends CraftMinecart implements ExplosiveMi - return EntityType.MINECART_TNT; +@@ -43,8 +43,16 @@ public final class CraftMinecartTNT extends CraftMinecart implements ExplosiveMi + this.getHandle().explode(power); } - // Paper start -+ + + // Folia start - region threading + @Override + public net.minecraft.world.entity.vehicle.MinecartTNT getHandleRaw() { @@ -1838,13 +1837,13 @@ index 5e3f0180accf633aa28ae87fe07464edfde50bff..1ad6c76dd5c45b2865dfe752891906a5 + // Folia end - region threading + @Override - public net.minecraft.world.entity.vehicle.MinecartTNT getHandle() { + public MinecartTNT getHandle() { + io.papermc.paper.util.TickThread.ensureTickThread(this.entity, "Accessing entity state off owning region's thread"); // Folia - region threading - return (net.minecraft.world.entity.vehicle.MinecartTNT) entity; + return (MinecartTNT) super.getHandle(); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java -index 620d918e302a00d5a6640648e3096988d15535a0..0d65567fd7f862eb9d89a90b8bbd87c3ce57c793 100644 +index 18b9b0dc70f6872a9d71c120bcd2edca531b0ac4..148d0393b093a326f76fc34c035768f4758f3f1b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java @@ -55,8 +55,16 @@ public abstract class CraftMob extends CraftLivingEntity implements Mob { @@ -2147,10 +2146,10 @@ index beea227855f0b978e655efc298024120df8f4945..e1b7922ed298b6b3068c3f5fbe3b4030 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index c6e6ce4a077550e8e86995f18a4deda4b7b369eb..545a7c3ba18c983681eb5489ff6c6da41ee18988 100644 +index b0d9ab8088ee8b894fbee4c4b88bf081a419cb1f..a381e6a83762af08ed2005383d188313c12612ff 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -584,7 +584,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -593,7 +593,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void kick(net.kyori.adventure.text.Component message, org.bukkit.event.player.PlayerKickEvent.Cause cause) { @@ -2159,7 +2158,7 @@ index c6e6ce4a077550e8e86995f18a4deda4b7b369eb..545a7c3ba18c983681eb5489ff6c6da4 final ServerGamePacketListenerImpl connection = this.getHandle().connection; if (connection != null) { connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message, cause); -@@ -1978,9 +1978,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2017,9 +2017,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this; } @@ -2177,11 +2176,11 @@ index c6e6ce4a077550e8e86995f18a4deda4b7b369eb..545a7c3ba18c983681eb5489ff6c6da4 } public void setHandle(final ServerPlayer entity) { -@@ -3006,7 +3013,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3028,7 +3035,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { { if ( CraftPlayer.this.getHealth() <= 0 && CraftPlayer.this.isOnline() ) { -- server.getServer().getPlayerList().respawn( CraftPlayer.this.getHandle(), false ); +- server.getServer().getPlayerList().respawn( CraftPlayer.this.getHandle(), false, RespawnReason.PLUGIN ); + CraftPlayer.this.getHandle().respawn(null); // Folia - region threading } } @@ -2209,12 +2208,12 @@ index 30a0eac179c86b0fe94a2a40b5bfcd3eee01e53b..23364bbd534a147954d72986a96aee83 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java -index 9a68f4ef68870d0baab5b6464d6c0a82a8fd105d..e651bc940b0c92d3c3f5194e8642d74274dce343 100644 +index fd5beb956f643532e08613366ebd380d7999e79f..1521ad3c160062f22e6e17d2dacde5d8db5ccc00 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java -@@ -25,8 +25,16 @@ public abstract class CraftProjectile extends AbstractProjectile implements Proj - this.getHandle().projectileSource = shooter; - } +@@ -12,8 +12,16 @@ public abstract class CraftProjectile extends AbstractProjectile implements Proj + + // Paper - moved to AbstractProjectile + // Folia start - region threading + @Override @@ -2272,10 +2271,10 @@ index 3cb4860fea30bfaf2147b4f29a34336b6e417d6c..5d852e0a34004b877555157dd45020e5 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java -index e24eec79402843105a13de2bb8554260908057cc..f1730c569e0810688f4f5b5aabed8978177d923c 100644 +index ad10ba1dbaf81e767441aa8e1babed1d3e654121..55113e60883e2d74f46ffd2b7d273a517baa7584 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java -@@ -15,8 +15,16 @@ public abstract class CraftRaider extends CraftMonster implements Raider { +@@ -14,8 +14,16 @@ public abstract class CraftRaider extends CraftMonster implements Raider { super(server, entity); } @@ -2377,10 +2376,10 @@ index 8113650fda221538d14b53664db2d0cf81f13476..ccf7fd9be8baeda0b47b7abf090f2558 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java -index ca8a9b2773d70a8800b2179b164ce33d7e2bdc5e..d869091a0c38a53004a7742a9b8e245b5c35b7b4 100644 +index 43f52716c82863382cb0eb08cc0e174a19ffebdf..2435b081eb0587d155d8c4ffb8d67b7529965d85 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftShulkerBullet.java -@@ -84,8 +84,16 @@ public class CraftShulkerBullet extends AbstractProjectile implements ShulkerBul +@@ -71,8 +71,16 @@ public class CraftShulkerBullet extends AbstractProjectile implements ShulkerBul return EntityType.SHULKER_BULLET; } @@ -2524,10 +2523,10 @@ index d8b4df1300791aaf310465ec1577b1b8c202901a..17b83eb8563586f1ddf252f438d52d55 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java -index 5fde54aa18cc3e474e5ea252efed91a7e1809929..a1dfa6c6368311e78b76c8c30227461ccb3eea9e 100644 +index d9b40521e0597f4e2236a34c25cc4625552be66f..1517b557a62fe5f68217d343953ac0cb44531e01 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java -@@ -16,8 +16,16 @@ public class CraftSniffer extends CraftAnimals implements Sniffer { +@@ -17,8 +17,16 @@ public class CraftSniffer extends CraftAnimals implements Sniffer { super(server, entity); } @@ -2755,7 +2754,7 @@ index 428437970cac144be53cd0e30af7af0cd1ce603b..dc09e141ba2b12f1955bec521f2170d2 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java -index 2d04443a9efd6e4b5eb1e360a727d8492323724b..47ba133c7a4100892e95d8c9c1a1773088c48e55 100644 +index 99096c1e3f045e4a99335faedfb8e77e99690299..616848bf66273048dfde1f8802582fb871f8a5bb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTextDisplay.java @@ -14,8 +14,16 @@ public class CraftTextDisplay extends CraftDisplay implements TextDisplay { @@ -2945,10 +2944,10 @@ index a14d0a688b9054988b5c86c94738e4aaca9f9cfd..dd5b95c809e2bbdac17981af0010f554 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java -index 634a5099fb6faea03615783f57e643ad0083fa30..84c3c5e0bc55e92f136e3ca3ac2aa8b973e1793d 100644 +index bcfca66c7b99b9d514fe850d6cc6abd7e36ccaf7..90c295ff95bbee4f51fda1be2f58312d281925e5 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java -@@ -13,8 +13,16 @@ public class CraftVex extends CraftMonster implements Vex { +@@ -14,8 +14,16 @@ public class CraftVex extends CraftMonster implements Vex { super(server, entity); } @@ -2966,10 +2965,10 @@ index 634a5099fb6faea03615783f57e643ad0083fa30..84c3c5e0bc55e92f136e3ca3ac2aa8b9 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java -index a1a8ac55e572156671e47317ba061855be79e5ac..7a542e8353ebc2167c8235cd0ae85807a65f54d2 100644 +index 4e880409b06086568627f3e930159f1abb979984..db774dac486fd0a4b49a45c8248b594f877b141e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java -@@ -30,8 +30,16 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { +@@ -31,8 +31,16 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { super(server, entity); } @@ -3113,7 +3112,7 @@ index 9039db1a72009342063d4db08e18e6aee18836e8..c2bceaeabf13d37506eea540cb153d10 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java -index 4cf3a374c9ee7c7bcf82e778aa094eb4f8463595..e6d5b392ca9e13c2c61c2711892eaea806d525f4 100644 +index 1a21d30620f13a48976da5ead7edab201ea68b21..6eb758bed0d0e5394adfee3294aec2bf53daf3ed 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java @@ -22,8 +22,16 @@ public class CraftWither extends CraftMonster implements Wither, com.destroystok diff --git a/patches/server/0012-Throw-UnsupportedOperationException-for-broken-APIs.patch b/patches/server/0012-Throw-UnsupportedOperationException-for-broken-APIs.patch index 3f4955a..6970205 100644 --- a/patches/server/0012-Throw-UnsupportedOperationException-for-broken-APIs.patch +++ b/patches/server/0012-Throw-UnsupportedOperationException-for-broken-APIs.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Throw UnsupportedOperationException() for broken APIs diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 788ac73125620ceaaec390a6498451b65d16d325..32c9b38036052649b7b5fb25d7c4a49fdd1ca972 100644 +index 0fa6d701f4a16b3a74b55bdd660accb000f06565..fc3980d122eac0f1830375c113429135dc6d644c 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1245,6 +1245,7 @@ public final class CraftServer implements Server { +@@ -1264,6 +1264,7 @@ public final class CraftServer implements Server { @Override public World createWorld(WorldCreator creator) { @@ -16,7 +16,7 @@ index 788ac73125620ceaaec390a6498451b65d16d325..32c9b38036052649b7b5fb25d7c4a49f Preconditions.checkState(this.console.getAllLevels().iterator().hasNext(), "Cannot create additional worlds on STARTUP"); //Preconditions.checkState(!this.console.isIteratingOverLevels, "Cannot create a world while worlds are being ticked"); // Paper - Cat - Temp disable. We'll see how this goes. Validate.notNull(creator, "Creator may not be null"); -@@ -1385,6 +1386,7 @@ public final class CraftServer implements Server { +@@ -1404,6 +1405,7 @@ public final class CraftServer implements Server { @Override public boolean unloadWorld(World world, boolean save) { diff --git a/patches/server/0014-Work-around-https-github.com-PaperMC-paperweight-iss.patch b/patches/server/0014-Work-around-https-github.com-PaperMC-paperweight-iss.patch index 39cd386..2af08ff 100644 --- a/patches/server/0014-Work-around-https-github.com-PaperMC-paperweight-iss.patch +++ b/patches/server/0014-Work-around-https-github.com-PaperMC-paperweight-iss.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Work around https://github.com/PaperMC/paperweight/issues/194 diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 870a4a6c2a1fa0a3ae438c5ae1360cf312de6277..4963e87adf11c9df90f0dd4b60d360a137c07bc9 100644 +index e1e5573b31ca071eac727383b21a085aead4d3eb..cebfc29c50c631d0f2636f600b1839b2c5515ba1 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -494,7 +494,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -504,7 +504,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.disconnect(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(s), cause); } diff --git a/patches/server/0015-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch b/patches/server/0015-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch index 881a04d..f906449 100644 --- a/patches/server/0015-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch +++ b/patches/server/0015-Require-plugins-to-be-explicitly-marked-as-Folia-sup.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Require plugins to be explicitly marked as Folia supported diff --git a/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java b/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java -index 7605efe37ac4a63cb95c8c64c576e93c0e676cc0..bf4da696710026febea85ffcc559621d1ea33e45 100644 +index 45bd29b70782e29eb11c36eaca0f940aee49799b..b930bd722caf6ecc6e2d584535cdd7a8924d9e08 100644 --- a/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java +++ b/src/main/java/io/papermc/paper/plugin/provider/configuration/PaperPluginMeta.java -@@ -62,6 +62,7 @@ public class PaperPluginMeta implements PluginMeta { +@@ -60,6 +60,7 @@ public class PaperPluginMeta implements PluginMeta { @Required @PluginConfigConstraints.PluginVersion private String apiVersion; + private boolean foliaSupported = false; // Folia - private transient String displayName; + private Map> dependencies = new EnumMap<>(PluginDependencyLifeCycle.class); -@@ -204,6 +205,13 @@ public class PaperPluginMeta implements PluginMeta { +@@ -228,6 +229,13 @@ public class PaperPluginMeta implements PluginMeta { return this.apiVersion; } diff --git a/patches/server/0017-Fix-destroying-beehive-without-any-players-nearby-th.patch b/patches/server/0017-Fix-destroying-beehive-without-any-players-nearby-th.patch deleted file mode 100644 index ca976b1..0000000 --- a/patches/server/0017-Fix-destroying-beehive-without-any-players-nearby-th.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Spottedleaf -Date: Mon, 3 Apr 2023 21:14:19 -0700 -Subject: [PATCH] Fix destroying beehive without any players nearby throwing an - exception - -If the player moves out of range by the time the block is destroyed, -then the exception would throw and remove the player from the world - -diff --git a/src/main/java/net/minecraft/world/level/block/BeehiveBlock.java b/src/main/java/net/minecraft/world/level/block/BeehiveBlock.java -index 7867333757c300cd52110c2cf5d0a5bb19f9505d..f28d5fd2510424f2ed5232a4f16b2c4d55b8ecf3 100644 ---- a/src/main/java/net/minecraft/world/level/block/BeehiveBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/BeehiveBlock.java -@@ -98,6 +98,11 @@ public class BeehiveBlock extends BaseEntityBlock { - - if (!list.isEmpty()) { - List list1 = world.getEntitiesOfClass(Player.class, (new AABB(pos)).inflate(8.0D, 6.0D, 8.0D)); -+ // Folia start - if there are no players nearby, then nextInt() will throw -+ if (list1.isEmpty()) { -+ return; -+ } -+ // Folia end - if there are no players nearby, then nextInt() will throw - int i = list1.size(); - Iterator iterator = list.iterator(); - diff --git a/patches/server/0018-Lag-compensate-block-breaking.patch b/patches/server/0017-Lag-compensate-block-breaking.patch similarity index 100% rename from patches/server/0018-Lag-compensate-block-breaking.patch rename to patches/server/0017-Lag-compensate-block-breaking.patch diff --git a/patches/server/0019-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch b/patches/server/0018-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch similarity index 100% rename from patches/server/0019-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch rename to patches/server/0018-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch diff --git a/patches/server/0020-Block-reading-in-world-tile-entities-on-worldgen-thr.patch b/patches/server/0019-Block-reading-in-world-tile-entities-on-worldgen-thr.patch similarity index 100% rename from patches/server/0020-Block-reading-in-world-tile-entities-on-worldgen-thr.patch rename to patches/server/0019-Block-reading-in-world-tile-entities-on-worldgen-thr.patch diff --git a/patches/server/0021-Skip-worldstate-access-when-waking-players-up-during.patch b/patches/server/0020-Skip-worldstate-access-when-waking-players-up-during.patch similarity index 91% rename from patches/server/0021-Skip-worldstate-access-when-waking-players-up-during.patch rename to patches/server/0020-Skip-worldstate-access-when-waking-players-up-during.patch index ca404b6..a171baa 100644 --- a/patches/server/0021-Skip-worldstate-access-when-waking-players-up-during.patch +++ b/patches/server/0020-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 7ed0787319341573416d1152e54a6b98fca86e92..ef9d900821c19588579839049879098403e2797a 100644 +index c4970eefb48baf24cc51ba3cb27997984be872db..987ccd4ccdc50241e70aae681de7de2a7a6edc19 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -570,7 +570,7 @@ public class ServerPlayer extends Player { +@@ -572,7 +572,7 @@ public class ServerPlayer extends Player { this.getBukkitEntity().readExtraData(nbt); // CraftBukkit if (this.isSleeping()) { diff --git a/patches/server/0023-Do-not-access-POI-data-for-lodestone-compass.patch b/patches/server/0021-Do-not-access-POI-data-for-lodestone-compass.patch similarity index 100% rename from patches/server/0023-Do-not-access-POI-data-for-lodestone-compass.patch rename to patches/server/0021-Do-not-access-POI-data-for-lodestone-compass.patch diff --git a/patches/server/0022-Break-redstone-on-top-of-trap-doors-early.patch b/patches/server/0022-Break-redstone-on-top-of-trap-doors-early.patch deleted file mode 100644 index c0e8b8a..0000000 --- a/patches/server/0022-Break-redstone-on-top-of-trap-doors-early.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Spottedleaf -Date: Mon, 1 May 2023 18:21:32 -0700 -Subject: [PATCH] Break redstone on top of trap doors early - -This logic hooks into the neighbour update which should be invoked -as a result of redstone powering the trap door. - -diff --git a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java -index 89ae0fa000b5950f4c0d23b7e9f959989b9e9a84..4bddb91e289bbfbc75d532e63f935d585e41fc43 100644 ---- a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java -@@ -125,7 +125,26 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW - flag1 = eventRedstone.getNewCurrent() > 0; - } - // CraftBukkit end -- if ((Boolean) state.getValue(TrapDoorBlock.OPEN) != flag1) { -+ boolean open = (Boolean) state.getValue(TrapDoorBlock.OPEN) != flag1; // Folia - break redstone on trapdoors early -+ // Folia start - break redstone on trapdoors early -+ // note: this must run before any state for this block/its neighborus are written to the world -+ // we allow the redstone event to fire so that plugins can block -+ if (flag1 && open) { // if we are now powered and it caused the trap door to open -+ // in this case, first check for the redstone on top first -+ BlockPos abovePos = pos.above(); -+ BlockState above = world.getBlockState(abovePos); -+ if (above.getBlock() instanceof RedStoneWireBlock) { -+ world.setBlock(abovePos, Blocks.AIR.defaultBlockState(), Block.UPDATE_CLIENTS | Block.UPDATE_NEIGHBORS); -+ Block.popResource(world, abovePos, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.REDSTONE)); -+ // now check that this didn't change our state -+ if (world.getBlockState(pos) != state) { -+ // our state was changed, so we cannot propagate this update -+ return; -+ } -+ } -+ } -+ // Folia end - break redstone on trapdoors early -+ if (open) { // Folia - break redstone on trapdoors early - state = (BlockState) state.setValue(TrapDoorBlock.OPEN, flag1); - this.playSound((Player) null, world, pos, flag1); - } diff --git a/patches/server/0025-Use-coordinate-based-locking-to-increase-chunk-syste.patch b/patches/server/0022-Use-coordinate-based-locking-to-increase-chunk-syste.patch similarity index 99% rename from patches/server/0025-Use-coordinate-based-locking-to-increase-chunk-syste.patch rename to patches/server/0022-Use-coordinate-based-locking-to-increase-chunk-syste.patch index 9536e8c..6d41323 100644 --- a/patches/server/0025-Use-coordinate-based-locking-to-increase-chunk-syste.patch +++ b/patches/server/0022-Use-coordinate-based-locking-to-increase-chunk-syste.patch @@ -851,7 +851,7 @@ index 0000000000000000000000000000000000000000..64b5803d002b2968841a5ddee987f98b + } +} diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java -index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09f3403a04 100644 +index db18f2947ef9d2863e3a029f0500343920cba1db..8580ddfeb9cab5ba3d7c5cea836bdb67e49bab50 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java @@ -76,10 +76,50 @@ public final class ChunkHolderManager { @@ -1039,7 +1039,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } public List getOldChunkHolders() { -@@ -452,22 +415,65 @@ public final class ChunkHolderManager { +@@ -459,22 +422,65 @@ public final class ChunkHolderManager { } } @@ -1116,7 +1116,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 // function for converting between ticket levels and propagator levels and vice versa // the problem is the ticket level propagator will propagate from a set source down to zero, whereas mojang expects // levels to propagate from a set value up to a maximum value. so we need to convert the levels we put into the propagator -@@ -482,46 +488,72 @@ public final class ChunkHolderManager { +@@ -489,46 +495,72 @@ public final class ChunkHolderManager { } public String getTicketDebugString(final long coordinate) { @@ -1211,7 +1211,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 // Folia end - region threading if (tickets == null) { -@@ -535,21 +567,19 @@ public final class ChunkHolderManager { +@@ -542,21 +574,19 @@ public final class ChunkHolderManager { } } } finally { @@ -1237,7 +1237,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } } -@@ -567,45 +597,66 @@ public final class ChunkHolderManager { +@@ -574,45 +604,66 @@ public final class ChunkHolderManager { return this.addTicketAtLevel(type, CoordinateUtils.getChunkKey(chunkX, chunkZ), level, identifier); } @@ -1333,7 +1333,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 return SortedArraySet.create(4); }); -@@ -614,30 +665,20 @@ public final class ChunkHolderManager { +@@ -621,30 +672,20 @@ public final class ChunkHolderManager { final int levelAfter = getTicketLevelAt(ticketsAtChunk); if (current != ticket) { @@ -1375,7 +1375,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } } -@@ -646,13 +687,13 @@ public final class ChunkHolderManager { +@@ -653,13 +694,13 @@ public final class ChunkHolderManager { } return current == ticket; @@ -1395,7 +1395,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } } -@@ -665,117 +706,104 @@ public final class ChunkHolderManager { +@@ -672,117 +713,104 @@ public final class ChunkHolderManager { } public boolean removeTicketAtLevel(final TicketType type, final long chunk, final int level, final T identifier) { @@ -1560,7 +1560,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } } -@@ -784,58 +812,122 @@ public final class ChunkHolderManager { +@@ -791,58 +819,122 @@ public final class ChunkHolderManager { return; } @@ -1718,7 +1718,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } this.processTicketUpdates(); -@@ -887,10 +979,11 @@ public final class ChunkHolderManager { +@@ -894,10 +986,11 @@ public final class ChunkHolderManager { } private NewChunkHolder getOrCreateChunkHolder(final long position) { @@ -1732,7 +1732,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 throw new IllegalStateException("Must hold scheduler lock!!"); } -@@ -903,12 +996,14 @@ public final class ChunkHolderManager { +@@ -910,12 +1003,14 @@ public final class ChunkHolderManager { } current = this.createChunkHolder(position); @@ -1748,7 +1748,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 public ChunkEntitySlices getOrCreateEntityChunk(final int chunkX, final int chunkZ, final boolean transientChunk) { TickThread.ensureTickThread(this.world, chunkX, chunkZ, "Cannot create entity chunk off-main"); -@@ -921,13 +1016,13 @@ public final class ChunkHolderManager { +@@ -928,13 +1023,13 @@ public final class ChunkHolderManager { final AtomicBoolean isCompleted = new AtomicBoolean(); final Thread waiter = Thread.currentThread(); @@ -1766,7 +1766,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 try { current = this.getOrCreateChunkHolder(chunkX, chunkZ); if ((ret = current.getEntityChunk()) != null && (transientChunk || !ret.isTransient())) { -@@ -951,10 +1046,10 @@ public final class ChunkHolderManager { +@@ -958,10 +1053,10 @@ public final class ChunkHolderManager { } } } finally { @@ -1779,7 +1779,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } if (loadTask != null) { -@@ -996,7 +1091,7 @@ public final class ChunkHolderManager { +@@ -1003,7 +1098,7 @@ public final class ChunkHolderManager { return null; } @@ -1788,7 +1788,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 public PoiChunk loadPoiChunk(final int chunkX, final int chunkZ) { TickThread.ensureTickThread(this.world, chunkX, chunkZ, "Cannot create poi chunk off-main"); -@@ -1013,13 +1108,13 @@ public final class ChunkHolderManager { +@@ -1020,13 +1115,13 @@ public final class ChunkHolderManager { final AtomicReference completed = new AtomicReference<>(); final AtomicBoolean isCompleted = new AtomicBoolean(); final Thread waiter = Thread.currentThread(); @@ -1806,7 +1806,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 try { current = this.getOrCreateChunkHolder(chunkX, chunkZ); if (current.isPoiChunkLoaded()) { -@@ -1038,10 +1133,10 @@ public final class ChunkHolderManager { +@@ -1045,10 +1140,10 @@ public final class ChunkHolderManager { poiLoad.raisePriority(PrioritisedExecutor.Priority.BLOCKING); } } finally { @@ -1819,7 +1819,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } if (loadTask != null) { -@@ -1122,7 +1217,9 @@ public final class ChunkHolderManager { +@@ -1129,7 +1224,9 @@ public final class ChunkHolderManager { } } @@ -1830,7 +1830,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 /* * Note: Only called on chunk holders that the current ticking region owns -@@ -1133,7 +1230,9 @@ public final class ChunkHolderManager { +@@ -1140,7 +1237,9 @@ public final class ChunkHolderManager { // Folia - region threading ChunkSystem.onChunkHolderDelete(this.world, holder.vanillaChunkHolder); this.getCurrentRegionData().autoSaveQueue.remove(holder); // Folia - region threading @@ -1840,7 +1840,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } // note: never call while inside the chunk system, this will absolutely break everything -@@ -1143,100 +1242,150 @@ public final class ChunkHolderManager { +@@ -1150,100 +1249,150 @@ public final class ChunkHolderManager { if (BLOCK_TICKET_UPDATES.get() == Boolean.TRUE) { throw new IllegalStateException("Cannot unload chunks recursively"); } @@ -2063,7 +2063,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } } -@@ -1298,88 +1447,71 @@ public final class ChunkHolderManager { +@@ -1305,88 +1454,71 @@ public final class ChunkHolderManager { } } @@ -2198,7 +2198,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } private final ThreadLocal BLOCK_TICKET_UPDATES = ThreadLocal.withInitial(() -> { -@@ -1413,12 +1545,7 @@ public final class ChunkHolderManager { +@@ -1420,12 +1552,7 @@ public final class ChunkHolderManager { if (BLOCK_TICKET_UPDATES.get() == Boolean.TRUE) { throw new IllegalStateException("Cannot update ticket level while unloading chunks or updating entity manager"); } @@ -2212,7 +2212,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 List changedFullStatus = null; -@@ -1428,94 +1555,19 @@ public final class ChunkHolderManager { +@@ -1435,94 +1562,19 @@ public final class ChunkHolderManager { final boolean canProcessFullUpdates = processFullUpdates & isTickThread; final boolean canProcessScheduling = scheduledTasks == null; @@ -2317,7 +2317,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 if (changedFullStatus != null) { this.addChangedStatuses(changedFullStatus); -@@ -1561,43 +1613,7 @@ public final class ChunkHolderManager { +@@ -1568,43 +1620,7 @@ public final class ChunkHolderManager { } public JsonObject getDebugJsonForWatchdog() { @@ -2362,7 +2362,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } private JsonObject getDebugJsonNoLock() { -@@ -1606,12 +1622,31 @@ public final class ChunkHolderManager { +@@ -1613,12 +1629,31 @@ public final class ChunkHolderManager { final JsonArray unloadQueue = new JsonArray(); ret.add("unload_queue", unloadQueue); @@ -2399,7 +2399,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 } final JsonArray holders = new JsonArray(); -@@ -1621,71 +1656,77 @@ public final class ChunkHolderManager { +@@ -1628,71 +1663,77 @@ public final class ChunkHolderManager { holders.add(holder.getDebugJson()); } @@ -2525,7 +2525,7 @@ index aa6dad3a41077b187ef0702cb27ca03f6d9596fb..eba309c8614eb099d55db9c9ebfe6b09 }); // Folia end - region threading -@@ -1693,27 +1734,6 @@ public final class ChunkHolderManager { +@@ -1700,27 +1741,6 @@ public final class ChunkHolderManager { } public JsonObject getDebugJson() { diff --git a/patches/server/0027-Synchronize-PaperPermissionManager.patch b/patches/server/0023-Synchronize-PaperPermissionManager.patch similarity index 100% rename from patches/server/0027-Synchronize-PaperPermissionManager.patch rename to patches/server/0023-Synchronize-PaperPermissionManager.patch diff --git a/patches/server/0028-Mark-POI-Entity-load-tasks-as-completed-before-relea.patch b/patches/server/0024-Mark-POI-Entity-load-tasks-as-completed-before-relea.patch similarity index 100% rename from patches/server/0028-Mark-POI-Entity-load-tasks-as-completed-before-relea.patch rename to patches/server/0024-Mark-POI-Entity-load-tasks-as-completed-before-relea.patch diff --git a/patches/server/0024-Undo-making-JavaPlugin-logger-field-public.patch b/patches/server/0024-Undo-making-JavaPlugin-logger-field-public.patch deleted file mode 100644 index 4442727..0000000 --- a/patches/server/0024-Undo-making-JavaPlugin-logger-field-public.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Emily -Date: Sun, 14 May 2023 11:33:01 -0700 -Subject: [PATCH] Undo making JavaPlugin#logger field public - - -diff --git a/src/main/java/io/papermc/paper/plugin/entrypoint/classloader/PaperPluginClassLoader.java b/src/main/java/io/papermc/paper/plugin/entrypoint/classloader/PaperPluginClassLoader.java -index 79995ab1b624d7c7aaaa467a86255ad97385cf72..82487d656acaf41afe3af9c05a3dbf122bdf19c1 100644 ---- a/src/main/java/io/papermc/paper/plugin/entrypoint/classloader/PaperPluginClassLoader.java -+++ b/src/main/java/io/papermc/paper/plugin/entrypoint/classloader/PaperPluginClassLoader.java -@@ -171,8 +171,7 @@ public class PaperPluginClassLoader extends PaperSimplePluginClassLoader impleme - - File dataFolder = new File(Bukkit.getPluginsFolder(), pluginDescriptionFile.getName()); - -- plugin.init(Bukkit.getServer(), pluginDescriptionFile, dataFolder, this.source.toFile(), this, config); -- plugin.logger = this.logger; -+ plugin.init(Bukkit.getServer(), pluginDescriptionFile, dataFolder, this.source.toFile(), this, config, this.logger); - - this.loadedJavaPlugin = plugin; - } diff --git a/patches/server/0029-Properly-cancel-chunk-load-tasks-that-were-not-sched.patch b/patches/server/0025-Properly-cancel-chunk-load-tasks-that-were-not-sched.patch similarity index 100% rename from patches/server/0029-Properly-cancel-chunk-load-tasks-that-were-not-sched.patch rename to patches/server/0025-Properly-cancel-chunk-load-tasks-that-were-not-sched.patch diff --git a/patches/server/0031-Always-recalculate-light-list-on-protochunk-deserial.patch b/patches/server/0026-Always-recalculate-light-list-on-protochunk-deserial.patch similarity index 100% rename from patches/server/0031-Always-recalculate-light-list-on-protochunk-deserial.patch rename to patches/server/0026-Always-recalculate-light-list-on-protochunk-deserial.patch diff --git a/patches/server/0026-Fix-concurrenct-access-to-lookups-field-in-RegistryO.patch b/patches/server/0026-Fix-concurrenct-access-to-lookups-field-in-RegistryO.patch deleted file mode 100644 index df997c3..0000000 --- a/patches/server/0026-Fix-concurrenct-access-to-lookups-field-in-RegistryO.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Spottedleaf -Date: Mon, 15 May 2023 00:20:59 -0700 -Subject: [PATCH] Fix concurrenct access to lookups field in RegistryOps - -The concurrent access occurs on the Netty IO threads when -serializing packets. Thus, it seems it was an oversight of -the implementator of this function as there are typically -more than one Netty IO thread. - -Fixes https://github.com/PaperMC/Folia/issues/11 - -diff --git a/src/main/java/net/minecraft/resources/RegistryOps.java b/src/main/java/net/minecraft/resources/RegistryOps.java -index 7709eeac907c4895a264cec0a3d453aa8b194c18..4495802efec958095bcfd41487b30c3c799d7b36 100644 ---- a/src/main/java/net/minecraft/resources/RegistryOps.java -+++ b/src/main/java/net/minecraft/resources/RegistryOps.java -@@ -19,11 +19,11 @@ public class RegistryOps extends DelegatingOps { - - private static RegistryOps.RegistryInfoLookup memoizeLookup(final RegistryOps.RegistryInfoLookup registryInfoGetter) { - return new RegistryOps.RegistryInfoLookup() { -- private final Map>, Optional>> lookups = new HashMap<>(); -+ private final Map>, Optional>> lookups = new java.util.concurrent.ConcurrentHashMap<>(); // Folia - fix concurrent access to lookups field - - @Override - public Optional> lookup(ResourceKey> registryRef) { -- return this.lookups.computeIfAbsent(registryRef, registryInfoGetter::lookup); -+ return (Optional>)this.lookups.computeIfAbsent(registryRef, registryInfoGetter::lookup); // Folia - fix concurrent access to lookups field - } - }; - } diff --git a/patches/server/0032-Fix-off-region-raid-heroes.patch b/patches/server/0027-Fix-off-region-raid-heroes.patch similarity index 100% rename from patches/server/0032-Fix-off-region-raid-heroes.patch rename to patches/server/0027-Fix-off-region-raid-heroes.patch diff --git a/patches/server/0030-Optimise-recalcBlockCounts-for-empty-sections.patch b/patches/server/0030-Optimise-recalcBlockCounts-for-empty-sections.patch deleted file mode 100644 index 6c308ac..0000000 --- a/patches/server/0030-Optimise-recalcBlockCounts-for-empty-sections.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Spottedleaf -Date: Mon, 15 May 2023 20:25:26 -0700 -Subject: [PATCH] Optimise recalcBlockCounts() for empty sections - -In 1.18, every chunk section is initialised to a non-null value -and recalcBlockCounts() is invoked for each section. -However, in a standard world, most sections are empty. In such cases, -recalcBlockCounts() would iterate over ever position - even though -the block data would all be air. To avoid this, we skip -searching the section unless the palette indicates there _could_ be -a non-air block state or non-empty fluid state. - -Chunk loading initially showed that recalcBlockCounts() over -sections with a ZeroBitStorage data to to take ~20% of the process, -now it takes <1%. - -diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -index 1b80a91fa36c59a31b57ef7ef4a68eacbb0f17f5..cf2c053a0e82928c7a7cf99abe1bbd1eb7824507 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -@@ -244,6 +244,7 @@ public class LevelChunkSection { - this.nonEmptyBlockCount = 0; - this.tickingBlockCount = 0; - this.tickingFluidCount = 0; -+ if (this.maybeHas((BlockState state) -> !state.isAir() || !state.getFluidState().isEmpty())) { // Folia - do not run forEachLocation on clearly empty sections - this.states.forEachLocation((BlockState iblockdata, int i) -> { - FluidState fluid = iblockdata.getFluidState(); - -@@ -263,6 +264,7 @@ public class LevelChunkSection { - } - - }); -+ } // Folia - do not run forEachLocation on clearly empty sections - // Paper end - this.initBlockCollisionData(); // Paper - }