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 d402a896a0094e6c379d71c63d744b4ee443c097..3bcaafb1fe3af67fce2be1f62c7f1aa86ebd51ef 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(dispatcher()); // Purpur net.pl3x.purpur.command.PingCommand.register(dispatcher()); // Purpur + net.pl3x.purpur.command.TPSBarCommand.register(dispatcher()); // 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 f6637353fb358e7720edabc355ea036d37d039ca..5e2c7f3bf9aa99b10260454b9957caff81a7cd26 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -989,6 +989,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..a9d71d2b769b8e4e0f5039e997fc5ebc1cc9bfbb --- /dev/null +++ b/src/main/java/net/pl3x/purpur/task/TPSBarTask.java @@ -0,0 +1,116 @@ +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; + + private TPSBarTask() { + this.key = new NamespacedKey("purpur", "tpsbar"); + } + + private static TPSBarTask instance() { + if (instance == null) { + instance = new TPSBarTask(); + } + return instance; + } + + private BossBar bossbar() { + 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 = bossbar(); + 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 = bossbar(); + bossbar.setVisible(false); + bossbar.removeAll(); + Bukkit.removeBossBar(key); + } + + public static void removePlayer(Player player) { + instance().bossbar().removePlayer(player); + } + + public static void togglePlayer(Player player) { + BossBar bossbar = instance().bossbar(); + if (bossbar.getPlayers().contains(player)) { + bossbar.removePlayer(player); + } else { + bossbar.addPlayer(player); + instance.run(); + } + } + + public static void start() { + stop(); + instance().runTaskTimerAsynchronously(new MinecraftInternalPlugin(), 20L, 20L); + } + + public static void stop() { + if (instance != null) { + instance.cancel(); + } + } +}