# 5.34.0 Released 26th September 2025. This is a minor feature release containing performance improvements, new gameplay features, new API additions and network changes. **Plugin compatibility:** Plugins for previous 5.x versions will run unchanged on this release, unless they use internal APIs, reflection, or packages like the `pocketmine\network\mcpe` or `pocketmine\data` namespace. Do not update plugin minimum API versions unless you need new features added in this release. **WARNING: If your plugin uses the `pocketmine\network\mcpe` namespace, you're not shielded by API change constraints.** Consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you're using packets directly. ## General - PocketMine-MP now requires and uses [`pmmp/ext-encoding`](https://github.com/pmmp/ext-encoding) version `1.0.0`, a PHP extension designed to significantly improve performance of data encoding and decoding (@dktapps). - This first pass only implements support in low-risk areas, such as network protocol and read-only data. Further integration will follow in future minor versions with additional performance improvements. - While ext-encoding has been heavily tested, we can't be sure there won't be major issues once it reaches production. Please report any bugs you find on the GitHub issue tracker. - New Bedrock OpenID authentication support has been implemented (@dries-c, @dktapps). - This system fetches keys from an API provided by Microsoft. Therefore, your server must now have internet access to authenticate players. - `/timings paste` now creates private reports by default on `timings.pmmp.io` (@dktapps). - Private reports require an access token to view, so your timings reports can no longer be viewed by others just by guessing the ID. - If you're using a custom timings host, be sure to update it to get support for this feature. - The command will generate a warning in the console if the target timings host doesn't support private reports. ## Performance - Significantly improved performance of packet encoding and decoding using `ext-encoding` (@dktapps). - Unnecessary NBT is now stripped from items before sending them over the network. This significantly improves performance when working with writable books, shulker boxes, etc. (@dktapps). - Improved performance of item saving in `ItemSerializer` by avoiding slow `hasNamedTag()` call followed by `getNamedTag()` (both will rebuild the NBT) (@dktapps). ## Gameplay - Implemented basic Trident functionality (@IvanCraft623). - Implemented Firework and Firework Star (@IvanCraft623). - Editing the rear side of signs is now supported (@dktapps). - Sneaking hitbox height has been adjusted to match vanilla (@Dasciam). ## API ### General - `pocketmine/nbt` version `1.2.0` is now used ([changelog](https://github.com/pmmp/NBT/releases/tag/1.2.0)). - `pmmp/ext-encoding` version `1.0.0` is now required and used. - This can be used as a faster alternative to `BinaryStream` and `Binary` in most use cases. However, please note that its API is very different, and it hasn't been battle-tested yet. - A recent JetBrains IDE stub can be found in our [custom stubs repository](https://github.com/pmmp/phpstorm-stubs/blob/fork/encoding/encoding.php). ### `pocketmine\block` - The following API methods have been added: - `public BaseSign->getFaceText(bool $frontFace) : SignText` - `public BaseSign->setFaceText(bool $frontFace, SignText $text) : $this` - `public BaseSign->updateFaceText(Player $author, bool $frontFace, SignText $text) : bool` - called by the network system when a player edits a sign, triggers `SignChangeEvent` etc. - `protected BaseSign->getHitboxCenter() : Vector3` - returns the center of the sign's hitbox, used to decide which face of the sign the player is editing - `protected BaseSign->getFacingDegrees() : float` (to become abstract in PM6) - returns the horizontal facing of the sign in degrees, used to decide which face of the sign the player is editing - The following API methods have been deprecated: - `public BaseSign->getText() : SignText` - use `getFaceText()` instead - `public BaseSign->setText(SignText $text) : $this` - use `setFaceText()` instead - `public BaseSign->updateText(Player $author, SignText $text) : bool` - use `updateFaceText()` instead ### `pocketmine\entity` - The following API classes have been added: - `NeverSavedWithChunkEntity` - implement this instead of overriding `canSaveWithChunk()` if your entity will never need a save ID - Used currently by `Player` and `FireworkRocket`. - `animation\FireworkParticlesAnimation` - `object\FireworkRocket` - `projectile\Trident` - The following API methods have been added: - `public Living->getSneakOffset() : float` - returns how much the entity's hitbox is shortened and eye height lowered when sneaking (0 by default) - `protected Projectile->despawnsOnEntityHit() : bool` - returns `true` by default, overridden by tridents (to be removed in a future major version in favour of cleaner BC-breaking methods) ### `pocketmine\event\block` - The following API methods have been added: - `public SignChangeEvent->isFrontFace() : bool` - returns `true` if the front face of the sign is being edited, `false` for the rear face ### `pocketmine\inventory\transaction` - `InventoryTransaction` no longer shuffles actions before executing a transaction. - This was intended to prevent dependency on weird client behaviour, but it is no longer necessary, as the order is now consistent since the introduction of the `ItemStackRequest` system. ### `pocketmine\item` - The following API classes have been added: - `FireworkRocket` - `FireworkRocketExplosion` - `FireworkRocketType` (enum) - `FireworkStar` - `Trident` - The following API methods have been added: - `VanillaItems::FIREWORK_ROCKET() : FireworkRocket` - `VanillaItems::FIREWORK_STAR() : FireworkStar` - `VanillaItems::TRIDENT() : Trident` ### `pocketmine\player` - The following API methods have signature changes: - `Player->openSignEditor()` now accepts an optional `bool $frontFace = true` parameter ### `pocketmine\world\sound` - The following API classes have been added: - `FireworkCrackleSound` - `FireworkExplosionSound` - `FireworkLargeExplosionSound` - `FireworkLaunchSound` - `TridentHitEntitySound` - `TridentHitBlockSound` - `TridentThrowSound` ## Internals - Many low-risk data handling areas have been switched to use `ext-encoding`, including: - Bedrock packets - Bedrock chunk serialization - `FastChunkSerializer` (used for transmitting chunks between threads) - GS4 Query - Auxiliary read-only data loading in the `pocketmine\data\bedrock` package