diff --git a/README.md b/README.md index 82697327..1e4b84ed 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 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 a3467e21..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,13 +59,32 @@ public TeamDisplayImpl(@NotNull ScoreboardTeamImpl team) { @Override public boolean addEntry(@NotNull String entry) { - if (!entries.contains(entry)) { - entries.add(entry); - team.teamManager().taskQueue().add(new TeamManagerTask.AddEntries(this, Collections.singleton(entry))); - return true; + for (Player viewer : players) { + for (ScoreboardTeam otherTeam : team.teamManager().teams()) { + if (otherTeam == team) continue; + + TeamDisplay otherDisplay = otherTeam.display(viewer); + if (otherDisplay.entries().contains(entry)) { + otherDisplay.removeEntry(entry); + } + } } - return false; + 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); + } + } + } + + entries.add(entry); + team.teamManager().taskQueue().add(new TeamManagerTask.AddEntries(this, Collections.singleton(entry))); + return true; + } @Override