From dfc157075abff60c5d0365e2ad566a4fb13220f8 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Sat, 25 Mar 2023 00:22:47 +0100 Subject: [PATCH] Renames for consistency --- patches/api/0002-Region-scheduler-API.patch | 16 +- ... 0004-Add-RegionizedServerInitEvent.patch} | 10 +- ...king-ownership-of-region-by-position.patch | 4 +- .../0002-New-player-chunk-loader-system.patch | 74 +- patches/server/0004-Threaded-Regions.patch | 825 +++++++++--------- ...lism-for-neighbour-writing-chunk-sta.patch | 16 +- patches/server/0007-Max-pending-logins.patch | 4 +- ...nk-system-throughput-counters-to-tps.patch | 2 +- ...-getHandle-and-overrides-perform-thr.patch | 6 +- ...0010-Disable-mid-tick-task-execution.patch | 4 +- ...edOperationException-for-broken-APIs.patch | 2 +- 11 files changed, 478 insertions(+), 485 deletions(-) rename patches/api/{0004-Add-RegionisedServerInitEvent.patch => 0004-Add-RegionizedServerInitEvent.patch} (77%) diff --git a/patches/api/0002-Region-scheduler-API.patch b/patches/api/0002-Region-scheduler-API.patch index ec89016..c88800b 100644 --- a/patches/api/0002-Region-scheduler-API.patch +++ b/patches/api/0002-Region-scheduler-API.patch @@ -234,11 +234,11 @@ index 0000000000000000000000000000000000000000..f2d2565d903af90f6909319c811a4916 + */ + public void cancelTasks(@NotNull Plugin plugin); +} -diff --git a/src/main/java/io/papermc/paper/threadedregions/scheduler/RegionisedScheduler.java b/src/main/java/io/papermc/paper/threadedregions/scheduler/RegionisedScheduler.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/scheduler/RegionScheduler.java b/src/main/java/io/papermc/paper/threadedregions/scheduler/RegionScheduler.java new file mode 100644 -index 0000000000000000000000000000000000000000..4912d47e3daa4071bc82b1a32a19c8ea3348e0cc +index 0000000000000000000000000000000000000000..80baf45735fbf52a69872712cf3ae6c71739db27 --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/scheduler/RegionisedScheduler.java ++++ b/src/main/java/io/papermc/paper/threadedregions/scheduler/RegionScheduler.java @@ -0,0 +1,60 @@ +package io.papermc.paper.threadedregions.scheduler; + @@ -257,7 +257,7 @@ index 0000000000000000000000000000000000000000..4912d47e3daa4071bc82b1a32a19c8ea + * will not. + *

