aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches-Unmapped/0574-Lazily-track-plugin-scoreboards-by-default.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Spigot-Server-Patches-Unmapped/0574-Lazily-track-plugin-scoreboards-by-default.patch')
-rw-r--r--Spigot-Server-Patches-Unmapped/0574-Lazily-track-plugin-scoreboards-by-default.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/Spigot-Server-Patches-Unmapped/0574-Lazily-track-plugin-scoreboards-by-default.patch b/Spigot-Server-Patches-Unmapped/0574-Lazily-track-plugin-scoreboards-by-default.patch
new file mode 100644
index 0000000000..974e02ca68
--- /dev/null
+++ b/Spigot-Server-Patches-Unmapped/0574-Lazily-track-plugin-scoreboards-by-default.patch
@@ -0,0 +1,102 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Andrew Steinborn <[email protected]>
+Date: Sat, 3 Oct 2020 04:15:09 -0400
+Subject: [PATCH] Lazily track plugin scoreboards by default
+
+On servers with plugins that constantly churn through scoreboards, there is a risk of
+degraded GC performance due to the number of scoreboards held on by weak references.
+Most plugins don't even need the (vanilla) functionality that requires all plugin
+scoreboards to be tracked by the server. Instead, only track scoreboards when an
+objective is added with a non-dummy criteria.
+
+This is a breaking change, however the change is a much more sensible default. In case
+this breaks your workflow you can always force all scoreboards to be tracked with
+settings.track-plugin-scoreboards in paper.yml.
+
+diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
+index 545948f20efd6c8dd42140b565af94cd6b52b661..7d50aded88f5b7dfebaea1aebc86231f7b5c4e25 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
++++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
+@@ -462,4 +462,9 @@ public class PaperConfig {
+ private static void maxJoinsPerTick() {
+ maxJoinsPerTick = getInt("settings.max-joins-per-tick", 3);
+ }
++
++ public static boolean trackPluginScoreboards;
++ private static void trackPluginScoreboards() {
++ trackPluginScoreboards = getBoolean("settings.track-plugin-scoreboards", false);
++ }
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
+index 6ea491f6308317059c4bc6735abbdce370df0f34..3dfb6ad1ed5fae773b88cbe9ad540fd2520b8b50 100644
+--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
++++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
+@@ -19,6 +19,7 @@ import org.bukkit.scoreboard.Team;
+
+ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
+ final Scoreboard board;
++ boolean registeredGlobally = false; // Paper
+
+ CraftScoreboard(Scoreboard board) {
+ this.board = board;
+@@ -45,6 +46,12 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
+ Validate.isTrue(name.length() <= 16, "The name '" + name + "' is longer than the limit of 16 characters");
+ Validate.isTrue(board.getObjective(name) == null, "An objective of name '" + name + "' already exists");
+ CraftCriteria craftCriteria = CraftCriteria.getFromBukkit(criteria);
++ // Paper start - the block comment from the old registerNewObjective didnt cause a conflict when rebasing, so this block wasn't added to the adventure registerNewObjective
++ if (craftCriteria.criteria != net.minecraft.world.scores.criteria.IScoreboardCriteria.DUMMY && !registeredGlobally) {
++ net.minecraft.server.MinecraftServer.getServer().server.getScoreboardManager().registerScoreboardForVanilla(this);
++ registeredGlobally = true;
++ }
++ // Paper end
+ ScoreboardObjective objective = board.registerObjective(name, craftCriteria.criteria, io.papermc.paper.adventure.PaperAdventure.asVanilla(displayName), CraftScoreboardTranslations.fromBukkitRender(renderType));
+ return new CraftObjective(this, objective);
+ }
+@@ -66,6 +73,12 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
+ Validate.isTrue(board.getObjective(name) == null, "An objective of name '" + name + "' already exists");
+
+ CraftCriteria craftCriteria = CraftCriteria.getFromBukkit(criteria);
++ // Paper start
++ if (craftCriteria.criteria != net.minecraft.server.IScoreboardCriteria.DUMMY && !registeredGlobally) {
++ net.minecraft.server.MinecraftServer.getServer().server.getScoreboardManager().registerScoreboardForVanilla(this);
++ registeredGlobally = true;
++ }
++ // Paper end
+ ScoreboardObjective objective = board.registerObjective(name, craftCriteria.criteria, CraftChatMessage.fromStringOrNull(displayName), CraftScoreboardTranslations.fromBukkitRender(renderType));
+ return new CraftObjective(this, objective);*/ // Paper
+ return registerNewObjective(name, criteria, io.papermc.paper.adventure.PaperAdventure.LEGACY_SECTION_UXRC.deserialize(displayName), renderType); // Paper
+diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
+index 73663bcea163cda26f531902141a9ad3ad7eba57..9c30a79cc55c6455aa18e3798728deaacc3434ca 100644
+--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
++++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
+@@ -30,6 +30,7 @@ public final class CraftScoreboardManager implements ScoreboardManager {
+
+ public CraftScoreboardManager(MinecraftServer minecraftserver, net.minecraft.world.scores.Scoreboard scoreboardServer) {
+ mainScoreboard = new CraftScoreboard(scoreboardServer);
++ mainScoreboard.registeredGlobally = true; // Paper
+ server = minecraftserver;
+ scoreboards.add(mainScoreboard);
+ }
+@@ -43,10 +44,22 @@ public final class CraftScoreboardManager implements ScoreboardManager {
+ public CraftScoreboard getNewScoreboard() {
+ org.spigotmc.AsyncCatcher.catchOp("scoreboard creation"); // Spigot
+ CraftScoreboard scoreboard = new CraftScoreboard(new ScoreboardServer(server));
++ // Paper start
++ if (com.destroystokyo.paper.PaperConfig.trackPluginScoreboards) {
++ scoreboard.registeredGlobally = true;
+ scoreboards.add(scoreboard);
++ }
++ // Paper end
+ return scoreboard;
+ }
+
++ // Paper start
++ public void registerScoreboardForVanilla(CraftScoreboard scoreboard) {
++ org.spigotmc.AsyncCatcher.catchOp("scoreboard registration");
++ scoreboards.add(scoreboard);
++ }
++ // Paper end
++
+ // CraftBukkit method
+ public CraftScoreboard getPlayerBoard(CraftPlayer player) {
+ CraftScoreboard board = playerBoards.get(player);