diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index c0bedd18d..cbd52cbf6 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1205,7 +1205,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $pk->eid = $this->getID(); $pk->target = $entity->getID(); Server::broadcastPacket($entity->getViewers(), $pk); - $this->inventory->addItem(clone $item); + $this->inventory->addItem(clone $item, $this); $entity->kill(); } }elseif($entity instanceof DroppedItem){ @@ -1239,7 +1239,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $pk->eid = $this->getID(); $pk->target = $entity->getID(); Server::broadcastPacket($entity->getViewers(), $pk); - $this->inventory->addItem(clone $item); + $this->inventory->addItem(clone $item, $this); $entity->kill(); } } @@ -1648,7 +1648,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $snowball = Entity::createEntity("Snowball", $this->chunk, $nbt, $this); $snowball->setMotion($snowball->getMotion()->multiply($f)); if($this->isSurvival()){ - $this->inventory->removeItem(Item::get(Item::SNOWBALL, 0, 1)); + $this->inventory->removeItem(Item::get(Item::SNOWBALL, 0, 1), $this); } if($snowball instanceof Projectile){ $this->server->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($snowball)); @@ -1713,7 +1713,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ }else{ $ev->getProjectile()->setMotion($ev->getProjectile()->getMotion()->multiply($ev->getForce())); if($this->isSurvival()){ - $this->inventory->removeItem(Item::get(Item::ARROW, 0, 1)); + $this->inventory->removeItem(Item::get(Item::ARROW, 0, 1), $this); $bow->setDamage($bow->getDamage() + 1); $this->inventory->setItemInHand($bow, $this); if($bow->getDamage() >= 385){ @@ -2008,7 +2008,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ --$slot->count; $this->inventory->setItemInHand($slot, $this); if($slot->getID() === Item::MUSHROOM_STEW or $slot->getID() === Item::BEETROOT_SOUP){ - $this->inventory->addItem(Item::get(Item::BOWL, 0, 1)); + $this->inventory->addItem(Item::get(Item::BOWL, 0, 1), $this); } } break; @@ -2178,7 +2178,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ case Item::CAKE: //TODO: detect complex recipes like cake that leave remains $this->awardAchievement("bakeCake"); - $this->inventory->addItem(Item::get(Item::BUCKET, 0, 3)); + $this->inventory->addItem(Item::get(Item::BUCKET, 0, 3), $this); break; case Item::STONE_PICKAXE: case Item::GOLD_PICKAXE: diff --git a/src/pocketmine/block/Stone.php b/src/pocketmine/block/Stone.php index 9958b7bcf..ff663a624 100644 --- a/src/pocketmine/block/Stone.php +++ b/src/pocketmine/block/Stone.php @@ -22,6 +22,7 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\item\Tool; class Stone extends Solid{ const NORMAL = 0; @@ -68,7 +69,7 @@ class Stone extends Solid{ } public function getDrops(Item $item){ - if($item->isPickaxe() >= 1){ + if($item->isPickaxe() >= Tool::TIER_WOODEN){ return [ [Item::COBBLESTONE, 0, 1], ]; diff --git a/src/pocketmine/inventory/BaseInventory.php b/src/pocketmine/inventory/BaseInventory.php index 8ff41e7f8..0d83c2417 100644 --- a/src/pocketmine/inventory/BaseInventory.php +++ b/src/pocketmine/inventory/BaseInventory.php @@ -225,6 +225,14 @@ abstract class BaseInventory implements Inventory{ } public function addItem(...$slots){ + if(isset($slots[$end = count($slots) - 1]) and $slots[$end] instanceof Player){ + /** @var Player $source */ + $source = $slots[$end]; + unset($slots[$end]); + }else{ + $source = null; + } + /** @var Item[] $slots */ foreach($slots as $i => $slot){ $slots[$i] = clone $slot; @@ -238,7 +246,7 @@ abstract class BaseInventory implements Inventory{ $slot->setCount($slot->getCount() - $amount); $item = clone $slot; $item->setCount($amount); - $this->setItem($i, $item); + $this->setItem($i, $item, $source); $item = $this->getItem($i); if($slot->getCount() <= 0){ unset($slots[$index]); @@ -247,7 +255,7 @@ abstract class BaseInventory implements Inventory{ $amount = min($item->getMaxStackSize() - $item->getCount(), $slot->getCount(), $this->getMaxStackSize()); $slot->setCount($slot->getCount() - $amount); $item->setCount($item->getCount() + $amount); - $this->setItem($i, $item); + $this->setItem($i, $item, $source); if($slot->getCount() <= 0){ unset($slots[$index]); } @@ -263,6 +271,14 @@ abstract class BaseInventory implements Inventory{ } public function removeItem(...$slots){ + if(isset($slots[$end = count($slots) - 1]) and $slots[$end] instanceof Player){ + /** @var Player $source */ + $source = $slots[$end]; + unset($slots[$end]); + }else{ + $source = null; + } + /** @var Item[] $slots */ for($i = 0; $i < $this->getSize(); ++$i){ $item = $this->getItem($i); @@ -275,7 +291,7 @@ abstract class BaseInventory implements Inventory{ $amount = min($item->getCount(), $slot->getCount()); $slot->setCount($slot->getCount() - $amount); $item->setCount($item->getCount() - $amount); - $this->setItem($i, $item); + $this->setItem($i, $item, $source); if($slot->getCount() <= 0){ unset($slots[$index]); } diff --git a/src/pocketmine/inventory/Inventory.php b/src/pocketmine/inventory/Inventory.php index fc3fc3bbf..ce3a71751 100644 --- a/src/pocketmine/inventory/Inventory.php +++ b/src/pocketmine/inventory/Inventory.php @@ -67,7 +67,7 @@ interface Inventory{ * Stores the given Items in the inventory. This will try to fill * existing stacks and empty slots as well as it can. * - * Returns the Items that did not fit + * Returns the Items that did not fit. A Player source can be set at the end * * @param Item ...$item * @@ -86,7 +86,7 @@ interface Inventory{ /** * Removes the given Item from the inventory. - * It will return the Items that couldn't be removed. + * It will return the Items that couldn't be removed. A Player source can be set at the end * * @param Item ...$item *