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 ))); }