From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: BillyGalbreath 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 98961e20642e61239a6ad89445f97245aa821919..760799782d0cb01e2b14408a9b085f78034ec78d 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -468,6 +468,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant 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(); + } + } +}