diff --git a/main/src/main/java/net/citizensnpcs/EventListen.java b/main/src/main/java/net/citizensnpcs/EventListen.java index 646fe6c2e..c6c4472a7 100644 --- a/main/src/main/java/net/citizensnpcs/EventListen.java +++ b/main/src/main/java/net/citizensnpcs/EventListen.java @@ -482,18 +482,8 @@ public class EventListen implements Listener { public void onPlayerJoin(PlayerJoinEvent event) { skinUpdateTracker.updatePlayer(event.getPlayer(), 6 * 20, true); - if (Setting.USE_SCOREBOARD_TEAMS.asBoolean()) { - for (NPC npc : getAllNPCs()) { - if (!(npc.getEntity() instanceof Player)) { - continue; - } - String teamName = npc.data().get(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, ""); - Team team = null; - if (teamName.length() == 0 || (team = Bukkit.getScoreboardManager().getMainScoreboard().getTeam(teamName)) == null) - continue; - - NMS.sendTeamPacket(event.getPlayer(), team); - } + if (Setting.USE_SCOREBOARD_TEAMS.asBoolean() && !Util.isPlayerMainScoreboard(event.getPlayer())) { + Util.sendAllNpcTeamsTo(event.getPlayer(), 0); } } diff --git a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java index 036f26742..d32a57ed5 100644 --- a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java @@ -4,9 +4,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.entity.Player; import org.bukkit.scoreboard.Team; import org.bukkit.scoreboard.Team.Option; import org.bukkit.scoreboard.Team.OptionStatus; @@ -92,9 +90,7 @@ public class ScoreboardTrait extends Trait { } } } - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 2); } public void removeTag(String tag) { diff --git a/main/src/main/java/net/citizensnpcs/util/NMS.java b/main/src/main/java/net/citizensnpcs/util/NMS.java index cb54a8478..907e115ad 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMS.java +++ b/main/src/main/java/net/citizensnpcs/util/NMS.java @@ -366,8 +366,8 @@ public class NMS { BRIDGE.sendTabListRemove(recipient, listPlayer); } - public static void sendTeamPacket(Player recipient, Team team) { - BRIDGE.sendTeamPacket(recipient, team); + public static void sendTeamPacket(Player recipient, Team team, int mode) { + BRIDGE.sendTeamPacket(recipient, team, mode); } public static void setBodyYaw(Entity entity, float yaw) { diff --git a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java index 35f40ea31..1abf45eb1 100644 --- a/main/src/main/java/net/citizensnpcs/util/NMSBridge.java +++ b/main/src/main/java/net/citizensnpcs/util/NMSBridge.java @@ -119,7 +119,7 @@ public interface NMSBridge { public void sendTabListRemove(Player recipient, Player listPlayer); - public void sendTeamPacket(Player recipient, Team team); + public void sendTeamPacket(Player recipient, Team team, int mode); public void setBodyYaw(Entity entity, float yaw); diff --git a/main/src/main/java/net/citizensnpcs/util/PlayerUpdateTask.java b/main/src/main/java/net/citizensnpcs/util/PlayerUpdateTask.java index 260b7802a..ca611e816 100644 --- a/main/src/main/java/net/citizensnpcs/util/PlayerUpdateTask.java +++ b/main/src/main/java/net/citizensnpcs/util/PlayerUpdateTask.java @@ -64,6 +64,10 @@ public class PlayerUpdateTask extends BukkitRunnable { PLAYERS.put(entity.getUniqueId(), (Player) entity); } + public static Iterable getRegisteredPlayerNPCs() { + return PLAYERS.values(); + } + private static Map PLAYERS = new HashMap(); private static Map TICKERS = new HashMap(); private static List TICKERS_PENDING_ADD = new ArrayList(); diff --git a/main/src/main/java/net/citizensnpcs/util/Util.java b/main/src/main/java/net/citizensnpcs/util/Util.java index 6716d9076..fef05461f 100644 --- a/main/src/main/java/net/citizensnpcs/util/Util.java +++ b/main/src/main/java/net/citizensnpcs/util/Util.java @@ -4,6 +4,7 @@ import java.util.EnumSet; import java.util.Random; import java.util.Set; import java.util.regex.Pattern; +import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -15,15 +16,18 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scoreboard.Team; import org.bukkit.util.Vector; import com.google.common.base.Joiner; import com.google.common.base.Splitter; +import com.google.common.collect.Sets; import net.citizensnpcs.api.event.NPCCollisionEvent; import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.util.SpigotUtil; +import net.citizensnpcs.npc.ai.NPCHolder; public class Util { // Static class for small (emphasis small) utility methods @@ -270,6 +274,48 @@ public class Util { return new String[] { name, prefix, suffix }; } + public static boolean isPlayerMainScoreboard(Player player) { + boolean isOnMain = player.getScoreboard().equals(Bukkit.getScoreboardManager().getMainScoreboard()); + if (isOnMain) { + playersOnMainScoreboard.add(player.getUniqueId()); + } + else { + playersOnMainScoreboard.remove(player.getUniqueId()); + } + return isOnMain; + } + + public static void sendAllNpcTeamsTo(Player player, int mode) { + for (Player npcPlayer : PlayerUpdateTask.getRegisteredPlayerNPCs()) { + NPC npc = ((NPCHolder) npcPlayer).getNPC(); + + String teamName = npc.data().get(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, ""); + Team team = null; + if (teamName.length() == 0 || (team = Bukkit.getScoreboardManager().getMainScoreboard().getTeam(teamName)) == null) + continue; + + NMS.sendTeamPacket(player, team, mode); + } + } + + /** + * @param mode 0 for create, 1 for remove, 2 for update + */ + public static void sendTeamPacketToAll(Team team, int mode) { + for (Player player : Bukkit.getOnlinePlayers()) { + boolean wasOnMain = playersOnMainScoreboard.contains(player.getUniqueId()); + if (!isPlayerMainScoreboard(player)) { + if (wasOnMain) { + sendAllNpcTeamsTo(player, 0); + } + else { + NMS.sendTeamPacket(player, team, mode); + } + } + } + } + + private static final Set playersOnMainScoreboard = Sets.newHashSet(); private static final Location AT_LOCATION = new Location(null, 0, 0, 0); private static String MINECRAFT_REVISION; private static final Pattern NON_ALPHABET_MATCHER = Pattern.compile(".*[^A-Za-z0-9_].*"); diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/HumanController.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/HumanController.java index 81b41f8d0..65ae012a1 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/HumanController.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/HumanController.java @@ -84,9 +84,7 @@ public class HumanController extends AbstractEntityController { handle.getNPC().data().set(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, teamName); - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 0); } } }, 20); @@ -115,6 +113,7 @@ public class HumanController extends AbstractEntityController { team.setSuffix(""); } team.removePlayer(entity); + Util.sendTeamPacketToAll(team, 1); } } NMS.removeFromWorld(entity); diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java index 2ab9c98be..203e03a00 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java @@ -861,7 +861,7 @@ public class NMSImpl implements NMSBridge { } @Override - public void sendTeamPacket(Player recipient, Team team) { + public void sendTeamPacket(Player recipient, Team team, int mode) { Preconditions.checkNotNull(recipient); Preconditions.checkNotNull(team); @@ -871,7 +871,7 @@ public class NMSImpl implements NMSBridge { try { ScoreboardTeam nmsTeam = (ScoreboardTeam) TEAM_FIELD.invoke(team); - sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, 0)); + sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, mode)); } catch (Throwable e) { e.printStackTrace(); } diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/HumanController.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/HumanController.java index 1da076f8d..c85d7df9d 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/HumanController.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/HumanController.java @@ -84,9 +84,7 @@ public class HumanController extends AbstractEntityController { handle.getNPC().data().set(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, teamName); - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 0); } } }, 20); @@ -115,6 +113,7 @@ public class HumanController extends AbstractEntityController { team.setSuffix(""); } team.removePlayer(entity); + Util.sendTeamPacketToAll(team, 1); } } NMS.removeFromWorld(entity); diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java index fb1b84526..e7f0720cb 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java @@ -928,7 +928,7 @@ public class NMSImpl implements NMSBridge { } @Override - public void sendTeamPacket(Player recipient, Team team) { + public void sendTeamPacket(Player recipient, Team team, int mode) { Preconditions.checkNotNull(recipient); Preconditions.checkNotNull(team); @@ -938,7 +938,7 @@ public class NMSImpl implements NMSBridge { try { ScoreboardTeam nmsTeam = (ScoreboardTeam) TEAM_FIELD.invoke(team); - sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, 0)); + sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, mode)); } catch (Throwable e) { e.printStackTrace(); } diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/HumanController.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/HumanController.java index a5efbdb85..c4df534f4 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/HumanController.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/HumanController.java @@ -84,9 +84,7 @@ public class HumanController extends AbstractEntityController { handle.getNPC().data().set(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, teamName); - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 0); } } }, 20); @@ -115,6 +113,7 @@ public class HumanController extends AbstractEntityController { team.setSuffix(""); } team.removePlayer(entity); + Util.sendTeamPacketToAll(team, 1); } } NMS.removeFromWorld(entity); diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java index 4c01b6a26..752b017e4 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java @@ -925,7 +925,7 @@ public class NMSImpl implements NMSBridge { } @Override - public void sendTeamPacket(Player recipient, Team team) { + public void sendTeamPacket(Player recipient, Team team, int mode) { Preconditions.checkNotNull(recipient); Preconditions.checkNotNull(team); @@ -935,7 +935,7 @@ public class NMSImpl implements NMSBridge { try { ScoreboardTeam nmsTeam = (ScoreboardTeam) TEAM_FIELD.invoke(team); - sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, 0)); + sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, mode)); } catch (Throwable e) { e.printStackTrace(); } diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java index 83efe547a..353fdc461 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/HumanController.java @@ -84,9 +84,7 @@ public class HumanController extends AbstractEntityController { handle.getNPC().data().set(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, teamName); - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 0); } } }, 20); @@ -115,6 +113,7 @@ public class HumanController extends AbstractEntityController { team.setSuffix(""); } team.removePlayer(entity); + Util.sendTeamPacketToAll(team, 1); } } NMS.removeFromWorld(entity); diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java index a0451e0af..f0ff31dd8 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java @@ -960,7 +960,7 @@ public class NMSImpl implements NMSBridge { } @Override - public void sendTeamPacket(Player recipient, Team team) { + public void sendTeamPacket(Player recipient, Team team, int mode) { Preconditions.checkNotNull(recipient); Preconditions.checkNotNull(team); @@ -970,7 +970,7 @@ public class NMSImpl implements NMSBridge { try { ScoreboardTeam nmsTeam = (ScoreboardTeam) TEAM_FIELD.invoke(team); - sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, 0)); + sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, mode)); } catch (Throwable e) { e.printStackTrace(); } diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/HumanController.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/HumanController.java index 7f1f55cd6..e3c9bb325 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/HumanController.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/HumanController.java @@ -84,9 +84,7 @@ public class HumanController extends AbstractEntityController { handle.getNPC().data().set(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, teamName); - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 0); } } }, 20); @@ -115,6 +113,7 @@ public class HumanController extends AbstractEntityController { team.setSuffix(""); } team.removePlayer(entity); + Util.sendTeamPacketToAll(team, 1); } } NMS.removeFromWorld(entity); diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java index 4771cbfcd..fd64319d6 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java @@ -1023,7 +1023,7 @@ public class NMSImpl implements NMSBridge { } @Override - public void sendTeamPacket(Player recipient, Team team) { + public void sendTeamPacket(Player recipient, Team team, int mode) { Preconditions.checkNotNull(recipient); Preconditions.checkNotNull(team); @@ -1033,7 +1033,7 @@ public class NMSImpl implements NMSBridge { try { ScoreboardTeam nmsTeam = (ScoreboardTeam) TEAM_FIELD.invoke(team); - sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, 0)); + sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, mode)); } catch (Throwable e) { e.printStackTrace(); } diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HumanController.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HumanController.java index 09e2392a9..9dc00e5b9 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HumanController.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/HumanController.java @@ -84,9 +84,7 @@ public class HumanController extends AbstractEntityController { handle.getNPC().data().set(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, teamName); - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 0); } } }, 20); @@ -115,6 +113,7 @@ public class HumanController extends AbstractEntityController { team.setSuffix(""); } team.removePlayer(entity); + Util.sendTeamPacketToAll(team, 1); } } NMS.removeFromWorld(entity); diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java index 7bad30ab6..fbdab4dfb 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java @@ -1026,7 +1026,7 @@ public class NMSImpl implements NMSBridge { } @Override - public void sendTeamPacket(Player recipient, Team team) { + public void sendTeamPacket(Player recipient, Team team, int mode) { Preconditions.checkNotNull(recipient); Preconditions.checkNotNull(team); @@ -1036,7 +1036,7 @@ public class NMSImpl implements NMSBridge { try { ScoreboardTeam nmsTeam = (ScoreboardTeam) TEAM_FIELD.invoke(team); - sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, 0)); + sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, mode)); } catch (Throwable e) { e.printStackTrace(); } diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java index 144370666..ef41b4dd4 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java @@ -84,9 +84,7 @@ public class HumanController extends AbstractEntityController { handle.getNPC().data().set(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, teamName); - for (Player player : Bukkit.getOnlinePlayers()) { - NMS.sendTeamPacket(player, team); - } + Util.sendTeamPacketToAll(team, 0); } } }, 20); @@ -115,6 +113,7 @@ public class HumanController extends AbstractEntityController { team.setSuffix(""); } team.removePlayer(entity); + Util.sendTeamPacketToAll(team, 1); } } NMS.removeFromWorld(entity); diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java index 186be1b3f..20421315b 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java @@ -788,7 +788,7 @@ public class NMSImpl implements NMSBridge { } @Override - public void sendTeamPacket(Player recipient, Team team) { + public void sendTeamPacket(Player recipient, Team team, int mode) { Preconditions.checkNotNull(recipient); Preconditions.checkNotNull(team); @@ -798,7 +798,7 @@ public class NMSImpl implements NMSBridge { try { ScoreboardTeam nmsTeam = (ScoreboardTeam) TEAM_FIELD.get(team); - sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, 0)); + sendPacket(recipient, new PacketPlayOutScoreboardTeam(nmsTeam, mode)); } catch (Throwable e) { e.printStackTrace(); }