Introduce and use TransactionBuilder for inventory evacuations

This commit is contained in:
Dylan K. Taylor
2022-08-18 17:03:39 +01:00
parent 4d34885b15
commit 792c1b62b7
2 changed files with 69 additions and 14 deletions

View File

@ -85,7 +85,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;
@ -2436,29 +2436,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");