2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
|
|
|
Date: Sun, 5 Apr 2020 22:23:14 -0500
|
|
|
|
Subject: [PATCH] Add tick times API and /mspt command
|
|
|
|
|
|
|
|
|
2022-07-09 01:01:42 +02:00
|
|
|
diff --git a/src/main/java/io/papermc/paper/command/MSPTCommand.java b/src/main/java/io/papermc/paper/command/MSPTCommand.java
|
2021-06-11 14:02:28 +02:00
|
|
|
new file mode 100644
|
2022-07-09 01:01:42 +02:00
|
|
|
index 0000000000000000000000000000000000000000..8b5293b0c696ef21d0101493ffa41b60bf0bc86b
|
2021-06-11 14:02:28 +02:00
|
|
|
--- /dev/null
|
2022-07-09 01:01:42 +02:00
|
|
|
+++ b/src/main/java/io/papermc/paper/command/MSPTCommand.java
|
|
|
|
@@ -0,0 +1,102 @@
|
|
|
|
+package io.papermc.paper.command;
|
2021-06-11 14:02:28 +02:00
|
|
|
+
|
2022-06-03 06:26:56 +02:00
|
|
|
+import net.kyori.adventure.text.Component;
|
2021-06-11 14:02:28 +02:00
|
|
|
+import net.minecraft.server.MinecraftServer;
|
|
|
|
+import org.bukkit.Location;
|
|
|
|
+import org.bukkit.command.Command;
|
|
|
|
+import org.bukkit.command.CommandSender;
|
|
|
|
+
|
|
|
|
+import java.text.DecimalFormat;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.Arrays;
|
|
|
|
+import java.util.Collections;
|
|
|
|
+import java.util.List;
|
2022-07-09 01:01:42 +02:00
|
|
|
+import org.checkerframework.checker.nullness.qual.NonNull;
|
|
|
|
+import org.checkerframework.framework.qual.DefaultQualifier;
|
2021-06-11 14:02:28 +02:00
|
|
|
+
|
2022-06-03 06:26:56 +02:00
|
|
|
+import static net.kyori.adventure.text.Component.text;
|
|
|
|
+import static net.kyori.adventure.text.format.NamedTextColor.GOLD;
|
|
|
|
+import static net.kyori.adventure.text.format.NamedTextColor.GRAY;
|
|
|
|
+import static net.kyori.adventure.text.format.NamedTextColor.GREEN;
|
|
|
|
+import static net.kyori.adventure.text.format.NamedTextColor.RED;
|
|
|
|
+import static net.kyori.adventure.text.format.NamedTextColor.YELLOW;
|
|
|
|
+
|
2022-07-09 01:01:42 +02:00
|
|
|
+@DefaultQualifier(NonNull.class)
|
|
|
|
+public final class MSPTCommand extends Command {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ private static final DecimalFormat DF = new DecimalFormat("########0.0");
|
2022-06-03 06:26:56 +02:00
|
|
|
+ private static final Component SLASH = text("/");
|
2021-06-11 14:02:28 +02:00
|
|
|
+
|
2022-07-09 01:01:42 +02:00
|
|
|
+ public MSPTCommand(final String name) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ super(name);
|
|
|
|
+ this.description = "View server tick times";
|
|
|
|
+ this.usageMessage = "/mspt";
|
|
|
|
+ this.setPermission("bukkit.command.mspt");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public List<String> tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException {
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean execute(CommandSender sender, String commandLabel, String[] args) {
|
|
|
|
+ if (!testPermission(sender)) return true;
|
|
|
|
+
|
|
|
|
+ MinecraftServer server = MinecraftServer.getServer();
|
|
|
|
+
|
2022-06-03 06:26:56 +02:00
|
|
|
+ List<Component> times = new ArrayList<>();
|
2021-06-11 14:02:28 +02:00
|
|
|
+ times.addAll(eval(server.tickTimes5s.getTimes()));
|
|
|
|
+ times.addAll(eval(server.tickTimes10s.getTimes()));
|
|
|
|
+ times.addAll(eval(server.tickTimes60s.getTimes()));
|
|
|
|
+
|
2022-06-03 06:26:56 +02:00
|
|
|
+ sender.sendMessage(text().content("Server tick times ").color(GOLD)
|
|
|
|
+ .append(text().color(YELLOW)
|
|
|
|
+ .append(
|
|
|
|
+ text("("),
|
|
|
|
+ text("avg", GRAY),
|
|
|
|
+ text("/"),
|
|
|
|
+ text("min", GRAY),
|
|
|
|
+ text("/"),
|
|
|
|
+ text("max", GRAY),
|
|
|
|
+ text(")")
|
|
|
|
+ )
|
|
|
|
+ ).append(
|
|
|
|
+ text(" from last 5s"),
|
|
|
|
+ text(",", GRAY),
|
|
|
|
+ text(" 10s"),
|
|
|
|
+ text(",", GRAY),
|
|
|
|
+ text(" 1m"),
|
|
|
|
+ text(":", YELLOW)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
|
|
+ sender.sendMessage(text().content("◴ ").color(GOLD)
|
|
|
|
+ .append(text().color(GRAY)
|
|
|
|
+ .append(
|
|
|
|
+ times.get(0), SLASH, times.get(1), SLASH, times.get(2), text(", ", YELLOW),
|
|
|
|
+ times.get(3), SLASH, times.get(4), SLASH, times.get(5), text(", ", YELLOW),
|
|
|
|
+ times.get(6), SLASH, times.get(7), SLASH, times.get(8)
|
|
|
|
+ )
|
|
|
|
+ )
|
|
|
|
+ );
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
2022-06-03 06:26:56 +02:00
|
|
|
+ private static List<Component> eval(long[] times) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ long min = Integer.MAX_VALUE;
|
|
|
|
+ long max = 0L;
|
|
|
|
+ long total = 0L;
|
|
|
|
+ for (long value : times) {
|
|
|
|
+ if (value > 0L && value < min) min = value;
|
|
|
|
+ if (value > max) max = value;
|
|
|
|
+ total += value;
|
|
|
|
+ }
|
|
|
|
+ double avgD = ((double) total / (double) times.length) * 1.0E-6D;
|
|
|
|
+ double minD = ((double) min) * 1.0E-6D;
|
|
|
|
+ double maxD = ((double) max) * 1.0E-6D;
|
|
|
|
+ return Arrays.asList(getColor(avgD), getColor(minD), getColor(maxD));
|
|
|
|
+ }
|
|
|
|
+
|
2022-06-03 06:26:56 +02:00
|
|
|
+ private static Component getColor(double avg) {
|
|
|
|
+ return text(DF.format(avg), avg >= 50 ? RED : avg >= 40 ? YELLOW : GREEN);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+}
|
2022-06-09 23:43:27 +02:00
|
|
|
diff --git a/src/main/java/io/papermc/paper/command/PaperCommands.java b/src/main/java/io/papermc/paper/command/PaperCommands.java
|
2022-07-09 01:01:42 +02:00
|
|
|
index 6a00f3d38da8107825ab1d405f337fd077b09f72..d31b5ed47cffc61c90c926a0cd2005b72ebddfc5 100644
|
2022-06-09 23:43:27 +02:00
|
|
|
--- a/src/main/java/io/papermc/paper/command/PaperCommands.java
|
|
|
|
+++ b/src/main/java/io/papermc/paper/command/PaperCommands.java
|
2022-07-09 01:01:42 +02:00
|
|
|
@@ -17,6 +17,7 @@ public final class PaperCommands {
|
2022-06-09 23:43:27 +02:00
|
|
|
private static final Map<String, Command> COMMANDS = new HashMap<>();
|
2022-06-09 10:51:45 +02:00
|
|
|
static {
|
|
|
|
COMMANDS.put("paper", new PaperCommand("paper"));
|
|
|
|
+ COMMANDS.put("mspt", new MSPTCommand("mspt"));
|
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2022-06-09 10:51:45 +02:00
|
|
|
public static void registerCommands(final MinecraftServer server) {
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
2022-08-14 10:03:13 +02:00
|
|
|
index 27f19abc22e295a5480dbed5df86f5d885ad3b73..12ca13f5b0556c53fd36d638ee4fa854b89ee8ec 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
2022-07-27 22:17:18 +02:00
|
|
|
@@ -237,6 +237,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
2022-07-23 03:56:50 +02:00
|
|
|
@Nullable private net.kyori.adventure.text.Component cachedMotd; // Paper
|
2021-06-11 14:02:28 +02:00
|
|
|
private int playerIdleTimeout;
|
2021-06-14 03:06:38 +02:00
|
|
|
public final long[] tickTimes;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start
|
|
|
|
+ public final TickTimes tickTimes5s = new TickTimes(100);
|
|
|
|
+ public final TickTimes tickTimes10s = new TickTimes(200);
|
|
|
|
+ public final TickTimes tickTimes60s = new TickTimes(1200);
|
|
|
|
+ // Paper end
|
|
|
|
@Nullable
|
|
|
|
private KeyPair keyPair;
|
|
|
|
@Nullable
|
2022-08-08 13:32:17 +02:00
|
|
|
@@ -1361,6 +1366,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
2021-06-11 14:02:28 +02:00
|
|
|
this.averageTickTime = this.averageTickTime * 0.8F + (float) l / 1000000.0F * 0.19999999F;
|
|
|
|
long i1 = Util.getNanos();
|
|
|
|
|
|
|
|
+ // Paper start
|
|
|
|
+ tickTimes5s.add(this.tickCount, l);
|
|
|
|
+ tickTimes10s.add(this.tickCount, l);
|
|
|
|
+ tickTimes60s.add(this.tickCount, l);
|
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
this.frameTimer.logFrameDuration(i1 - i);
|
|
|
|
this.profiler.pop();
|
|
|
|
org.spigotmc.WatchdogThread.tick(); // Spigot
|
2022-08-14 10:03:13 +02:00
|
|
|
@@ -2539,4 +2550,30 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
2022-06-08 06:06:41 +02:00
|
|
|
public static record ServerResourcePackInfo(String url, String hash, boolean isRequired, @Nullable Component prompt) {
|
|
|
|
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
2022-06-08 06:06:41 +02:00
|
|
|
+
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start
|
|
|
|
+ public static class TickTimes {
|
|
|
|
+ private final long[] times;
|
|
|
|
+
|
|
|
|
+ public TickTimes(int length) {
|
|
|
|
+ times = new long[length];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void add(int index, long time) {
|
|
|
|
+ times[index % times.length] = time;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public long[] getTimes() {
|
|
|
|
+ return times.clone();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public double getAverage() {
|
|
|
|
+ long total = 0L;
|
|
|
|
+ for (long value : times) {
|
|
|
|
+ total += value;
|
|
|
|
+ }
|
|
|
|
+ return ((double) total / (double) times.length) * 1.0E-6D;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
2022-08-14 10:03:13 +02:00
|
|
|
index 8cc2a35486e8c6433e722ddc5e776c3332e7c7fe..a6f40cba559a4ca8c91b4daca0867f3be9cc94e6 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
2022-08-09 09:18:08 +02:00
|
|
|
@@ -2485,6 +2485,16 @@ public final class CraftServer implements Server {
|
2021-06-11 14:02:28 +02:00
|
|
|
net.minecraft.server.MinecraftServer.getServer().tps15.getAverage()
|
|
|
|
};
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public long[] getTickTimes() {
|
|
|
|
+ return getServer().tickTimes5s.getTimes();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public double getAverageTickTime() {
|
|
|
|
+ return getServer().tickTimes5s.getAverage();
|
|
|
|
+ }
|
|
|
|
// Paper end
|
|
|
|
|
|
|
|
// Spigot start
|