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;
|
2019-08-26 00:29:40 +02:00
|
|
|
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-26 00:29:40 +02:00
|
|
|
}
|
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 -> {
|
2019-08-26 00:29:40 +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-26 00:29:40 +02:00
|
|
|
}
|
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
|
|
|
}
|