From b50e29085e3830ca8002007eef3d9be095072e89 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 4 Dec 2018 19:02:26 +0000 Subject: [PATCH] Remove InventoryEventProcessor, use closures instead --- src/pocketmine/entity/Human.php | 19 ++++++-- src/pocketmine/entity/Living.php | 13 ++++- .../ArmorInventoryEventProcessor.php | 47 ------------------ src/pocketmine/inventory/BaseInventory.php | 20 ++++---- .../EntityInventoryEventProcessor.php | 47 ------------------ src/pocketmine/inventory/Inventory.php | 8 ++-- .../inventory/InventoryEventProcessor.php | 48 ------------------- src/pocketmine/tile/Furnace.php | 16 ++----- 8 files changed, 44 insertions(+), 174 deletions(-) delete mode 100644 src/pocketmine/inventory/ArmorInventoryEventProcessor.php delete mode 100644 src/pocketmine/inventory/EntityInventoryEventProcessor.php delete mode 100644 src/pocketmine/inventory/InventoryEventProcessor.php diff --git a/src/pocketmine/entity/Human.php b/src/pocketmine/entity/Human.php index bdc657a2a..bd0fde33d 100644 --- a/src/pocketmine/entity/Human.php +++ b/src/pocketmine/entity/Human.php @@ -26,11 +26,12 @@ namespace pocketmine\entity; use pocketmine\entity\projectile\ProjectileSource; use pocketmine\entity\utils\ExperienceUtils; use pocketmine\event\entity\EntityDamageEvent; +use pocketmine\event\entity\EntityInventoryChangeEvent; use pocketmine\event\entity\EntityRegainHealthEvent; use pocketmine\event\player\PlayerExhaustEvent; use pocketmine\event\player\PlayerExperienceChangeEvent; use pocketmine\inventory\EnderChestInventory; -use pocketmine\inventory\EntityInventoryEventProcessor; +use pocketmine\inventory\Inventory; use pocketmine\inventory\InventoryHolder; use pocketmine\inventory\PlayerInventory; use pocketmine\item\Consumable; @@ -613,8 +614,8 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{ $inventoryTag = $nbt->getListTag("Inventory"); if($inventoryTag !== null){ - $armorListener = $this->armorInventory->getEventProcessor(); - $this->armorInventory->setEventProcessor(null); + $armorListener = $this->armorInventory->getSlotChangeListener(); + $this->armorInventory->setSlotChangeListener(null); /** @var CompoundTag $item */ foreach($inventoryTag as $i => $item){ @@ -628,7 +629,7 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{ } } - $this->armorInventory->setEventProcessor($armorListener); + $this->armorInventory->setSlotChangeListener($armorListener); } $enderChestInventoryTag = $nbt->getListTag("EnderChestInventory"); @@ -641,7 +642,15 @@ class Human extends Creature implements ProjectileSource, InventoryHolder{ $this->inventory->setHeldItemIndex($nbt->getInt("SelectedInventorySlot", 0), false); - $this->inventory->setEventProcessor(new EntityInventoryEventProcessor($this)); + $this->inventory->setSlotChangeListener(function(Inventory $inventory, int $slot, Item $oldItem, Item $newItem) : ?Item{ + $ev = new EntityInventoryChangeEvent($this, $oldItem, $newItem, $slot); + $ev->call(); + if($ev->isCancelled()){ + return null; + } + + return $ev->getNewItem(); + }); $this->setFood((float) $nbt->getInt("foodLevel", (int) $this->getFood(), true)); $this->setExhaustion($nbt->getFloat("foodExhaustionLevel", $this->getExhaustion(), true)); diff --git a/src/pocketmine/entity/Living.php b/src/pocketmine/entity/Living.php index 8f8846ef3..e279bd418 100644 --- a/src/pocketmine/entity/Living.php +++ b/src/pocketmine/entity/Living.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\entity; use pocketmine\block\Block; +use pocketmine\event\entity\EntityArmorChangeEvent; use pocketmine\event\entity\EntityDamageByChildEntityEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; @@ -31,7 +32,7 @@ use pocketmine\event\entity\EntityDeathEvent; use pocketmine\event\entity\EntityEffectAddEvent; use pocketmine\event\entity\EntityEffectRemoveEvent; use pocketmine\inventory\ArmorInventory; -use pocketmine\inventory\ArmorInventoryEventProcessor; +use pocketmine\inventory\Inventory; use pocketmine\item\Armor; use pocketmine\item\Consumable; use pocketmine\item\Durable; @@ -79,7 +80,15 @@ abstract class Living extends Entity implements Damageable{ $this->armorInventory = new ArmorInventory($this); //TODO: load/save armor inventory contents - $this->armorInventory->setEventProcessor(new ArmorInventoryEventProcessor($this)); + $this->armorInventory->setSlotChangeListener(function(Inventory $inventory, int $slot, Item $oldItem, Item $newItem) : ?Item{ + $ev = new EntityArmorChangeEvent($this, $oldItem, $newItem, $slot); + $ev->call(); + if($ev->isCancelled()){ + return null; + } + + return $ev->getNewItem(); + }); $health = $this->getMaxHealth(); diff --git a/src/pocketmine/inventory/ArmorInventoryEventProcessor.php b/src/pocketmine/inventory/ArmorInventoryEventProcessor.php deleted file mode 100644 index f0866571e..000000000 --- a/src/pocketmine/inventory/ArmorInventoryEventProcessor.php +++ /dev/null @@ -1,47 +0,0 @@ -entity = $entity; - } - - public function onSlotChange(Inventory $inventory, int $slot, Item $oldItem, Item $newItem) : ?Item{ - $ev = new EntityArmorChangeEvent($this->entity, $oldItem, $newItem, $slot); - $ev->call(); - if($ev->isCancelled()){ - return null; - } - - return $ev->getNewItem(); - } -} diff --git a/src/pocketmine/inventory/BaseInventory.php b/src/pocketmine/inventory/BaseInventory.php index cc335e6de..fdbe0a2e0 100644 --- a/src/pocketmine/inventory/BaseInventory.php +++ b/src/pocketmine/inventory/BaseInventory.php @@ -32,6 +32,7 @@ use pocketmine\network\mcpe\protocol\InventoryContentPacket; use pocketmine\network\mcpe\protocol\InventorySlotPacket; use pocketmine\network\mcpe\protocol\types\ContainerIds; use pocketmine\Player; +use pocketmine\utils\Utils; abstract class BaseInventory implements Inventory{ @@ -45,8 +46,8 @@ abstract class BaseInventory implements Inventory{ protected $slots = []; /** @var Player[] */ protected $viewers = []; - /** @var InventoryEventProcessor */ - protected $eventProcessor; + /** @var \Closure */ + protected $slotChangeListener; /** * @param Item[] $items @@ -163,8 +164,8 @@ abstract class BaseInventory implements Inventory{ } $oldItem = $this->getItem($index); - if($this->eventProcessor !== null){ - $newItem = $this->eventProcessor->onSlotChange($this, $index, $oldItem, $item); + if($this->slotChangeListener !== null){ + $newItem = ($this->slotChangeListener)($this, $index, $oldItem, $item); if($newItem === null){ return false; } @@ -476,11 +477,14 @@ abstract class BaseInventory implements Inventory{ return $slot >= 0 and $slot < $this->slots->getSize(); } - public function getEventProcessor() : ?InventoryEventProcessor{ - return $this->eventProcessor; + public function getSlotChangeListener() : ?\Closure{ + return $this->slotChangeListener; } - public function setEventProcessor(?InventoryEventProcessor $eventProcessor) : void{ - $this->eventProcessor = $eventProcessor; + public function setSlotChangeListener(?\Closure $eventProcessor) : void{ + if($eventProcessor !== null){ + Utils::validateCallableSignature(function(Inventory $inventory, int $slot, Item $oldItem, Item $newItem) : ?Item{}, $eventProcessor); + } + $this->slotChangeListener = $eventProcessor; } } diff --git a/src/pocketmine/inventory/EntityInventoryEventProcessor.php b/src/pocketmine/inventory/EntityInventoryEventProcessor.php deleted file mode 100644 index 1b4fbf0eb..000000000 --- a/src/pocketmine/inventory/EntityInventoryEventProcessor.php +++ /dev/null @@ -1,47 +0,0 @@ -entity = $entity; - } - - public function onSlotChange(Inventory $inventory, int $slot, Item $oldItem, Item $newItem) : ?Item{ - $ev = new EntityInventoryChangeEvent($this->entity, $oldItem, $newItem, $slot); - $ev->call(); - if($ev->isCancelled()){ - return null; - } - - return $ev->getNewItem(); - } -} diff --git a/src/pocketmine/inventory/Inventory.php b/src/pocketmine/inventory/Inventory.php index 7e5f5d40a..cf251d03e 100644 --- a/src/pocketmine/inventory/Inventory.php +++ b/src/pocketmine/inventory/Inventory.php @@ -250,12 +250,12 @@ interface Inventory{ public function slotExists(int $slot) : bool; /** - * @return null|InventoryEventProcessor + * @return null|\Closure */ - public function getEventProcessor() : ?InventoryEventProcessor; + public function getSlotChangeListener() : ?\Closure; /** - * @param null|InventoryEventProcessor $eventProcessor + * @param \Closure|null $eventProcessor */ - public function setEventProcessor(?InventoryEventProcessor $eventProcessor) : void; + public function setSlotChangeListener(?\Closure $eventProcessor) : void; } diff --git a/src/pocketmine/inventory/InventoryEventProcessor.php b/src/pocketmine/inventory/InventoryEventProcessor.php deleted file mode 100644 index 0ecafec3c..000000000 --- a/src/pocketmine/inventory/InventoryEventProcessor.php +++ /dev/null @@ -1,48 +0,0 @@ -inventory = new FurnaceInventory($this); $this->loadItems($nbt); - $this->inventory->setEventProcessor(new class($this) implements InventoryEventProcessor{ - /** @var Furnace */ - private $furnace; - - public function __construct(Furnace $furnace){ - $this->furnace = $furnace; - } - - public function onSlotChange(Inventory $inventory, int $slot, Item $oldItem, Item $newItem) : ?Item{ - $this->furnace->scheduleUpdate(); - return $newItem; - } + $this->inventory->setSlotChangeListener(function(Inventory $inventory, int $slot, Item $oldItem, Item $newItem) : ?Item{ + $this->scheduleUpdate(); + return $newItem; }); }