Skip to content

Latest commit

 

History

History
206 lines (176 loc) · 12.1 KB

File metadata and controls

206 lines (176 loc) · 12.1 KB

5.39.0

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.

General

  • The performance of the Normal world 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 GroundCover performance
    • Improvements to ore generation
    • Standardising highest-block calculation using faster APIs
  • The timings system will now automatically write timings to a file in the timings folder 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 /spawnpoint command. (@siyFred)
  • Added support for @s command selector. (@dktapps)
  • /effect now accepts infinite for the duration. (@remminiscent)

Gameplay

  • 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)

API

General

  • Script plugins may now omit the @name and @version tags in their manifest. These will be autofilled with ScriptPlugin_<filename> and 1.0.0 respectively. (@dktapps, @sof3)
  • Added example folder and script plugins in the examples/plugins folder.

pocketmine\block

  • The following classes have been added:
    • InfestedPillar - used by infested deepslate
    • NetherFungus
    • NetherSprouts
  • InfestedStone is 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::NYLIUM
    • BlockTypeTags::HUGE_FUNGUS_REPLACEABLE
  • Right-clicking on an incomplete bed will now generate a localised message.

pocketmine\command

  • The following classes have been appropriately marked as @internal with some basic documentation about their purpose (@dktapps):
    • CommandExecutor
    • FormattedCommandAlias
    • PluginCommand
  • The following classes have been deprecated:
    • ClosureCommand
    • CommandExecutor
  • VanillaCommand->fetchPermittedPlayerTarget() now understands @s to mean the sender of the command.

pocketmine\entity\effect

  • EffectInstance now 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 to Limits::INT32_MAX if they would have reached zero.
    • Effect->canTick() has been deprecated in favour of the newly added Effect->getApplyInterval(), which constrains us less and will be used in PM6.
  • 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)

pocketmine\entity\animation

  • 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 parameter int $particleCount (@Dasciam)

pocketmine\event

  • PlayerToggleSneakEvent may 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 @handleCancelled PHPDoc tag. (@Dasciam)
  • The following API methods have been added:
    • PlayerToggleSneakEvent->isSneakPressed() : bool - returns whether the player is intentionally activating sneak mode (@Dasciam)

pocketmine\item

  • 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()

pocketmine\player

  • The following API methods have been added:
    • public Player->isSneakPressed() : bool - returns whether the player has intentionally activated sneak mode; may differ from isSneaking() 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 optional bool $sneakPressed = true parameter (@Dasciam)

pocketmine\timings

  • 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

pocketmine\world\generator

  • Gaussian now has additional kernel1D and weightSum1D public fields.

pocketmine\world\generator\object

  • The following classes have been added:
    • NetherTree
  • The following enum cases have been added:
    • TreeType::CRIMSON
    • TreeType::WARPED

pocketmine\world\sound

  • The following classes have been added:
    • ArmorEquipCopperSound

Internals

  • 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.ini hacks
    • Added support for POCKETMINE_ARGS environment variable to pass custom options to PocketMine-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 DefaultPermissions registration. (@dktapps)
  • Added generated KnownTranslationParameterInfo, used by DefaultPermissions to check that its constructed translation keys are correct. (@dktapps)
  • build/generate-registry-annotations.php will now generate an intersection of parent class and implemented interfaces if an anonymous class is detected. (@dktapps)

5.39.1

Released 21st December 2025.

Fixes

  • Fixed /status command 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)

Internals

  • Added CI checks to make sure language .ini files don't have byte-order marks (BOM). (@dktapps)

5.39.2

Released 26th December 2025.

Core

  • Fixed various PHP 8.5 deprecation notices. (@dktapps)
  • Fixed deprecation notice on PHP 8.4 due to E_STRICT constant usage in ErrorTypeToStringMap (dependency issue). (@dktapps)
  • Fixed Utils::validateCallableSignature() not accepting object as 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)

Gameplay

  • 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)

Network

  • 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 ActorEventPacket from the client. (@dktapps)

Documentation

  • Improved documentation of pocketmine\item\Releasable. (@dktapps)

Internals

  • Added PHP 8.5 to test matrix. (@dktapps)
  • Updated several dependencies for PHP 8.5 support. (@dktapps)

5.39.3

Released 27th January 2026.

Fixes

  • 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 ZippedResourcePack not validating manifest header UUIDs, fixing incorrect crash attribution on PlayerResourcePackOfferEvent (and if plugins used reflection on ResourcePackManager, which they really shouldn't be - use the provided APIs!). (@dktapps)
  • Fixed biomes not being set in flat world generation. (@remminiscent)
  • Fixed key validation for self-signed authentication JWTs. (@dktapps)
  • Fixed query interface incorrectly rejecting tokens if the expected token was negative. (@NopeNotDark)

Documentation

  • 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.md file 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)