Minestom/src/main/java/fr/themode/minestom/Viewable.java

79 lines
2.5 KiB
Java
Raw Normal View History

2019-08-19 17:04:19 +02:00
package fr.themode.minestom;
import fr.themode.minestom.entity.Player;
2019-08-31 07:54:53 +02:00
import fr.themode.minestom.net.PacketWriterUtils;
2019-08-21 16:50:52 +02:00
import fr.themode.minestom.net.packet.server.ServerPacket;
2019-08-19 17:04:19 +02:00
import java.util.Set;
public interface Viewable {
void addViewer(Player player);
void removeViewer(Player player);
Set<Player> getViewers();
default boolean isViewer(Player player) {
return getViewers().contains(player);
}
2019-08-21 16:50:52 +02:00
default void sendPacketToViewers(ServerPacket packet) {
2019-08-22 14:52:32 +02:00
if (getViewers().isEmpty())
return;
2019-08-31 07:54:53 +02:00
PacketWriterUtils.writeCallbackPacket(packet, buffer -> {
2019-08-24 20:34:01 +02:00
int size = getViewers().size();
if (size == 0)
return;
buffer.getData().retain(size).markReaderIndex();
for (Player viewer : getViewers()) {
viewer.getPlayerConnection().writeUnencodedPacket(buffer);
2019-08-23 15:37:38 +02:00
buffer.getData().resetReaderIndex();
}
2019-08-23 15:37:38 +02:00
});
2019-08-21 16:50:52 +02:00
}
default void sendPacketsToViewers(ServerPacket... packets) {
2019-08-22 14:52:32 +02:00
if (getViewers().isEmpty())
return;
for (ServerPacket packet : packets) {
2019-08-31 07:54:53 +02:00
PacketWriterUtils.writeCallbackPacket(packet, buffer -> {
int size = getViewers().size();
if (size == 0)
return;
buffer.getData().retain(size).markReaderIndex();
for (Player viewer : getViewers()) {
viewer.getPlayerConnection().writeUnencodedPacket(buffer);
2019-08-23 15:37:38 +02:00
buffer.getData().resetReaderIndex();
}
2019-08-23 15:37:38 +02:00
});
2019-08-22 14:52:32 +02:00
}
}
default void sendPacketToViewersAndSelf(ServerPacket packet) {
if (this instanceof Player) {
2019-08-27 05:23:25 +02:00
UNSAFE_sendPacketToViewersAndSelf(packet);
} else {
sendPacketToViewers(packet);
2019-08-22 14:52:32 +02:00
}
2019-08-21 16:50:52 +02:00
}
2019-08-27 05:23:25 +02:00
private void UNSAFE_sendPacketToViewersAndSelf(ServerPacket packet) {
2019-08-31 07:54:53 +02:00
PacketWriterUtils.writeCallbackPacket(packet, buffer -> {
2019-08-27 05:23:25 +02:00
int size = getViewers().size();
buffer.getData().retain(size + 1).markReaderIndex();
((Player) this).getPlayerConnection().writeUnencodedPacket(buffer);
buffer.getData().resetReaderIndex();
if (size != 0) {
for (Player viewer : getViewers()) {
buffer.getData().resetReaderIndex();
viewer.getPlayerConnection().writeUnencodedPacket(buffer);
}
}
});
}
2019-08-19 17:04:19 +02:00
}