6.7 KiB
For Minecraft: Bedrock Edition 1.19.70
Note about API versions
Plugins which don't touch the pocketmine\network\mcpe
namespace are compatible with any previous 4.x.y version will also run on these releases and do not need API bumps.
Plugin developers should only update their required API to this version if you need the changes in this build.
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.
Alpha release warning
Alpha releases are experimental. Features introduced in these releases are subject to change or removal.
APIs which existed prior to this version will continue to work as normal, so plugins which use them will continue to work.
Highlights
This version makes changes to the internal network system to improve server performance and reduce memory usage.
While these changes don't affect non-internal API, they are still significant enough to warrant a new minor version, as they may break plugins which use the internal network API (not recommended).
4.18.0-ALPHA1
Released 16th March 2023.
General
- Improved server performance in congested areas of the world (lots of players and/or entities in the same area).
API
pocketmine\event\server
- The following new classes have been added:
DataPacketDecodeEvent
- called before a packet is decoded by aNetworkSession
; useful to mitigate DoS attacks if PocketMine-MP hasn't been patched against new bugs yet
Internals
- Introduced new system for broadcasting entity events to network sessions.
- This change improves performance when lots of players and/or entities are in the same area.
- New interface
EntityEventBroadcaster
and classStandardEntityEventBroadcaster
have been added to implement this. - All entity-specific
on*()
andsync*()
methods have been removed fromNetworkSession
(BC break). NetworkSession
now accepts anEntityEventBroadcaster
instance in its constructor.NetworkBroadcastUtils::broadcastEntityEvent()
can be used to efficiently broadcast events to unique broadcasters shared by several network sessions.
- All network sessions now share the same
PacketSerializerContext
andPacketBroadcaster
by default.- Previously, every session had its own context, meaning that broadcast optimisations were not used, causing significant performance losses compared to 3.x.
- This change improves performance in congested areas by allowing reuse of previously encoded packet buffers for all sessions sharing the same context.
- Packet broadcasts are automatically encoded separately per unique
PacketSerializerContext
instance. This allows, for example, a multi-version fork to have a separate context for each protocol version, to ensure maximum broadcast efficiency while encoding different packets for different versions. PacketSerializerContext
is now passed inNetworkSession::__construct()
, instead of being created by the session.
StandardPacketBroadcaster
is now locked to a singlePacketSerializer
context, reducing complexity.- Introduced
NetworkBroadcastUtils::broadcastPackets()
, replacingServer->broadcastPackets()
. Server->broadcastPackets()
has been deprecated. It will be removed in a future version.
4.18.0-ALPHA2
Released 21st March 2023.
General
- Included more sections of the network system in Player Network Send timings.
- Changed the names of some timings to make them more user-friendly.
- Removed packet IDs from
receivePacket
andsendPacket
timings, as they were not very useful. - Added new specialized timers for the following:
- Item entity base ticking (merging)
- Player movement processing
- Entity movement processing (collision checking section)
- Projectile movement (all)
- Projectile movement processing (ray tracing section)
API
pocketmine\crafting
- The following new API methods have been added:
CraftingManager->getCraftingRecipeIndex() : array<int, CraftingRecipe>
- returns a list of all crafting recipesCraftingManager->getCraftingRecipeFromIndex(int $index) : ?CraftingRecipe
- returns the crafting recipe at the given index, or null if it doesn't exist
pocketmine\inventory\transaction
- The following API methods have changed signatures:
CraftingTransaction->__construct()
now accepts additional arguments?CraftingRecipe $recipe = null, ?int $repetitions = null
- The following new API methods have been added:
TransactionBuilderInventory->getActualInventory() : Inventory
- returns the actual inventory that this inventory is a proxy for
Internals
Network
- Introduced support for the
ItemStackRequest
Minecraft: Bedrock network protocol.- This fixes a large number of inventory- and crafting-related bugs.
- This also improves server security by closing off many code pathways that might have been used for exploits.
TypeConverter->netItemStackToCore()
is no longer used in server code, and remains for tool usage only. - This system is also significantly more bandwidth-efficient and has lower overhead than the legacy system.
- This now opens the gateway to easily implement lots of gameplay features which have been missing for a long time, such as enchanting, anvils, looms, and more.
- Significant changes have been made to
pocketmine\network\mcpe\InventoryManager
internals. These shouldn't affect plugins, but may affect plugins which use internal network API. - No changes have been made to the plugin
InventoryTransaction
API.- This system has been implemented as a shim for the existing PocketMine-MP transaction system to preserve plugin compatibility. Plugins using
InventoryTransactionEvent
should continue to work seamlessly. - The
InventoryTransaction
API will be redesigned in a future major version to make use of the new information provided by theItemStackRequest
system.
- This system has been implemented as a shim for the existing PocketMine-MP transaction system to preserve plugin compatibility. Plugins using
InventoryTransactionPacket
is no longer sent by the client for "regular" inventory actions. However, it is still sent when dropping items, interacting with blocks, and using items.
- Inventory slot and content syncing is now buffered until the end of the tick. This reduces outbound network usage when the client performs multiple transactions in a single tick (e.g. crafting a stack of items).
- Renamed some
InventoryManager
internal properties to make them easier to understand. TypeConverter->createInventoryAction()
has been removed.- Packet batch limit has been lowered to
100
packets. With the introduction ofItemStackRequest
, this is more than sufficient for normal gameplay.
Other
- Use
Vector3::zero()
instead ofnew Vector3()
in some places.