# 5.24.0 Released 22nd January 2025. This is a minor feature release, including new gameplay features, performance improvements, and minor API additions. **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. ## Performance - PHP garbage collection is now managed by the server, instead of being automatically triggered by PHP. - The mechanism for GC triggering is designed to mimic PHP's to avoid behavioural changes. Only the place it's triggered from should be significantly different. - This change also avoids unnecessary GCs during object-heavy operations, such as encoding `CraftingDataPacket`. As such, performance during server join should see an improvement. - Timings is now able to directly measure the impact of GC. Previously, GC would show up as random spikes under random timers, skewing timing results. - `ChunkCache` now uses `string` for completed caches directly instead of keeping them wrapped in `CompressBatchPromise`s. This reduces memory usage, improves performance, and reduces GC workload. ## Configuration - The following settings have been removed from `pocketmine.yml` and will no longer have any effect: - `memory.garbage-collection.collect-async-worker` (now always `true`) - `memory.garbage-collection.low-memory-trigger` (now always `true`) - `memory.max-chunks.trigger-chunk-collect` (now always `true`) - `memory.world-caches.disable-chunk-cache` (now always `true`) - `memory.world-caches.low-memory-trigger` (now always `true`) ## Gameplay - Added the following new blocks: - All types of pale oak wood, and leaves - Resin - Resin Bricks, Slabs, Stairs, and Walls - Resin Clump - Chiseled Resin Bricks - Some blocks have had their tool tier requirements adjusted to match latest Bedrock updates. - Added the following new items: - Resin Brick - Music Disc - Creator - Music Disc - Creator (Music Box) - Music Disc - Precipice - Music Disc - Relic ## API ### General - Many places had their PHPDoc improved to address issues highlighted by PHPStan 2.x. This may cause new, previously unreported issues to be reported in plugins using PHPStan. ### `pocketmine` - The following methods have been deprecated: - `MemoryManager->canUseChunkCache()` - `MemoryManager::dumpMemory()` - relocated to `MemoryDump` class ### `pocketmine\item` - The following new enum cases have been added: - `RecordType::DISK_CREATOR` - `RecordType::DISK_CREATOR_MUSIC_BOX` - `RecordType::DISK_PRECIPICE` - `RecordType::DISK_RELIC` ### `pocketmine\player` - The following new methods have been added: - `public Player->getFlightSpeedMultiplier() : float` - a base multiplier for player's flight speed - `public Player->setFlightSpeedMultiplier(float $flightSpeedMultiplier) : void` - sets the player's flight speed multiplier - The following new constants have been added: - `Player::DEFAULT_FLIGHT_SPEED_MULTIPLIER` ### `pocketmine\utils` - The following new methods have been added: - `public static TextFormat::javaToBedrock(string $string) : string` - removes unsupported Java Edition format codes to prevent them being incorrectly displayed on Bedrock - The following methods have behavioural changes: - `TextFormat::toHTML()` now converts `§m` to redstone red (instead of strikethrough), and `§n` to copper orange (instead of underline). This is because the codes previously used for `STRIKETHROUGH` and `UNDERLINE` conflict with the new material codes introduced by Minecraft Bedrock. - `Terminal::toANSI()` now converts `§m` to redstone red (instead of strikethrough), and `§n` to copper orange (instead of underline), as above. However, underline and strikethrough can still be used on the terminal using `Terminal::$FORMAT_UNDERLINE` and `Terminal::$FORMAT_STRIKETHROUGH` respectively. - The following new constants have been added: - `TextFormat::MATERIAL_QUARTZ` - `TextFormat::MATERIAL_IRON` - `TextFormat::MATERIAL_NETHERITE` - `TextFormat::MATERIAL_REDSTONE` - `TextFormat::MATERIAL_COPPER` - `TextFormat::MATERIAL_GOLD` - `TextFormat::MATERIAL_EMERALD` - `TextFormat::MATERIAL_DIAMOND` - `TextFormat::MATERIAL_LAPIS` - `TextFormat::MATERIAL_AMETHYST` - The following constants have been deprecated: - `TextFormat::STRIKETHROUGH` - `TextFormat::UNDERLINE` - The following static properties have been added: - `Terminal::$COLOR_MATERIAL_QUARTZ` - `Terminal::$COLOR_MATERIAL_IRON` - `Terminal::$COLOR_MATERIAL_NETHERITE` - `Terminal::$COLOR_MATERIAL_REDSTONE` - `Terminal::$COLOR_MATERIAL_COPPER` - `Terminal::$COLOR_MATERIAL_GOLD` - `Terminal::$COLOR_MATERIAL_EMERALD` - `Terminal::$COLOR_MATERIAL_DIAMOND` - `Terminal::$COLOR_MATERIAL_LAPIS` - `Terminal::$COLOR_MATERIAL_AMETHYST` ## Tools - Fixed some UI issues in `tools/convert-world.php` ## Internals - Block cache in `World` is now size-limited. This prevents memory exhaustion when plugins call `getBlock()` many thousands of times with cache misses. - `RakLibServer` now disables PHP GC. As RakLib doesn't generate any unmanaged cycles, GC is just a waste of CPU time in this context. - `MemoryManager` now has the responsibility for triggering cycle GC. It's checked every tick, but GC won't take place unless the GC threshold is exceeded, similar to PHP. - This mechanism could probably do with alterations to better suit PocketMine-MP, but it was chosen to mimic PHP's own GC to minimize behavioural changes for now. - `AsyncTask` now triggers cycle GC after `onRun()` completes. As with `MemoryManager`, this is based on a threshold designed to mimic PHP's own behaviour. - `FormatConverter` now performs world provider GC periodically. This is not needed with current active providers, but was found to be a problem while developing custom providers. - Various internal adjustments were made to avoid returning incorrectly-keyed arrays in the code. These changes shouldn't affect anything as the arrays should have been properly ordered anyway. - Many places that previously used `==` and `!=` have been updated to use strict variants. This kind of change needs to be done carefully to avoid breaking `int|float` comparisons.