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/com/destroystokyo/paper/MSPTCommand.java b/src/main/java/com/destroystokyo/paper/MSPTCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..d0211d4f39f9d6af1d751ac66342b42cc6d7ba6d --- /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<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<String> 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<String> 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 ddbc8cb712c50038922eded75dd6ca85fe851078..78271b400c79578d043b20a5389a37b1bef9a70d 100644 --- a/src/main/java/com/destroystokyo/paper/PaperConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java @@ -69,6 +69,7 @@ public class PaperConfig { commands = new HashMap<String, Command>(); 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 087f31ac0cc7816b1cbeffc45be6927b174dee62..99ee9de92264381a064066bc22bb66b4b2852a2e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -217,6 +217,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa private int maxBuildHeight; private int playerIdleTimeout; public final long[] tickTimes; public long[] getTickTimes() { return tickTimes; } // Paper - OBFHELPER + // 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 @@ -1329,6 +1334,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa 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 @@ -2301,4 +2312,30 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa public TextFilter createTextFilterForPlayer(ServerPlayer player) { return null; } + + // 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 3c0ba80bbba19f3725013e118cecdbac5612deec..4fa49b6bb26456d485f7f9193af560cb379e36f0 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -2201,6 +2201,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