diff --git a/changelogs/4.12.md b/changelogs/4.12.md index ab96c2082..8878a42f5 100644 --- a/changelogs/4.12.md +++ b/changelogs/4.12.md @@ -93,3 +93,14 @@ Released 16th January 2023. ## Other changes - Increased packet batch budget for player sessions. + +# 4.12.10 +Released 18th January 2023. + +## Fixes +- Fixed reported server load not including the time spent processing Snooze interrupts between ticks (e.g. incoming network packets). +- Fixed `Connection Handler` entry in timings report not including time spent receiving packets. + +## Note about server load & performance +This version will report higher apparent server load than previous versions. The actual performance of the server is unchanged; the previous reported load was inaccurate. +These bugs have been present for nearly 5 years (ever since the first introduction of Snooze in 3.0.0). diff --git a/changelogs/4.13-beta.md b/changelogs/4.13-beta.md new file mode 100644 index 000000000..865d2267b --- /dev/null +++ b/changelogs/4.13-beta.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-BETA1 +Released 18th 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 diff --git a/composer.json b/composer.json index e0a62356d..8c920bc41 100644 --- a/composer.json +++ b/composer.json @@ -55,7 +55,7 @@ "symfony/filesystem": "^5.4" }, "require-dev": { - "phpstan/phpstan": "1.9.11", + "phpstan/phpstan": "1.9.12", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 078283a2a..73616bcc4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "032bb0034871b16cbce5767efe6f69e4", + "content-hash": "d6cafa9f9e236ad8d55c2eebdb51416a", "packages": [ { "name": "adhocore/json-comment", @@ -1777,16 +1777,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.11", + "version": "1.9.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "60f3d68481eef216199eae7a2603cd5fe124d464" + "reference": "44a338ff0d5572c13fd77dfd91addb96e48c29f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/60f3d68481eef216199eae7a2603cd5fe124d464", - "reference": "60f3d68481eef216199eae7a2603cd5fe124d464", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/44a338ff0d5572c13fd77dfd91addb96e48c29f8", + "reference": "44a338ff0d5572c13fd77dfd91addb96e48c29f8", "shasum": "" }, "require": { @@ -1816,7 +1816,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.11" + "source": "https://github.com/phpstan/phpstan/tree/1.9.12" }, "funding": [ { @@ -1832,7 +1832,7 @@ "type": "tidelift" } ], - "time": "2023-01-12T14:04:13+00:00" + "time": "2023-01-17T10:44:04+00:00" }, { "name": "phpstan/phpstan-phpunit", diff --git a/src/network/mcpe/raklib/RakLibInterface.php b/src/network/mcpe/raklib/RakLibInterface.php index c48cba81c..1cb82ef5a 100644 --- a/src/network/mcpe/raklib/RakLibInterface.php +++ b/src/network/mcpe/raklib/RakLibInterface.php @@ -37,6 +37,7 @@ use pocketmine\network\NetworkInterfaceStartException; use pocketmine\network\PacketHandlingException; use pocketmine\Server; use pocketmine\snooze\SleeperNotifier; +use pocketmine\timings\Timings; use pocketmine\utils\Utils; use raklib\generic\SocketException; use raklib\protocol\EncapsulatedPacket; @@ -109,7 +110,12 @@ class RakLibInterface implements ServerEventListener, AdvancedNetworkInterface{ public function start() : void{ $this->server->getTickSleeper()->addNotifier($this->sleeper, function() : void{ - while($this->eventReceiver->handle($this)); + Timings::$connection->startTiming(); + try{ + while($this->eventReceiver->handle($this)); + }finally{ + Timings::$connection->stopTiming(); + } }); $this->server->getLogger()->debug("Waiting for RakLib to start..."); try{