mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: 7232d8f2a EntityLoadCrossbowEvent#shouldConsumeItem 4740bd6c8 Mark PlayerInventory#getItem as nullable bd9ace578 Add a config option to limit the number of entities of each type to load/save in a chunk (#4792) 6bafeb5a9 Move logic from last patch into correct place 9668118fd disable entity ticking flag after watchdog obliteration
197 lines
7.4 KiB
Diff
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 37b7051e9fde2f0af9216dc5a755f74ec23bb1bd..72df524d83139a7bf3c79fe5e403290fc457e12d 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<TickTas
|
|
this.serverConnection.acceptConnections();
|
|
// CraftBukkit end
|
|
|
|
+ net.pl3x.purpur.task.TPSBarTask.start(); // Purpur
|
|
}
|
|
|
|
protected void updateWorldSettings() {}
|
|
@@ -861,6 +862,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 2f1a2fa1f80ed23c67db1d01023a04b5074d1654..ebbbd6f86cd08d84c37c8550eda1b805fe966bc3 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();
|
|
+ }
|
|
+ }
|
|
+}
|