mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-04 07:17:46 +01:00
c9731fc93d
A plugin should not be allowed to be added twice or more, as this would require two or more remove calls to unset the pause block.
68 lines
3.4 KiB
Diff
68 lines
3.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Abel <abelvanhulst@gmail.com>
|
|
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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -0,0 +0,0 @@ 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 final Set<String> pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping
|
|
|
|
public static <S extends MinecraftServer> S spin(Function<Thread, S> serverFactory) {
|
|
AtomicReference<S> atomicreference = new AtomicReference();
|
|
@@ -0,0 +0,0 @@ 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;
|
|
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -0,0 +0,0 @@ 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
|
|
}
|