package net.minestom.server; import net.minestom.server.entity.Player; import net.minestom.server.network.PacketWriterUtils; import net.minestom.server.network.packet.server.ServerPacket; import java.util.HashSet; import java.util.Set; public interface Viewable { void addViewer(Player player); void removeViewer(Player player); Set getViewers(); default boolean isViewer(Player player) { return getViewers().contains(player); } default void sendPacketToViewers(ServerPacket packet) { PacketWriterUtils.writeAndSend(getViewers(), packet); } default void sendPacketsToViewers(ServerPacket... packets) { for (ServerPacket packet : packets) { PacketWriterUtils.writeAndSend(getViewers(), packet); } } default void sendPacketToViewersAndSelf(ServerPacket packet) { if (this instanceof Player) { if (getViewers().isEmpty()) { ((Player) this).getPlayerConnection().sendPacket(packet); } else { UNSAFE_sendPacketToViewersAndSelf(packet); } } else { sendPacketToViewers(packet); } } private void UNSAFE_sendPacketToViewersAndSelf(ServerPacket packet) { Set recipients = new HashSet<>(getViewers()); recipients.add((Player) this); PacketWriterUtils.writeAndSend(recipients, packet); } }