diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index e9372b2d4..4436ac534 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2168,7 +2168,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ return false; } - $this->resetCraftingGridType(); + $this->doCloseInventory(); $message = TextFormat::clean($message, $this->removeFormat); foreach(explode("\n", $message) as $messagePart){ @@ -2243,7 +2243,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ if(!$this->spawned or !$this->isAlive()){ return true; } - $this->resetCraftingGridType(); + $this->doCloseInventory(); switch($packet->event){ case EntityEventPacket::EATING_ITEM: @@ -2394,7 +2394,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ return true; case InventoryTransactionPacket::USE_ITEM_ACTION_BREAK_BLOCK: - $this->resetCraftingGridType(); + $this->doCloseInventory(); $item = $this->inventory->getItemInHand(); $oldItem = clone $item; @@ -2635,7 +2635,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ return true; } - $this->resetCraftingGridType(); + $this->doCloseInventory(); $target = $this->level->getEntity($packet->target); if($target === null){ @@ -2849,7 +2849,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ return true; } - $this->resetCraftingGridType(); + $this->doCloseInventory(); if(isset($this->windowIndex[$packet->windowId])){ $this->server->getPluginManager()->callEvent(new InventoryCloseEvent($this->windowIndex[$packet->windowId], $this)); @@ -2899,7 +2899,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ if(!$this->spawned or !$this->isAlive()){ return true; } - $this->resetCraftingGridType(); + $this->doCloseInventory(); $pos = new Vector3($packet->x, $packet->y, $packet->z); if($pos->distanceSquared($this) > 10000 or $this->level->checkSpawnProtection($this, $pos)){ @@ -3617,7 +3617,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ //Crafting grid must always be evacuated even if keep-inventory is true. This dumps the contents into the //main inventory and drops the rest on the ground. - $this->resetCraftingGridType(); + $this->doCloseInventory(); $this->server->getPluginManager()->callEvent($ev = new PlayerDeathEvent($this, $this->getDrops(), new TranslationContainer($message, $params))); @@ -3800,15 +3800,19 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{ $this->craftingGrid = $grid; } - public function resetCraftingGridType() : void{ - $contents = $this->craftingGrid->getContents(); - if(count($contents) > 0){ - $drops = $this->inventory->addItem(...$contents); - foreach($drops as $drop){ - $this->dropItem($drop); - } + public function doCloseInventory() : void{ + /** @var Inventory[] $inventories */ + $inventories = [$this->craftingGrid, $this->cursorInventory]; + foreach($inventories as $inventory){ + $contents = $inventory->getContents(); + if(count($contents) > 0){ + $drops = $this->inventory->addItem(...$contents); + foreach($drops as $drop){ + $this->dropItem($drop); + } - $this->craftingGrid->clearAll(); + $inventory->clearAll(); + } } if($this->craftingGrid->getGridWidth() > CraftingGrid::SIZE_SMALL){