From cdcd9293c3e53ee651b2ed7f96acf3e4098c744b Mon Sep 17 00:00:00 2001 From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> Date: Sat, 1 Mar 2025 23:11:14 +0300 Subject: [PATCH] fix multithreaded tracker --- .../features/0003-Delete-timings.patch | 8 +-- .../features/0011-Multithreaded-Tracker.patch | 54 +++++++++++++++++++ .../manager/PaperEventManager.java.patch | 8 +-- 3 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 divinemc-server/paper-patches/features/0011-Multithreaded-Tracker.patch diff --git a/divinemc-server/paper-patches/features/0003-Delete-timings.patch b/divinemc-server/paper-patches/features/0003-Delete-timings.patch index eb2dbc2..a9d16f9 100644 --- a/divinemc-server/paper-patches/features/0003-Delete-timings.patch +++ b/divinemc-server/paper-patches/features/0003-Delete-timings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Delete timings 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 14949b9b0a14e4b6f38bf04a6246f181db2a7b3f..534510a94694d013fc11f6985088c6cf14dbb695 100644 +index e989053b703fddfbffc3e4ed9381594aaaa0df41..d7398b1ecf2660c29fb7d106b48fe02d3736603e 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java @@ -1,6 +1,5 @@ @@ -15,7 +15,7 @@ index 14949b9b0a14e4b6f38bf04a6246f181db2a7b3f..534510a94694d013fc11f6985088c6cf import com.destroystokyo.paper.event.server.ServerExceptionEvent; import com.destroystokyo.paper.exception.ServerEventException; import com.google.common.collect.Sets; -@@ -102,7 +101,6 @@ class PaperEventManager { +@@ -96,7 +95,6 @@ class PaperEventManager { throw new IllegalPluginAccessException("Plugin attempted to register " + event + " while not enabled"); } @@ -23,7 +23,7 @@ index 14949b9b0a14e4b6f38bf04a6246f181db2a7b3f..534510a94694d013fc11f6985088c6cf this.getEventListeners(event).register(new RegisteredListener(listener, executor, priority, plugin, ignoreCancelled)); } -@@ -189,7 +187,7 @@ class PaperEventManager { +@@ -183,7 +181,7 @@ class PaperEventManager { } } @@ -46,7 +46,7 @@ index 097500a59336db1bbfffcd1aa4cff7a8586e46ec..69341cb3b11409e41b9ff756b11d9bd1 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index c3c6e23b4da16025d0f6472290183732f5eb9880..652acceb96843e8242a0989518dec5c65fbcf953 100644 +index 037ca6ea2edb3c4ff9bf9f7856360cd2c19b7628..d38061eb738a17368e08750c9297894778b27c84 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -1048,10 +1048,8 @@ public final class CraftServer implements Server { diff --git a/divinemc-server/paper-patches/features/0011-Multithreaded-Tracker.patch b/divinemc-server/paper-patches/features/0011-Multithreaded-Tracker.patch new file mode 100644 index 0000000..48aa229 --- /dev/null +++ b/divinemc-server/paper-patches/features/0011-Multithreaded-Tracker.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> +Date: Sat, 1 Mar 2025 23:06:52 +0300 +Subject: [PATCH] Multithreaded Tracker + + +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 d7398b1ecf2660c29fb7d106b48fe02d3736603e..a9ec83b5bcb329bf3d2f3fb0e502685a37f9dcbc 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 { + if (event.isAsynchronous() && this.server.isPrimaryThread()) { + throw new IllegalStateException(event.getEventName() + " may only be triggered asynchronously."); + } else if (!event.isAsynchronous() && !this.server.isPrimaryThread() && !this.server.isStopping()) { ++ // DivineMC start - Multithreaded Tracker ++ if (org.bxteam.divinemc.DivineConfig.multithreadedEnabled) { ++ net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(event::callEvent); ++ return; ++ } ++ // DivineMC end - Multithreaded Tracker + throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously."); + } + +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index 69c44017e7ca2861200c83a16fa9dacaa822d505..2690de512d0d8be1ae31879c113255742b9af4c1 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -1970,6 +1970,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) { ++ // DivineMC start - Multithreaded Tracker ++ if (org.bxteam.divinemc.DivineConfig.multithreadedEnabled && Thread.currentThread() instanceof org.bxteam.divinemc.entity.tracking.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); ++ ++ 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); ++ } ++ ++ future.complete(!event.isCancelled()); ++ }); ++ ++ return future.join(); ++ } ++ // DivineMC end - Multithreaded Tracker + CraftBlockState blockState = CraftBlockStates.getBlockState(world, pos, flag); + blockState.setData(block); + diff --git a/divinemc-server/paper-patches/files/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java.patch b/divinemc-server/paper-patches/files/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java.patch index a2caa3a..9138b72 100644 --- a/divinemc-server/paper-patches/files/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java.patch +++ b/divinemc-server/paper-patches/files/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java.patch @@ -1,6 +1,6 @@ --- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java -@@ -36,14 +_,21 @@ +@@ -36,14 +_,15 @@ // SimplePluginManager public void callEvent(@NotNull Event event) { @@ -11,12 +11,6 @@ if (event.isAsynchronous() && this.server.isPrimaryThread()) { throw new IllegalStateException(event.getEventName() + " may only be triggered asynchronously."); } else if (!event.isAsynchronous() && !this.server.isPrimaryThread() && !this.server.isStopping()) { -+ // DivineMC start - Multithreaded tracker -+ if (org.bxteam.divinemc.DivineConfig.multithreadedEnabled) { -+ net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(event::callEvent); -+ return; -+ } -+ // DivineMC end - Multithreaded tracker throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously."); } -