From 588b62e47b136f4b2a0038c97bf9c7df89fc23b1 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Sat, 11 Apr 2020 00:52:17 -0500 Subject: [PATCH] Add tick times API and /mspt command (#3102) --- .../0193-Add-tick-times-API.patch | 65 +++++++ ...-Add-tick-times-API-and-mspt-command.patch | 172 ++++++++++++++++++ 2 files changed, 237 insertions(+) create mode 100644 Spigot-API-Patches/0193-Add-tick-times-API.patch create mode 100644 Spigot-Server-Patches/0460-Add-tick-times-API-and-mspt-command.patch diff --git a/Spigot-API-Patches/0193-Add-tick-times-API.patch b/Spigot-API-Patches/0193-Add-tick-times-API.patch new file mode 100644 index 0000000000..33617af891 --- /dev/null +++ b/Spigot-API-Patches/0193-Add-tick-times-API.patch @@ -0,0 +1,65 @@ +From 1fe29f877ba04e8bed08b47c185ddb9244705507 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 5 Apr 2020 22:22:58 -0500 +Subject: [PATCH] Add tick times API + + +diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java +index b9973406..c3c2d9c6 100644 +--- a/src/main/java/org/bukkit/Bukkit.java ++++ b/src/main/java/org/bukkit/Bukkit.java +@@ -1412,6 +1412,25 @@ public final class Bukkit { + public static double[] getTPS() { + return server.getTPS(); + } ++ ++ /** ++ * Get a sample of the servers last tick times (in nanos) ++ * ++ * @return A sample of the servers last tick times (in nanos) ++ */ ++ @NotNull ++ public static long[] getTickTimes() { ++ return server.getTickTimes(); ++ } ++ ++ /** ++ * Get the average tick time (in millis) ++ * ++ * @return Average tick time (in millis) ++ */ ++ public static double getAverageTickTime() { ++ return server == null ? 0D : server.getAverageTickTime(); ++ } + // Paper end + + /** +diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java +index 80f9abdc..bfa83c9b 100644 +--- a/src/main/java/org/bukkit/Server.java ++++ b/src/main/java/org/bukkit/Server.java +@@ -1188,6 +1188,21 @@ public interface Server extends PluginMessageRecipient { + */ + @NotNull + public double[] getTPS(); ++ ++ /** ++ * Get a sample of the servers last tick times (in nanos) ++ * ++ * @return A sample of the servers last tick times (in nanos) ++ */ ++ @NotNull ++ long[] getTickTimes(); ++ ++ /** ++ * Get the average tick time (in millis) ++ * ++ * @return Average tick time (in millis) ++ */ ++ double getAverageTickTime(); + // Paper end + + // Paper start +-- +2.24.0 + diff --git a/Spigot-Server-Patches/0460-Add-tick-times-API-and-mspt-command.patch b/Spigot-Server-Patches/0460-Add-tick-times-API-and-mspt-command.patch new file mode 100644 index 0000000000..f218762545 --- /dev/null +++ b/Spigot-Server-Patches/0460-Add-tick-times-API-and-mspt-command.patch @@ -0,0 +1,172 @@ +From b27e5e76fb9039e25e502f831badc083d73afbf7 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 5 Apr 2020 22:23:14 -0500 +Subject: [PATCH] Add tick times API and /mspt command + + +diff --git a/src/main/java/com/destroystokyo/paper/MSPTCommand.java b/src/main/java/com/destroystokyo/paper/MSPTCommand.java +new file mode 100644 +index 000000000..d0211d4f3 +--- /dev/null ++++ b/src/main/java/com/destroystokyo/paper/MSPTCommand.java +@@ -0,0 +1,64 @@ ++package com.destroystokyo.paper; ++ ++import net.minecraft.server.MinecraftServer; ++import org.bukkit.ChatColor; ++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; ++ ++public class MSPTCommand extends Command { ++ private static final DecimalFormat DF = new DecimalFormat("########0.0"); ++ ++ public MSPTCommand(String name) { ++ super(name); ++ this.description = "View server tick times"; ++ this.usageMessage = "/mspt"; ++ this.setPermission("bukkit.command.mspt"); ++ } ++ ++ @Override ++ public List 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 times = new ArrayList<>(); ++ times.addAll(eval(server.tickTimes5s.getTimes())); ++ times.addAll(eval(server.tickTimes10s.getTimes())); ++ times.addAll(eval(server.tickTimes60s.getTimes())); ++ ++ sender.sendMessage("§6Server tick times §e(§7avg§e/§7min§e/§7max§e)§6 from last 5s§7,§6 10s§7,§6 1m§e:"); ++ sender.sendMessage(String.format("§6◴ %s§7/%s§7/%s§e, %s§7/%s§7/%s§e, %s§7/%s§7/%s", times.toArray())); ++ return true; ++ } ++ ++ private static List 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 String getColor(double avg) { ++ return ChatColor.COLOR_CHAR + (avg >= 50 ? "c" : avg >= 40 ? "e" : "a") + DF.format(avg); ++ } ++} +diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java +index 6916ed30c..1c4cd3635 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java +@@ -70,6 +70,7 @@ public class PaperConfig { + + commands = new HashMap(); + commands.put("paper", new PaperCommand("paper")); ++ commands.put("mspt", new MSPTCommand("mspt")); + + version = getInt("config-version", 20); + set("config-version", 20); +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index c9deaffc4..9e5d569f7 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -106,6 +106,11 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant