ProtocolLib
ProtocolLib
ProtocolLib has, for the most part, moved over to Spigot! If you need support, head over there!
Certain tasks are impossible to perform with the standard Bukkit API, and may require working with and even modify 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.
Links
Support
Please create a issue with as much information as possible if you experience a problem that has not already been reported. Comments with a huge stack trace will be deleted.
If you need help with the API, please use the issue tracker. If your question cannot be made public for whatever reason (including security bugs), send me a personal message instead.
For server operators
Just download ProtocolLib from the link above. It doesn't do anything on its own, it simply allows other plugins to function.
FAQ
- Why do I get FieldAccessExceptions when I try to read or write from packets?
Quote:The reason for these exceptions is because ProtocolLib is not using the packet format as described on the Wiki, it's using the in-memory representation of these packets. Often, the in-memory representation will use integers instead of shorts and bytes, and store more complex objects (like ItemStacks) directly.
You can figure out the in-memory representation from the Minecraft source code, or just use PacketWrapper where I've done all that work for you.
Examples
Source code for a bunch of example programs that use ProtocolLib can be found at this thread on the main support forum.
You may also be interested in PacketWrapper, a library that makes it possible to modify a packet without having to decompile the Minecraft source code.
Finally, for the more advanced users who want to use ProtocolLib if present, but still fall back on their own packet listening system, I recommend taking a look at this thread. I explain where and how to inject code into CraftBukkit in order to intercept sent and received packets yourself.
Maven repository
If you're using Maven, you'll be able to automatically download the JAR, JavaDoc and associated sources from Maven Central. You can add it as a dependency like so:
<dependencies> <dependency> <groupId>net.dmulloy2</groupId> <artifactId>ProtocolLib</artifactId> <version>5.4.0</version> </dependency> <!-- And so on --> </dependencies>
Commands
Protocol
Main administrative command. Supports the following sub-commands:
- config: Reload the configuration file.
- check: Check for new versions on BukkitDev.
- update: Check for new versions and automatically download the JAR. The server must be restarted for this to take effect.
- timings: Toggle measuring the amount of CPU time spent by each plugin. See here for more information.
- listeners: Display what plugins are using ProtocolLib, and the packet types they are intercepting.
All of these commands require the permission protocol.admin.
Example:
/protocol update
Packet
Add or remove a debug packet listener. This is useful for plugin authors who just wants to see when a packet is sent, and with what content.
Sub commands:
- add: Add a packet listener with a given packet ID.
- remove: Remove one or every packet listener with the given packet IDs.
- names: Print the name of every given packet ID.
Parameters (in order):
- Connection side: Either client or server.
- Multiple ID ranges: Can be a single packet ID like 14, or a range like 10 - 15. Defaults to 0 - 255 if not specified.
- Detailed: If TRUE, prints the full packet content.
Example:
/packet add client 10-13 true
For 3.0.0 and above, you should specify the protocol, sender and name instead:
/packet add play server chat true
In 3.4.0-SNAPSHOT and above, you can also display the packet before its modified by any packet listeners:
/packet add play server chat compare
Remove all listeners:
/packet remove client /packet remove server
Note that this command should rarely be used on a production server. Listening to too many packets may crash the server.
Filter
The filter system (introduced in 2.4.1) uses the built in JavaScript interpreter in JVM 6 (Rhino) to extend the packet command with filtering capabilities - it is now possible to, say, only print entity metadata packet events (packet add server 40) for a given entity ID:
> packet add server 40 true Added listener ListeningWhitelist{priority=MONITOR, packets=[40]} > filter add entity_filter 40 Enter filter program ('}' to complete or CANCEL): function(event, packet) { > return packet.a == 1000; >} Added filter entity_filter.
This should be much more convenient than having to compile a test plugin and reload the whole server. Note that this feature is disabled by default for security reasons. To enable it, add "debug: true" to config.yml.
Configuration
A small set of configuration options are available:
Global section
| Option | Default |
Description |
|---|---|---|
| auto updater.notify | true | Inform any player with the permission protocol.info when a new version of ProtocolLib is out. |
| auto updater.download | true | Automatically download and install the newest version of ProtocolLib. The installation will take effect when the server restarts. |
| auto updater.delay | 43200 | The number of seconds between each check for a new update. |
| auto updater.last | 0 | This simply records the last time (in seconds since 01.01.1970) an update check was performed. Set it to 0 to force a new update check. |
| metrics | true | If TRUE, ProtocolLib will publish anonymous usage data to mcstats.org. Set it to FALSE to opt-out. |
| background compiler | true | If TRUE, ProtocolLib will try and improve performance by replacing reflection with compiled code on-the-fly. |
| ignore version check | None | Force ProtocolLib to start for a specified Minecraft version, even if it is incompatible. |
| suppressed reports | None | If any error or warning report is present in this list, they will not appear in the console or the log. |
For more information, take a look at the default configuration file.
Tutorial for developers
See this page for more information.
Compatibility
One of the main goals of this project was to achieve maximum compatibility with Minecraft. And the end result is quite good, it should be resilient against future changes. It's likely that I won't have to update ProtocolLib for anything but bug and performance fixes.
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.
(note that the below list hasn't been updated in ages and ymmv)
Plugins that appear to be compatible
Plugins known to be compatible
- SpoutPlugin
Plugins using ProtocolLib
- Orebfuscator
- TagAPI
- DisguiseCraft
- VanishNoPacket (v3.18.5 and earlier)
- BkCommonLib
- CraftBook
- ChairsReloaded (3.0.2 and earlier)
- Scavenger
- TabAPI
- Individual-Signs
- ItemRenamer
- RandomCoords
- AntiCommandTab
- Sneaky
- Spy
- Statues
- Seasons
- Safe Command Block
- PlayerHider
- Phantasma Chat Filter
- Ghost Hunt
- ReMap
- AttributeHider
- uCars
- uPlanes
- PropHunt
- Portable-Horses
- ClickEdit
- RageBan
- ReChat
- PlayEffect
- FakePlayers
- PlayerCountMessage
- Vampire
- Murder
- NoSpy
- PingNachricht
- NoCheatPlus
- ScoreboardStats
Inactive projects
Please let me know if you want me to add your plugin to this list. :)
Privacy
This plugin uses BStats to generate and publish anonymous aggregate usage statistics, but you can easily opt-out by setting metrics in config.yml to false.
If enabled, the following is sent every ten minutes:
- Metrics revision version (currently 6).
- Server's GUID
- Players currently online (not max player count)
- Server version string (the same version string you see in /version)
- Current version of ProtocolLib
- The name of every plugin that registers a packet listener in ProtocolLib.
Donating
If ProtocolLib has made your life significantly easier or you're feeling particularly generous, consider donating! It's a great way to support the many hours I've spent maintaining this plugin and keeps me motivated. Don't donate if you can't afford it.

