diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 4d5f80f76..bd06c647a 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -26,9 +26,9 @@ namespace pocketmine\entity\object; use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; use pocketmine\entity\Location; +use pocketmine\event\entity\EntityItemPickupEvent; use pocketmine\event\entity\ItemDespawnEvent; use pocketmine\event\entity\ItemSpawnEvent; -use pocketmine\event\inventory\InventoryPickupItemEvent; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; @@ -227,12 +227,15 @@ class ItemEntity extends Entity{ $item = $this->getItem(); $playerInventory = $player->getInventory(); - - if($player->hasFiniteResources() and !$playerInventory->canAddItem($item)){ - return; + if(!$playerInventory->canAddItem($item)){ + $playerInventory = null; + } + + $ev = new EntityItemPickupEvent($player, $this, $item, $playerInventory); + if($player->hasFiniteResources() and $playerInventory === null){ + $ev->cancel(); } - $ev = new InventoryPickupItemEvent($playerInventory, $this); $ev->call(); if($ev->isCancelled()){ return; @@ -242,7 +245,7 @@ class ItemEntity extends Entity{ $viewer->getNetworkSession()->onPlayerPickUpItem($player, $this); } - $playerInventory->addItem(clone $item); + $ev->getInventory()?->addItem($ev->getItem()); $this->flagForDespawn(); } } diff --git a/src/entity/projectile/Arrow.php b/src/entity/projectile/Arrow.php index f0a1181fd..8ae2b57e2 100644 --- a/src/entity/projectile/Arrow.php +++ b/src/entity/projectile/Arrow.php @@ -28,8 +28,8 @@ use pocketmine\entity\animation\ArrowShakeAnimation; use pocketmine\entity\Entity; use pocketmine\entity\EntitySizeInfo; use pocketmine\entity\Location; +use pocketmine\event\entity\EntityItemPickupEvent; use pocketmine\event\entity\ProjectileHitEvent; -use pocketmine\event\inventory\InventoryPickupArrowEvent; use pocketmine\item\VanillaItems; use pocketmine\math\RayTraceResult; use pocketmine\nbt\tag\CompoundTag; @@ -174,13 +174,15 @@ class Arrow extends Projectile{ } $item = VanillaItems::ARROW(); - $playerInventory = $player->getInventory(); - if($player->hasFiniteResources() and !$playerInventory->canAddItem($item)){ - return; + if(!$playerInventory->canAddItem($item)){ + $playerInventory = null; } - $ev = new InventoryPickupArrowEvent($playerInventory, $this); + $ev = new EntityItemPickupEvent($player, $this, $item, $playerInventory); + if($player->hasFiniteResources() and $playerInventory === null){ + $ev->cancel(); + } if($this->pickupMode === self::PICKUP_NONE or ($this->pickupMode === self::PICKUP_CREATIVE and !$player->isCreative())){ $ev->cancel(); } @@ -194,7 +196,7 @@ class Arrow extends Projectile{ $viewer->getNetworkSession()->onPlayerPickUpItem($player, $this); } - $playerInventory->addItem(clone $item); + $ev->getInventory()?->addItem($ev->getItem()); $this->flagForDespawn(); } diff --git a/src/event/entity/EntityItemPickupEvent.php b/src/event/entity/EntityItemPickupEvent.php new file mode 100644 index 000000000..2e00f8570 --- /dev/null +++ b/src/event/entity/EntityItemPickupEvent.php @@ -0,0 +1,80 @@ + + */ +class EntityItemPickupEvent extends EntityEvent implements Cancellable{ + use CancellableTrait; + + public function __construct( + Entity $collector, + private Entity $origin, + private Item $item, + private ?Inventory $inventory + ){ + $this->entity = $collector; + } + + public function getOrigin() : Entity{ + return $this->origin; + } + + /** + * Items to be received + */ + public function getItem() : Item{ + return clone $this->item; + } + + /** + * Change the items to receive. + */ + public function setItem(Item $item) : void{ + $this->item = clone $item; + } + + /** + * Inventory to which received items will be added. + */ + public function getInventory() : ?Inventory{ + return $this->inventory; + } + + /** + * Change the inventory to which received items are added. + */ + public function setInventory(?Inventory $inventory) : void{ + $this->inventory = $inventory; + } + +} diff --git a/src/event/inventory/InventoryPickupArrowEvent.php b/src/event/inventory/InventoryPickupArrowEvent.php deleted file mode 100644 index 1c4d2772d..000000000 --- a/src/event/inventory/InventoryPickupArrowEvent.php +++ /dev/null @@ -1,45 +0,0 @@ -arrow = $arrow; - parent::__construct($inventory); - } - - public function getArrow() : Arrow{ - return $this->arrow; - } -} diff --git a/src/event/inventory/InventoryPickupItemEvent.php b/src/event/inventory/InventoryPickupItemEvent.php deleted file mode 100644 index 71a81c57c..000000000 --- a/src/event/inventory/InventoryPickupItemEvent.php +++ /dev/null @@ -1,45 +0,0 @@ -itemEntity = $itemEntity; - parent::__construct($inventory); - } - - public function getItemEntity() : ItemEntity{ - return $this->itemEntity; - } -}