Minestom/src/main/java/net/minestom/server/Viewable.java

109 lines
3.2 KiB
Java
Raw Normal View History

2020-04-24 03:25:58 +02:00
package net.minestom.server;
2019-08-19 17:04:19 +02:00
2020-04-24 03:25:58 +02:00
import net.minestom.server.entity.Player;
import net.minestom.server.network.PacketWriterUtils;
import net.minestom.server.network.packet.server.ServerPacket;
2020-10-24 10:46:23 +02:00
import org.jetbrains.annotations.NotNull;
2019-08-19 17:04:19 +02:00
import java.util.HashSet;
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-10-15 21:16:31 +02:00
* Adds a viewer.
2020-10-11 15:27:23 +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-10-15 21:16:31 +02:00
* Removes a viewer.
2020-10-11 15:27:23 +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
*/
2020-10-24 10:46:23 +02:00
@NotNull
2019-08-19 17:04:19 +02:00
Set<Player> getViewers();
2020-07-21 18:48:15 +02:00
/**
2020-10-15 21:16:31 +02: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-15 21:16:31 +02:00
* Sends a packet to all viewers
2020-07-21 18:48:15 +02:00
* <p>
* It is better than looping through the viewers
* to send a packet since it is here only serialized once
*
* @param packet the packet to send to all viewers
*/
2020-10-24 10:46:23 +02:00
default void sendPacketToViewers(@NotNull ServerPacket packet) {
PacketWriterUtils.writeAndSend(getViewers(), packet);
2019-08-21 16:50:52 +02:00
}
2020-07-21 18:48:15 +02:00
/**
2020-10-15 21:16:31 +02:00
* Sends multiple packets to all viewers
2020-07-21 18:48:15 +02:00
* <p>
* It is better than looping through the viewers
* to send a packet since it is here only serialized once
*
* @param packets the packets to send
*/
2020-10-24 10:46:23 +02:00
default void sendPacketsToViewers(@NotNull ServerPacket... packets) {
2019-08-22 14:52:32 +02:00
for (ServerPacket packet : packets) {
PacketWriterUtils.writeAndSend(getViewers(), packet);
2019-08-22 14:52:32 +02:00
}
}
2020-07-21 18:48:15 +02:00
/**
2020-10-15 21:16:31 +02: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>
* If 'this' isn't a player, then {@link #sendPacketToViewers(ServerPacket)} is called instead
*
* @param packet the packet to send
*/
2020-10-24 10:46:23 +02:00
default void sendPacketToViewersAndSelf(@NotNull ServerPacket packet) {
2019-08-22 14:52:32 +02:00
if (this instanceof Player) {
if (getViewers().isEmpty()) {
((Player) this).getPlayerConnection().sendPacket(packet);
} else {
UNSAFE_sendPacketToViewersAndSelf(packet);
}
2019-08-27 05:23:25 +02:00
} else {
sendPacketToViewers(packet);
2019-08-22 14:52:32 +02:00
}
2019-08-21 16:50:52 +02:00
}
2020-10-11 15:27:23 +02:00
/**
2020-10-15 21:16:31 +02:00
* Sends a packet to all the viewers and 'this'
2020-10-11 15:27:23 +02:00
* <p>
* Unsafe because of a cast to {@link Player} without any check beforehand
*
* @param packet the packet to send
*/
2020-10-24 10:46:23 +02:00
private void UNSAFE_sendPacketToViewersAndSelf(@NotNull ServerPacket packet) {
Set<Player> recipients = new HashSet<>(getViewers());
recipients.add((Player) this);
PacketWriterUtils.writeAndSend(recipients, packet);
2019-08-27 05:23:25 +02:00
}
2019-08-19 17:04:19 +02:00
}