diff --git a/leaf-server/minecraft-patches/features/0159-optimize-BlockEntityType-isValid.patch b/leaf-server/minecraft-patches/features/0158-optimize-BlockEntityType-isValid.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0159-optimize-BlockEntityType-isValid.patch rename to leaf-server/minecraft-patches/features/0158-optimize-BlockEntityType-isValid.patch diff --git a/leaf-server/paper-patches/features/0031-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/paper-patches/features/0031-SparklyPaper-Parallel-world-ticking.patch index 6b552bea..2defa582 100644 --- a/leaf-server/paper-patches/features/0031-SparklyPaper-Parallel-world-ticking.patch +++ b/leaf-server/paper-patches/features/0031-SparklyPaper-Parallel-world-ticking.patch @@ -238,24 +238,16 @@ 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 548fcd9646dee0c40b6ba9b3dafb9ca157dfe324..d7af94890bfccd6ff665d920cecfa1e5be626aa4 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; - class PaperEventManager { - - private final Server server; -+ private final org.purpurmc.purpur.util.MinecraftInternalPlugin minecraftInternalPlugin = new org.purpurmc.purpur.util.MinecraftInternalPlugin(); // Leaf - Parallel world ticking - - public PaperEventManager(Server server) { - this.server = server; -@@ -40,6 +41,12 @@ class PaperEventManager { +@@ -40,6 +40,12 @@ class PaperEventManager { if (listeners.length == 0) return; // Leaf end - Skip event if no listeners if (event.isAsynchronous() && this.server.isPrimaryThread()) { + // Leaf start - Parallel world ticking + if (org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.enabled && org.dreeam.leaf.config.modules.async.SparklyPaperParallelWorldTicking.runAsyncTasksSync) { -+ org.bukkit.Bukkit.getAsyncScheduler().runNow(minecraftInternalPlugin, task -> event.callEvent()); ++ org.dreeam.leaf.async.world.PWTEventScheduler.getScheduler().scheduleTask(event::callEvent); + return; + } + // Leaf end - Parallel world ticking @@ -349,7 +341,7 @@ 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 811823a1a7e24a19a7e37eb4c08efdfa19e839ed..b94efcab12d41fa8745e5bb55cfa6481d8262e74 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 { diff --git a/leaf-server/src/main/java/org/dreeam/leaf/async/world/PWTEventScheduler.java b/leaf-server/src/main/java/org/dreeam/leaf/async/world/PWTEventScheduler.java new file mode 100644 index 00000000..eef0d654 --- /dev/null +++ b/leaf-server/src/main/java/org/dreeam/leaf/async/world/PWTEventScheduler.java @@ -0,0 +1,35 @@ +package org.dreeam.leaf.async.world; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class PWTEventScheduler { + private static volatile PWTEventScheduler instance; + private final ExecutorService executor; + private PWTEventScheduler() { + this.executor = Executors.newCachedThreadPool( + new ThreadFactoryBuilder() + .setNameFormat("Leaf PWT Event Scheduler Thread - %d") + .setDaemon(true) + .setPriority(Thread.NORM_PRIORITY - 2) + .build() + ); + } + + public static PWTEventScheduler getScheduler() { + if (instance == null) { + synchronized (PWTEventScheduler.class) { + if (instance == null) { + instance = new PWTEventScheduler(); + } + } + } + return instance; + } + + public void scheduleTask(Runnable task) { + this.executor.execute(task); + } +}