From 77b8f5f0eb1ef59b7fbe124f471b984521c4cc79 Mon Sep 17 00:00:00 2001 From: ILikePtatoes Date: Tue, 3 Jun 2025 02:54:38 +1000 Subject: [PATCH 1/3] Fix Network Protocol Error when calling addEntry() and player is on another team --- .../implementation/team/TeamDisplayImpl.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java b/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java index 35e9e3bf..f382dcd6 100644 --- a/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java +++ b/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java @@ -58,9 +58,25 @@ public TeamDisplayImpl(@NotNull ScoreboardTeamImpl team) { @Override public boolean addEntry(@NotNull String entry) { + for (ScoreboardTeam otherTeam : team.teamManager().teams()) { + TeamDisplay defaultDisp = otherTeam.defaultDisplay(); + if (defaultDisp.entries().contains(entry)) { + defaultDisp.removeEntry(entry); + } + + for (Player p : Bukkit.getOnlinePlayers()) { + TeamDisplay playerDisp = otherTeam.display(p); + if (playerDisp != defaultDisp && playerDisp.entries().contains(entry)) { + playerDisp.removeEntry(entry); + } + } + } + if (!entries.contains(entry)) { entries.add(entry); - team.teamManager().taskQueue().add(new TeamManagerTask.AddEntries(this, Collections.singleton(entry))); + team.teamManager() + .taskQueue() + .add(new TeamManagerTask.AddEntries(this, Collections.singleton(entry))); return true; } From 6b7a587e31d8c56298f4761e30950642ed7165df Mon Sep 17 00:00:00 2001 From: ILikePtatoes <120761998+ILikePtatoes@users.noreply.github.com> Date: Tue, 3 Jun 2025 02:57:53 +1000 Subject: [PATCH 2/3] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index fe56903b..f38bdb40 100644 --- a/README.md +++ b/README.md @@ -253,6 +253,10 @@ teamDisplay.displayName(Component.text("Team Display Name")); teamDisplay.prefix(Component.text("[Prefix] ")); teamDisplay.suffix(Component.text(" [Suffix]")); teamDisplay.playerColor(NamedTextColor.RED); + +// Due to internal Minecraft limitations, a player can only be assigned to one team at a time. +// To prevent client crashes, calling addEntry() will remove the player from any +// other teams they are on. teamDisplay.addEntry(player.getName()); teamManager.addPlayer(player); // Player will be added to the default TeamDisplay of each ScoreboardTeam From 8c885356a99557fbd74e94181853dde637b581fa Mon Sep 17 00:00:00 2001 From: ILikePtatoes Date: Sat, 19 Jul 2025 15:17:21 +1000 Subject: [PATCH 3/3] Clean up commit --- .../implementation/team/TeamDisplayImpl.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java b/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java index 67a6c612..15e993af 100644 --- a/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java +++ b/implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/team/TeamDisplayImpl.java @@ -13,6 +13,7 @@ import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType; import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.EntriesPacketType; import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamDisplayPacketAdapter; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -58,29 +59,32 @@ public TeamDisplayImpl(@NotNull ScoreboardTeamImpl team) { @Override public boolean addEntry(@NotNull String entry) { - for (ScoreboardTeam otherTeam : team.teamManager().teams()) { - TeamDisplay defaultDisp = otherTeam.defaultDisplay(); - if (defaultDisp.entries().contains(entry)) { - defaultDisp.removeEntry(entry); - } + for (Player viewer : players) { + for (ScoreboardTeam otherTeam : team.teamManager().teams()) { + if (otherTeam == team) continue; - for (Player p : Bukkit.getOnlinePlayers()) { - TeamDisplay playerDisp = otherTeam.display(p); - if (playerDisp != defaultDisp && playerDisp.entries().contains(entry)) { - playerDisp.removeEntry(entry); + TeamDisplay otherDisplay = otherTeam.display(viewer); + if (otherDisplay.entries().contains(entry)) { + otherDisplay.removeEntry(entry); } } } - if (!entries.contains(entry)) { - entries.add(entry); - team.teamManager() - .taskQueue() - .add(new TeamManagerTask.AddEntries(this, Collections.singleton(entry))); - return true; + if (players.isEmpty()) { + for (ScoreboardTeam otherTeam : team.teamManager().teams()) { + if (otherTeam == team) continue; + + TeamDisplay defaultDisplay = otherTeam.defaultDisplay(); + if (defaultDisplay.entries().contains(entry)) { + defaultDisplay.removeEntry(entry); + } + } } - return false; + entries.add(entry); + team.teamManager().taskQueue().add(new TeamManagerTask.AddEntries(this, Collections.singleton(entry))); + return true; + } @Override