**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 a `NetworkSession`; 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 class `StandardEntityEventBroadcaster` have been added to implement this. - All entity-specific `on*()` and `sync*()` methods have been removed from `NetworkSession` (BC break). - `NetworkSession` now accepts an `EntityEventBroadcaster` 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` and `PacketBroadcaster` 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 in `NetworkSession::__construct()`, instead of being created by the session. - `StandardPacketBroadcaster` is now locked to a single `PacketSerializer` context, reducing complexity. - Introduced `NetworkBroadcastUtils::broadcastPackets()`, replacing `Server->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` and `sendPacket` 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` - returns a list of all crafting recipes - `CraftingManager->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 the `ItemStackRequest` system. - `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 of `ItemStackRequest`, this is more than sufficient for normal gameplay. ### Other - Use `Vector3::zero()` instead of `new Vector3()` in some places.