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.
This commit is contained in:
Dylan K. Taylor 2020-05-31 16:32:06 +01:00
parent 3f07f06874
commit 42e14f749e
3 changed files with 6 additions and 11 deletions

View File

@ -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")){

View File

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

View File

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