diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 3c2d603ef..6320bdb37 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -26,6 +26,7 @@ use pocketmine\command\CommandSender; use pocketmine\entity\DroppedItem; use pocketmine\entity\Human; use pocketmine\event\inventory\InventoryCloseEvent; +use pocketmine\event\inventory\InventoryPickupItemEvent; use pocketmine\event\player\PlayerAchievementAwardedEvent; use pocketmine\event\player\PlayerChatEvent; use pocketmine\event\player\PlayerCommandPreprocessEvent; @@ -1209,6 +1210,11 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ continue; } + $this->server->getPluginManager()->callEvent($ev = new InventoryPickupItemEvent($this->inventory, $item)); + if($ev->isCancelled()){ + continue; + } + switch($item->getID()){ case Item::WOOD: $this->awardAchievement("mineWood"); @@ -1217,6 +1223,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $this->awardAchievement("diamond"); break; } + $pk = new TakeItemEntityPacket; $pk->eid = 0; $pk->target = $entity->getID(); @@ -1998,7 +2005,6 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ break; } - console("[TRANSACTION] {$this->username} {$packet->windowid}[ ".$packet->item->getID().":".$packet->item->getDamage()."(".$packet->item->getCount().") -> #{$packet->slot} ]"); if($this->currentTransaction === null or $this->currentTransaction->getCreationTime() > (microtime(true) - 1)){ $this->currentTransaction = new SimpleTransactionGroup(); } @@ -2045,6 +2051,40 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ // return false; //} + /*switch($item->getID()){ + case Item::WORKBENCH: + $this->awardAchievement("buildWorkBench"); + break; + case Item::WOODEN_PICKAXE: + $this->awardAchievement("buildPickaxe"); + break; + case Item::FURNACE: + $this->awardAchievement("buildFurnace"); + break; + case Item::WOODEN_HOE: + $this->awardAchievement("buildHoe"); + break; + case Item::BREAD: + $this->awardAchievement("makeBread"); + break; + case Item::CAKE: + $this->awardAchievement("bakeCake"); + $this->inventory->addItem(Item::get(Item::BUCKET, 0, 3)); + break; + case Item::STONE_PICKAXE: + case Item::GOLD_PICKAXE: + case Item::IRON_PICKAXE: + case Item::DIAMOND_PICKAXE: + $this->awardAchievement("buildBetterPickaxe"); + break; + case Item::WOODEN_SWORD: + $this->awardAchievement("buildSword"); + break; + case Item::DIAMOND: + $this->awardAchievement("diamond"); + break; + }*/ + $craftingGroup->execute(); } @@ -2277,24 +2317,29 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ if($this->windows->contains($inventory)){ return $this->windows[$inventory]; } - if($forceId === null){ - $this->windowCnt = $cnt = max(2, ++$this->windowCnt % 99); - }else{ - $cnt = (int) $forceId; - } - $this->windowIndex[$cnt] = $inventory; - $this->windows->attach($inventory, $cnt); - $inventory->onOpen($this); - return $cnt; + if($forceId === 0 or $inventory->open($this)){ + if($forceId === null){ + $this->windowCnt = $cnt = max(2, ++$this->windowCnt % 99); + }else{ + $cnt = (int) $forceId; + } + $this->windowIndex[$cnt] = $inventory; + $this->windows->attach($inventory, $cnt); + return $cnt; + }else{ + return -1; + } + + } public function removeWindow(Inventory $inventory){ - $inventory->onClose($this); + $inventory->close($this); if($this->windows->contains($inventory)){ - $inventory->onClose($this); $id = $this->windows[$inventory]; unset($this->windowIndex[$id]); + $this->windows->detach($this->windows[$inventory]); } } diff --git a/src/pocketmine/event/inventory/InventoryOpenEvent.php b/src/pocketmine/event/inventory/InventoryOpenEvent.php new file mode 100644 index 000000000..1a1684e18 --- /dev/null +++ b/src/pocketmine/event/inventory/InventoryOpenEvent.php @@ -0,0 +1,52 @@ +who = $who; + parent::__construct($inventory); + } + + /** + * @return Player + */ + public function getPlayer(){ + return $this->who; + } + +} \ No newline at end of file diff --git a/src/pocketmine/event/inventory/InventoryPickupItemEvent.php b/src/pocketmine/event/inventory/InventoryPickupItemEvent.php new file mode 100644 index 000000000..98fb54825 --- /dev/null +++ b/src/pocketmine/event/inventory/InventoryPickupItemEvent.php @@ -0,0 +1,52 @@ +item = $item; + parent::__construct($inventory); + } + + /** + * @return Item + */ + public function getItem(){ + return $this->item; + } + +} \ No newline at end of file diff --git a/src/pocketmine/inventory/BaseInventory.php b/src/pocketmine/inventory/BaseInventory.php index dba3eb283..72b7f454d 100644 --- a/src/pocketmine/inventory/BaseInventory.php +++ b/src/pocketmine/inventory/BaseInventory.php @@ -23,6 +23,7 @@ namespace pocketmine\inventory; use pocketmine\entity\Entity; use pocketmine\event\entity\EntityInventoryChangeEvent; +use pocketmine\event\inventory\InventoryOpenEvent; use pocketmine\item\Item; use pocketmine\network\protocol\ContainerSetContentPacket; use pocketmine\network\protocol\ContainerSetSlotPacket; @@ -348,6 +349,19 @@ abstract class BaseInventory implements Inventory{ $this->setMaxStackSize($size); } + public function open(Player $who){ + $who->getServer()->getPluginManager()->callEvent($ev = new InventoryOpenEvent($this, $who)); + if($ev->isCancelled()){ + return false; + } + $this->onOpen($who); + return true; + } + + public function close(Player $who){ + $this->onClose($who); + } + public function onOpen(Player $who){ $this->viewers->attach($who); } diff --git a/src/pocketmine/inventory/Inventory.php b/src/pocketmine/inventory/Inventory.php index c10c39238..6bc3421d9 100644 --- a/src/pocketmine/inventory/Inventory.php +++ b/src/pocketmine/inventory/Inventory.php @@ -194,6 +194,17 @@ interface Inventory{ */ public function onOpen(Player $who); + /** + * Tries to open the inventory to a player + * + * @param Player $who + * + * @return bool + */ + public function open(Player $who); + + public function close(Player $who); + /** * @param Player $who */