diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 4d115ec9a..f37d4f074 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2145,38 +2145,37 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, return false; } - public function toggleSprint(bool $sprint) : void{ + public function toggleSprint(bool $sprint) : bool{ $ev = new PlayerToggleSprintEvent($this, $sprint); $ev->call(); if($ev->isCancelled()){ - $this->sendData($this); - }else{ - $this->setSprinting($sprint); + return false; } + $this->setSprinting($sprint); + return true; } - public function toggleSneak(bool $sneak) : void{ + public function toggleSneak(bool $sneak) : bool{ $ev = new PlayerToggleSneakEvent($this, $sneak); $ev->call(); if($ev->isCancelled()){ - $this->sendData($this); - }else{ - $this->setSneaking($sneak); + return false; } + $this->setSneaking($sneak); + return true; } - public function toggleFlight(bool $fly) : void{ + public function toggleFlight(bool $fly) : bool{ $ev = new PlayerToggleFlightEvent($this, $fly); - if(!$this->allowFlight){ - $ev->setCancelled(); - } + $ev->setCancelled(!$this->allowFlight); $ev->call(); if($ev->isCancelled()){ - $this->networkSession->syncAdventureSettings($this); - }else{ //don't use setFlying() here, to avoid feedback loops - $this->flying = $fly; - $this->resetFallDistance(); + return false; } + //don't use setFlying() here, to avoid feedback loops - TODO: get rid of this hack + $this->flying = $fly; + $this->resetFallDistance(); + return true; } public function animate(int $action) : bool{ diff --git a/src/pocketmine/network/mcpe/handler/SimpleSessionHandler.php b/src/pocketmine/network/mcpe/handler/SimpleSessionHandler.php index fc2ce94f4..b9677d658 100644 --- a/src/pocketmine/network/mcpe/handler/SimpleSessionHandler.php +++ b/src/pocketmine/network/mcpe/handler/SimpleSessionHandler.php @@ -362,16 +362,24 @@ class SimpleSessionHandler extends SessionHandler{ $this->player->jump(); return true; case PlayerActionPacket::ACTION_START_SPRINT: - $this->player->toggleSprint(true); + if(!$this->player->toggleSprint(true)){ + $this->player->sendData($this->player); + } return true; case PlayerActionPacket::ACTION_STOP_SPRINT: - $this->player->toggleSprint(false); + if(!$this->player->toggleSprint(false)){ + $this->player->sendData($this->player); + } return true; case PlayerActionPacket::ACTION_START_SNEAK: - $this->player->toggleSneak(true); + if(!$this->player->toggleSneak(true)){ + $this->player->sendData($this->player); + } return true; case PlayerActionPacket::ACTION_STOP_SNEAK: - $this->player->toggleSneak(false); + if(!$this->player->toggleSneak(false)){ + $this->player->sendData($this->player); + } return true; case PlayerActionPacket::ACTION_START_GLIDE: case PlayerActionPacket::ACTION_STOP_GLIDE: @@ -423,7 +431,9 @@ class SimpleSessionHandler extends SessionHandler{ $isFlying = $packet->getFlag(AdventureSettingsPacket::FLYING); if($isFlying !== $this->player->isFlying()){ - $this->player->toggleFlight($isFlying); + if(!$this->player->toggleFlight($isFlying)){ + $this->session->syncAdventureSettings($this->player); + } $handled = true; }