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/commands/CommandDispatcher.java b/src/main/java/net/minecraft/commands/CommandDispatcher.java index a551636c2c59e68a5abb1cd5611c1d5c7e36f514..b7663a3d64ae5202abb93eabba6ec013bae96334 100644 --- a/src/main/java/net/minecraft/commands/CommandDispatcher.java +++ b/src/main/java/net/minecraft/commands/CommandDispatcher.java @@ -193,6 +193,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 45cb8681fd0942084b56eb8d45390c2dbc8a4f3d..966b6e2f9b7c473d8dfcae205d8ef8f08912ded9 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -584,6 +584,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..f9f75d96565ccee9437b7d39a98c9adf97446e51 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/task/TPSBarTask.java @@ -0,0 +1,112 @@ +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 static TPSBarTask instance; + private final NamespacedKey key; + private BossBar bossbar; + + public TPSBarTask() { + instance = this; + this.key = new NamespacedKey("purpur", "tpsbar"); + } + + public BossBar getBossBar() { + if (bossbar == null) { + 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); + } + return bossbar; + } + + @Override + public void run() { + BossBar bossbar = getBossBar(); + 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 bossbar = getBossBar(); + bossbar.setVisible(false); + bossbar.removeAll(); + Bukkit.removeBossBar(key); + } + + public static void removePlayer(Player player) { + BossBar bossbar = instance.getBossBar(); + bossbar.removePlayer(player); + } + + public static void togglePlayer(Player player) { + BossBar bossbar = instance.getBossBar(); + if (bossbar.getPlayers().contains(player)) { + bossbar.removePlayer(player); + } else { + 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(); + } + } +}