diff --git a/changelogs/4.13.md b/changelogs/4.13.md new file mode 100644 index 000000000..085cc0349 --- /dev/null +++ b/changelogs/4.13.md @@ -0,0 +1,94 @@ +**For Minecraft: Bedrock Edition 1.19.50** + +This is a minor feature release for PocketMine-MP, introducing some new features and improvements. + +### Note about API versions +Plugins which don't touch the protocol and 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 protocol, you're not shielded by API change constraints.** You should consider using the `mcpe-protocol` directive in `plugin.yml` as a constraint if you do. + +# 4.13.0 +Released 30th January 2023. + +## Gameplay +- Death message is now shown on the death screen when a player dies. +- Armour damage is now only increased if the armour reduced the damage taken. +- Implemented Swift Sneak enchantment. +- Fixed incorrect collision box calculation of walls and glass/bars when connected. Note: Client-side, wall connections are still broken; this only fixes projectile flight server-side. + +## Performance +- Improved performance of chunk selection for chunk random ticking using a cache. This improves performance of chunk random ticking by 10-20%. + +## Localization +- Added localized description for the `/dumpmemory` command. + +## Permissions +- Added the following new core permissions: + - `pocketmine.command.effect.other` - allows the player to use the `/effect` command on other players (default operator only) + - `pocketmine.command.effect.self` - allows the player to use the `/effect` command on themselves (default operator only) + - `pocketmine.command.enchant.other` - allows the player to use the `/enchant` command on other players (default operator only) + - `pocketmine.command.enchant.self` - allows the player to use the `/enchant` command on themselves (default operator only) + - `pocketmine.command.gamemode.other` - allows the player to use the `/gamemode` command on other players (default operator only) + - `pocketmine.command.gamemode.self` - allows the player to use the `/gamemode` command on themselves (default operator only) + - `pocketmine.command.give.other` - allows the player to use the `/give` command on other players (default operator only) + - `pocketmine.command.give.self` - allows the player to use the `/give` command on themselves (default operator only) + - `pocketmine.command.spawnpoint.other` - allows the player to use the `/spawnpoint` command on other players (default operator only) + - `pocketmine.command.spawnpoint.self` - allows the player to use the `/spawnpoint` command on themselves (default operator only) + - `pocketmine.command.teleport.other` - allows the player to use the `/teleport` command on other players (default operator only) + - `pocketmine.command.teleport.self` - allows the player to use the `/teleport` command on themselves (default operator only) + - `pocketmine.command.title.other` - allows the player to use the `/title` command on other players (default operator only) + - `pocketmine.command.title.self` - allows the player to use the `/title` command on themselves (default operator only) + +## Internals +- Decoupled `Player->sendMessage()` and `Player->sendTranslation()`. +- Refactored resource pack loading in `ResourcePackManager` to make it easier to understand. +- Client-aware translation processing has been moved to `NetworkSession` due to being client-specific. +- Replaced hardcoded strings with constants in various places. +- `NetworkSession` destructive cleanup is now deferred to the next session tick. This fixes various `InventoryManager` crashes when kicking players during events. +- Updated code using `strpos()` to use `str_starts_with()`, `str_ends_with()` and `str_contains()` where appropriate. +- Added documentation for some internal methods. + +## API +### `pocketmine\command` +- The following new API methods have been added: + - `protected VanillaCommand->fetchPermittedPlayerTarget(...) : ?Player` - fetches a player target according to the given sender permissions, or null if not found or not permitted + +### `pocketmine\entity` +- The following new API methods have been added: + - `public Living->getDisplayName() : string` - the name of the entity to be shown in death messages, commands etc. + +### `pocketmine\event\world` +- The following new classes have been added: + - `WorldSoundEvent` - called when a sound is played in a world + - `WorldParticleEvent` - called when a particle is spawned in a world + +### `pocketmine\item` +- The following new API methods have been added: + - `public Item->onInteractEntity(Player $player, Entity $entity, Vector3 $clickVector) : bool` - called when a player interacts with an entity with this item in hand + +### `pocketmine\lang` +- `Language->translate()` and `Language->translateString()` no longer parse nested translation in the "base text". This was never intended behaviour, and didn't work beyond the first level anyway. + +### `pocketmine\player` +- The following new interfaces have been added: + - `PlayerDataProvider` - implemented by classes which want to offer storage for player data +- The following new classes have been added: + - `DatFilePlayerDataProvider` - the default player data provider, which stores `.dat` files in the `players` folder + - `PlayerDataLoadException` - thrown when an error occurs while loading player data + - `PlayerDataSaveException` - thrown when an error occurs while saving player data +- The following API methods have been deprecated: + - `Player->sendTranslation()` - use `Player->sendMessage()` instead with a `Translatable` message + +### `pocketmine\resourcepacks` +- The following new API methods have been added: + - `public ResourcePackManager->setResourceStack(list $resourceStack) : void` - sets the list of resource packs to be applied by players + - `public ResourcePackManager->setPackEncryptionKey(string $id, ?string $key) : void` - sets the encryption key to be used for a resource pack + +### `pocketmine\utils` +- The following new API methods have been added: + - `public static Filesystem::fileGetContents(...) : string` - a wrapper around `file_get_contents()` which throws an exception on failure + +### `pocketmine\world` +- The following new API methods have been added: + - `public World->requestSafeSpawn(?Vector3 $spawn = null) : Promise` - an async version of `getSafeSpawn()` which generates all the needed chunks before returning