diff --git a/src/pocketmine/inventory/BaseInventory.php b/src/pocketmine/inventory/BaseInventory.php index 8214fb64ea..62157c2a87 100644 --- a/src/pocketmine/inventory/BaseInventory.php +++ b/src/pocketmine/inventory/BaseInventory.php @@ -23,8 +23,6 @@ declare(strict_types=1); namespace pocketmine\inventory; -use pocketmine\entity\Entity; -use pocketmine\event\entity\EntityInventoryChangeEvent; use pocketmine\event\inventory\InventoryOpenEvent; use pocketmine\item\Item; use pocketmine\item\ItemFactory; @@ -128,6 +126,10 @@ abstract class BaseInventory implements Inventory{ $this->sendContents($this->getViewers()); } + protected function doSetItemEvents(int $index, Item $newItem) : ?Item{ + return $newItem; + } + public function setItem(int $index, Item $item, bool $send = true) : bool{ if($item->isNull()){ $item = ItemFactory::get(Item::AIR, 0, 0); @@ -135,17 +137,13 @@ abstract class BaseInventory implements Inventory{ $item = clone $item; } - $holder = $this->getHolder(); - if($holder instanceof Entity){ - Server::getInstance()->getPluginManager()->callEvent($ev = new EntityInventoryChangeEvent($holder, $this->getItem($index), $item, $index)); - if($ev->isCancelled()){ - return false; - } - $item = $ev->getNewItem(); + $newItem = $this->doSetItemEvents($index, $item); + if($newItem === null){ + return false; } $old = $this->getItem($index); - $this->slots[$index] = $item->isNull() ? null : $item; + $this->slots[$index] = $newItem->isNull() ? null : $newItem; $this->onSlotChange($index, $old, $send); return true; diff --git a/src/pocketmine/inventory/EntityInventory.php b/src/pocketmine/inventory/EntityInventory.php new file mode 100644 index 0000000000..7fbe784a98 --- /dev/null +++ b/src/pocketmine/inventory/EntityInventory.php @@ -0,0 +1,50 @@ +getPluginManager()->callEvent($ev = new EntityInventoryChangeEvent($this->getHolder(), $this->getItem($index), $newItem, $index)); + if($ev->isCancelled()){ + return null; + } + + return $ev->getNewItem(); + } + + /** + * @return Entity|InventoryHolder + */ + public function getHolder(){ + return parent::getHolder(); + } +} \ No newline at end of file diff --git a/src/pocketmine/inventory/PlayerInventory.php b/src/pocketmine/inventory/PlayerInventory.php index fd4ec7432e..f6eba11bcf 100644 --- a/src/pocketmine/inventory/PlayerInventory.php +++ b/src/pocketmine/inventory/PlayerInventory.php @@ -25,7 +25,6 @@ namespace pocketmine\inventory; use pocketmine\entity\Human; use pocketmine\event\entity\EntityArmorChangeEvent; -use pocketmine\event\entity\EntityInventoryChangeEvent; use pocketmine\event\player\PlayerItemHeldEvent; use pocketmine\item\Item; use pocketmine\item\ItemFactory; @@ -37,7 +36,7 @@ use pocketmine\network\mcpe\protocol\types\ContainerIds; use pocketmine\Player; use pocketmine\Server; -class PlayerInventory extends BaseInventory{ +class PlayerInventory extends EntityInventory{ /** @var Human */ protected $holder; @@ -268,34 +267,17 @@ class PlayerInventory extends BaseInventory{ return $this->setItem($this->getSize() + 3, $boots); } - public function setItem(int $index, Item $item, bool $send = true) : bool{ - if($item->isNull()){ - $item = ItemFactory::get(Item::AIR, 0, 0); - }else{ - $item = clone $item; - } - - if($index >= $this->getSize()){ //Armor change - Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $this->getItem($index), $item, $index)); - if($ev->isCancelled() and $this->getHolder() instanceof Human){ - $this->sendArmorSlot($index, $this->getViewers()); - return false; - } - $item = $ev->getNewItem(); - }else{ - Server::getInstance()->getPluginManager()->callEvent($ev = new EntityInventoryChangeEvent($this->getHolder(), $this->getItem($index), $item, $index)); + protected function doSetItemEvents(int $index, Item $newItem) : ?Item{ + if($index >= $this->getSize()){ + Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $this->getItem($index), $newItem, $index)); if($ev->isCancelled()){ - $this->sendSlot($index, $this->getViewers()); - return false; + return null; } - $item = $ev->getNewItem(); + + return $ev->getNewItem(); } - $old = $this->getItem($index); - $this->slots[$index] = $item; - $this->onSlotChange($index, $old, $send); - - return true; + return parent::doSetItemEvents($index, $newItem); } public function clearAll(){