diff --git a/leaf-archived-patches/unapplied/api/paper-patches/features/0017-Async-structure-locate-api.patch b/leaf-api/paper-patches/features/0017-Async-structure-locate-api.patch similarity index 100% rename from leaf-archived-patches/unapplied/api/paper-patches/features/0017-Async-structure-locate-api.patch rename to leaf-api/paper-patches/features/0017-Async-structure-locate-api.patch diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0013-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch b/leaf-server/paper-patches/features/0028-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch similarity index 95% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0013-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch rename to leaf-server/paper-patches/features/0028-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch index e7af2191..b0a82019 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0013-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch +++ b/leaf-server/paper-patches/features/0028-SparklyPaper-Skip-EntityScheduler-s-executeTick-chec.patch @@ -88,10 +88,10 @@ index c03608fec96b51e1867f43d8f42e5aefb1520e46..56268cf8d184e0b6cd46de8c2e893ad3 + // Leaf end - SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index cc024874fbde9678bdddfdca7c25080869d66de2..edcd209798740f31cb302f36d7864a0d8ea1d561 100644 +index 5aa8eab78e99408b0beb64d7ed07ff1bc61541db..0809ed41274be3dd18eb89aa96c442bc3995f1b7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -75,7 +75,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -80,7 +80,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { private final CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(CraftEntity.DATA_TYPE_REGISTRY); protected net.kyori.adventure.pointer.Pointers adventure$pointers; // Paper - implement pointers // Paper start - Folia shedulers @@ -100,11 +100,11 @@ index cc024874fbde9678bdddfdca7c25080869d66de2..edcd209798740f31cb302f36d7864a0d private final io.papermc.paper.threadedregions.scheduler.FoliaEntityScheduler apiScheduler = new io.papermc.paper.threadedregions.scheduler.FoliaEntityScheduler(this); @Override -@@ -88,6 +88,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -93,6 +93,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { this.server = server; this.entity = entity; this.entityType = CraftEntityType.minecraftToBukkit(entity.getType()); + this.taskScheduler = new io.papermc.paper.threadedregions.EntityScheduler(this.entity.getServer(), this); // SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run } - // Purpur start - Fire Immunity API + public static CraftEntity getEntity(CraftServer server, T entity) { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0014-SparklyPaper-Optimize-canSee-checks.patch b/leaf-server/paper-patches/features/0029-SparklyPaper-Optimize-canSee-checks.patch similarity index 94% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0014-SparklyPaper-Optimize-canSee-checks.patch rename to leaf-server/paper-patches/features/0029-SparklyPaper-Optimize-canSee-checks.patch index b33c2d01..4f633623 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0014-SparklyPaper-Optimize-canSee-checks.patch +++ b/leaf-server/paper-patches/features/0029-SparklyPaper-Optimize-canSee-checks.patch @@ -16,10 +16,10 @@ This seems stupid, but it does seem that it improves the performance a bit, and We also create a "canSee" method tailored for "ChunkMap#updatePlayer()", a method without the equals check (the "updatePlayer()" already checks if the entity is the same entity) because the CraftPlayer's `equals()` check is a *bit* expensive compared to only checking the object's identity, and because the identity has already been check, we don't need to check it twice. diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index abc762829bc0447936ab9e06eabcb42419578585..8ea9b654eb6098477d51ac24ff5be1a33e3055ae 100644 +index 905cea7470f7bb8dee27bbfc4d267d46c28fe21b..ff0ef4e148c85aff18094a139705de5034d99e20 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -210,7 +210,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -212,7 +212,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private boolean hasPlayedBefore = false; private final ConversationTracker conversationTracker = new ConversationTracker(); private final Set channels = new HashSet(); @@ -28,7 +28,7 @@ index abc762829bc0447936ab9e06eabcb42419578585..8ea9b654eb6098477d51ac24ff5be1a3 private final Set unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>(); private int hash = 0; -@@ -2286,9 +2286,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2266,9 +2266,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean canSee(org.bukkit.entity.Entity entity) { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0015-Including-5s-in-getTPS.patch b/leaf-server/paper-patches/features/0030-Including-5s-in-getTPS.patch similarity index 84% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0015-Including-5s-in-getTPS.patch rename to leaf-server/paper-patches/features/0030-Including-5s-in-getTPS.patch index 41236a04..e58ad51e 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0015-Including-5s-in-getTPS.patch +++ b/leaf-server/paper-patches/features/0030-Including-5s-in-getTPS.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Including 5s in getTPS() diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index f57e12a72cabe279a6a465f4397b44621a2d5cb0..01bfd366dd5e20464dd1bda0e05f80f8ae9c1687 100644 +index 704b5fd8c10cdc5363f59fbd878d9453926d91c3..540c84579ef57ec73bc5250ff889139ddcdf296b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -3180,6 +3180,8 @@ public final class CraftServer implements Server { +@@ -2987,6 +2987,8 @@ public final class CraftServer implements Server { @Override public double[] getTPS() { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0016-Don-t-throw-exception-on-missing-ResourceKey-value.patch b/leaf-server/paper-patches/features/0031-Don-t-throw-exception-on-missing-ResourceKey-value.patch similarity index 100% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0016-Don-t-throw-exception-on-missing-ResourceKey-value.patch rename to leaf-server/paper-patches/features/0031-Don-t-throw-exception-on-missing-ResourceKey-value.patch diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0017-Virtual-Thread-for-async-scheduler.patch b/leaf-server/paper-patches/features/0032-Virtual-Thread-for-async-scheduler.patch similarity index 100% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0017-Virtual-Thread-for-async-scheduler.patch rename to leaf-server/paper-patches/features/0032-Virtual-Thread-for-async-scheduler.patch diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0018-Mirai-Configurable-chat-message-signatures.patch b/leaf-server/paper-patches/features/0033-Mirai-Configurable-chat-message-signatures.patch similarity index 95% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0018-Mirai-Configurable-chat-message-signatures.patch rename to leaf-server/paper-patches/features/0033-Mirai-Configurable-chat-message-signatures.patch index b4ef014c..61b5476f 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0018-Mirai-Configurable-chat-message-signatures.patch +++ b/leaf-server/paper-patches/features/0033-Mirai-Configurable-chat-message-signatures.patch @@ -11,7 +11,7 @@ Original license: GPLv3 Original project: https://github.com/etil2jz/Mirai diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java -index 506c746980cfca170efd249d035a572361b667c4..5d8833dddc5145868fc2ac673b3387c83cbe6999 100644 +index 7cb9622b88d9ef1ae5cae00485bb9995c87e206f..aeccb214872d47e4730abb84e78100ffe98d55ff 100644 --- a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -317,7 +317,7 @@ public final class ChatProcessor { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0019-Matter-Secure-Seed.patch b/leaf-server/paper-patches/features/0034-Matter-Secure-Seed.patch similarity index 68% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0019-Matter-Secure-Seed.patch rename to leaf-server/paper-patches/features/0034-Matter-Secure-Seed.patch index 6eae85d5..298a0d3d 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0019-Matter-Secure-Seed.patch +++ b/leaf-server/paper-patches/features/0034-Matter-Secure-Seed.patch @@ -14,28 +14,30 @@ Co-authored-by: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java -index de8b9048c8395c05b8688bc9d984b8ad680f15b3..fab62216edd7181585fbf1e5cd9870e88d51e99b 100644 +index c855f1f6f70000b03594ce50553147d9821b796b..91f680bb9905319d9ce2b3fe2746bdb8e968aba9 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java -@@ -206,7 +206,12 @@ public class CraftChunk implements Chunk { +@@ -196,7 +196,14 @@ public class CraftChunk implements Chunk { @Override public boolean isSlimeChunk() { - // 987234911L is deterimined in EntitySlime when seeing if a slime can spawn in a chunk -- return this.worldServer.paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), worldServer.spigotConfig.slimeSeed).nextInt(10) == 0; // Paper + // 987234911L is taken from Slime when seeing if a slime can spawn in a chunk +- return this.level.paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), level.spigotConfig.slimeSeed).nextInt(10) == 0; // Paper + // Leaf start - Matter - Secure Seed -+ boolean isSlimeChunk = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled -+ ? worldServer.getChunk(this.getX(), this.getZ()).isSlimeChunk() -+ : WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), worldServer.spigotConfig.slimeSeed).nextInt(10) == 0; // Paper -+ return this.worldServer.paperConfig().entities.spawning.allChunksAreSlimeChunks || isSlimeChunk; ++ if (this.level.paperConfig().entities.spawning.allChunksAreSlimeChunks) { ++ return true; ++ } ++ return org.dreeam.leaf.config.modules.misc.SecureSeed.enabled ++ ? level.getChunk(this.getX(), this.getZ()).isSlimeChunk() ++ : WorldgenRandom.seedSlimeChunk(this.getX(), this.getZ(), this.getWorld().getSeed(), level.spigotConfig.slimeSeed).nextInt(10) == 0; // Paper; + // Leaf end - Matter - Secure Seed } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index ef0c0374261bc4d673e0b8150e268328125e3542..2f030eae4603f9a33fbc8d0e9b400479ab336e32 100644 +index 540c84579ef57ec73bc5250ff889139ddcdf296b..1c3382da80fa3e08b130d48c135c4100580b70f6 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1414,7 +1414,11 @@ public final class CraftServer implements Server { +@@ -1354,7 +1354,11 @@ public final class CraftServer implements Server { registryAccess = levelDataAndDimensions.dimensions().dimensionsRegistryAccess(); } else { LevelSettings levelSettings; diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0020-Faster-random-generator.patch b/leaf-server/paper-patches/features/0035-Faster-random-generator.patch similarity index 93% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0020-Faster-random-generator.patch rename to leaf-server/paper-patches/features/0035-Faster-random-generator.patch index 49383b0f..a931e051 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0020-Faster-random-generator.patch +++ b/leaf-server/paper-patches/features/0035-Faster-random-generator.patch @@ -14,7 +14,7 @@ ThreadUnsafeRandom (Moonrise): 102,265,100 ns SimpleThreadUnsafeRandom (Moonrise): 97,054,600 ns diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java -index c60c05b9e426f56ed3e812abb9aae9ef52bd20e8..268fd8e60630e835c750a8b67201cc63f0b5193d 100644 +index 73c51c66857f53128b737304205295b67e8444e8..348bf5ed91ded3537a86bc0708e0158ad4f9296d 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -97,7 +97,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0021-Configurable-unknown-command-message.patch b/leaf-server/paper-patches/features/0036-Configurable-unknown-command-message.patch similarity index 94% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0021-Configurable-unknown-command-message.patch rename to leaf-server/paper-patches/features/0036-Configurable-unknown-command-message.patch index ca7402c7..7ef1eaf7 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0021-Configurable-unknown-command-message.patch +++ b/leaf-server/paper-patches/features/0036-Configurable-unknown-command-message.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable unknown command message diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java -index e0d4222a99f22d7130d95cf29b034a98f2f3b76e..089dd39d428bd1e3773769f2a50cc2f3bc1b4311 100644 +index 7c585b71d06f438f414227c2625f27b6c323045e..de271fc2a9866d60ec760b9589faef260de1cb67 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -151,7 +151,6 @@ public class SpigotConfig { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0022-Replace-world-map-with-optimized-collection.patch b/leaf-server/paper-patches/features/0037-Replace-world-map-with-optimized-collection.patch similarity index 63% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0022-Replace-world-map-with-optimized-collection.patch rename to leaf-server/paper-patches/features/0037-Replace-world-map-with-optimized-collection.patch index 7b753545..805631b8 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0022-Replace-world-map-with-optimized-collection.patch +++ b/leaf-server/paper-patches/features/0037-Replace-world-map-with-optimized-collection.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Replace world map with optimized collection diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 2f030eae4603f9a33fbc8d0e9b400479ab336e32..116c842ef64835152a662476b6c33152360c1a4a 100644 +index 1c3382da80fa3e08b130d48c135c4100580b70f6..ffdea8befa77ec655b1df929715fcbdc60d6a966 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -285,7 +285,7 @@ public final class CraftServer implements Server { +@@ -281,7 +281,7 @@ public final class CraftServer implements Server { private final StructureManager structureManager; - protected final DedicatedServer console; - protected final DedicatedPlayerList playerList; -- private final Map worlds = new LinkedHashMap(); -+ private final Map worlds = new it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap(); // Leaf - Replace world map with optimized collection + final DedicatedServer console; + private final DedicatedPlayerList playerList; +- private final Map worlds = new LinkedHashMap<>(); ++ private final Map worlds = new it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap<>(); // Leaf - Replace world map with optimized collection private final it.unimi.dsi.fastutil.objects.Object2ObjectMap worldsByUUID = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(); // Gale - MultiPaper - CraftBukkit UUID to world map - // private final Map, Registry> registries = new HashMap<>(); // Paper - replace with RegistryAccess private YamlConfiguration configuration; + private YamlConfiguration commandsConfiguration; diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0023-Cache-CraftEntityType-minecraftToBukkit-convert.patch b/leaf-server/paper-patches/features/0038-Cache-CraftEntityType-minecraftToBukkit-convert.patch similarity index 100% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0023-Cache-CraftEntityType-minecraftToBukkit-convert.patch rename to leaf-server/paper-patches/features/0038-Cache-CraftEntityType-minecraftToBukkit-convert.patch diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0024-Multithreaded-Tracker.patch b/leaf-server/paper-patches/features/0039-Multithreaded-Tracker.patch similarity index 75% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0024-Multithreaded-Tracker.patch rename to leaf-server/paper-patches/features/0039-Multithreaded-Tracker.patch index d968d170..db93739e 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0024-Multithreaded-Tracker.patch +++ b/leaf-server/paper-patches/features/0039-Multithreaded-Tracker.patch @@ -24,7 +24,7 @@ But it is still recommending to use those packet based, virtual entity based NPC plugins, e.g. ZNPC Plus, Adyeshach, Fancy NPC, etc. diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java -index 379c2dc1853e45a96dda9b13bf28b7e08f65658a..361f4de9cdf0f7505628a2fed2a3f5366031e04b 100644 +index db031298c2090eb36032de4b52335c62186e4cfb..84905d7802f8a5c3f68e15f1b17ef08216ad1f4e 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java @@ -42,6 +42,12 @@ class PaperEventManager { @@ -39,35 +39,35 @@ index 379c2dc1853e45a96dda9b13bf28b7e08f65658a..361f4de9cdf0f7505628a2fed2a3f536 + // Leaf end - Multithreaded tracker throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously."); } - // Leaves start - skip photographer + diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index e52479f3c888268fd1febeb78e9965af834a8ae9..c2552c3706831f7012b5b449fa43c7d5990056a4 100644 +index 083cc48abea81560b34c30653e766d650a2d3850..7d22c1ee7fa98fc2d04d353fe19387ca3334f52a 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -1973,6 +1973,26 @@ public class CraftEventFactory { +@@ -1741,6 +1741,26 @@ public class CraftEventFactory { } - public static boolean handleBlockFormEvent(Level world, BlockPos pos, net.minecraft.world.level.block.state.BlockState block, int flag, @Nullable Entity entity) { + public static boolean handleBlockFormEvent(Level world, BlockPos pos, net.minecraft.world.level.block.state.BlockState state, int flags, @Nullable Entity entity, boolean checkSetResult) { + // Leaf start - Multithreaded tracker + if (org.dreeam.leaf.config.modules.async.MultithreadedTracker.enabled && Thread.currentThread() instanceof org.dreeam.leaf.async.tracker.MultithreadedTracker.MultithreadedTrackerThread) { + java.util.concurrent.CompletableFuture future = new java.util.concurrent.CompletableFuture<>(); + net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> { -+ CraftBlockState blockState = CraftBlockStates.getBlockState(world, pos, flag); -+ blockState.setData(block); ++ boolean resultFlag = false; ++ CraftBlockState snapshot = CraftBlockStates.getBlockState(world, pos); ++ snapshot.setData(state); + -+ BlockFormEvent event = (entity == null) ? new BlockFormEvent(blockState.getBlock(), blockState) : new EntityBlockFormEvent(entity.getBukkitEntity(), blockState.getBlock(), blockState); -+ world.getCraftServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ blockState.update(true); ++ BlockFormEvent event = (entity == null) ? new BlockFormEvent(snapshot.getBlock(), snapshot) : new EntityBlockFormEvent(entity.getBukkitEntity(), snapshot.getBlock(), snapshot); ++ if (event.callEvent()) { ++ boolean result = snapshot.place(flags); ++ resultFlag = !checkSetResult || result; + } + -+ future.complete(!event.isCancelled()); ++ future.complete(resultFlag); + }); + + return future.join(); + } + // Leaf end - Multithreaded tracker - CraftBlockState blockState = CraftBlockStates.getBlockState(world, pos, flag); - blockState.setData(block); + CraftBlockState snapshot = CraftBlockStates.getBlockState(world, pos); + snapshot.setData(state); diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0025-Asynchronous-locator.patch b/leaf-server/paper-patches/features/0040-Asynchronous-locator.patch similarity index 93% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0025-Asynchronous-locator.patch rename to leaf-server/paper-patches/features/0040-Asynchronous-locator.patch index cd3b7ec8..4418c7a9 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0025-Asynchronous-locator.patch +++ b/leaf-server/paper-patches/features/0040-Asynchronous-locator.patch @@ -24,7 +24,7 @@ index 69cdd304d255d52c9b7dc9b6a33ffdb630b79abe..a4aa2615823d77920ff55b8aa0bcc27a this(group, run, name, ID_GENERATOR.incrementAndGet()); } diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java -index 361f4de9cdf0f7505628a2fed2a3f5366031e04b..548fcd9646dee0c40b6ba9b3dafb9ca157dfe324 100644 +index 84905d7802f8a5c3f68e15f1b17ef08216ad1f4e..196fddeab452e7bc89ef6758635e1d07074e7416 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java @@ -48,6 +48,12 @@ class PaperEventManager { @@ -39,4 +39,4 @@ index 361f4de9cdf0f7505628a2fed2a3f5366031e04b..548fcd9646dee0c40b6ba9b3dafb9ca1 + // Leaf end - Asynchronous locator throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously."); } - // Leaves start - skip photographer + diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0026-EMC-Don-t-use-snapshots-for-acquiring-blockstate.patch b/leaf-server/paper-patches/features/0041-EMC-Don-t-use-snapshots-for-acquiring-blockstate.patch similarity index 66% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0026-EMC-Don-t-use-snapshots-for-acquiring-blockstate.patch rename to leaf-server/paper-patches/features/0041-EMC-Don-t-use-snapshots-for-acquiring-blockstate.patch index 4aee5897..f1aa8c4c 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0026-EMC-Don-t-use-snapshots-for-acquiring-blockstate.patch +++ b/leaf-server/paper-patches/features/0041-EMC-Don-t-use-snapshots-for-acquiring-blockstate.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/starlis/empirecraft diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -index 5cb69d0b822e11a99a96aef4f59986d083b079f4..973b297a22c0cc53f966582c67c3688f4b2205c7 100644 +index 4a709355acab59c5ded1ffdc321be3252482bd0b..c8f0b24fd9336259e42c4746061793e156978ad3 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -@@ -331,7 +331,7 @@ public class CraftBlock implements Block { +@@ -333,7 +333,7 @@ public class CraftBlock implements Block { @Override public BlockState getState() { @@ -19,16 +19,16 @@ index 5cb69d0b822e11a99a96aef4f59986d083b079f4..973b297a22c0cc53f966582c67c3688f } // Paper start -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -index 56453454cbd4b9e9270fc833f8ab38d5fa7a3763..55572e799b5c8a74a546ac8febc14f80d5731c52 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -@@ -238,7 +238,7 @@ public final class CraftBlockStates { +diff --git a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java +index 5da891112402b758ca618967c4662027efbe14dc..23d0c901c1261de30748654b34a7ce6c51ad9c24 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java +@@ -186,7 +186,7 @@ public final class CraftBlockStates { + } public static BlockState getBlockState(Block block) { - // Paper start - return CraftBlockStates.getBlockState(block, true); + return CraftBlockStates.getBlockState(block, org.dreeam.leaf.config.modules.opt.TileEntitySnapshotCreation.enabled); // Leaf - EMC - Don't use snapshots for acquiring blockstate } + public static BlockState getBlockState(Block block, boolean useSnapshot) { - // Paper end diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0027-Faster-CraftServer-getworlds-list-creation.patch b/leaf-server/paper-patches/features/0042-Faster-CraftServer-getworlds-list-creation.patch similarity index 85% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0027-Faster-CraftServer-getworlds-list-creation.patch rename to leaf-server/paper-patches/features/0042-Faster-CraftServer-getworlds-list-creation.patch index c9e72749..ad273042 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0027-Faster-CraftServer-getworlds-list-creation.patch +++ b/leaf-server/paper-patches/features/0042-Faster-CraftServer-getworlds-list-creation.patch @@ -8,10 +8,10 @@ replacing ArrayList with Fastutil ObjectArrayList brings about 40% performance improvement in benchmark. diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 116c842ef64835152a662476b6c33152360c1a4a..fcedf7af3fff97821cbb7ee2e0fef070659deb5a 100644 +index ffdea8befa77ec655b1df929715fcbdc60d6a966..028a30ae3c9dd411e70b1bc8ac42067c06d0335f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -993,7 +993,7 @@ public final class CraftServer implements Server { +@@ -954,7 +954,7 @@ public final class CraftServer implements Server { @Override public List getWorlds() { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0028-Cache-chunk-key.patch b/leaf-server/paper-patches/features/0043-Cache-chunk-key.patch similarity index 100% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0028-Cache-chunk-key.patch rename to leaf-server/paper-patches/features/0043-Cache-chunk-key.patch diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0029-Async-structure-locate-api.patch b/leaf-server/paper-patches/features/0044-Async-structure-locate-api.patch similarity index 95% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0029-Async-structure-locate-api.patch rename to leaf-server/paper-patches/features/0044-Async-structure-locate-api.patch index fa396fc3..3643f15f 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0029-Async-structure-locate-api.patch +++ b/leaf-server/paper-patches/features/0044-Async-structure-locate-api.patch @@ -9,10 +9,10 @@ Added some asynchronous structure locate methods in World, requires async-locator to be enabled in Leaf config, or else it will fall back to sync methods. diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index ca60f91ef012c94174a0803eb77699ba9ecff5e1..15673166e566b2a6d5093210d99b154e69fab0ad 100644 +index a76797c08cb5912d0525fa21217d45b61b110259..2538a0de7fd6b1026fff51e5d066c5b0811b7cda 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2271,6 +2271,45 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2272,6 +2272,45 @@ public class CraftWorld extends CraftRegionAccessor implements World { return new CraftStructureSearchResult(CraftStructure.minecraftToBukkit(found.getSecond().value()), CraftLocation.toBukkit(found.getFirst(), this)); } diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0030-PlayerInventoryOverflowEvent.patch b/leaf-server/paper-patches/features/0045-PlayerInventoryOverflowEvent.patch similarity index 92% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0030-PlayerInventoryOverflowEvent.patch rename to leaf-server/paper-patches/features/0045-PlayerInventoryOverflowEvent.patch index 7fdd280d..4b9b20c2 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0030-PlayerInventoryOverflowEvent.patch +++ b/leaf-server/paper-patches/features/0045-PlayerInventoryOverflowEvent.patch @@ -5,7 +5,7 @@ Subject: [PATCH] PlayerInventoryOverflowEvent diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java -index 8b4f8a475faafe3b8a479160888145c4aa603a27..e97bb84d976229ba0d386efbade71be7347d0a1a 100644 +index f850e6cea92edc87ed54cf54488b5ebb606913ed..b5af3cc6865408ffef40f4868970cff947834afc 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java @@ -340,6 +340,15 @@ public class CraftInventory implements Inventory { diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0031-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/paper-patches/features/0046-SparklyPaper-Parallel-world-ticking.patch similarity index 86% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0031-SparklyPaper-Parallel-world-ticking.patch rename to leaf-server/paper-patches/features/0046-SparklyPaper-Parallel-world-ticking.patch index 6b552bea..ff38f358 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0031-SparklyPaper-Parallel-world-ticking.patch +++ b/leaf-server/paper-patches/features/0046-SparklyPaper-Parallel-world-ticking.patch @@ -238,7 +238,7 @@ index a4aa2615823d77920ff55b8aa0bcc27a54b8c3e1..2fb65ce228da94eb7d9364ee0f945823 + // SparklyPaper end - parallel world ticking } diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java -index 548fcd9646dee0c40b6ba9b3dafb9ca157dfe324..67f69ea3c28578cb73d2df662d246f0056ff2cb2 100644 +index 196fddeab452e7bc89ef6758635e1d07074e7416..55a2ffa0fff6ef66b9bd5069300c09e9e3535c0d 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java @@ -28,6 +28,7 @@ import java.util.logging.Level; @@ -263,10 +263,10 @@ index 548fcd9646dee0c40b6ba9b3dafb9ca157dfe324..67f69ea3c28578cb73d2df662d246f00 } else if (!event.isAsynchronous() && !this.server.isPrimaryThread() && !this.server.isStopping()) { // Leaf start - Multithreaded tracker diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9f7a6085a 100644 +index 2538a0de7fd6b1026fff51e5d066c5b0811b7cda..c114dfd419177cf45f02617acde86ea4abcbdc96 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -455,7 +455,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -456,7 +456,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { } private boolean unloadChunk0(int x, int z, boolean save) { @@ -280,7 +280,7 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 if (!this.isChunkLoaded(x, z)) { return true; } -@@ -472,6 +477,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -473,6 +478,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean refreshChunk(int x, int z) { @@ -289,7 +289,7 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 ChunkHolder playerChunk = this.world.getChunkSource().chunkMap.getVisibleChunkIfPresent(ChunkPos.asLong(x, z)); if (playerChunk == null) return false; -@@ -522,7 +529,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -523,7 +530,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean loadChunk(int x, int z, boolean generate) { @@ -303,7 +303,7 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 warnUnsafeChunk("loading a faraway chunk", x, z); // Paper ChunkAccess chunk = this.world.getChunkSource().getChunk(x, z, generate || isChunkGenerated(x, z) ? ChunkStatus.FULL : ChunkStatus.EMPTY, true); // Paper -@@ -750,6 +762,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -751,6 +763,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -312,7 +312,7 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 this.world.captureTreeGeneration = true; this.world.captureBlockStates = true; boolean grownTree = this.generateTree(loc, type); -@@ -865,6 +879,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -866,6 +880,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { } public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source, Consumer configurator) { // Paper end - expand explosion API @@ -321,7 +321,7 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 net.minecraft.world.level.Level.ExplosionInteraction explosionType; if (!breakBlocks) { explosionType = net.minecraft.world.level.Level.ExplosionInteraction.NONE; // Don't break blocks -@@ -956,6 +972,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -957,6 +973,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getHighestBlockYAt(int x, int z, org.bukkit.HeightMap heightMap) { @@ -330,7 +330,7 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 warnUnsafeChunk("getting a faraway chunk", x >> 4, z >> 4); // Paper // Transient load for this tick return this.world.getChunk(x >> 4, z >> 4).getHeight(CraftHeightMap.toNMS(heightMap), x, z); -@@ -986,6 +1004,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -987,6 +1005,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setBiome(int x, int y, int z, Holder bb) { BlockPos pos = new BlockPos(x, 0, z); @@ -339,7 +339,7 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 if (this.world.hasChunkAt(pos)) { net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkAt(pos); -@@ -2328,6 +2348,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2329,6 +2349,8 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void sendGameEvent(Entity sourceEntity, org.bukkit.GameEvent gameEvent, Vector position) { @@ -349,10 +349,10 @@ index af33cab59932f4ec135caf94dc5828930833daf6..92463ddc6fdcf542ce4a6d2a5059d4a9 } // Paper end diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd31557768217 100644 +index c8f0b24fd9336259e42c4746061793e156978ad3..2b2d1819b0d953800c1757ad7c92de4f781efa0d 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java -@@ -75,6 +75,11 @@ public class CraftBlock implements Block { +@@ -76,6 +76,11 @@ public class CraftBlock implements Block { } public net.minecraft.world.level.block.state.BlockState getNMS() { @@ -364,32 +364,31 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 return this.world.getBlockState(this.position); } -@@ -157,6 +162,11 @@ public class CraftBlock implements Block { +@@ -156,6 +161,11 @@ public class CraftBlock implements Block { } - private void setData(final byte data, int flag) { + private void setData(final byte data, int flags) { + // SparklyPaper start - parallel world ticking + if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled && world instanceof ServerLevel serverWorld) { // Leaf - SparklyPaper - parallel world ticking mod (make configurable) + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, position, "Cannot modify world asynchronously"); + } + // SparklyPaper end - parallel world ticking - this.world.setBlock(this.position, CraftMagicNumbers.getBlock(this.getType(), data), flag); + this.world.setBlock(this.position, CraftMagicNumbers.getBlock(this.getType(), data), flags); } -@@ -198,6 +208,12 @@ public class CraftBlock implements Block { +@@ -197,6 +207,11 @@ public class CraftBlock implements Block { } - public static boolean setTypeAndData(LevelAccessor world, BlockPos position, net.minecraft.world.level.block.state.BlockState old, net.minecraft.world.level.block.state.BlockState blockData, boolean applyPhysics) { + public static boolean setBlockState(LevelAccessor world, BlockPos pos, net.minecraft.world.level.block.state.BlockState oldState, net.minecraft.world.level.block.state.BlockState newState, boolean applyPhysics) { + // SparklyPaper start - parallel world ticking + if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled && world instanceof ServerLevel serverWorld) { // Leaf - SparklyPaper - parallel world ticking mod (make configurable) + ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread(serverWorld, position, "Cannot modify world asynchronously"); + } + // SparklyPaper end - parallel world ticking -+ - // SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in tile entity cleanup - if (old.hasBlockEntity() && blockData.getBlock() != old.getBlock()) { // SPIGOT-3725 remove old tile entity if block changes + // SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in block entity cleanup + if (oldState.hasBlockEntity() && newState.getBlock() != oldState.getBlock()) { // SPIGOT-3725 remove old block entity if block changes // SPIGOT-4612: faster - just clear tile -@@ -343,18 +359,33 @@ public class CraftBlock implements Block { +@@ -345,18 +360,33 @@ public class CraftBlock implements Block { @Override public Biome getBiome() { @@ -423,7 +422,7 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 this.getWorld().setBiome(this.getX(), this.getY(), this.getZ(), bio); } -@@ -375,6 +406,11 @@ public class CraftBlock implements Block { +@@ -377,6 +407,11 @@ public class CraftBlock implements Block { @Override public boolean isBlockIndirectlyPowered() { @@ -435,7 +434,7 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 return this.world.getMinecraftWorld().hasNeighborSignal(this.position); } -@@ -414,6 +450,11 @@ public class CraftBlock implements Block { +@@ -416,6 +451,11 @@ public class CraftBlock implements Block { @Override public int getBlockPower(BlockFace face) { @@ -447,7 +446,7 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 int power = 0; net.minecraft.world.level.Level world = this.world.getMinecraftWorld(); int x = this.getX(); -@@ -484,6 +525,11 @@ public class CraftBlock implements Block { +@@ -484,6 +524,11 @@ public class CraftBlock implements Block { @Override public boolean breakNaturally() { @@ -459,7 +458,7 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 return this.breakNaturally(null); } -@@ -543,6 +589,11 @@ public class CraftBlock implements Block { +@@ -543,6 +588,11 @@ public class CraftBlock implements Block { @Override public boolean applyBoneMeal(BlockFace face) { @@ -471,18 +470,18 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 Direction direction = CraftBlock.blockFaceToNotch(face); BlockFertilizeEvent event = null; ServerLevel world = this.getCraftWorld().getHandle(); -@@ -554,8 +605,8 @@ public class CraftBlock implements Block { +@@ -554,8 +604,8 @@ public class CraftBlock implements Block { world.captureTreeGeneration = false; - if (world.capturedBlockStates.size() > 0) { + if (!world.capturedBlockStates.isEmpty()) { - TreeType treeType = SaplingBlock.treeType; - SaplingBlock.treeType = null; + TreeType treeType = SaplingBlock.getTreeTypeRT(); // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) + SaplingBlock.setTreeTypeRT(null); // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) - List blocks = new ArrayList<>(world.capturedBlockStates.values()); + List states = new ArrayList<>(world.capturedBlockStates.values()); world.capturedBlockStates.clear(); StructureGrowEvent structureEvent = null; -@@ -644,6 +695,11 @@ public class CraftBlock implements Block { +@@ -645,6 +695,11 @@ public class CraftBlock implements Block { @Override public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode) { @@ -494,7 +493,7 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 Preconditions.checkArgument(start != null, "Location start cannot be null"); Preconditions.checkArgument(this.getWorld().equals(start.getWorld()), "Location start cannot be a different world"); start.checkFinite(); -@@ -685,6 +741,11 @@ public class CraftBlock implements Block { +@@ -686,6 +741,11 @@ public class CraftBlock implements Block { @Override public boolean canPlace(BlockData data) { @@ -506,7 +505,7 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 Preconditions.checkArgument(data != null, "BlockData cannot be null"); net.minecraft.world.level.block.state.BlockState iblockdata = ((CraftBlockData) data).getState(); net.minecraft.world.level.Level world = this.world.getMinecraftWorld(); -@@ -719,6 +780,11 @@ public class CraftBlock implements Block { +@@ -720,6 +780,11 @@ public class CraftBlock implements Block { @Override public void tick() { @@ -518,10 +517,10 @@ index 973b297a22c0cc53f966582c67c3688f4b2205c7..61f9e88a7760b4bf23674ac8594dd315 final ServerLevel level = this.world.getMinecraftWorld(); this.getNMS().tick(level, this.position, level.random); } -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java -index 768d3f93da2522d467183654260a8bd8653588b1..5cef786fa2e5dfd3e7b79918bc73af02891b0bea 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +diff --git a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockEntityState.java +index 7d3a4669ccd6fbfaf8716dc19c538c6ba17a5ffe..72311b765908e0f155d2b8fb7a066fe893d8ae73 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockEntityState.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockEntityState.java @@ -26,6 +26,27 @@ public abstract class CraftBlockEntityState extends Craft private final T snapshot; public boolean snapshotDisabled; // Paper @@ -548,24 +547,13 @@ index 768d3f93da2522d467183654260a8bd8653588b1..5cef786fa2e5dfd3e7b79918bc73af02 + } + // Leaf end - SparklyPaper - parallel world ticking mod - public CraftBlockEntityState(World world, T tileEntity) { - super(world, tileEntity.getBlockPos(), tileEntity.getBlockState()); -@@ -34,8 +55,8 @@ public abstract class CraftBlockEntityState extends Craft - - try { // Paper - Show blockstate location if we failed to read it - // Paper start -- this.snapshotDisabled = DISABLE_SNAPSHOT; -- if (DISABLE_SNAPSHOT) { -+ this.snapshotDisabled = getDisableSnapshotTL(); // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) -+ if (this.snapshotDisabled) { // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) - this.snapshot = this.tileEntity; - } else { - this.snapshot = this.createSnapshot(tileEntity); -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -index fa63a6cfcfcc4eee4503a82d85333c139c8c8b2b..d106f65e4b745242484a195958fc559268a7dee0 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -@@ -215,6 +215,12 @@ public class CraftBlockState implements BlockState { + public CraftBlockEntityState(World world, T blockEntity) { + super(world, blockEntity.getBlockPos(), blockEntity.getBlockState()); +diff --git a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockState.java +index 647c1edd3338ce4f80e48ea769ed381cd158758d..07cf2e9412da5d307a7ca5edc202f8286e5ae25a 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockState.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockState.java +@@ -219,6 +219,12 @@ public class CraftBlockState implements BlockState { LevelAccessor access = this.getWorldHandle(); CraftBlock block = this.getBlock(); @@ -578,7 +566,7 @@ index fa63a6cfcfcc4eee4503a82d85333c139c8c8b2b..d106f65e4b745242484a195958fc5592 if (block.getType() != this.getType()) { if (!force) { return false; -@@ -350,6 +356,8 @@ public class CraftBlockState implements BlockState { +@@ -367,6 +373,8 @@ public class CraftBlockState implements BlockState { @Override public java.util.Collection getDrops(org.bukkit.inventory.ItemStack item, org.bukkit.entity.Entity entity) { @@ -587,38 +575,36 @@ index fa63a6cfcfcc4eee4503a82d85333c139c8c8b2b..d106f65e4b745242484a195958fc5592 this.requirePlaced(); net.minecraft.world.item.ItemStack nms = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(item); -diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -index 55572e799b5c8a74a546ac8febc14f80d5731c52..08a06c23c831a4de45b3e537228b837911019da8 100644 ---- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -@@ -249,8 +249,8 @@ public final class CraftBlockStates { - net.minecraft.world.level.block.state.BlockState blockData = craftBlock.getNMS(); - BlockEntity tileEntity = craftBlock.getHandle().getBlockEntity(blockPosition); - // Paper start - block state snapshots +diff --git a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java +index 23d0c901c1261de30748654b34a7ce6c51ad9c24..ca5edb79379ee74cb66e6eb7f63fe725a689170a 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/state/CraftBlockStates.java +@@ -196,14 +196,14 @@ public final class CraftBlockStates { + BlockPos pos = craftBlock.getPosition(); + net.minecraft.world.level.block.state.BlockState state = craftBlock.getNMS(); + BlockEntity blockEntity = craftBlock.getHandle().getBlockEntity(pos); - boolean prev = CraftBlockEntityState.DISABLE_SNAPSHOT; - CraftBlockEntityState.DISABLE_SNAPSHOT = !useSnapshot; + boolean prev = CraftBlockEntityState.getDisableSnapshotTL(); // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) + CraftBlockEntityState.setDisableSnapshotTL(!useSnapshot); // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) try { - // Paper end - CraftBlockState blockState = CraftBlockStates.getBlockState(world, blockPosition, blockData, tileEntity); -@@ -258,7 +258,7 @@ public final class CraftBlockStates { - return blockState; - // Paper start + CraftBlockState blockState = CraftBlockStates.getBlockState(world, pos, state, blockEntity); + blockState.setWorldHandle(craftBlock.getHandle()); // Inject the block's generator access + return blockState; } finally { - CraftBlockEntityState.DISABLE_SNAPSHOT = prev; + CraftBlockEntityState.setDisableSnapshotTL(prev); // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) } - // Paper end - } -diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index c2552c3706831f7012b5b449fa43c7d5990056a4..4e8a1d01a6c0afef92ae56cc4909af06d63e5268 100644 ---- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -961,6 +961,28 @@ public class CraftEventFactory { } - public static BlockPos sourceBlockOverride = null; // SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPosition up to five methods deep. +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index 7d22c1ee7fa98fc2d04d353fe19387ca3334f52a..cfe328104a57410204504721f1d8840f4819344b 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -809,6 +809,28 @@ public class CraftEventFactory { + } + + public static BlockPos sourceBlockOverride = null; // SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPos up to five methods deep. + public static final ThreadLocal sourceBlockOverrideRT = new ThreadLocal<>(); // SparklyPaper - parallel world ticking (this is from Folia, fixes concurrency bugs with sculk catalysts) + + // Leaf start - SparklyPaper - parallel world ticking mod @@ -642,29 +628,20 @@ index c2552c3706831f7012b5b449fa43c7d5990056a4..4e8a1d01a6c0afef92ae56cc4909af06 + } + // Leaf end - SparklyPaper - parallel world ticking mod - public static boolean handleBlockSpreadEvent(LevelAccessor world, BlockPos source, BlockPos target, net.minecraft.world.level.block.state.BlockState block, int flag) { - // Suppress during worldgen -@@ -972,7 +994,10 @@ public class CraftEventFactory { - CraftBlockState state = CraftBlockStates.getBlockState(world, target, flag); - state.setData(block); + public static boolean handleBlockSpreadEvent(LevelAccessor world, BlockPos source, BlockPos target, net.minecraft.world.level.block.state.BlockState state, int flags) { + return handleBlockSpreadEvent(world, source, target, state, flags, false); +@@ -824,7 +846,10 @@ public class CraftEventFactory { + CraftBlockState snapshot = CraftBlockStates.getBlockState(world, target); + snapshot.setData(state); -- BlockSpreadEvent event = new BlockSpreadEvent(state.getBlock(), CraftBlock.at(world, CraftEventFactory.sourceBlockOverride != null ? CraftEventFactory.sourceBlockOverride : source), state); +- BlockSpreadEvent event = new BlockSpreadEvent(snapshot.getBlock(), CraftBlock.at(world, CraftEventFactory.sourceBlockOverride != null ? CraftEventFactory.sourceBlockOverride : source), snapshot); + // Leaf start - SparklyPaper parallel world ticking mod (collapse original behavior) + final BlockPos sourceBlockOverrideRTSnap = getSourceBlockOverrideRT(); -+ BlockSpreadEvent event = new BlockSpreadEvent(state.getBlock(), CraftBlock.at(world, sourceBlockOverrideRTSnap != null ? sourceBlockOverrideRTSnap : source), state); // SparklyPaper - parallel world ticking ++ BlockSpreadEvent event = new BlockSpreadEvent(snapshot.getBlock(), CraftBlock.at(world, sourceBlockOverrideRTSnap != null ? sourceBlockOverrideRTSnap : source), snapshot); // SparklyPaper - parallel world ticking + // Leaf end - SparklyPaper parallel world ticking mod (collapse original behavior) - Bukkit.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { -@@ -2265,7 +2290,7 @@ public class CraftEventFactory { - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemStack.copyWithCount(1)); - - org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(bukkitBlock, craftItem.clone(), CraftVector.toBukkit(to)); -- if (!net.minecraft.world.level.block.DispenserBlock.eventFired) { -+ if (!net.minecraft.world.level.block.DispenserBlock.getEventFiredTL()) { // SparklyPaper - parallel world ticking // Leaf - SparklyPaper - parallel world ticking mod (collapse original behavior) - if (!event.callEvent()) { - return itemStack; - } + if (event.callEvent()) { + boolean result = snapshot.place(flags); + return !checkSetResult || result; diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncTask.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncTask.java index e4e2e42d0ca25df7fe9f2dd4275610e45fcb2c84..e7c6b2ab5f2c68f3319ccd52785c8d3488a2eef7 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncTask.java diff --git a/leaf-archived-patches/unapplied/server/paper-patches/features/0032-Paper-PR-Throttle-failed-spawn-attempts.patch b/leaf-server/paper-patches/features/0047-Paper-PR-Throttle-failed-spawn-attempts.patch similarity index 94% rename from leaf-archived-patches/unapplied/server/paper-patches/features/0032-Paper-PR-Throttle-failed-spawn-attempts.patch rename to leaf-server/paper-patches/features/0047-Paper-PR-Throttle-failed-spawn-attempts.patch index 94c9aad5..45286aed 100644 --- a/leaf-archived-patches/unapplied/server/paper-patches/features/0032-Paper-PR-Throttle-failed-spawn-attempts.patch +++ b/leaf-server/paper-patches/features/0047-Paper-PR-Throttle-failed-spawn-attempts.patch @@ -31,10 +31,10 @@ vain. Throttling spawn attempts in suspected spawnproof chunks improves performance without noticeably advantaging or disadvantaging the mob farm. diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -index 7bfa7aa30c1181587c7632f920f48348d2493ea4..d838c90f98c6593404c77d0aab8655c0d15905c4 100644 +index 9511f978f6c7da506f67928f5a5a92ecf28e5930..6c298304f842612d0e063b578f274eed04b32960 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -@@ -181,6 +181,17 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -182,6 +182,17 @@ public class WorldConfiguration extends ConfigurationPart { @MergeMap public Reference2IntMap ticksPerSpawn = Util.make(new Reference2IntOpenHashMap<>(NaturalSpawner.SPAWNING_CATEGORIES.length), map -> Arrays.stream(NaturalSpawner.SPAWNING_CATEGORIES).forEach(mobCategory -> map.put(mobCategory, -1)));