-
-
Notifications
You must be signed in to change notification settings - Fork 298
Packet listeners and adapters
Plugins can listen for packets through PacketAdapters. A packet adapter is generally set up like this:
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
manager.addPacketListener(new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.CHAT) {
@Override
public void onPacketReceiving(PacketEvent event) {
Player player = event.getPlayer();
PacketContainer packet = event.getPacket();
if (isMuted(player)) {
System.out.println("[MUTED] " + player.getName() + ": " + packet.getStrings().read(0));
event.setCancelled(true);
}
}
});
This is a rather trivial example to listen for incoming chat packets and block them if a player is muted. There are a few things to unpack though:
PacketType is an enum-like class that contains every packet supported by ProtocolLib. PacketTypes are formatted as PacketType.[Game Phase].[Direction].[Packet Name]
. The game phase is one of Handshake
, Play
(you'll probably mostly be working with play), Status
, and Login
. The direction is either Client
(incoming packets) or Server
(outgoing packets)
You can find a list of all packets in the JavaDocs: https://ci.dmulloy2.net/job/ProtocolLib/javadoc/com/comphenix/protocol/PacketType.html
PacketContainer is how plugins can modify packets with ProtocolLib. It contains accessors for every type of field present in Minecraft packets. In this example, packet.getStrings()
returns a modifier for each String field in the chat packet.
You can read more about PacketContainers on the wiki page: [insert]
- Every packet can be cancelled with
event.setCancelled(true)
(that doesn't mean you should, but you can) - In some game phases (non-play ones),
event.getPlayer()
will sometimes return a TemporaryPlayer when a Bukkit player is not available. They have a reduced set of available methods and can be checked for withevent.isPlayerTemporary()