mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-19 09:27:43 +01:00
Upgrade TPSBar
This commit is contained in:
@@ -5,7 +5,7 @@ Subject: [PATCH] Implement TPSBar
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
||||
index f164106a957c24bdb71bde85d82948a64613fd91..bef1f6ca54fc6c1741b54b8e071a90eb5e3a36f3 100644
|
||||
index a5712108fbbe5ddc61cdfd390f667ab013ba609d..73953ea69776bfe1dcb1504cd14a0f003f1b5766 100644
|
||||
--- a/src/main/java/net/minecraft/commands/Commands.java
|
||||
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
||||
@@ -201,6 +201,7 @@ public class Commands {
|
||||
@@ -54,6 +54,38 @@ index 29043f9354b29f7766f1d6d8e793e2ea23883fa0..5141185821c798cb20f7936d7927d225
|
||||
ServerLevel worldserver = entityplayer.getLevel();
|
||||
|
||||
entityplayer.awardStat(Stats.LEAVE_GAME);
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
||||
index e1701ab4bd6eccb9a525fa3eb8b35a1bf6f7ffcd..e66c05541ff1f25346af60255d17542305cc3a9f 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
||||
@@ -324,6 +324,27 @@ public class PurpurConfig {
|
||||
disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops);
|
||||
}
|
||||
|
||||
+ public static String commandTPSBarTitle = "<gray>TPS<white>:</white> <tps> MSPT<white>:</white> <mspt> Ping<white>:</white> <ping><white>ms</white>";
|
||||
+ public static BossBar.Overlay commandTPSBarProgressOverlay = BossBar.Overlay.NOTCHED_20;
|
||||
+ public static TPSBarTask.FillMode commandTPSBarProgressFillMode = TPSBarTask.FillMode.MSPT;
|
||||
+ public static BossBar.Color commandTPSBarProgressColorGood = BossBar.Color.GREEN;
|
||||
+ public static BossBar.Color commandTPSBarProgressColorMedium = BossBar.Color.YELLOW;
|
||||
+ public static BossBar.Color commandTPSBarProgressColorLow = BossBar.Color.RED;
|
||||
+ public static String commandTPSBarTextColorGood = "<gradient:#55ff55:#00aa00><text></gradient>";
|
||||
+ public static String commandTPSBarTextColorMedium = "<gradient:#ffff55:#ffaa00><text></gradient>";
|
||||
+ public static String commandTPSBarTextColorLow = "<gradient:#ff5555:#aa0000><text></gradient>";
|
||||
+ private static void commandSettings() {
|
||||
+ commandTPSBarTitle = getString("settings.command.tpsbar.title", commandTPSBarTitle);
|
||||
+ commandTPSBarProgressOverlay = BossBar.Overlay.valueOf(getString("settings.command.tpsbar.overlay", commandTPSBarProgressOverlay.name()));
|
||||
+ commandTPSBarProgressFillMode = TPSBarTask.FillMode.valueOf(getString("settings.command.tpsbar.fill-mode", commandTPSBarProgressFillMode.name()));
|
||||
+ commandTPSBarProgressColorGood = BossBar.Color.valueOf(getString("settings.command.tpsbar.progress-color.good", commandTPSBarProgressColorGood.name()));
|
||||
+ commandTPSBarProgressColorMedium = BossBar.Color.valueOf(getString("settings.command.tpsbar.progress-color.medium", commandTPSBarProgressColorMedium.name()));
|
||||
+ commandTPSBarProgressColorLow = BossBar.Color.valueOf(getString("settings.command.tpsbar.progress-color.low", commandTPSBarProgressColorLow.name()));
|
||||
+ commandTPSBarTextColorGood = getString("settings.command.tpsbar.text-color.good", commandTPSBarTextColorGood);
|
||||
+ commandTPSBarTextColorMedium = getString("settings.command.tpsbar.text-color.medium", commandTPSBarTextColorMedium);
|
||||
+ commandTPSBarTextColorLow = getString("settings.command.tpsbar.text-color.low", commandTPSBarTextColorLow);
|
||||
+ }
|
||||
+
|
||||
public static boolean barrelSixRows = false;
|
||||
public static boolean enderChestSixRows = false;
|
||||
public static boolean enderChestPermissionRows = false;
|
||||
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..2803a1b95121fbff3066fd2d1abaf8723386781f
|
||||
@@ -86,30 +118,32 @@ index 0000000000000000000000000000000000000000..2803a1b95121fbff3066fd2d1abaf872
|
||||
+}
|
||||
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
|
||||
index 0000000000000000000000000000000000000000..12ba7e8a31de9610ca2468a59a28d3f963c5b8f3
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/net/pl3x/purpur/task/TPSBarTask.java
|
||||
@@ -0,0 +1,116 @@
|
||||
@@ -0,0 +1,183 @@
|
||||
+package net.pl3x.purpur.task;
|
||||
+
|
||||
+import net.kyori.adventure.bossbar.BossBar;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
+import net.kyori.adventure.text.minimessage.Template;
|
||||
+import net.pl3x.purpur.PurpurConfig;
|
||||
+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;
|
||||
+
|
||||
+import java.util.HashMap;
|
||||
+import java.util.Iterator;
|
||||
+import java.util.Map;
|
||||
+import java.util.UUID;
|
||||
+
|
||||
+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 final Map<UUID, BossBar> bossbars = new HashMap<>();
|
||||
+ private double tps = 20.0D;
|
||||
+ private double mspt = 0.0D;
|
||||
+
|
||||
+ private static TPSBarTask instance() {
|
||||
+ if (instance == null) {
|
||||
@@ -118,80 +152,141 @@ index 0000000000000000000000000000000000000000..a9d71d2b769b8e4e0f5039e997fc5ebc
|
||||
+ 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;
|
||||
+ this.tps = Math.max(Math.min(Bukkit.getTPS()[0], 20.0D), 0.0D);
|
||||
+ this.mspt = Bukkit.getAverageTickTime();
|
||||
+
|
||||
+ Iterator<Map.Entry<UUID, BossBar>> iter = bossbars.entrySet().iterator();
|
||||
+ while (iter.hasNext()) {
|
||||
+ Map.Entry<UUID, BossBar> entry = iter.next();
|
||||
+ Player player = Bukkit.getPlayer(entry.getKey());
|
||||
+ if (player == null) {
|
||||
+ iter.remove();
|
||||
+ continue;
|
||||
+ }
|
||||
+ updateBossBar(entry.getValue(), player);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ double tps = Bukkit.getTPS()[0];
|
||||
+ if (tps > 20.0D) {
|
||||
+ tps = 20.0D;
|
||||
+ } else if (tps < 0.0D) {
|
||||
+ tps = 0.0D;
|
||||
+ }
|
||||
+ private void updateBossBar(BossBar bossbar, Player player) {
|
||||
+ bossbar.progress(getBossBarProgress());
|
||||
+ bossbar.color(getBossBarColor());
|
||||
+ bossbar.name(MiniMessage.get().parse(PurpurConfig.commandTPSBarTitle,
|
||||
+ Template.of("tps", getTPSColor()),
|
||||
+ Template.of("mspt", getMSPTColor()),
|
||||
+ Template.of("ping", getPingColor(player.getPing()))
|
||||
+ ));
|
||||
+ }
|
||||
+
|
||||
+ 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);
|
||||
+ private float getBossBarProgress() {
|
||||
+ if (PurpurConfig.commandTPSBarProgressFillMode == FillMode.MSPT) {
|
||||
+ return Math.max(Math.min((float) mspt / 50.0F, 1.0F), 0.0F);
|
||||
+ } else {
|
||||
+ tpsColor = "&4";
|
||||
+ bossbar.setColor(BarColor.RED);
|
||||
+ return Math.max(Math.min((float) tps / 20.0F, 1.0F), 0.0F);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ double mspt = Bukkit.getAverageTickTime();
|
||||
+ String msptColor;
|
||||
+ if (mspt < 40) {
|
||||
+ msptColor = "&2";
|
||||
+ } else if (mspt < 50) {
|
||||
+ msptColor = "&e";
|
||||
+ private BossBar.Color getBossBarColor() {
|
||||
+ if (isGood(PurpurConfig.commandTPSBarProgressFillMode)) {
|
||||
+ return PurpurConfig.commandTPSBarProgressColorGood;
|
||||
+ } else if (isMedium(PurpurConfig.commandTPSBarProgressFillMode)) {
|
||||
+ return PurpurConfig.commandTPSBarProgressColorMedium;
|
||||
+ } else {
|
||||
+ msptColor = "&4";
|
||||
+ return PurpurConfig.commandTPSBarProgressColorLow;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ bossbar.setTitle(ChatColor.translateAlternateColorCodes('&', "&eTPS&3: " + tpsColor + String.format("%.2f", tps) + " &eMSPT&3: " + msptColor + String.format("%.3f", mspt)));
|
||||
+ private boolean isGood(FillMode mode) {
|
||||
+ return isGood(mode, 0);
|
||||
+ }
|
||||
+
|
||||
+ private boolean isGood(FillMode mode, int ping) {
|
||||
+ if (mode == FillMode.MSPT) {
|
||||
+ return mspt < 40;
|
||||
+ } else if (mode == FillMode.TPS) {
|
||||
+ return tps >= 19;
|
||||
+ } else if (mode == FillMode.PING) {
|
||||
+ return ping < 100;
|
||||
+ } else {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ private boolean isMedium(FillMode mode) {
|
||||
+ return isMedium(mode, 0);
|
||||
+ }
|
||||
+
|
||||
+ private boolean isMedium(FillMode mode, int ping) {
|
||||
+ if (mode == FillMode.MSPT) {
|
||||
+ return mspt < 50;
|
||||
+ } else if (mode == FillMode.TPS) {
|
||||
+ return tps >= 15;
|
||||
+ } else if (mode == FillMode.PING) {
|
||||
+ return ping < 200;
|
||||
+ } else {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ private Component getTPSColor() {
|
||||
+ String color;
|
||||
+ if (isGood(FillMode.TPS)) {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorGood;
|
||||
+ } else if (isMedium(FillMode.TPS)) {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorMedium;
|
||||
+ } else {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorLow;
|
||||
+ }
|
||||
+ return MiniMessage.get().parse(color, Template.of("text", String.format("%.2f", tps)));
|
||||
+ }
|
||||
+
|
||||
+ private Component getMSPTColor() {
|
||||
+ String color;
|
||||
+ if (isGood(FillMode.MSPT)) {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorGood;
|
||||
+ } else if (isMedium(FillMode.MSPT)) {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorMedium;
|
||||
+ } else {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorLow;
|
||||
+ }
|
||||
+ return MiniMessage.get().parse(color, Template.of("text", String.format("%.2f", mspt)));
|
||||
+ }
|
||||
+
|
||||
+ private Component getPingColor(int ping) {
|
||||
+ String color;
|
||||
+ if (isGood(FillMode.PING, ping)) {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorGood;
|
||||
+ } else if (isMedium(FillMode.PING, ping)) {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorMedium;
|
||||
+ } else {
|
||||
+ color = PurpurConfig.commandTPSBarTextColorLow;
|
||||
+ }
|
||||
+ return MiniMessage.get().parse(color, Template.of("text", String.format("%s", ping)));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void cancel() {
|
||||
+ super.cancel();
|
||||
+ BossBar bossbar = bossbar();
|
||||
+ bossbar.setVisible(false);
|
||||
+ bossbar.removeAll();
|
||||
+ Bukkit.removeBossBar(key);
|
||||
+ this.bossbars.clear();
|
||||
+ }
|
||||
+
|
||||
+ public static void removePlayer(Player player) {
|
||||
+ instance().bossbar().removePlayer(player);
|
||||
+ BossBar bossbar = instance().bossbars.remove(player.getUniqueId());
|
||||
+ if (bossbar != null) {
|
||||
+ player.hideBossBar(bossbar);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public static void togglePlayer(Player player) {
|
||||
+ BossBar bossbar = instance().bossbar();
|
||||
+ if (bossbar.getPlayers().contains(player)) {
|
||||
+ bossbar.removePlayer(player);
|
||||
+ BossBar bossbar = instance().bossbars.remove(player.getUniqueId());
|
||||
+ if (bossbar != null) {
|
||||
+ player.hideBossBar(bossbar);
|
||||
+ } else {
|
||||
+ bossbar.addPlayer(player);
|
||||
+ instance.run();
|
||||
+ bossbar = BossBar.bossBar(Component.text(""), 0.0F, instance().getBossBarColor(), PurpurConfig.commandTPSBarProgressOverlay);
|
||||
+ instance().bossbars.put(player.getUniqueId(), bossbar);
|
||||
+ instance().updateBossBar(bossbar, player);
|
||||
+ player.showBossBar(bossbar);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
@@ -205,4 +300,8 @@ index 0000000000000000000000000000000000000000..a9d71d2b769b8e4e0f5039e997fc5ebc
|
||||
+ instance.cancel();
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public enum FillMode {
|
||||
+ TPS, MSPT, PING
|
||||
+ }
|
||||
+}
|
||||
|
||||
Reference in New Issue
Block a user