diff --git a/changelogs/4.20.md b/changelogs/4.20.md index bc8c931b2..37a0ef37b 100644 --- a/changelogs/4.20.md +++ b/changelogs/4.20.md @@ -64,3 +64,10 @@ Released 6th May 2023. - This was caused by creating a new timings handler for each call, regardless of whether a timer already existed for the given event and callback. - Fixed `Full Server Tick` and other records being missing from timings reports. - This was caused by timings handler depth not getting reset when timings was disabled and later re-enabled. + +# 4.20.4 +Released 6th May 2023. + +## Fixes +- Fixed players being forced into flight mode in every game mode. + - Moral of the story: do not assume anything in Mojang internals does what its name suggests... diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 0b72d7f9e..d577d8069 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,7 +31,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.20.4"; + public const BASE_VERSION = "4.20.5"; public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 1b90547e7..92a992ffb 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -887,20 +887,26 @@ class NetworkSession{ AbilitiesLayer::ABILITY_PRIVILEGED_BUILDER => false, ]; + $layers = [ + //TODO: dynamic flying speed! FINALLY!!!!!!!!!!!!!!!!! + new AbilitiesLayer(AbilitiesLayer::LAYER_BASE, $boolAbilities, 0.05, 0.1), + ]; + if(!$for->hasBlockCollision()){ + //TODO: HACK! In 1.19.80, the client starts falling in our faux spectator mode when it clips into a + //block. We can't seem to prevent this short of forcing the player to always fly when block collision is + //disabled. Also, for some reason the client always reads flight state from this layer if present, even + //though the player isn't in spectator mode. + + $layers[] = new AbilitiesLayer(AbilitiesLayer::LAYER_SPECTATOR, [ + AbilitiesLayer::ABILITY_FLYING => true, + ], null, null); + } + $this->sendDataPacket(UpdateAbilitiesPacket::create(new AbilitiesData( $isOp ? CommandPermissions::OPERATOR : CommandPermissions::NORMAL, $isOp ? PlayerPermissions::OPERATOR : PlayerPermissions::MEMBER, $for->getId(), - [ - //TODO: dynamic flying speed! FINALLY!!!!!!!!!!!!!!!!! - new AbilitiesLayer(AbilitiesLayer::LAYER_BASE, $boolAbilities, 0.05, 0.1), - - //TODO: HACK! In 1.19.80, the client starts falling in our faux spectator mode when it clips into a - //block. I have no idea why this works, since we don't actually use the real spectator mode. - new AbilitiesLayer(AbilitiesLayer::LAYER_SPECTATOR, [ - AbilitiesLayer::ABILITY_FLYING => true, - ], null, null) - ] + $layers ))); }