I would like to thank everyone who has donated to ProtocoLib on BukkitDev. I really appreciate it. :)
Note: Create an issue if you're having problems. I generally don't check the BukkitDev comments.
-
View User Profile
-
Send Message
Posted May 16, 2013@aadnk
Thanks for your answer! Yeah, I have got mobile broadband connection and I have lag sometimes + repeaters are laggy for me always. But hope Mojang will do something with it, or something like Spigot will be created and modified to solve these problems.
-
View User Profile
-
Send Message
Posted May 15, 2013Im recently getting a bug with the fireworks packet when someone in my server try to throw a firework my server severely crashes for something like 5 seconds can you give me the id from the Firework packet and let me how to fix this please? or the only way its to uninstall this plugin and i dont want to D:
-
View User Profile
-
Send Message
Posted May 15, 2013I think it would be possible, using both a plugin (for the server) and a mod (for the client) to prevent players from even attempting to break blocks within a protected region, as long as the plugin can hook into other protection plugins.
It always helps to think of Minecraft as "still in beta" and a "work in progress" when it comes to these unsolvable annoying issues.
-
View User Profile
-
Send Message
Posted May 15, 2013@craftik7
These are all caused by the client trying to predict the outcome of an action wrongly - essentially by being too "smart" (or not smart enough) and assuming what the server will do. This is exacerbated by latency, and can get pretty noticeable above 200-250 ms.
There's basically very little you can do about it.
What I meant by updating everything nearby, is basically to send the map data close to the player constantly, ensuring that it's not overwritten on the client side. The problem is, this takes too much bandwidth, and requires a lot of optimizing. It's definitely not easy, and probably not worth the effort. I think most Minecraft players expect some "weirdness", especially if they're on a laggy connection.
-
View User Profile
-
Send Message
Posted May 15, 2013@aadnk
Thanks for you answer! I am interested in it since I am making OldDays plugin which has lot of features and most of my player screw up when they have a slow internet and the block just flicker for one second. That suck.
And I wonder if I can disable eating animation when using Instant Food feature with disabled hunger that stuck at 3 points. When you instant eat food, it flickers for 150ms and starts to do the eating animation.
Edit: I don´t really get it what do you mean by updating the area of the player? I am beginner in plugins.
-
View User Profile
-
Send Message
Posted May 14, 2013@craftik7
I don't think there's any less annoying solutions for that problem. The only real alternative is to constantly update the area around the player (if inside a protected zone), but that would use a lot of bandwidth if done for every player.
I've experimented with using block 36 as an alternative to air blocks, and it does prevent the player from placing a block and thus see the flicker you mentioned. Unfortunately, you can also destroy these blocks by left clicking (so they would have to be recreated), and the nearby block to the player will be displayed as a wireframe model. It's definitely worse than just having the flicker ...
Mojang should just add client support for protected areas already ...
-
View User Profile
-
Send Message
Posted May 14, 2013Yay new release! I wonder if it´s possible to "disable" disabled block blinking. I mean, when I place disabled block in game it is there for 200 ms than it disappear so I wonder maybe through your plugin I can make it more "stable" and users do not screw up?
-
View User Profile
-
Send Message
Posted May 13, 2013@Recolance
I doubt it. ProtocolLib is just an API for interfacing with the raw packet system, it doesn't contain any PVP-specific (or DisguiseCraft-specific for that matter) code that could cause this.
Just be patient and wait for Devil_Boy to respond to your ticket.
-
View User Profile
-
Send Message
Posted May 13, 2013@CommodoreAlpha
Yeah, that is the ticket I've been in for 4 days now.
It's protocolLib that is the issue.
-
View User Profile
-
Send Message
Posted May 13, 2013@thecoolwolf
http://assets.comphenix.net/job/ProtocolLib/ :)
-
View User Profile
-
Send Message
Posted May 13, 2013is there a dev version for 1.5.2? i could not find any info about it or im just blind >:
-
View User Profile
-
Send Message
Posted May 12, 2013@Recolance
I would still consider poking around on DisguiseCraft (look into comments, tickets, dev builds, etc.) rather than ProtocolLib, since it's far more likely the problem is on their end. If ProtocolLib really caused issues with PvPing disguised people, it should also cause issues with PvP in general, which likely isn't the case.
Also, MobDisguisePvPControl not working might be a matter of the plugin needing to be updated.
EDIT: Here's a recent ticket you can look at.
-
View User Profile
-
Send Message
Posted May 12, 2013@Wizel603
Keep in mind that this warning message will only be displayed if ProtocolLib attempts to check for updates, which happens at most once every 12 hours by default.
-
View User Profile
-
Send Message
Posted May 12, 2013Just started using the dev version and I believe case where the following message is displayed is reversed. "Updating SNAPSHOT versions are not supported. Please perform a manual upgrade." It displays after protocollib loads from the plugin directory, but doesn't display if the plugin had been placed in the update directory.
-
View User Profile
-
Send Message
Posted May 12, 2013@CommodoreAlpha
Yeah I've used that about 5 months ago. It doesn't fix the issue.
-
View User Profile
-
Send Message
Posted May 12, 2013@Recolance
i dont know how to get it working all in all on my server can u tell me how u did i plz cause i realy want to troll my friend :)
-
View User Profile
-
Send Message
Posted May 12, 2013@Recolance
That's an intended feature of DisguiseCraft; ProtocolLib isn't at fault here.
To solve your issue, here's a helpful addon to DisguiseCraft. Yes, I know it says MobDisguise, but it works for DisguiseCraft.
-
View User Profile
-
Send Message
Posted May 11, 2013With disguisecraft you cannot hit a player who is in disguise. You can only cause damage to them with an arrow. Since protocollib handles pvp for that plugin, I was wondering if this could be fixed.
Would save me the screams of hundreds of crying children.
-
View User Profile
-
Send Message
Posted May 11, 2013@aadnk
Awesome! Thanks for the great support on this plugin!
-
View User Profile
-
Send Message
Posted May 11, 2013@Dangerilius
You should take a look at PacketWrapper - it contains classes that simplify accessing these packets, and explain how to do it. Here's the wrapper class for SET_SCORE.
If you want to understand WHY your code isn't working, I suggest you read this. It basically boils down to a difference in how a packet is stored in memory, and how it looks when transmitted over the network (which is what you've based your code on).