forked from PaperMC/Paper
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add API to allow/disallow tick sleeping (PaperMC#11611)
- Loading branch information
1 parent
8dc42fa
commit 817550c
Showing
2 changed files
with
92 additions
and
0 deletions.
There are no files selected for viewing
25 changes: 25 additions & 0 deletions
25
patches/api/0499-API-to-allow-disallow-tick-sleeping.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Abel <[email protected]> | ||
Date: Tue, 12 Nov 2024 22:25:35 +0100 | ||
Subject: [PATCH] API to allow/disallow tick sleeping | ||
|
||
|
||
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java | ||
index ba366576a571214e67bcc529dc1bca19e1d59ef8..f55638eb8b315864052f9fe17ab4846e5e9d8dbb 100644 | ||
--- a/src/main/java/org/bukkit/Server.java | ||
+++ b/src/main/java/org/bukkit/Server.java | ||
@@ -2578,5 +2578,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi | ||
* Returns whether the server is sleeping/paused. | ||
*/ | ||
boolean isPaused(); | ||
+ | ||
+ /** | ||
+ * Allows or disallows the server to sleep/pause. | ||
+ * If any plugin disallows pausing, the server will never pause. | ||
+ * | ||
+ * @param plugin The {@link org.bukkit.plugin.Plugin} that's allowing or disallowing pausing. | ||
+ * @param value Whether to allow sleeping of the server (defaults to true). | ||
+ */ | ||
+ void allowPausing(@NotNull org.bukkit.plugin.Plugin plugin, boolean value); | ||
// Paper end - API to check if the server is sleeping | ||
} |
67 changes: 67 additions & 0 deletions
67
patches/server/1069-API-to-allow-disallow-tick-sleeping.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Abel <[email protected]> | ||
Date: Tue, 12 Nov 2024 22:25:20 +0100 | ||
Subject: [PATCH] API to allow/disallow tick sleeping | ||
|
||
|
||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java | ||
index 5d070f036dae6d93f863c55192b557419634456d..663b4ecd520e82aa108d44f2d5c2a20cfc7bc01f 100644 | ||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java | ||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java | ||
@@ -332,6 +332,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa | ||
public volatile Thread shutdownThread; // Paper | ||
public volatile boolean abnormalExit = false; // Paper | ||
public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation | ||
+ private List<String> pluginsBlockingSleep = new ArrayList<>(); // Paper - API to allow/disallow tick sleeping | ||
|
||
public static <S extends MinecraftServer> S spin(Function<Thread, S> serverFactory) { | ||
AtomicReference<S> atomicreference = new AtomicReference(); | ||
@@ -1623,8 +1624,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa | ||
long i = Util.getNanos(); | ||
int j = this.pauseWhileEmptySeconds() * 20; | ||
|
||
+ this.removeDisabledPluginsBlockingSleep(); // Paper - API to allow/disallow tick sleeping | ||
if (j > 0) { | ||
- if (this.playerList.getPlayerCount() == 0 && !this.tickRateManager.isSprinting()) { | ||
+ if (this.playerList.getPlayerCount() == 0 && !this.tickRateManager.isSprinting() && this.pluginsBlockingSleep.isEmpty()) { // Paper - API to allow/disallow tick sleeping | ||
++this.emptyTicks; | ||
} else { | ||
this.emptyTicks = 0; | ||
@@ -3191,5 +3193,22 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa | ||
public boolean isTickPaused() { | ||
return this.emptyTicks > 0 && this.emptyTicks >= this.pauseWhileEmptySeconds() * 20; | ||
} | ||
+ | ||
+ public void addPluginAllowingSleep(final String pluginName, final boolean value) { | ||
+ if (!value) { | ||
+ this.pluginsBlockingSleep.add(pluginName); | ||
+ } else { | ||
+ this.pluginsBlockingSleep.remove(pluginName); | ||
+ } | ||
+ } | ||
+ | ||
+ private void removeDisabledPluginsBlockingSleep() { | ||
+ if (this.pluginsBlockingSleep.isEmpty()) { | ||
+ return; | ||
+ } | ||
+ this.pluginsBlockingSleep.removeIf(plugin -> ( | ||
+ !io.papermc.paper.plugin.manager.PaperPluginManagerImpl.getInstance().isPluginEnabled(plugin) | ||
+ )); | ||
+ } | ||
// Paper end - API to check if the server is sleeping | ||
} | ||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
index 605662917a7720a6c5134fd1d93aa2d26116b76d..cac8592e3a2f438fe9ca167a4fdcd65152bbb2de 100644 | ||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java | ||
@@ -3252,5 +3252,10 @@ public final class CraftServer implements Server { | ||
public boolean isPaused() { | ||
return this.console.isTickPaused(); | ||
} | ||
+ | ||
+ @Override | ||
+ public void allowPausing(final Plugin plugin, final boolean value) { | ||
+ this.console.addPluginAllowingSleep(plugin.getName(), value); | ||
+ } | ||
// Paper end - API to check if the server is sleeping | ||
} |