From 42e14f749e36da1678e716b643ce5d87f980a21b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 31 May 2020 16:32:06 +0100 Subject: [PATCH] Do not blanket-ban all inventory transactions in spectator mode, fixes #2627 instead, we cancel the appropriate events before they are called, so that plugins can uncancel them if they choose. --- src/pocketmine/Player.php | 11 +++-------- src/pocketmine/item/Bow.php | 2 +- src/pocketmine/level/Level.php | 4 ++-- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index bcb3bda94..b570115ed 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2305,11 +2305,6 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ return false; } - if($this->isSpectator()){ - $this->sendAllInventories(); - return true; - } - /** @var InventoryAction[] $actions */ $actions = []; foreach($packet->actions as $networkInventoryAction){ @@ -2403,7 +2398,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $this->setUsingItem(false); - if(!$this->canInteract($blockVector->add(0.5, 0.5, 0.5), 13) or $this->isSpectator()){ + if(!$this->canInteract($blockVector->add(0.5, 0.5, 0.5), 13)){ }elseif($this->isCreative()){ $item = $this->inventory->getItemInHand(); if($this->level->useItemOn($blockVector, $item, $face, $packet->trData->clickPos, $this, true)){ @@ -2509,7 +2504,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ } $ev = new PlayerInteractEvent($this, $item, null, $directionVector, $face, PlayerInteractEvent::RIGHT_CLICK_AIR); - if($this->hasItemCooldown($item)){ + if($this->hasItemCooldown($item) or $this->isSpectator()){ $ev->setCancelled(); } @@ -2560,7 +2555,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $heldItem = $this->inventory->getItemInHand(); $oldItem = clone $heldItem; - if(!$this->canInteract($target, 8)){ + if(!$this->canInteract($target, 8) or $this->isSpectator()){ $cancelled = true; }elseif($target instanceof Player){ if(!$this->server->getConfigBool("pvp")){ diff --git a/src/pocketmine/item/Bow.php b/src/pocketmine/item/Bow.php index a8074f893..85bcfc021 100644 --- a/src/pocketmine/item/Bow.php +++ b/src/pocketmine/item/Bow.php @@ -83,7 +83,7 @@ class Bow extends Tool{ } $ev = new EntityShootBowEvent($player, $this, $entity, $baseForce * 3); - if($baseForce < 0.1 or $diff < 5){ + if($baseForce < 0.1 or $diff < 5 or $player->isSpectator()){ $ev->setCancelled(); } diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index e3e378187..44476d9f4 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1856,7 +1856,7 @@ class Level implements ChunkManager, Metadatable{ if($player !== null){ $ev = new PlayerInteractEvent($player, $item, $blockClicked, $clickVector, $face, PlayerInteractEvent::RIGHT_CLICK_BLOCK); - if($this->checkSpawnProtection($player, $blockClicked)){ + if($this->checkSpawnProtection($player, $blockClicked) or $player->isSpectator()){ $ev->setCancelled(); //set it to cancelled so plugins can bypass this } @@ -1909,7 +1909,7 @@ class Level implements ChunkManager, Metadatable{ if($player !== null){ $ev = new BlockPlaceEvent($player, $hand, $blockReplace, $blockClicked, $item); - if($this->checkSpawnProtection($player, $blockReplace)){ + if($this->checkSpawnProtection($player, $blockReplace) or $player->isSpectator()){ $ev->setCancelled(); }