Released 17th December 2025.
This is a minor feature release, including major performance improvements to world generation, new gameplay features, new API additions and other improvements.
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.
- The performance of the
Normalworld generator has been improved by over 500%. (@dktapps) This is a combination of several changes:- Restructuring of 3D lerp handling
- Avoiding generating 3D noise when it's not useful
- Improvements to
GroundCoverperformance - Improvements to ore generation
- Standardising highest-block calculation using faster APIs
- The timings system will now automatically write timings to a file in the
timingsfolder on server shutdown. (@remminiscent, @dktapps) - Timings files generated by the server now use the current date and time in the file name, similar to crashdumps. (@remminiscent, @dktapps)
- Localised messages in various commands, including
/status,/setworldspawn,/plugins,/teleport, and others. (@dktapps, Crowdin contributors) - Fixed translated messages in
/spawnpointcommand. (@siyFred) - Added support for
@scommand selector. (@dktapps) /effectnow acceptsinfinitefor the duration. (@remminiscent)
- Crouching and holding the sneak key are now treated separately by the server. This allows the player to use interactive blocks while in a 1.5 block high space (forced to crouch), and to disable block interaction while flying without visually crouching by pressing shift+space. (@Dasciam)
- The following blocks have been added:
- Crimson and Warped Fungus (@DavyCraft648)
- Crimson and Warped Nylium (@DavyCraft648)
- Infested Deepslate (@DavyCraft648)
- Nether Sprouts (@DavyCraft648)
- Structure Void (@dktapps)
- The following items have been added:
- Copper Helmet, Chestplate, Leggings, Boots and Nuggets (@ValresMC)
- Copper Axe, Hoe, Pickaxe, Shovel and Sword (@dktapps)
- Implemented Crimson and Warped Huge Fungi trees. (@DavyCraft648)
- Netherrack can now be turned into crimson or warped nylium by using bone meal on it. (@DavyCraft648)
- Added support for infinite effects. (@remminiscent, @dktapps)
- Implemented magic critical hits when a mob is attacked by an enchanted weapon. (@Dasciam)
- Script plugins may now omit the
@nameand@versiontags in their manifest. These will be autofilled withScriptPlugin_<filename>and1.0.0respectively. (@dktapps, @sof3) - Added example folder and script plugins in the
examples/pluginsfolder.
- The following classes have been added:
InfestedPillar- used by infested deepslateNetherFungusNetherSprouts
InfestedStoneis no longer final.- The following registry cases have been added:
VanillaBlocks::CRIMSON_FUNGUS()VanillaBlocks::CRIMSON_NYLIUM()VanillaBlocks::INFESTED_DEEPSLATE()VanillaBlocks::NETHER_SPROUTS()VanillaBlocks::STRUCTURE_VOID()VanillaBlocks::WARPED_FUNGUS()VanillaBlocks::WARPED_NYLIUM()
- The following constants have been added:
BlockTypeTags::NYLIUMBlockTypeTags::HUGE_FUNGUS_REPLACEABLE
- Right-clicking on an incomplete bed will now generate a localised message.
- The following classes have been appropriately marked as
@internalwith some basic documentation about their purpose (@dktapps):CommandExecutorFormattedCommandAliasPluginCommand
- The following classes have been deprecated:
ClosureCommandCommandExecutor
VanillaCommand->fetchPermittedPlayerTarget()now understands@sto mean the sender of the command.
EffectInstancenow supports infinite effects.- Due to constraints imposed by
Effect->canTick(), this is slightly hacky. Effect->getDuration()will still tick down for infinite effects to allow effects like Poison to tick, but their durations will underflow toLimits::INT32_MAXif they would have reached zero.Effect->canTick()has been deprecated in favour of the newly addedEffect->getApplyInterval(), which constrains us less and will be used in PM6.
- Due to constraints imposed by
- The following API methods have been added:
public Effect->getApplyInterval(EffectInstance $instance) : int- returns the tick interval of the effect, or 0 if it doesn't tick (@dktapps)public EffectInstance->isInfinite() : bool- returns whether the effect will last forever (@remminiscent)
- The following API methods have been deprecated:
Effect->canTick()- use (or implement, if you're making a custom effect)getApplyInterval()instead (@dktapps)
- The following classes have been added:
MagicHitAnimation- displays critical hit particles normally seen when hitting a mob with an enchanted weapon (@Dasciam)
- The following API methods have signature changes:
CriticalHitAnimation->__construct()has a new optional parameterint $particleCount(@Dasciam)
PlayerToggleSneakEventmay now be called by the server in a pre-cancelled state if the player's "sneak pressed" state changed, but they didn't start/stop crouching. This pre-cancelled event can be captured by event handlers with the@handleCancelledPHPDoc tag. (@Dasciam)- The following API methods have been added:
PlayerToggleSneakEvent->isSneakPressed() : bool- returns whether the player is intentionally activating sneak mode (@Dasciam)
- The following enum cases have been added:
ToolTier::COPPER
- The following registry cases have been added:
VanillaArmorMaterials::COPPER()VanillaItems::COPPER_AXE()VanillaItems::COPPER_BOOTS()VanillaItems::COPPER_CHESTPLATE()VanillaItems::COPPER_HELMET()VanillaItems::COPPER_HOE()VanillaItems::COPPER_LEGGINGS()VanillaItems::COPPER_NUGGET()VanillaItems::COPPER_PICKAXE()VanillaItems::COPPER_SHOVEL()VanillaItems::COPPER_SWORD()
- The following API methods have been added:
public Player->isSneakPressed() : bool- returns whether the player has intentionally activated sneak mode; may differ fromisSneaking()when e.g. the player is stuck in a 1.5 block space (@Dasciam)public Player->setSneakPressed() : void- sets whether the player has intentionally activated sneak mode (@Dasciam)
- The following API methods have signature changes:
Player->toggleSneak()now accepts an optionalbool $sneakPressed = trueparameter (@Dasciam)
- The following API methods have been added:
public TimingsHandler::createReportFile(string $directory, ?string $fileName = null) : Promise<string>- writes the current timings state to a file, used by/timings report
Gaussiannow has additionalkernel1DandweightSum1Dpublic fields.
- The following classes have been added:
NetherTree
- The following enum cases have been added:
TreeType::CRIMSONTreeType::WARPED
- The following classes have been added:
ArmorEquipCopperSound
- Docker image source is now managed directly in the main repo for easier version management and first-class testing. (@dktapps)
- Several improvements have been made to the Docker image (@dktapps):
- Avoid unnecessary image rebuilds when only PM code changed
- Caching of prebuilt PHP binaries now works
- Consistent directory structure between different build stages to remove the need for
php.inihacks - Added support for
POCKETMINE_ARGSenvironment variable to pass custom options toPocketMine-MP.phar(e.g.--no-log-file)
- Docker image is now built and tested for every commit. (@dktapps)
- TesterPlugin framework has been improved to no longer require creating a new class for each test. (@dktapps)
- PHPStan template types have now been added to event handler internals wherever possible. This is enabled by newer PHPStan improvements. (@dktapps)
- Reduced boilerplate code in
DefaultPermissionsregistration. (@dktapps) - Added generated
KnownTranslationParameterInfo, used byDefaultPermissionsto check that its constructed translation keys are correct. (@dktapps) build/generate-registry-annotations.phpwill now generate an intersection of parent class and implemented interfaces if an anonymous class is detected. (@dktapps)
Released 21st December 2025.
- Fixed
/statuscommand causing clients to disconnect (client side issue with translation parameter count). (@TwistedAsylumMC, @dktapps) - Fixed authentication key refresh bug that was causing newly joining players to fail authentication on long-running servers. (@leolee3914, @dktapps)
- Fixed collision box of snow layers. (@kostamax27)
- Fixed permissions of application files in the Docker image. They are now located in
/opt/pocketmine(as opposed to the previously used non-standard/pocketmine) with the typical permissions for/opt(755), and are no longer writeable by the server process during runtime. (@dktapps)
- Added CI checks to make sure language
.inifiles don't have byte-order marks (BOM). (@dktapps)
Released 26th December 2025.
- Fixed various PHP 8.5 deprecation notices. (@dktapps)
- Fixed deprecation notice on PHP 8.4 due to
E_STRICTconstant usage inErrorTypeToStringMap(dependency issue). (@dktapps) - Fixed
Utils::validateCallableSignature()not acceptingobjectas a supertype of a class type (dependency issue). (@dktapps) - Fixed players being interactable in the (very short) span of time between disconnect and entity deletion. (@dktapps, @kostamax27)
- Fixed blocks appearing in the wrong place while bridging and other block lag & flickering issues. (@dktapps)
- Fixed goat horns not working after holding the use button to activate them. (@dktapps)
- Fixed trapdoor collision box not matching vanilla Bedrock. (@dktapps, @kostamax27)
- Modal form response JSON size is now capped to 10 KiB. (@dktapps, @Psycofeu)
- Modal form response JSON is no longer decoded if the form ID is not valid. (@dktapps, @Zwuiix-cmd)
- Eating particles and sounds are now server-controlled. Previously, these relied on
ActorEventPacketfrom the client. (@dktapps)
- Improved documentation of
pocketmine\item\Releasable. (@dktapps)
- Added PHP 8.5 to test matrix. (@dktapps)
- Updated several dependencies for PHP 8.5 support. (@dktapps)
Released 27th January 2026.
- Character limit for writable books has been raised to 512 to accommodate vanilla oddities. (@Gaprix)
- Fixed
Player->isSneakPressed()not updating correctly when releasing the sneak key while in forced-crouch state. (@leolee3914) - Fixed
ZippedResourcePacknot validating manifest header UUIDs, fixing incorrect crash attribution onPlayerResourcePackOfferEvent(and if plugins used reflection onResourcePackManager, which they really shouldn't be - use the provided APIs!). (@dktapps) - Fixed biomes not being set in
flatworld generation. (@remminiscent) - Fixed key validation for self-signed authentication JWTs. (@dktapps)
- Fixed query interface incorrectly rejecting tokens if the expected token was negative. (@NopeNotDark)
- Added information about PHPStan and PHPUnit to contributing guidelines to assist new contributors. (@dktapps)
- Crash reporting is now properly disabled on GitHub Actions runners. (@dktapps)
- The
SECURITY.mdfile now recommends submitting a private report on the GitHub repository's Security tab. The security email inbox should only be used if you're unable to use GitHub. (@dktapps)