From aac4f6c0e11ca5bb35dfba0f6543dd08b3ec5fe5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 May 2023 18:18:05 +0100 Subject: [PATCH] Fixed all game modes allowing flight moral of the story: do not trust that mojang things do what they say they do - the spectator ability layer always applies, regardless of whether the player is actually in spectator mode or not ... --- src/network/mcpe/NetworkSession.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) 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 ))); }