From 7bc26ecc74fed21699033d5e7ed5d003796b60cf Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Sat, 20 Jan 2024 20:33:21 -0800 Subject: [PATCH] Update Paper Additionally, fix ActivationRange using global state to store the AABBs it checks entities against. This fixes an issue where entities would not be activated when they should be. --- gradle.properties | 2 +- patches/server/0001-Build-changes.patch | 12 +- patches/server/0003-Threaded-Regions.patch | 791 ++++++++++-------- patches/server/0004-Max-pending-logins.patch | 4 +- ...-getHandle-and-overrides-perform-thr.patch | 56 +- ...0007-Disable-mid-tick-task-execution.patch | 4 +- ...edOperationException-for-broken-APIs.patch | 4 +- ...dates-in-non-loaded-or-non-owned-chu.patch | 12 +- ...access-when-waking-players-up-during.patch | 6 +- ...ccess-POI-data-for-lodestone-compass.patch | 9 +- ...ition-to-player-position-on-player-d.patch | 2 +- patches/server/0018-Region-profiler.patch | 58 +- 12 files changed, 506 insertions(+), 454 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6dd86dc..2b307b8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=dev.folia version=1.20.4-R0.1-SNAPSHOT mcVersion=1.20.4 -paperRef=07b956e3a30d9cd192111829b59bdf4372f128b1 +paperRef=4a98986e2881439fc018d847df2808e2f17f3a7d org.gradle.caching=true org.gradle.parallel=true diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch index 13327d0..31bc62c 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 58da26ad2f128ba0b66f86820f60853f4be352f0..38352926640d97449256d50ebdec619ce9e695a0 100644 +index 376e8983fdfdbb6c3e5fd8ad0f6a05e655b622bf..959e62d800de05b2dd77a252f442c3daf8438490 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,8 +13,12 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { @@ -23,7 +23,7 @@ index 58da26ad2f128ba0b66f86820f60853f4be352f0..38352926640d97449256d50ebdec619c // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -70,7 +74,7 @@ tasks.jar { +@@ -69,7 +73,7 @@ tasks.jar { attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", "Implementation-Title" to "CraftBukkit", @@ -32,7 +32,7 @@ index 58da26ad2f128ba0b66f86820f60853f4be352f0..38352926640d97449256d50ebdec619c "Implementation-Vendor" to date, // Paper "Specification-Title" to "Bukkit", "Specification-Version" to project.version, -@@ -154,7 +158,7 @@ fun TaskContainer.registerRunTask( +@@ -153,7 +157,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -93,10 +93,10 @@ index 9d687da5bdf398bb3f6c84cdf1249a7213d09f2e..e2f704c115fd6e00960bb56bb0779f11 ).openBufferedStream()) { JsonObject json = new Gson().fromJson(reader, JsonObject.class); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 34f19ac897a30c0c4e3ab406013fcca1c8b7db93..5ed6c8710b78458031ed6b0273fb2f6a5f482ea7 100644 +index 24430f9bf1b641a84e79b4b9b2e0ac5d16681ada..c7498b4ec41f0ae56530b948bd04c892a0f6d4a7 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1866,7 +1866,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> { @@ -10031,14 +10031,14 @@ index 2ae08b21c63490bbf8cd870f9585d82ed131f815..7dd63112b77f379eca17212e1eb8d041 private static class InnerUtil { // Attempt to hide these methods from ProtocolLib, so it doesn't accidently pick them up. diff --git a/src/main/java/net/minecraft/network/protocol/PacketUtils.java b/src/main/java/net/minecraft/network/protocol/PacketUtils.java -index c5c734b9eb80d1cdf0e9fd8a043f2b6d1f4cbffe..98fb69a9adeb6eaab199aec127692acb07f56808 100644 +index 3e2d5dcd62775b6ed7c0ce0ba51a71b635b1d644..98fb69a9adeb6eaab199aec127692acb07f56808 100644 --- a/src/main/java/net/minecraft/network/protocol/PacketUtils.java +++ b/src/main/java/net/minecraft/network/protocol/PacketUtils.java @@ -44,7 +44,7 @@ public class PacketUtils { public static void ensureRunningOnSameThread(Packet packet, T listener, BlockableEventLoop engine) throws RunningOnDifferentThreadException { if (!engine.isSameThread()) { -- engine.execute(() -> { // Paper - Fix preemptive player kick on a server shutdown. +- engine.execute(() -> { // Paper - Fix preemptive player kick on a server shutdown + Runnable run = () -> { // Folia - region threading packetProcessing.push(listener); // Paper - detailed watchdog information try { // Paper - detailed watchdog information @@ -10067,7 +10067,7 @@ index c5c734b9eb80d1cdf0e9fd8a043f2b6d1f4cbffe..98fb69a9adeb6eaab199aec127692acb // CraftBukkit start - SPIGOT-5477, MC-142590 } else if (MinecraftServer.getServer().hasStopped() || (listener instanceof ServerCommonPacketListenerImpl && ((ServerCommonPacketListenerImpl) listener).processedDisconnect)) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 5ed6c8710b78458031ed6b0273fb2f6a5f482ea7..ec1c5bf4b2e4a54e9df085331416bac0b42c601d 100644 +index c7498b4ec41f0ae56530b948bd04c892a0f6d4a7..301ff715b89abbebda83af1e15f8d5d15097002f 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -203,7 +203,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper -- net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper -- worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper +- net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers +- worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent + // Folia - region threading this.profiler.push(() -> { return worldserver + " " + worldserver.dimension().location(); -@@ -1714,7 +1795,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Folia - region threading - // Paper start - extend PlayerGameModeChangeEvent + // Paper start - Expand PlayerGameModeChangeEvent org.bukkit.event.player.PlayerGameModeChangeEvent event = serverPlayer.setGameMode(gameType, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, net.kyori.adventure.text.Component.empty()); if (event != null && event.isCancelled()) { source.sendSuccess(() -> io.papermc.paper.adventure.PaperAdventure.asVanilla(event.cancelMessage()), false); } - // Paper end + // Paper end - Expand PlayerGameModeChangeEvent + }, null, 1L); // Folia - region threading ++i; } @@ -11496,7 +11496,7 @@ index cbcacceb69dd032b70c39075c59cd8d50a77ea17..8ccbb9584bb9aeb8507ba35fd1ce22da } } diff --git a/src/main/java/net/minecraft/server/commands/GameModeCommand.java b/src/main/java/net/minecraft/server/commands/GameModeCommand.java -index 5cb15e2209d7b315904a1fc6d650ce1e75584271..4d2c88f23ba2280cba95cad41c80105a18139e73 100644 +index f7c9127346261d83413ca03a1cdaa84975ae17d6..a47b92b63c40666ce240514905d2a3b254a532bb 100644 --- a/src/main/java/net/minecraft/server/commands/GameModeCommand.java +++ b/src/main/java/net/minecraft/server/commands/GameModeCommand.java @@ -48,15 +48,18 @@ public class GameModeCommand { @@ -11504,7 +11504,7 @@ index 5cb15e2209d7b315904a1fc6d650ce1e75584271..4d2c88f23ba2280cba95cad41c80105a for(ServerPlayer serverPlayer : targets) { + serverPlayer.getBukkitEntity().taskScheduler.schedule((nmsEntity) -> { // Folia - region threading - // Paper start - extend PlayerGameModeChangeEvent + // Paper start - Expand PlayerGameModeChangeEvent org.bukkit.event.player.PlayerGameModeChangeEvent event = serverPlayer.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.COMMAND, net.kyori.adventure.text.Component.empty()); if (event != null && !event.isCancelled()) { logGamemodeChange(context.getSource(), serverPlayer, gameMode); @@ -11512,7 +11512,7 @@ index 5cb15e2209d7b315904a1fc6d650ce1e75584271..4d2c88f23ba2280cba95cad41c80105a + // Folia - region threading } else if (event != null && event.cancelMessage() != null) { context.getSource().sendSuccess(() -> io.papermc.paper.adventure.PaperAdventure.asVanilla(event.cancelMessage()), true); - // Paper end + // Paper end - Expand PlayerGameModeChangeEvent } + }, null, 1L); // Folia - region threading + ++i; // Folia - region threading @@ -11798,13 +11798,13 @@ index 342d7c12a26c6a211aae3db03ec3029c68ef650c..eda5bd9e1e1f1e1d41295874b239f503 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 d797637f61bdf8a424f56fbb48e28b7c9117d604..bc371ba154b9e08a5efc213b1bbda63d1bb347cc 100644 +index 15db9368227dbc29d07d74e85bd126b345b526b6..161ae9c5f9ff0e8cdf3bb3c6bb1d068607f9c2ad 100644 --- a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java +++ b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java @@ -43,7 +43,11 @@ public class SetSpawnCommand { ServerPlayer entityplayer = (ServerPlayer) iterator.next(); - // Paper start - PlayerSetSpawnEvent + // Paper start - Add PlayerSetSpawnEvent - if (entityplayer.setRespawnPosition(resourcekey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND)) { + // Folia start - region threading + entityplayer.getBukkitEntity().taskScheduler.schedule((ServerPlayer player) -> { @@ -11813,7 +11813,7 @@ index d797637f61bdf8a424f56fbb48e28b7c9117d604..bc371ba154b9e08a5efc213b1bbda63d + if (true) { // Folia end - region threading actualTargets.add(entityplayer); } - // Paper end + // Paper end - Add PlayerSetSpawnEvent diff --git a/src/main/java/net/minecraft/server/commands/SummonCommand.java b/src/main/java/net/minecraft/server/commands/SummonCommand.java index a7c89cdf20cb63792c76de81c1ff9f2cbbfcea84..12ebfcfe3aa70635bc5f8c0847977ac08376a074 100644 --- a/src/main/java/net/minecraft/server/commands/SummonCommand.java @@ -12140,7 +12140,7 @@ index 812f2adc6fc20aa126e629284fe594a923b24540..0a5e6961fb37e9a53cd39b1bd233e020 } } diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 58536aabf607015939a1326f80207c0a06eed8ff..12af517a7dd8c0bb2bc55ab3eb0e68a074011bb5 100644 +index 2b5f4ff619af8e23d759992f73551c054e2e5562..98ea5cecac2ab647acfb4d8bbea8ada9872cc4cd 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -442,9 +442,9 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -12184,7 +12184,7 @@ index 58536aabf607015939a1326f80207c0a06eed8ff..12af517a7dd8c0bb2bc55ab3eb0e68a0 if (waitableArray[0] != null) { //noinspection unchecked diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java -index 5afeb59ff25fed2d565407acacffec8383398006..047e817eae19800d146970a3ab44913ea1d17c89 100644 +index 627a88ec8c3b215b19b55a6d461c8754b4fcd1e8..4e8b325cad5ef1a59ac3ba725d3de6e43d0fd5d6 100644 --- a/src/main/java/net/minecraft/server/level/ChunkHolder.java +++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java @@ -81,7 +81,7 @@ public class ChunkHolder { @@ -12215,7 +12215,7 @@ index 5afeb59ff25fed2d565407acacffec8383398006..047e817eae19800d146970a3ab44913e // Paper end - optimise chunk tick iteration diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index ecb09c74153349e78bb81d1188c282e4be4000bf..27513071da19c4c37640a7538fa976d166fb5b09 100644 +index 673f0d1ee4e4228a52c07fc1b570822257e59300..bc1c0ce0a29654172afdfc30baee190208213216 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -137,77 +137,41 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider @@ -12793,10 +12793,10 @@ index ecb09c74153349e78bb81d1188c282e4be4000bf..27513071da19c4c37640a7538fa976d1 public void updatePlayer(ServerPlayer player) { org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot -@@ -1433,9 +1397,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1437,9 +1401,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider } } - // Paper end - check Y + // Paper end - Configurable entity tracking range by Y + // Folia start - region threading + if (flag && (this.entity instanceof ServerPlayer thisEntity) && thisEntity.broadcastedDeath) { + flag = false; @@ -13179,10 +13179,10 @@ index 44ada45d9bf2d9b48e5de1c3cb1a855902f3884b..a21cc9c7d5981c742f379affe9c1ef4d } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc4cc760f1 100644 +index 320f95af742ce2ae8cc4a8d9e727a4a573ed3214..a04ae14681880897132bd410680d8f69b1593795 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -194,36 +194,35 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -193,36 +193,35 @@ public class ServerLevel extends Level implements WorldGenLevel { public final ServerChunkCache chunkSource; private final MinecraftServer server; public final PrimaryLevelData serverLevelData; // CraftBukkit - type @@ -13223,12 +13223,12 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc public final LevelStorageSource.LevelStorageAccess convertable; public final UUID uuid; - public boolean hasPhysicsEvent = true; // Paper -- public boolean hasEntityMoveEvent = false; // Paper +- public boolean hasEntityMoveEvent = false; // Paper - Add EntityMoveEvent + // Folia - region threading private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) public static Throwable getAddToWorldStackTrace(Entity entity) { final Throwable thr = new Throwable(entity + " Added to world at " + new java.util.Date()); -@@ -259,6 +258,36 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -258,6 +257,36 @@ public class ServerLevel extends Level implements WorldGenLevel { ServerChunkCache chunkProvider = this.getChunkSource(); @@ -13265,7 +13265,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc for (int cx = minChunkX; cx <= maxChunkX; ++cx) { for (int cz = minChunkZ; cz <= maxChunkZ; ++cz) { if (chunkProvider.getChunkAtIfLoadedImmediately(cx, cz) == null) { -@@ -517,7 +546,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -516,7 +545,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public final int getRegionChunkShift() { // placeholder for folia @@ -13274,7 +13274,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } // Paper end - rewrite chunk system -@@ -572,14 +601,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -571,14 +600,14 @@ public class ServerLevel extends Level implements WorldGenLevel { } // Paper end // Paper start - lag compensation @@ -13292,7 +13292,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } // Paper end - lag compensation // Paper start - optimise nearby player retrieval -@@ -626,7 +655,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -625,7 +654,7 @@ public class ServerLevel extends Level implements WorldGenLevel { ServerPlayer nearest = null; double nearestDist = Double.MAX_VALUE; @@ -13301,7 +13301,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc double dist = player.distanceToSqr(x, y, z); if (dist >= nearestDist) { continue; -@@ -682,7 +711,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -681,7 +710,7 @@ public class ServerLevel extends Level implements WorldGenLevel { return nearest; } else { @@ -13310,7 +13310,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } } -@@ -691,6 +720,58 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -690,6 +719,58 @@ public class ServerLevel extends Level implements WorldGenLevel { return this.getNearestPlayer(targetPredicate, null, x, y, z); } // Paper end - optimise nearby player retrieval @@ -13369,7 +13369,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc // Add env and gen to constructor, IWorldDataServer -> WorldDataServer public ServerLevel(MinecraftServer minecraftserver, Executor executor, LevelStorageSource.LevelStorageAccess convertable_conversionsession, PrimaryLevelData iworlddataserver, ResourceKey resourcekey, LevelStem worlddimension, ChunkProgressListener worldloadlistener, boolean flag, long i, List list, boolean flag1, @Nullable RandomSequences randomsequences, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { -@@ -703,13 +784,13 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -702,13 +783,13 @@ public class ServerLevel extends Level implements WorldGenLevel { this.convertable = convertable_conversionsession; this.uuid = WorldUUID.getUUID(convertable_conversionsession.levelDirectory.path().toFile()); // CraftBukkit end @@ -13389,7 +13389,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc this.dragonParts = new Int2ObjectOpenHashMap(); this.tickTime = flag1; this.server = minecraftserver; -@@ -748,7 +829,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -747,7 +828,7 @@ public class ServerLevel extends Level implements WorldGenLevel { }); this.chunkSource.getGeneratorState().ensureStructuresGenerated(); this.portalForcer = new PortalForcer(this); @@ -13398,7 +13398,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc this.prepareWeather(); this.getWorldBorder().setAbsoluteMaxSize(minecraftserver.getAbsoluteMaxWorldSize()); this.raids = (Raids) this.getDataStorage().computeIfAbsent(Raids.factory(this), Raids.getFileId(this.dimensionTypeRegistration())); -@@ -775,7 +856,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -774,7 +855,14 @@ public class ServerLevel extends Level implements WorldGenLevel { this.chunkTaskScheduler = new io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler(this, io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.workerThreads); // Paper - rewrite chunk system this.entityLookup = new io.papermc.paper.chunk.system.entity.EntityLookup(this, new EntityCallbacks()); // Paper - rewrite chunk system @@ -13413,7 +13413,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc // Paper start @Override -@@ -808,44 +896,27 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -807,44 +895,27 @@ public class ServerLevel extends Level implements WorldGenLevel { return this.structureManager; } @@ -13466,7 +13466,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc if (flag) { this.tickTime(); } -@@ -853,11 +924,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -852,11 +923,11 @@ public class ServerLevel extends Level implements WorldGenLevel { gameprofilerfiller.popPush("tickPending"); this.timings.scheduledBlocks.startTiming(); // Paper if (!this.isDebug() && flag) { @@ -13481,7 +13481,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc gameprofilerfiller.pop(); } this.timings.scheduledBlocks.stopTiming(); // Paper -@@ -880,7 +951,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -879,7 +950,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.timings.doSounds.stopTiming(); // Spigot } @@ -13490,7 +13490,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc gameprofilerfiller.pop(); boolean flag1 = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players -@@ -892,20 +963,30 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -891,20 +962,30 @@ public class ServerLevel extends Level implements WorldGenLevel { gameprofilerfiller.push("entities"); this.timings.tickEntities.startTiming(); // Spigot if (this.dragonFight != null && flag) { @@ -13522,7 +13522,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc gameprofilerfiller.pop(); if (true || this.chunkSource.chunkMap.getDistanceManager().inEntityTickingRange(entity.chunkPosition().toLong())) { // Paper - now always true if in the ticking list Entity entity1 = entity.getVehicle(); -@@ -936,6 +1017,31 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -935,6 +1016,31 @@ public class ServerLevel extends Level implements WorldGenLevel { gameprofilerfiller.pop(); } @@ -13554,7 +13554,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc @Override public boolean shouldTickBlocksAt(long chunkPos) { // Paper start - replace player chunk loader system -@@ -946,11 +1052,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -945,11 +1051,12 @@ public class ServerLevel extends Level implements WorldGenLevel { protected void tickTime() { if (this.tickTime) { @@ -13571,7 +13571,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc this.setDayTime(this.levelData.getDayTime() + 1L); } -@@ -979,15 +1086,23 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -978,15 +1085,23 @@ public class ServerLevel extends Level implements WorldGenLevel { private void wakeUpAllPlayers() { this.sleepStatus.removeAllSleepers(); (this.players.stream().filter(LivingEntity::isSleeping).collect(Collectors.toList())).forEach((entityplayer) -> { // CraftBukkit - decompile error @@ -13598,7 +13598,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc ChunkPos chunkcoordintpair = chunk.getPos(); boolean flag = this.isRaining(); int j = chunkcoordintpair.getMinBlockX(); -@@ -995,7 +1110,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -994,7 +1109,7 @@ public class ServerLevel extends Level implements WorldGenLevel { ProfilerFiller gameprofilerfiller = this.getProfiler(); gameprofilerfiller.push("thunder"); @@ -13607,7 +13607,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - disable thunder blockposition.set(this.findLightningTargetAround(this.getBlockRandomPos(j, 0, k, 15))); // Paper -@@ -1051,7 +1166,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1050,7 +1165,7 @@ public class ServerLevel extends Level implements WorldGenLevel { int yPos = (sectionIndex + minSection) << 4; for (int a = 0; a < randomTickSpeed; ++a) { int tickingBlocks = section.tickingList.size(); @@ -13616,7 +13616,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc if (index >= tickingBlocks) { continue; } -@@ -1065,7 +1180,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1064,7 +1179,7 @@ public class ServerLevel extends Level implements WorldGenLevel { BlockPos blockposition2 = blockposition.set(j + randomX, randomY, k + randomZ); BlockState iblockdata = com.destroystokyo.paper.util.maplist.IBlockDataList.getBlockDataFromRaw(raw); @@ -13625,7 +13625,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } // We drop the fluid tick since LAVA is ALREADY TICKED by the above method (See LiquidBlock). // TODO CHECK ON UPDATE (ping the Canadian) -@@ -1170,7 +1285,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1169,7 +1284,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } public boolean isHandlingTick() { @@ -13634,7 +13634,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } public boolean canSleepThroughNights() { -@@ -1202,6 +1317,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1201,6 +1316,14 @@ public class ServerLevel extends Level implements WorldGenLevel { } public void updateSleepingPlayerList() { @@ -13649,7 +13649,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc if (!this.players.isEmpty() && this.sleepStatus.update(this.players)) { this.announceSleepStatus(); } -@@ -1213,7 +1336,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1212,7 +1335,7 @@ public class ServerLevel extends Level implements WorldGenLevel { return this.server.getScoreboard(); } @@ -13658,7 +13658,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc boolean flag = this.isRaining(); if (this.dimensionType().hasSkyLight()) { -@@ -1299,23 +1422,24 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1298,23 +1421,24 @@ public class ServerLevel extends Level implements WorldGenLevel { this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.THUNDER_LEVEL_CHANGE, this.thunderLevel)); } // */ @@ -13692,7 +13692,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } } // CraftBukkit end -@@ -1380,7 +1504,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1379,7 +1503,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public void tickNonPassenger(Entity entity) { // Paper start - log detailed entity tick information @@ -13701,7 +13701,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc try { if (currentlyTickingEntity.get() == null) { currentlyTickingEntity.lazySet(entity); -@@ -1413,7 +1537,16 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1412,7 +1536,16 @@ public class ServerLevel extends Level implements WorldGenLevel { if (isActive) { // Paper - EAR 2 TimingHistory.activatedEntityTicks++; entity.tick(); @@ -13719,7 +13719,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } else { entity.inactiveTick(); } // Paper - EAR 2 this.getProfiler().pop(); } finally { timer.stopTiming(); } // Paper - timings -@@ -1436,7 +1569,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1435,7 +1568,7 @@ public class ServerLevel extends Level implements WorldGenLevel { private void tickPassenger(Entity vehicle, Entity passenger) { if (!passenger.isRemoved() && passenger.getVehicle() == vehicle) { @@ -13728,7 +13728,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc // Paper - EAR 2 final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger); co.aikar.timings.Timing timer = isActive ? passenger.getType().passengerTickTimer.startTiming() : passenger.getType().passengerInactiveTickTimer.startTiming(); // Paper -@@ -1453,7 +1586,16 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1452,7 +1585,16 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper start - EAR 2 if (isActive) { passenger.rideTick(); @@ -13746,7 +13746,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } else { passenger.setDeltaMovement(Vec3.ZERO); passenger.inactiveTick(); -@@ -1541,7 +1683,15 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1540,7 +1682,15 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper - rewrite chunk system - entity saving moved into ChunkHolder } else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system @@ -13762,7 +13762,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc // CraftBukkit start - moved from MinecraftServer.saveChunks ServerLevel worldserver1 = this; -@@ -1549,12 +1699,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1548,12 +1698,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setCustomBossEvents(this.server.getCustomBossEvents().save()); this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData()); // CraftBukkit end @@ -13776,7 +13776,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc this.getChunkSource().getDataStorage().save(); } -@@ -1609,6 +1754,19 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1608,6 +1753,19 @@ public class ServerLevel extends Level implements WorldGenLevel { return list; } @@ -13796,7 +13796,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc @Nullable public ServerPlayer getRandomPlayer() { List list = this.getPlayers(LivingEntity::isAlive); -@@ -1711,8 +1869,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1710,8 +1868,8 @@ public class ServerLevel extends Level implements WorldGenLevel { } else { if (entity instanceof net.minecraft.world.entity.item.ItemEntity itemEntity && itemEntity.getItem().isEmpty()) return false; // Paper - Prevent empty items from being added // Paper start - capture all item additions to the world @@ -13806,8 +13806,8 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc + this.getCurrentWorldData().captureDrops.add((net.minecraft.world.entity.item.ItemEntity) entity); // Folia - region threading return true; } - // Paper end -@@ -1856,7 +2014,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + // Paper end - capture all item additions to the world +@@ -1855,7 +2013,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { @@ -13816,7 +13816,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc String s = "recursive call to sendBlockUpdated"; Util.logAndPauseIfInIde("recursive call to sendBlockUpdated", new IllegalStateException("recursive call to sendBlockUpdated")); -@@ -1869,7 +2027,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1868,7 +2026,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (Shapes.joinIsNotEmpty(voxelshape, voxelshape1, BooleanOp.NOT_SAME)) { List list = new ObjectArrayList(); @@ -13825,7 +13825,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc while (iterator.hasNext()) { // CraftBukkit start - fix SPIGOT-6362 -@@ -1892,7 +2050,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1891,7 +2049,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } try { @@ -13834,7 +13834,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc iterator = list.iterator(); while (iterator.hasNext()) { -@@ -1901,7 +2059,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1900,7 +2058,7 @@ public class ServerLevel extends Level implements WorldGenLevel { navigationabstract1.recomputePath(); } } finally { @@ -13843,7 +13843,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } } -@@ -1910,23 +2068,23 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1909,23 +2067,23 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void updateNeighborsAt(BlockPos pos, Block sourceBlock) { @@ -13872,7 +13872,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } @Override -@@ -1957,7 +2115,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1956,7 +2114,7 @@ public class ServerLevel extends Level implements WorldGenLevel { explosion.clearToBlow(); } @@ -13881,7 +13881,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc while (iterator.hasNext()) { ServerPlayer entityplayer = (ServerPlayer) iterator.next(); -@@ -1972,25 +2130,28 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1971,25 +2129,28 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void blockEvent(BlockPos pos, Block block, int type, int data) { @@ -13916,7 +13916,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } private boolean doBlockEvent(BlockEventData event) { -@@ -2001,12 +2162,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2000,12 +2161,12 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public LevelTicks getBlockTicks() { @@ -13931,7 +13931,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } @Nonnull -@@ -2030,7 +2191,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2029,7 +2190,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 @@ -13940,7 +13940,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } public int sendParticles(List receivers, @Nullable ServerPlayer sender, T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, boolean force) { // Paper end -@@ -2083,7 +2244,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2082,7 +2243,14 @@ public class ServerLevel extends Level implements WorldGenLevel { public Entity getEntityOrPart(int id) { Entity entity = (Entity) this.getEntities().get(id); @@ -13956,7 +13956,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } @Nullable -@@ -2261,6 +2429,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2260,6 +2428,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } public boolean setChunkForced(int x, int z, boolean forced) { @@ -13964,7 +13964,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc ForcedChunksSavedData forcedchunk = (ForcedChunksSavedData) this.getDataStorage().computeIfAbsent(ForcedChunksSavedData.factory(), "chunks"); ChunkPos chunkcoordintpair = new ChunkPos(x, z); long k = chunkcoordintpair.toLong(); -@@ -2269,7 +2438,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2268,7 +2437,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (forced) { flag1 = forcedchunk.getChunks().add(k); if (flag1) { @@ -13973,7 +13973,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } } else { flag1 = forcedchunk.getChunks().remove(k); -@@ -2297,13 +2466,18 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2296,13 +2465,18 @@ public class ServerLevel extends Level implements WorldGenLevel { BlockPos blockposition1 = pos.immutable(); optional.ifPresent((holder) -> { @@ -13992,11 +13992,11 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc optional1.ifPresent((holder) -> { - this.getServer().execute(() -> { + Runnable run = () -> { // Folia - region threading - // Paper start + // Paper start - Remove stale POIs if (optional.isEmpty() && this.getPoiManager().exists(blockposition1, poiType -> true)) { this.getPoiManager().remove(blockposition1); -@@ -2311,7 +2485,12 @@ public class ServerLevel extends Level implements WorldGenLevel { - // Paper end +@@ -2310,7 +2484,12 @@ public class ServerLevel extends Level implements WorldGenLevel { + // Paper end - Remove stale POIs this.getPoiManager().add(blockposition1, holder); DebugPackets.sendPoiAddedPacket(this, blockposition1); - }); @@ -14009,7 +14009,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc }); } } -@@ -2358,7 +2537,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2357,7 +2536,7 @@ public class ServerLevel extends Level implements WorldGenLevel { BufferedWriter bufferedwriter = Files.newBufferedWriter(path.resolve("stats.txt")); try { @@ -14018,7 +14018,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc NaturalSpawner.SpawnState spawnercreature_d = this.getChunkSource().getLastSpawnState(); if (spawnercreature_d != null) { -@@ -2372,7 +2551,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2371,7 +2550,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } bufferedwriter.write(String.format(Locale.ROOT, "entities: %s\n", this.entityLookup.getDebugInfo())); // Paper - rewrite chunk system @@ -14027,7 +14027,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc 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"); -@@ -2518,7 +2697,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2517,7 +2696,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); @@ -14036,7 +14036,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc while (iterator.hasNext()) { TickingBlockEntity tickingblockentity = (TickingBlockEntity) iterator.next(); -@@ -2531,7 +2710,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2530,7 +2709,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @VisibleForTesting public void clearBlockEvents(BoundingBox box) { @@ -14045,7 +14045,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc return box.isInside(blockactiondata.pos()); }); } -@@ -2540,7 +2719,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2539,7 +2718,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public void blockUpdated(BlockPos pos, Block block) { if (!this.isDebug()) { // CraftBukkit start @@ -14054,7 +14054,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc return; } // CraftBukkit end -@@ -2583,9 +2762,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2582,9 +2761,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @VisibleForTesting public String getWatchdogStats() { @@ -14065,7 +14065,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } private static String getTypeCount(Iterable items, Function classifier) { -@@ -2618,6 +2795,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2617,6 +2794,12 @@ public class ServerLevel extends Level implements WorldGenLevel { public static void makeObsidianPlatform(ServerLevel worldserver, Entity entity) { // CraftBukkit end BlockPos blockposition = ServerLevel.END_SPAWN_POINT; @@ -14078,7 +14078,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc int i = blockposition.getX(); int j = blockposition.getY() - 2; int k = blockposition.getZ(); -@@ -2630,11 +2813,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2629,11 +2812,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); }); @@ -14091,7 +14091,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc blockList.updateList(); } // CraftBukkit end -@@ -2655,13 +2834,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2654,13 +2833,14 @@ public class ServerLevel extends Level implements WorldGenLevel { } public void startTickingChunk(LevelChunk chunk) { @@ -14110,7 +14110,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } @Override -@@ -2683,7 +2863,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2682,7 +2862,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper end - rewrite chunk system } @@ -14119,7 +14119,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc // 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 -@@ -2749,16 +2929,16 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2748,16 +2928,16 @@ public class ServerLevel extends Level implements WorldGenLevel { public void onCreated(Entity entity) {} public void onDestroyed(Entity entity) { @@ -14139,7 +14139,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc // 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; -@@ -2769,6 +2949,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2768,6 +2948,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public void onTrackingStart(Entity entity) { org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot @@ -14147,7 +14147,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - moved down below valid=true if (entity instanceof ServerPlayer) { ServerPlayer entityplayer = (ServerPlayer) entity; -@@ -2786,7 +2967,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2785,7 +2966,7 @@ public class ServerLevel extends Level implements WorldGenLevel { Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -14156,7 +14156,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } if (entity instanceof EnderDragon) { -@@ -2797,7 +2978,9 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2796,7 +2977,9 @@ public class ServerLevel extends Level implements WorldGenLevel { for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -14166,7 +14166,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } } -@@ -2819,16 +3002,24 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2818,16 +3001,24 @@ public class ServerLevel extends Level implements WorldGenLevel { public void onTrackingEnd(Entity entity) { org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot @@ -14192,7 +14192,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc map.carriedByPlayers.remove( (Player) entity ); for ( Iterator iter = (Iterator) map.carriedBy.iterator(); iter.hasNext(); ) { -@@ -2838,6 +3029,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2837,6 +3028,7 @@ public class ServerLevel extends Level implements WorldGenLevel { iter.remove(); } } @@ -14200,7 +14200,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } } } ); -@@ -2872,7 +3064,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2871,7 +3063,7 @@ public class ServerLevel extends Level implements WorldGenLevel { Util.logAndPauseIfInIde("onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")); } @@ -14209,7 +14209,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc } if (entity instanceof EnderDragon) { -@@ -2883,13 +3075,16 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2882,13 +3074,16 @@ public class ServerLevel extends Level implements WorldGenLevel { for (int j = 0; j < i; ++j) { EnderDragonPart entitycomplexpart = aentitycomplexpart[j]; @@ -14227,7 +14227,7 @@ index 7c31f619a6e8e3539c547fc43d821d2cce7df7e7..8d3dca767e5928756e2767d60ca92fcc 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 be05a52be037042c6158100e2ce880b8ed415d53..e479129a977721fc8061be968eefab4daa407f5c 100644 +index 63aa403e032686905b4388024939cd8379c09f70..9a4481da26820f967d38ff582c256361936f957b 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -191,7 +191,7 @@ import org.bukkit.inventory.MainHand; @@ -14794,7 +14794,7 @@ index be05a52be037042c6158100e2ce880b8ed415d53..e479129a977721fc8061be968eefab4d this.removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DEATH); this.effectsDirty = true; diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index a0d69082f5fdeee15bba0d76b940aa48cff36fa9..ac35ee3dacda9e90fd96def1b325dd8e3d0ae6c5 100644 +index 1f122067f5863c386bc1e50769d33eda422defcc..760c5754030d01c2c01ca90df48276f9f43b9683 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -128,7 +128,7 @@ public class ServerPlayerGameMode { @@ -14828,12 +14828,12 @@ index a0d69082f5fdeee15bba0d76b940aa48cff36fa9..ac35ee3dacda9e90fd96def1b325dd8e // return true; // CraftBukkit } // CraftBukkit start -- java.util.List itemsToDrop = this.level.captureDrops; // Paper - store current list -- this.level.captureDrops = null; // Paper - Remove this earlier so that we can actually drop stuff -+ java.util.List itemsToDrop = this.level.getCurrentWorldData().captureDrops; // Paper - store current list // Folia - region threading -+ this.level.getCurrentWorldData().captureDrops = null; // Paper - Remove this earlier so that we can actually drop stuff // Folia - region threading +- java.util.List itemsToDrop = this.level.captureDrops; // Paper - capture all item additions to the world +- this.level.captureDrops = null; // Paper - capture all item additions to the world; Remove this earlier so that we can actually drop stuff ++ java.util.List itemsToDrop = this.level.getCurrentWorldData().captureDrops; // Paper - capture all item additions to the world // Folia - region threading ++ this.level.getCurrentWorldData().captureDrops = null; // Paper - capture all item additions to the world; Remove this earlier so that we can actually drop stuff // Folia - region threading if (event.isDropItems()) { - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, state, this.player, itemsToDrop); // Paper - use stored ref + org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, state, this.player, itemsToDrop); // Paper - capture all item additions to the world } diff --git a/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java b/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java index f382d138959b34bfc3a114bc9d96e056cccbfc89..100293099156978ff701bc6c9d8df94ba8282021 100644 @@ -14946,7 +14946,7 @@ index 658e63ebde81dc14c8ab5850fb246dc0aab25dea..7e1f15ac8d2f7c86d4aba1be5df71705 public static TicketType create(String name, Comparator argumentComparator) { return new TicketType<>(name, argumentComparator, 0L); diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java -index 14a5492428eac823a295ef3746d0aca6fbdab4ec..f06392b0515da3640720e115709fe98f86821024 100644 +index 5ece375eaf6bcc61864997a389bb5e24625e4505..33c1ef45ed620f8424c2c83dd30b674892ddffe3 100644 --- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java +++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java @@ -84,6 +84,13 @@ public class WorldGenRegion implements WorldGenLevel { @@ -14964,10 +14964,10 @@ index 14a5492428eac823a295ef3746d0aca6fbdab4ec..f06392b0515da3640720e115709fe98f this.generatingStatus = status; this.writeRadiusCutoff = placementRadius; diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index d28d0ef6105ddeb562ddf31ae9088739856941fc..062cc713ef5239f934139bb9e4071cf958e57e32 100644 +index 5d0500ee2740977c6b6eb89ed51e29b5a2e66760..bdeb70fdcd2985c9ffd7cfb77f75d1bd1eb49a02 100644 --- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -75,17 +75,29 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -75,6 +75,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack // CraftBukkit end } @@ -14977,10 +14977,11 @@ index d28d0ef6105ddeb562ddf31ae9088739856941fc..062cc713ef5239f934139bb9e4071cf9 + @Override public void onDisconnect(Component reason) { - // Paper start - this.onDisconnect(reason, null); + // Paper start - Fix kick event leave message not being sent +@@ -82,10 +86,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } public void onDisconnect(Component reason, @Nullable net.kyori.adventure.text.Component quitMessage) { + // Paper end - Fix kick event leave message not being sent + // Folia start - region threading + if (this.handledDisconnect) { + // avoid retiring scheduler twice @@ -14988,7 +14989,6 @@ index d28d0ef6105ddeb562ddf31ae9088739856941fc..062cc713ef5239f934139bb9e4071cf9 + } + this.handledDisconnect = true; + // Folia end - region threading - // Paper end if (this.isSingleplayerOwner()) { ServerCommonPacketListenerImpl.LOGGER.info("Stopping singleplayer server as player logged out"); this.server.halt(false); @@ -15117,23 +15117,23 @@ index cae10b963d153fb1777b18054796a45b2809342b..080a25714937e8413c4e9d15eb257f72 } catch (Exception exception) { ServerConfigurationPacketListenerImpl.LOGGER.error("Couldn't place player in world", exception); diff --git a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java -index 79326308f6126f84a3cbb3d5a33302de048d8a50..81090d1b5d67506268a41c6387a1d45302e88a5c 100644 +index 1e33cabcdf2c6c4894024bdcc1a479b2d120f944..35bf160d10b56fb84d4cb845b61c1d61337e48ca 100644 --- a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java +++ b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java @@ -158,10 +158,13 @@ public class ServerConnectionListener { }); } - // Paper end + // Paper end - Add support for proxy protocol - pending.add(object); // Paper + // Folia - connection fixes - move down ((Connection) object).configurePacketHandler(channelpipeline); ((Connection) object).setListenerForServerboundHandshake(new ServerHandshakePacketListenerImpl(ServerConnectionListener.this.server, (Connection) object)); - io.papermc.paper.network.ChannelInitializeListenerHolder.callListeners(channel); // Paper + io.papermc.paper.network.ChannelInitializeListenerHolder.callListeners(channel); // Paper - Add Channel initialization listeners + // Folia start - regionised threading + io.papermc.paper.threadedregions.RegionizedServer.getInstance().addConnection(object); + // Folia end - regionised threading } - }).group(eventloopgroup).localAddress(address)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit // Paper + }).group(eventloopgroup).localAddress(address)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit // Paper - Unix domain socket support } @@ -224,7 +227,7 @@ public class ServerConnectionListener { // Spigot Start @@ -15145,7 +15145,7 @@ index 79326308f6126f84a3cbb3d5a33302de048d8a50..81090d1b5d67506268a41c6387a1d453 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 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59cfaca430 100644 +index ba6d22426398546b70760c2205ce625cead11803..f6e4d034379d40b39c2ed3de13fa263bc83758ea 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -292,7 +292,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -15222,7 +15222,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 } @Override -@@ -515,9 +541,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -512,9 +538,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // Paper end - fix large move vectors killing the server // CraftBukkit start - handle custom speeds and skipped ticks @@ -15235,7 +15235,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 ++this.receivedMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount; -@@ -591,7 +618,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -588,7 +615,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } entity.absMoveTo(d3, d4, d5, f, f1); @@ -15244,7 +15244,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 // Paper start - optimise out extra getCubes boolean teleportBack = flag2; // violating this is always a fail -@@ -604,11 +631,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -601,11 +628,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } if (teleportBack) { // Paper end - optimise out extra getCubes entity.absMoveTo(d0, d1, d2, f, f1); @@ -15265,7 +15265,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 // CraftBukkit start - fire PlayerMoveEvent Player player = this.getCraftPlayer(); if (!this.hasMoved) { -@@ -648,7 +683,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -645,7 +680,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { @@ -15274,7 +15274,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } -@@ -656,7 +691,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -653,7 +688,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. // We only do this if the Event was not cancelled. if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { @@ -15283,7 +15283,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } -@@ -772,13 +807,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -769,13 +804,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // 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 @@ -15299,7 +15299,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } // Paper end -@@ -803,7 +838,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -800,7 +835,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (!event.isHandled()) { if (!event.isCancelled()) { @@ -15308,7 +15308,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 ParseResults parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack()); this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { -@@ -819,7 +854,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -816,7 +851,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions())); // Paper end - Brigadier API }); @@ -15317,7 +15317,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 } } else if (!completions.isEmpty()) { final com.mojang.brigadier.suggestion.SuggestionsBuilder builder0 = new com.mojang.brigadier.suggestion.SuggestionsBuilder(command, stringreader.getTotalLength()); -@@ -1133,7 +1168,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1132,7 +1167,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl 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!"); @@ -15326,7 +15326,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } byteTotal += byteLength; -@@ -1156,17 +1191,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1155,17 +1190,17 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); @@ -15348,7 +15348,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 // CraftBukkit end int i = packet.getSlot(); -@@ -1186,7 +1221,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1185,7 +1220,19 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.updateBookContents(list1, i); }; @@ -15369,7 +15369,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 } } -@@ -1374,9 +1421,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1371,9 +1418,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl int i = this.receivedMovePacketCount - this.knownMovePacketCount; // CraftBukkit start - handle custom speeds and skipped ticks @@ -15382,7 +15382,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 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); -@@ -1569,7 +1617,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1566,7 +1614,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // If the event is cancelled we move the player back to their old location. if (event.isCancelled()) { @@ -15391,7 +15391,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } -@@ -1577,7 +1625,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1574,7 +1622,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. // We only do this if the Event was not cancelled. if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { @@ -15400,7 +15400,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } -@@ -1809,9 +1857,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1806,9 +1854,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (!this.player.isSpectator()) { // limit how quickly items can be dropped // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. @@ -15412,7 +15412,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 } else { // Else we increment the drop count and check the amount. this.dropCount++; -@@ -1839,7 +1887,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1836,7 +1884,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl case ABORT_DESTROY_BLOCK: case STOP_DESTROY_BLOCK: // Paper start - Don't allow digging in unloaded chunks @@ -15421,7 +15421,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 this.player.connection.ackBlockChangesUpTo(packet.getSequence()); return; } -@@ -1923,7 +1971,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1920,7 +1968,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl BlockPos blockposition = movingobjectpositionblock.getBlockPos(); Vec3 vec3d1 = Vec3.atCenterOf(blockposition); @@ -15430,7 +15430,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 Vec3 vec3d2 = vec3d.subtract(vec3d1); double d0 = 1.0000001D; -@@ -2037,7 +2085,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2034,7 +2082,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Entity entity = packet.getEntity(worldserver); if (entity != null) { @@ -15439,25 +15439,25 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } } -@@ -2074,7 +2122,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2071,7 +2119,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // CraftBukkit end ServerGamePacketListenerImpl.LOGGER.info("{} lost connection: {}", this.player.getName().getString(), reason.getString()); -- this.removePlayerFromWorld(quitMessage); // Paper -+ if (!this.waitingForSwitchToConfig) this.removePlayerFromWorld(quitMessage); // Paper // Folia - region threading - super.onDisconnect(reason, quitMessage); // Paper +- this.removePlayerFromWorld(quitMessage); // Paper - Fix kick event leave message not being sent ++ if (!this.waitingForSwitchToConfig) this.removePlayerFromWorld(quitMessage); // Paper - Fix kick event leave message not being sent // Folia - region threading + super.onDisconnect(reason, quitMessage); // Paper - Fix kick event leave message not being sent } -@@ -2083,6 +2131,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2080,6 +2128,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.removePlayerFromWorld(null); } + public boolean hackSwitchingConfig; // Folia - rewrite login process + private void removePlayerFromWorld(@Nullable net.kyori.adventure.text.Component quitMessage) { - // Paper end + // Paper end - Fix kick event leave message not being sent this.chatMessageChain.close(); -@@ -2095,6 +2145,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2092,6 +2142,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.disconnect(); // Paper start - Adventure quitMessage = quitMessage == null ? this.server.getPlayerList().remove(this.player) : this.server.getPlayerList().remove(this.player, quitMessage); // Paper - pass in quitMessage to fix kick message not being used @@ -15466,7 +15466,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 if ((quitMessage != null) && !quitMessage.equals(net.kyori.adventure.text.Component.empty())) { this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(quitMessage), false); // Paper end -@@ -2147,7 +2199,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2144,7 +2196,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // CraftBukkit end if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.message())) { @@ -15476,7 +15476,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 } else { Optional optional = this.tryHandleChat(packet.lastSeenMessages()); -@@ -2179,21 +2233,22 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2176,21 +2230,22 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @Override public void handleChatCommand(ServerboundChatCommandPacket packet) { if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.command())) { @@ -15502,7 +15502,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 } } -@@ -2327,7 +2382,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2324,7 +2379,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl String originalFormat = event.getFormat(), originalMessage = event.getMessage(); this.cserver.getPluginManager().callEvent(event); @@ -15511,7 +15511,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 // Evil plugins still listening to deprecated event final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); queueEvent.setCancelled(event.isCancelled()); -@@ -2438,6 +2493,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2435,6 +2490,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (s.isEmpty()) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send an empty message"); } else if (this.getCraftPlayer().isConversing()) { @@ -15519,7 +15519,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 final String conversationInput = s; this.server.processQueue.add(new Runnable() { @Override -@@ -2674,8 +2730,25 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2671,8 +2727,25 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl // Spigot End public void switchToConfig() { @@ -15546,7 +15546,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 this.send(new ClientboundStartConfigurationPacket()); } -@@ -2700,7 +2773,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2697,7 +2770,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetLastActionTime(); this.player.setShiftKeyDown(packet.isUsingSecondaryAction()); @@ -15555,7 +15555,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 if (!worldserver.getWorldBorder().isWithinBounds(entity.blockPosition())) { return; } -@@ -2841,6 +2914,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2838,6 +2911,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl switch (packetplayinclientcommand_enumclientcommand) { case PERFORM_RESPAWN: if (this.player.wonGame) { @@ -15566,9 +15566,9 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 + } + // 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, RespawnReason.END_PORTAL, 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 - Expand PlayerRespawnEvent CriteriaTriggers.CHANGED_DIMENSION.trigger(this.player, Level.END, Level.OVERWORLD); -@@ -2849,6 +2928,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2846,6 +2925,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return; } @@ -15586,9 +15586,9 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 + 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 -@@ -3207,7 +3298,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - // Paper start + this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent +@@ -3204,7 +3295,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + // Paper start - auto recipe limit if (!org.bukkit.Bukkit.isPrimaryThread()) { if (this.recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) { - this.server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause @@ -15596,7 +15596,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 return; } } -@@ -3376,7 +3467,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -3373,7 +3464,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.filterTextPacket(list).thenAcceptAsync((list1) -> { this.updateSignText(packet, list1); @@ -15617,7 +15617,7 @@ index 8b630fc4da8a7fda08c416e70c22463f04c3b6b5..f171d25e60adfd30ad274e854592cf59 private void updateSignText(ServerboundSignUpdatePacket packet, List signText) { diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 8ce2fd887d9c2cf86fa4ec0332b70681f1572911..5834d5e10c0b9892f29977666e7b168a9463a3d9 100644 +index 399786839bb9dbf96d2ecd654f999cb944cf2822..586027a4c97a3c1be42f1c8d5a248e2672bb6489 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -83,9 +83,13 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, @@ -15636,7 +15636,7 @@ index 8ce2fd887d9c2cf86fa4ec0332b70681f1572911..5834d5e10c0b9892f29977666e7b168a } if (this.state == ServerLoginPacketListenerImpl.State.WAITING_FOR_DUPE_DISCONNECT && !this.isPlayerAlreadyInWorld((GameProfile) Objects.requireNonNull(this.authenticatedProfile))) { -@@ -200,7 +204,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -205,7 +209,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, })); } @@ -15645,15 +15645,15 @@ index 8ce2fd887d9c2cf86fa4ec0332b70681f1572911..5834d5e10c0b9892f29977666e7b168a if (flag) { this.state = ServerLoginPacketListenerImpl.State.WAITING_FOR_DUPE_DISCONNECT; -@@ -320,7 +324,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, - uniqueId = gameprofile.getId(); - // Paper end +@@ -325,7 +329,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, + uniqueId = gameprofile.getId(); + // Paper end - Add more fields to AsyncPlayerPreLoginEvent -- if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { -+ if (false && PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { // Folia - region threading - final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); - if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { - event.disallow(asyncEvent.getResult(), asyncEvent.kickMessage()); // Paper - Adventure +- if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { ++ if (false && PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { // Folia - region threading + final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); + if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { + event.disallow(asyncEvent.getResult(), asyncEvent.kickMessage()); // Paper - Adventure diff --git a/src/main/java/net/minecraft/server/players/BanListEntry.java b/src/main/java/net/minecraft/server/players/BanListEntry.java index 8b1da1fb5ca27432a39aff6dbc452b793268dab5..e83f3676d5a194fa8d3d1567edcb4b6f7847a4c1 100644 --- a/src/main/java/net/minecraft/server/players/BanListEntry.java @@ -15707,7 +15707,7 @@ index 8b1da1fb5ca27432a39aff6dbc452b793268dab5..e83f3676d5a194fa8d3d1567edcb4b6f // Guess we don't have a date } diff --git a/src/main/java/net/minecraft/server/players/OldUsersConverter.java b/src/main/java/net/minecraft/server/players/OldUsersConverter.java -index c24898f8e81e8ab9a1f90bf4439ea6c6f42f0508..ce4f2239e99e94285186b46bdcd40f1dcdc3553e 100644 +index 59eb65e207ff0206b0dfad6f2dcffe785f61f8ff..d568f54a14a1321a0478c220e72dba797b88523e 100644 --- a/src/main/java/net/minecraft/server/players/OldUsersConverter.java +++ b/src/main/java/net/minecraft/server/players/OldUsersConverter.java @@ -511,7 +511,7 @@ public class OldUsersConverter { @@ -15720,7 +15720,7 @@ index c24898f8e81e8ab9a1f90bf4439ea6c6f42f0508..ce4f2239e99e94285186b46bdcd40f1d 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 e98a455b6bca9d094d0da323bddd7b3f2c07bb23..184057aae74e8918bf05ab03429cb0419ae9ba06 100644 +index fef047544dbbd24ef30b673ebb92c1a047575d09..8284cde1984408a97a933f4299ad8541e7a015ca 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -131,10 +131,10 @@ public abstract class PlayerList { @@ -15796,7 +15796,7 @@ index e98a455b6bca9d094d0da323bddd7b3f2c07bb23..184057aae74e8918bf05ab03429cb041 server.console = new com.destroystokyo.paper.console.TerminalConsoleCommandSender(); // Paper @@ -178,7 +225,7 @@ public abstract class PlayerList { } - abstract public void loadAndSaveFiles(); // Paper - moved from DedicatedPlayerList constructor + abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor - public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie clientData) { + public void loadSpawnForNewPlayer(final Connection connection, final ServerPlayer player, final CommonListenerCookie clientData, org.apache.commons.lang3.mutable.MutableObject data, org.apache.commons.lang3.mutable.MutableObject lastKnownName, ca.spottedleaf.concurrentutil.completable.Completable toComplete) { // Folia - region threading - rewrite login process @@ -15878,15 +15878,15 @@ index e98a455b6bca9d094d0da323bddd7b3f2c07bb23..184057aae74e8918bf05ab03429cb041 final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); @@ -359,8 +434,7 @@ public abstract class PlayerList { - ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); // Paper + ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); // Paper - Add Listing API for Player - final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - use single player info update packet + final List onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - Use single player info update packet on join - for (int i = 0; i < this.players.size(); ++i) { - ServerPlayer entityplayer1 = (ServerPlayer) this.players.get(i); -+ for (ServerPlayer entityplayer1 : this.players) { // Folia - region threadingv ++ for (ServerPlayer entityplayer1 : this.players) { // Folia - region threading if (entityplayer1.getBukkitEntity().canSee(bukkitPlayer)) { - // Paper start + // Paper start - Add Listing API for Player @@ -482,7 +556,7 @@ public abstract class PlayerList { // Paper start - Add to collideRule team if needed final net.minecraft.world.scores.Scoreboard scoreboard = this.getServer().getLevel(Level.OVERWORLD).getScoreboard(); @@ -15984,7 +15984,7 @@ index e98a455b6bca9d094d0da323bddd7b3f2c07bb23..184057aae74e8918bf05ab03429cb041 @@ -819,6 +886,11 @@ public abstract class PlayerList { public ServerPlayer respawn(ServerPlayer entityplayer, ServerLevel worldserver, boolean flag, Location location, boolean avoidSuffocation, RespawnReason reason, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag...respawnFlags) { - // Paper end + // Paper end - Expand PlayerRespawnEvent + // Folia start - region threading + if (true) { + throw new UnsupportedOperationException("Must use teleportAsync while in region threading"); @@ -16351,7 +16351,7 @@ index 9c99b2e365aacb8309f29acb9025faccd2c676b3..d02bc26812321745795d2f0bc3705add public Component getDeathMessage() { diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -index 25a5a3b949a0eb632611355e74ccd4865be108ca..1df8d601e41c2ab35921b6a1534fdec6e6353954 100644 +index fc6903b20a6e084729306fc960a6fc80e094f76c..31635964ee2cc73e04c1661521df2956ed5a1089 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java @@ -106,13 +106,13 @@ public class DamageSource { @@ -16384,10 +16384,10 @@ index ea27b46eec01bda427653335f922ccd068cffcb5..e551d3b875eab6851b75041f418c9a08 return blockToFallLocation(blockState); } else { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605ef20856f 100644 +index d0bbf39caddb801e670fe8618e723724b030190d..1ee49570e9c3250d1d3ce0420a0a0c94cda717fe 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -167,7 +167,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -169,7 +169,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // Paper start public static RandomSource SHARED_RANDOM = new RandomRandomSource(); @@ -16396,7 +16396,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 private boolean locked = false; @Override -@@ -241,7 +241,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -243,7 +243,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData; // Paper public boolean collisionLoadChunks = false; // Paper @@ -16405,7 +16405,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 public @org.jetbrains.annotations.Nullable net.minecraft.server.level.ChunkMap.TrackedEntity tracker; // Paper public @Nullable Throwable addedToWorldStack; // Paper - entity debug -@@ -535,6 +535,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -537,6 +537,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.teleportTo(worldserver, null); } // Paper end - make end portalling safe @@ -16431,7 +16431,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 public boolean isLegacyTrackingEntity = false; -@@ -542,28 +561,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -544,28 +563,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.isLegacyTrackingEntity = isLegacyTrackingEntity; } @@ -16461,7 +16461,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 // Paper end - optimise entity tracking public Entity(EntityType type, Level world) { -@@ -811,6 +809,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -813,6 +811,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // CraftBukkit start public void postTick() { @@ -16474,7 +16474,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 // 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(); -@@ -833,7 +837,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -835,7 +839,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.walkDistO = this.walkDist; this.xRotO = this.getXRot(); this.yRotO = this.getYRot(); @@ -16483,7 +16483,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); } -@@ -942,11 +946,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -944,11 +948,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // This will be called every single tick the entity is in lava, so don't throw an event this.setSecondsOnFire(15, false); } @@ -16497,7 +16497,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls } -@@ -1091,8 +1095,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1093,8 +1097,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } else { this.wasOnFire = this.isOnFire(); if (movementType == MoverType.PISTON) { @@ -16508,7 +16508,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 movement = this.limitPistonMovement(movement); if (movement.equals(Vec3.ZERO)) { return; -@@ -3000,7 +3004,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3001,7 +3005,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.passengers = ImmutableList.copyOf(list); } @@ -17351,26 +17351,26 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 protected void removeAfterChangingDimensions() { this.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); } -@@ -4663,7 +5452,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4658,7 +5447,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } } - // Paper end - fix MC-4 + // Paper end - Fix MC-4 - if (this.position.x != x || this.position.y != y || this.position.z != z) { + boolean posChanged = this.position.x != x || this.position.y != y || this.position.z != z; // Folia - region threading + if (posChanged) { // Folia - region threading synchronized (this.posLock) { // Paper this.position = new Vec3(x, y, z); } // Paper -@@ -4684,7 +5474,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4679,7 +5469,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S - // Paper start - never allow AABB to become desynced from position + // Paper start - Block invalid positions and bounding box; don't allow desync of pos and AABB // hanging has its own special logic - if (!(this instanceof net.minecraft.world.entity.decoration.HangingEntity) && (forceBoundingBoxUpdate || this.position.x != x || this.position.y != y || this.position.z != z)) { + if (!(this instanceof net.minecraft.world.entity.decoration.HangingEntity) && (forceBoundingBoxUpdate || posChanged)) { this.setBoundingBox(this.makeBoundingBox()); } - // Paper end -@@ -4771,6 +5561,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S + // Paper end - Block invalid positions and bounding box +@@ -4766,6 +5556,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return this.removalReason != null; } @@ -17383,7 +17383,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 @Nullable public Entity.RemovalReason getRemovalReason() { return this.removalReason; -@@ -4786,6 +5582,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4781,6 +5577,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } // Paper end - rewrite chunk system final boolean alreadyRemoved = this.removalReason != null; @@ -17393,7 +17393,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 if (this.removalReason == null) { this.removalReason = reason; } -@@ -4808,6 +5607,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4803,6 +5602,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.removalReason = null; } @@ -17405,7 +17405,7 @@ index 1be10c57e374ad4018c08d96cfb69397a2f541d3..630d668dddc6dfc8a3b6dd0b021ad605 /** * Invoked only when the entity is truly removed from the server, never to be added to any world. diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index bc908b75cb99536df658281ae7f8b4eeedbbedc9..46b835f65ec64720efa54cc524f16a3fa536e90b 100644 +index f0d565ac0b3c8d3c3a200348a16e7db21ff3920a..36ec42505505af86b1a63bd8cfea5a88f4569c74 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -275,6 +275,13 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -17448,7 +17448,7 @@ index bc908b75cb99536df658281ae7f8b4eeedbbedc9..46b835f65ec64720efa54cc524f16a3f } } -@@ -851,9 +861,9 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -852,9 +862,9 @@ public abstract class LivingEntity extends Entity implements Attackable { } this.hurtTime = nbt.getShort("HurtTime"); @@ -17460,15 +17460,15 @@ index bc908b75cb99536df658281ae7f8b4eeedbbedc9..46b835f65ec64720efa54cc524f16a3f String s = nbt.getString("Team"); PlayerTeam scoreboardteam = this.level().getScoreboard().getPlayerTeam(s); if (!this.level().paperConfig().scoreboards.allowNonPlayerEntitiesOnScoreboards && !(this instanceof net.minecraft.world.entity.player.Player)) { scoreboardteam = null; } // Paper -@@ -1139,6 +1149,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1140,6 +1150,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public boolean addEffect(MobEffectInstance mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause, boolean fireEvent) { - // Paper end + // Paper end - Don't fire sync event during generation // org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API + if (!this.hasNullCallback()) 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)); return true; -@@ -2336,7 +2347,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2337,7 +2348,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Nullable public LivingEntity getKillCredit() { @@ -17477,16 +17477,16 @@ index bc908b75cb99536df658281ae7f8b4eeedbbedc9..46b835f65ec64720efa54cc524f16a3f } public final float getMaxHealth() { -@@ -3479,7 +3490,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3480,7 +3491,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); this.level().getProfiler().pop(); - // Paper start + // Paper start - Add EntityMoveEvent - if (((ServerLevel) this.level()).hasEntityMoveEvent && !(this instanceof net.minecraft.world.entity.player.Player)) { + if (((ServerLevel) this.level()).getCurrentWorldData().hasEntityMoveEvent && !(this instanceof net.minecraft.world.entity.player.Player)) { // Folia - region threading if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location (this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); -@@ -4173,7 +4184,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4174,7 +4185,7 @@ public abstract class LivingEntity extends Entity implements Attackable { BlockPos blockposition = BlockPos.containing(d0, d1, d2); Level world = this.level(); @@ -17496,7 +17496,7 @@ index bc908b75cb99536df658281ae7f8b4eeedbbedc9..46b835f65ec64720efa54cc524f16a3f while (!flag2 && blockposition.getY() > world.getMinBuildHeight()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index a7fbd329ea6d36a46c00b4476c74e426dbbfe238..cdcca7c9a9635151584f094814ab4902d9eb7595 100644 +index 5e51fd71bb6bc679ea6df3f021b46aa555be3cf2..4e770f3b781be4c282d1e81c327fb2fb06b5af1f 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -137,6 +137,14 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -17554,7 +17554,7 @@ index a7fbd329ea6d36a46c00b4476c74e426dbbfe238..cdcca7c9a9635151584f094814ab4902 if (i % 2 != 0 && this.tickCount > 1) { this.level().getProfiler().push("targetSelector"); -@@ -1750,6 +1770,15 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1750,6 +1770,17 @@ public abstract class Mob extends LivingEntity implements Targeting { this.goalSelector.removeAllGoals(predicate); } @@ -17562,7 +17562,9 @@ index a7fbd329ea6d36a46c00b4476c74e426dbbfe238..cdcca7c9a9635151584f094814ab4902 + @Override + protected void postRemoveAfterChangingDimensions() { + this.getAllSlots().forEach((itemstack) -> { -+ if (!itemstack.isEmpty()) itemstack.setCount(0); // CraftBukkit ++ if (!itemstack.isEmpty()) { ++ itemstack.setCount(0); ++ } + }); + } + // Folia end - region threading - move inventory clearing until after the dimension change @@ -17570,10 +17572,10 @@ index a7fbd329ea6d36a46c00b4476c74e426dbbfe238..cdcca7c9a9635151584f094814ab4902 @Override protected void removeAfterChangingDimensions() { super.removeAfterChangingDimensions(); -@@ -1758,12 +1787,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1758,12 +1789,7 @@ public abstract class Mob extends LivingEntity implements Targeting { this.level().getCraftServer().getPluginManager().callEvent(event); // CraftBukkit this.dropLeash(true, event.isDropLeash()); - // Paper end + // Paper end - Expand EntityUnleashEvent - this.getAllSlots().forEach((itemstack) -> { - if (!itemstack.isEmpty()) { - itemstack.setCount(0); @@ -17624,7 +17626,7 @@ index 8ec07578c1e41997a2e5ef158885ad3f4c2a31b6..003d85261bc0df871a8247c193e2b45c context.>get(mobs).stream().filter((mob) -> { return mob instanceof Villager && mob != entity; diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.java -index ca0a2191f5bfb3c44c1ddacab8b7a874c2f44cc1..293b0a99e2c9bf151179381c637f70e2c302781f 100644 +index c0da573e3818a1dd2c1ef5a61c7cb34934b0a252..d34a3018264ec196ef57151af3c1d584b0576c68 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.java @@ -70,7 +70,7 @@ public class FollowOwnerGoal extends Goal { @@ -17637,7 +17639,7 @@ index ca0a2191f5bfb3c44c1ddacab8b7a874c2f44cc1..293b0a99e2c9bf151179381c637f70e2 private boolean unableToMove() { @@ -96,7 +96,7 @@ public class FollowOwnerGoal extends Goal { - if (this.tamable.distanceToSqr(this.owner) <= 16 * 16) this.tamable.getLookControl().setLookAt(this.owner, 10.0F, (float) this.tamable.getMaxHeadXRot()); // Paper + if (this.tamable.distanceToSqr(this.owner) <= 16 * 16) this.tamable.getLookControl().setLookAt(this.owner, 10.0F, (float) this.tamable.getMaxHeadXRot()); // Paper - Limit pet look distance if (--this.timeToRecalcPath <= 0) { this.timeToRecalcPath = this.adjustedTickDelay(10); - if (this.tamable.distanceToSqr((Entity) this.owner) >= 144.0D) { @@ -17959,15 +17961,15 @@ index a87a34b0c4c8e5d0cf079025c230b1434c919b54..cbb0ebf003f5d832be1937aa886802df } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index de51ce9875e12961e6e549e87d76f492d2f19787..8c9470bc0dd2d1a5bfbdc4921f4063bdfccd6924 100644 +index f760ce7d9df79ef58f8963de3e901cba3e12fcaa..03bd7038bda7bd3bf592eab39ec6d985e07e3b8d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java @@ -364,7 +364,7 @@ public class Cat extends TamableAnimal implements VariantHolder { }); ServerLevel worldserver = world.getLevel(); -- if (worldserver.structureManager().getStructureWithPieceAt(this.blockPosition(), StructureTags.CATS_SPAWN_AS_BLACK, world).isValid()) { // Paper - fix deadlock -+ if (world.structureManager().getStructureWithPieceAt(this.blockPosition(), StructureTags.CATS_SPAWN_AS_BLACK).isValid()) { // Paper - fix deadlock // Folia - region threading - properly fix this +- if (worldserver.structureManager().getStructureWithPieceAt(this.blockPosition(), StructureTags.CATS_SPAWN_AS_BLACK, world).isValid()) { // Paper - Fix swamp hut cat generation deadlock ++ if (world.structureManager().getStructureWithPieceAt(this.blockPosition(), StructureTags.CATS_SPAWN_AS_BLACK).isValid()) { // Paper - Fix swamp hut cat generation deadlock // Folia - region threading - properly fix this this.setVariant((CatVariant) BuiltInRegistries.CAT_VARIANT.getOrThrow(CatVariant.ALL_BLACK)); this.setPersistenceRequired(); } @@ -17988,7 +17990,7 @@ index d8056421249c8e75e96a55ec07dce84d2bba9c5c..68e8e82f4c3406b1ed5c079e68806f89 @Override diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index 69912c5b300b67394dce3876d2d96872033cf156..19e8b2d13c627281be3b66ecc56194b3fbc9a39d 100644 +index 80303f9466b8c7097151be313afc9a383693d18a..d53905cafc7bf257907e6c9b9ea2ba97fb266361 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java @@ -298,8 +298,10 @@ public class ItemFrame extends HangingEntity { @@ -18003,7 +18005,7 @@ index 69912c5b300b67394dce3876d2d96872033cf156..19e8b2d13c627281be3b66ecc56194b3 }); 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 45c07733f03b5c11f6d8e820f65dc950c70d9a67..acf2bfe7421774c1a8d8ac1a23b34880df6cab6a 100644 +index 21a4669b01e9c57100224e20500bc23f8e101434..9e35c0c493962b70607649af08d800b4ca29b188 100644 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java @@ -295,9 +295,9 @@ public class FallingBlockEntity extends Entity { @@ -18019,7 +18021,7 @@ index 45c07733f03b5c11f6d8e820f65dc950c70d9a67..acf2bfe7421774c1a8d8ac1a23b34880 boolean flag = this.blockState.is(BlockTags.ANVIL); diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index a39db702063887cf530f272deaf4f334047cc7d4..f640dca8837496f9603d6d3115dd1d935bd692fd 100644 +index 292c343683de4701418d2a9e14158e49f595c1f2..ba130ad4936d8e8bed8d028492dc0c6dbd51d496 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java @@ -54,7 +54,7 @@ public class ItemEntity extends Entity implements TraceableEntity { @@ -18030,7 +18032,7 @@ index a39db702063887cf530f272deaf4f334047cc7d4..f640dca8837496f9603d6d3115dd1d93 + //private int lastTick = MinecraftServer.currentTick - 1; // CraftBukkit // Folia - region threading public boolean canMobPickup = true; // Paper private int despawnRate = -1; // Paper - public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper + public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API @@ -144,13 +144,11 @@ public class ItemEntity extends Entity implements TraceableEntity { this.discard(); } else { @@ -18111,7 +18113,7 @@ index a39db702063887cf530f272deaf4f334047cc7d4..f640dca8837496f9603d6d3115dd1d93 return entity; } diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java -index c3e47426382296d650fa00ce0bc1a82bf23c7877..3163a74e8225a64d763e5a8f0787240280a5116c 100644 +index 2274541c9386e4f1bbae489a1f123d502ccbf9cc..b0b50f1398d0b5dbc8b482aa94c8b5d7296891e4 100644 --- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java +++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java @@ -71,7 +71,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { @@ -18146,7 +18148,7 @@ index 30ea3f64234fd1fda8dada3c7fb12be0730322a8..395c7763db5f748911639336e3274d4c } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 753defa8f8b48d004a2a53b2fc322fd9c083d95e..07025fb304b5ac3ae7c4362fe61560d22caabf1b 100644 +index 142650302dbab411e37bc1957825e3db0c50deac..f2fdc5607b3292c585aab151f6ff8d6fcba83cd3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -95,7 +95,7 @@ public class Zombie extends Monster { @@ -18189,7 +18191,7 @@ index 753defa8f8b48d004a2a53b2fc322fd9c083d95e..07025fb304b5ac3ae7c4362fe61560d2 this.getEntityData().set(Zombie.DATA_DROWNED_CONVERSION_ID, true); } diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 94396ad1a3c280787d36c6c18256d10340ace488..8fb13d9ed74e254522e6ee7196a6c72ccc8092b7 100644 +index 7de9d012e7416eaa0189b513a0972c846e93c4b6..9375c3732114f7a993ea96ed71531940af38c628 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java @@ -73,7 +73,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -18223,7 +18225,7 @@ index 94396ad1a3c280787d36c6c18256d10340ace488..8fb13d9ed74e254522e6ee7196a6c72c @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java -index 5a591c439c5cef6b7e7e6f836ab813cb4f29b08c..ce728f062794e239d1dfdf842d7d0c725f77fba7 100644 +index 4e6c2f6b2e54a4c126e9a026b9cad05ce835ad66..d2fbeb0e4e3e681b22455b9cf2d125dcb4de0a56 100644 --- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java @@ -212,10 +212,18 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa @@ -18275,7 +18277,7 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..cb0f75fb32836efa50f0a86dfae7907b return 0; } else { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 11935e5b16324af572b07c5b173708f5a91f8289..c8de034a2bf4654bad9a6e8a9aa831b2f90fad14 100644 +index 5c2010fb247462433bed6ae58d88a72c4e137ede..a7857a7d141a552f800d7becd130e0cf1660e886 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -203,7 +203,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -18305,7 +18307,7 @@ index 11935e5b16324af572b07c5b173708f5a91f8289..c8de034a2bf4654bad9a6e8a9aa831b2 } }); diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java -index 8385eb1d60f377da94e3178ab506feefb43563fd..2f57e5025d0a0e720f49da1e5231a7d98495d13e 100644 +index d7bddedb19c10f62fd1f7d3128453ad706ed16be..948749a0a3ef9d06f0482bc5331a52836a6eb6a3 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java @@ -32,16 +32,14 @@ public class WanderingTraderSpawner implements CustomSpawner { @@ -18322,7 +18324,7 @@ index 8385eb1d60f377da94e3178ab506feefb43563fd..2f57e5025d0a0e720f49da1e5231a7d9 public WanderingTraderSpawner(ServerLevelData properties) { this.serverLevelData = properties; - // Paper start + // Paper start - Add Wandering Trader spawn rate config options - this.tickDelay = Integer.MIN_VALUE; + //this.tickDelay = Integer.MIN_VALUE; // Folia - region threading - moved to regionisedworlddata //this.spawnDelay = properties.getWanderingTraderSpawnDelay(); // Paper - This value is read from the world file only for the first spawn, after which vanilla uses a hardcoded value @@ -18333,7 +18335,7 @@ index 8385eb1d60f377da94e3178ab506feefb43563fd..2f57e5025d0a0e720f49da1e5231a7d9 @Override public int tick(ServerLevel world, boolean spawnMonsters, boolean spawnAnimals) { + io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading - // Paper start + // Paper start - Add Wandering Trader spawn rate config options - if (this.tickDelay == Integer.MIN_VALUE) { - this.tickDelay = world.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength; - this.spawnDelay = world.paperConfig().entities.spawning.wanderingTrader.spawnDayLength; @@ -18376,7 +18378,7 @@ index 8385eb1d60f377da94e3178ab506feefb43563fd..2f57e5025d0a0e720f49da1e5231a7d9 } else if (this.spawn(world)) { - this.spawnChance = world.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin; + worldData.wanderingTraderSpawnChance = world.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin; // Folia - region threading - // Paper end + // Paper end - Add Wandering Trader spawn rate config options return 1; } else { @@ -97,7 +96,7 @@ public class WanderingTraderSpawner implements CustomSpawner { @@ -18398,7 +18400,7 @@ index 8385eb1d60f377da94e3178ab506feefb43563fd..2f57e5025d0a0e720f49da1e5231a7d9 entityvillagertrader.setWanderTarget(blockposition1); entityvillagertrader.restrictTo(blockposition1, 16); diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index ccc1caafb0ada52c7b99b7358253826f5390843e..9fc136aae606691e133d2e56eefb52f510a23843 100644 +index 9044458491fc9a33923852e324a15ac59d6660b2..542bc7657f21d0a987a865e495360eeffe0d934a 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -1519,6 +1519,14 @@ public abstract class Player extends LivingEntity { @@ -18417,7 +18419,7 @@ index ccc1caafb0ada52c7b99b7358253826f5390843e..9fc136aae606691e133d2e56eefb52f5 return false; } diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index b61a367048c3d6dfef187fef35a5dc7471f891d0..4ff6e41210e28b4ca397d25a7ced00b4ed7d31ab 100644 +index 5a2144417783f859729fc93281edd9d577c59ca2..6264a02c0bef70618787dce262d80681231f32f4 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -156,6 +156,11 @@ public abstract class AbstractArrow extends Projectile { @@ -18505,7 +18507,7 @@ index b2f08889139dc447f7071f1c81456035bf8de31e..619bedc55d61f83dbc5adcf76a739cf9 } } 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 a2093158e57d5f43c4afa66386481b82b3c4c3c4..762376c2ab61200681fd5e5732337530285e03fb 100644 +index 5706c9b744b660d6f7639b8152dce82799c4b466..67e4a0eea8312cf6389a374c12e5fd054ec6284b 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java +++ b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java @@ -104,7 +104,7 @@ public class FishingHook extends Projectile { @@ -18574,12 +18576,12 @@ index 0bbe853f7df93f9dcd2b21d762939f8b6be069aa..4f4d6dedb99feac995e9b5bdf1d5c9f1 HitResult movingobjectposition = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); 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 2f058cec80c6ef7a5a5ca065dc6c9fe353c521de..dd204b547ea0981cf82c567cc497364ee221f09b 100644 +index 5b6d5c799cc8e601a01b6967917e15ba1e2db721..8bd77418e7303443640bfa9ac0e3c6ce1f808b8c 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -70,9 +70,20 @@ public abstract class Projectile extends Entity implements TraceableEntity { } - // Paper end + // Paper end - Refresh ProjectileSource for projectiles + // Folia start - region threading + // In general, this is an entire mess. At the time of writing, there are fifty usages of getOwner. @@ -18596,7 +18598,7 @@ index 2f058cec80c6ef7a5a5ca065dc6c9fe353c521de..dd204b547ea0981cf82c567cc497364e + 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 + this.refreshProjectileSource(false); // Paper - Refresh ProjectileSource for projectiles return this.cachedOwner; @@ -304,7 +315,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { @@ -18788,7 +18790,7 @@ index eaa2943b667967f93f28d9d794d702fdaeb670ec..8fc22de1aa17cd8cb52d3804533d56cb while (iterator.hasNext()) { ServerPlayer entityplayer = (ServerPlayer) iterator.next(); diff --git a/src/main/java/net/minecraft/world/entity/raid/Raider.java b/src/main/java/net/minecraft/world/entity/raid/Raider.java -index cdbc925ef61b8b439415f0a89368227890bcecb2..6ad770b8ea068638c31a3a04fbbd84ddd294bb3c 100644 +index 226fb5c88dd43c8008c5237299ef80db9e847af7..1c47705148815537b1ae67ef6d8b1379e4c0b1b4 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raider.java +++ b/src/main/java/net/minecraft/world/entity/raid/Raider.java @@ -91,7 +91,7 @@ public abstract class Raider extends PatrollingMonster { @@ -18965,7 +18967,7 @@ index 42d87800a328f71c5127ce5599ca4c71cc9bb1cd..4b08175b71e7f92e9bb578f9f6c2c0ef } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 5b8a1f31e0b55da15daa4ab271317e4393a87e96..4c6420d870c62a8d684d6f331d63fc73c7874af2 100644 +index 46c7c36a07169915f7409f1146e5066e8ac65c21..a7ebeaf507c131897f3c75084112180c856b065c 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -378,31 +378,32 @@ public final class ItemStack { @@ -18974,7 +18976,7 @@ index 5b8a1f31e0b55da15daa4ab271317e4393a87e96..4c6420d870c62a8d684d6f331d63fc73 ServerLevel world = (ServerLevel) context.getLevel(); + io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading - if (!(item instanceof BucketItem/* || item instanceof SolidBucketItem*/)) { // if not bucket // Paper - capture block states for snow buckets + if (!(item instanceof BucketItem/* || item instanceof SolidBucketItem*/)) { // if not bucket // Paper - Fix cancelled powdered snow bucket placement - world.captureBlockStates = true; + worldData.captureBlockStates = true; // Folia - region threading // special case bonemeal @@ -19026,7 +19028,7 @@ index 5b8a1f31e0b55da15daa4ab271317e4393a87e96..4c6420d870c62a8d684d6f331d63fc73 + worldData.capturedBlockStates.clear(); // Folia - region threading 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 + } else if (blocks.size() == 1 && item != Items.POWDER_SNOW_BUCKET) { // Paper - Fix cancelled powdered snow bucket placement @@ -448,13 +449,13 @@ public final class ItemStack { enuminteractionresult = InteractionResult.FAIL; // cancel placement // PAIL: Remove this when MC-99075 fixed @@ -19043,7 +19045,7 @@ index 5b8a1f31e0b55da15daa4ab271317e4393a87e96..4c6420d870c62a8d684d6f331d63fc73 + worldData.preventPoiUpdated = false; // Folia - region threading // Brute force all possible updates - // Paper start - don't resync blocks + // Paper start - Don't resync blocks @@ -471,7 +472,7 @@ public final class ItemStack { this.setCount(newCount); } @@ -19142,7 +19144,7 @@ index 3aa73cd44aa8c86b78c35bc1788e4f83018c49ed..cfead7686da25d2cd9203256962170d7 } diff --git a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java b/src/main/java/net/minecraft/world/level/BaseCommandBlock.java -index d4ff8c6b7801e33be4ff69b8bae13c09f4872c4b..b7ee6b31d03cd554b229b440b1d5ef6c9ddd2fb5 100644 +index 524b0f1086c01888fe0b76e180c40915d16a1eb9..50b3025189938374886c7e2725dd3e4d54ac2160 100644 --- a/src/main/java/net/minecraft/world/level/BaseCommandBlock.java +++ b/src/main/java/net/minecraft/world/level/BaseCommandBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.phys.Vec3; @@ -19162,7 +19164,7 @@ index d4ff8c6b7801e33be4ff69b8bae13c09f4872c4b..b7ee6b31d03cd554b229b440b1d5ef6c if (!world.isClientSide && world.getGameTime() != this.lastExecution) { if ("Searge".equalsIgnoreCase(this.command)) { this.lastOutput = Component.literal("#itzlipofutzli"); -@@ -169,11 +170,13 @@ public abstract class BaseCommandBlock implements CommandSource { +@@ -169,11 +170,14 @@ public abstract class BaseCommandBlock implements CommandSource { } @@ -19171,7 +19173,7 @@ index d4ff8c6b7801e33be4ff69b8bae13c09f4872c4b..b7ee6b31d03cd554b229b440b1d5ef6c @Override public void sendSystemMessage(Component message) { if (this.trackOutput) { -- org.spigotmc.AsyncCatcher.catchOp("sendSystemMessage to a command block"); // Paper + org.spigotmc.AsyncCatcher.catchOp("sendSystemMessage to a command block"); // Paper - Don't broadcast messages to command blocks - SimpleDateFormat simpledateformat = BaseCommandBlock.TIME_FORMAT; + this.threadCheck(); // Folia + SimpleDateFormat simpledateformat = BaseCommandBlock.TIME_FORMAT.get(); // Folia - region threading - SDF is not thread-safe @@ -19179,7 +19181,7 @@ index d4ff8c6b7801e33be4ff69b8bae13c09f4872c4b..b7ee6b31d03cd554b229b440b1d5ef6c this.lastOutput = Component.literal("[" + simpledateformat.format(date) + "] ").append(message); diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java -index aaa07fcd4b32fe0de88142ab30378327a01f1729..08884cc7d787887b470e90897838969d50dc4ad9 100644 +index ff0b7b9e4ae3aa0c170d05bc51fd7ff26e7531ee..b37d36e5ecac85a383216e5c85bebb99e3367251 100644 --- a/src/main/java/net/minecraft/world/level/EntityGetter.java +++ b/src/main/java/net/minecraft/world/level/EntityGetter.java @@ -38,6 +38,12 @@ public interface EntityGetter { @@ -19272,7 +19274,7 @@ index aaa07fcd4b32fe0de88142ab30378327a01f1729..08884cc7d787887b470e90897838969d 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 9442f58dff89ec843c321533965fbee2727d02f8..2a2ea56384bbbd5d7800c3f4c1eb56cd03ef0ec1 100644 +index 210b6d71207b99e66ba014b176b2c1445053b1d1..53dc4270590ea41c068e35004dab27e1e053abcb 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -584,7 +584,7 @@ public class Explosion { @@ -19316,7 +19318,7 @@ index 9442f58dff89ec843c321533965fbee2727d02f8..2a2ea56384bbbd5d7800c3f4c1eb56cd private final double posX, posY, posZ; private final double minX, minY, minZ; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 6403341f2e9d7ac4251336cb0bcc5d79dbb7bb0e..f2597960643a37c79ad189254b7073e22d607347 100644 +index 0c1d7265dee638642f7c868e2f988af7b59e6d7e..7334a522956649fdf606b560d52e127c2f500b5d 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -120,10 +120,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -19360,7 +19362,7 @@ index 6403341f2e9d7ac4251336cb0bcc5d79dbb7bb0e..f2597960643a37c79ad189254b7073e2 - public boolean captureBlockStates = false; - public boolean captureTreeGeneration = false; - public Map capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper -- public Map capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper +- public Map capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper - Retain block place order when capturing blockstates - public List captureDrops; + // Folia - region threading - moved to regionised data public final it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap ticksPerSpawnCategory = new it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap<>(); @@ -19374,7 +19376,7 @@ index 6403341f2e9d7ac4251336cb0bcc5d79dbb7bb0e..f2597960643a37c79ad189254b7073e2 + // Folia - region threading - moved to regionised data + // Folia - region threading public final org.spigotmc.SpigotWorldConfig spigotConfig; // Spigot - // Paper start + // Paper start - add paper world config private final io.papermc.paper.configuration.WorldConfiguration paperConfig; @@ -183,9 +173,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public static BlockPos lastPhysicsProblem; // Spigot @@ -19420,9 +19422,9 @@ index 6403341f2e9d7ac4251336cb0bcc5d79dbb7bb0e..f2597960643a37c79ad189254b7073e2 + } + // Folia end - region ticking + - protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor + protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config; Async-Anti-Xray: Pass executor this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot - this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper + this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config @@ -256,7 +273,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.thread = Thread.currentThread(); this.biomeManager = new BiomeManager(this, i); @@ -19501,7 +19503,7 @@ index 6403341f2e9d7ac4251336cb0bcc5d79dbb7bb0e..f2597960643a37c79ad189254b7073e2 @@ -1039,7 +1058,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { iblockdata1.updateIndirectNeighbourShapes(this, blockposition, k, j - 1); // Don't call an event for the old block to limit event spam CraftWorld world = ((ServerLevel) this).getWorld(); - boolean cancelledUpdates = false; // Paper + boolean cancelledUpdates = false; // Paper - Fix block place logic - if (world != null && ((ServerLevel)this).hasPhysicsEvent) { // Paper + if (world != null && ((ServerLevel)this).getCurrentWorldData().hasPhysicsEvent) { // Paper // Folia - region threading BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata)); @@ -19789,7 +19791,7 @@ index 12eaafdbd324fa36b3f46c3b644bc8117a4123ad..c8c358a2ce567567159039ed6a1ba804 @Deprecated default boolean hasChunksAt(int minX, int minZ, int maxX, int maxZ) { diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 3cdddda9c0618e95288b81b975d499c8dd30c05f..5caca2a34849189ea42d2699f6d8672e0d7251cb 100644 +index 46d743db099e69e10f5534aafdd7aa5eda67dec9..1d082e977442790504e3ca70a90dabd69b522622 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -146,7 +146,7 @@ public final class NaturalSpawner { @@ -19819,32 +19821,34 @@ index 3d377b9e461040405e0a7dcbd72d1506b48eb44e..782890e227ff9dab44dd92327979c201 // CraftBukkit start this.addFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT); diff --git a/src/main/java/net/minecraft/world/level/StructureManager.java b/src/main/java/net/minecraft/world/level/StructureManager.java -index 09c85ed428b8eaf51f8b3c6e45cce925f05ab354..3d797880b5964dd07f3757495ea1255a034aad89 100644 +index b59581b92aed0bc1b09008c695b0b112c3e65743..e91f36528862c0ee4c5b5d765113fdaf1be487e8 100644 --- a/src/main/java/net/minecraft/world/level/StructureManager.java +++ b/src/main/java/net/minecraft/world/level/StructureManager.java -@@ -44,11 +44,8 @@ public class StructureManager { +@@ -44,12 +44,9 @@ public class StructureManager { } public List startsForStructure(ChunkPos pos, Predicate predicate) { -- // Paper start +- // Paper start - Fix swamp hut cat generation deadlock - return this.startsForStructure(pos, predicate, null); - } - public List startsForStructure(ChunkPos pos, Predicate predicate, @Nullable ServerLevelAccessor levelAccessor) { - Map map = (levelAccessor == null ? this.level : levelAccessor).getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences(); +- // Paper end - Fix swamp hut cat generation deadlock + // Folia - region threading -+ Map map = this.level.getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences(); - // Paper end ++ Map map = this.level.getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences(); // Folia - region threading ++ // Paper end ImmutableList.Builder builder = ImmutableList.builder(); + for(Map.Entry entry : map.entrySet()) { @@ -113,18 +110,14 @@ public class StructureManager { } public StructureStart getStructureWithPieceAt(BlockPos pos, TagKey structureTag) { -- // Paper start +- // Paper start - Fix swamp hut cat generation deadlock - return this.getStructureWithPieceAt(pos, structureTag, null); - } - public StructureStart getStructureWithPieceAt(BlockPos pos, TagKey structureTag, @Nullable ServerLevelAccessor levelAccessor) { -- // Paper end +- // Paper end - Fix swamp hut cat generation deadlock + // Folia - region threading Registry registry = this.registryAccess().registryOrThrow(Registries.STRUCTURE); @@ -19852,7 +19856,7 @@ index 09c85ed428b8eaf51f8b3c6e45cce925f05ab354..3d797880b5964dd07f3757495ea1255a return registry.getHolder(registry.getId(structure)).map((reference) -> { return reference.is(structureTag); }).orElse(false); -- }, levelAccessor)) { // Paper +- }, levelAccessor)) { // Paper - Fix swamp hut cat generation deadlock + })) { // Paper // Folia - region threading if (this.structureHasPieceAt(pos, structureStart)) { return structureStart; @@ -19867,7 +19871,7 @@ index 09c85ed428b8eaf51f8b3c6e45cce925f05ab354..3d797880b5964dd07f3757495ea1255a } diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index 04b1aa22ac1df39d274f27d9c93e0492a8a673f8..2599e0f62ef172340c54c80c997f7a652faddedb 100644 +index 8677dc684bd2e0bb3cf5f77b659ce02b79627e76..da7d65595efee6731b1d87810b4220182bfcccb5 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java @@ -367,7 +367,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock @@ -19880,7 +19884,7 @@ index 04b1aa22ac1df39d274f27d9c93e0492a8a673f8..2599e0f62ef172340c54c80c997f7a65 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index e21867d3956078bb0db4ceed45e5811e9acd7377..237e4ddf454bdcbda24420d156ed19ec694d3616 100644 +index 73d6f881a7d4d8ff96040d34ac502e5b0937d577..326f5931f35e7528a8b801be6d92d62cebf83823 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java @@ -397,8 +397,8 @@ public class Block extends BlockBehaviour implements ItemLike { @@ -19908,13 +19912,13 @@ index bed3d9c781c7d3ca260027b4737970889a54689c..46c81d73813c6607d95062358e6e3cd0 } } diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index a9629a102c4fa4e5720e63fcf4590e9231426c62..5ae6509b3f4d66fece987bd5c39426c402dcca74 100644 +index 88ca50038b483fe5c207ef5c2bf3ea87540e147e..db07c9233a4e92dc5f505af6141c0c0ccf7ae5d3 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java @@ -122,9 +122,9 @@ public class CactusBlock extends Block { @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { - if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper + if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent - CraftEventFactory.blockDamage = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); // CraftBukkit + CraftEventFactory.blockDamageRT.set(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ())); // CraftBukkit // Folia - region threading entity.hurt(world.damageSources().cactus(), 1.0F); @@ -19924,12 +19928,12 @@ index a9629a102c4fa4e5720e63fcf4590e9231426c62..5ae6509b3f4d66fece987bd5c39426c4 @Override diff --git a/src/main/java/net/minecraft/world/level/block/CampfireBlock.java b/src/main/java/net/minecraft/world/level/block/CampfireBlock.java -index 7302d07c6ff69608e75ac52fdb19f2ec1d105129..cdd0c10fea2684c70bb2295ff6bc2ea8f303cc58 100644 +index 20dbfeb68ac33ee8ba8214edcca0d7f7ce1be58e..925dee7941a81e5dd454bf026a216d2c6a52f745 100644 --- a/src/main/java/net/minecraft/world/level/block/CampfireBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CampfireBlock.java @@ -110,9 +110,9 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { - if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper + if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent if ((Boolean) state.getValue(CampfireBlock.LIT) && entity instanceof LivingEntity && !EnchantmentHelper.hasFrostWalker((LivingEntity) entity)) { - org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = CraftBlock.at(world, pos); // CraftBukkit + org.bukkit.craftbukkit.event.CraftEventFactory.blockDamageRT.set(CraftBlock.at(world, pos)); // CraftBukkit // Folia - region threading @@ -19953,7 +19957,7 @@ index de6f00d03223939386aa2ccfdec1e696a68313d7..eb7c2c5b762dbadbe9ccbddc37757bdf } diff --git a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java -index 52e92ffd6bf5d3d721807a0b3a8e2d301951f934..ed6c84ba826ead1071c56923e457aa6e3c26a66b 100644 +index 1ee863ec252872deb15a6b96f1d937c672ce5898..33820e1325d6296bd4b36871088fe52fa265eba3 100644 --- a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java @@ -49,7 +49,7 @@ public class DispenserBlock extends BaseEntityBlock { @@ -19968,14 +19972,14 @@ index 52e92ffd6bf5d3d721807a0b3a8e2d301951f934..ed6c84ba826ead1071c56923e457aa6e @@ -105,7 +105,7 @@ public class DispenserBlock extends BaseEntityBlock { if (idispensebehavior != DispenseItemBehavior.NOOP) { - if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockPreDispenseEvent(world, pos, itemstack, i)) return; // Paper - BlockPreDispenseEvent is called here + if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockPreDispenseEvent(world, pos, itemstack, i)) return; // Paper - Add BlockPreDispenseEvent - DispenserBlock.eventFired = false; // CraftBukkit - reset event status + DispenserBlock.eventFired.set(Boolean.FALSE); // CraftBukkit - reset event status // Folia - region threading tileentitydispenser.setItem(i, idispensebehavior.dispense(sourceblock, itemstack)); } diff --git a/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java b/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java -index a6a257027d60bfda8cb975eca7f255fb1bd1e8d5..57e9cf0d9350e3b966562bf4b18b4c1debb835df 100644 +index 03b5ab8251497c0c94467f90e6663a0dc766babb..4fb595a8300ce2b163540603c7a2b002869a84c1 100644 --- a/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DoublePlantBlock.java @@ -102,7 +102,7 @@ public class DoublePlantBlock extends BushBlock { @@ -19988,7 +19992,7 @@ index a6a257027d60bfda8cb975eca7f255fb1bd1e8d5..57e9cf0d9350e3b966562bf4b18b4c1d } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -index 59bbdead2ebd8965d222540c7243dde051bbcc4b..a1c85bc25fda64bc4677b7a6934b40ad31f5bed0 100644 +index 47eb8bf604a63259c0200cada1403dc005a6cbac..e78c5364e086d29c88dac8a1e993b1d6c1bc6d96 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java @@ -92,8 +92,8 @@ public class FarmBlock extends Block { @@ -20019,7 +20023,7 @@ index 50d7235cf2ef036451db708c45a063d037051ae9..c0433491be43bb8cc6d00e32edf7699a // CraftBukkit end ((ConfiguredFeature) holder.value()).place(world, world.getChunkSource().getGenerator(), random, pos); diff --git a/src/main/java/net/minecraft/world/level/block/HoneyBlock.java b/src/main/java/net/minecraft/world/level/block/HoneyBlock.java -index b9d89cce40e4cbeaf98eeb85c254db353e573c95..cfdc8a8337053ddef92b572109256d592160d3ae 100644 +index 39e2fe8c5f5a2a4d4f3a7be3645923b5a1dca875..21b5a5abad737243f3d44ae3aa40aed9f67ab26f 100644 --- a/src/main/java/net/minecraft/world/level/block/HoneyBlock.java +++ b/src/main/java/net/minecraft/world/level/block/HoneyBlock.java @@ -87,7 +87,7 @@ public class HoneyBlock extends HalfTransparentBlock { @@ -20061,7 +20065,7 @@ index 10f5ffacc72a5e0116e2599ca83ee57a5b1ce0eb..64253e85e87c823d5ead285587496f6f super.stepOn(world, pos, state, entity); diff --git a/src/main/java/net/minecraft/world/level/block/MushroomBlock.java b/src/main/java/net/minecraft/world/level/block/MushroomBlock.java -index 7368c76a01275223a7bd3df1d36e80a15f66edbb..da1444e6ac3dd5d785763126b1e2ab2b96de7ff6 100644 +index 96f9ca2439a617b5f90b826d4fc99c857301b1c2..b5d85501b188525d88268bfb6d6997cf09f4719e 100644 --- a/src/main/java/net/minecraft/world/level/block/MushroomBlock.java +++ b/src/main/java/net/minecraft/world/level/block/MushroomBlock.java @@ -105,7 +105,7 @@ public class MushroomBlock extends BushBlock implements BonemealableBlock { @@ -20074,7 +20078,7 @@ index 7368c76a01275223a7bd3df1d36e80a15f66edbb..da1444e6ac3dd5d785763126b1e2ab2b return true; } else { diff --git a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java -index bd22d3fdecbc992b11073a74d854b7d1b43c3f6a..999e601a369ca6817ea21286d439ffd724a2f769 100644 +index e310abaca79615caaa75d92183a57242734266a3..ea78392580e2cc71fd95a682ec69774f56699fd3 100644 --- a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java @@ -150,9 +150,9 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate @@ -20090,7 +20094,7 @@ index bd22d3fdecbc992b11073a74d854b7d1b43c3f6a..999e601a369ca6817ea21286d439ffd7 super.fallOn(world, state, pos, entity, fallDistance); } diff --git a/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java b/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java -index 507be06ad51b7a212e28d3ca6680e0e4b00f4233..bf0e67921d96edde46a97543099f9c03634fca11 100644 +index 7339795addfeaedc3c8a7db03f73546fb5fba06b..875a776d5aa1399808e5d5eab1c608dd35011c85 100644 --- a/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java @@ -69,7 +69,7 @@ public class RedStoneWireBlock extends Block { @@ -20183,7 +20187,7 @@ index 507be06ad51b7a212e28d3ca6680e0e4b00f4233..bf0e67921d96edde46a97543099f9c03 + if (io.papermc.paper.configuration.WorldConfiguration.Misc.RedstoneImplementation.VANILLA == io.papermc.paper.configuration.WorldConfiguration.Misc.RedstoneImplementation.ALTERNATE_CURRENT) { // Folia - region threading world.getWireHandler().onWireUpdated(pos); } else - // Paper end + // Paper end - optimize redstone (Alternate Current) @@ -552,12 +552,12 @@ public class RedStoneWireBlock extends Block { @Override @@ -20306,7 +20310,7 @@ index 836c86104ed4f0d375330c9123af5d502efefa4d..68bd6dfb3b99b8e524f808effd129927 if (treeType != null) { event = new StructureGrowEvent(location, treeType, false, null, blocks); diff --git a/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java b/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java -index 1acdf9dad2621a20b077c5f88dab5e0f8688a38f..8db4aab2ca8b0f6b5d9c58bea17d2394a7f460d8 100644 +index 35a70bd30bc4beb06de4bb6e305ec3a787b43044..aaece21bcafc8b76c2c5e2f63458ac596a892bc1 100644 --- a/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java @@ -55,7 +55,7 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock { @@ -20315,11 +20319,11 @@ index 1acdf9dad2621a20b077c5f88dab5e0f8688a38f..8db4aab2ca8b0f6b5d9c58bea17d2394 public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { - if (this instanceof GrassBlock && world.paperConfig().tickRates.grassSpread != 1 && (world.paperConfig().tickRates.grassSpread < 1 || (MinecraftServer.currentTick + pos.hashCode()) % world.paperConfig().tickRates.grassSpread != 0)) { return; } // Paper + if (this instanceof GrassBlock && world.paperConfig().tickRates.grassSpread != 1 && (world.paperConfig().tickRates.grassSpread < 1 || (io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + pos.hashCode()) % world.paperConfig().tickRates.grassSpread != 0)) { return; } // Paper // Folia - regionised ticking - // Paper start + // Paper start - Perf: optimize dirt and snow spreading net.minecraft.world.level.chunk.ChunkAccess cachedBlockChunk = world.getChunkIfLoaded(pos); if (cachedBlockChunk == null) { // Is this needed? diff --git a/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java b/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java -index f474ae7b3121de701f371b7d88e80086ec07d03d..ce8253c5b9253e5743478c9c75006868dca9cb78 100644 +index 6c1ed9d37adb97b47f0288a5986b805ee0e13842..a5d5a4b030da5057b2597536f8fbf77f69cd639c 100644 --- a/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java @@ -92,9 +92,9 @@ public class SweetBerryBushBlock extends BushBlock implements BonemealableBlock @@ -20348,7 +20352,7 @@ index fb180f0bcd20e51d41cfc924029c0b23d3d26258..3db0727cd8d835e8d1b7b3fab93613d2 BlockState iblockdata = blockEntity.getBlockState(); boolean flag = iblockdata.is(Blocks.WITHER_SKELETON_SKULL) || iblockdata.is(Blocks.WITHER_SKELETON_WALL_SKULL); diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -index f13943db6f2fb923c52dcf9e8bf7000041d0a362..9c3a271f98e723f1d8bf3badd3fca7a19fdc6d13 100644 +index 2250d77b0ec5ea77e3b757e03b62b26ced89a02f..4643150caa7b2bc675732e6f6b8d258c7494371b 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java @@ -211,7 +211,7 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name @@ -20361,15 +20365,15 @@ index f13943db6f2fb923c52dcf9e8bf7000041d0a362..9c3a271f98e723f1d8bf3badd3fca7a1 blockEntity.levels = BeaconBlockEntity.updateBase(world, i, j, k); } diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index 370a25d2deb54f10a35ee24d9e7e92fbfde60edf..fb16bbfd8db86495eced3e9ff9f9c4267e2230cc 100644 +index 4ce7a7947fa727e64556148f923508ce76c128c4..462e1952aaefea7db9f8fc37bb0ef645386094b0 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java @@ -26,7 +26,7 @@ import co.aikar.timings.MinecraftTimings; // Paper import co.aikar.timings.Timing; // Paper public abstract class BlockEntity { -- static boolean ignoreTileUpdates; // Paper -+ static final ThreadLocal IGNORE_TILE_UPDATES = ThreadLocal.withInitial(() -> Boolean.FALSE); // Paper // Folia - region threading +- static boolean ignoreTileUpdates; // Paper - Perf: Optimize Hoppers ++ static final ThreadLocal IGNORE_TILE_UPDATES = ThreadLocal.withInitial(() -> Boolean.FALSE); // Paper - Perf: Optimize Hoppers // Folia - region threading public Timing tickTimer = MinecraftTimings.getTileEntityTimings(this); // Paper // CraftBukkit start - data containers @@ -20390,13 +20394,13 @@ index 370a25d2deb54f10a35ee24d9e7e92fbfde60edf..fb16bbfd8db86495eced3e9ff9f9c426 public void setChanged() { if (this.level != null) { -- if (ignoreTileUpdates) return; // Paper -+ if (IGNORE_TILE_UPDATES.get()) return; // Paper // Folia - region threading +- if (ignoreTileUpdates) return; // Paper - Perf: Optimize Hoppers ++ if (IGNORE_TILE_UPDATES.get().booleanValue()) return; // Paper - Perf: Optimize Hoppers // Folia - region threading BlockEntity.setChanged(this.level, this.worldPosition, this.blockState); } diff --git a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -index c57efcb9a79337ec791e4e8f6671612f0a82b441..526d1bfd5ad0de7bcfd0c2da902515f3dec94c54 100644 +index bc01481ac5990ad1cfd1def5a16dd0ed2f9de8c9..4a62ac73dd89bc3c2aed1e58152e93c5043c6633 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java @@ -56,7 +56,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements @@ -20477,13 +20481,13 @@ 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 d4dcf7fe26474ae07374e7761d823bc5c8b54f97..72779080969fe9f058c19533ffc9dad5f9c47086 100644 +index a61d7cd2b078fe511ff00344197b6ea11feebfb2..26ff1a3d07c92f7035020d08d35116f7feede600 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 @@ -233,12 +233,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } - // Paper start - Optimize Hoppers + // Paper start - Perf: Optimize Hoppers - private static boolean skipPullModeEventFire; - private static boolean skipPushModeEventFire; - public static boolean skipHopperEvents; @@ -20575,7 +20579,7 @@ index d4dcf7fe26474ae07374e7761d823bc5c8b54f97..72779080969fe9f058c19533ffc9dad5 if (iinventory != null) { Direction enumdirection = Direction.DOWN; - // Paper start - optimize hoppers and remove streams + // Paper start - Perf: Optimize Hoppers - skipPullModeEventFire = skipHopperEvents; + worldData.skipPullModeEventFire = worldData.skipHopperEvents; // Folia - region threading // merge container isEmpty check and move logic into one loop @@ -20585,20 +20589,20 @@ index d4dcf7fe26474ae07374e7761d823bc5c8b54f97..72779080969fe9f058c19533ffc9dad5 stack = stack.split(to.getMaxStackSize()); } // Spigot end -- ignoreTileUpdates = true; // Paper -+ IGNORE_TILE_UPDATES.set(Boolean.TRUE); // Paper // Folia - region threading +- ignoreTileUpdates = true; // Paper - Perf: Optimize Hoppers ++ IGNORE_TILE_UPDATES.set(Boolean.TRUE); // Paper - Perf: Optimize Hoppers // Folia - region threading to.setItem(slot, stack); -- ignoreTileUpdates = false; // Paper -+ IGNORE_TILE_UPDATES.set(Boolean.FALSE); // Paper // Folia - region threading - stack = leftover; // Paper +- ignoreTileUpdates = false; // Paper - Perf: Optimize Hoppers ++ IGNORE_TILE_UPDATES.set(Boolean.FALSE); // Paper - Perf: Optimize Hoppers // Folia - region threading + stack = leftover; // Paper - Make hoppers respect inventory max stack size flag = true; } else if (HopperBlockEntity.canMergeItems(itemstack1, stack)) { diff --git a/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java -index 65112ec3a6ea1c27f032477720ae74395523012b..7f9022a271e29d0b47bef15359f1b2dc79de6402 100644 +index 83481539e058e5f428d9951e409fed62ef159e5c..48260dce982181e2ee4e92614f8ed3af4bf83af0 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java @@ -43,9 +43,9 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi - // Paper end + // Paper end - Fix NPE in SculkBloomEvent world access public static void serverTick(Level world, BlockPos pos, BlockState state, SculkCatalystBlockEntity blockEntity) { - org.bukkit.craftbukkit.event.CraftEventFactory.sourceBlockOverride = blockEntity.getBlockPos(); // CraftBukkit - SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPosition up to five methods deep. @@ -21009,7 +21013,7 @@ index 1ef87580574919796dbba707f44a413ee5c5781b..a595abb43853cd4c3f5886a83527c6cb break; } diff --git a/src/main/java/net/minecraft/world/level/border/WorldBorder.java b/src/main/java/net/minecraft/world/level/border/WorldBorder.java -index 204f008dc36212e696fba781fede88044b2f735a..1bc2b24deba7a534478184a6a3f3d41184a86734 100644 +index 8e441aafff788eab9e3d6d2fc7b70183d90b9ef4..4075efab9256ed19edc7a4720a728ba480e4e7ed 100644 --- a/src/main/java/net/minecraft/world/level/border/WorldBorder.java +++ b/src/main/java/net/minecraft/world/level/border/WorldBorder.java @@ -33,19 +33,19 @@ public class WorldBorder { @@ -21038,7 +21042,7 @@ index 204f008dc36212e696fba781fede88044b2f735a..1bc2b24deba7a534478184a6a3f3d411 // Paper end diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java -index 0708aaa7d25c674ab2ce431a262fed2459fd633d..9c868490f4f032871d9815bfe969d1530bc001ad 100644 +index 9cfb0283e568a7d4d554a2fed2417b375485df94..2b79f30bacc2670c4d9a92dedcc449072bbd4c6c 100644 --- a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java @@ -320,7 +320,7 @@ public abstract class ChunkGenerator { @@ -21051,7 +21055,7 @@ index 0708aaa7d25c674ab2ce431a262fed2459fd633d..9c868490f4f032871d9815bfe969d153 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 fa170cc1ce7011d201295b89718292d696c7fc24..744fa3a3a62ffb4b3d1e7831c93fd76dee29fdd0 100644 +index 27e8ee4507460b1cc72de692b41562b9f4f13929..562f42d0ccda8dadf9ddc08b1acb67c0e0c22d7e 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java @@ -59,6 +59,13 @@ public class LevelChunk extends ChunkAccess { @@ -21085,7 +21089,7 @@ index fa170cc1ce7011d201295b89718292d696c7fc24..744fa3a3a62ffb4b3d1e7831c93fd76d iblockdata.onPlace(this.level, blockposition, iblockdata1, flag); } -@@ -509,7 +517,7 @@ public class LevelChunk extends ChunkAccess { +@@ -508,7 +516,7 @@ public class LevelChunk extends ChunkAccess { @Nullable public BlockEntity getBlockEntity(BlockPos pos, LevelChunk.EntityCreationType creationType) { // CraftBukkit start @@ -21094,7 +21098,7 @@ index fa170cc1ce7011d201295b89718292d696c7fc24..744fa3a3a62ffb4b3d1e7831c93fd76d if (tileentity == null) { tileentity = (BlockEntity) this.blockEntities.get(pos); } -@@ -796,13 +804,13 @@ public class LevelChunk extends ChunkAccess { +@@ -795,13 +803,13 @@ public class LevelChunk extends ChunkAccess { org.bukkit.World world = this.level.getWorld(); if (world != null) { @@ -21110,7 +21114,7 @@ index fa170cc1ce7011d201295b89718292d696c7fc24..744fa3a3a62ffb4b3d1e7831c93fd76d } } server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk)); -@@ -852,7 +860,7 @@ public class LevelChunk extends ChunkAccess { +@@ -851,7 +859,7 @@ public class LevelChunk extends ChunkAccess { @Override public boolean isUnsaved() { // Paper start - add dirty system to tick lists @@ -21119,7 +21123,7 @@ index fa170cc1ce7011d201295b89718292d696c7fc24..744fa3a3a62ffb4b3d1e7831c93fd76d if (this.blockTicks.isDirty(gameTime) || this.fluidTicks.isDirty(gameTime)) { return true; } -@@ -1118,6 +1126,13 @@ public class LevelChunk extends ChunkAccess { +@@ -1117,6 +1125,13 @@ public class LevelChunk extends ChunkAccess { this.ticker = wrapped; } @@ -21133,7 +21137,7 @@ index fa170cc1ce7011d201295b89718292d696c7fc24..744fa3a3a62ffb4b3d1e7831c93fd76d @Override public void tick() { this.ticker.tick(); -@@ -1154,6 +1169,13 @@ public class LevelChunk extends ChunkAccess { +@@ -1153,6 +1168,13 @@ public class LevelChunk extends ChunkAccess { this.ticker = blockentityticker; } @@ -21148,7 +21152,7 @@ index fa170cc1ce7011d201295b89718292d696c7fc24..744fa3a3a62ffb4b3d1e7831c93fd76d public void tick() { if (!this.blockEntity.isRemoved() && this.blockEntity.hasLevel()) { diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java -index daa7525074facfbf31c1183e872f083a02697700..84a025e4849e02f3dc1bae2d32f84be8d7f9a76b 100644 +index c57ca085afe52af0ae9e40e241452796e246f5cc..30c1ea1b1f439b594e1c2ef7d75b0a3a2d7fbb96 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java @@ -646,7 +646,7 @@ public class ChunkSerializer { @@ -21161,11 +21165,11 @@ index daa7525074facfbf31c1183e872f083a02697700..84a025e4849e02f3dc1bae2d32f84be8 nbt.put("block_ticks", tickSchedulers.blocks().save(i, (block) -> { return BuiltInRegistries.BLOCK.getKey(block).toString(); diff --git a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java -index c1ff2e15bc5da1a642872ac0fdcdc457e8abb063..f73552b09913b290a7c79db3d6f064ab28553f05 100644 +index 111f37891f6b19ee050aafb12260a326a4e79ec0..c77cd6750deea6927327d7e1dd98f4f8b246319d 100644 --- a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java +++ b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java @@ -76,7 +76,7 @@ public class EndDragonFight { - private static final Component DEFAULT_BOSS_EVENT_NAME = Component.translatable("entity.minecraft.ender_dragon"); // Paper + private static final Component DEFAULT_BOSS_EVENT_NAME = Component.translatable("entity.minecraft.ender_dragon"); // Paper - ensure reset EnderDragon boss event name public final ServerBossEvent dragonEvent; public final ServerLevel level; - private final BlockPos origin; @@ -21222,7 +21226,7 @@ index c1ff2e15bc5da1a642872ac0fdcdc457e8abb063..f73552b09913b290a7c79db3d6f064ab @@ -564,7 +574,7 @@ public class EndDragonFight { public boolean tryRespawn(@Nullable BlockPos placedEndCrystalPos) { // placedEndCrystalPos is null if the tryRespawn() call was not caused by a placed end crystal - // Paper end + // Paper end - Perf: Do crystal-portal proximity check before entity lookup - if (this.dragonKilled && this.respawnStage == null) { + if (this.dragonKilled && this.respawnStage == null && io.papermc.paper.util.TickThread.isTickThreadFor(this.level, this.origin)) { // Folia - region threading BlockPos blockposition = this.portalLocation; @@ -21281,7 +21285,7 @@ index a908652f1ebb426d265ef614746f70cd1e538268..e615b79f68a0467aa8cfa1c61b06ae04 if (days >= world.paperConfig().entities.behavior.pillagerPatrols.start.day && world.isDay()) { diff --git a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java -index dfeb3e336e06ef01f5401a362755030db942bb07..a127b6cbaab211d324d42b3bddcd6ebd84c250e3 100644 +index 7d7d37334321c844958ce09e77547dd61dcba6c8..bded2c58c6b44b918d89d8a18e3af632c2b9e18d 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.material.FluidState; @@ -21294,7 +21298,7 @@ index dfeb3e336e06ef01f5401a362755030db942bb07..a127b6cbaab211d324d42b3bddcd6ebd public PhantomSpawner() {} @@ -40,20 +40,22 @@ public class PhantomSpawner implements CustomSpawner { - // Paper end + // Paper end - Ability to control player's insomnia and phantoms RandomSource randomsource = world.random; - --this.nextTick; @@ -21305,12 +21309,12 @@ index dfeb3e336e06ef01f5401a362755030db942bb07..a127b6cbaab211d324d42b3bddcd6ebd + if (worldData.phantomSpawnerNextTick > 0) { // Folia - region threading return 0; } else { - // Paper start + // Paper start - Ability to control player's insomnia and phantoms int spawnAttemptMinSeconds = world.paperConfig().entities.behavior.phantomsSpawnAttemptMinSeconds; int spawnAttemptMaxSeconds = world.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds; - this.nextTick += (spawnAttemptMinSeconds + randomsource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20; + worldData.phantomSpawnerNextTick += (spawnAttemptMinSeconds + randomsource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20; // Folia - region threading - // Paper end + // Paper end - Ability to control player's insomnia and phantoms if (world.getSkyDarken() < 5 && world.dimensionType().hasSkyLight()) { return 0; } else { @@ -21402,7 +21406,7 @@ index 42212d4533ce25d1cfcf4c58f1fc88791d546cff..fa33c8e40bad9411e1a03899d2c37080 }); } diff --git a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -index 598dc0d3a2b9387e76d7e4e19e54c4573a24bc54..8a139bcfc9c3de5793b1b590be6cafaae01c86e1 100644 +index 395bb163fb1d62dd2e6949e1146c337c0bbc626f..a25c2983a7e0df3292f701fc46487e5e15ec7ac8 100644 --- a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java +++ b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java @@ -46,6 +46,7 @@ public class CollectingNeighborUpdater implements NeighborUpdater { @@ -21470,7 +21474,7 @@ index 3eca0b1d1407770d3986e0f09c49bc86804b604e..d76df0d600d7f17ac01ce131b85ce928 } } 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 e4c4948e076cd64686dfd16ae0568fafc1437140..ba531fcd90df266d8d0c2de907fefe994949ae0c 100644 +index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..df799198d4d77a1827002d6d192ebaea3007d5b8 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 @@ -192,7 +192,7 @@ public class MapItemSavedData extends SavedData { @@ -21809,11 +21813,11 @@ 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 d0bddf66a8cbf1cd1348cc40ef8bbc125b7483ed..d05fb79f3d34984722f8385417dc496bb97414a7 100644 +index 3b133cd19c0cceeb78f58d36de817b699cc59884..9dfcdc92d8507dff6a77115de5122b109dce44da 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -307,7 +307,7 @@ public final class CraftServer implements Server { - private final CraftPotionBrewer potionBrewer = new CraftPotionBrewer(); // Paper + private final CraftPotionBrewer potionBrewer = new CraftPotionBrewer(); // Paper - Custom Potion Mixes // Paper start - Folia region threading API - private final io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler(); @@ -21891,7 +21895,7 @@ index d0bddf66a8cbf1cd1348cc40ef8bbc125b7483ed..d05fb79f3d34984722f8385417dc496b if (this.commandMap.dispatch(sender, commandLine)) { return true; } -@@ -3208,7 +3251,7 @@ public final class CraftServer implements Server { +@@ -3207,7 +3250,7 @@ public final class CraftServer implements Server { @Override public int getCurrentTick() { @@ -21901,7 +21905,7 @@ index d0bddf66a8cbf1cd1348cc40ef8bbc125b7483ed..d05fb79f3d34984722f8385417dc496b @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 38d842bc0fb7d9c39a3673983a643248e9563fe2..085eebd879bc514dc9f785ea31fc6c0f7a066953 100644 +index 1ab5a5a554475f734ac53d39f521a43ecd042045..6bb19a9a4150f516c32bc155eafe99fc1afb75b1 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -186,7 +186,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -21921,7 +21925,7 @@ index 38d842bc0fb7d9c39a3673983a643248e9563fe2..085eebd879bc514dc9f785ea31fc6c0f + this.spawnCategoryLimit.put(spawnCategory, this.world.paperConfig().entities.spawning.spawnLimits.getInt(CraftSpawnCategory.toNMS(spawnCategory))); // Folia - region threading } } - // Paper end + // Paper end - per world spawn limits @@ -335,6 +335,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @@ -22090,7 +22094,7 @@ index 38d842bc0fb7d9c39a3673983a643248e9563fe2..085eebd879bc514dc9f785ea31fc6c0f @Override public void setStorm(boolean hasStorm) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify weather off of the global region"); // Folia - region threading - this.world.serverLevelData.setRaining(hasStorm, org.bukkit.event.weather.WeatherChangeEvent.Cause.PLUGIN); // Paper + this.world.serverLevelData.setRaining(hasStorm, org.bukkit.event.weather.WeatherChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setWeatherDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) @@ -1383,6 +1394,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -22106,7 +22110,7 @@ index 38d842bc0fb7d9c39a3673983a643248e9563fe2..085eebd879bc514dc9f785ea31fc6c0f @Override public void setThundering(boolean thundering) { + io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Cannot modify weather off of the global region"); // Folia - region threading - this.world.serverLevelData.setThundering(thundering, org.bukkit.event.weather.ThunderChangeEvent.Cause.PLUGIN); // Paper + this.world.serverLevelData.setThundering(thundering, org.bukkit.event.weather.ThunderChangeEvent.Cause.PLUGIN); // Paper - Add cause to Weather/ThunderChangeEvents this.setThunderDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) @@ -1405,6 +1418,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -22324,7 +22328,7 @@ index 38d842bc0fb7d9c39a3673983a643248e9563fe2..085eebd879bc514dc9f785ea31fc6c0f 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 -@@ -2469,7 +2512,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2462,7 +2505,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 @@ -22333,7 +22337,7 @@ index 38d842bc0fb7d9c39a3673983a643248e9563fe2..085eebd879bc514dc9f785ea31fc6c0f net.minecraft.world.level.chunk.LevelChunk immediate = this.world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); if (immediate != null) { return java.util.concurrent.CompletableFuture.completedFuture(new CraftChunk(immediate)); -@@ -2486,7 +2529,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2479,7 +2522,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) -> { @@ -22343,7 +22347,7 @@ index 38d842bc0fb7d9c39a3673983a643248e9563fe2..085eebd879bc514dc9f785ea31fc6c0f 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 a8760f015b9ee3ee408c3b9220266eb76b313ba0..fadf10c6a7fabde2c13f3aff00739a21e9f05ced 100644 +index c17c8b2bff32bfd101675d73f8ab81b35a9e1c15..fe5158430fd50c95c12a0ecef4273572da4b3133 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CapturedBlockState.java @@ -52,6 +52,7 @@ public final class CapturedBlockState extends CraftBlockState { @@ -22355,7 +22359,7 @@ index a8760f015b9ee3ee408c3b9220266eb76b313ba0..fadf10c6a7fabde2c13f3aff00739a21 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 520b53bc604e6755251f0b14e91dce56bc5501ce..59ff22ece9361e9d781de8826f7f2cfc17d60b10 100644 +index 4b42ef2a876ea210d948238e63fd7a2b7035bb5b..b451b9df3233355fb16092edc3a4dd63d7d2ff14 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -75,6 +75,11 @@ public class CraftBlock implements Block { @@ -22548,7 +22552,7 @@ index 520b53bc604e6755251f0b14e91dce56bc5501ce..59ff22ece9361e9d781de8826f7f2cfc 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 390e1b7fd2721b99cb3ce268c6bc1bf0a38e08a3..9bf02fde730932d356803d2ab6d3c193e0437c8a 100644 +index d11d854ae90b99aa2ce227994d07fe1fe9b4a60a..6a6d95dcad917dd60b47236a130bcd2c9425a529 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -210,6 +210,12 @@ public class CraftBlockState implements BlockState { @@ -22575,7 +22579,7 @@ index 390e1b7fd2721b99cb3ce268c6bc1bf0a38e08a3..9bf02fde730932d356803d2ab6d3c193 // Modelled off EntityHuman#hasBlock diff --git a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java -index 12eeabafbad9da8796dc6fc383b732cf75bb7ddb..6ede423639c8e2012da897f517e8f7c9de72095f 100644 +index 3e93a6c489972ff2b4ecff3d83cc72b2d5c970f8..66dc7e20544c7000f4824b02cc3a31bc5c87f74c 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java +++ b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java @@ -50,7 +50,7 @@ public class ConsoleCommandCompleter implements Completer { @@ -22597,7 +22601,7 @@ index 12eeabafbad9da8796dc6fc383b732cf75bb7ddb..6ede423639c8e2012da897f517e8f7c9 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 1c3e1153d08b59d29b3613fc3b50a4780aa7a3ac..56c7eda0dbfbb8987e1e642936b46e2a320466f7 100644 +index f16ac1d640fc97f348c244d4ea86e3278b30ae19..1d9e123f5c1bc94f6be08f372c94a2c595a789c6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -233,6 +233,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -22695,7 +22699,7 @@ index 1c3e1153d08b59d29b3613fc3b50a4780aa7a3ac..56c7eda0dbfbb8987e1e642936b46e2a @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index da63b4050be25dcb91d04df8c2fcc643cbb0751d..676f81ae2d5b35788bcda1f74aea7b8a1253602c 100644 +index b364a042a9b5d1b3c604f6bf6d03b6aeff03ec82..9c9b7728122aaaeb92f565f0c9322f0e3aed947b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -596,7 +596,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -22738,7 +22742,7 @@ index da63b4050be25dcb91d04df8c2fcc643cbb0751d..676f81ae2d5b35788bcda1f74aea7b8a 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 2aab68bac670dcd134d817940020214c7b0797f9..41b2007554c345607869366d1ba57022019a6221 100644 +index 8af725ea1378c8e5b275e5a7f690b22b7921c16b..dd876b50a6df9386aef890992b59ad29db2b3502 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -243,8 +243,8 @@ import org.bukkit.potion.PotionEffect; @@ -22780,7 +22784,7 @@ index 2aab68bac670dcd134d817940020214c7b0797f9..41b2007554c345607869366d1ba57022 + CraftEventFactory.entityDamageRT.set(null); // Folia - region threading EntityDamageEvent event; if (damager == null) { - event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions, source.explodedBlockState); // Paper - handle block state in damage + event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions, source.explodedBlockState); // Paper - add exploded state @@ -1118,13 +1118,13 @@ public class CraftEventFactory { } return event; @@ -22859,7 +22863,7 @@ index 700932b65e4fda560d684b0aa079bcee3923f73e..2c3e1b420303a3c3a9315983fbc7e474 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 ec2396f0e5d62b10450eaa7239a8c5479638b3c3..baf5605f31d3c24441da7e2fe13c923ba6ae1199 100644 +index 509f8487a170f3dc84b091acf16df26e42391189..83f6756aaf32252e021059e930bd651135176af0 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -377,6 +377,12 @@ public final class CraftMagicNumbers implements UnsafeValues { @@ -22876,7 +22880,7 @@ index ec2396f0e5d62b10450eaa7239a8c5479638b3c3..baf5605f31d3c24441da7e2fe13c923b int pluginIndex = CraftMagicNumbers.SUPPORTED_API.indexOf(pdf.getAPIVersion()); diff --git a/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java -index 0f115d555cbc9fed224c9e8b0fab5fae6b0e7ff2..42884e261314a8c23adb57414950db613cf6b731 100644 +index 86a20c91beff6b27e6ec886e49ba902b216106f2..96007426144b78f91c12614f04350855530cc70d 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java +++ b/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java @@ -69,6 +69,13 @@ public abstract class DelegatedGeneratorAccess implements WorldGenLevel { @@ -22894,9 +22898,18 @@ index 0f115d555cbc9fed224c9e8b0fab5fae6b0e7ff2..42884e261314a8c23adb57414950db61 return this.handle; } diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 2d31752478636bd21bbff5b430e5acb76b5d91c2..ea605188aad5476e8e473bc9c6c2a7c29eeed136 100644 +index fafc8b84d6b6368c70b8eedfdb4c3a9deace9c26..5f1dee3a1d5a7b0391bad60b53eda1c5586058aa 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java +@@ -52,7 +52,7 @@ public class ActivationRange + RAIDER, + MISC; + +- AABB boundingBox = new AABB( 0, 0, 0, 0, 0, 0 ); ++ // Folia - threaded regions - replaced by local variable + } + // Paper start + @@ -65,26 +65,27 @@ public class ActivationRange private static int checkInactiveWakeup(Entity entity) { @@ -22934,6 +22947,15 @@ index 2d31752478636bd21bbff5b430e5acb76b5d91c2..ea605188aad5476e8e473bc9c6c2a7c2 return config.wakeUpInactiveMonstersFor; } } +@@ -92,7 +93,7 @@ public class ActivationRange + } + // Paper end + +- static AABB maxBB = new AABB( 0, 0, 0, 0, 0, 0 ); ++ // Folia - threaded regions - replaced by local variable + + /** + * Initializes an entities type on construction to specify what group this @@ -174,10 +175,11 @@ public class ActivationRange final int waterActivationRange = world.spigotConfig.waterActivationRange; final int flyingActivationRange = world.spigotConfig.flyingMonsterActivationRange; @@ -22962,27 +22984,57 @@ index 2d31752478636bd21bbff5b430e5acb76b5d91c2..ea605188aad5476e8e473bc9c6c2a7c2 if ( world.spigotConfig.ignoreSpectatorActivation && player.isSpectator() ) { continue; -@@ -212,10 +214,16 @@ public class ActivationRange +@@ -201,27 +203,34 @@ public class ActivationRange + + // Paper start + int worldHeight = world.getHeight(); +- ActivationRange.maxBB = player.getBoundingBox().inflate( maxRange, worldHeight, maxRange ); +- ActivationType.MISC.boundingBox = player.getBoundingBox().inflate( miscActivationRange, worldHeight, miscActivationRange ); +- ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate( raiderActivationRange, worldHeight, raiderActivationRange ); +- ActivationType.ANIMAL.boundingBox = player.getBoundingBox().inflate( animalActivationRange, worldHeight, animalActivationRange ); +- ActivationType.MONSTER.boundingBox = player.getBoundingBox().inflate( monsterActivationRange, worldHeight, monsterActivationRange ); +- ActivationType.WATER.boundingBox = player.getBoundingBox().inflate( waterActivationRange, worldHeight, waterActivationRange ); +- ActivationType.FLYING_MONSTER.boundingBox = player.getBoundingBox().inflate( flyingActivationRange, worldHeight, flyingActivationRange ); +- ActivationType.VILLAGER.boundingBox = player.getBoundingBox().inflate( villagerActivationRange, worldHeight, villagerActivationRange ); ++ AABB maxBB = player.getBoundingBox().inflate( maxRange, worldHeight, maxRange ); // Folia - threaded regions ++ AABB[] bbByType = new AABB[ActivationType.values().length]; ++ bbByType[ActivationType.MISC.ordinal()] = player.getBoundingBox().inflate( miscActivationRange, worldHeight, miscActivationRange ); // Folia - threaded regions ++ bbByType[ActivationType.RAIDER.ordinal()] = player.getBoundingBox().inflate( raiderActivationRange, worldHeight, raiderActivationRange ); // Folia - threaded regions ++ bbByType[ActivationType.ANIMAL.ordinal()] = player.getBoundingBox().inflate( animalActivationRange, worldHeight, animalActivationRange ); // Folia - threaded regions ++ bbByType[ActivationType.MONSTER.ordinal()] = player.getBoundingBox().inflate( monsterActivationRange, worldHeight, monsterActivationRange ); // Folia - threaded regions ++ bbByType[ActivationType.WATER.ordinal()] = player.getBoundingBox().inflate( waterActivationRange, worldHeight, waterActivationRange ); // Folia - threaded regions ++ bbByType[ActivationType.FLYING_MONSTER.ordinal()] = player.getBoundingBox().inflate( flyingActivationRange, worldHeight, flyingActivationRange ); // Folia - threaded regions ++ bbByType[ActivationType.VILLAGER.ordinal()] = player.getBoundingBox().inflate( villagerActivationRange, worldHeight, villagerActivationRange ); // Folia - threaded regions // Paper end // Paper start - java.util.List entities = world.getEntities((Entity)null, ActivationRange.maxBB, null); + 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, null); // Folia - region ticking - bypass getEntities thread check, we perform a check on the entities later - boolean tickMarkers = world.paperConfig().entities.markers.tick; // Paper - configurable marker ticking + boolean tickMarkers = world.paperConfig().entities.markers.tick; // Paper - Configurable marker ticking for (int i = 0; i < entities.size(); i++) { Entity entity = entities.get(i); + // Paper start - Configurable marker ticking + // Folia start - region ticking + if (!io.papermc.paper.util.TickThread.isTickThreadFor(entity)) { + continue; + } + // Folia end - region ticking - // Paper start - configurable marker ticking if (!tickMarkers && entity instanceof net.minecraft.world.entity.Marker) { continue; -@@ -235,16 +243,16 @@ public class ActivationRange + } + // Paper end - Configurable marker ticking +- ActivationRange.activateEntity(entity); ++ ActivationRange.activateEntity(entity, bbByType); // Folia - threaded regions + } + // Paper end + } +@@ -233,18 +242,18 @@ public class ActivationRange + * + * @param chunk */ - private static void activateEntity(Entity entity) +- private static void activateEntity(Entity entity) ++ private static void activateEntity(Entity entity, AABB[] bbByType) // Folia - threaded regions { - if ( MinecraftServer.currentTick > entity.activatedTick ) + if ( io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() > entity.activatedTick ) // Folia - threaded regions @@ -22993,14 +23045,15 @@ index 2d31752478636bd21bbff5b430e5acb76b5d91c2..ea605188aad5476e8e473bc9c6c2a7c2 + entity.activatedTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - threaded regions return; } - if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) ) +- if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) ) ++ if ( bbByType[entity.activationType.ordinal()].intersects( entity.getBoundingBox() ) ) // Folia - threaded regions { - entity.activatedTick = MinecraftServer.currentTick; + entity.activatedTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - threaded regions } } } -@@ -267,10 +275,10 @@ public class ActivationRange +@@ -267,10 +276,10 @@ public class ActivationRange if (entity.getRemainingFireTicks() > 0) { return 2; } @@ -23013,7 +23066,7 @@ index 2d31752478636bd21bbff5b430e5acb76b5d91c2..ea605188aad5476e8e473bc9c6c2a7c2 // Paper end // quick checks. if ( (entity.activationType != ActivationType.WATER && entity.wasTouchingWater && entity.isPushedByFluid()) ) // Paper -@@ -393,19 +401,19 @@ public class ActivationRange +@@ -393,19 +402,19 @@ public class ActivationRange } // Paper end @@ -23057,7 +23110,7 @@ index ac0fd418fcb437896dfdff53ab3eff19833d25fb..130220977477a5d8d51e17dcb989ae0c return true; diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java -index 68602dfb171d47e47fd0710b4324013ef05214d0..2d75cefc69ea1da96a99370aef3df7bd6fcf11b9 100644 +index 6c260403d91d640da0473a3df56e1c5582459fde..f685fd53ef631b32b6c51dfc7f0d847ed2dc9658 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -228,7 +228,7 @@ public class SpigotConfig diff --git a/patches/server/0004-Max-pending-logins.patch b/patches/server/0004-Max-pending-logins.patch index 3eb6e03..0b58476 100644 --- a/patches/server/0004-Max-pending-logins.patch +++ b/patches/server/0004-Max-pending-logins.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Max pending logins Should help the floodgates on launch diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 5834d5e10c0b9892f29977666e7b168a9463a3d9..5bac302f6aab2c61cba87ea3e32a260eeb0284b4 100644 +index 586027a4c97a3c1be42f1c8d5a248e2672bb6489..d809dd5f6aa39fcd7583d7db822450297225eb49 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -89,7 +89,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, @@ -19,7 +19,7 @@ index 5834d5e10c0b9892f29977666e7b168a9463a3d9..5bac302f6aab2c61cba87ea3e32a260e if (this.state == ServerLoginPacketListenerImpl.State.WAITING_FOR_DUPE_DISCONNECT && !this.isPlayerAlreadyInWorld((GameProfile) Objects.requireNonNull(this.authenticatedProfile))) { diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 184057aae74e8918bf05ab03429cb0419ae9ba06..eb797313a13b5a805f834b2e9f08989e381f0761 100644 +index 8284cde1984408a97a933f4299ad8541e7a015ca..739e8966c7326edf47e85f959374cbc8970d7b2a 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -171,6 +171,17 @@ public abstract class PlayerList { diff --git a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index 4d4eba9..26b4729 100644 --- a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -29,10 +29,10 @@ index 41bf71d116ffc5431586ce54abba7f8def6c1dcf..519da6886613b8460e989767b1a21e31 } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 630d668dddc6dfc8a3b6dd0b021ad605ef20856f..0a060023da8c1ca1e4a0646e94170c8f489f48b1 100644 +index 1ee49570e9c3250d1d3ce0420a0a0c94cda717fe..cc4eb106b3ff1953de11f1faa7c04f3f9982fca2 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2917,6 +2917,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2919,6 +2919,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S if (!force && (!this.canRide(entity) || !entity.canAddPassenger(this))) { return false; } else { @@ -40,15 +40,15 @@ index 630d668dddc6dfc8a3b6dd0b021ad605ef20856f..0a060023da8c1ca1e4a0646e94170c8f // CraftBukkit start if (entity.getBukkitEntity() instanceof Vehicle && this.getBukkitEntity() instanceof LivingEntity) { VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.getBukkitEntity()); -@@ -2938,6 +2939,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S - if (event.isCancelled()) { +@@ -2940,6 +2941,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } + // CraftBukkit end + } // Folia - region threading - suppress entire event logic during worldgen - // Spigot end if (this.isPassenger()) { this.stopRiding(); -@@ -3016,6 +3018,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S + } +@@ -3017,6 +3019,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)"); } else { // CraftBukkit start @@ -56,16 +56,16 @@ index 630d668dddc6dfc8a3b6dd0b021ad605ef20856f..0a060023da8c1ca1e4a0646e94170c8f CraftEntity craft = (CraftEntity) entity.getBukkitEntity().getVehicle(); Entity orig = craft == null ? null : craft.getHandle(); if (this.getBukkitEntity() instanceof Vehicle && entity.getBukkitEntity() instanceof LivingEntity) { -@@ -3043,6 +3046,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S - if (event.isCancelled()) { +@@ -3044,6 +3047,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } + // CraftBukkit end + } // Folia - region threading - suppress entire event logic during worldgen - // Spigot end if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); + } else { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/AbstractProjectile.java -index 0f7ae4a5c672039828454bf18c770dd99e250212..df182782756f674e2ce5d8c6add5c23cec8be645 100644 +index 236f94348ff8da661e23e3e17b7fc1b143680da9..7d4cdb0c5cd24aee4c831e59836c5bdd0b9ea800 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 @@ @@ -141,7 +141,7 @@ index 5beaa2bb0d58fe477ce8d2de8b77600d3b416d8c..fa1bc80ae320c6d04acc20d6dec7df52 } // Paper end diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java -index 8db2c70d3600555bcb419260cafd56409478b227..50a715cf0c4c87b9a26c57c6eb7e133ae443edd3 100644 +index 34e4c763c7ec971885147ab2509281fad56e1ca6..a0a83e9111523a8080f30d0fdd35b9c9373ca359 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractVillager.java @@ -17,8 +17,16 @@ public class CraftAbstractVillager extends CraftAgeable implements AbstractVilla @@ -414,7 +414,7 @@ index dd91de8f24c27b9318c2a898a49991d74c100bff..d7c34f601ce66a6b090ec431a0503462 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java -index 859f233197ebe738511011e36668c4eb5d4b7d8e..c53af70cd12f0378d697398e090f95b1498f69e7 100644 +index 8184a2adf889e02b048ceb015edfc04d1b5c21b9..9165bb2458f2440c6a17dff8da985b60f84796db 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java @@ -102,8 +102,16 @@ public class CraftBoat extends CraftVehicle implements Boat { @@ -456,7 +456,7 @@ index 80e571c977db5cdf43bfbfce035f37a3fa325c95..6fafba37dd7128a397ba046be7b33067 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java -index 0ccc20157fb9fdb9c99b942dcb4675db5f928b23..aa9881552e0ba78d844de105184953c487ad426b 100644 +index 42342628227742aa7ee6b84caa0e1f13b498babe..8fa5a33a32ea0c9e5e7f941011612060db8ea826 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java @@ -16,8 +16,16 @@ public class CraftCat extends CraftTameableAnimal implements Cat { @@ -771,7 +771,7 @@ index 676dd5331bec75407a74aea2a89e78ab72d69724..b87d6ccd12323f1760d83365c1bdd1d5 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java -index 6eae6efa35a1ccc224e2f311e25ecf13e8647ec8..e26b538b4bc9ff182974a4323313567ffc66223b 100644 +index 7b7b89e67d53ed70efae714192c5fa32977f3d9c..00f334e5449f76b735b844fed44c98725e607db3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderDragon.java @@ -30,8 +30,16 @@ public class CraftEnderDragon extends CraftMob implements EnderDragon, CraftEnem @@ -834,7 +834,7 @@ index 3bb8d74f2b59c7f0c7c1cbde47a570d628ceceb2..83308195a3a55abeb4c28b9cc69dc98e } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java -index 1fb5760681bf0c745f9f3517489a83666a6d6805..8fb76a38ce3b1021e17acf1cc166d8dac3c61410 100644 +index 27f56fa4b7ef92a9a4dfa6b782350424b88210f2..d0b2f8abba0eb5e29beccfebcf48f840715b7908 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java @@ -15,8 +15,16 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal { @@ -897,7 +897,7 @@ index d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8..9fc90b162aab15a9cd60b02aba563181 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 56c7eda0dbfbb8987e1e642936b46e2a320466f7..b3faadd991f6885bfcaf4fd6fa895889670a1bb2 100644 +index 1d9e123f5c1bc94f6be08f372c94a2c595a789c6..39cb7a0a58ea24f48f7e621f696f0dbfea229ea3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -490,7 +490,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -981,7 +981,7 @@ index 5a7d314ec0562e472f5dc45924a7b24841cff126..4708a11935efe5cb6727f8fc6d4a3cd2 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java -index 73911b81f4e927026657953a0c68ddda9a8f93c1..b5384f3f60dd6bba96a59fe60f6fb39fa41a71e6 100644 +index 1359d25a32b4a5d5e8e68ce737bd19f7b5afaf69..0be7f84a50b7568d0c639f5906b5ca76347d95fe 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 { @@ -1002,12 +1002,12 @@ index 73911b81f4e927026657953a0c68ddda9a8f93c1..b5384f3f60dd6bba96a59fe60f6fb39f } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java -index 774ed1fdc909c911bf93a1b720285b43e9f728b8..f4555fb246cccdeae0498b1ce2f9aa1e4c7afd34 100644 +index 1d8aab2fda18c6e2bb30f6ba4a6325263267b628..61ad4e93c01ccdae9cdf4efb08f43959af9aafc4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFireball.java @@ -58,8 +58,16 @@ public class CraftFireball extends AbstractProjectile implements Fireball { } - // Paper end + // Paper end - set direction without normalizing + // Folia start - region threading + @Override @@ -1023,11 +1023,11 @@ index 774ed1fdc909c911bf93a1b720285b43e9f728b8..f4555fb246cccdeae0498b1ce2f9aa1e } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java -index c13cdbaf7abdf120a3969f8e887b4c3b78989c9c..2f6c4fe06405f8efdc42c9ab43ab4d6a2bb4e2b4 100644 +index 1309fabd357eb9b8f90f882ec7ff3de9e60f187d..7a98bcdd7c8a8934431cd50335f941ae79bc5763 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java @@ -37,8 +37,16 @@ public class CraftFirework extends CraftProjectile implements Firework { - // Paper End - Expose firework item directly + // Paper end - Expose firework item directly } + // Folia start - region threading @@ -1359,7 +1359,7 @@ index 8746f80d08df5501b32958eb123aa7d814573ddf..c6c6eb55f4649e18beef9832c2ea7b9d } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index c3dbcb317b7d366feb31f707ad1199c60169f07f..8f32a00e65254acb4752ae55fee86bc05964c13e 100644 +index 827fe201a7b74f485abb46b127a28bf0cb479c3b..bc74382c4b62ba14e655d10c261aada61191733a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -291,8 +291,16 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { @@ -1464,7 +1464,7 @@ index 63cae1a2e95d8da17c45c4404a8dd0ca6a413c39..f57139f03da9519802ee156f37691d08 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java -index 81498941748d646ebe6495f4a7ce6953532144c6..23ff09abb5f99b0cee2375769004c4f709257e39 100644 +index 832def3c518be8d6d81e71f6022566e6179e2d17..725e016dcd8177dcee0f0e1bd345c985fc1e95af 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java @@ -18,8 +18,16 @@ public class CraftItem extends CraftEntity implements Item { @@ -1569,7 +1569,7 @@ index 06fa256c5528af9c1d63fbd044f53b63bed324ee..896d34bd55e308fe322865f8cf7fd077 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java -index 70b377c03346cb8573827aeb493f3b6eb8efb1f8..b2e8c26162dd5782a0447cd03ca00fb4583fd442 100644 +index e9f471e60af0725ec34e2985d63ae9ea9f88590a..6a443f42ecec16abea3ddf7bc2e85bb8a6af726e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLightningStrike.java @@ -41,8 +41,16 @@ public class CraftLightningStrike extends CraftEntity implements LightningStrike @@ -1590,7 +1590,7 @@ index 70b377c03346cb8573827aeb493f3b6eb8efb1f8..b2e8c26162dd5782a0447cd03ca00fb4 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 1f1ef68a9a449a4a90c284f34a397ab4b6d905f6..9da62ca03e60c8cbe4714c7056c7642cce2c0b9e 100644 +index 4afc1c9d2a7638e84a55fe30932dc36db465c31a..b7be4fd0179a26d220819346457ba097f4c7d22d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -416,6 +416,13 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { @@ -2046,7 +2046,7 @@ index 49beb836d2801aadf869feefa602616daebe633f..0de7eadb1cac6979ce7cffd38a3b2508 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java -index 03e74b29ebf0f9b9a0dbc6ffc872e22a22be20f0..c7411045c4901b6a66c62d68be911a4d7d1f7a9c 100644 +index 5124a383b60b2c8de89fa992547d0c61db760c21..2ba9b61a164c6afed15a0919124c8241d2aebf78 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java @@ -75,8 +75,16 @@ public class CraftPiglin extends CraftPiglinAbstract implements Piglin, com.dest @@ -2130,7 +2130,7 @@ index 2638c341bc02f201f7ab17fdebcdbdf3a7ec05bf..0f5c2d31a2dea13a46ba81e353393633 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 676f81ae2d5b35788bcda1f74aea7b8a1253602c..f02a72c0589960d2c60e4155b3b9e0ddd22067d8 100644 +index 9c9b7728122aaaeb92f565f0c9322f0e3aed947b..003684843c2a9fc709619c1de8cf73dbb1b25c42 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -616,7 +616,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -2675,7 +2675,7 @@ index 9472a6f9c9584048abf1f8d11ab6254b7c7a287d..f2daf0fc0f07d90040887b0cee8f1924 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java -index 3f32c683ddc6999b89f2e4051eb6ae784b296b8f..c15141d2ffa4638f251681063e7ecae4186972d8 100644 +index dac3d34677688ac560bc1be2087a08479ef71b87..b28221a616613698e6a627d461429cb1f91d738b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTNTPrimed.java @@ -42,8 +42,16 @@ public class CraftTNTPrimed extends CraftEntity implements TNTPrimed { diff --git a/patches/server/0007-Disable-mid-tick-task-execution.patch b/patches/server/0007-Disable-mid-tick-task-execution.patch index 296e598..52218a7 100644 --- a/patches/server/0007-Disable-mid-tick-task-execution.patch +++ b/patches/server/0007-Disable-mid-tick-task-execution.patch @@ -10,10 +10,10 @@ the impact from scaling the region threads, but is not a fix to the underlying issue. diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ec1c5bf4b2e4a54e9df085331416bac0b42c601d..027d95e0763c6e18380b706fcd7f48c09a7cc17a 100644 +index 301ff715b89abbebda83af1e15f8d5d15097002f..7df4935a6c1a631e07dcf9c30341f93f3fba7090 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1469,6 +1469,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> optional = getLodestoneDimension(compoundTag); if (optional.isPresent() && optional.get() == world.dimension() && compoundTag.contains("LodestonePos")) { BlockPos blockPos = NbtUtils.readBlockPos(compoundTag.getCompound("LodestonePos")); -- if (!world.isInWorldBounds(blockPos) || (world.hasChunkAt(blockPos) && !((ServerLevel)world).getPoiManager().existsAtPosition(PoiTypes.LODESTONE, blockPos))) { // Paper -+ +- if (!world.isInWorldBounds(blockPos) || (world.hasChunkAt(blockPos) && !((ServerLevel)world).getPoiManager().existsAtPosition(PoiTypes.LODESTONE, blockPos))) { // Paper - Prevent compass from loading chunks + // Folia start - do not access the POI data off-region + net.minecraft.world.level.chunk.LevelChunk chunk = world.getChunkIfLoaded(blockPos); -+ if (!world.isInWorldBounds(blockPos) || chunk != null && chunk.getBlockState(blockPos).getBlock() != Blocks.LODESTONE) { // Paper ++ if (!world.isInWorldBounds(blockPos) || chunk != null && chunk.getBlockState(blockPos).getBlock() != Blocks.LODESTONE) { // Paper - Prevent compass from loading chunks + // Folia end - do not access the POI data off-region compoundTag.remove("LodestonePos"); } diff --git a/patches/server/0017-Sync-vehicle-position-to-player-position-on-player-d.patch b/patches/server/0017-Sync-vehicle-position-to-player-position-on-player-d.patch index af7550a..3c10c2b 100644 --- a/patches/server/0017-Sync-vehicle-position-to-player-position-on-player-d.patch +++ b/patches/server/0017-Sync-vehicle-position-to-player-position-on-player-d.patch @@ -7,7 +7,7 @@ This allows the player to be re-positioned before logging into the world without causing thread checks to trip on Folia. diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index eb797313a13b5a805f834b2e9f08989e381f0761..e63ad8ed0318fb99e99a8609ef6a31d16f87e7ff 100644 +index 739e8966c7326edf47e85f959374cbc8970d7b2a..8c74ba46920c41f82df7ae066caffd17b333301c 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -514,7 +514,13 @@ public abstract class PlayerList { diff --git a/patches/server/0018-Region-profiler.patch b/patches/server/0018-Region-profiler.patch index 568d668..320d65e 100644 --- a/patches/server/0018-Region-profiler.patch +++ b/patches/server/0018-Region-profiler.patch @@ -1376,10 +1376,10 @@ index 98fb69a9adeb6eaab199aec127692acb07f56808..7cc624505931dcb6696c3ef3ee3bbea7 label25: { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 027d95e0763c6e18380b706fcd7f48c09a7cc17a..9ea861c1531c5f9d8a87e45512336eba3bddf06a 100644 +index 7df4935a6c1a631e07dcf9c30341f93f3fba7090..4383528df7627c5eb7cba1218f1b4e524e4fe956 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1585,6 +1585,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 && io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() % autosavePeriod == 0; // Folia - region threading @@ -1428,7 +1428,7 @@ index 027d95e0763c6e18380b706fcd7f48c09a7cc17a..9ea861c1531c5f9d8a87e45512336eba try { this.isSaving = true; if (playerSaveInterval > 0) { -@@ -1666,6 +1679,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Folia - region threading entityplayer.connection.suspendFlushing(); -@@ -1796,12 +1811,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { // Folia - regionised ticking if (!entity.isRemoved()) { if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed -@@ -1006,10 +1020,13 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1005,10 +1019,13 @@ public class ServerLevel extends Level implements WorldGenLevel { } } }); @@ -1714,7 +1714,7 @@ index 8d3dca767e5928756e2767d60ca92fcc4cc760f1..788d6581e5283d6cbdefec158a00cc30 } gameprofilerfiller.push("entityManagement"); -@@ -1069,12 +1086,15 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1068,12 +1085,15 @@ public class ServerLevel extends Level implements WorldGenLevel { } public void tickCustomSpawners(boolean spawnMonsters, boolean spawnAnimals) { @@ -1730,7 +1730,7 @@ index 8d3dca767e5928756e2767d60ca92fcc4cc760f1..788d6581e5283d6cbdefec158a00cc30 } } -@@ -1524,6 +1544,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1523,6 +1543,11 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper start- timings final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity); timer = isActive ? entity.getType().tickTimer.startTiming() : entity.getType().inactiveTickTimer.startTiming(); // Paper @@ -1742,7 +1742,7 @@ index 8d3dca767e5928756e2767d60ca92fcc4cc760f1..788d6581e5283d6cbdefec158a00cc30 try { // Paper end - timings entity.setOldPosAndRot(); -@@ -1549,7 +1574,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1548,7 +1573,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // Folia end - region threading } else { entity.inactiveTick(); } // Paper - EAR 2 this.getProfiler().pop(); @@ -1751,7 +1751,7 @@ index 8d3dca767e5928756e2767d60ca92fcc4cc760f1..788d6581e5283d6cbdefec158a00cc30 Iterator iterator = entity.getPassengers().iterator(); while (iterator.hasNext()) { -@@ -1573,6 +1598,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1572,6 +1597,11 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper - EAR 2 final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger); co.aikar.timings.Timing timer = isActive ? passenger.getType().passengerTickTimer.startTiming() : passenger.getType().passengerInactiveTickTimer.startTiming(); // Paper @@ -1763,7 +1763,7 @@ index 8d3dca767e5928756e2767d60ca92fcc4cc760f1..788d6581e5283d6cbdefec158a00cc30 try { // Paper end passenger.setOldPosAndRot(); -@@ -1612,7 +1642,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1611,7 +1641,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickPassenger(passenger, entity2); } @@ -1773,7 +1773,7 @@ index 8d3dca767e5928756e2767d60ca92fcc4cc760f1..788d6581e5283d6cbdefec158a00cc30 } else { passenger.stopRiding(); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index e63ad8ed0318fb99e99a8609ef6a31d16f87e7ff..ded539dd20a2d037fa5d175be06d59dd76660ffe 100644 +index 8c74ba46920c41f82df7ae066caffd17b333301c..5d4876fc53eb12ee8e4a0159177e05cee847f077 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1329,6 +1329,7 @@ public abstract class PlayerList { @@ -1795,7 +1795,7 @@ index e63ad8ed0318fb99e99a8609ef6a31d16f87e7ff..ded539dd20a2d037fa5d175be06d59dd if (interval != -1 && max != -1 && ++numSaved >= max) { break; diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 6cfce9755dd464a7afb01f9032e567ce3bcd5bc5..d37a7f2ab6a8041d3bfeed600d15f77d253140f6 100644 +index e52f3da3b63cc3dba59d3e874a8420dd312b5e96..dc83dc377aff965222006e3eaaceb57692d2604f 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -326,6 +326,13 @@ public class EntityType implements FeatureElement, EntityTypeT @@ -1826,7 +1826,7 @@ index 6cfce9755dd464a7afb01f9032e567ce3bcd5bc5..d37a7f2ab6a8041d3bfeed600d15f77d this.factory = factory; this.category = spawnGroup; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 833f65c7b66a9b87b34118ed12d4d701a54b8e61..9c176121ac708be71726a67ab4da50113ee3f850 100644 +index 394ec4f018b676a441e49d7ccbef3f8c56673603..412b764a4911485487c7967ed64b74e97eb8fa8c 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -229,6 +229,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -1837,7 +1837,7 @@ index 833f65c7b66a9b87b34118ed12d4d701a54b8e61..9c176121ac708be71726a67ab4da5011 + public final int tickTimerId; + // Folia end - profiler - protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor + protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config; Async-Anti-Xray: Pass executor this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot @@ -321,6 +324,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.minSection = io.papermc.paper.util.WorldUtil.getMinSection(this); @@ -1917,10 +1917,10 @@ index 2e110da3502a7ac5ec4cc20510a3fac933569895..5aac65f37a0190c5d6a7175073fb0cc0 } } 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 744fa3a3a62ffb4b3d1e7831c93fd76dee29fdd0..3c42478dd38d29dedc638e7bbbbd23818e111335 100644 +index 562f42d0ccda8dadf9ddc08b1acb67c0e0c22d7e..d6bc8c0dfa8f180ced0ee55d03797411164ad55a 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -1182,11 +1182,14 @@ public class LevelChunk extends ChunkAccess { +@@ -1181,11 +1181,14 @@ public class LevelChunk extends ChunkAccess { BlockPos blockposition = this.blockEntity.getBlockPos(); if (LevelChunk.this.isTicking(blockposition)) { @@ -1935,7 +1935,7 @@ index 744fa3a3a62ffb4b3d1e7831c93fd76dee29fdd0..3c42478dd38d29dedc638e7bbbbd2381 BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); if (this.blockEntity.getType().isValid(iblockdata)) { -@@ -1196,6 +1199,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1195,6 +1198,7 @@ public class LevelChunk extends ChunkAccess { this.loggedInvalidBlockState = true; LevelChunk.LOGGER.warn("Block entity {} @ {} state {} invalid for ticking:", new Object[]{LogUtils.defer(this::getType), LogUtils.defer(this::getPos), iblockdata}); }