Source-checkedLibraries & compatibility

ProtocolLib

by dmulloy2 · for Minecraft

Provides read and write access to the Minecraft protocol with Bukkit.

5.1MDownloads
10d agoLast updated
GPL-2.0License
PaperLoaders

About ProtocolLib

From GitHub

Provides read and write access to the Minecraft protocol with Bukkit.

ProtocolLib

Certain tasks are impossible to perform with the standard Bukkit API, and may require working with and even modifying Minecraft directly. A common technique is to modify incoming and outgoing packets, or inject custom packets into the stream. This is quite cumbersome to do, however, and most implementations will break as soon as a new version of Minecraft has been released, mostly due to obfuscation.

Critically, different plugins that use this approach may _hook_ into the same classes, with unpredictable outcomes. More than often this causes plugins to crash, but it may also lead to more subtle bugs.

Resources

ProtocolLib.jar is the primary Paper plugin. Spigot servers must use the compatibility artifact, ProtocolLib-Spigot.jar. The Maven artifact is the platform-neutral library shared by both distributions.

Compilation

ProtocolLib is built with Gradle. If you have it installed, just run ./gradlew build in the root project folder. Other gradle targets you may be interested in include clean, test, and shadowJar. shadowJar will create a jar with all dependencies (ByteBuddy) included for both Paper and Spigot.

A new API

__ProtocolLib__ attempts to solve this problem by providing an event API, much like Bukkit, that allows plugins to monitor, modify, or cancel packets sent and received. But, more importantly, the API also hides all the gritty, obfuscated classes with a simple index based read/write system. You no longer have to reference CraftBukkit!

Using ProtocolLib

To use this library, first add ProtocolLib.jar to your Java build path. Then, add ProtocolLib as a dependency or soft dependency to your plugin.yml file like any other plugin:

depend: [ ProtocolLib ]

You can also add ProtocolLib as a Maven dependency:

<dependencies>
  <dependency>
    <groupId>net.dmulloy2</groupId>
    <artifactId>ProtocolLib</artifactId>
    <version>5.4.0</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

Or use the maven dependency with gradle:

repositories {
    mavenCentral()
}

dependencies {
    compileOnly 'net.dmulloy2:ProtocolLib:5.4.0'
}

Then get a reference to ProtocolManager in onLoad() or onEnable() and you're good to go.

private ProtocolManager protocolManager;

public void onLoad() {
    protocolManager = ProtocolLibrary.getProtocolManager();
}

To listen for packets sent by the server to a client, add a server-side listener:

// Disable all sound effects
protocolManager.addPacketListener(new PacketAdapter(
    this,
    ListenerPriority.NORMAL,
    PacketType.Play.Server.NAMED_SOUND_EFFECT
) {
    @Override
    public void onPacketSending(PacketEvent event) {
        event.setCancelled(true);
    }
});

It's also possible to read and modify the content of these packets. For instance, you can create a global censor by listening for Packet3Chat events:

// Censor
protocolManager.addPacketListener(new PacketAdapter(
    this,
    ListenerPriority.NORMAL,
    PacketType.Play.Client.CHAT
) {
    @Override
    public void onPacketReceiving(PacketEvent event) {
        PacketContainer packet = event.getPacket();
        String message = packet.getStrings().read(0);

        if (message.contains("shit") || message.contains("damn")) {
            event.setCancelled(true);
            event.getPlayer().sendMessage("Bad manners!");
        }
    }
});

Sending packets

Normally, you might have to do something ugly like the following:

PacketPlayOutExplosion fakeExplosion = new PacketPlayOutExplosion(
    player.getLocation().getX(),
    player.getLocation().getY(),
    player.getLocation().getZ(),
    3.0F,
    new ArrayList<>(),
    new Vec3D(
        player.getVelocity().getX() + 1,
        player.getVelocity().getY() + 1,
        player.getVelocity().getZ() + 1
    )
);

((CraftPlayer) player).getHandle().b.a(fakeExplosion);

But with ProtocolLib, you can turn that into something more manageable:

PacketContainer fakeExplosion = new PacketContainer(PacketType.Play.Server.EXPLOSION);
fakeExplosion.getDoubles()
    .write(0, player.getLocation().getX())
    .write(1, player.getLocation().getY())
    .write(2, player.getLocation().getZ());
fakeExplosion.getFloat().write(0, 3.0F);
fakeExplosion.getBlockPositionCollectionModifier().write(0, new ArrayList<>());
fakeExplosion.getVectors().write(0, player.getVelocity().add(new Vector(1, 1, 1)));

protocolManager.sendServerPacket(player, fakeExplosion);

Compatibility

One of the main goals of this project was to achieve maximum compatibility with CraftBukkit. And the end result is quite flexible. It's likely that I won't have to update ProtocolLib for anything but bug fixes and new features.

How is this possible? It all comes down to reflection in the end. Essentially, no name is hard coded - every field, method and class is deduced by looking at field types, package names or parameter types. It's remarkably consistent across different versions.

Highlights

From source data

Loaders

Runs on Paper.

Footprint

Rated a light load on a server.

License

Published under GPL-2.0.

ProtocolLib on Nxeon

From our catalogue
One-click install
Not available. This mod isn't available as a one-click install here. Download it and upload it to your server in Files.
Server side
Required on the server
Server type needed
Paper
Server load
light
Smallest plan we suggest
Minecraft — 2 GB (2 GB RAM). This follows our own load rating above, not a benchmark.
Latest build
dev-build, released 2025-08-10

Game versions by loader

LoaderGame versionsNewest
Paper

From 10 recorded builds of ProtocolLib.

Recent builds

BuildReleasedGame versionsLoaders
dev-build2025-08-10n/aPaper
5.4.02025-08-07n/aPaper
5.3.02024-10-20n/aPaper
5.2.02024-04-07n/aPaper
5.1.02023-08-05n/aPaper
5.0.02023-04-16n/aPaper

Run ProtocolLib on a Minecraft server

Deploy a server above, then upload the file in Files.

What kind of mod it is

From the catalog
Listed on GitHub as “Core”

Libraries & compatibility

Foundations and fixes other mods build on. Usually installed because something else needs it.

Runs on your server

From source side support

GitHub lists ProtocolLib as required on the server. Check its GitHub page to see whether players need it too.

Compatibility

Game
Minecraft
Loaders
Paper
Runs on
Serverrequired on the server
Requires
One-click install needs a Paper server.

Verified at the source

  • ✓GitHubOfficial listing, checked 2026-10-07Open ↗
  • ✓Authordmulloy2, as published on GitHub
  • ✓LicenseGPL-2.0Free

ProtocolLib, answered

Generated from the mod’s own source data.

Do my players need to install ProtocolLib?

GitHub lists ProtocolLib as required on the server. Check its GitHub page to see whether players need it too.

Which loaders does it support?

Paper.

Is it free?

Yes. ProtocolLib is free to download from GitHub. Its license is GPL-2.0.

How do I add it to my Nxeon server?

This mod isn't available as a one-click install here. Download ProtocolLib from GitHub and upload it to your Nxeon Minecraft server in Files.

NxLabs

Run ProtocolLib on a Minecraft server.

Deploy in about a minute from $4.99 a month, then upload ProtocolLib in Files.