Hello! Thank you for checking out the first edition of the Airplane Newsletter. This is a new monthly newsletter detailing changes that have been made in the ecosystem! This includes changes in Spigot, Paper, Tuinity, and Purpur, as well as changes in the surrounding ecosystem.
This newsletter wouldn’t exist without the help of our Patreons, thank you! Support for the Airplane project allows us to do cool things like this newsletter, so if you’d like to see more of these in the future please consider subscribing on our Patreon: https://www.patreon.com/airplane
In 2013, Mojang introduced a new EULA that included a lot of restrictions on how servers are allowed to make income. With that they added a method to ban servers that they deemed breaking this new EULA. Many servers were then blacklisted, removing the ability for clients to connect. These servers then found a bypass, where you could add an SRV record and the Minecraft client would consider the record’s domain to be the one that should be checked in the blacklist.
This bypass has worked for many years, but in the recent patch notes for snapshot 21w13a Mojang mentioned that they fixed a bug regarding “Servers able to bypass EULA blacklist”. One interesting thing about this fix is that Mojang removed this “bug fix” from the patch notes. If you take a look at the archive version and the live version, you can see that Mojang decided to remove any mention of this fix.
Server owners who have been using this bypass for years are now wondering where they stand. Many owners still disagree with the EULA, but with the bypass being fixed they will be forced to either change or be unconnectable through the vanilla Minecraft client. Currently it is unknown whether this fix will apply to 1.17 or previous versions of the client.
At the beginning of Minecraft, everything in chat was just text. Then came formatting codes, where prefixing text with § and a color code (for example §6This is gold!) would change the formatting. This was used until 1.7.2, when Mojang implemented JSON based chat messages. These new messages had a lot of new features, including adding custom hover text and click events to messages.
When JSON chat was introduced, Bukkit initially added no support for it and instead decided to convert the old format to JSON messages. However, when developers began to want access to these new hover and click features, the API for JSON messages came from a strange place: BungeeCord
BungeeCord received a JSON message API before Bukkit did, however it was not very well received by developers. The API had a lot of rough edges especially with simple usages of the API. The BungeeCord chat API was then put into Bukkit to be usable by Bukkit plugins, and remains there to this day.
Adventure is a library that has been around since 2017, designed for developers instead of being designed to meet a spec. It is very mature and stabilized at this point, which makes it an excellent candidate to replace the existing text based and BungeeCord message systems. On February 21st Paper pushed the commit implementing Adventure into Paper, and deprecated all the old methods for sending text to the client.
While overall a net positive for the long term health of the Bukkit ecosystem, it does come with a worry that plugins who decide to use the API will become incompatible with Spigot. This incompatibility is due to the fact that Spigot is unlikely to implement the same API in their version of Bukkit. This may create a divide in plugins that support Paper or Spigot, which given Paper’s larger popularity could directly lead to the death of Spigot.
On March 15th, md_5 pushed an update to Spigot which changed their patching system to use package names to the ones provided by Mojang’s official mappings. For a bit of backstory, Minecraft distributes the server without any names for the code to run the server. For Spigot to understand what different classes do, they rename the classes from obfuscated names like “a” or “acb” to understandable names like “Creeper” or “Chunk”.
The names that Spigot uses are partially based on the names that the Bukkit team used previously, but have been expanded since Bukkit’s takedown. One of the things Spigot doesn’t do is change the package name of the classes. That means that everything from entities like “ZombiePigman”, world things like “ChunkSection”, and even stuff like “PacketChat” are all inside the same package.
In September 2019, Mojang released the official mappings to turn the obfuscated names into the official ones that they use. With these, Spigot no longer has to use the fanmade names that they came up with for everything. However, due to licensing issues most projects have declined to use these mappings, until August 2020 when Mojang changed the license for these mappings. Now, most legal issues have been figured out, and open-source projects should feel free to use them.
With this new update, the Spigot team has dipped their toes into using the Mojang Mappings. They now use the mappings to put classes into their correct package. This moves things like the “World” class to include the Mojang-named package “net.minecraft.level.World”. Spigot did not use the Mojang Mappings for class and method names however, likely due to the enormous amount of work involved with changing their entire codebase. In a future update like 1.17 we may see Spigot convert to the Mojang Mappings for everything, which would make future updates even easier for Spigot and plugin developers.
For the last couple of months, Spottedleaf (author of Tuinity & Paper contributor) has been working on a new branch targeting improvements to the chunk loading system. Specifically, it was designed to fix the issue of chunks loading improperly, turning them invisible. This was a very common issue because the changes that Paper and Tuinity make to the chunk loading system cause chunks to become “desynced” to the client, making them invisible even though they were fully loaded.
Along with this patch comes a fantastic configuration for the chunk sending system. You can control how fast chunks are sent to players by either setting the speed of chunks sent to individual players, or the speed that chunks are sent in general. These settings may need to be tweaked depending on your server, as clients can get lagged down now with the speed that chunks are sent.
One major improvement that is included with this is that chunks are now only sent if they’re within the player’s view distance. This means that chunks the player would not see anyways are never sent, saving bandwidth for both the client and server, as well as improving performance. If you’ve had issues with chunk loading, make sure to update your Tuinity or Tuinity fork version.
On March 11th Purpur began including Airplane patches in their fork. They include Airplane similarly to how they include Tuinity, by squashing the project’s patches into a single patch, then rebasing it on top of their version of Paper. In this way they can decide the exact versions of Paper, Tuinity, and Airplane they use at any time.
As the lead developer for Airplane, I’m very excited to see wider adoption for Airplane. We already have several exciting patches for server performance, and we will continue to work on new optimizations to maximize server performance.
This month there have been several exciting changes to the Bukkit API, giving plugins new features they can safely use in new versions.
World.getMinHeight(): Spigot has recently added a new API called World.getMinHeight()
, which returns how low the world’s y axis goes. This is especially important for plugins that need to support 1.17, as worlds can now have blocks generated below y = 0. Any plugin that tries to read all blocks in a chunk, or check if a block is in a valid range will need to update to use this new API as soon as possible.
EntityExhaustionEvent: This is a new event, which gets called when a human experiences exhaustion. This can be used by plugins to disable exhaustion, or change the amount of exhaustion that is applied to a player from different sources.
Zombified Piglin Spawn Reason: This is a new spawn reason for entity spawning that represents when a piglin turns into a zombified piglin.
Adventure APIs: There are many new APIs for the new Adventure library. The sendMessage()
methods still look the same, but things like working with item metas now use displayName(Component)
and lore(List<Component>)
instead of setDisplayName
and setLore
.
Item Rarity API: The item rarity API can help plugins figure out what vanilla rarity an item has. Rarity changes the color that items appear as in chat, but doesn’t have many uses outside of that.
EnchantmentTarget.BOW_AND_CROSSBOW: This is a new target that checks whether an item can receive bow or crossbow enchants.
Thanks for reading our first newsletter, this would not be possible without our Patreons, so another thank you to them! We’re excited to start releasing these monthly, however we are also considering releasing these bi-monthly. If you think a bi-monthly schedule would make more sense, please let us know in the Discord! Have a great month, and congratulations on surviving April Fools.
Legal Stuff