mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-27 04:55:47 +01:00
2fa8efce9b
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 82af5dc6 SPIGOT-7396: Add PlayerSignOpenEvent 3f0281ca SPIGOT-7063, PR-763: Add DragonBattle#initiateRespawn with custom EnderCrystals f83c8df4 PR-873: Add PlayerRecipeBookClickEvent 14560d39 SPIGOT-7435: Add TeleportCause#EXIT_BED 2cc6db92 SPIGOT-7422, PR-887: Add API to set sherds on decorated pots 36022f02 PR-883: Add ItemFactory#getSpawnEgg 12eb5c46 PR-881: Update Scoreboard Javadocs, remove explicit exception throwing f6d8d44a PR-882: Add modern time API methods to ban API 21a7b710 Upgrade some Maven plugins to reduce warnings 11fd1225 PR-886: Deprecate the SmithingRecipe constructor as it now does nothing dbd1761d SPIGOT-7406: Improve documentation for getDragonBattle CraftBukkit Changes: d548daac2 SPIGOT-7446: BlockState#update not updating a spawner's type to null 70e0bc050 SPIGOT-7447: Fix --forceUpgrade 6752f1d63 SPIGOT-7396: Add PlayerSignOpenEvent 847b4cad5 SPIGOT-7063, PR-1071: Add DragonBattle#initiateRespawn with custom EnderCrystals c335a555f PR-1212: Add PlayerRecipeBookClickEvent 4be756ecb SPIGOT-7445: Fix opening smithing inventory db70bd6ed SPIGOT-7441: Fix issue placing certain items in creative/op f7fa6d993 SPIGOT-7435: Add TeleportCause#EXIT_BED b435e8e8d SPIGOT-7349: Player#setDisplayName not working when message/format unmodified a2fafdd1d PR-1232: Re-add fix for player rotation 7cf863de1 PR-1233: Remove some old MC bug fixes now fixed in vanilla 08ec344ad Fix ChunkGenerator#generateCaves never being called 5daeb502a SPIGOT-7422, PR-1228: Add API to set sherds on decorated pots 52faa6b32 PR-1224: Add ItemFactory#getSpawnEgg 01cae71b7 SPIGOT-7429: Fix LEFT_CLICK_AIR not working for passable entities and spectators a94277a18 PR-1223: Remove non-existent scoreboard display name/prefix/suffix limits 36b107660 PR-1225: Add modern time API methods to ban API 59ead25bc Upgrade some Maven plugins to reduce warnings 202fc5c4e Increase outdated build delay ce545de57 SPIGOT-7398: TextDisplay#setInterpolationDuration incorrectly updates the line width Spigot Changes: b41c46db Rebuild patches 3374045a SPIGOT-7431: Fix EntityMountEvent returning opposite entities 0ca4eb66 Rebuild patches
207 lines
8.0 KiB
Diff
207 lines
8.0 KiB
Diff
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
|
|
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/command/MSPTCommand.java b/src/main/java/io/papermc/paper/command/MSPTCommand.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..8b5293b0c696ef21d0101493ffa41b60bf0bc86b
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/command/MSPTCommand.java
|
|
@@ -0,0 +1,102 @@
|
|
+package io.papermc.paper.command;
|
|
+
|
|
+import net.kyori.adventure.text.Component;
|
|
+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;
|
|
+import org.checkerframework.checker.nullness.qual.NonNull;
|
|
+import org.checkerframework.framework.qual.DefaultQualifier;
|
|
+
|
|
+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;
|
|
+
|
|
+@DefaultQualifier(NonNull.class)
|
|
+public final class MSPTCommand extends Command {
|
|
+ private static final DecimalFormat DF = new DecimalFormat("########0.0");
|
|
+ private static final Component SLASH = text("/");
|
|
+
|
|
+ public MSPTCommand(final String name) {
|
|
+ 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();
|
|
+
|
|
+ List<Component> times = new ArrayList<>();
|
|
+ times.addAll(eval(server.tickTimes5s.getTimes()));
|
|
+ times.addAll(eval(server.tickTimes10s.getTimes()));
|
|
+ times.addAll(eval(server.tickTimes60s.getTimes()));
|
|
+
|
|
+ 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)
|
|
+ )
|
|
+ )
|
|
+ );
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ private static List<Component> eval(long[] times) {
|
|
+ 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));
|
|
+ }
|
|
+
|
|
+ private static Component getColor(double avg) {
|
|
+ return text(DF.format(avg), avg >= 50 ? RED : avg >= 40 ? YELLOW : GREEN);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/io/papermc/paper/command/PaperCommands.java b/src/main/java/io/papermc/paper/command/PaperCommands.java
|
|
index d44d0074446c1c54e87dc8078dff7fef1d92f343..bbb8b1933ef33a3b91f69545f69dd3cfb84b27f5 100644
|
|
--- a/src/main/java/io/papermc/paper/command/PaperCommands.java
|
|
+++ b/src/main/java/io/papermc/paper/command/PaperCommands.java
|
|
@@ -17,6 +17,7 @@ public final class PaperCommands {
|
|
private static final Map<String, Command> COMMANDS = new HashMap<>();
|
|
static {
|
|
COMMANDS.put("paper", new PaperCommand("paper"));
|
|
+ COMMANDS.put("mspt", new MSPTCommand("mspt"));
|
|
}
|
|
|
|
public static void registerCommands(final MinecraftServer server) {
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index cd57953e31c1f0f51553be113d84760f24b061b0..36112a1ab7306deb3cc38b103f22f7c1b8f89206 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -251,6 +251,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
private net.kyori.adventure.text.Component motd; // Paper - Adventure
|
|
private int playerIdleTimeout;
|
|
public final long[] tickTimes;
|
|
+ // 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
|
|
@@ -1341,6 +1346,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
this.averageTickTime = this.averageTickTime * 0.8F + (float) j / 1000000.0F * 0.19999999F;
|
|
long k = Util.getNanos();
|
|
|
|
+ // Paper start
|
|
+ tickTimes5s.add(this.tickCount, j);
|
|
+ tickTimes10s.add(this.tickCount, j);
|
|
+ tickTimes60s.add(this.tickCount, j);
|
|
+ // Paper end
|
|
this.frameTimer.logFrameDuration(k - i);
|
|
this.profiler.pop();
|
|
org.spigotmc.WatchdogThread.tick(); // Spigot
|
|
@@ -2571,4 +2581,30 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
|
public static record ServerResourcePackInfo(String url, String hash, boolean isRequired, @Nullable Component prompt) {
|
|
|
|
}
|
|
+
|
|
+ // 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
|
|
index e5eedc1ff0b60414406bb0b131e3b0170991f046..6b7dc90df1d023d867f0eec30edd0e49f49899a1 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
@@ -2550,6 +2550,16 @@ public final class CraftServer implements Server {
|
|
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
|