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)