From 0e8b28716a09b4837455f8845b6d2f1113403cb8 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 25 Mar 2023 20:51:34 +0000 Subject: [PATCH] Release 4.18.0 --- changelogs/4.18.md | 80 +++++++++++++++++++++++++++++++++++++++++++++ src/VersionInfo.php | 6 ++-- 2 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 changelogs/4.18.md diff --git a/changelogs/4.18.md b/changelogs/4.18.md new file mode 100644 index 000000000..b7b7509a6 --- /dev/null +++ b/changelogs/4.18.md @@ -0,0 +1,80 @@ +**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. + +### Highlights +This version significantly improves server performance with many players and/or entities by making changes to the internal network system. + +It also introduces support for the newer `ItemStackRequest` protocol, which fixes many bugs and improves server security. + +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 +Released 25th March 2023. + +## General +- Significantly improved server performance in congested areas of the world (lots of players and/or entities in the same area). +- Included more sections of the network system in `Player Network Send` performance timings. +- Changed the names of some performance timings to make them more user-friendly. +- Removed packet IDs from `receivePacket` and `sendPacket` performance timings, as they were not very useful. +- Added new specialized performance timings 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\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 + +### `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 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` (internals backwards compatibility break, not covered by API version guarantee). + - `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. +- 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. \ No newline at end of file diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 779298f36..a6a9a0daa 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,9 +31,9 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.18.0-ALPHA3"; - public const IS_DEVELOPMENT_BUILD = true; - public const BUILD_CHANNEL = "alpha"; + public const BASE_VERSION = "4.18.0"; + public const IS_DEVELOPMENT_BUILD = false; + public const BUILD_CHANNEL = "stable"; private function __construct(){ //NOOP