+ */ -+public interface RegionisedScheduler { ++public interface RegionScheduler { + + /** + * Schedules a task to be executed on the region which owns the location. @@ -419,7 +419,7 @@ index 0000000000000000000000000000000000000000..fa4ac300d3721b2d6d84b95618d33058 + } +} diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index ac9b690fcccb60b587e5345f12f1383afd0a73a1..22952628c894e29bfdb94897bd9970103730b898 100644 +index ac9b690fcccb60b587e5345f12f1383afd0a73a1..7986b9fcaf256e9042f6d9ddc38e8bd76645cbb7 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -2459,6 +2459,44 @@ public final class Bukkit { @@ -438,7 +438,7 @@ index ac9b690fcccb60b587e5345f12f1383afd0a73a1..22952628c894e29bfdb94897bd997010 + *

+ * @return the region task scheduler + */ -+ public static @NotNull io.papermc.paper.threadedregions.scheduler.RegionisedScheduler getRegionScheduler() { ++ public static @NotNull io.papermc.paper.threadedregions.scheduler.RegionScheduler getRegionScheduler() { + return server.getRegionScheduler(); + } + @@ -468,7 +468,7 @@ index ac9b690fcccb60b587e5345f12f1383afd0a73a1..22952628c894e29bfdb94897bd997010 @NotNull public static Server.Spigot spigot() { diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 2204336d8800311b65e894739ab1b27273e7c6f2..ea4d93680066295de9fd447eda58b93014eac635 100644 +index 2204336d8800311b65e894739ab1b27273e7c6f2..bf02c948a50d934e94c44f4844254a45ae7cb2a5 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -2139,4 +2139,36 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi @@ -487,7 +487,7 @@ index 2204336d8800311b65e894739ab1b27273e7c6f2..ea4d93680066295de9fd447eda58b930 + *

+ * @return the region task scheduler + */ -+ public @NotNull io.papermc.paper.threadedregions.scheduler.RegionisedScheduler getRegionScheduler(); ++ public @NotNull io.papermc.paper.threadedregions.scheduler.RegionScheduler getRegionScheduler(); + + /** + * Returns the async task scheduler. The async task scheduler can be used to schedule tasks diff --git a/patches/api/0004-Add-RegionisedServerInitEvent.patch b/patches/api/0004-Add-RegionizedServerInitEvent.patch similarity index 77% rename from patches/api/0004-Add-RegionisedServerInitEvent.patch rename to patches/api/0004-Add-RegionizedServerInitEvent.patch index aace997..f9f4c2b 100644 --- a/patches/api/0004-Add-RegionisedServerInitEvent.patch +++ b/patches/api/0004-Add-RegionizedServerInitEvent.patch @@ -1,18 +1,18 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Tue, 7 Mar 2023 12:58:48 -0800 -Subject: [PATCH] Add RegionisedServerInitEvent +Subject: [PATCH] Add RegionizedServerInitEvent This event allows plugins to perform synchronous operations before any region will tick. Plugins will not have to worry about the possibility of a region ticking in parallel while listening to the event. -diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionisedServerInitEvent.java b/src/main/java/io/papermc/paper/threadedregions/RegionisedServerInitEvent.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionizedServerInitEvent.java b/src/main/java/io/papermc/paper/threadedregions/RegionizedServerInitEvent.java new file mode 100644 -index 0000000000000000000000000000000000000000..8ffadb7c54087b79cdf7ebe11367b9d5884536e6 +index 0000000000000000000000000000000000000000..c7be944c5638cb6650624bd622b2ad9d52c5c31d --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/RegionisedServerInitEvent.java ++++ b/src/main/java/io/papermc/paper/threadedregions/RegionizedServerInitEvent.java @@ -0,0 +1,26 @@ +package io.papermc.paper.threadedregions; + @@ -25,7 +25,7 @@ index 0000000000000000000000000000000000000000..8ffadb7c54087b79cdf7ebe11367b9d5 + * Plugins may use this as a hook to run post initialisation logic without worrying about the possibility that + * regions are ticking in parallel. + */ -+public class RegionisedServerInitEvent extends ServerEvent { ++public class RegionizedServerInitEvent extends ServerEvent { + + private static final HandlerList handlers = new HandlerList(); + diff --git a/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch b/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch index d9e5b67..f212e61 100644 --- a/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch +++ b/patches/api/0005-Add-API-for-checking-ownership-of-region-by-position.patch @@ -11,7 +11,7 @@ the schedulers depending on the result of the ownership check. diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 22952628c894e29bfdb94897bd9970103730b898..62b7f94de5ffacd3919f9843e64a40f6f329fadd 100644 +index 7986b9fcaf256e9042f6d9ddc38e8bd76645cbb7..16043d6f7894182e8ff75a8faf57dedf8db50d84 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -2496,6 +2496,100 @@ public final class Bukkit { @@ -116,7 +116,7 @@ index 22952628c894e29bfdb94897bd9970103730b898..62b7f94de5ffacd3919f9843e64a40f6 @NotNull diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index ea4d93680066295de9fd447eda58b93014eac635..78cd452e804310eb8ed954833f2b7431ad9101b0 100644 +index bf02c948a50d934e94c44f4844254a45ae7cb2a5..fea84620b25ac393be6d3253c100ddeac1983105 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -2170,5 +2170,83 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi diff --git a/patches/server/0002-New-player-chunk-loader-system.patch b/patches/server/0002-New-player-chunk-loader-system.patch index e5c2494..54fb219 100644 --- a/patches/server/0002-New-player-chunk-loader-system.patch +++ b/patches/server/0002-New-player-chunk-loader-system.patch @@ -22,7 +22,7 @@ index 06bff37e4c1fddd3be6343049a66787c63fb420c..1be1fe766401221b6adb417175312007 )); })); diff --git a/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java b/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java -index 0e45a340ae534caf676b7f9d0adcbcee5829925e..6df1948b1204a7288ecb7238b6fc2a733f7d25b3 100644 +index 0e45a340ae534caf676b7f9d0adcbcee5829925e..61d03808c8d1ab822d9b2f31fab0de14089a3b15 100644 --- a/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java +++ b/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java @@ -129,15 +129,15 @@ public final class ChunkSystem { @@ -30,25 +30,25 @@ index 0e45a340ae534caf676b7f9d0adcbcee5829925e..6df1948b1204a7288ecb7238b6fc2a73 public static int getSendViewDistance(final ServerPlayer player) { - return io.papermc.paper.chunk.PlayerChunkLoader.getSendViewDistance(player); -+ return io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.getAPISendViewDistance(player); ++ return io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.getAPISendViewDistance(player); } public static int getLoadViewDistance(final ServerPlayer player) { - return io.papermc.paper.chunk.PlayerChunkLoader.getLoadViewDistance(player); -+ return io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.getLoadViewDistance(player); ++ return io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.getLoadViewDistance(player); } public static int getTickViewDistance(final ServerPlayer player) { - return io.papermc.paper.chunk.PlayerChunkLoader.getTickViewDistance(player); -+ return io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.getAPITickViewDistance(player); ++ return io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.getAPITickViewDistance(player); } private ChunkSystem() { -diff --git a/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java +diff --git a/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java new file mode 100644 -index 0000000000000000000000000000000000000000..7e2176f343160b299e7d4a2817c8f6c9ba7dba7b +index 0000000000000000000000000000000000000000..99dc2038aa4fb0f70dc3670e451018ff541d3a85 --- /dev/null -+++ b/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java ++++ b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java @@ -0,0 +1,1304 @@ +package io.papermc.paper.chunk.system; + @@ -87,7 +87,7 @@ index 0000000000000000000000000000000000000000..7e2176f343160b299e7d4a2817c8f6c9 +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + -+public class RegionisedPlayerChunkLoader { ++public class RegionizedPlayerChunkLoader { + + public static final TicketType REGION_PLAYER_TICKET = TicketType.create("region_player_ticket", Long::compareTo); + @@ -169,7 +169,7 @@ index 0000000000000000000000000000000000000000..7e2176f343160b299e7d4a2817c8f6c9 + + private final ServerLevel world; + -+ public RegionisedPlayerChunkLoader(final ServerLevel world) { ++ public RegionizedPlayerChunkLoader(final ServerLevel world) { + this.world = world; + } + @@ -1954,22 +1954,22 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..736f37979c882e41e7571202df38eb6a return true; } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..e57cf6a74a129ea0919a4ad5e84b615cd5aa141e 100644 +index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..bf1a77cf9bbea4e2104b2a8c61309e740f28d51b 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -521,6 +521,48 @@ public class ServerLevel extends Level implements WorldGenLevel { } // Paper end - optimise get nearest players for entity AI -+ public final io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader playerChunkLoader = new io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader(this); -+ private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.ViewDistances(-1, -1, -1)); ++ public final io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader playerChunkLoader = new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader(this); ++ private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); + -+ public io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.ViewDistances getViewDistances() { ++ public io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances getViewDistances() { + return this.viewDistances.get(); + } + -+ private void updateViewDistance(final java.util.function.Function update) { -+ for (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.ViewDistances curr = this.viewDistances.get();;) { ++ private void updateViewDistance(final java.util.function.Function update) { ++ for (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances curr = this.viewDistances.get();;) { + if (this.viewDistances.compareAndSet(curr, update.apply(curr))) { + return; + } @@ -1977,8 +1977,8 @@ index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..e57cf6a74a129ea0919a4ad5e84b615c + } + + public void setTickViewDistance(final int distance) { -+ if ((distance < io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE)) { -+ throw new IllegalArgumentException("Tick view distance must be a number between " + io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE) + ", got: " + distance); ++ if ((distance < io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE)) { ++ throw new IllegalArgumentException("Tick view distance must be a number between " + io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE) + ", got: " + distance); + } + this.updateViewDistance((input) -> { + return input.setTickViewDistance(distance); @@ -1986,8 +1986,8 @@ index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..e57cf6a74a129ea0919a4ad5e84b615c + } + + public void setLoadViewDistance(final int distance) { -+ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { -+ throw new IllegalArgumentException("Load view distance must be a number between " + io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); ++ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { ++ throw new IllegalArgumentException("Load view distance must be a number between " + io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); + } + this.updateViewDistance((input) -> { + return input.setLoadViewDistance(distance); @@ -1995,8 +1995,8 @@ index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..e57cf6a74a129ea0919a4ad5e84b615c + } + + public void setSendViewDistance(final int distance) { -+ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { -+ throw new IllegalArgumentException("Send view distance must be a number between " + io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); ++ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { ++ throw new IllegalArgumentException("Send view distance must be a number between " + io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); + } + this.updateViewDistance((input) -> { + return input.setSendViewDistance(distance); @@ -2007,22 +2007,22 @@ index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..e57cf6a74a129ea0919a4ad5e84b615c public ServerLevel(MinecraftServer minecraftserver, Executor executor, LevelStorageSource.LevelStorageAccess convertable_conversionsession, PrimaryLevelData iworlddataserver, ResourceKey resourcekey, LevelStem worlddimension, ChunkProgressListener worldloadlistener, boolean flag, long i, List list, boolean flag1, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { // IRegistryCustom.Dimension iregistrycustom_dimension = minecraftserver.registryAccess(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index ca5291a9573a62cb5c19539cf5c7aceff11f9829..8a80b222456c2e4818cada3a9248ab2f9b76a983 100644 +index ca5291a9573a62cb5c19539cf5c7aceff11f9829..a3cef477646abf6172d4e50a28ed30f04c30d667 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -275,6 +275,48 @@ public class ServerPlayer extends Player { public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event -+ private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.ViewDistances(-1, -1, -1)); -+ public io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; ++ private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); ++ public io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; + -+ public io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.ViewDistances getViewDistances() { ++ public io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances getViewDistances() { + return this.viewDistances.get(); + } + -+ private void updateViewDistance(final java.util.function.Function update) { -+ for (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.ViewDistances curr = this.viewDistances.get();;) { ++ private void updateViewDistance(final java.util.function.Function update) { ++ for (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances curr = this.viewDistances.get();;) { + if (this.viewDistances.compareAndSet(curr, update.apply(curr))) { + return; + } @@ -2030,8 +2030,8 @@ index ca5291a9573a62cb5c19539cf5c7aceff11f9829..8a80b222456c2e4818cada3a9248ab2f + } + + public void setTickViewDistance(final int distance) { -+ if ((distance < io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE)) { -+ throw new IllegalArgumentException("Tick view distance must be a number between " + io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE) + ", got: " + distance); ++ if ((distance < io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE)) { ++ throw new IllegalArgumentException("Tick view distance must be a number between " + io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE) + ", got: " + distance); + } + this.updateViewDistance((input) -> { + return input.setTickViewDistance(distance); @@ -2039,8 +2039,8 @@ index ca5291a9573a62cb5c19539cf5c7aceff11f9829..8a80b222456c2e4818cada3a9248ab2f + } + + public void setLoadViewDistance(final int distance) { -+ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { -+ throw new IllegalArgumentException("Load view distance must be a number between " + io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); ++ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { ++ throw new IllegalArgumentException("Load view distance must be a number between " + io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); + } + this.updateViewDistance((input) -> { + return input.setLoadViewDistance(distance); @@ -2048,8 +2048,8 @@ index ca5291a9573a62cb5c19539cf5c7aceff11f9829..8a80b222456c2e4818cada3a9248ab2f + } + + public void setSendViewDistance(final int distance) { -+ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { -+ throw new IllegalArgumentException("Send view distance must be a number between " + io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); ++ if (distance != -1 && (distance < io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE || distance > io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1)) { ++ throw new IllegalArgumentException("Send view distance must be a number between " + io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MIN_VIEW_DISTANCE + " and " + (io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.MAX_VIEW_DISTANCE + 1) + " or -1, got: " + distance); + } + this.updateViewDistance((input) -> { + return input.setSendViewDistance(distance); @@ -2203,7 +2203,7 @@ index 5e9055fdf411029ea2fed91acd6b981f79156418..ff6559bf563f2fdcc0f2843d4f4aa24d // Paper end - view distance api diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 1bada55af5d16437da4d16f9ded55f88a6121eb4..100f057f98b2f15972afe32fade22a7a320cf300 100644 +index 1bada55af5d16437da4d16f9ded55f88a6121eb4..e769c1c2a99a13941124c7442d44a509e7859666 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -189,44 +189,22 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -2216,7 +2216,7 @@ index 1bada55af5d16437da4d16f9ded55f88a6121eb4..100f057f98b2f15972afe32fade22a7a - return chunkMap.playerChunkManager.getTargetNoTickViewDistance(); - } - return data.getTargetNoTickViewDistance(); -+ return io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.getAPIViewDistance(this); ++ return io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.getAPIViewDistance(this); } @Override @@ -2239,7 +2239,7 @@ index 1bada55af5d16437da4d16f9ded55f88a6121eb4..100f057f98b2f15972afe32fade22a7a - return chunkMap.playerChunkManager.getTargetTickViewDistance(); - } - return data.getTargetTickViewDistance(); -+ return io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.getAPITickViewDistance(this); ++ return io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.getAPITickViewDistance(this); } @Override @@ -2265,7 +2265,7 @@ index 1bada55af5d16437da4d16f9ded55f88a6121eb4..100f057f98b2f15972afe32fade22a7a - return chunkMap.playerChunkManager.getTargetSendDistance(); - } - return data.getTargetSendViewDistance(); -+ return io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader.getAPISendViewDistance(this); ++ return io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.getAPISendViewDistance(this); } @Override diff --git a/patches/server/0004-Threaded-Regions.patch b/patches/server/0004-Threaded-Regions.patch index 6f8e866..5567767 100644 --- a/patches/server/0004-Threaded-Regions.patch +++ b/patches/server/0004-Threaded-Regions.patch @@ -1761,7 +1761,7 @@ index cab91880a08c6fdc545804911d295e0f24f4d983..8f2bff24256f0946f38e1d8b0ae9c8c9 LevelChunk chunk = chunkPacketInfo.getChunk(); int x = chunk.getPos().x; diff --git a/src/main/java/com/destroystokyo/paper/util/RedstoneWireTurbo.java b/src/main/java/com/destroystokyo/paper/util/RedstoneWireTurbo.java -index 22a2547810d0c029f29685faddf7ac21cde2df0b..30370ad31056437fa3b5bd65357e2e07cb0a6869 100644 +index 22a2547810d0c029f29685faddf7ac21cde2df0b..e36b4053eb2676e934b8c9c401bf58cfa7dd969c 100644 --- a/src/main/java/com/destroystokyo/paper/util/RedstoneWireTurbo.java +++ b/src/main/java/com/destroystokyo/paper/util/RedstoneWireTurbo.java @@ -832,14 +832,14 @@ public class RedstoneWireTurbo { @@ -1769,7 +1769,7 @@ index 22a2547810d0c029f29685faddf7ac21cde2df0b..30370ad31056437fa3b5bd65357e2e07 int l = 0; - wire.shouldSignal = false; -+ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal = false; // Folia - region threading ++ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal = false; // Folia - region threading // Unfortunately, World.isBlockIndirectlyGettingPowered is complicated, // and I'm not ready to try to replicate even more functionality from // elsewhere in Minecraft into this accelerator. So sadly, we must @@ -1777,7 +1777,7 @@ index 22a2547810d0c029f29685faddf7ac21cde2df0b..30370ad31056437fa3b5bd65357e2e07 // is consistency to what this call returns, we may be able to cache it. final int k = worldIn.getBestNeighborSignal(upd.self); - wire.shouldSignal = true; -+ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal = true; // Folia - region threading ++ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal = true; // Folia - region threading // The variable 'k' holds the maximum redstone power value of any adjacent blocks. // If 'k' has the highest level of all neighbors, then the power level of this @@ -1863,7 +1863,7 @@ index 3c17001bcd3862a76a22df488bff80a0ff4d1b83..b2fffaa862df045bacb346f3cbe7eb96 } } diff --git a/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java b/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java -index 6df1948b1204a7288ecb7238b6fc2a733f7d25b3..6a413abc67aa4dcbab64231be3eb13446d5cc820 100644 +index 61d03808c8d1ab822d9b2f31fab0de14089a3b15..9051a556fea7ee35014db7bdd75b5476f672f5a9 100644 --- a/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java +++ b/src/main/java/io/papermc/paper/chunk/system/ChunkSystem.java @@ -91,6 +91,9 @@ public final class ChunkSystem { @@ -1910,11 +1910,11 @@ index 6df1948b1204a7288ecb7238b6fc2a733f7d25b3..6a413abc67aa4dcbab64231be3eb1344 } public static ChunkHolder getUnloadingChunkHolder(final ServerLevel level, final int chunkX, final int chunkZ) { -diff --git a/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java -index 7e2176f343160b299e7d4a2817c8f6c9ba7dba7b..9d44c3923ba29d88e39b742f3da97372626b352e 100644 ---- a/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java -+++ b/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java -@@ -232,17 +232,19 @@ public class RegionisedPlayerChunkLoader { +diff --git a/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java +index 99dc2038aa4fb0f70dc3670e451018ff541d3a85..5b4025178c1e476ed5dd0808cc33bf1ec7c08b66 100644 +--- a/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java ++++ b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java +@@ -232,17 +232,19 @@ public class RegionizedPlayerChunkLoader { public void tick() { TickThread.ensureTickThread("Cannot tick player chunk loader async"); long currTime = System.nanoTime(); @@ -1938,7 +1938,7 @@ index 7e2176f343160b299e7d4a2817c8f6c9ba7dba7b..9d44c3923ba29d88e39b742f3da97372 } private static long[] generateBFSOrder(final int radius) { -@@ -384,13 +386,13 @@ public class RegionisedPlayerChunkLoader { +@@ -384,13 +386,13 @@ public class RegionizedPlayerChunkLoader { this.player = player; } @@ -1955,7 +1955,7 @@ index 7e2176f343160b299e7d4a2817c8f6c9ba7dba7b..9d44c3923ba29d88e39b742f3da97372 } private void pushDelayedTicketOp(final ChunkHolderManager.TicketOperation op) { -@@ -607,7 +609,7 @@ public class RegionisedPlayerChunkLoader { +@@ -607,7 +609,7 @@ public class RegionizedPlayerChunkLoader { return Math.max(Math.abs(dx), Math.abs(dz)) <= this.lastTickDistance; } @@ -1964,7 +1964,7 @@ index 7e2176f343160b299e7d4a2817c8f6c9ba7dba7b..9d44c3923ba29d88e39b742f3da97372 TickThread.ensureTickThread(this.player, "Cannot tick player chunk loader async"); // update rate limits this.chunkSendCounter.update(time); -@@ -799,7 +801,7 @@ public class RegionisedPlayerChunkLoader { +@@ -799,7 +801,7 @@ public class RegionizedPlayerChunkLoader { this.chunkSendCounter.addTime(time, sendSlots); } @@ -2057,7 +2057,7 @@ index 61c170555c8854b102c640b0b6a615f9f732edbf..515cc130a411f218ed20628eb918be9d } diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java -index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de54675e5a148 100644 +index c6d20bc2f0eab737338db6b88dacb63f0decb66c..0d1896d09d419c78501bbccca97424dd1545230b 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java @@ -3,7 +3,6 @@ package io.papermc.paper.chunk.system.scheduling; @@ -2095,8 +2095,8 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 import java.util.function.Predicate; +// Folia start - region threading -+import io.papermc.paper.threadedregions.RegionisedServer; -+import io.papermc.paper.threadedregions.ThreadedRegioniser; ++import io.papermc.paper.threadedregions.RegionizedServer; ++import io.papermc.paper.threadedregions.ThreadedRegionizer; +import io.papermc.paper.threadedregions.TickRegionScheduler; +import io.papermc.paper.threadedregions.TickRegions; +// Folia end - region threading @@ -2275,7 +2275,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 + } + + private ChunkHolderManager.HolderManagerRegionData getCurrentRegionData() { -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + + if (region == null) { @@ -2305,7 +2305,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 - final long coord1 = CoordinateUtils.getChunkKey(c1.chunkX, c1.chunkZ); - final long coord2 = CoordinateUtils.getChunkKey(c2.chunkX, c2.chunkZ); -+ final ThreadedRegioniser.ThreadedRegion region ++ final ThreadedRegionizer.ThreadedRegion region + = this.world.regioniser.getRegionAtUnsynchronised(chunkX, chunkZ); - if (coord1 == coord2) { @@ -2364,7 +2364,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 + // Folia start - region threading + final HolderManagerRegionData regionData = this.getCurrentRegionData(); + if (!regionData.autoSaveQueue.contains(holder)) { -+ holder.lastAutoSave = RegionisedServer.getCurrentTick(); ++ holder.lastAutoSave = RegionizedServer.getCurrentTick(); + // Folia end - region threading + regionData.autoSaveQueue.add(holder); } @@ -2373,7 +2373,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 public void autoSave() { final List reschedule = new ArrayList<>(); - final long currentTick = MinecraftServer.currentTickLong; -+ final long currentTick = RegionisedServer.getCurrentTick(); ++ final long currentTick = RegionizedServer.getCurrentTick(); final long maxSaveTime = currentTick - this.world.paperConfig().chunks.autoSaveInterval.value(); - for (int autoSaved = 0; autoSaved < this.world.paperConfig().chunks.maxAutoSaveChunksPerTick && !this.autoSaveQueue.isEmpty();) { - final NewChunkHolder holder = this.autoSaveQueue.first(); @@ -2507,7 +2507,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 } + // Folia start - region threading -+ final ThreadedRegioniser.ThreadedRegion currRegion = TickRegionScheduler.getCurrentRegion(); ++ final ThreadedRegionizer.ThreadedRegion currRegion = TickRegionScheduler.getCurrentRegion(); + final boolean lock = currRegion == null || this.world.regioniser.getRegionAtUnsynchronised( + CoordinateUtils.getChunkX(chunk), CoordinateUtils.getChunkZ(chunk) + ) != currRegion; @@ -2589,7 +2589,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 } + // Folia start - region threading -+ final ThreadedRegioniser.ThreadedRegion currRegion = TickRegionScheduler.getCurrentRegion(); ++ final ThreadedRegionizer.ThreadedRegion currRegion = TickRegionScheduler.getCurrentRegion(); + final boolean lock = currRegion == null || this.world.regioniser.getRegionAtUnsynchronised( + CoordinateUtils.getChunkX(chunk), CoordinateUtils.getChunkZ(chunk) + ) != currRegion; @@ -2748,7 +2748,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 + final List thisRegionHolders = new ArrayList<>(); + + final int regionShift = this.world.regioniser.sectionChunkShift; -+ final ThreadedRegioniser.ThreadedRegion thisRegion ++ final ThreadedRegionizer.ThreadedRegion thisRegion + = TickRegionScheduler.getCurrentRegion(); + + for (final NewChunkHolder holder : changedFullStatus) { @@ -3004,7 +3004,7 @@ index c6d20bc2f0eab737338db6b88dacb63f0decb66c..04d2c42e69ed8ab27d21d3bf038de546 return ret; } diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java -index 84cc9397237fa0c17aa1012dfb5683c90eb6d3b8..93b666893a9755e426701f5c2849fc0fb2026bb7 100644 +index 84cc9397237fa0c17aa1012dfb5683c90eb6d3b8..25db30284e3bab9ebad1ca7320db66116057e599 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java @@ -113,7 +113,7 @@ public final class ChunkTaskScheduler { @@ -3146,7 +3146,7 @@ index 84cc9397237fa0c17aa1012dfb5683c90eb6d3b8..93b666893a9755e426701f5c2849fc0f public PrioritisedExecutor.PrioritisedTask createChunkTask(final int chunkX, final int chunkZ, final Runnable run, final PrioritisedExecutor.Priority priority) { - return this.mainThreadExecutor.createTask(run, priority); -+ return MinecraftServer.getServer().regionisedServer.taskQueue.createChunkTask(this.world, chunkX, chunkZ, run, priority); // Folia - regionised ticking ++ return MinecraftServer.getServer().regionizedServer.taskQueue.createChunkTask(this.world, chunkX, chunkZ, run, priority); // Folia - regionised ticking } public PrioritisedExecutor.PrioritisedTask scheduleChunkTask(final int chunkX, final int chunkZ, final Runnable run) { @@ -3157,7 +3157,7 @@ index 84cc9397237fa0c17aa1012dfb5683c90eb6d3b8..93b666893a9755e426701f5c2849fc0f public PrioritisedExecutor.PrioritisedTask scheduleChunkTask(final int chunkX, final int chunkZ, final Runnable run, final PrioritisedExecutor.Priority priority) { - return this.mainThreadExecutor.queueRunnable(run, priority); -+ return MinecraftServer.getServer().regionisedServer.taskQueue.queueChunkTask(this.world, chunkX, chunkZ, run, priority); // Folia - regionised ticking ++ return MinecraftServer.getServer().regionizedServer.taskQueue.queueChunkTask(this.world, chunkX, chunkZ, run, priority); // Folia - regionised ticking } - public void executeTasksUntil(final BooleanSupplier exit) { @@ -3177,7 +3177,7 @@ index 84cc9397237fa0c17aa1012dfb5683c90eb6d3b8..93b666893a9755e426701f5c2849fc0f + final PrioritisedExecutor.Priority priority) { + final PrioritisedExecutor.PrioritisedTask ret = this.createChunkTask(chunkX, chunkZ, run, priority); + this.world.taskQueueRegionData.pushGlobalChunkTask(() -> { -+ MinecraftServer.getServer().regionisedServer.taskQueue.queueChunkTask(ChunkTaskScheduler.this.world, chunkX, chunkZ, run, priority); ++ MinecraftServer.getServer().regionizedServer.taskQueue.queueChunkTask(ChunkTaskScheduler.this.world, chunkX, chunkZ, run, priority); + }); + return ret; } @@ -3289,14 +3289,14 @@ index bbb8b1933ef33a3b91f69545f69dd3cfb84b27f5..b23b76a598731da8feef53c370b34123 public static void registerCommands(final MinecraftServer server) { diff --git a/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java b/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java -index cd2e4d792e972b8bf1e07b8961594a670ae949cf..6c24e8567d303db35328fe4f0a7b05df16f3590a 100644 +index cd2e4d792e972b8bf1e07b8961594a670ae949cf..3ab8dbf2768a4ef8fb53af6f5431f7f6afe6d168 100644 --- a/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java +++ b/src/main/java/io/papermc/paper/command/subcommands/HeapDumpCommand.java @@ -18,7 +18,9 @@ import static net.kyori.adventure.text.format.NamedTextColor.YELLOW; public final class HeapDumpCommand implements PaperSubcommand { @Override public boolean execute(final CommandSender sender, final String subCommand, final String[] args) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading this.dumpHeap(sender); + }); // Folia - region threading return true; @@ -3368,14 +3368,14 @@ index 99c41a39cdad0271d089c6e03bebfdafba1aaa57..41aaa709dc2e474f23e759ebc51f3302 private static Component createMobcapsComponent(final ToIntFunction countGetter, final ToIntFunction limitGetter) { return MOB_CATEGORY_COLORS.entrySet().stream() diff --git a/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java b/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java -index bd68139ae635f2ad7ec8e7a21e0056a139c4c62e..0f641ac581243db55a667ad8bc5d1110206b389e 100644 +index bd68139ae635f2ad7ec8e7a21e0056a139c4c62e..48a43341b17247355a531164019d5cc9c5555f26 100644 --- a/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java +++ b/src/main/java/io/papermc/paper/command/subcommands/ReloadCommand.java @@ -16,7 +16,9 @@ import static net.kyori.adventure.text.format.NamedTextColor.RED; public final class ReloadCommand implements PaperSubcommand { @Override public boolean execute(final CommandSender sender, final String subCommand, final String[] args) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading this.doReload(sender); + }); // Folia - region threading return true; @@ -3632,7 +3632,7 @@ index 0000000000000000000000000000000000000000..d9687722e02dfd4088c7030abbf5008e +} diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionShutdownThread.java b/src/main/java/io/papermc/paper/threadedregions/RegionShutdownThread.java new file mode 100644 -index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3f2afd9e8 +index 0000000000000000000000000000000000000000..6c288d1db81c4d6f574674889a98553baf9b86ee --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/RegionShutdownThread.java @@ -0,0 +1,174 @@ @@ -3653,7 +3653,7 @@ index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3 + + private static final Logger LOGGER = LogUtils.getClassLogger(); + -+ ThreadedRegioniser.ThreadedRegion shuttingDown; ++ ThreadedRegionizer.ThreadedRegion shuttingDown; + + public RegionShutdownThread(final String name) { + super(name); @@ -3662,7 +3662,7 @@ index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3 + }); + } + -+ static ThreadedRegioniser.ThreadedRegion getRegion() { ++ static ThreadedRegionizer.ThreadedRegion getRegion() { + final Thread currentThread = Thread.currentThread(); + if (currentThread instanceof RegionShutdownThread shutdownThread) { + return shutdownThread.shuttingDown; @@ -3671,7 +3671,7 @@ index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3 + } + + -+ static RegionisedWorldData getWorldData() { ++ static RegionizedWorldData getWorldData() { + final Thread currentThread = Thread.currentThread(); + if (currentThread instanceof RegionShutdownThread shutdownThread) { + // no fast path for shutting down @@ -3695,7 +3695,7 @@ index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3 + } + } + -+ private void finishTeleportations(final ThreadedRegioniser.ThreadedRegion region, ++ private void finishTeleportations(final ThreadedRegionizer.ThreadedRegion region, + final ServerLevel world) { + try { + this.shuttingDown = region; @@ -3729,7 +3729,7 @@ index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3 + } + } + -+ private void saveRegionChunks(final ThreadedRegioniser.ThreadedRegion region, ++ private void saveRegionChunks(final ThreadedRegionizer.ThreadedRegion region, + final boolean last) { + ChunkPos center = null; + try { @@ -3785,17 +3785,17 @@ index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3 + } + LOGGER.info("Halted chunk systems"); + for (final ServerLevel world : MinecraftServer.getServer().getAllLevels()) { -+ final List> ++ final List> + regions = new ArrayList<>(); + world.regioniser.computeForAllRegionsUnsynchronised(regions::add); + + for (int i = 0, len = regions.size(); i < len; ++i) { -+ final ThreadedRegioniser.ThreadedRegion region = regions.get(i); ++ final ThreadedRegionizer.ThreadedRegion region = regions.get(i); + this.finishTeleportations(region, world); + } + + for (int i = 0, len = regions.size(); i < len; ++i) { -+ final ThreadedRegioniser.ThreadedRegion region = regions.get(i); ++ final ThreadedRegionizer.ThreadedRegion region = regions.get(i); + this.saveRegionChunks(region, (i + 1) == len); + } + @@ -3810,11 +3810,11 @@ index 0000000000000000000000000000000000000000..85ef8a74152cb0a71d9133815bee05e3 + // done, part 2 should call exit() + } +} -diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionisedData.java b/src/main/java/io/papermc/paper/threadedregions/RegionisedData.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionizedData.java b/src/main/java/io/papermc/paper/threadedregions/RegionizedData.java new file mode 100644 -index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d89595442018c9dfa2 +index 0000000000000000000000000000000000000000..1f48ada99d6d24880f9bda1cd05d41a4562e42f5 --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/RegionisedData.java ++++ b/src/main/java/io/papermc/paper/threadedregions/RegionizedData.java @@ -0,0 +1,235 @@ +package io.papermc.paper.threadedregions; + @@ -3828,18 +3828,18 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420 +/** + * Use to manage data that needs to be regionised. + *

-+ * Note: that unlike {@link ThreadLocal}, regionised data is not deleted once the {@code RegionisedData} object is GC'd. ++ * Note: that unlike {@link ThreadLocal}, regionised data is not deleted once the {@code RegionizedData} object is GC'd. + * The data is held in reference to the world it resides in. + *

+ *

+ * Note: Keep in mind that when regionised ticking is disabled, the entire server is considered a single region. -+ * That is, the data may or may not cross worlds. As such, the {@code RegionisedData} object must be instanced ++ * That is, the data may or may not cross worlds. As such, the {@code RegionizedData} object must be instanced + * per world when appropriate, as it is no longer guaranteed that separate worlds contain separate regions. + * See below for more details on instancing per world. + *

+ *

+ * Regionised data may be world-checked. That is, {@link #get()} may throw an exception if the current -+ * region's world does not match the {@code RegionisedData}'s world. Consider the usages of {@code RegionisedData} below ++ * region's world does not match the {@code RegionizedData}'s world. Consider the usages of {@code RegionizedData} below + * see why the behavior may or may not be desirable: + *

 + *         {@code
@@ -3859,8 +3859,8 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420
 + *
 + *             // callback is left out of this example
 + *             // note: world != null here
-+ *             public final RegionisedData entityTickLists =
-+ *                 new RegionisedData<>(this, () -> new EntityTickList(), ...);
++ *             public final RegionizedData entityTickLists =
++ *                 new RegionizedData<>(this, () -> new EntityTickList(), ...);
 + *
 + *             public void addTickingEntity(Entity e) {
 + *                 // What we expect here is that this world is the
@@ -3874,7 +3874,7 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420
 + *                 // and if the world check is disabled, then we will actually
 + *                 // retrieve _this_ world's EntityTickList for the region,
 + *                 // and NOT the EntityTickList for the region's world.
-+ *                 // This is because the RegionisedData object is instantiated
++ *                 // This is because the RegionizedData object is instantiated
 + *                 // per world.
 + *                 this.entityTickLists.get().addEntity(e);
 + *             }
@@ -3901,18 +3901,18 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420
 + *             public final List worlds = ...;
 + *
 + *             // callback is left out of this example
-+ *             // note: world == null here, because this RegionisedData object
++ *             // note: world == null here, because this RegionizedData object
 + *             // is not instantiated per world, but rather globally.
-+ *             public final RegionisedData tickTimes =
-+ *                  new RegionisedData<>(null, () -> new TickTimes(), ...);
++ *             public final RegionizedData tickTimes =
++ *                  new RegionizedData<>(null, () -> new TickTimes(), ...);
 + *         }
 + *         }
 + *     
-+ * In general, it is advised that if a RegionisedData object is instantiated per world, that world checking ++ * In general, it is advised that if a RegionizedData object is instantiated per world, that world checking + * is enabled for it by passing the world to the constructor. + *

+ */ -+public final class RegionisedData { ++public final class RegionizedData { + + private final ServerLevel world; + private final Supplier initialValueSupplier; @@ -3937,7 +3937,7 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420 + * @param supplier Initial value supplier used to lazy initialise region data. + * @param callback Region callback to manage this regionised data. + */ -+ public RegionisedData(final ServerLevel world, final Supplier supplier, final RegioniserCallback callback) { ++ public RegionizedData(final ServerLevel world, final Supplier supplier, final RegioniserCallback callback) { + this.world = world; + this.initialValueSupplier = Validate.notNull(supplier, "Supplier may not be null."); + this.callback = Validate.notNull(callback, "Regioniser callback may not be null."); @@ -3955,11 +3955,11 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420 + * Returns the current data type for the current ticking region. If there is no region, returns {@code null}. + * @return the current data type for the current ticking region. If there is no region, returns {@code null}. + * @throws IllegalStateException If the following are true: The server is in region ticking mode, -+ * this {@code RegionisedData}'s world is not {@code null}, -+ * and the current ticking region's world does not match this {@code RegionisedData}'s world. ++ * this {@code RegionizedData}'s world is not {@code null}, ++ * and the current ticking region's world does not match this {@code RegionizedData}'s world. + */ + public @Nullable T get() { -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + + if (region == null) { @@ -3970,7 +3970,7 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420 + throw new IllegalStateException("World check failed: expected world: " + this.world.getWorld().getKey() + ", region world: " + region.getData().world.getWorld().getKey()); + } + -+ return region.getData().getOrCreateRegionisedData(this); ++ return region.getData().getOrCreateRegionizedData(this); + } + + /** @@ -4051,17 +4051,16 @@ index 0000000000000000000000000000000000000000..3549e5f3359f38b207e189d895954420 + ); + } +} -diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionisedServer.java b/src/main/java/io/papermc/paper/threadedregions/RegionisedServer.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionizedServer.java b/src/main/java/io/papermc/paper/threadedregions/RegionizedServer.java new file mode 100644 -index 0000000000000000000000000000000000000000..4525ad9d0537406e2ca6ff8627d06c683e09a57a +index 0000000000000000000000000000000000000000..6c1d55144f044f39926ddf998104950b9efe3ee1 --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/RegionisedServer.java -@@ -0,0 +1,355 @@ ++++ b/src/main/java/io/papermc/paper/threadedregions/RegionizedServer.java +@@ -0,0 +1,348 @@ +package io.papermc.paper.threadedregions; + +import ca.spottedleaf.concurrentutil.collection.MultiThreadedQueue; +import ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool; -+import com.mojang.authlib.GameProfile; +import com.mojang.logging.LogUtils; +import io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler; +import io.papermc.paper.util.TickThread; @@ -4073,33 +4072,27 @@ index 0000000000000000000000000000000000000000..4525ad9d0537406e2ca6ff8627d06c68 +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.protocol.game.ClientboundDisconnectPacket; -+import net.minecraft.network.protocol.status.ServerStatus; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.level.ServerLevel; -+import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.network.ServerLoginPacketListenerImpl; -+import net.minecraft.server.players.PlayerList; -+import net.minecraft.util.Mth; +import net.minecraft.world.level.GameRules; -+import net.minecraft.world.level.levelgen.LegacyRandomSource; +import org.bukkit.Bukkit; +import org.slf4j.Logger; +import java.util.ArrayList; -+import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BooleanSupplier; + -+public final class RegionisedServer { ++public final class RegionizedServer { + + private static final Logger LOGGER = LogUtils.getLogger(); -+ private static final RegionisedServer INSTANCE = new RegionisedServer(); ++ private static final RegionizedServer INSTANCE = new RegionizedServer(); + -+ public final RegionisedTaskQueue taskQueue = new RegionisedTaskQueue(); ++ public final RegionizedTaskQueue taskQueue = new RegionizedTaskQueue(); + + private final CopyOnWriteArrayList worlds = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); @@ -4108,7 +4101,7 @@ index 0000000000000000000000000000000000000000..4525ad9d0537406e2ca6ff8627d06c68 + + private final GlobalTickTickHandle tickHandle = new GlobalTickTickHandle(this); + -+ public static RegionisedServer getInstance() { ++ public static RegionizedServer getInstance() { + return INSTANCE; + } + @@ -4126,7 +4119,7 @@ index 0000000000000000000000000000000000000000..4525ad9d0537406e2ca6ff8627d06c68 + + public void init() { + // call init event _before_ scheduling anything -+ new RegionisedServerInitEvent().callEvent(); ++ new RegionizedServerInitEvent().callEvent(); + + // now we can schedule + this.tickHandle.setInitialStart(System.nanoTime() + TickRegionScheduler.TIME_BETWEEN_TICKS); @@ -4152,7 +4145,7 @@ index 0000000000000000000000000000000000000000..4525ad9d0537406e2ca6ff8627d06c68 + * @throws IllegalStateException If there is no current region. + */ + public static long getCurrentTick() throws IllegalStateException { -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { + if (TickThread.isShutdownThread()) { @@ -4179,12 +4172,12 @@ index 0000000000000000000000000000000000000000..4525ad9d0537406e2ca6ff8627d06c68 + + private static final class GlobalTickTickHandle extends TickRegionScheduler.RegionScheduleHandle { + -+ private final RegionisedServer server; ++ private final RegionizedServer server; + + private final AtomicBoolean scheduled = new AtomicBoolean(); + private final AtomicBoolean ticking = new AtomicBoolean(); + -+ public GlobalTickTickHandle(final RegionisedServer server) { ++ public GlobalTickTickHandle(final RegionizedServer server) { + super(null, SchedulerThreadPool.DEADLINE_NOT_SET); + this.server = server; + } @@ -4412,11 +4405,11 @@ index 0000000000000000000000000000000000000000..4525ad9d0537406e2ca6ff8627d06c68 + + } +} -diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionisedTaskQueue.java b/src/main/java/io/papermc/paper/threadedregions/RegionisedTaskQueue.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionizedTaskQueue.java b/src/main/java/io/papermc/paper/threadedregions/RegionizedTaskQueue.java new file mode 100644 -index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd25aa54be +index 0000000000000000000000000000000000000000..ac043fbc74874c205b821c3d2d011b921d5704fa --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/RegionisedTaskQueue.java ++++ b/src/main/java/io/papermc/paper/threadedregions/RegionizedTaskQueue.java @@ -0,0 +1,752 @@ +package io.papermc.paper.threadedregions; + @@ -4438,7 +4431,7 @@ index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.ReentrantLock; + -+public final class RegionisedTaskQueue { ++public final class RegionizedTaskQueue { + + private static final TicketType TASK_QUEUE_TICKET = TicketType.create("task_queue_ticket", (a, b) -> 0); + @@ -4513,8 +4506,8 @@ index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd + } + + private PrioritisedQueue getQueue(final boolean synchronise, final int chunkX, final int chunkZ, final boolean isChunkTask) { -+ final ThreadedRegioniser regioniser = this.world.regioniser; -+ final ThreadedRegioniser.ThreadedRegion region ++ final ThreadedRegionizer regioniser = this.world.regioniser; ++ final ThreadedRegionizer.ThreadedRegion region + = synchronise ? regioniser.getRegionAtSynchronised(chunkX, chunkZ) : regioniser.getRegionAtUnsynchronised(chunkX, chunkZ); + if (region == null) { + return null; @@ -4636,8 +4629,8 @@ index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd + return this.worldRegionTaskData.executeGlobalChunkTask() || this.chunkQueue.executeTask(); + } + -+ void split(final ThreadedRegioniser regioniser, -+ final Long2ReferenceOpenHashMap> into) { ++ void split(final ThreadedRegionizer regioniser, ++ final Long2ReferenceOpenHashMap> into) { + this.tickTaskQueue.split( + false, regioniser, into + ); @@ -4743,9 +4736,9 @@ index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd + + // into is a map of section coordinate to region + public void split(final boolean isChunkData, -+ final ThreadedRegioniser regioniser, -+ final Long2ReferenceOpenHashMap> into) { -+ final Reference2ReferenceOpenHashMap, ArrayDeque[]> ++ final ThreadedRegionizer regioniser, ++ final Long2ReferenceOpenHashMap> into) { ++ final Reference2ReferenceOpenHashMap, ArrayDeque[]> + split = new Reference2ReferenceOpenHashMap<>(); + final int shift = regioniser.sectionChunkShift; + synchronized (this) { @@ -4761,7 +4754,7 @@ index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd + final int sectionX = task.chunkX >> shift; + final int sectionZ = task.chunkZ >> shift; + final long sectionKey = CoordinateUtils.getChunkKey(sectionX, sectionZ); -+ final ThreadedRegioniser.ThreadedRegion ++ final ThreadedRegionizer.ThreadedRegion + region = into.get(sectionKey); + if (region == null) { + throw new IllegalStateException(); @@ -4780,10 +4773,10 @@ index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd + } + + // merge the targets into their queues -+ for (final Iterator, ArrayDeque[]>> ++ for (final Iterator, ArrayDeque[]>> + iterator = split.reference2ReferenceEntrySet().fastIterator(); + iterator.hasNext();) { -+ final Reference2ReferenceMap.Entry, ArrayDeque[]> ++ final Reference2ReferenceMap.Entry, ArrayDeque[]> + entry = iterator.next(); + final RegionTaskQueueData taskQueueData = entry.getKey().getData().getTaskQueueData(); + mergeInto(isChunkData ? taskQueueData.chunkQueue : taskQueueData.tickTaskQueue, entry.getValue()); @@ -5170,11 +5163,11 @@ index 0000000000000000000000000000000000000000..b9c9c2db35924bcc5e752d39fa2949bd + } + } +} -diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionisedWorldData.java b/src/main/java/io/papermc/paper/threadedregions/RegionisedWorldData.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionizedWorldData.java b/src/main/java/io/papermc/paper/threadedregions/RegionizedWorldData.java new file mode 100644 -index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a6566b56d +index 0000000000000000000000000000000000000000..f55c28bbee70e8418dd0555d50c43ddd434d5347 --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/RegionisedWorldData.java ++++ b/src/main/java/io/papermc/paper/threadedregions/RegionizedWorldData.java @@ -0,0 +1,665 @@ +package io.papermc.paper.threadedregions; + @@ -5235,13 +5228,13 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a +import java.util.function.Consumer; +import java.util.function.Predicate; + -+public final class RegionisedWorldData { ++public final class RegionizedWorldData { + + private static final Logger LOGGER = LogUtils.getLogger(); + -+ public static final RegionisedData.RegioniserCallback REGION_CALLBACK = new RegionisedData.RegioniserCallback<>() { ++ public static final RegionizedData.RegioniserCallback REGION_CALLBACK = new RegionizedData.RegioniserCallback<>() { + @Override -+ public void merge(final RegionisedWorldData from, final RegionisedWorldData into, final long fromTickOffset) { ++ public void merge(final RegionizedWorldData from, final RegionizedWorldData into, final long fromTickOffset) { + // connections + for (final Connection conn : from.connections) { + into.connections.add(conn); @@ -5315,9 +5308,9 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + } + + @Override -+ public void split(final RegionisedWorldData from, final int chunkToRegionShift, -+ final Long2ReferenceOpenHashMap regionToData, -+ final ReferenceOpenHashSet dataSet) { ++ public void split(final RegionizedWorldData from, final int chunkToRegionShift, ++ final Long2ReferenceOpenHashMap regionToData, ++ final ReferenceOpenHashSet dataSet) { + // connections + for (final Connection conn : from.connections) { + final ServerPlayer player = conn.getPlayer(); @@ -5339,7 +5332,7 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + final ChunkPos pos = entity.chunkPosition(); + // Note: It is impossible for an entity in the world to _not_ be in an entity chunk, which means + // the chunk holder must _exist_, and so the region section exists. -+ final RegionisedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(pos.x >> chunkToRegionShift, pos.z >> chunkToRegionShift)); ++ final RegionizedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(pos.x >> chunkToRegionShift, pos.z >> chunkToRegionShift)); + into.allEntities.add(entity); + // Note: entityTickList is a subset of allEntities + if (from.entityTickList.contains(entity)) { @@ -5356,7 +5349,7 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + final int chunkX = pos.getX() >> 4; + final int chunkZ = pos.getZ() >> 4; + -+ final RegionisedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(chunkX >> chunkToRegionShift, chunkZ >> chunkToRegionShift)); ++ final RegionizedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(chunkX >> chunkToRegionShift, chunkZ >> chunkToRegionShift)); + // Unlike entities, the chunk holder is not guaranteed to exist for block events, because the block events + // is just some list. So if it unloads, I guess it's just lost. + if (into != null) { @@ -5367,11 +5360,11 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + final Long2ReferenceOpenHashMap> levelTicksBlockRegionData = new Long2ReferenceOpenHashMap<>(regionToData.size(), 0.75f); + final Long2ReferenceOpenHashMap> levelTicksFluidRegionData = new Long2ReferenceOpenHashMap<>(regionToData.size(), 0.75f); + -+ for (final Iterator> iterator = regionToData.long2ReferenceEntrySet().fastIterator(); ++ for (final Iterator> iterator = regionToData.long2ReferenceEntrySet().fastIterator(); + iterator.hasNext();) { -+ final Long2ReferenceMap.Entry entry = iterator.next(); ++ final Long2ReferenceMap.Entry entry = iterator.next(); + final long key = entry.getLongKey(); -+ final RegionisedWorldData worldData = entry.getValue(); ++ final RegionizedWorldData worldData = entry.getValue(); + + levelTicksBlockRegionData.put(key, worldData.blockLevelTicks); + levelTicksFluidRegionData.put(key, worldData.fluidLevelTicks); @@ -5386,7 +5379,7 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + final int chunkX = pos.getX() >> 4; + final int chunkZ = pos.getZ() >> 4; + -+ final RegionisedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(chunkX >> chunkToRegionShift, chunkZ >> chunkToRegionShift)); ++ final RegionizedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(chunkX >> chunkToRegionShift, chunkZ >> chunkToRegionShift)); + if (into != null) { + into.pendingBlockEntityTickers.add(tileEntity); + } // else: when a chunk unloads, it does not actually _remove_ the tile entity from the list, it just gets @@ -5397,15 +5390,15 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + final int chunkX = pos.getX() >> 4; + final int chunkZ = pos.getZ() >> 4; + -+ final RegionisedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(chunkX >> chunkToRegionShift, chunkZ >> chunkToRegionShift)); ++ final RegionizedWorldData into = regionToData.get(CoordinateUtils.getChunkKey(chunkX >> chunkToRegionShift, chunkZ >> chunkToRegionShift)); + if (into != null) { + into.blockEntityTickers.add(tileEntity); + } // else: when a chunk unloads, it does not actually _remove_ the tile entity from the list, it just gets + // marked as removed. So if there is no section, it's probably removed! + } + // time -+ for (final RegionisedWorldData regionisedWorldData : dataSet) { -+ regionisedWorldData.redstoneTime = from.redstoneTime; ++ for (final RegionizedWorldData regionizedWorldData : dataSet) { ++ regionizedWorldData.redstoneTime = from.redstoneTime; + } + // ticking chunks + for (final Iterator iterator = from.entityTickingChunks.unsafeIterator(); iterator.hasNext();) { @@ -5428,7 +5421,7 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + for (final net.minecraft.world.level.block.RedstoneTorchBlock.Toggle info : from.redstoneUpdateInfos) { + final BlockPos pos = info.pos; + -+ final RegionisedWorldData worldData = regionToData.get(CoordinateUtils.getChunkKey((pos.getX() >> 4) >> chunkToRegionShift, (pos.getZ() >> 4) >> chunkToRegionShift)); ++ final RegionizedWorldData worldData = regionToData.get(CoordinateUtils.getChunkKey((pos.getX() >> 4) >> chunkToRegionShift, (pos.getZ() >> 4) >> chunkToRegionShift)); + if (worldData != null) { + if (worldData.redstoneUpdateInfos == null) { + worldData.redstoneUpdateInfos = new ArrayDeque<>(); @@ -5449,21 +5442,21 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + regionToData.get(CoordinateUtils.getChunkKey(chunkX >> chunkToRegionShift, chunkZ >> chunkToRegionShift)).chunksBeingWorkedOn.put(pos, value); + } + // mob spawning -+ for (final RegionisedWorldData regionisedWorldData : dataSet) { -+ regionisedWorldData.catSpawnerNextTick = from.catSpawnerNextTick; -+ regionisedWorldData.patrolSpawnerNextTick = from.patrolSpawnerNextTick; -+ regionisedWorldData.phantomSpawnerNextTick = from.phantomSpawnerNextTick; -+ regionisedWorldData.wanderingTraderTickDelay = from.wanderingTraderTickDelay; -+ regionisedWorldData.wanderingTraderSpawnChance = from.wanderingTraderSpawnChance; -+ regionisedWorldData.wanderingTraderSpawnDelay = from.wanderingTraderSpawnDelay; -+ regionisedWorldData.villageSiegeState = new VillageSiegeState(); // just re set it, as the spawn pos will be invalid ++ for (final RegionizedWorldData regionizedWorldData : dataSet) { ++ regionizedWorldData.catSpawnerNextTick = from.catSpawnerNextTick; ++ regionizedWorldData.patrolSpawnerNextTick = from.patrolSpawnerNextTick; ++ regionizedWorldData.phantomSpawnerNextTick = from.phantomSpawnerNextTick; ++ regionizedWorldData.wanderingTraderTickDelay = from.wanderingTraderTickDelay; ++ regionizedWorldData.wanderingTraderSpawnChance = from.wanderingTraderSpawnChance; ++ regionizedWorldData.wanderingTraderSpawnDelay = from.wanderingTraderSpawnDelay; ++ regionizedWorldData.villageSiegeState = new VillageSiegeState(); // just re set it, as the spawn pos will be invalid + } + } + }; + + public final ServerLevel world; + -+ private RegionisedServer.WorldLevelData tickData; ++ private RegionizedServer.WorldLevelData tickData; + + // connections + public final List connections = new ArrayList<>(); @@ -5600,7 +5593,7 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + public int spawnZ; + } + -+ public RegionisedWorldData(final ServerLevel world) { ++ public RegionizedWorldData(final ServerLevel world) { + this.world = world; + this.blockLevelTicks = new LevelTicks<>(world::isPositionTickingWithEntitiesLoaded, world.getProfilerSupplier(), world, true); + this.fluidLevelTicks = new LevelTicks<>(world::isPositionTickingWithEntitiesLoaded, world.getProfilerSupplier(), world, false); @@ -5610,7 +5603,7 @@ index 0000000000000000000000000000000000000000..d22c6140ee4e34a6cc2dcd110e3cfb1a + this.updateTickData(); + } + -+ public RegionisedServer.WorldLevelData getTickData() { ++ public RegionizedServer.WorldLevelData getTickData() { + return this.tickData; + } + @@ -6004,11 +5997,11 @@ index 0000000000000000000000000000000000000000..84b4ff07735fb84e28ee8966ffdedb1b + + private TeleportUtils() {} +} -diff --git a/src/main/java/io/papermc/paper/threadedregions/ThreadedRegioniser.java b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegioniser.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java new file mode 100644 -index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da063119868 +index 0000000000000000000000000000000000000000..ff290d9dcd3494215ce7e41945ef47f00e8c9489 --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegioniser.java ++++ b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java @@ -0,0 +1,1211 @@ +package io.papermc.paper.threadedregions; + @@ -6035,7 +6028,7 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; + -+public final class ThreadedRegioniser, S extends ThreadedRegioniser.ThreadedRegionSectionData> { ++public final class ThreadedRegionizer, S extends ThreadedRegionizer.ThreadedRegionSectionData> { + + private static final Logger LOGGER = LogUtils.getLogger(); + @@ -6062,7 +6055,7 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 + * See REGION_LOGIC.md for complete details on what this class is doing + */ + -+ public ThreadedRegioniser(final int minSectionRecalcCount, final double maxDeadRegionPercent, ++ public ThreadedRegionizer(final int minSectionRecalcCount, final double maxDeadRegionPercent, + final int emptySectionCreateRadius, final int regionSectionMergeRadius, + final int regionSectionChunkShift, final ServerLevel world, + final RegionCallbacks callbacks) { @@ -6654,14 +6647,14 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 + private final Long2ReferenceOpenHashMap> sectionByKey = new Long2ReferenceOpenHashMap<>(); + private final ReferenceOpenHashSet> deadSections = new ReferenceOpenHashSet<>(); + -+ public final ThreadedRegioniser regioniser; ++ public final ThreadedRegionizer regioniser; + + private final R data; + + private final ReferenceOpenHashSet> mergeIntoLater = new ReferenceOpenHashSet<>(); + private final ReferenceOpenHashSet> expectingMergeFrom = new ReferenceOpenHashSet<>(); + -+ public ThreadedRegion(final ThreadedRegioniser regioniser) { ++ public ThreadedRegion(final ThreadedRegionizer regioniser) { + this.regioniser = regioniser; + this.id = REGION_ID_GENERATOR.getAndIncrement(); + this.state = STATE_TRANSIENT; @@ -6912,7 +6905,7 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 + private ThreadedRegion region; + private static final VarHandle REGION_HANDLE = ConcurrentUtil.getVarHandle(ThreadedRegionSection.class, "region", ThreadedRegion.class); + -+ public final ThreadedRegioniser regioniser; ++ public final ThreadedRegionizer regioniser; + + private final int regionChunkShift; + private final int regionChunkMask; @@ -6932,7 +6925,7 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 + } + + // creates an empty section with zero non-empty neighbours -+ private ThreadedRegionSection(final int sectionX, final int sectionZ, final ThreadedRegioniser regioniser) { ++ private ThreadedRegionSection(final int sectionX, final int sectionZ, final ThreadedRegionizer regioniser) { + this.sectionX = sectionX; + this.sectionZ = sectionZ; + this.sectionKey = CoordinateUtils.getChunkKey(sectionX, sectionZ); @@ -6945,7 +6938,7 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 + } + + // creates a section with an initial chunk with zero non-empty neighbours -+ private ThreadedRegionSection(final int sectionX, final int sectionZ, final ThreadedRegioniser regioniser, ++ private ThreadedRegionSection(final int sectionX, final int sectionZ, final ThreadedRegionizer regioniser, + final int chunkXInit, final int chunkZInit) { + this(sectionX, sectionZ, regioniser); + @@ -6955,7 +6948,7 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 + } + + // creates an empty section with the specified number of non-empty neighbours -+ private ThreadedRegionSection(final int sectionX, final int sectionZ, final ThreadedRegioniser regioniser, ++ private ThreadedRegionSection(final int sectionX, final int sectionZ, final ThreadedRegionizer regioniser, + final int nonEmptyNeighbours) { + this(sectionX, sectionZ, regioniser); + @@ -7108,7 +7101,7 @@ index 0000000000000000000000000000000000000000..2334e62953a4d0a415c4c1fe653b6da0 + * @param into A map of region section coordinate key to the region that owns the section. + * @param regions The set of regions to split into. + */ -+ public void split(final ThreadedRegioniser regioniser, final Long2ReferenceOpenHashMap> into, ++ public void split(final ThreadedRegionizer regioniser, final Long2ReferenceOpenHashMap> into, + final ReferenceOpenHashSet> regions); + + /** @@ -7562,7 +7555,7 @@ index 0000000000000000000000000000000000000000..29f9fed5f02530b3256e6b993e607d46 +} diff --git a/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java new file mode 100644 -index 0000000000000000000000000000000000000000..22d54b86ad86ecb8b739f51aedcb3fc02c9a738a +index 0000000000000000000000000000000000000000..3f14eda409ca49095dc43796868435b705c36ce4 --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/TickRegionScheduler.java @@ -0,0 +1,559 @@ @@ -7619,7 +7612,7 @@ index 0000000000000000000000000000000000000000..22d54b86ad86ecb8b739f51aedcb3fc0 + return this.scheduler.getThreads().length; + } + -+ private static void setTickingRegion(final ThreadedRegioniser.ThreadedRegion region) { ++ private static void setTickingRegion(final ThreadedRegionizer.ThreadedRegion region) { + final Thread currThread = Thread.currentThread(); + if (!(currThread instanceof TickThreadRunner tickThreadRunner)) { + throw new IllegalStateException("Must be tick thread runner"); @@ -7632,9 +7625,9 @@ index 0000000000000000000000000000000000000000..22d54b86ad86ecb8b739f51aedcb3fc0 + } + tickThreadRunner.currentTickingRegion = region; + if (region != null) { -+ tickThreadRunner.currentTickingWorldRegionisedData = region.regioniser.world.worldRegionData.get(); ++ tickThreadRunner.currentTickingWorldRegionizedData = region.regioniser.world.worldRegionData.get(); + } else { -+ tickThreadRunner.currentTickingWorldRegionisedData = null; ++ tickThreadRunner.currentTickingWorldRegionizedData = null; + } + } + @@ -7656,7 +7649,7 @@ index 0000000000000000000000000000000000000000..22d54b86ad86ecb8b739f51aedcb3fc0 + * Returns the current ticking region, or {@code null} if there is no ticking region. + * If this thread is not a TickThread, then returns {@code null}. + */ -+ public static ThreadedRegioniser.ThreadedRegion getCurrentRegion() { ++ public static ThreadedRegionizer.ThreadedRegion getCurrentRegion() { + final Thread currThread = Thread.currentThread(); + if (!(currThread instanceof TickThreadRunner tickThreadRunner)) { + return RegionShutdownThread.getRegion(); @@ -7666,15 +7659,15 @@ index 0000000000000000000000000000000000000000..22d54b86ad86ecb8b739f51aedcb3fc0 + + /** + * Returns the current ticking region's world regionised data, or {@code null} if there is no ticking region. -+ * This is a faster alternative to calling the {@link RegionisedData#get()} method. ++ * This is a faster alternative to calling the {@link RegionizedData#get()} method. + * If this thread is not a TickThread, then returns {@code null}. + */ -+ public static RegionisedWorldData getCurrentRegionisedWorldData() { ++ public static RegionizedWorldData getCurrentRegionizedWorldData() { + final Thread currThread = Thread.currentThread(); + if (!(currThread instanceof TickThreadRunner tickThreadRunner)) { + return RegionShutdownThread.getWorldData(); + } -+ return tickThreadRunner.currentTickingWorldRegionisedData; ++ return tickThreadRunner.currentTickingWorldRegionizedData; + } + + /** @@ -7758,8 +7751,8 @@ index 0000000000000000000000000000000000000000..22d54b86ad86ecb8b739f51aedcb3fc0 + // This is much faster than a thread local, since the thread local has to use a map lookup. + private static final class TickThreadRunner extends TickThread { + -+ private ThreadedRegioniser.ThreadedRegion currentTickingRegion; -+ private RegionisedWorldData currentTickingWorldRegionisedData; ++ private ThreadedRegionizer.ThreadedRegion currentTickingRegion; ++ private RegionizedWorldData currentTickingWorldRegionizedData; + private SchedulerThreadPool.SchedulableTick currentTickingTask; + + public TickThreadRunner(final Runnable run, final String name) { @@ -8127,7 +8120,7 @@ index 0000000000000000000000000000000000000000..22d54b86ad86ecb8b739f51aedcb3fc0 +} diff --git a/src/main/java/io/papermc/paper/threadedregions/TickRegions.java b/src/main/java/io/papermc/paper/threadedregions/TickRegions.java new file mode 100644 -index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d774baea1 +index 0000000000000000000000000000000000000000..1ac3c3612df4c1c5c28efc4e23ea107aa722050e --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/TickRegions.java @@ -0,0 +1,355 @@ @@ -8151,7 +8144,7 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.BooleanSupplier; + -+public final class TickRegions implements ThreadedRegioniser.RegionCallbacks { ++public final class TickRegions implements ThreadedRegionizer.RegionCallbacks { + + private static final Logger LOGGER = LogUtils.getLogger(); + @@ -8189,7 +8182,7 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + } + + @Override -+ public TickRegionData createNewData(final ThreadedRegioniser.ThreadedRegion region) { ++ public TickRegionData createNewData(final ThreadedRegionizer.ThreadedRegion region) { + return new TickRegionData(region); + } + @@ -8199,17 +8192,17 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + } + + @Override -+ public void onRegionCreate(final ThreadedRegioniser.ThreadedRegion region) { ++ public void onRegionCreate(final ThreadedRegionizer.ThreadedRegion region) { + // nothing for now + } + + @Override -+ public void onRegionDestroy(final ThreadedRegioniser.ThreadedRegion region) { ++ public void onRegionDestroy(final ThreadedRegionizer.ThreadedRegion region) { + // nothing for now + } + + @Override -+ public void onRegionActive(final ThreadedRegioniser.ThreadedRegion region) { ++ public void onRegionActive(final ThreadedRegionizer.ThreadedRegion region) { + final TickRegionData data = region.getData(); + + data.tickHandle.checkInitialSchedule(); @@ -8217,7 +8210,7 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + } + + @Override -+ public void onRegionInactive(final ThreadedRegioniser.ThreadedRegion region) { ++ public void onRegionInactive(final ThreadedRegionizer.ThreadedRegion region) { + final TickRegionData data = region.getData(); + + scheduler.descheduleRegion(data.tickHandle); @@ -8225,36 +8218,36 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + data.tickHandle = data.tickHandle.copy(); + } + -+ public static final class TickRegionSectionData implements ThreadedRegioniser.ThreadedRegionSectionData {} ++ public static final class TickRegionSectionData implements ThreadedRegionizer.ThreadedRegionSectionData {} + -+ public static final class TickRegionData implements ThreadedRegioniser.ThreadedRegionData { ++ public static final class TickRegionData implements ThreadedRegionizer.ThreadedRegionData { + + private static final AtomicLong ID_GENERATOR = new AtomicLong(); + /** Never 0L, since 0L is reserved for global region. */ + public final long id = ID_GENERATOR.incrementAndGet(); + -+ public final ThreadedRegioniser.ThreadedRegion region; ++ public final ThreadedRegionizer.ThreadedRegion region; + public final ServerLevel world; + + // generic regionised data -+ private final Reference2ReferenceOpenHashMap, Object> regionisedData = new Reference2ReferenceOpenHashMap<>(); ++ private final Reference2ReferenceOpenHashMap, Object> regionizedData = new Reference2ReferenceOpenHashMap<>(); + + // tick data + private ConcreteRegionTickHandle tickHandle = new ConcreteRegionTickHandle(this, SchedulerThreadPool.DEADLINE_NOT_SET); + + // queue data -+ private final RegionisedTaskQueue.RegionTaskQueueData taskQueueData; ++ private final RegionizedTaskQueue.RegionTaskQueueData taskQueueData; + + // chunk holder manager data + private final ChunkHolderManager.HolderManagerRegionData holderManagerRegionData = new ChunkHolderManager.HolderManagerRegionData(); + -+ private TickRegionData(final ThreadedRegioniser.ThreadedRegion region) { ++ private TickRegionData(final ThreadedRegionizer.ThreadedRegion region) { + this.region = region; + this.world = region.regioniser.world; -+ this.taskQueueData = new RegionisedTaskQueue.RegionTaskQueueData(this.world.taskQueueRegionData); ++ this.taskQueueData = new RegionizedTaskQueue.RegionTaskQueueData(this.world.taskQueueRegionData); + } + -+ public RegionisedTaskQueue.RegionTaskQueueData getTaskQueueData() { ++ public RegionizedTaskQueue.RegionTaskQueueData getTaskQueueData() { + return this.taskQueueData; + } + @@ -8272,74 +8265,74 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + return this.holderManagerRegionData; + } + -+ T getOrCreateRegionisedData(final RegionisedData regionisedData) { -+ T ret = (T)this.regionisedData.get(regionisedData); ++ T getOrCreateRegionizedData(final RegionizedData regionizedData) { ++ T ret = (T)this.regionizedData.get(regionizedData); + + if (ret != null) { + return ret; + } + -+ ret = regionisedData.createNewValue(); -+ this.regionisedData.put(regionisedData, ret); ++ ret = regionizedData.createNewValue(); ++ this.regionizedData.put(regionizedData, ret); + + return ret; + } + + @Override -+ public void split(final ThreadedRegioniser regioniser, -+ final Long2ReferenceOpenHashMap> into, -+ final ReferenceOpenHashSet> regions) { ++ public void split(final ThreadedRegionizer regioniser, ++ final Long2ReferenceOpenHashMap> into, ++ final ReferenceOpenHashSet> regions) { + final int shift = regioniser.sectionChunkShift; + + // tick data + // note: here it is OK force us to access tick handle, as this region is owned (and thus not scheduled), + // and the other regions to split into are not scheduled yet. -+ for (final ThreadedRegioniser.ThreadedRegion region : regions) { ++ for (final ThreadedRegionizer.ThreadedRegion region : regions) { + final TickRegionData data = region.getData(); + data.tickHandle.copyDeadlineAndTickCount(this.tickHandle); + } + + // generic regionised data -+ for (final Iterator, Object>> dataIterator = this.regionisedData.reference2ReferenceEntrySet().fastIterator(); ++ for (final Iterator, Object>> dataIterator = this.regionizedData.reference2ReferenceEntrySet().fastIterator(); + dataIterator.hasNext();) { -+ final Reference2ReferenceMap.Entry, Object> regionDataEntry = dataIterator.next(); -+ final RegionisedData data = regionDataEntry.getKey(); ++ final Reference2ReferenceMap.Entry, Object> regionDataEntry = dataIterator.next(); ++ final RegionizedData data = regionDataEntry.getKey(); + final Object from = regionDataEntry.getValue(); + + final ReferenceOpenHashSet dataSet = new ReferenceOpenHashSet<>(regions.size(), 0.75f); + -+ for (final ThreadedRegioniser.ThreadedRegion region : regions) { -+ dataSet.add(region.getData().getOrCreateRegionisedData(data)); ++ for (final ThreadedRegionizer.ThreadedRegion region : regions) { ++ dataSet.add(region.getData().getOrCreateRegionizedData(data)); + } + + final Long2ReferenceOpenHashMap regionToData = new Long2ReferenceOpenHashMap<>(into.size(), 0.75f); + -+ for (final Iterator>> regionIterator = into.long2ReferenceEntrySet().fastIterator(); ++ for (final Iterator>> regionIterator = into.long2ReferenceEntrySet().fastIterator(); + regionIterator.hasNext();) { -+ final Long2ReferenceMap.Entry> entry = regionIterator.next(); -+ final ThreadedRegioniser.ThreadedRegion region = entry.getValue(); -+ final Object to = region.getData().getOrCreateRegionisedData(data); ++ final Long2ReferenceMap.Entry> entry = regionIterator.next(); ++ final ThreadedRegionizer.ThreadedRegion region = entry.getValue(); ++ final Object to = region.getData().getOrCreateRegionizedData(data); + + regionToData.put(entry.getLongKey(), to); + } + -+ ((RegionisedData)data).getCallback().split(from, shift, regionToData, dataSet); ++ ((RegionizedData)data).getCallback().split(from, shift, regionToData, dataSet); + } + + // chunk holder manager data + { + final ReferenceOpenHashSet dataSet = new ReferenceOpenHashSet<>(regions.size(), 0.75f); + -+ for (final ThreadedRegioniser.ThreadedRegion region : regions) { ++ for (final ThreadedRegionizer.ThreadedRegion region : regions) { + dataSet.add(region.getData().holderManagerRegionData); + } + + final Long2ReferenceOpenHashMap regionToData = new Long2ReferenceOpenHashMap<>(into.size(), 0.75f); + -+ for (final Iterator>> regionIterator = into.long2ReferenceEntrySet().fastIterator(); ++ for (final Iterator>> regionIterator = into.long2ReferenceEntrySet().fastIterator(); + regionIterator.hasNext();) { -+ final Long2ReferenceMap.Entry> entry = regionIterator.next(); -+ final ThreadedRegioniser.ThreadedRegion region = entry.getValue(); ++ final Long2ReferenceMap.Entry> entry = regionIterator.next(); ++ final ThreadedRegionizer.ThreadedRegion region = entry.getValue(); + final ChunkHolderManager.HolderManagerRegionData to = region.getData().holderManagerRegionData; + + regionToData.put(entry.getLongKey(), to); @@ -8353,7 +8346,7 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + } + + @Override -+ public void mergeInto(final ThreadedRegioniser.ThreadedRegion into) { ++ public void mergeInto(final ThreadedRegionizer.ThreadedRegion into) { + // Note: merge target is always a region being released from ticking + final TickRegionData data = into.getData(); + final long currentTickTo = data.getCurrentTick(); @@ -8367,14 +8360,14 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + + // generic regionised data + final long fromTickOffset = currentTickTo - currentTickFrom; // see merge jd -+ for (final Iterator, Object>> iterator = this.regionisedData.reference2ReferenceEntrySet().fastIterator(); ++ for (final Iterator, Object>> iterator = this.regionizedData.reference2ReferenceEntrySet().fastIterator(); + iterator.hasNext();) { -+ final Reference2ReferenceMap.Entry, Object> entry = iterator.next(); -+ final RegionisedData regionisedData = entry.getKey(); ++ final Reference2ReferenceMap.Entry, Object> entry = iterator.next(); ++ final RegionizedData regionizedData = entry.getKey(); + final Object from = entry.getValue(); -+ final Object to = into.getData().getOrCreateRegionisedData(regionisedData); ++ final Object to = into.getData().getOrCreateRegionizedData(regionizedData); + -+ ((RegionisedData)regionisedData).getCallback().merge(from, to, fromTickOffset); ++ ((RegionizedData)regionizedData).getCallback().merge(from, to, fromTickOffset); + } + + // chunk holder manager data @@ -8451,7 +8444,7 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d + + @Override + protected boolean runRegionTasks(final BooleanSupplier canContinue) { -+ final RegionisedTaskQueue.RegionTaskQueueData queue = this.region.taskQueueData; ++ final RegionizedTaskQueue.RegionTaskQueueData queue = this.region.taskQueueData; + + // first, update chunk loader + final ServerLevel world = this.region.world; @@ -8488,14 +8481,14 @@ index 0000000000000000000000000000000000000000..f29f16ee5969dc1dfba512d7e5edb79d +} diff --git a/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java b/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java new file mode 100644 -index 0000000000000000000000000000000000000000..b9e0568fb08e15444e4cfac09749fce7a93db825 +index 0000000000000000000000000000000000000000..a3fb013ef00cb0e4069c8ef8a4044c1fa9e58602 --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java @@ -0,0 +1,326 @@ +package io.papermc.paper.threadedregions.commands; + -+import io.papermc.paper.threadedregions.RegionisedServer; -+import io.papermc.paper.threadedregions.ThreadedRegioniser; ++import io.papermc.paper.threadedregions.RegionizedServer; ++import io.papermc.paper.threadedregions.ThreadedRegionizer; +import io.papermc.paper.threadedregions.TickData; +import io.papermc.paper.threadedregions.TickRegionScheduler; +import io.papermc.paper.threadedregions.TickRegions; @@ -8555,7 +8548,7 @@ index 0000000000000000000000000000000000000000..b9e0568fb08e15444e4cfac09749fce7 + } + + private static boolean executeRegion(final CommandSender sender, final String commandLabel, final String[] args) { -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { + sender.sendMessage(Component.text("You are not in a region currently", NamedTextColor.RED)); @@ -8615,7 +8608,7 @@ index 0000000000000000000000000000000000000000..b9e0568fb08e15444e4cfac09749fce7 + } + } + -+ final List> regions = ++ final List> regions = + new ArrayList<>(); + + for (final World bukkitWorld : Bukkit.getWorlds()) { @@ -8633,9 +8626,9 @@ index 0000000000000000000000000000000000000000..b9e0568fb08e15444e4cfac09749fce7 + final int maxThreadCount = TickRegions.getScheduler().getTotalThreadCount(); + + final long currTime = System.nanoTime(); -+ final TickData.TickReportData globalTickReport = RegionisedServer.getGlobalTickData().getTickReport15s(currTime); ++ final TickData.TickReportData globalTickReport = RegionizedServer.getGlobalTickData().getTickReport15s(currTime); + -+ for (final ThreadedRegioniser.ThreadedRegion region : regions) { ++ for (final ThreadedRegionizer.ThreadedRegion region : regions) { + final TickData.TickReportData report = region.getData().getRegionSchedulingHandle().getTickReport15s(currTime); + tpsByRegion.add(report == null ? 20.0 : report.tpsData().segmentAll().average()); + reportsByRegion.add(report); @@ -8662,7 +8655,7 @@ index 0000000000000000000000000000000000000000..b9e0568fb08e15444e4cfac09749fce7 + minTps = medianTps = maxTps = 20.0; + } + -+ final List, TickData.TickReportData>> ++ final List, TickData.TickReportData>> + regionsBelowThreshold = new ArrayList<>(); + + for (int i = 0, len = regions.size(); i < len; ++i) { @@ -8687,11 +8680,11 @@ index 0000000000000000000000000000000000000000..b9e0568fb08e15444e4cfac09749fce7 + lowestRegionsBuilder.append(Component.text(" Click to teleport\n", SECONDARY)); + } + for (int i = 0, len = Math.min(lowestRegionsCount, regionsBelowThreshold.size()); i < len; ++i) { -+ final ObjectObjectImmutablePair, TickData.TickReportData> ++ final ObjectObjectImmutablePair, TickData.TickReportData> + pair = regionsBelowThreshold.get(i); + + final TickData.TickReportData report = pair.right(); -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + pair.left(); + + if (report == null) { @@ -9823,19 +9816,19 @@ index 0000000000000000000000000000000000000000..505329d601d56e42daa0b794092590cb + } + } +} -diff --git a/src/main/java/io/papermc/paper/threadedregions/scheduler/FoliaRegionisedScheduler.java b/src/main/java/io/papermc/paper/threadedregions/scheduler/FoliaRegionisedScheduler.java +diff --git a/src/main/java/io/papermc/paper/threadedregions/scheduler/FoliaRegionScheduler.java b/src/main/java/io/papermc/paper/threadedregions/scheduler/FoliaRegionScheduler.java new file mode 100644 -index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da9524bb3c9d +index 0000000000000000000000000000000000000000..b699e20df7a98b0dd8f783b293f4c4b47b868f2c --- /dev/null -+++ b/src/main/java/io/papermc/paper/threadedregions/scheduler/FoliaRegionisedScheduler.java ++++ b/src/main/java/io/papermc/paper/threadedregions/scheduler/FoliaRegionScheduler.java @@ -0,0 +1,430 @@ +package io.papermc.paper.threadedregions.scheduler; + +import ca.spottedleaf.concurrentutil.util.ConcurrentUtil; +import ca.spottedleaf.concurrentutil.util.Validate; +import io.papermc.paper.chunk.system.scheduling.ChunkHolderManager; -+import io.papermc.paper.threadedregions.RegionisedData; -+import io.papermc.paper.threadedregions.RegionisedServer; ++import io.papermc.paper.threadedregions.RegionizedData; ++import io.papermc.paper.threadedregions.RegionizedServer; +import io.papermc.paper.threadedregions.TickRegionScheduler; +import io.papermc.paper.threadedregions.TickRegions; +import io.papermc.paper.util.CoordinateUtils; @@ -9859,7 +9852,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 +import java.util.function.Consumer; +import java.util.logging.Level; + -+public final class FoliaRegionisedScheduler implements RegionisedScheduler { ++public final class FoliaRegionScheduler implements RegionScheduler { + + private static Runnable wrap(final Plugin plugin, final Location location, final Runnable run) { + return () -> { @@ -9871,7 +9864,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + }; + } + -+ private static final RegionisedData SCHEDULER_DATA = new RegionisedData<>(null, Scheduler::new, Scheduler.REGIONISER_CALLBACK); ++ private static final RegionizedData SCHEDULER_DATA = new RegionizedData<>(null, Scheduler::new, Scheduler.REGIONISER_CALLBACK); + + private static void scheduleInternalOnRegion(final LocationScheduledTask task, final int delay) { + SCHEDULER_DATA.get().queueTask(task, delay); @@ -9889,7 +9882,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + final int chunkX = location.getBlockX() >> 4; + final int chunkZ = location.getBlockZ() >> 4; + -+ RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + ((CraftWorld)world).getHandle(), chunkX, chunkZ, () -> { + scheduleInternalOnRegion(task, delay); + } @@ -9907,7 +9900,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + final int chunkX = location.getBlockX() >> 4; + final int chunkZ = location.getBlockZ() >> 4; + -+ RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + ((CraftWorld)world).getHandle(), chunkX, chunkZ, wrap(plugin, location.clone(), run) + ); + } @@ -9989,7 +9982,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + } + + private static final class Scheduler { -+ private static final RegionisedData.RegioniserCallback REGIONISER_CALLBACK = new RegionisedData.RegioniserCallback<>() { ++ private static final RegionizedData.RegioniserCallback REGIONISER_CALLBACK = new RegionizedData.RegioniserCallback<>() { + @Override + public void merge(final Scheduler from, final Scheduler into, final long fromTickOffset) { + for (final Iterator>>> sectionIterator = from.tasksByDeadlineBySection.long2ObjectEntrySet().fastIterator(); @@ -10038,7 +10031,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + private final Long2ObjectOpenHashMap>> tasksByDeadlineBySection = new Long2ObjectOpenHashMap<>(); + + private void addTicket(final int sectionX, final int sectionZ) { -+ final ServerLevel world = TickRegionScheduler.getCurrentRegionisedWorldData().world; ++ final ServerLevel world = TickRegionScheduler.getCurrentRegionizedWorldData().world; + final int chunkX = sectionX << TickRegions.getRegionChunkShift(); + final int chunkZ = sectionZ << TickRegions.getRegionChunkShift(); + @@ -10048,7 +10041,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + } + + private void removeTicket(final long sectionKey) { -+ final ServerLevel world = TickRegionScheduler.getCurrentRegionisedWorldData().world; ++ final ServerLevel world = TickRegionScheduler.getCurrentRegionizedWorldData().world; + final int chunkX = CoordinateUtils.getChunkX(sectionKey) << TickRegions.getRegionChunkShift(); + final int chunkZ = CoordinateUtils.getChunkZ(sectionKey) << TickRegions.getRegionChunkShift(); + @@ -10183,7 +10176,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + this.run = null; + this.location = null; + } else { -+ FoliaRegionisedScheduler.scheduleInternalOnRegion(this, this.repeatDelay); ++ FoliaRegionScheduler.scheduleInternalOnRegion(this, this.repeatDelay); + } + } + } @@ -10260,7 +10253,7 @@ index 0000000000000000000000000000000000000000..20bae52fc52659b5e1fb05ad8247da95 + } +} diff --git a/src/main/java/io/papermc/paper/util/CachedLists.java b/src/main/java/io/papermc/paper/util/CachedLists.java -index e08f4e39db4ee3fed62e37364d17dcc5c5683504..03d239460a2e856c1f59d6bcd95811c8e4e0cf6d 100644 +index e08f4e39db4ee3fed62e37364d17dcc5c5683504..7e92e14cdb9f3d895550991b2ea154a60f9c091b 100644 --- a/src/main/java/io/papermc/paper/util/CachedLists.java +++ b/src/main/java/io/papermc/paper/util/CachedLists.java @@ -9,49 +9,57 @@ import java.util.List; @@ -10274,7 +10267,7 @@ index e08f4e39db4ee3fed62e37364d17dcc5c5683504..03d239460a2e856c1f59d6bcd95811c8 public static UnsafeList getTempCollisionList() { - if (!Bukkit.isPrimaryThread() || tempCollisionListInUse) { + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + if (worldData == null) { return new UnsafeList<>(16); } @@ -10287,7 +10280,7 @@ index e08f4e39db4ee3fed62e37364d17dcc5c5683504..03d239460a2e856c1f59d6bcd95811c8 public static void returnTempCollisionList(List list) { - if (list != TEMP_COLLISION_LIST) { + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + if (worldData == null) { return; } @@ -10304,7 +10297,7 @@ index e08f4e39db4ee3fed62e37364d17dcc5c5683504..03d239460a2e856c1f59d6bcd95811c8 public static UnsafeList getTempGetEntitiesList() { - if (!Bukkit.isPrimaryThread() || tempGetEntitiesListInUse) { + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + if (worldData == null) { return new UnsafeList<>(16); } @@ -10317,7 +10310,7 @@ index e08f4e39db4ee3fed62e37364d17dcc5c5683504..03d239460a2e856c1f59d6bcd95811c8 public static void returnTempGetEntitiesList(List list) { - if (list != TEMP_GET_ENTITIES_LIST) { + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + if (worldData == null) { return; } @@ -10334,7 +10327,7 @@ index e08f4e39db4ee3fed62e37364d17dcc5c5683504..03d239460a2e856c1f59d6bcd95811c8 - TEMP_GET_ENTITIES_LIST.completeReset(); - // Paper end - optimise collisions + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + if (worldData != null) { + worldData.resetCollisionLists(); + } @@ -10454,16 +10447,16 @@ index c856a9a0d085b278da416c59996fc131811f790c..915cbf8c02c4bba0c62e5589229ee27e * Converts an NMS entity's current location to a Bukkit Location * @param entity diff --git a/src/main/java/io/papermc/paper/util/TickThread.java b/src/main/java/io/papermc/paper/util/TickThread.java -index fc57850b80303fcade89ca95794f63910404a407..09ddf5394157f15850d22f298f5e55ab539ec77e 100644 +index fc57850b80303fcade89ca95794f63910404a407..ed2c5099f73a4df5200d2ac490db712e8e299c96 100644 --- a/src/main/java/io/papermc/paper/util/TickThread.java +++ b/src/main/java/io/papermc/paper/util/TickThread.java @@ -1,8 +1,21 @@ package io.papermc.paper.util; +import io.papermc.paper.threadedregions.RegionShutdownThread; -+import io.papermc.paper.threadedregions.RegionisedServer; -+import io.papermc.paper.threadedregions.RegionisedWorldData; -+import io.papermc.paper.threadedregions.ThreadedRegioniser; ++import io.papermc.paper.threadedregions.RegionizedServer; ++import io.papermc.paper.threadedregions.RegionizedWorldData; ++import io.papermc.paper.threadedregions.ThreadedRegionizer; +import io.papermc.paper.threadedregions.TickRegionScheduler; +import io.papermc.paper.threadedregions.TickRegions; +import net.minecraft.core.BlockPos; @@ -10522,7 +10515,7 @@ index fc57850b80303fcade89ca95794f63910404a407..09ddf5394157f15850d22f298f5e55ab + public static boolean isTickThreadFor(final ServerLevel world, final int chunkX, final int chunkZ) { - return Thread.currentThread() instanceof TickThread; -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { + return isShutdownThread(); @@ -10548,7 +10541,7 @@ index fc57850b80303fcade89ca95794f63910404a407..09ddf5394157f15850d22f298f5e55ab + } + + public static boolean isTickThreadFor(final ServerLevel world, final int fromChunkX, final int fromChunkZ, final int toChunkX, final int toChunkZ) { -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { + return isShutdownThread(); @@ -10583,10 +10576,10 @@ index fc57850b80303fcade89ca95794f63910404a407..09ddf5394157f15850d22f298f5e55ab + if (entity == null) { + return true; + } -+ final ThreadedRegioniser.ThreadedRegion region = ++ final ThreadedRegionizer.ThreadedRegion region = + TickRegionScheduler.getCurrentRegion(); + if (region == null) { -+ if (RegionisedServer.isGlobalTickThread()) { ++ if (RegionizedServer.isGlobalTickThread()) { + if (entity instanceof ServerPlayer serverPlayer) { + return serverPlayer.connection == null; + } else { @@ -10602,7 +10595,7 @@ index fc57850b80303fcade89ca95794f63910404a407..09ddf5394157f15850d22f298f5e55ab + return false; + } + -+ final RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); ++ final RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + + // pass through the check if the entity is removed and we own its chunk + if (worldData.hasEntity(entity)) { @@ -10897,7 +10890,7 @@ index 0000000000000000000000000000000000000000..cf9b66afc1762dbe2c625f09f9e804ca + } +} diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java -index 7b6b51392b123d34382233adcf4c3d4867bdaa32..c6a28a1ff59a352b647f5f6c1e04f62349e2e428 100644 +index 7b6b51392b123d34382233adcf4c3d4867bdaa32..4c793605566f1755c99496c00dc1ef4f38c4ac7d 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java @@ -66,7 +66,7 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy @@ -10905,7 +10898,7 @@ index 7b6b51392b123d34382233adcf4c3d4867bdaa32..c6a28a1ff59a352b647f5f6c1e04f623 public CommandSourceStack(CommandSource output, Vec3 pos, Vec2 rot, ServerLevel world, int level, String name, Component displayName, MinecraftServer server, @Nullable Entity entity) { this(output, pos, rot, world, level, name, displayName, server, entity, false, (commandcontext, flag, j) -> { - }, EntityAnchorArgument.Anchor.FEET, CommandSigningContext.ANONYMOUS, TaskChainer.immediate(server)); -+ }, EntityAnchorArgument.Anchor.FEET, CommandSigningContext.ANONYMOUS, TaskChainer.immediate((Runnable run) -> { io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(run);})); // Folia - region threading ++ }, EntityAnchorArgument.Anchor.FEET, CommandSigningContext.ANONYMOUS, TaskChainer.immediate((Runnable run) -> { io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(run);})); // Folia - region threading } protected CommandSourceStack(CommandSource output, Vec3 pos, Vec2 rot, ServerLevel world, int level, String name, Component displayName, MinecraftServer server, @Nullable Entity entity, boolean silent, @Nullable ResultConsumer consumer, EntityAnchorArgument.Anchor entityAnchor, CommandSigningContext signedArguments, TaskChainer messageChainTaskQueue) { @@ -11059,7 +11052,7 @@ index 1e6ba6d9cceda1d4867b183c3dbc03d317ed287f..de8cf0f0d34708b960f1c81cb10d813a } diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 9598aa381978194fee859721731196f0e6ee08fc..6977cdee91cc0c0635adce66d9d9ebf94bb5aa94 100644 +index 9598aa381978194fee859721731196f0e6ee08fc..cb6fc325200483396d466bb694fa9217d8b21260 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java @@ -222,7 +222,7 @@ public interface DispenseItemBehavior { @@ -11166,7 +11159,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..6977cdee91cc0c0635adce66d9d9ebf9 } - worldserver.captureTreeGeneration = true; -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = worldserver.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = worldserver.getCurrentWorldData(); // Folia - region threading + worldData.captureTreeGeneration = true; // Folia - region threading // CraftBukkit end @@ -11592,7 +11585,7 @@ index d2f0a0755317f5fa9a1ccf7db346aa77fd287d80..b07df826a3028c14b48b09dbaeccc907 // CraftBukkit start - SPIGOT-5477, MC-142590 } else if (MinecraftServer.getServer().hasStopped() || (listener instanceof ServerGamePacketListenerImpl && ((ServerGamePacketListenerImpl) listener).processedDisconnect)) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 8ccc92836bfda8e00eea649430174dcd5664af70..6bf90c2a71d03788b6b15f858687372674dddc03 100644 +index 8ccc92836bfda8e00eea649430174dcd5664af70..26350a185cadbb64696b2a1ac88b1a2be06fd587 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -294,7 +294,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().invalidateStatus(); ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTaskWithoutNotify(() -> { ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().invalidateStatus(); + }); + return; + } @@ -12148,14 +12141,14 @@ index 8ccc92836bfda8e00eea649430174dcd5664af70..6bf90c2a71d03788b6b15f8586873726 + // Folia - region threading - return executed; -+ private boolean tickMidTickTasks(io.papermc.paper.threadedregions.RegionisedWorldData worldData) { // Folia - region threading ++ private boolean tickMidTickTasks(io.papermc.paper.threadedregions.RegionizedWorldData worldData) { // Folia - region threading + // Folia - region threading - only execute for one world + return worldData.world.getChunkSource().pollTask(); } public final void executeMidTickTasks() { org.spigotmc.AsyncCatcher.catchOp("mid tick chunk task execution"); -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); // Folia - region threading long startTime = System.nanoTime(); - if ((startTime - lastMidTickExecute) <= CHUNK_TASK_QUEUE_BACKOFF_MIN_TIME || (startTime - lastMidTickExecuteFailure) <= TASK_EXECUTION_FAILURE_BACKOFF) { + if ((startTime - worldData.lastMidTickExecute) <= CHUNK_TASK_QUEUE_BACKOFF_MIN_TIME || (startTime - worldData.lastMidTickExecuteFailure) <= TASK_EXECUTION_FAILURE_BACKOFF) { // Folia - region threading @@ -12698,7 +12691,7 @@ index b25b2ed0eb3c6716a7c92cb1f1066a1447d88bcf..3b55e806204cbe2df2cadcec91fbc84e } diff --git a/src/main/java/net/minecraft/server/commands/ForceLoadCommand.java b/src/main/java/net/minecraft/server/commands/ForceLoadCommand.java -index de484336165891d16220fdc0363e5283ba92b75d..3f165dbca5ce094ad39e46ecc2fa2bb9e80968ce 100644 +index de484336165891d16220fdc0363e5283ba92b75d..494292dd2aa45771d42e5f271675f9ca267e8458 100644 --- a/src/main/java/net/minecraft/server/commands/ForceLoadCommand.java +++ b/src/main/java/net/minecraft/server/commands/ForceLoadCommand.java @@ -49,96 +49,126 @@ public class ForceLoadCommand { @@ -12723,7 +12716,7 @@ index de484336165891d16220fdc0363e5283ba92b75d..3f165dbca5ce094ad39e46ecc2fa2bb9 - throw ERROR_NOT_TICKING.create(chunkPos, resourceKey.location()); - } + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { + try { + boolean bl = serverLevel.getForcedChunks().contains(chunkPos.toLong()); + if (bl) { @@ -12750,7 +12743,7 @@ index de484336165891d16220fdc0363e5283ba92b75d..3f165dbca5ce094ad39e46ecc2fa2bb9 - if (i == 1) { - source.sendSuccess(Component.translatable("commands.forceload.list.single", resourceKey.location(), string), false); + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { + LongSet longSet = serverLevel.getForcedChunks(); + int i = longSet.size(); + if (i > 0) { @@ -12777,7 +12770,7 @@ index de484336165891d16220fdc0363e5283ba92b75d..3f165dbca5ce094ad39e46ecc2fa2bb9 private static int removeAll(CommandSourceStack source) { ServerLevel serverLevel = source.getLevel(); ResourceKey resourceKey = serverLevel.dimension(); -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading LongSet longSet = serverLevel.getForcedChunks(); longSet.forEach((chunkPos) -> { serverLevel.setChunkForced(ChunkPos.getX(chunkPos), ChunkPos.getZ(chunkPos), false); @@ -12806,7 +12799,7 @@ index de484336165891d16220fdc0363e5283ba92b75d..3f165dbca5ce094ad39e46ecc2fa2bb9 - ChunkPos chunkPos = null; - int r = 0; + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { + try { + int i = Math.min(from.x(), to.x()); + int j = Math.min(from.z(), to.z()); @@ -12946,7 +12939,7 @@ index a6e4bd9243dab7feaed1bd968108a324d6c37ed7..4637e60292128e8c4053fb3a5fed48e5 if (targets.size() == 1) { diff --git a/src/main/java/net/minecraft/server/commands/PlaceCommand.java b/src/main/java/net/minecraft/server/commands/PlaceCommand.java -index c9ee0b8a0f72c21f29448c3a8fd53a7007c740f8..f92a2bd92201264c8d38ef4dd663955188fb5ecc 100644 +index c9ee0b8a0f72c21f29448c3a8fd53a7007c740f8..6ab0bbfb5e04b13082999d825e8445fbbbc184a3 100644 --- a/src/main/java/net/minecraft/server/commands/PlaceCommand.java +++ b/src/main/java/net/minecraft/server/commands/PlaceCommand.java @@ -83,82 +83,130 @@ public class PlaceCommand { @@ -13001,7 +12994,7 @@ index c9ee0b8a0f72c21f29448c3a8fd53a7007c740f8..f92a2bd92201264c8d38ef4dd6639551 - return 1; - } + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + serverLevel, pos.getX() >> 4, pos.getZ() >> 4, () -> { + try { + if (!JigsawPlacement.generateJigsaw(serverLevel, structurePool, id, maxDepth, pos, false)) { @@ -13040,7 +13033,7 @@ index c9ee0b8a0f72c21f29448c3a8fd53a7007c740f8..f92a2bd92201264c8d38ef4dd6639551 - return 1; - } + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + serverLevel, pos.getX() >> 4, pos.getZ() >> 4, () -> { + try { + StructureStart structureStart = structure2.generate(source.registryAccess(), chunkGenerator, chunkGenerator.getBiomeSource(), serverLevel.getChunkSource().randomState(), serverLevel.getStructureManager(), serverLevel.getSeed(), new ChunkPos(pos), 0, serverLevel, (biome) -> { @@ -13072,7 +13065,7 @@ index c9ee0b8a0f72c21f29448c3a8fd53a7007c740f8..f92a2bd92201264c8d38ef4dd6639551 ServerLevel serverLevel = source.getLevel(); - StructureTemplateManager structureTemplateManager = serverLevel.getStructureManager(); + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + serverLevel, pos.getX() >> 4, pos.getZ() >> 4, () -> { + try { + StructureTemplateManager structureTemplateManager = serverLevel.getStructureManager(); @@ -13166,7 +13159,7 @@ index 2a92e542e4b3e4dfb26adfc4b21490a629b79382..d3405192a705637daba66735c717d647 if (i == 0) { diff --git a/src/main/java/net/minecraft/server/commands/SetBlockCommand.java b/src/main/java/net/minecraft/server/commands/SetBlockCommand.java -index ad435815e56ca5a8d5ea6046ee4a3ed4d3673a48..2e53969ae222c13a7ef034f96a7014f924960481 100644 +index ad435815e56ca5a8d5ea6046ee4a3ed4d3673a48..98f314064987e3c0b87e415459f6c263e75ea48d 100644 --- a/src/main/java/net/minecraft/server/commands/SetBlockCommand.java +++ b/src/main/java/net/minecraft/server/commands/SetBlockCommand.java @@ -38,29 +38,45 @@ public class SetBlockCommand { @@ -13194,7 +13187,7 @@ index ad435815e56ca5a8d5ea6046ee4a3ed4d3673a48..2e53969ae222c13a7ef034f96a7014f9 - bl = true; - } + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + serverLevel, pos.getX() >> 4, pos.getZ() >> 4, () -> { + try { + if (condition != null && !condition.test(new BlockInWorld(serverLevel, pos, true))) { @@ -13253,7 +13246,7 @@ index b0ed00b95b273f0916cbade0e3bac47aa464d3fd..ebabc7919562acc1e43014aa702e6576 } // Paper end diff --git a/src/main/java/net/minecraft/server/commands/SummonCommand.java b/src/main/java/net/minecraft/server/commands/SummonCommand.java -index 108b8ddbb724c6a2aca97bd7d5b29bea87662e70..4b3e7e744b99b3b2b1cf957f4f5f6051ab20a52b 100644 +index 108b8ddbb724c6a2aca97bd7d5b29bea87662e70..6da8e88a64e0904a9e5f27da21559ab60659dd88 100644 --- a/src/main/java/net/minecraft/server/commands/SummonCommand.java +++ b/src/main/java/net/minecraft/server/commands/SummonCommand.java @@ -63,11 +63,18 @@ public class SummonCommand { @@ -13264,7 +13257,7 @@ index 108b8ddbb724c6a2aca97bd7d5b29bea87662e70..4b3e7e744b99b3b2b1cf957f4f5f6051 - ((Mob) entity).finalizeSpawn(source.getLevel(), source.getLevel().getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.COMMAND, (SpawnGroupData) null, (CompoundTag) null); - } + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + worldserver, entity.chunkPosition().x, entity.chunkPosition().z, () -> { + if (initialize && entity instanceof Mob) { + ((Mob) entity).finalizeSpawn(source.getLevel(), source.getLevel().getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.COMMAND, (SpawnGroupData) null, (CompoundTag) null); @@ -13318,14 +13311,14 @@ index 6511af08d8db1f8fc62bdb4a8f357941f524886d..8dee4f9a408194f2bbbd9028517d3350 boolean result; if (target instanceof ServerPlayer player) { diff --git a/src/main/java/net/minecraft/server/commands/TimeCommand.java b/src/main/java/net/minecraft/server/commands/TimeCommand.java -index f0a7a8df3caa2ea765bb0a87cfede71d0995d276..00f63992885c16ea01384fc00e1325f389cc1a0f 100644 +index f0a7a8df3caa2ea765bb0a87cfede71d0995d276..b666adf0d0eddea1beb59d6f7a2968b5c0296b37 100644 --- a/src/main/java/net/minecraft/server/commands/TimeCommand.java +++ b/src/main/java/net/minecraft/server/commands/TimeCommand.java @@ -56,6 +56,7 @@ public class TimeCommand { while (iterator.hasNext()) { ServerLevel worldserver = (ServerLevel) iterator.next(); -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading // CraftBukkit start TimeSkipEvent event = new TimeSkipEvent(worldserver.getWorld(), TimeSkipEvent.SkipReason.COMMAND, time - worldserver.getDayTime()); Bukkit.getPluginManager().callEvent(event); @@ -13341,7 +13334,7 @@ index f0a7a8df3caa2ea765bb0a87cfede71d0995d276..00f63992885c16ea01384fc00e1325f3 while (iterator.hasNext()) { ServerLevel worldserver = (ServerLevel) iterator.next(); -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading // CraftBukkit start TimeSkipEvent event = new TimeSkipEvent(worldserver.getWorld(), TimeSkipEvent.SkipReason.COMMAND, time); Bukkit.getPluginManager().callEvent(event); @@ -13352,7 +13345,7 @@ index f0a7a8df3caa2ea765bb0a87cfede71d0995d276..00f63992885c16ea01384fc00e1325f3 + }); // Folia - region threading } -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading int j = TimeCommand.getDayTime(source.getLevel()); source.sendSuccess(Component.translatable("commands.time.set", j), true); @@ -13362,14 +13355,14 @@ index f0a7a8df3caa2ea765bb0a87cfede71d0995d276..00f63992885c16ea01384fc00e1325f3 } } diff --git a/src/main/java/net/minecraft/server/commands/WeatherCommand.java b/src/main/java/net/minecraft/server/commands/WeatherCommand.java -index 471e9a2d8ad92c8f45856487a2919e4113ed4468..d2a8f27a2f169d0df81e4959ca103c1401b4231d 100644 +index 471e9a2d8ad92c8f45856487a2919e4113ed4468..67c401bb45c1c972f1cd249547c094c854d50cc3 100644 --- a/src/main/java/net/minecraft/server/commands/WeatherCommand.java +++ b/src/main/java/net/minecraft/server/commands/WeatherCommand.java @@ -35,20 +35,26 @@ public class WeatherCommand { } private static int setClear(CommandSourceStack source, int duration) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading source.getLevel().setWeatherParameters(getDuration(source, duration, ServerLevel.RAIN_DELAY), 0, false, false); source.sendSuccess(Component.translatable("commands.weather.set.clear"), true); + }); // Folia - region threading @@ -13377,7 +13370,7 @@ index 471e9a2d8ad92c8f45856487a2919e4113ed4468..d2a8f27a2f169d0df81e4959ca103c14 } private static int setRain(CommandSourceStack source, int duration) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading source.getLevel().setWeatherParameters(0, getDuration(source, duration, ServerLevel.RAIN_DURATION), true, false); source.sendSuccess(Component.translatable("commands.weather.set.rain"), true); + }); // Folia - region threading @@ -13385,7 +13378,7 @@ index 471e9a2d8ad92c8f45856487a2919e4113ed4468..d2a8f27a2f169d0df81e4959ca103c14 } private static int setThunder(CommandSourceStack source, int duration) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading source.getLevel().setWeatherParameters(0, getDuration(source, duration, ServerLevel.THUNDER_DURATION), true, true); source.sendSuccess(Component.translatable("commands.weather.set.thunder"), true); + }); // Folia - region threading @@ -14168,7 +14161,7 @@ index 88fca8b160df6804f30ed2cf8cf1f645085434e2..341650384498eebe3f7a3315c398bec9 } diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde60002343b1af 100644 +index 736f37979c882e41e7571202df38eb6a2923fcb0..8ac74958a982586d3701ffceda24bb7b7cefe1e9 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -61,73 +61,42 @@ public class ServerChunkCache extends ChunkSource { @@ -14316,7 +14309,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 } private void tickChunks() { -+ io.papermc.paper.threadedregions.RegionisedWorldData regionisedWorldData = this.level.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData regionizedWorldData = this.level.getCurrentWorldData(); // Folia - region threading long i = this.level.getGameTime(); - long j = i - this.lastInhabitedUpdate; + long j = 1; // Folia - region threading @@ -14336,7 +14329,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 + for (ServerPlayer player : this.level.getLocalPlayers()) { // Folia - region threading if (!player.affectsSpawning || player.isSpectator()) { - playerChunkMap.playerMobSpawnMap.remove(player); -+ regionisedWorldData.mobSpawnMap.remove(player); // Folia - region threading ++ regionizedWorldData.mobSpawnMap.remove(player); // Folia - region threading continue; } @@ -14348,7 +14341,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 - playerChunkMap.playerMobSpawnMap.remove(player); + if (event.isCancelled() || event.getSpawnRadius() < 0) { // Folia - region threading + player.lastEntitySpawnRadiusSquared = -1.0; player.playerNaturallySpawnedEvent = null; // Folia - region threading -+ regionisedWorldData.mobSpawnMap.remove(player); // Folia - region threading ++ regionizedWorldData.mobSpawnMap.remove(player); // Folia - region threading continue; } @@ -14357,7 +14350,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 int chunkZ = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getZ()); - playerChunkMap.playerMobSpawnMap.addOrUpdate(player, chunkX, chunkZ, range); -+ regionisedWorldData.mobSpawnMap.addOrUpdate(player, chunkX, chunkZ, range); // Folia - region threading ++ regionizedWorldData.mobSpawnMap.addOrUpdate(player, chunkX, chunkZ, range); // Folia - region threading player.lastEntitySpawnRadiusSquared = (double)((range << 4) * (range << 4)); // used in anyPlayerCloseEnoughForSpawning player.playerNaturallySpawnedEvent = event; } @@ -14384,12 +14377,12 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 - } - // Paper end + // Folia start - threaded regions - revert per-player mob caps -+ spawnercreature_d = this.spawnFriendlies || this.spawnEnemies ? NaturalSpawner.createState(l, regionisedWorldData.getLocalEntities(), this::getFullChunk, new LocalMobCapCalculator(this.chunkMap)) : null; // Folia - region threading ++ spawnercreature_d = this.spawnFriendlies || this.spawnEnemies ? NaturalSpawner.createState(l, regionizedWorldData.getLocalEntities(), this::getFullChunk, new LocalMobCapCalculator(this.chunkMap)) : null; // Folia - region threading + // Folia end - threaded regions - revert per-player mob caps this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings - this.lastSpawnState = spawnercreature_d; -+ regionisedWorldData.lastSpawnState = spawnercreature_d; // Folia - region threading ++ regionizedWorldData.lastSpawnState = spawnercreature_d; // Folia - region threading gameprofilerfiller.popPush("filteringLoadedChunks"); // Paper - moved down this.level.timings.chunkTicks.startTiming(); // Paper @@ -14398,7 +14391,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 gameprofilerfiller.popPush("spawnAndTick"); - boolean flag2 = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit -+ boolean flag2 = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !regionisedWorldData.getLocalPlayers().isEmpty(); // CraftBukkit // Folia - region threading ++ boolean flag2 = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !regionizedWorldData.getLocalPlayers().isEmpty(); // CraftBukkit // Folia - region threading // Paper - only shuffle if per-player mob spawning is disabled // Paper - moved natural spawn event up @@ -14407,12 +14400,12 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 - if (this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { - iterator1 = this.entityTickingChunks.iterator(); + if (true) { // Folia - region threading - revert per player mob caps, except for this - WTF are they doing? -+ iterator1 = regionisedWorldData.getEntityTickingChunks().iterator(); // Folia - region threading ++ iterator1 = regionizedWorldData.getEntityTickingChunks().iterator(); // Folia - region threading } else { - iterator1 = this.entityTickingChunks.unsafeIterator(); - List shuffled = Lists.newArrayListWithCapacity(this.entityTickingChunks.size()); -+ iterator1 = regionisedWorldData.getEntityTickingChunks().unsafeIterator(); // Folia - region threading -+ List shuffled = Lists.newArrayListWithCapacity(regionisedWorldData.getEntityTickingChunks().size()); // Folia - region threading ++ iterator1 = regionizedWorldData.getEntityTickingChunks().unsafeIterator(); // Folia - region threading ++ List shuffled = Lists.newArrayListWithCapacity(regionizedWorldData.getEntityTickingChunks().size()); // Folia - region threading while (iterator1.hasNext()) { shuffled.add(iterator1.next()); } @@ -14423,15 +14416,15 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 - if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { - ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); - this.chunkMap.needsChangeBroadcasting.clear(); -+ if (!regionisedWorldData.getNeedsChangeBroadcasting().isEmpty()) { // Folia - region threading -+ ReferenceOpenHashSet copy = regionisedWorldData.getNeedsChangeBroadcasting().clone(); // Folia - region threading -+ regionisedWorldData.getNeedsChangeBroadcasting().clear(); // Folia - region threading ++ if (!regionizedWorldData.getNeedsChangeBroadcasting().isEmpty()) { // Folia - region threading ++ ReferenceOpenHashSet copy = regionizedWorldData.getNeedsChangeBroadcasting().clone(); // Folia - region threading ++ regionizedWorldData.getNeedsChangeBroadcasting().clear(); // Folia - region threading for (ChunkHolder holder : copy) { holder.broadcastChanges(holder.getFullChunkNowUnchecked()); // LevelChunks are NEVER unloaded if (holder.needsBroadcastChanges()) { // I DON'T want to KNOW what DUMB plugins might be doing. - this.chunkMap.needsChangeBroadcasting.add(holder); -+ regionisedWorldData.getNeedsChangeBroadcasting().add(holder); // Folia - region threading ++ regionizedWorldData.getNeedsChangeBroadcasting().add(holder); // Folia - region threading } } } @@ -14441,8 +14434,8 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 // Paper start - controlled flush for entity tracker packets - List disabledFlushes = new java.util.ArrayList<>(this.level.players.size()); - for (ServerPlayer player : this.level.players) { -+ List disabledFlushes = new java.util.ArrayList<>(regionisedWorldData.getLocalPlayers().size()); // Folia - region threading -+ for (ServerPlayer player : regionisedWorldData.getLocalPlayers()) { // Folia - region threading ++ List disabledFlushes = new java.util.ArrayList<>(regionizedWorldData.getLocalPlayers().size()); // Folia - region threading ++ for (ServerPlayer player : regionizedWorldData.getLocalPlayers()) { // Folia - region threading net.minecraft.server.network.ServerGamePacketListenerImpl connection = player.connection; if (connection != null) { connection.connection.disableAutomaticFlush(); @@ -14461,7 +14454,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 - }); + }; // Folia - region threading + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueChunkTask( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueChunkTask( + this.level, pos.getX(), pos.getZ(), run + ); + // Folia end - region threading @@ -14473,7 +14466,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 @VisibleForDebug public NaturalSpawner.SpawnState getLastSpawnState() { - return this.lastSpawnState; -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = this.level.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = this.level.getCurrentWorldData(); // Folia - region threading + return worldData == null ? null : worldData.lastSpawnState; // Folia - region threading } @@ -14527,7 +14520,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 // CraftBukkit start - process pending Chunk loadCallback() and unloadCallback() after each run task public boolean pollTask() { + // Folia start - region threading -+ if (ServerChunkCache.this.level != io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().world) { ++ if (ServerChunkCache.this.level != io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().world) { + throw new IllegalStateException("Polling tasks from non-owned region"); + } + // Folia end - region threading @@ -14541,7 +14534,7 @@ index 736f37979c882e41e7571202df38eb6a2923fcb0..09a6a74f9bbcbbfba8bfc0424cde6000 } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b4e1a4424 100644 +index bf1a77cf9bbea4e2104b2a8c61309e740f28d51b..6c615f4f5d47f7d9cc31274800dc25824faa4a66 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -190,35 +190,34 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -14814,16 +14807,16 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b + // Folia - region threading // Paper end - optimise get nearest players for entity AI - public final io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader playerChunkLoader = new io.papermc.paper.chunk.system.RegionisedPlayerChunkLoader(this); + public final io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader playerChunkLoader = new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader(this); @@ -563,6 +538,59 @@ public class ServerLevel extends Level implements WorldGenLevel { }); } + // Folia start - regionised ticking + public final io.papermc.paper.threadedregions.TickRegions tickRegions = new io.papermc.paper.threadedregions.TickRegions(); -+ public final io.papermc.paper.threadedregions.ThreadedRegioniser regioniser; ++ public final io.papermc.paper.threadedregions.ThreadedRegionizer regioniser; + { -+ this.regioniser = new io.papermc.paper.threadedregions.ThreadedRegioniser<>( ++ this.regioniser = new io.papermc.paper.threadedregions.ThreadedRegionizer<>( + 3*9, + (2.0 / 3.0), + 1, @@ -14833,7 +14826,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b + this.tickRegions + ); + } -+ public final io.papermc.paper.threadedregions.RegionisedTaskQueue.WorldRegionTaskData taskQueueRegionData = new io.papermc.paper.threadedregions.RegionisedTaskQueue.WorldRegionTaskData(this); ++ public final io.papermc.paper.threadedregions.RegionizedTaskQueue.WorldRegionTaskData taskQueueRegionData = new io.papermc.paper.threadedregions.RegionizedTaskQueue.WorldRegionTaskData(this); + public static final int WORLD_INIT_NOT_CHECKED = 0; + public static final int WORLD_INIT_CHECKING = 1; + public static final int WORLD_INIT_CHECKED = 2; @@ -14913,7 +14906,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b + + // Folia start - region threading + public void updateTickData() { -+ this.tickData = new io.papermc.paper.threadedregions.RegionisedServer.WorldLevelData(this, this.serverLevelData.getGameTime(), this.serverLevelData.getDayTime()); ++ this.tickData = new io.papermc.paper.threadedregions.RegionizedServer.WorldLevelData(this, this.serverLevelData.getGameTime(), this.serverLevelData.getDayTime()); } + // Folia end - region threading @@ -14933,12 +14926,12 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b - } - // Paper end - optimise checkDespawn + public void tick(BooleanSupplier shouldKeepTicking, io.papermc.paper.threadedregions.TickRegions.TickRegionData region) { // Folia - regionised ticking -+ final io.papermc.paper.threadedregions.RegionisedWorldData regionisedWorldData = this.getCurrentWorldData(); // Folia - regionised ticking ++ final io.papermc.paper.threadedregions.RegionizedWorldData regionizedWorldData = this.getCurrentWorldData(); // Folia - regionised ticking + // Folia - region threading ProfilerFiller gameprofilerfiller = this.getProfiler(); - this.handlingTick = true; -+ regionisedWorldData.setHandlingTick(true); // Folia - regionised ticking ++ regionizedWorldData.setHandlingTick(true); // Folia - regionised ticking gameprofilerfiller.push("world border"); - this.getWorldBorder().tick(); + if (region == null) this.getWorldBorder().tick(); // Folia - regionised ticking - moved into global tick @@ -14977,13 +14970,13 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b timings.scheduledBlocks.startTiming(); // Paper if (!this.isDebug()) { - j = this.getGameTime(); -+ j = regionisedWorldData.getRedstoneGameTime(); // Folia - region threading ++ j = regionizedWorldData.getRedstoneGameTime(); // Folia - region threading gameprofilerfiller.push("blockTicks"); - this.blockTicks.tick(j, 65536, this::tickBlock); -+ regionisedWorldData.getBlockLevelTicks().tick(j, 65536, this::tickBlock); // Folia - region ticking ++ regionizedWorldData.getBlockLevelTicks().tick(j, 65536, this::tickBlock); // Folia - region ticking gameprofilerfiller.popPush("fluidTicks"); - this.fluidTicks.tick(j, 65536, this::tickFluid); -+ regionisedWorldData.getFluidLevelTicks().tick(j, 65536, this::tickFluid); // Folia - region ticking ++ regionizedWorldData.getFluidLevelTicks().tick(j, 65536, this::tickFluid); // Folia - region ticking gameprofilerfiller.pop(); } timings.scheduledBlocks.stopTiming(); // Paper @@ -14992,7 +14985,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b this.runBlockEvents(); timings.doSounds.stopTiming(); // Spigot - this.handlingTick = false; -+ regionisedWorldData.setHandlingTick(false); // Folia - regionised ticking ++ regionizedWorldData.setHandlingTick(false); // Folia - regionised ticking gameprofilerfiller.pop(); boolean flag = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players @@ -15017,7 +15010,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b org.spigotmc.ActivationRange.activateEntities(this); // Spigot timings.entityTick.startTiming(); // Spigot - this.entityTickList.forEach((entity) -> { -+ regionisedWorldData.forEachTickingEntity((entity) -> { // Folia - regionised ticking ++ regionizedWorldData.forEachTickingEntity((entity) -> { // Folia - regionised ticking if (!entity.isRemoved()) { if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed entity.discard(); @@ -15065,13 +15058,13 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b protected void tickTime() { if (this.tickTime) { - long i = this.levelData.getGameTime() + 1L; -+ io.papermc.paper.threadedregions.RegionisedWorldData regionisedWorldData = this.getCurrentWorldData(); // Folia - region threading -+ long i = regionisedWorldData.getRedstoneGameTime() + 1L; // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData regionizedWorldData = this.getCurrentWorldData(); // Folia - region threading ++ long i = regionizedWorldData.getRedstoneGameTime() + 1L; // Folia - region threading - this.serverLevelData.setGameTime(i); - this.serverLevelData.getScheduledEvents().tick(this.server, i); - if (this.levelData.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { -+ regionisedWorldData.setRedstoneGameTime(i); // Folia - region threading ++ regionizedWorldData.setRedstoneGameTime(i); // Folia - region threading + if (false) this.serverLevelData.getScheduledEvents().tick(this.server, i); // Folia - region threading - TODO any way to bring this in? + if (false && this.levelData.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { // Folia - region threading this.setDayTime(this.levelData.getDayTime() + 1L); @@ -15145,8 +15138,8 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b public void updateSleepingPlayerList() { + // Folia start - region threading -+ if (!io.papermc.paper.threadedregions.RegionisedServer.isGlobalTickThread()) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { ++ if (!io.papermc.paper.threadedregions.RegionizedServer.isGlobalTickThread()) { ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { + ServerLevel.this.updateSleepingPlayerList(); + }); + return; @@ -15402,7 +15395,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b - while (!this.blockEvents.isEmpty()) { - BlockEventData blockactiondata = (BlockEventData) this.blockEvents.removeFirst(); + // Folia start - regionised ticking -+ io.papermc.paper.threadedregions.RegionisedWorldData worldRegionData = this.getCurrentWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldRegionData = this.getCurrentWorldData(); + BlockEventData blockactiondata; + while ((blockactiondata = worldRegionData.removeFirstBlockEvent()) != null) { + // Folia end - regionised ticking @@ -15544,7 +15537,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b - }); + }; // Folia - region threading + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueChunkTask( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueChunkTask( + this, blockposition1.getX() >> 4, blockposition1.getZ() >> 4, run + ); + // Folia end - region threading @@ -15562,7 +15555,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b - }); + }; // Folia - region threading + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueChunkTask( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueChunkTask( + this, blockposition1.getX() >> 4, blockposition1.getZ() >> 4, run + ); + // Folia end - region threading @@ -15773,7 +15766,7 @@ index e57cf6a74a129ea0919a4ad5e84b615cd5aa141e..5c20a7c090baed582a3351163520d37b 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 8a80b222456c2e4818cada3a9248ab2f9b76a983..71ee635aa84d61c63835b02e4fb7ea8580e697fb 100644 +index a3cef477646abf6172d4e50a28ed30f04c30d667..7c04fc2b9ba50d5a7e35a04a17e28db472fff697 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -187,7 +187,7 @@ import org.bukkit.inventory.MainHand; @@ -16332,7 +16325,7 @@ index 0a3eb5e929c605d9eb7369de8ade8b49951f5d37..6b7b44ad8cb7ece5cfbf69bc54ed589a org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, state, this.player, itemsToDrop); // Paper - use stored ref } diff --git a/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java b/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java -index 660693c6dc0ef86f4013df980b6d0c11c03e46cd..eef501b0558680e5563b0a15a93bd3ab217b91d8 100644 +index 660693c6dc0ef86f4013df980b6d0c11c03e46cd..b64fc5adda3a9ab793a074d08df822754bd8d186 100644 --- a/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java +++ b/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java @@ -98,10 +98,15 @@ public class ThreadedLevelLightEngine extends LevelLightEngine implements AutoCl @@ -16346,7 +16339,7 @@ index 660693c6dc0ef86f4013df980b6d0c11c03e46cd..eef501b0558680e5563b0a15a93bd3ab - }); + }; // Folia - region threading + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueChunkTask( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueChunkTask( + (ServerLevel)this.theLightEngine.getWorld(), chunkPos.x, chunkPos.z, run + ); + // Folia end - region threading @@ -16375,7 +16368,7 @@ index 660693c6dc0ef86f4013df980b6d0c11c03e46cd..eef501b0558680e5563b0a15a93bd3ab - }); + }; // Folia - region threading + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + world, chunkX, chunkZ, run + ); + // Folia end - region threading @@ -16405,7 +16398,7 @@ index 660693c6dc0ef86f4013df980b6d0c11c03e46cd..eef501b0558680e5563b0a15a93bd3ab - }, world.getChunkSource().chunkMap.mainThreadExecutor).whenComplete((final Void ignore, final Throwable thr) -> { + // Folia start - region threading + updateFuture.thenAccept((final Void ignore) -> { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + this.chunkMap.level, chunkX, chunkZ, () -> { + final int newReferences = this.chunkMap.level.getCurrentWorldData().chunksBeingWorkedOn.get(key); + if (newReferences == 1) { @@ -16461,7 +16454,7 @@ index 877498729c66de9aa6a27c9148f7494d7895615c..d8af2d59fb1f112f2f1a9fdbb3517fc7 this.generatingStatus = status; this.writeRadiusCutoff = placementRadius; diff --git a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java -index 44d99e89226adb6234b9405f25ac9dab9bd84297..c04e275658cf77d774027ac3a8ca26e12f9cedd5 100644 +index 44d99e89226adb6234b9405f25ac9dab9bd84297..072634e26d32ca0b3438a5d3a03be3670d0f846e 100644 --- a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java +++ b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java @@ -154,10 +154,13 @@ public class ServerConnectionListener { @@ -16474,7 +16467,7 @@ index 44d99e89226adb6234b9405f25ac9dab9bd84297..c04e275658cf77d774027ac3a8ca26e1 ((Connection) object).setListener(new ServerHandshakePacketListenerImpl(ServerConnectionListener.this.server, (Connection) object)); io.papermc.paper.network.ChannelInitializeListenerHolder.callListeners(channel); // Paper + // Folia start - regionised threading -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addConnection((Connection)object); ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addConnection((Connection)object); + // Folia end - regionised threading } }).group((EventLoopGroup) lazyinitvar.get()).localAddress(address)).option(ChannelOption.AUTO_READ, false).bind().syncUninterruptibly()); // CraftBukkit // Paper @@ -16489,7 +16482,7 @@ index 44d99e89226adb6234b9405f25ac9dab9bd84297..c04e275658cf77d774027ac3a8ca26e1 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 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..aa8da680ed91e9a7695bd07f3cb88ae962f5b176 100644 +index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..aab6ffceaabecf8efa7f5d83f30a537a3f62c7bd 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -322,10 +322,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -16722,10 +16715,10 @@ index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..aa8da680ed91e9a7695bd07f3cb88ae9 // limit how quickly items can be dropped // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. - if (this.lastDropTick != MinecraftServer.currentTick) { -+ if (this.lastDropTick != io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick()) { ++ if (this.lastDropTick != io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick()) { this.dropCount = 0; - this.lastDropTick = MinecraftServer.currentTick; -+ this.lastDropTick = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); ++ this.lastDropTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); } else { // Else we increment the drop count and check the amount. this.dropCount++; @@ -16914,7 +16907,7 @@ index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..aa8da680ed91e9a7695bd07f3cb88ae9 } diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 2ff578e4a953ffcf5176815ba8e3f06f73499989..48223b78dd7ea2f065a259ad071f101398f40cfd 100644 +index 2ff578e4a953ffcf5176815ba8e3f06f73499989..2e96377d628b3a07fb565020074d665f594f32e8 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -53,7 +53,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, @@ -17000,7 +16993,7 @@ index 2ff578e4a953ffcf5176815ba8e3f06f73499989..48223b78dd7ea2f065a259ad071f1013 + net.minecraft.util.Unit.INSTANCE + ); + -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + world, chunkX, chunkZ, + () -> { + // now at this point the connection is held by the region, so we have to check isConnected() @@ -17057,7 +17050,7 @@ index 2ff578e4a953ffcf5176815ba8e3f06f73499989..48223b78dd7ea2f065a259ad071f1013 private State() {} } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e49e9cc31a9e05422fd1f48616c5a452011d66e1 100644 +index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..570eff7de267773cc3223b6722e44b388dcbd662 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -139,7 +139,7 @@ public abstract class PlayerList { @@ -17162,7 +17155,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e49e9cc31a9e05422fd1f48616c5a452 + public void placeNewPlayer(Connection connection, ServerPlayer player, CompoundTag nbttagcompound, String s, Location selectedSpawn) { + ServerLevel worldserver1 = ((CraftWorld)selectedSpawn.getWorld()).getHandle(); + player.setPosRaw(selectedSpawn.getX(), selectedSpawn.getY(), selectedSpawn.getZ()); -+ player.lastSave = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); ++ player.lastSave = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); + // Folia end - region threading - rewrite login process player.setLevel(worldserver1); String s1 = "local"; @@ -17226,7 +17219,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e49e9cc31a9e05422fd1f48616c5a452 protected void save(ServerPlayer player) { if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit - player.lastSave = MinecraftServer.currentTick; // Paper -+ player.lastSave = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); // Folia - region threading ++ player.lastSave = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - region threading this.playerIo.save(player); ServerStatsCounter serverstatisticmanager = (ServerStatsCounter) player.getStats(); // CraftBukkit @@ -17389,7 +17382,7 @@ index 0dbe182fbae5ce5ba182176eb5d5e3f1897e77f2..e49e9cc31a9e05422fd1f48616c5a452 - long now = MinecraftServer.currentTick; - for (int i = 0; i < this.players.size(); ++i) { - ServerPlayer entityplayer = this.players.get(i); -+ long now = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); // Folia - region threading ++ long now = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - region threading + for (ServerPlayer entityplayer : this.players) { // Folia start - region threading + if (!io.papermc.paper.util.TickThread.isTickThreadFor(entityplayer)) { + continue; @@ -17570,7 +17563,7 @@ index 93a1e990b0a6caae4143c2f9d09bfb368fa1d6db..ad3166481dd37f4b5380f8bf28653bb4 itemstack = entityliving2.getMainHandItem(); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9a1e8589e6b371869b2199650172d61ae186c907..030139f939fe870a163eb4e0e1a50798fde96094 100644 +index 9a1e8589e6b371869b2199650172d61ae186c907..006695237ddd0cc5f1910c307d4e8a696128807f 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -165,7 +165,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -17724,8 +17717,8 @@ index 9a1e8589e6b371869b2199650172d61ae186c907..030139f939fe870a163eb4e0e1a50798 if (movementType == MoverType.PISTON) { - this.activatedTick = Math.max(this.activatedTick, MinecraftServer.currentTick + 20); // Paper - this.activatedImmunityTick = Math.max(this.activatedImmunityTick, MinecraftServer.currentTick + 20); // Paper -+ this.activatedTick = Math.max(this.activatedTick, io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() + 20); // Paper -+ this.activatedImmunityTick = Math.max(this.activatedImmunityTick, io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() + 20); // Paper ++ this.activatedTick = Math.max(this.activatedTick, io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + 20); // Paper ++ this.activatedImmunityTick = Math.max(this.activatedImmunityTick, io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + 20); // Paper movement = this.limitPistonMovement(movement); if (movement.equals(Vec3.ZERO)) { return; @@ -17948,7 +17941,7 @@ index 9a1e8589e6b371869b2199650172d61ae186c907..030139f939fe870a163eb4e0e1a50798 + destination.pushPendingTeleport(pendingTeleport); + + Runnable scheduleEntityJoin = () -> { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + destination, + io.papermc.paper.util.CoordinateUtils.getChunkX(pos), io.papermc.paper.util.CoordinateUtils.getChunkZ(pos), + () -> { @@ -18837,7 +18830,7 @@ index e3242cf9a6ad51a23c5781142198dec30c8f376d..f32f5982ceb368b240062b9b8ac0141b }).filter((entityplayer) -> { return entity.closerThan(entityplayer, 10.0D); diff --git a/src/main/java/net/minecraft/world/entity/ai/village/VillageSiege.java b/src/main/java/net/minecraft/world/entity/ai/village/VillageSiege.java -index fed09b886f4fa0006d160e5f2abb00dfee45434d..394d73b10bc53310d936d1ad568a77bf852ef9d6 100644 +index fed09b886f4fa0006d160e5f2abb00dfee45434d..69075026c25ed1ce0f3c769ea0e4a8f3c4841f63 100644 --- a/src/main/java/net/minecraft/world/entity/ai/village/VillageSiege.java +++ b/src/main/java/net/minecraft/world/entity/ai/village/VillageSiege.java @@ -22,62 +22,66 @@ import org.slf4j.Logger; @@ -18860,13 +18853,13 @@ index fed09b886f4fa0006d160e5f2abb00dfee45434d..394d73b10bc53310d936d1ad568a77bf @Override public int tick(ServerLevel world, boolean spawnMonsters, boolean spawnAnimals) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + // Folia start - region threading + // check if the spawn pos is no longer owned by this region + if (worldData.villageSiegeState.siegeState != State.SIEGE_DONE + && !io.papermc.paper.util.TickThread.isTickThreadFor(world, worldData.villageSiegeState.spawnX >> 4, worldData.villageSiegeState.spawnZ >> 4, 8)) { + // can't spawn here, just re-set -+ worldData.villageSiegeState = new io.papermc.paper.threadedregions.RegionisedWorldData.VillageSiegeState(); ++ worldData.villageSiegeState = new io.papermc.paper.threadedregions.RegionizedWorldData.VillageSiegeState(); + } + // Folia end - region threading if (!world.isDay() && spawnMonsters) { @@ -18923,7 +18916,7 @@ index fed09b886f4fa0006d160e5f2abb00dfee45434d..394d73b10bc53310d936d1ad568a77bf private boolean tryToSetupSiege(ServerLevel world) { - Iterator iterator = world.players().iterator(); -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + Iterator iterator = world.getLocalPlayers().iterator(); // Folia - region threading while (iterator.hasNext()) { @@ -18952,7 +18945,7 @@ index fed09b886f4fa0006d160e5f2abb00dfee45434d..394d73b10bc53310d936d1ad568a77bf private void trySpawn(ServerLevel world) { - Vec3 vec3d = this.findRandomSpawnPos(world, new BlockPos(this.spawnX, this.spawnY, this.spawnZ)); -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + Vec3 vec3d = this.findRandomSpawnPos(world, new BlockPos(worldData.villageSiegeState.spawnX, worldData.villageSiegeState.spawnY, worldData.villageSiegeState.spawnZ)); // Folia - region threading if (vec3d != null) { @@ -19281,7 +19274,7 @@ index ca96b893e22de3ae7c11d5cded51edf70bdcb6f2..6000e891620850aac303630bf6676085 } diff --git a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java b/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java -index 5f407535298a31a34cfe114dd863fd6a9b977707..1f1e3d6e5e94b985a5c929ab266a996471432923 100644 +index 5f407535298a31a34cfe114dd863fd6a9b977707..cb0f75fb32836efa50f0a86dfae7907b0c88780f 100644 --- a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java +++ b/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java @@ -21,17 +21,18 @@ import net.minecraft.world.phys.AABB; @@ -19296,7 +19289,7 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..1f1e3d6e5e94b985a5c929ab266a9964 if (spawnAnimals && world.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { - --this.nextTick; - if (this.nextTick > 0) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + --worldData.catSpawnerNextTick; // Folia - region threading + if (worldData.catSpawnerNextTick > 0) { // Folia - region threading return 0; @@ -19309,14 +19302,14 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..1f1e3d6e5e94b985a5c929ab266a9964 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 6023b9eb3001e1a98ab8b970d853c4e7c7603f4d..02cf29f089adeec2ba93aabb5778f7c2e4c380af 100644 +index 6023b9eb3001e1a98ab8b970d853c4e7c7603f4d..e782da365bf45e3e20673b5ab70422e1b9c36027 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -722,6 +722,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler ServerLevel worldserver = minecraftserver.getLevel(globalpos.dimension()); if (worldserver != null) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( // Folia - region threading + worldserver, globalpos.pos().getX() >> 4, globalpos.pos().getZ() >> 4, () -> { // Folia - region threading PoiManager villageplace = worldserver.getPoiManager(); Optional> optional = villageplace.getType(globalpos.pos()); @@ -19330,7 +19323,7 @@ index 6023b9eb3001e1a98ab8b970d853c4e7c7603f4d..02cf29f089adeec2ba93aabb5778f7c2 } }); 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 ae9f9112ce9bec82e7571f679017f1723d9eb982..d9d832b7978d03417912408564f6e21bb5e52dc3 100644 +index ae9f9112ce9bec82e7571f679017f1723d9eb982..509718d30800f94ea7d3233aba8566547e5766af 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 { @@ -19357,7 +19350,7 @@ index ae9f9112ce9bec82e7571f679017f1723d9eb982..d9d832b7978d03417912408564f6e21b @Override public int tick(ServerLevel world, boolean spawnMonsters, boolean spawnAnimals) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading // Paper start - if (this.tickDelay == Integer.MIN_VALUE) { - this.tickDelay = world.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength; @@ -19894,7 +19887,7 @@ index fabce3bc592b1b172b227395a07febdbb66ec3c9..ebdbadc1dba41f47ba4795ea43020b80 if (raid1.isActive() && d1 < d0) { diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java -index 1b8f22805af87dc08e0dea9fd93a5f93c0b05107..9c265574f02616c924c0de1b82f4499816b53b94 100644 +index 1b8f22805af87dc08e0dea9fd93a5f93c0b05107..00bc99948ddd67bb85c3797f869064540a8b1213 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java @@ -128,7 +128,7 @@ public class MinecartHopper extends AbstractMinecartContainer implements Hopper @@ -19902,7 +19895,7 @@ index 1b8f22805af87dc08e0dea9fd93a5f93c0b05107..9c265574f02616c924c0de1b82f44998 // Paper start public void immunize() { - this.activatedImmunityTick = Math.max(this.activatedImmunityTick, net.minecraft.server.MinecraftServer.currentTick + 20); -+ this.activatedImmunityTick = Math.max(this.activatedImmunityTick, io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() + 20); ++ this.activatedImmunityTick = Math.max(this.activatedImmunityTick, io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + 20); } // Paper end @@ -19920,7 +19913,7 @@ index d7a0cbde8f8c99276307502674c71463fbe7e89c..2a501b3fa8d69f627b279fd035fd2cb1 } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index a6253272205337b3b855679b3057c2519a807a4c..291d55866a4f5da3409a96675cc71e153ce3e5fd 100644 +index a6253272205337b3b855679b3057c2519a807a4c..c867737f839598b996b58942017ff6f5b2aaa3f0 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -334,6 +334,7 @@ public final class ItemStack { @@ -19935,7 +19928,7 @@ index a6253272205337b3b855679b3057c2519a807a4c..291d55866a4f5da3409a96675cc71e15 CompoundTag oldData = this.getTagClone(); int oldCount = this.getCount(); ServerLevel world = (ServerLevel) itemactioncontext.getLevel(); -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading if (!(this.getItem() instanceof BucketItem/* || this.getItem() instanceof SolidBucketItem*/)) { // if not bucket // Paper - capture block states for snow buckets - world.captureBlockStates = true; @@ -20247,7 +20240,7 @@ index 59837144c2c0460aca6e8c349eb3d6528111d1dc..7f32d5d5b709e8bb0395ccbeada2322c static class CacheKey { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 944da18bcc993ab0488a34cbbe9df134c355301a..54e5b4eb2cc0d77e20edcf677b0ffed10cd27a4c 100644 +index 944da18bcc993ab0488a34cbbe9df134c355301a..dcc00d7b8535ff3671d8c710518584e495597578 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -118,10 +118,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -20343,15 +20336,15 @@ index 944da18bcc993ab0488a34cbbe9df134c355301a..54e5b4eb2cc0d77e20edcf677b0ffed1 public abstract ResourceKey getTypeKey(); + // Folia start - region ticking -+ public final io.papermc.paper.threadedregions.RegionisedData worldRegionData -+ = new io.papermc.paper.threadedregions.RegionisedData<>( -+ (ServerLevel)this, () -> new io.papermc.paper.threadedregions.RegionisedWorldData((ServerLevel)Level.this), -+ io.papermc.paper.threadedregions.RegionisedWorldData.REGION_CALLBACK ++ public final io.papermc.paper.threadedregions.RegionizedData worldRegionData ++ = new io.papermc.paper.threadedregions.RegionizedData<>( ++ (ServerLevel)this, () -> new io.papermc.paper.threadedregions.RegionizedWorldData((ServerLevel)Level.this), ++ io.papermc.paper.threadedregions.RegionizedWorldData.REGION_CALLBACK + ); -+ public volatile io.papermc.paper.threadedregions.RegionisedServer.WorldLevelData tickData; ++ public volatile io.papermc.paper.threadedregions.RegionizedServer.WorldLevelData tickData; + -+ public io.papermc.paper.threadedregions.RegionisedWorldData getCurrentWorldData() { -+ return io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); ++ public io.papermc.paper.threadedregions.RegionizedWorldData getCurrentWorldData() { ++ return io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); + } + + @Override @@ -20387,7 +20380,7 @@ index 944da18bcc993ab0488a34cbbe9df134c355301a..54e5b4eb2cc0d77e20edcf677b0ffed1 @Override public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = this.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = this.getCurrentWorldData(); // Folia - region threading // CraftBukkit start - tree generation - if (this.captureTreeGeneration) { + if (worldData.captureTreeGeneration) { // Folia - region threading @@ -20509,10 +20502,10 @@ index 944da18bcc993ab0488a34cbbe9df134c355301a..54e5b4eb2cc0d77e20edcf677b0ffed1 - this.blockEntityTickers.addAll(this.pendingBlockEntityTickers); - this.pendingBlockEntityTickers.clear(); - } -+ final io.papermc.paper.threadedregions.RegionisedWorldData regionisedWorldData = ((ServerLevel)this).getCurrentWorldData(); // Folia - regionised ticking -+ regionisedWorldData.seTtickingBlockEntities(true); // Folia - regionised ticking -+ regionisedWorldData.pushPendingTickingBlockEntities(); // Folia - regionised ticking -+ List blockEntityTickers = regionisedWorldData.getBlockEntityTickers(); // Folia - regionised ticking ++ final io.papermc.paper.threadedregions.RegionizedWorldData regionizedWorldData = ((ServerLevel)this).getCurrentWorldData(); // Folia - regionised ticking ++ regionizedWorldData.seTtickingBlockEntities(true); // Folia - regionised ticking ++ regionizedWorldData.pushPendingTickingBlockEntities(); // Folia - regionised ticking ++ List blockEntityTickers = regionizedWorldData.getBlockEntityTickers(); // Folia - regionised ticking timings.tileEntityPending.stopTiming(); // Spigot timings.tileEntityTick.startTiming(); // Spigot @@ -20545,11 +20538,11 @@ index 944da18bcc993ab0488a34cbbe9df134c355301a..54e5b4eb2cc0d77e20edcf677b0ffed1 timings.tileEntityTick.stopTiming(); // Spigot - this.tickingBlockEntities = false; - co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper -+ regionisedWorldData.seTtickingBlockEntities(false); // Folia - regionised ticking ++ regionizedWorldData.seTtickingBlockEntities(false); // Folia - regionised ticking + //co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper // Folia - region threading gameprofilerfiller.pop(); - spigotConfig.currentPrimedTnt = 0; // Spigot -+ regionisedWorldData.currentPrimedTnt = 0; // Spigot // Folia - region threading ++ regionizedWorldData.currentPrimedTnt = 0; // Spigot // Folia - region threading } public void guardEntityTick(Consumer tickConsumer, T entity) { @@ -20588,14 +20581,14 @@ index 944da18bcc993ab0488a34cbbe9df134c355301a..54e5b4eb2cc0d77e20edcf677b0ffed1 public long getGameTime() { - return this.levelData.getGameTime(); + // Dumb world gen thread calls this for some reason. So, check for null. -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = this.getCurrentWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = this.getCurrentWorldData(); + return worldData == null ? this.getLevelData().getGameTime() : worldData.getTickData().nonRedstoneGameTime(); } public long getDayTime() { - return this.levelData.getDayTime(); + // Dumb world gen thread calls this for some reason. So, check for null. -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = this.getCurrentWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = this.getCurrentWorldData(); + return worldData == null ? this.getLevelData().getDayTime() : worldData.getTickData().dayTime(); + } + @@ -21034,7 +21027,7 @@ index 6b909d41ccdf6c1ac3ac0c4e673ff52f0d14a238..e7079e164f5943f21aff487c22c525f7 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 5ea09cc455bd86beb450f0e0275d7c6c8da98084..df433331a9cab9b94d10a1b6f9c83d38bdcb4f93 100644 +index 5ea09cc455bd86beb450f0e0275d7c6c8da98084..cc019091a2decbc1e5c760129778b42ea1d449d6 100644 --- a/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java @@ -67,7 +67,7 @@ public class RedStoneWireBlock extends Block { @@ -21060,10 +21053,10 @@ index 5ea09cc455bd86beb450f0e0275d7c6c8da98084..df433331a9cab9b94d10a1b6f9c83d38 int j = 0; j = this.getPower(j, worldIn.getBlockState(pos2)); - this.shouldSignal = false; -+ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal = false; // Folia - region threading ++ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal = false; // Folia - region threading int k = worldIn.getBestNeighborSignal(pos1); - this.shouldSignal = true; -+ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal = true; // Folia - region threading ++ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal = true; // Folia - region threading - if (worldIn.paperConfig().misc.redstoneImplementation == io.papermc.paper.configuration.WorldConfiguration.Misc.RedstoneImplementation.VANILLA) { + if (io.papermc.paper.configuration.WorldConfiguration.Misc.RedstoneImplementation.VANILLA == io.papermc.paper.configuration.WorldConfiguration.Misc.RedstoneImplementation.VANILLA) { // Folia - region threading @@ -21093,11 +21086,11 @@ index 5ea09cc455bd86beb450f0e0275d7c6c8da98084..df433331a9cab9b94d10a1b6f9c83d38 private int calculateTargetStrength(Level world, BlockPos pos) { - this.shouldSignal = false; -+ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal = false; // Folia - region threading ++ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal = false; // Folia - region threading int i = world.getBestNeighborSignal(pos); - this.shouldSignal = true; -+ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal = true; // Folia - region threading ++ io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal = true; // Folia - region threading int j = 0; if (i < 15) { @@ -21133,13 +21126,13 @@ index 5ea09cc455bd86beb450f0e0275d7c6c8da98084..df433331a9cab9b94d10a1b6f9c83d38 @Override public int getDirectSignal(BlockState state, BlockGetter world, BlockPos pos, Direction direction) { - return !this.shouldSignal ? 0 : state.getSignal(world, pos, direction); -+ return !io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal ? 0 : state.getSignal(world, pos, direction); // Folia - region threading ++ return !io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal ? 0 : state.getSignal(world, pos, direction); // Folia - region threading } @Override public int getSignal(BlockState state, BlockGetter world, BlockPos pos, Direction direction) { - if (this.shouldSignal && direction != Direction.DOWN) { -+ if (io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal && direction != Direction.DOWN) { // Folia - region threading ++ if (io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal && direction != Direction.DOWN) { // Folia - region threading int i = (Integer) state.getValue(RedStoneWireBlock.POWER); return i == 0 ? 0 : (direction != Direction.UP && !((RedstoneSide) this.getConnectionState(world, state, pos).getValue((Property) RedStoneWireBlock.PROPERTY_BY_DIRECTION.get(direction.getOpposite()))).isConnected() ? 0 : i); @@ -21148,7 +21141,7 @@ index 5ea09cc455bd86beb450f0e0275d7c6c8da98084..df433331a9cab9b94d10a1b6f9c83d38 @Override public boolean isSignalSource(BlockState state) { - return this.shouldSignal; -+ return io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData().shouldSignal; // Folia - region threading ++ return io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData().shouldSignal; // Folia - region threading } public static int getColorForPower(int powerLevel) { @@ -21209,7 +21202,7 @@ index da07fce0cf7c9fbdb57d2c59e431b59bf583bf50..16e46bb6205c3f7444e864c553e8072f } } diff --git a/src/main/java/net/minecraft/world/level/block/SaplingBlock.java b/src/main/java/net/minecraft/world/level/block/SaplingBlock.java -index 901978a338f0f1b6f20ffb65aac59704bfa6f36a..b76eb074ca64164ec55953d3203a56bb43c18c3b 100644 +index 901978a338f0f1b6f20ffb65aac59704bfa6f36a..4ec92ebdfd803c181cc51a71ba910ed34643a578 100644 --- a/src/main/java/net/minecraft/world/level/block/SaplingBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SaplingBlock.java @@ -26,7 +26,7 @@ public class SaplingBlock extends BushBlock implements BonemealableBlock { @@ -21226,7 +21219,7 @@ index 901978a338f0f1b6f20ffb65aac59704bfa6f36a..b76eb074ca64164ec55953d3203a56bb } else { // CraftBukkit start - if (world.captureTreeGeneration) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + if (worldData.captureTreeGeneration) { // Folia - region threading this.treeGrower.growTree(world, world.getChunkSource().getGenerator(), pos, state, random); } else { @@ -21250,7 +21243,7 @@ index 901978a338f0f1b6f20ffb65aac59704bfa6f36a..b76eb074ca64164ec55953d3203a56bb 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 af46c05a34292d271fd4a809398e6b299e10b12b..49a8d37b9c77dbc869c03e9f495efeeef606fa4a 100644 +index af46c05a34292d271fd4a809398e6b299e10b12b..2eeb9352bc35a31efe98be51746014afd7e5e71c 100644 --- a/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpreadingSnowyDirtBlock.java @@ -51,7 +51,7 @@ public abstract class SpreadingSnowyDirtBlock extends SnowyDirtBlock { @@ -21258,7 +21251,7 @@ index af46c05a34292d271fd4a809398e6b299e10b12b..49a8d37b9c77dbc869c03e9f495efeee @Override 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.RegionisedServer.getCurrentTick() + pos.hashCode()) % world.paperConfig().tickRates.grassSpread != 0)) { return; } // Paper // Folia - regionised ticking ++ 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 net.minecraft.world.level.chunk.ChunkAccess cachedBlockChunk = world.getChunkIfLoaded(pos); if (cachedBlockChunk == null) { // Is this needed? @@ -21403,7 +21396,7 @@ index 963a596154091b79ca139af6274aa323518ad1ad..57b11cb78270a8094f772da497ad3264 } diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index cba114f554644a37339c93026630c66c43f524b9..ee224ab6b8be3308f5b9f58967ae117c49e00750 100644 +index cba114f554644a37339c93026630c66c43f524b9..0134370081182260d578ee1d8a16d544c03b6a0d 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -194,12 +194,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen @@ -21413,11 +21406,11 @@ index cba114f554644a37339c93026630c66c43f524b9..ee224ab6b8be3308f5b9f58967ae117c - private static boolean skipPullModeEventFire; - private static boolean skipPushModeEventFire; - public static boolean skipHopperEvents; -+ // Folia - region threading - moved to RegionisedWorldData ++ // Folia - region threading - moved to RegionizedWorldData private static boolean hopperPush(final Level level, final Container destination, final Direction direction, final HopperBlockEntity hopper) { - skipPushModeEventFire = skipHopperEvents; -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = level.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = level.getCurrentWorldData(); // Folia - region threading + worldData.skipPushModeEventFire = worldData.skipHopperEvents; // Folia - region threading boolean foundItem = false; for (int i = 0; i < hopper.getContainerSize(); ++i) { @@ -21435,7 +21428,7 @@ index cba114f554644a37339c93026630c66c43f524b9..ee224ab6b8be3308f5b9f58967ae117c } private static boolean hopperPull(final Level level, final Hopper hopper, final Container container, ItemStack origItemStack, final int i) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = level.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = level.getCurrentWorldData(); // Folia - region threading ItemStack movedItem = origItemStack; final int originalItemCount = origItemStack.getCount(); final int movedItemCount = Math.min(level.spigotConfig.hopperAmount, originalItemCount); @@ -21462,7 +21455,7 @@ index cba114f554644a37339c93026630c66c43f524b9..ee224ab6b8be3308f5b9f58967ae117c @Nullable private static ItemStack callPushMoveEvent(Container iinventory, ItemStack itemstack, HopperBlockEntity hopper) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); // Folia - region threading final Inventory destinationInventory = getInventory(iinventory); final InventoryMoveItemEvent event = new InventoryMoveItemEvent(hopper.getOwner(false).getInventory(), CraftItemStack.asCraftMirror(itemstack), destinationInventory, true); @@ -21477,7 +21470,7 @@ index cba114f554644a37339c93026630c66c43f524b9..ee224ab6b8be3308f5b9f58967ae117c @Nullable private static ItemStack callPullMoveEvent(final Hopper hopper, final Container container, final ItemStack itemstack) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); // Folia - region threading final Inventory sourceInventory = getInventory(container); final Inventory destination = getInventory(hopper); @@ -21494,7 +21487,7 @@ index cba114f554644a37339c93026630c66c43f524b9..ee224ab6b8be3308f5b9f58967ae117c } public static boolean suckInItems(Level world, Hopper hopper) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionisedWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = io.papermc.paper.threadedregions.TickRegionScheduler.getCurrentRegionizedWorldData(); // Folia - region threading Container iinventory = HopperBlockEntity.getSourceContainer(world, hopper); if (iinventory != null) { @@ -21535,7 +21528,7 @@ index 902f2b39104bf059849228829bfe93b6dbc757d4..9a6c51652bd2dbb3d474809372df0303 @Override diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index c73024cc62490c336ffe26313580e88d25ca7078..4f2258e3a2bf91e4c9d7f3ffc72aa5eb7696d319 100644 +index c73024cc62490c336ffe26313580e88d25ca7078..ce8557aa7b208c2ea85b361b68306fcb5f420369 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -51,9 +51,12 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { @@ -21588,7 +21581,7 @@ index c73024cc62490c336ffe26313580e88d25ca7078..4f2258e3a2bf91e4c9d7f3ffc72aa5eb + TheEndGatewayBlockEntity.spawnGatewayPortal(world, tpLoc, EndGatewayConfiguration.knownExit(fromPos, false)); + + // need to go onto the tick thread to avoid saving issues -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + world, chunkX, chunkZ, + () -> { + // update the exit portal location @@ -21725,7 +21718,7 @@ index c73024cc62490c336ffe26313580e88d25ca7078..4f2258e3a2bf91e4c9d7f3ffc72aa5eb + ); + } + // now after the chunks are loaded, we can delay by one tick -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue( ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + world, posX >> 4, posZ >> 4, () -> { + // find final location + BlockPos tpLoc = TheEndGatewayBlockEntity.findTallestBlock(world, finalBlockPosition1, radius, true); @@ -21895,7 +21888,7 @@ index a743f36f2682a6b72ffa6644782fc081d1479eb7..f5263a71d97f404c6f6dbd3354a5ed2e // CraftBukkit end } diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -index 221c5d080d55326e458c1182823d6b49224ef498..29a27534e6c97b262229b51e4ea0345502020647 100644 +index 221c5d080d55326e458c1182823d6b49224ef498..0a1c876d68e834136f71f226c421699eb523de5a 100644 --- a/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java @@ -144,8 +144,8 @@ public class PistonMovingBlockEntity extends BlockEntity { @@ -21904,8 +21897,8 @@ index 221c5d080d55326e458c1182823d6b49224ef498..29a27534e6c97b262229b51e4ea03455 // Paper - EAR items stuck in in slime pushed by a piston - entity.activatedTick = Math.max(entity.activatedTick, net.minecraft.server.MinecraftServer.currentTick + 10); - entity.activatedImmunityTick = Math.max(entity.activatedImmunityTick, net.minecraft.server.MinecraftServer.currentTick + 10); -+ entity.activatedTick = Math.max(entity.activatedTick, io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() + 10); // Folia - region threading -+ entity.activatedImmunityTick = Math.max(entity.activatedImmunityTick, io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() + 10); // Folia - region threading ++ entity.activatedTick = Math.max(entity.activatedTick, io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + 10); // Folia - region threading ++ entity.activatedImmunityTick = Math.max(entity.activatedImmunityTick, io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + 10); // Folia - region threading // Paper end break; } @@ -22219,7 +22212,7 @@ index e9eb32469a5c03f7a3677ef50fd4541c1ed662ad..88b1a06fc44980d05dabd3943caa2409 if (blockPos == null) { LOGGER.debug("Tried to respawn, but need to find the portal first."); diff --git a/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java -index a908652f1ebb426d265ef614746f70cd1e538268..b2a9cd719c4968a1cde8f0b30f46f01d5872fbc9 100644 +index a908652f1ebb426d265ef614746f70cd1e538268..e615b79f68a0467aa8cfa1c61b06ae048a28ef9b 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java +++ b/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.block.state.BlockState; @@ -22235,7 +22228,7 @@ index a908652f1ebb426d265ef614746f70cd1e538268..b2a9cd719c4968a1cde8f0b30f46f01d return 0; } else { RandomSource randomsource = world.random; -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading // Paper start - Patrol settings // Random player selection moved up for per player spawning and configuration @@ -22271,7 +22264,7 @@ index a908652f1ebb426d265ef614746f70cd1e538268..b2a9cd719c4968a1cde8f0b30f46f01d 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 e8ae4449696d73c8c9b8b27d4d2e20db933a72cc..cd4bac707744a98d4577f9b3f47b817f43ff15ab 100644 +index e8ae4449696d73c8c9b8b27d4d2e20db933a72cc..99959b50d06d550ce56bb26e35ec38ec741479da 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/src/main/java/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -24,7 +24,7 @@ import net.minecraft.world.level.material.FluidState; @@ -22289,7 +22282,7 @@ index e8ae4449696d73c8c9b8b27d4d2e20db933a72cc..cd4bac707744a98d4577f9b3f47b817f - --this.nextTick; - if (this.nextTick > 0) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + + --worldData.phantomSpawnerNextTick; // Folia - region threading + if (worldData.phantomSpawnerNextTick > 0) { // Folia - region threading @@ -22856,7 +22849,7 @@ index ac807277a6b26d140ea9873d17c7aa4fb5fe37b2..e13d8700593f1f486cfc5c96ac258942 public LevelChunkTicks() { } diff --git a/src/main/java/net/minecraft/world/ticks/LevelTicks.java b/src/main/java/net/minecraft/world/ticks/LevelTicks.java -index 1d7c663fa0e550bd0cfb9a4b83ccd7e2968666f0..e559b54a5d3d5f07ed6f96347a8697a21a55ede0 100644 +index 1d7c663fa0e550bd0cfb9a4b83ccd7e2968666f0..f3df9c9b6cff85565514f990597f3fe53652812c 100644 --- a/src/main/java/net/minecraft/world/ticks/LevelTicks.java +++ b/src/main/java/net/minecraft/world/ticks/LevelTicks.java @@ -42,13 +42,70 @@ public class LevelTicks implements LevelTickAccess { @@ -22944,7 +22937,7 @@ index 1d7c663fa0e550bd0cfb9a4b83ccd7e2968666f0..e559b54a5d3d5f07ed6f96347a8697a2 + // make sure the lambda contains no reference to this LevelTicks + scheduler.setOnTickAdded((chunkTickScheduler, tick) -> { + if (tick.equals(chunkTickScheduler.peek())) { -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); + (isBlock ? worldData.getBlockLevelTicks() : worldData.getFluidLevelTicks()).updateContainerScheduling((ScheduledTick)tick); + } + }); @@ -22961,7 +22954,7 @@ index 1d7c663fa0e550bd0cfb9a4b83ccd7e2968666f0..e559b54a5d3d5f07ed6f96347a8697a2 LevelChunkTicks levelChunkTicks = this.allContainers.get(l); if (levelChunkTicks == null) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index e0b6c737f9de2b6e692d6813d8dea4c35f038573..5fa6b219b90bcf3f583eb64cf5eecf09bc56a406 100644 +index e0b6c737f9de2b6e692d6813d8dea4c35f038573..71663e4f16fb59c36c53badfd19c63702ba792f9 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -303,6 +303,81 @@ public final class CraftServer implements Server { @@ -22969,13 +22962,13 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..5fa6b219b90bcf3f583eb64cf5eecf09 } + // Folia start - region threading API -+ private final io.papermc.paper.threadedregions.scheduler.FoliaRegionisedScheduler regionisedScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaRegionisedScheduler(); ++ private final io.papermc.paper.threadedregions.scheduler.FoliaRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaRegionScheduler(); + private final io.papermc.paper.threadedregions.scheduler.FoliaAsyncScheduler asyncScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaAsyncScheduler(); + private final io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler globalRegionScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler(); + + @Override -+ public final io.papermc.paper.threadedregions.scheduler.RegionisedScheduler getRegionScheduler() { -+ return this.regionisedScheduler; ++ public final io.papermc.paper.threadedregions.scheduler.RegionScheduler getRegionScheduler() { ++ return this.regionizedScheduler; + } + + @Override @@ -23051,7 +23044,7 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..5fa6b219b90bcf3f583eb64cf5eecf09 // NOTE: Should only be called from DedicatedServer.ah() public boolean dispatchServerCommand(CommandSender sender, ConsoleInput serverCommand) { + // Folia start - region threading -+ io.papermc.paper.threadedregions.RegionisedServer.ensureGlobalTickThread("May not dispatch server commands async"); ++ io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("May not dispatch server commands async"); + // Folia end - region threading if (sender instanceof Conversable) { Conversable conversable = (Conversable) sender; @@ -23071,7 +23064,7 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..5fa6b219b90bcf3f583eb64cf5eecf09 + 1L + ); + } else if (sender instanceof ConsoleCommandSender console) { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { + CraftServer.this.dispatchCommand(sender, commandLine); + }); + } else { @@ -23091,7 +23084,7 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..5fa6b219b90bcf3f583eb64cf5eecf09 + if ((sender instanceof Entity entity)) { + io.papermc.paper.util.TickThread.ensureTickThread(((org.bukkit.craftbukkit.entity.CraftEntity)entity).getHandle(), "Dispatching command async"); + } else if (sender instanceof ConsoleCommandSender console) { -+ io.papermc.paper.threadedregions.RegionisedServer.ensureGlobalTickThread("Dispatching command async"); ++ io.papermc.paper.threadedregions.RegionizedServer.ensureGlobalTickThread("Dispatching command async"); + } else { + // huh? + throw new UnsupportedOperationException("Dispatching command for " + sender); @@ -23106,12 +23099,12 @@ index e0b6c737f9de2b6e692d6813d8dea4c35f038573..5fa6b219b90bcf3f583eb64cf5eecf09 @Override public int getCurrentTick() { - return net.minecraft.server.MinecraftServer.currentTick; -+ return (int)io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); // Folia - region threading ++ return (int)io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - region threading } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..fe73d712ad79451fc3edbc70088e9736de05e70c 100644 +index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..aaeb1bdbf3f2f719f08777b2c2cc2196c49dee89 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -180,7 +180,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -23149,7 +23142,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..fe73d712ad79451fc3edbc70088e9736 return java.util.concurrent.CompletableFuture.supplyAsync(() -> { return CraftWorld.this.isChunkGenerated(x, z); - }, world.getChunkSource().mainThreadProcessor).join(); -+ }, (run) -> { io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueChunkTask(this.getHandle(), x, z, run);}).join(); // Folia - region threading ++ }, (run) -> { io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueChunkTask(this.getHandle(), x, z, run);}).join(); // Folia - region threading } ChunkAccess chunk = world.getChunkSource().getChunkAtImmediately(x, z); if (chunk == null) { @@ -23176,7 +23169,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..fe73d712ad79451fc3edbc70088e9736 public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { - world.captureTreeGeneration = true; - world.captureBlockStates = true; -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading + worldData.captureTreeGeneration = true; // Folia - region threading + worldData.captureBlockStates = true; // Folia - region threading boolean grownTree = this.generateTree(loc, type); @@ -23244,7 +23237,7 @@ index ff6559bf563f2fdcc0f2843d4f4aa24d7ddfb6db..fe73d712ad79451fc3edbc70088e9736 io.papermc.paper.chunk.system.ChunkSystem.scheduleChunkLoad(this.getHandle(), x, z, gen, ChunkStatus.FULL, true, priority, (c) -> { - net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> { -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().taskQueue.queueTickTaskQueue(this.getHandle(), x, z, () -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue(this.getHandle(), x, z, () -> { // Folia - region threading net.minecraft.world.level.chunk.LevelChunk chunk = (net.minecraft.world.level.chunk.LevelChunk)c; if (chunk != null) addTicket(x, z); // Paper ret.complete(chunk == null ? null : chunk.getBukkitChunk()); @@ -23261,14 +23254,14 @@ index fb6454cc64ebc549f61ad7d51efb16ef15f8384d..903408d4d8f9ce5c9566ec96312281ab tileentitybeehive.addOccupantWithPresetTicks(entitybee, false, random.nextInt(599)); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -index 962c950ca9c7e047a3aec215d4faa73676049d36..e4ff805381be84d88c11ab7643b10920cfcbcfeb 100644 +index 962c950ca9c7e047a3aec215d4faa73676049d36..ed7c725aa4a5be4d3583dcd17bc57b5d7631e562 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -568,16 +568,17 @@ public class CraftBlock implements Block { ServerLevel world = this.getCraftWorld().getHandle(); UseOnContext context = new UseOnContext(world, null, InteractionHand.MAIN_HAND, Items.BONE_MEAL.getDefaultInstance(), new BlockHitResult(Vec3.ZERO, direction, this.getPosition(), false)); -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - region threading // SPIGOT-6895: Call StructureGrowEvent and BlockFertilizeEvent - world.captureTreeGeneration = true; + worldData.captureTreeGeneration = true; // Folia - region threading @@ -23290,7 +23283,7 @@ index 962c950ca9c7e047a3aec215d4faa73676049d36..e4ff805381be84d88c11ab7643b10920 if (treeType != null) { diff --git a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java -index cd4ad8261e56365850068db1d83d6a8454026737..c098ae9f057a3dcc77c61555feb870452e947ae7 100644 +index cd4ad8261e56365850068db1d83d6a8454026737..78f7e72f2912dae503c2dab7d1992b652b404ae5 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 { @@ -23298,7 +23291,7 @@ index cd4ad8261e56365850068db1d83d6a8454026737..c098ae9f057a3dcc77c61555feb87045 } }; - server.getServer().processQueue.add(syncCompletions); -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(syncCompletions); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(syncCompletions); // Folia - region threading try { final List legacyCompletions = syncCompletions.get(); completions.removeIf(it -> !legacyCompletions.contains(it.suggestion())); // remove any suggestions that were removed @@ -23307,7 +23300,7 @@ index cd4ad8261e56365850068db1d83d6a8454026737..c098ae9f057a3dcc77c61555feb87045 } }; - server.getServer().processQueue.add(waitable); // Paper - Remove "this." -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(waitable); // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(waitable); // Folia - region threading try { List offers = waitable.get(); if (offers == null) { @@ -23412,7 +23405,7 @@ index 57a0dbb23a32123d30c3b3572f4d129be9d97847..3f46d9398add0e97a2b8b072f66b48b0 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 100f057f98b2f15972afe32fade22a7a320cf300..9ee05436a26c73f99bb5e0eae43831d7bd385975 100644 +index e769c1c2a99a13941124c7442d44a509e7859666..867838df8a6144fd00e7cf01eb840ad836d6125b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -564,7 +564,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -23572,17 +23565,17 @@ index 64c50c52c11214740de7903e5592b8b6b2c170b3..9f5e8a21de3785721897cf8cf75b17ce int pluginIndex = CraftMagicNumbers.SUPPORTED_API.indexOf(pdf.getAPIVersion()); diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index e881584d38dc354204479863f004e974a0ac6c07..7d99ba41a3178f5321403eb7749f0a4b898ad0a9 100644 +index e881584d38dc354204479863f004e974a0ac6c07..88536769e7605fafdf54494d0ebf17f306af8278 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -65,26 +65,27 @@ public class ActivationRange private static int checkInactiveWakeup(Entity entity) { Level world = entity.level; -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - threaded regions ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - threaded regions SpigotWorldConfig config = world.spigotConfig; - long inactiveFor = MinecraftServer.currentTick - entity.activatedTick; -+ long inactiveFor = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() - entity.activatedTick; // Folia - threaded regions ++ long inactiveFor = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() - entity.activatedTick; // Folia - threaded regions if (entity.activationType == ActivationType.VILLAGER) { - if (inactiveFor > config.wakeUpInactiveVillagersEvery && world.wakeupInactiveRemainingVillagers > 0) { - world.wakeupInactiveRemainingVillagers--; @@ -23620,7 +23613,7 @@ index e881584d38dc354204479863f004e974a0ac6c07..7d99ba41a3178f5321403eb7749f0a4b - world.wakeupInactiveRemainingVillagers = Math.min(world.wakeupInactiveRemainingVillagers + 1, world.spigotConfig.wakeUpInactiveVillagers); - world.wakeupInactiveRemainingMonsters = Math.min(world.wakeupInactiveRemainingMonsters + 1, world.spigotConfig.wakeUpInactiveMonsters); - world.wakeupInactiveRemainingFlying = Math.min(world.wakeupInactiveRemainingFlying + 1, world.spigotConfig.wakeUpInactiveFlying); -+ io.papermc.paper.threadedregions.RegionisedWorldData worldData = world.getCurrentWorldData(); // Folia - threaded regions ++ io.papermc.paper.threadedregions.RegionizedWorldData worldData = world.getCurrentWorldData(); // Folia - threaded regions + worldData.wakeupInactiveRemainingAnimals = Math.min(worldData.wakeupInactiveRemainingAnimals + 1, world.spigotConfig.wakeUpInactiveAnimals); // Folia - threaded regions + worldData.wakeupInactiveRemainingVillagers = Math.min(worldData.wakeupInactiveRemainingVillagers + 1, world.spigotConfig.wakeUpInactiveVillagers); // Folia - threaded regions + worldData.wakeupInactiveRemainingMonsters = Math.min(worldData.wakeupInactiveRemainingMonsters + 1, world.spigotConfig.wakeUpInactiveMonsters); // Folia - threaded regions @@ -23636,7 +23629,7 @@ index e881584d38dc354204479863f004e974a0ac6c07..7d99ba41a3178f5321403eb7749f0a4b + for ( Player player : world.getLocalPlayers() ) // Folia - region threading { - player.activatedTick = MinecraftServer.currentTick; -+ player.activatedTick = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); // Folia - region threading ++ player.activatedTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - region threading if ( world.spigotConfig.ignoreSpectatorActivation && player.isSpectator() ) { continue; @@ -23654,18 +23647,18 @@ index e881584d38dc354204479863f004e974a0ac6c07..7d99ba41a3178f5321403eb7749f0a4b private static void activateEntity(Entity entity) { - if ( MinecraftServer.currentTick > entity.activatedTick ) -+ if ( io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() > entity.activatedTick ) // Folia - threaded regions ++ if ( io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() > entity.activatedTick ) // Folia - threaded regions { if ( entity.defaultActivationState ) { - entity.activatedTick = MinecraftServer.currentTick; -+ entity.activatedTick = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); // Folia - threaded regions ++ entity.activatedTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - threaded regions return; } if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) ) { - entity.activatedTick = MinecraftServer.currentTick; -+ entity.activatedTick = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); // Folia - threaded regions ++ entity.activatedTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - threaded regions } } } @@ -23674,11 +23667,11 @@ index e881584d38dc354204479863f004e974a0ac6c07..7d99ba41a3178f5321403eb7749f0a4b return 2; } - if (entity.activatedImmunityTick >= MinecraftServer.currentTick) { -+ if (entity.activatedImmunityTick >= io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick()) { // Folia - threaded regions ++ if (entity.activatedImmunityTick >= io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick()) { // Folia - threaded regions return 1; } - long inactiveFor = MinecraftServer.currentTick - entity.activatedTick; -+ long inactiveFor = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() - entity.activatedTick; // Folia - threaded regions ++ long inactiveFor = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() - entity.activatedTick; // Folia - threaded regions // Paper end // quick checks. if ( (entity.activationType != ActivationType.WATER && entity.wasTouchingWater && entity.isPushedByFluid()) ) // Paper @@ -23687,33 +23680,33 @@ index e881584d38dc354204479863f004e974a0ac6c07..7d99ba41a3178f5321403eb7749f0a4b // Paper end - boolean isActive = entity.activatedTick >= MinecraftServer.currentTick; -+ boolean isActive = entity.activatedTick >= io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick(); // Folia - threaded regions ++ boolean isActive = entity.activatedTick >= io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick(); // Folia - threaded regions entity.isTemporarilyActive = false; // Paper // Should this entity tick? if ( !isActive ) { - if ( ( MinecraftServer.currentTick - entity.activatedTick - 1 ) % 20 == 0 ) -+ if ( ( io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() - entity.activatedTick - 1 ) % 20 == 0 ) // Folia - threaded regions ++ if ( ( io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() - entity.activatedTick - 1 ) % 20 == 0 ) // Folia - threaded regions { // Check immunities every 20 ticks. // Paper start int immunity = checkEntityImmunities(entity); if (immunity >= 0) { - entity.activatedTick = MinecraftServer.currentTick + immunity; -+ entity.activatedTick = io.papermc.paper.threadedregions.RegionisedServer.getCurrentTick() + immunity; // Folia - threaded regions ++ entity.activatedTick = io.papermc.paper.threadedregions.RegionizedServer.getCurrentTick() + immunity; // Folia - threaded regions } else { entity.isTemporarilyActive = true; } diff --git a/src/main/java/org/spigotmc/SpigotCommand.java b/src/main/java/org/spigotmc/SpigotCommand.java -index 3112a8695639c402e9d18710acbc11cff5611e9c..72976bdb3db5d0066599272fab1055b2e20c5b26 100644 +index 3112a8695639c402e9d18710acbc11cff5611e9c..b0249d9b61819d4a259753150df795a84ce1d4ff 100644 --- a/src/main/java/org/spigotmc/SpigotCommand.java +++ b/src/main/java/org/spigotmc/SpigotCommand.java @@ -29,6 +29,7 @@ public class SpigotCommand extends Command { Command.broadcastCommandMessage(sender, ChatColor.RED + "Please note that this command is not supported and may cause issues."); Command.broadcastCommandMessage(sender, ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server."); -+ io.papermc.paper.threadedregions.RegionisedServer.getInstance().addTask(() -> { // Folia - region threading ++ io.papermc.paper.threadedregions.RegionizedServer.getInstance().addTask(() -> { // Folia - region threading MinecraftServer console = MinecraftServer.getServer(); org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); for (ServerLevel world : console.getAllLevels()) { diff --git a/patches/server/0005-Increase-parallelism-for-neighbour-writing-chunk-sta.patch b/patches/server/0005-Increase-parallelism-for-neighbour-writing-chunk-sta.patch index 62981eb..1dcee9e 100644 --- a/patches/server/0005-Increase-parallelism-for-neighbour-writing-chunk-sta.patch +++ b/patches/server/0005-Increase-parallelism-for-neighbour-writing-chunk-sta.patch @@ -9,10 +9,10 @@ schedule completely independent tasks in parallel. This will allow the chunk system to scale beyond 10 threads per world. -diff --git a/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java -index 9d44c3923ba29d88e39b742f3da97372626b352e..9522cdbe432f973532569d225327e4f4e1d68edd 100644 ---- a/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java -+++ b/src/main/java/io/papermc/paper/chunk/system/RegionisedPlayerChunkLoader.java +diff --git a/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java +index 5b4025178c1e476ed5dd0808cc33bf1ec7c08b66..ae11120ac1829b237970ac1f9bf90005ce5af2cf 100644 +--- a/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java ++++ b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java @@ -12,6 +12,7 @@ import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue; import it.unimi.dsi.fastutil.longs.LongArrayList; import it.unimi.dsi.fastutil.longs.LongComparator; @@ -32,7 +32,7 @@ index 9d44c3923ba29d88e39b742f3da97372626b352e..9522cdbe432f973532569d225327e4f4 import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; -@@ -288,7 +290,92 @@ public class RegionisedPlayerChunkLoader { +@@ -288,7 +290,92 @@ public class RegionizedPlayerChunkLoader { } } @@ -196,7 +196,7 @@ index 0b7a2b0ead4f3bc07bfd9a38c2b7cf024bd140c6..36e93fefdfbebddce4c153974c7cd81a final int chunkX = CoordinateUtils.getChunkX(coordinate); final int chunkZ = CoordinateUtils.getChunkZ(coordinate); diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java -index 04d2c42e69ed8ab27d21d3bf038de54675e5a148..bb5e5b9d48cb6d459119f66955017cced5af501c 100644 +index 0d1896d09d419c78501bbccca97424dd1545230b..c9080c4df6f416aa023c8bf87e07048ba0c41955 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java @@ -1339,17 +1339,23 @@ public final class ChunkHolderManager { @@ -233,7 +233,7 @@ index 04d2c42e69ed8ab27d21d3bf038de54675e5a148..bb5e5b9d48cb6d459119f66955017cce } diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java -index 93b666893a9755e426701f5c2849fc0fb2026bb7..c17fd8ff9d1eb437fabd5757565137f5a3b307e4 100644 +index 25db30284e3bab9ebad1ca7320db66116057e599..18c543e33ac2f3c3dbfa5a8531b9e532987dbe9d 100644 --- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java +++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java @@ -2,9 +2,9 @@ package io.papermc.paper.chunk.system.scheduling; @@ -1014,7 +1014,7 @@ index 0000000000000000000000000000000000000000..3272f73013ea7d4efdd0ae2903925cc5 + } +} diff --git a/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java b/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java -index eef501b0558680e5563b0a15a93bd3ab217b91d8..4e06ba4165bc385fc360e771db91d75dbb73bea7 100644 +index b64fc5adda3a9ab793a074d08df822754bd8d186..dd9d124e9757e8dec5bd28b3840751ac15304ed9 100644 --- a/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java +++ b/src/main/java/net/minecraft/server/level/ThreadedLevelLightEngine.java @@ -95,7 +95,7 @@ public class ThreadedLevelLightEngine extends LevelLightEngine implements AutoCl diff --git a/patches/server/0007-Max-pending-logins.patch b/patches/server/0007-Max-pending-logins.patch index 6f9bfa5..35d98cb 100644 --- a/patches/server/0007-Max-pending-logins.patch +++ b/patches/server/0007-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 48223b78dd7ea2f065a259ad071f101398f40cfd..30fae97d5fed9de036cc4131a09d404468c69dd4 100644 +index 2e96377d628b3a07fb565020074d665f594f32e8..75b1877f8c3e4da3183437f327ef3376fd0a3c21 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -85,7 +85,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, @@ -19,7 +19,7 @@ index 48223b78dd7ea2f065a259ad071f101398f40cfd..30fae97d5fed9de036cc4131a09d4044 } // Folia - region threading - remove delayed accept diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index e49e9cc31a9e05422fd1f48616c5a452011d66e1..132e1e055a8898beb4683dbec821b1f6e4dbf1a2 100644 +index 570eff7de267773cc3223b6722e44b388dcbd662..8c2520955fec5aeb2a49910db78d6678e5e4bff3 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -177,6 +177,17 @@ public abstract class PlayerList { diff --git a/patches/server/0008-Add-chunk-system-throughput-counters-to-tps.patch b/patches/server/0008-Add-chunk-system-throughput-counters-to-tps.patch index dcb0a81..08e0c9f 100644 --- a/patches/server/0008-Add-chunk-system-throughput-counters-to-tps.patch +++ b/patches/server/0008-Add-chunk-system-throughput-counters-to-tps.patch @@ -58,7 +58,7 @@ index 300700477ee34bc22b31315825c0e40f61070cd5..0b78d1eb90500e0123b7281d722805dc chunk = wrappedFull.getWrapped(); } else { diff --git a/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java b/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java -index b9e0568fb08e15444e4cfac09749fce7a93db825..84a2525115b4fc8d2e3c41e96b6351d446b05e33 100644 +index a3fb013ef00cb0e4069c8ef8a4044c1fa9e58602..77e3da348e3f9057909b1586d453625a77cc601b 100644 --- a/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java +++ b/src/main/java/io/papermc/paper/threadedregions/commands/CommandServerHealth.java @@ -148,6 +148,9 @@ public final class CommandServerHealth extends Command { diff --git a/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index c873f85..c653000 100644 --- a/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0009-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -51,7 +51,7 @@ index d9687722e02dfd4088c7030abbf5008eb0a092c8..62484ebf4550b05182f693a3180bbac5 TickThread.ensureTickThread(thisEntity, "May not tick entity scheduler asynchronously"); final List toRun; diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 030139f939fe870a163eb4e0e1a50798fde96094..f98ad04b4f2a9a586a82688181c3ca9553b2436d 100644 +index 006695237ddd0cc5f1910c307d4e8a696128807f..64ddd3415878b6a86a98d7718d5e3e5b7734eb8c 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -2767,6 +2767,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -87,7 +87,7 @@ index 030139f939fe870a163eb4e0e1a50798fde96094..f98ad04b4f2a9a586a82688181c3ca95 if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 5fa6b219b90bcf3f583eb64cf5eecf09bc56a406..45afdd01af2fdc819beab648227fdd500dc33c62 100644 +index 71663e4f16fb59c36c53badfd19c63702ba792f9..9902d216c8659acd128bb85e4624ad682e4de804 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -374,7 +374,7 @@ public final class CraftServer implements Server { @@ -2147,7 +2147,7 @@ index beea227855f0b978e655efc298024120df8f4945..e1b7922ed298b6b3068c3f5fbe3b4030 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 9ee05436a26c73f99bb5e0eae43831d7bd385975..559e1fa14dcb046dcc00422db4e3c3a818b6c348 100644 +index 867838df8a6144fd00e7cf01eb840ad836d6125b..10d69f6a4811908275dd56133747dfce8aa2a971 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -584,7 +584,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0010-Disable-mid-tick-task-execution.patch b/patches/server/0010-Disable-mid-tick-task-execution.patch index 8deceb6..d07253f 100644 --- a/patches/server/0010-Disable-mid-tick-task-execution.patch +++ b/patches/server/0010-Disable-mid-tick-task-execution.patch @@ -10,7 +10,7 @@ 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 6bf90c2a71d03788b6b15f858687372674dddc03..d9f6855ff7a70bf1e05e8cf93ed33c847c6c86e6 100644 +index 26350a185cadbb64696b2a1ac88b1a2be06fd587..61a7d2728c6f4b936dc8f1031950374f2c35cac7 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -2906,6 +2906,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop