Files
Purpur/patches/server/0156-Implement-TPSBar.patch
BillyGalbreath e581a731bf Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
0514fc4e2 Add missing effects
8f5d9effd Add getMainThreadExecutor to BukkitScheduler
313b5020b Allow adding items to BlockDropItemEvent (#5093)
9a556d9da [CI-SKIP] [Auto] Rebuild Patches
72b2768ad Inline shift fields in EnumDirection (#5082)
ffff53fa7 added option to disable pathfinding updates on block changes (#5123)
b67081fd7 add DragonEggFormEvent (fixes #5110) (#5112)
3eefafbaf Fix javadoc build
0081ed1c4 Add javadoc step to GH Actions
01082503e Add dropLeash variable to EntityUnleashEvent (#5130)
31f9f869a [CI-SKIP] Fix YourKit links in readme, fixes #5091
8ac27aa38 [Auto] Updated Upstream (CraftBukkit)
c4d9cc831 [Auto] Updated Upstream (Bukkit/CraftBukkit)
d0477d326 [Auto] Updated Upstream (CraftBukkit)
d9f5f7018 EntityMoveEvent (#4614)
2021-01-30 20:41:46 -06:00

197 lines
7.4 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <blake.galbreath@gmail.com>
Date: Sat, 12 Dec 2020 21:19:05 -0600
Subject: [PATCH] Implement TPSBar
diff --git a/src/main/java/net/minecraft/server/CommandDispatcher.java b/src/main/java/net/minecraft/server/CommandDispatcher.java
index b5cc099746e9f05ea69bc438bda22a5ac3ebc3c5..bbd17231a4f7ad0ddde6eb5e589a6c403366cc36 100644
--- a/src/main/java/net/minecraft/server/CommandDispatcher.java
+++ b/src/main/java/net/minecraft/server/CommandDispatcher.java
@@ -109,6 +109,7 @@ public class CommandDispatcher {
CommandWhitelist.a(this.b);
net.pl3x.purpur.command.DemoCommand.register(getDispatcher()); // Purpur
net.pl3x.purpur.command.PingCommand.register(getDispatcher()); // Purpur
+ net.pl3x.purpur.command.TPSBarCommand.register(getDispatcher()); // Purpur
}
if (commanddispatcher_servertype.d) {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index eea187723c1931a5db9a2d79a1abddd664d890a1..33d43478b1bc4b0ca3f16ba80e0cd99bc6f5311e 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -469,6 +469,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
this.serverConnection.acceptConnections();
// CraftBukkit end
+ net.pl3x.purpur.task.TPSBarTask.start(); // Purpur
}
protected void updateWorldSettings() {}
@@ -862,6 +863,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
this.safeShutdown(flag, false);
}
public void safeShutdown(boolean flag, boolean isRestarting) {
+ net.pl3x.purpur.task.TPSBarTask.stop(); // Purpur
this.isRunning = false;
this.isRestarting = isRestarting;
if (flag) {
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
index 0efc210ad55d843fd297f0caa88a5f355fbfef80..ca19cfa1ff801e5292332ff7b92bba881762306e 100644
--- a/src/main/java/net/minecraft/server/PlayerList.java
+++ b/src/main/java/net/minecraft/server/PlayerList.java
@@ -513,6 +513,8 @@ public abstract class PlayerList {
if (entityplayer.didPlayerJoinEvent) cserver.getPluginManager().callEvent(playerQuitEvent); // Paper - if we disconnected before join ever fired, don't fire quit
entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage());
+ net.pl3x.purpur.task.TPSBarTask.removePlayer(cserver.getPlayer(entityplayer)); // Purpur
+
if (server.isMainThread()) entityplayer.playerTick(); // SPIGOT-924 // Paper - don't tick during emergency shutdowns (Watchdog)
// CraftBukkit end
diff --git a/src/main/java/net/pl3x/purpur/command/TPSBarCommand.java b/src/main/java/net/pl3x/purpur/command/TPSBarCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..508575963816ba4f21371bf9e37033373e454c9f
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/command/TPSBarCommand.java
@@ -0,0 +1,27 @@
+package net.pl3x.purpur.command;
+
+import net.minecraft.server.CommandDispatcher;
+import net.minecraft.server.CommandListenerWrapper;
+import net.minecraft.server.EntityPlayer;
+import net.pl3x.purpur.task.TPSBarTask;
+
+public class TPSBarCommand {
+ public static void register(com.mojang.brigadier.CommandDispatcher<CommandListenerWrapper> dispatcher) {
+ dispatcher.register(CommandDispatcher.literal("tpsbar")
+ .requires((listener) -> {
+ return listener.hasPermission(2);
+ })
+ .executes((context) -> {
+ return execute(context.getSource(), context.getSource().getPlayerOrException());
+ })
+ ).setPermission("bukkit.command.tpsbar");
+ }
+
+ private static int execute(CommandListenerWrapper sender, EntityPlayer player) {
+ if (player != null) {
+ TPSBarTask.togglePlayer(player.getBukkitEntity());
+ return 1;
+ }
+ return 0;
+ }
+}
diff --git a/src/main/java/net/pl3x/purpur/task/TPSBarTask.java b/src/main/java/net/pl3x/purpur/task/TPSBarTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..170f01516aab72e5b192695a73602ff656ef4ca5
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/task/TPSBarTask.java
@@ -0,0 +1,106 @@
+package net.pl3x.purpur.task;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.NamespacedKey;
+import org.bukkit.boss.BarColor;
+import org.bukkit.boss.BarStyle;
+import org.bukkit.boss.BossBar;
+import org.bukkit.craftbukkit.scheduler.MinecraftInternalPlugin;
+import org.bukkit.entity.Player;
+import org.bukkit.scheduler.BukkitRunnable;
+
+public class TPSBarTask extends BukkitRunnable {
+ private final NamespacedKey key;
+ private final BossBar bossbar;
+ private static TPSBarTask instance;
+
+ public TPSBarTask() {
+ instance = this;
+
+ this.key = new NamespacedKey("purpur", "tpsbar");
+
+ BossBar bossbar = Bukkit.getBossBar(key);
+ if (bossbar == null) {
+ bossbar = Bukkit.createBossBar(key, "TPS: 20.0", BarColor.RED, BarStyle.SEGMENTED_20);
+ }
+ bossbar.setVisible(true);
+ bossbar.setProgress(1.0D);
+
+ this.bossbar = bossbar;
+ }
+
+ @Override
+ public void run() {
+ if (bossbar.getPlayers().isEmpty()) {
+ return;
+ }
+
+ double tps = Bukkit.getTPS()[0];
+ if (tps > 20.0D) {
+ tps = 20.0D;
+ } else if (tps < 0.0D) {
+ tps = 0.0D;
+ }
+
+ bossbar.setVisible(true);
+ bossbar.setProgress(Math.max(Math.min(tps / 20.0D, 1.0D), 0.0D));
+
+ String tpsColor;
+ if (tps >= 18) {
+ tpsColor = "&2";
+ bossbar.setColor(BarColor.GREEN);
+ } else if (tps >= 15) {
+ tpsColor = "&e";
+ bossbar.setColor(BarColor.YELLOW);
+ } else {
+ tpsColor = "&4";
+ bossbar.setColor(BarColor.RED);
+ }
+
+ double mspt = Bukkit.getAverageTickTime();
+ String msptColor;
+ if (mspt < 40) {
+ msptColor = "&2";
+ } else if (mspt < 50) {
+ msptColor = "&e";
+ } else {
+ msptColor = "&4";
+ }
+
+ bossbar.setTitle(ChatColor.translateAlternateColorCodes('&', "&eTPS&3: " + tpsColor + String.format("%.2f", tps) + " &eMSPT&3: " + msptColor + String.format("%.3f", mspt)));
+ }
+
+ @Override
+ public void cancel() {
+ super.cancel();
+ bossbar.setVisible(false);
+ bossbar.removeAll();
+ Bukkit.removeBossBar(key);
+ }
+
+ public static void removePlayer(Player player) {
+ instance.bossbar.removePlayer(player);
+ }
+
+ public static void togglePlayer(Player player) {
+ if (instance.bossbar.getPlayers().contains(player)) {
+ instance.bossbar.removePlayer(player);
+ } else {
+ instance.bossbar.addPlayer(player);
+ instance.run();
+ }
+ }
+
+ public static void start() {
+ stop();
+ instance = new TPSBarTask();
+ instance.runTaskTimerAsynchronously(new MinecraftInternalPlugin(), 20L, 20L);
+ }
+
+ public static void stop() {
+ if (instance != null) {
+ instance.cancel();
+ }
+ }
+}