0
0
mirror of https://github.com/pmmp/PocketMine-MP.git synced 2025-02-06 14:59:46 +00:00
2025-01-22 18:00:41 +00:00

6.5 KiB

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 CompressBatchPromises. 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.