2020-04-24 03:25:58 +02:00
|
|
|
package net.minestom.server;
|
2019-08-19 17:04:19 +02:00
|
|
|
|
2021-03-02 14:42:34 +01:00
|
|
|
import net.kyori.adventure.audience.Audience;
|
2021-03-25 14:14:09 +01:00
|
|
|
import net.minestom.server.adventure.audience.PacketGroupingAudience;
|
2020-04-24 03:25:58 +02:00
|
|
|
import net.minestom.server.entity.Player;
|
2021-11-17 06:31:24 +01:00
|
|
|
import net.minestom.server.network.packet.server.SendablePacket;
|
2020-04-24 03:25:58 +02:00
|
|
|
import net.minestom.server.network.packet.server.ServerPacket;
|
2020-11-13 07:43:35 +01:00
|
|
|
import net.minestom.server.utils.PacketUtils;
|
2020-10-24 10:46:23 +02:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2019-08-19 17:04:19 +02:00
|
|
|
|
2021-11-17 06:31:24 +01:00
|
|
|
import java.util.Collection;
|
2021-11-17 23:12:54 +01:00
|
|
|
import java.util.List;
|
2019-08-19 17:04:19 +02:00
|
|
|
import java.util.Set;
|
|
|
|
|
2020-07-21 18:48:15 +02:00
|
|
|
/**
|
2020-10-15 21:16:31 +02:00
|
|
|
* Represents something which can be displayed or hidden to players.
|
2020-07-21 18:48:15 +02:00
|
|
|
*/
|
2019-08-19 17:04:19 +02:00
|
|
|
public interface Viewable {
|
|
|
|
|
2020-05-23 17:57:56 +02:00
|
|
|
/**
|
2020-10-15 21:16:31 +02:00
|
|
|
* Adds a viewer.
|
2020-10-11 15:27:23 +02:00
|
|
|
*
|
2020-05-23 17:57:56 +02:00
|
|
|
* @param player the viewer to add
|
|
|
|
* @return true if the player has been added, false otherwise (could be because he is already a viewer)
|
|
|
|
*/
|
2020-10-24 10:46:23 +02:00
|
|
|
boolean addViewer(@NotNull Player player);
|
2019-08-19 17:04:19 +02:00
|
|
|
|
2020-05-23 17:57:56 +02:00
|
|
|
/**
|
2020-10-15 21:16:31 +02:00
|
|
|
* Removes a viewer.
|
2020-10-11 15:27:23 +02:00
|
|
|
*
|
2020-05-23 17:57:56 +02:00
|
|
|
* @param player the viewer to remove
|
|
|
|
* @return true if the player has been removed, false otherwise (could be because he was not a viewer)
|
|
|
|
*/
|
2020-10-24 10:46:23 +02:00
|
|
|
boolean removeViewer(@NotNull Player player);
|
2019-08-19 17:04:19 +02:00
|
|
|
|
2020-07-21 18:48:15 +02:00
|
|
|
/**
|
2020-10-15 21:16:31 +02:00
|
|
|
* Gets all the viewers of this viewable element.
|
2020-07-21 18:48:15 +02:00
|
|
|
*
|
|
|
|
* @return A Set containing all the element's viewers
|
|
|
|
*/
|
2021-11-01 18:04:00 +01:00
|
|
|
@NotNull Set<@NotNull Player> getViewers();
|
2019-08-19 17:04:19 +02:00
|
|
|
|
2020-07-21 18:48:15 +02:00
|
|
|
/**
|
2020-10-31 05:09:30 +01:00
|
|
|
* Gets if a player is seeing this viewable object.
|
2020-07-21 18:48:15 +02:00
|
|
|
*
|
|
|
|
* @param player the player to check
|
|
|
|
* @return true if {@code player} is a viewer, false otherwise
|
|
|
|
*/
|
2020-10-24 10:46:23 +02:00
|
|
|
default boolean isViewer(@NotNull Player player) {
|
2019-08-19 17:04:19 +02:00
|
|
|
return getViewers().contains(player);
|
|
|
|
}
|
|
|
|
|
2020-07-21 18:48:15 +02:00
|
|
|
/**
|
2020-10-31 05:09:30 +01:00
|
|
|
* Sends a packet to all viewers.
|
2020-07-21 18:48:15 +02:00
|
|
|
* <p>
|
|
|
|
* It is better than looping through the viewers
|
2020-10-31 05:09:30 +01:00
|
|
|
* to send a packet since it is here only serialized once.
|
2020-07-21 18:48:15 +02:00
|
|
|
*
|
|
|
|
* @param packet the packet to send to all viewers
|
|
|
|
*/
|
2021-11-17 06:31:24 +01:00
|
|
|
default void sendPacketToViewers(@NotNull SendablePacket packet) {
|
|
|
|
if (packet instanceof ServerPacket serverPacket) {
|
|
|
|
PacketUtils.sendGroupedPacket(getViewers(), serverPacket);
|
|
|
|
} else {
|
|
|
|
getViewers().forEach(player -> player.sendPacket(packet));
|
2021-10-13 06:33:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-17 06:31:24 +01:00
|
|
|
default void sendPacketsToViewers(@NotNull Collection<SendablePacket> packets) {
|
|
|
|
packets.forEach(this::sendPacketToViewers);
|
|
|
|
}
|
|
|
|
|
2021-11-17 23:12:54 +01:00
|
|
|
default void sendPacketsToViewers(@NotNull SendablePacket... packets) {
|
|
|
|
sendPacketsToViewers(List.of(packets));
|
|
|
|
}
|
|
|
|
|
2020-07-21 18:48:15 +02:00
|
|
|
/**
|
2020-10-31 05:09:30 +01:00
|
|
|
* Sends a packet to all viewers and the viewable element if it is a player.
|
2020-07-21 18:48:15 +02:00
|
|
|
* <p>
|
2021-11-17 06:31:24 +01:00
|
|
|
* If 'this' isn't a player, then only {@link #sendPacketToViewers(SendablePacket)} is called.
|
2020-07-21 18:48:15 +02:00
|
|
|
*
|
|
|
|
* @param packet the packet to send
|
|
|
|
*/
|
2021-11-17 06:31:24 +01:00
|
|
|
default void sendPacketToViewersAndSelf(@NotNull SendablePacket packet) {
|
2020-11-13 07:43:35 +01:00
|
|
|
sendPacketToViewers(packet);
|
2019-08-27 05:23:25 +02:00
|
|
|
}
|
2021-03-02 14:42:34 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the result of {@link #getViewers()} as an Adventure Audience.
|
|
|
|
*
|
|
|
|
* @return the audience
|
|
|
|
*/
|
2021-03-24 13:36:06 +01:00
|
|
|
default @NotNull Audience getViewersAsAudience() {
|
2021-03-25 14:14:09 +01:00
|
|
|
return PacketGroupingAudience.of(this.getViewers());
|
2021-03-24 13:36:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the result of {@link #getViewers()} as an {@link Iterable} of Adventure
|
|
|
|
* {@link Audience}s.
|
|
|
|
*
|
|
|
|
* @return the audiences
|
|
|
|
*/
|
2021-03-05 18:02:34 +01:00
|
|
|
default @NotNull Iterable<? extends Audience> getViewersAsAudiences() {
|
2021-03-24 13:36:06 +01:00
|
|
|
return this.getViewers();
|
2021-03-02 14:42:34 +01:00
|
|
|
}
|
2019-08-19 17:04:19 +02:00
|
|
|
}
|