diff --git a/src/inventory/BaseInventory.php b/src/inventory/BaseInventory.php index 98419a01a2..bcfefe272f 100644 --- a/src/inventory/BaseInventory.php +++ b/src/inventory/BaseInventory.php @@ -90,6 +90,8 @@ abstract class BaseInventory implements Inventory{ $items = array_slice($items, 0, $this->getSize(), true); } + $oldContents = $this->slots->toArray(); + $listeners = $this->listeners; $this->listeners = []; $viewers = $this->viewers; @@ -109,7 +111,7 @@ abstract class BaseInventory implements Inventory{ } foreach($this->listeners as $listener){ - $listener->onContentChange($this); + $listener->onContentChange($this, $oldContents); } foreach($this->getViewers() as $viewer){ @@ -359,7 +361,7 @@ abstract class BaseInventory implements Inventory{ protected function onSlotChange(int $index, Item $before) : void{ foreach($this->listeners as $listener){ - $listener->onSlotChange($this, $index); + $listener->onSlotChange($this, $index, $before); } foreach($this->viewers as $viewer){ $viewer->getNetworkSession()->getInvManager()->syncSlot($this, $index); diff --git a/src/inventory/CallbackInventoryChangeListener.php b/src/inventory/CallbackInventoryChangeListener.php index 388b9bf1bb..c3b12a6d49 100644 --- a/src/inventory/CallbackInventoryChangeListener.php +++ b/src/inventory/CallbackInventoryChangeListener.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\inventory; +use pocketmine\item\Item; use pocketmine\utils\Utils; class CallbackInventoryChangeListener implements InventoryChangeListener{ @@ -31,25 +32,25 @@ class CallbackInventoryChangeListener implements InventoryChangeListener{ /** * @var \Closure|null - * @phpstan-var (\Closure(Inventory, int) : void)|null + * @phpstan-var (\Closure(Inventory, int, Item) : void)|null */ private $onSlotChangeCallback; /** * @var \Closure|null - * @phpstan-var (\Closure(Inventory) : void)|null + * @phpstan-var (\Closure(Inventory, Item[]) : void)|null */ private $onContentChangeCallback; /** - * @phpstan-param (\Closure(Inventory, int) : void)|null $onSlotChange - * @phpstan-param (\Closure(Inventory) : void)|null $onContentChange + * @phpstan-param (\Closure(Inventory, int, Item) : void)|null $onSlotChange + * @phpstan-param (\Closure(Inventory, Item[]) : void)|null $onContentChange */ public function __construct(?\Closure $onSlotChange, ?\Closure $onContentChange){ if($onSlotChange !== null){ - Utils::validateCallableSignature(function(Inventory $inventory, int $slot) : void{}, $onSlotChange); + Utils::validateCallableSignature(function(Inventory $inventory, int $slot, Item $oldItem) : void{}, $onSlotChange); } if($onContentChange !== null){ - Utils::validateCallableSignature(function(Inventory $inventory) : void{}, $onContentChange); + Utils::validateCallableSignature(function(Inventory $inventory, array $oldContents) : void{}, $onContentChange); } $this->onSlotChangeCallback = $onSlotChange; @@ -61,20 +62,23 @@ class CallbackInventoryChangeListener implements InventoryChangeListener{ */ public static function onAnyChange(\Closure $onChange) : self{ return new self( - static function(Inventory $inventory, int $unused) use ($onChange) : void{ + static function(Inventory $inventory, int $unused, Item $unusedB) use ($onChange) : void{ $onChange($inventory); }, - static function(Inventory $inventory) use ($onChange) : void{ + static function(Inventory $inventory, array $unused) use ($onChange) : void{ $onChange($inventory); } ); } - public function onSlotChange(Inventory $inventory, int $slot) : void{ - ($this->onSlotChangeCallback)($inventory, $slot); + public function onSlotChange(Inventory $inventory, int $slot, Item $oldItem) : void{ + ($this->onSlotChangeCallback)($inventory, $slot, $oldItem); } - public function onContentChange(Inventory $inventory) : void{ - ($this->onContentChangeCallback)($inventory); + /** + * @param Item[] $oldContents + */ + public function onContentChange(Inventory $inventory, array $oldContents) : void{ + ($this->onContentChangeCallback)($inventory, $oldContents); } } diff --git a/src/inventory/InventoryChangeListener.php b/src/inventory/InventoryChangeListener.php index d13edf7f08..60069305ef 100644 --- a/src/inventory/InventoryChangeListener.php +++ b/src/inventory/InventoryChangeListener.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\inventory; +use pocketmine\item\Item; + /** * Classes implementing this interface can be injected into inventories to receive notifications when content changes * occur. @@ -32,7 +34,10 @@ namespace pocketmine\inventory; */ interface InventoryChangeListener{ - public function onSlotChange(Inventory $inventory, int $slot) : void; + public function onSlotChange(Inventory $inventory, int $slot, Item $oldItem) : void; - public function onContentChange(Inventory $inventory) : void; + /** + * @param Item[] $oldContents + */ + public function onContentChange(Inventory $inventory, array $oldContents) : void; }