mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-02-06 14:59:46 +00:00
6.5 KiB
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 usesstring
for completed caches directly instead of keeping them wrapped inCompressBatchPromise
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 alwaystrue
)memory.garbage-collection.low-memory-trigger
(now alwaystrue
)memory.max-chunks.trigger-chunk-collect
(now alwaystrue
)memory.world-caches.disable-chunk-cache
(now alwaystrue
)memory.world-caches.low-memory-trigger
(now alwaystrue
)
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 toMemoryDump
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 speedpublic 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 forSTRIKETHROUGH
andUNDERLINE
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 usingTerminal::$FORMAT_UNDERLINE
andTerminal::$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 callgetBlock()
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 afteronRun()
completes. As withMemoryManager
, 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 breakingint|float
comparisons.