From ce54d268f2412bd10905abab56cf6f267df2e18c Mon Sep 17 00:00:00 2001 From: Drew B Date: Mon, 6 Dec 2021 16:14:22 -0500 Subject: [PATCH] Player: allow controlling client-sided block collisions irrespective of Spectator Mode (#4563) - Added the following API methods: - `Player::hasBlockCollision()` - `Player::setHasBlockCollision()` This enables spectator-like noclip behaviour in other gamemodes (could be useful for builders). --- src/network/mcpe/NetworkSession.php | 2 +- src/player/Player.php | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 2fe44e3ac..0b7a8253b 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -797,7 +797,7 @@ class NetworkSession{ $pk->setFlag(AdventureSettingsPacket::NO_PVP, $for->isSpectator()); $pk->setFlag(AdventureSettingsPacket::AUTO_JUMP, $for->hasAutoJump()); $pk->setFlag(AdventureSettingsPacket::ALLOW_FLIGHT, $for->getAllowFlight()); - $pk->setFlag(AdventureSettingsPacket::NO_CLIP, $for->isSpectator()); + $pk->setFlag(AdventureSettingsPacket::NO_CLIP, !$for->hasBlockCollision()); $pk->setFlag(AdventureSettingsPacket::FLYING, $for->isFlying()); //TODO: permission flags diff --git a/src/player/Player.php b/src/player/Player.php index aab421014..e7c5f7041 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -234,6 +234,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ //TODO: Abilities protected bool $autoJump = true; protected bool $allowFlight = false; + protected bool $blockCollision = true; protected bool $flying = false; protected ?int $lineHeight = null; @@ -394,6 +395,15 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return $this->allowFlight; } + public function setHasBlockCollision(bool $value) : void{ + $this->blockCollision = $value; + $this->getNetworkSession()->syncAdventureSettings($this); + } + + public function hasBlockCollision() : bool{ + return $this->blockCollision; + } + public function setFlying(bool $value) : void{ if($this->flying !== $value){ $this->flying = $value; @@ -970,6 +980,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ if($this->isSpectator()){ $this->setFlying(true); + $this->setHasBlockCollision(false); $this->setSilent(); $this->onGround = false; @@ -980,6 +991,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ if($this->isSurvival()){ $this->setFlying(false); } + $this->setHasBlockCollision(true); $this->setSilent(false); $this->checkGroundState(0, 0, 0, 0, 0, 0); }