Merge branch 'next-minor' into next-major

This commit is contained in:
Dylan K. Taylor
2022-08-21 19:19:07 +01:00
30 changed files with 350 additions and 125 deletions

View File

@ -86,7 +86,7 @@ use pocketmine\inventory\PlayerCursorInventory;
use pocketmine\inventory\TemporaryInventory;
use pocketmine\inventory\transaction\action\DropItemAction;
use pocketmine\inventory\transaction\InventoryTransaction;
use pocketmine\inventory\transaction\TransactionBuilderInventory;
use pocketmine\inventory\transaction\TransactionBuilder;
use pocketmine\inventory\transaction\TransactionCancelledException;
use pocketmine\inventory\transaction\TransactionValidationException;
use pocketmine\item\ConsumableItem;
@ -1583,7 +1583,7 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
$ev = new PlayerBlockPickEvent($this, $block, $item);
$existingSlot = $this->inventory->first($item);
if($existingSlot === -1 && $this->hasFiniteResources()){
if($existingSlot === -1 && ($this->hasFiniteResources() || $this->isSpectator())){
$ev->cancel();
}
$ev->call();
@ -2444,29 +2444,23 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
$inventories[] = $this->currentWindow;
}
$transaction = new InventoryTransaction($this);
$mainInventoryTransactionBuilder = new TransactionBuilderInventory($this->inventory);
$builder = new TransactionBuilder();
foreach($inventories as $inventory){
$contents = $inventory->getContents();
if(count($contents) > 0){
$drops = $mainInventoryTransactionBuilder->addItem(...$contents);
$drops = $builder->getInventory($this->inventory)->addItem(...$contents);
foreach($drops as $drop){
$transaction->addAction(new DropItemAction($drop));
$builder->addAction(new DropItemAction($drop));
}
$clearedInventoryTransactionBuilder = new TransactionBuilderInventory($inventory);
$clearedInventoryTransactionBuilder->clearAll();
foreach($clearedInventoryTransactionBuilder->generateActions() as $action){
$transaction->addAction($action);
}
$builder->getInventory($inventory)->clearAll();
}
}
foreach($mainInventoryTransactionBuilder->generateActions() as $action){
$transaction->addAction($action);
}
if(count($transaction->getActions()) !== 0){
$actions = $builder->generateActions();
if(count($actions) !== 0){
$transaction = new InventoryTransaction($this, $actions);
try{
$transaction->execute();
$this->logger->debug("Successfully evacuated items from temporary inventories");