From 47cd87803c7c76a22fe04385b7b860ca7a0c6477 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 24 Jul 2021 00:31:22 -0500 Subject: [PATCH] Add compass command --- patches/server/0141-Implement-TPSBar.patch | 237 +++++++++++------- patches/server/0236-Add-compass-command.patch | 206 +++++++++++++++ 2 files changed, 348 insertions(+), 95 deletions(-) create mode 100644 patches/server/0236-Add-compass-command.patch diff --git a/patches/server/0141-Implement-TPSBar.patch b/patches/server/0141-Implement-TPSBar.patch index 9ee92471b..54eaf168d 100644 --- a/patches/server/0141-Implement-TPSBar.patch +++ b/patches/server/0141-Implement-TPSBar.patch @@ -17,26 +17,26 @@ index a5712108fbbe5ddc61cdfd390f667ab013ba609d..73953ea69776bfe1dcb1504cd14a0f00 if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 214b25f57f15e2127b92ec88117c36d4b2096477..652e596c37bf8d865c954b31ad7d2562b9e95c46 100644 +index 214b25f57f15e2127b92ec88117c36d4b2096477..fbb0840010443facb66b8e538c4fde035704896e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1119,6 +1119,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop dispatcher) { + dispatcher.register(Commands.literal("tpsbar") + .requires(listener -> listener.hasPermission(2)) -+ .executes(context -> execute(context.getSource(), context.getSource().getPlayerOrException())) ++ .executes(context -> { ++ ServerPlayer player = context.getSource().getPlayerOrException(); ++ boolean result = TPSBarTask.instance().togglePlayer(player.getBukkitEntity()); ++ player.tpsBar(result); ++ return 1; ++ }) + ).setPermission("bukkit.command.tpsbar"); + } -+ -+ private static int execute(CommandSourceStack source, ServerPlayer player) { -+ if (player != null) { -+ boolean result = TPSBarTask.togglePlayer(player.getBukkitEntity()); -+ player.tpsBar(result); -+ 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 +diff --git a/src/main/java/net/pl3x/purpur/task/BossBarTask.java b/src/main/java/net/pl3x/purpur/task/BossBarTask.java new file mode 100644 -index 0000000000000000000000000000000000000000..b81a0e3b54d2e2261069dc282aea412ab0840eec +index 0000000000000000000000000000000000000000..1f55902eb8367b4d980a66f23ac2b57709ae78cf --- /dev/null -+++ b/src/main/java/net/pl3x/purpur/task/TPSBarTask.java -@@ -0,0 +1,202 @@ ++++ b/src/main/java/net/pl3x/purpur/task/BossBarTask.java +@@ -0,0 +1,105 @@ +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 net.minecraft.server.level.ServerPlayer; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.scheduler.MinecraftInternalPlugin; +import org.bukkit.entity.Player; @@ -193,30 +186,16 @@ index 0000000000000000000000000000000000000000..b81a0e3b54d2e2261069dc282aea412a +import java.util.Map; +import java.util.UUID; + -+public class TPSBarTask extends BukkitRunnable { -+ private static TPSBarTask instance; ++public abstract class BossBarTask extends BukkitRunnable { + private final Map bossbars = new HashMap<>(); -+ private double tps = 20.0D; -+ private double mspt = 0.0D; -+ private int tick = 0; ++ private boolean started; + -+ private static TPSBarTask instance() { -+ if (instance == null) { -+ instance = new TPSBarTask(); -+ } -+ return instance; -+ } ++ abstract BossBar createBossBar(); ++ ++ abstract void updateBossBar(BossBar bossbar, Player player); + + @Override + public void run() { -+ if (++tick < PurpurConfig.commandTPSBarTickInterval) { -+ return; -+ } -+ tick = 0; -+ -+ this.tps = Math.max(Math.min(Bukkit.getTPS()[0], 20.0D), 0.0D); -+ this.mspt = Bukkit.getAverageTickTime(); -+ + Iterator> iter = bossbars.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); @@ -229,7 +208,110 @@ index 0000000000000000000000000000000000000000..b81a0e3b54d2e2261069dc282aea412a + } + } + -+ private void updateBossBar(BossBar bossbar, Player player) { ++ @Override ++ public void cancel() { ++ super.cancel(); ++ new HashSet<>(this.bossbars.keySet()).forEach(uuid -> { ++ Player player = Bukkit.getPlayer(uuid); ++ if (player != null) { ++ removePlayer(player); ++ } ++ }); ++ this.bossbars.clear(); ++ } ++ ++ public boolean removePlayer(Player player) { ++ BossBar bossbar = this.bossbars.remove(player.getUniqueId()); ++ if (bossbar != null) { ++ player.hideBossBar(bossbar); ++ return true; ++ } ++ return false; ++ } ++ ++ public void addPlayer(Player player) { ++ removePlayer(player); ++ BossBar bossbar = createBossBar(); ++ this.bossbars.put(player.getUniqueId(), bossbar); ++ this.updateBossBar(bossbar, player); ++ player.showBossBar(bossbar); ++ } ++ ++ public boolean togglePlayer(Player player) { ++ if (removePlayer(player)) { ++ return false; ++ } ++ addPlayer(player); ++ return true; ++ } ++ ++ public void start() { ++ stop(); ++ this.runTaskTimerAsynchronously(new MinecraftInternalPlugin(), 1, 1); ++ started = true; ++ } ++ ++ public void stop() { ++ if (started) { ++ cancel(); ++ } ++ } ++ ++ public static void startAll() { ++ TPSBarTask.instance().start(); ++ } ++ ++ public static void stopAll() { ++ TPSBarTask.instance().stop(); ++ } ++ ++ public static void addToAll(ServerPlayer player) { ++ Player bukkit = player.getBukkitEntity(); ++ if (player.tpsBar()) { ++ TPSBarTask.instance().addPlayer(bukkit); ++ } ++ } ++ ++ public static void removeFromAll(Player player) { ++ TPSBarTask.instance().removePlayer(player); ++ } ++} +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..cafb140ff57e5697d7c3705ff9be6411c0ad82d9 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/task/TPSBarTask.java +@@ -0,0 +1,142 @@ ++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.entity.Player; ++ ++public class TPSBarTask extends BossBarTask { ++ private static TPSBarTask instance; ++ private double tps = 20.0D; ++ private double mspt = 0.0D; ++ private int tick = 0; ++ ++ public static TPSBarTask instance() { ++ if (instance == null) { ++ instance = new TPSBarTask(); ++ } ++ return instance; ++ } ++ ++ @Override ++ BossBar createBossBar() { ++ return BossBar.bossBar(Component.text(""), 0.0F, instance().getBossBarColor(), PurpurConfig.commandTPSBarProgressOverlay); ++ } ++ ++ @Override ++ void updateBossBar(BossBar bossbar, Player player) { + bossbar.progress(getBossBarProgress()); + bossbar.color(getBossBarColor()); + bossbar.name(MiniMessage.get().parse(PurpurConfig.commandTPSBarTitle, @@ -239,6 +321,19 @@ index 0000000000000000000000000000000000000000..b81a0e3b54d2e2261069dc282aea412a + )); + } + ++ @Override ++ public void run() { ++ if (++tick < PurpurConfig.commandTPSBarTickInterval) { ++ return; ++ } ++ tick = 0; ++ ++ this.tps = Math.max(Math.min(Bukkit.getTPS()[0], 20.0D), 0.0D); ++ this.mspt = Bukkit.getAverageTickTime(); ++ ++ super.run(); ++ } ++ + private float getBossBarProgress() { + if (PurpurConfig.commandTPSBarProgressFillMode == FillMode.MSPT) { + return Math.max(Math.min((float) mspt / 50.0F, 1.0F), 0.0F); @@ -325,54 +420,6 @@ index 0000000000000000000000000000000000000000..b81a0e3b54d2e2261069dc282aea412a + return MiniMessage.get().parse(color, Template.of("text", String.format("%s", ping))); + } + -+ @Override -+ public void cancel() { -+ super.cancel(); -+ new HashSet<>(this.bossbars.keySet()).forEach(uuid -> { -+ Player player = Bukkit.getPlayer(uuid); -+ if (player != null) { -+ removePlayer(player); -+ } -+ }); -+ this.bossbars.clear(); -+ } -+ -+ public static boolean removePlayer(Player player) { -+ BossBar bossbar = instance().bossbars.remove(player.getUniqueId()); -+ if (bossbar != null) { -+ player.hideBossBar(bossbar); -+ return true; -+ } -+ return false; -+ } -+ -+ public static void addPlayer(Player player) { -+ removePlayer(player); -+ BossBar bossbar = BossBar.bossBar(Component.text(""), 0.0F, instance().getBossBarColor(), PurpurConfig.commandTPSBarProgressOverlay); -+ instance().bossbars.put(player.getUniqueId(), bossbar); -+ instance().updateBossBar(bossbar, player); -+ player.showBossBar(bossbar); -+ } -+ -+ public static boolean togglePlayer(Player player) { -+ if (removePlayer(player)) { -+ return false; -+ } -+ addPlayer(player); -+ return true; -+ } -+ -+ public static void start() { -+ stop(); -+ instance().runTaskTimerAsynchronously(new MinecraftInternalPlugin(), 1, 1); -+ } -+ -+ public static void stop() { -+ if (instance != null) { -+ instance.cancel(); -+ } -+ } -+ + public enum FillMode { + TPS, MSPT, PING + } diff --git a/patches/server/0236-Add-compass-command.patch b/patches/server/0236-Add-compass-command.patch new file mode 100644 index 000000000..a749d1ef3 --- /dev/null +++ b/patches/server/0236-Add-compass-command.patch @@ -0,0 +1,206 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sat, 24 Jul 2021 00:07:31 -0500 +Subject: [PATCH] Add compass command + + +diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java +index 528fd87ae1c1c01e13885d88fc8056b0f932fb61..bfad241892b8280d261ab8301245b91b5403b51a 100644 +--- a/src/main/java/net/minecraft/commands/Commands.java ++++ b/src/main/java/net/minecraft/commands/Commands.java +@@ -203,6 +203,7 @@ public class Commands { + net.pl3x.purpur.command.PingCommand.register(this.dispatcher); // Purpur + net.pl3x.purpur.command.UptimeCommand.register(this.dispatcher); // Purpur + net.pl3x.purpur.command.TPSBarCommand.register(this.dispatcher); // Purpur ++ net.pl3x.purpur.command.CompassCommand.register(this.dispatcher); // Purpur + } + + if (environment.includeIntegrated) { +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index cd26d6c8ba2d5d6b3b56e484e6e642ab646341e1..11786d686ed1734f8f41f6127b3499cb094ab528 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -260,6 +260,7 @@ public class ServerPlayer extends Player { + public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper + public boolean acceptingResourcePack = false; // Purpur + private boolean tpsBar = false; // Purpur ++ private boolean compassBar = false; // Purpur + + public double lastEntitySpawnRadiusSquared; // Paper - optimise isOutsideRange, this field is in blocks + public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet cachedSingleHashSet; // Paper +@@ -483,6 +484,7 @@ public class ServerPlayer extends Player { + } + + if (nbt.contains("Purpur.TPSBar")) { this.tpsBar = nbt.getBoolean("Purpur.TPSBar"); } // Purpur ++ if (nbt.contains("Purpur.CompassBar")) { this.compassBar = nbt.getBoolean("Purpur.CompassBar"); } // Purpur + } + + @Override +@@ -544,6 +546,7 @@ public class ServerPlayer extends Player { + this.getBukkitEntity().setExtraData(nbt); // CraftBukkit + + nbt.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur ++ nbt.putBoolean("Purpur.CompassBar", this.compassBar); // Purpur + } + + // CraftBukkit start - World fallback code, either respawn location or global spawn +@@ -2532,5 +2535,13 @@ public class ServerPlayer extends Player { + public void tpsBar(boolean tpsBar) { + this.tpsBar = tpsBar; + } ++ ++ public boolean compassBar() { ++ return this.compassBar; ++ } ++ ++ public void compassBar(boolean compassBar) { ++ this.compassBar = compassBar; ++ } + // Purpur end + } +diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java +index 8244f362f551ed2bdef4df8e6b83cb176b4a4e59..2fd0c87b31d2f7ca939a6212c68008232baafbe2 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java +@@ -362,6 +362,11 @@ public class PurpurConfig { + public static String commandTPSBarTextColorMedium = ""; + public static String commandTPSBarTextColorLow = ""; + public static int commandTPSBarTickInterval = 20; ++ public static String commandCompassBarTitle = "S \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 SW \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 W \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 NW \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 N \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 NE \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 E \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 SE \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 S \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 SW \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 W \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 NW \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 N \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 NE \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 E \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 SE \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 \u25C8 \u00B7 "; ++ public static BossBar.Overlay commandCompassBarProgressOverlay = BossBar.Overlay.PROGRESS; ++ public static BossBar.Color commandCompassBarProgressColor = BossBar.Color.BLUE; ++ public static float commandCompassBarProgressPercent = 1.0F; ++ public static int commandCompassBarTickInterval = 5; + public static boolean commandGamemodeRequiresPermission = false; + public static boolean hideHiddenPlayersFromEntitySelector = false; + public static String uptimeFormat = ""; +@@ -384,6 +389,13 @@ public class PurpurConfig { + commandTPSBarTextColorMedium = getString("settings.command.tpsbar.text-color.medium", commandTPSBarTextColorMedium); + commandTPSBarTextColorLow = getString("settings.command.tpsbar.text-color.low", commandTPSBarTextColorLow); + commandTPSBarTickInterval = getInt("settings.command.tpsbar.tick-interval", commandTPSBarTickInterval); ++ ++ commandCompassBarTitle = getString("settings.command.compass.title", commandCompassBarTitle); ++ commandCompassBarProgressOverlay = BossBar.Overlay.valueOf(getString("settings.command.compass.overlay", commandCompassBarProgressOverlay.name())); ++ commandCompassBarProgressColor = BossBar.Color.valueOf(getString("settings.command.compass.progress-color.good", commandCompassBarProgressColor.name())); ++ commandCompassBarProgressPercent = (float) getDouble("settings.command.compass.percent", commandCompassBarProgressPercent); ++ commandCompassBarTickInterval = getInt("settings.command.compass.tick-interval", commandCompassBarTickInterval); ++ + commandGamemodeRequiresPermission = getBoolean("settings.command.gamemode.requires-specific-permission", commandGamemodeRequiresPermission); + hideHiddenPlayersFromEntitySelector = getBoolean("settings.command.hide-hidden-players-from-entity-selector", hideHiddenPlayersFromEntitySelector); + uptimeFormat = getString("settings.command.uptime.format", uptimeFormat); +diff --git a/src/main/java/net/pl3x/purpur/command/CompassCommand.java b/src/main/java/net/pl3x/purpur/command/CompassCommand.java +new file mode 100644 +index 0000000000000000000000000000000000000000..5381dfa162dae02c93afcf28d7c6dfb2170ab175 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/command/CompassCommand.java +@@ -0,0 +1,21 @@ ++package net.pl3x.purpur.command; ++ ++import com.mojang.brigadier.CommandDispatcher; ++import net.minecraft.commands.CommandSourceStack; ++import net.minecraft.commands.Commands; ++import net.minecraft.server.level.ServerPlayer; ++import net.pl3x.purpur.task.CompassTask; ++ ++public class CompassCommand { ++ public static void register(CommandDispatcher dispatcher) { ++ dispatcher.register(Commands.literal("compass") ++ .requires(listener -> listener.hasPermission(2)) ++ .executes(context -> { ++ ServerPlayer player = context.getSource().getPlayerOrException(); ++ boolean result = CompassTask.instance().togglePlayer(player.getBukkitEntity()); ++ player.compassBar(result); ++ return 1; ++ }) ++ ).setPermission("bukkit.command.compass"); ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/task/BossBarTask.java b/src/main/java/net/pl3x/purpur/task/BossBarTask.java +index 1f55902eb8367b4d980a66f23ac2b57709ae78cf..173805ec9beae96a120d3501d1cf597c93aa6bd9 100644 +--- a/src/main/java/net/pl3x/purpur/task/BossBarTask.java ++++ b/src/main/java/net/pl3x/purpur/task/BossBarTask.java +@@ -86,10 +86,12 @@ public abstract class BossBarTask extends BukkitRunnable { + + public static void startAll() { + TPSBarTask.instance().start(); ++ CompassTask.instance().start(); + } + + public static void stopAll() { + TPSBarTask.instance().stop(); ++ CompassTask.instance().stop(); + } + + public static void addToAll(ServerPlayer player) { +@@ -97,9 +99,13 @@ public abstract class BossBarTask extends BukkitRunnable { + if (player.tpsBar()) { + TPSBarTask.instance().addPlayer(bukkit); + } ++ if (player.compassBar()) { ++ CompassTask.instance().addPlayer(bukkit); ++ } + } + + public static void removeFromAll(Player player) { + TPSBarTask.instance().removePlayer(player); ++ CompassTask.instance().removePlayer(player); + } + } +diff --git a/src/main/java/net/pl3x/purpur/task/CompassTask.java b/src/main/java/net/pl3x/purpur/task/CompassTask.java +new file mode 100644 +index 0000000000000000000000000000000000000000..556ac7b6127a3827b686627364a7db9c853a2abd +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/task/CompassTask.java +@@ -0,0 +1,52 @@ ++package net.pl3x.purpur.task; ++ ++import net.kyori.adventure.bossbar.BossBar; ++import net.kyori.adventure.text.Component; ++import net.pl3x.purpur.PurpurConfig; ++import org.bukkit.entity.Player; ++ ++public class CompassTask extends BossBarTask { ++ private static CompassTask instance; ++ ++ private int tick = 0; ++ ++ public static CompassTask instance() { ++ if (instance == null) { ++ instance = new CompassTask(); ++ } ++ return instance; ++ } ++ ++ @Override ++ public void run() { ++ if (++tick < PurpurConfig.commandCompassBarTickInterval) { ++ return; ++ } ++ tick = 0; ++ ++ super.run(); ++ } ++ ++ @Override ++ BossBar createBossBar() { ++ return BossBar.bossBar(Component.text(""), PurpurConfig.commandCompassBarProgressPercent, PurpurConfig.commandCompassBarProgressColor, PurpurConfig.commandCompassBarProgressOverlay); ++ } ++ ++ @Override ++ void updateBossBar(BossBar bossbar, Player player) { ++ float yaw = player.getLocation().getYaw(); ++ int length = PurpurConfig.commandCompassBarTitle.length(); ++ int pos = (int) ((normalize(yaw) * (length / 720F)) + (length / 2F)); ++ bossbar.name(Component.text(PurpurConfig.commandCompassBarTitle.substring(pos - 25, pos + 25))); ++ } ++ ++ private float normalize(float yaw) { ++ while (yaw < -180.0F) { ++ yaw += 360.0F; ++ } ++ while (yaw > 180.0F) { ++ yaw -= 360.0F; ++ } ++ return yaw; ++ } ++}