From 2b5cf91cfd3536ff72559f664b12469bd7aa1d97 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Sun, 16 Jul 2023 21:12:36 +0000 Subject: [PATCH 01/85] implement transfer functionality for hoppers --- src/block/Hopper.php | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index ea000503cb0..609e026ebf7 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -77,6 +77,9 @@ public function getSupportType(int $facing) : SupportType{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $this->facing = $face === Facing::DOWN ? Facing::DOWN : Facing::opposite($face); + $world = $this->position->getWorld(); + $world->scheduleDelayedBlockUpdate($blockReplace->position, 8); + return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -92,7 +95,45 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player } public function onScheduledUpdate() : void{ - //TODO + $world = $this->position->getWorld(); + $this->transferFirstItem(); + $world->scheduleDelayedBlockUpdate($this->position, 8); + } + + private function transferFirstItem(){ + $tile = $this->position->getWorld()->getTile($this->position); + if($tile instanceof TileHopper){ + $hopperEmpty = true; + + $itemStack = $tile->getInventory()->getItem(0); + + for($i = 0; $i < 5; $i++){ + if($hopperEmpty === false) continue; + + $itemStack = $tile->getInventory()->getItem($i); + + if(!$itemStack->isNull()){ + $hopperEmpty = false; + } + } + + if($hopperEmpty) return; + + $singleItem = $itemStack->pop(1); + + $facingBlock = $this->getSide($this->facing); + + if($facingBlock instanceof Hopper){ + $facingTile = $this->position->getWorld()->getTile($facingBlock->position); + + if($facingTile instanceof TileHopper){ + if($facingTile->getInventory()->canAddItem($singleItem)){ + $tile->getInventory()->removeItem($singleItem); + $facingTile->getInventory()->addItem($singleItem); + } + } + } + } } //TODO: redstone logic, sucking logic From e88a8dfc30a10ee0acd3675c6c60d1043311eb22 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Sun, 16 Jul 2023 21:29:14 +0000 Subject: [PATCH 02/85] fix return type not specified --- src/block/Hopper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 609e026ebf7..5057fde1105 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -100,7 +100,7 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, 8); } - private function transferFirstItem(){ + private function transferFirstItem(): void{ $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileHopper){ $hopperEmpty = true; From 0773f56c69133589348f467b192ebaba9b303b2a Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Sun, 16 Jul 2023 21:33:36 +0000 Subject: [PATCH 03/85] fix styling issue --- src/block/Hopper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 5057fde1105..d772e17f8e1 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -100,7 +100,7 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, 8); } - private function transferFirstItem(): void{ + private function transferFirstItem() : void{ $tile = $this->position->getWorld()->getTile($this->position); if($tile instanceof TileHopper){ $hopperEmpty = true; From 9222deb591cce4d1345c9340a212583300c83d15 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Sun, 16 Jul 2023 21:56:38 +0000 Subject: [PATCH 04/85] Cleaning up the mess. Should save a few cpu cycles --- src/block/Hopper.php | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index d772e17f8e1..9c04ecf8cc2 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -102,37 +102,27 @@ public function onScheduledUpdate() : void{ private function transferFirstItem() : void{ $tile = $this->position->getWorld()->getTile($this->position); - if($tile instanceof TileHopper){ - $hopperEmpty = true; + if(!$tile instanceof TileHopper) return; - $itemStack = $tile->getInventory()->getItem(0); + $facingBlock = $this->getSide($this->facing); + if(!$facingBlock instanceof Hopper) return; - for($i = 0; $i < 5; $i++){ - if($hopperEmpty === false) continue; + $facingTile = $this->position->getWorld()->getTile($facingBlock->position); + if(!$facingTile instanceof TileHopper) return; - $itemStack = $tile->getInventory()->getItem($i); + for($i = 0; $i < 5; $i++){ + $itemStack = $tile->getInventory()->getItem($i); - if(!$itemStack->isNull()){ - $hopperEmpty = false; - } - } - - if($hopperEmpty) return; + if($itemStack->isNull()) continue; $singleItem = $itemStack->pop(1); - $facingBlock = $this->getSide($this->facing); - - if($facingBlock instanceof Hopper){ - $facingTile = $this->position->getWorld()->getTile($facingBlock->position); - - if($facingTile instanceof TileHopper){ - if($facingTile->getInventory()->canAddItem($singleItem)){ - $tile->getInventory()->removeItem($singleItem); - $facingTile->getInventory()->addItem($singleItem); - } - } + if($facingTile->getInventory()->canAddItem($singleItem)){ + $tile->getInventory()->removeItem($singleItem); + $facingTile->getInventory()->addItem($singleItem); } + + break; } } From 726e53e90fcc7a1fd7d57c7773d24cfb109621d0 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 05:21:53 +0000 Subject: [PATCH 05/85] Helper functions to check ability to add fuel/smelting --- src/block/inventory/FurnaceInventory.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index ff44d6b7063..017cec83373 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -26,6 +26,7 @@ use pocketmine\crafting\FurnaceType; use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; +use pocketmine\item\VanillaItems; use pocketmine\world\Position; class FurnaceInventory extends SimpleInventory implements BlockInventory{ @@ -68,4 +69,16 @@ public function setFuel(Item $item) : void{ public function setSmelting(Item $item) : void{ $this->setItem(self::SLOT_INPUT, $item); } + + public function canAddSmelting(Item $item) : bool{ + if($this->getSmelting()->isNull()) return true; + + return $this->getSmelting()->getTypeId() === $item->getTypeId(); + } + + public function canAddFuel(Item $item) : bool{ + if($this->getFuel()->isNull()) return true; + + return $this->getFuel()->getTypeId() === $item->getTypeId(); + } } From c818396f5f70453eeb416d2ed2b0c9e7ecc7534b Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 05:22:45 +0000 Subject: [PATCH 06/85] Mostly complete implementation for hopper interaction with furnance --- src/block/Hopper.php | 102 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 7 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 9c04ecf8cc2..91d0dbcbcd9 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -24,6 +24,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; +use pocketmine\block\tile\Furnace as TileFurnance; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; @@ -33,12 +34,46 @@ use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; +use pocketmine\item\ItemTypeIds; class Hopper extends Transparent{ use PoweredByRedstoneTrait; private int $facing = Facing::DOWN; + private array $furnanceAcceptedInputs = [ + ItemTypeIds::RAW_BEEF, + ItemTypeIds::RAW_PORKCHOP, + ItemTypeIds::RAW_CHICKEN, + ItemTypeIds::RAW_MUTTON, + ItemTypeIds::RAW_RABBIT, + ItemTypeIds::RAW_SALMON, + // Need to add raw cod + ]; + private array $furnanceAcceptedFuels = [ + BlockTypeIds::OAK_PLANKS, + BlockTypeIds::SPRUCE_PLANKS, + BlockTypeIds::BIRCH_PLANKS, + BlockTypeIds::JUNGLE_PLANKS, + BlockTypeIds::ACACIA_PLANKS, + BlockTypeIds::DARK_OAK_PLANKS, + BlockTypeIds::OAK_PLANKS, + BlockTypeIds::MANGROVE_PLANKS, + BlockTypeIds::CHERRY_PLANKS, + BlockTypeIds::CRIMSON_PLANKS, + BlockTypeIds::WARPED_PLANKS, + BlockTypeIds::OAK_LOG, + BlockTypeIds::SPRUCE_LOG, + BlockTypeIds::BIRCH_LOG, + BlockTypeIds::OAK_PLANKS, + BlockTypeIds::JUNGLE_LOG, + BlockTypeIds::ACACIA_LOG, + BlockTypeIds::DARK_OAK_LOG, + BlockTypeIds::MANGROVE_LOG, + BlockTypeIds::CHERRY_LOG, + //Need to add stripped logs + ]; + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); @@ -96,35 +131,88 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); - $this->transferFirstItem(); + $this->push(); $world->scheduleDelayedBlockUpdate($this->position, 8); } - private function transferFirstItem() : void{ + public function push(){ $tile = $this->position->getWorld()->getTile($this->position); if(!$tile instanceof TileHopper) return; $facingBlock = $this->getSide($this->facing); - if(!$facingBlock instanceof Hopper) return; + match($facingBlock::class){ + Hopper::class => $this->transferToHopper($tile, $facingBlock), + Furnace::class => $this->transferToFurnance($tile, $facingBlock), + default => null + }; + } + + private function transferToHopper(TileHopper $tileHopper, Hopper $facingBlock) : void{ $facingTile = $this->position->getWorld()->getTile($facingBlock->position); if(!$facingTile instanceof TileHopper) return; + $sourceInventory = $tileHopper->getInventory(); + $targetInventory = $facingTile->getInventory(); + for($i = 0; $i < 5; $i++){ - $itemStack = $tile->getInventory()->getItem($i); + $itemStack = $sourceInventory->getItem($i); if($itemStack->isNull()) continue; $singleItem = $itemStack->pop(1); - if($facingTile->getInventory()->canAddItem($singleItem)){ - $tile->getInventory()->removeItem($singleItem); - $facingTile->getInventory()->addItem($singleItem); + if($targetInventory->canAddItem($singleItem)){ + $this->transferItem($sourceInventory, $targetInventory, $singleItem); } break; } } + private function transferToFurnance(TileHopper $tileHopper, Furnace $facingBlock) : void{ + $facingTile = $this->position->getWorld()->getTile($facingBlock->position); + if(!$facingTile instanceof TileFurnance) return; + + $hopperFacing = $tileHopper->getBlock()->getFacing(); + $inventory = $tileHopper->getInventory(); + $furnanceInventory = $facingTile->getInventory(); + + for($i = 0; $i < 5; $i++){ + $itemStack = $inventory->getItem($i); + + if($itemStack->isNull()) continue; + + $singleItem = $itemStack->pop(1); + $typeId = $singleItem->getTypeId(); + + if($hopperFacing === Facing::DOWN && in_array($typeId, $this->furnanceAcceptedInputs) && $furnanceInventory->canAddSmelting($singleItem)){ + $this->transferItem($inventory, $furnanceInventory, $singleItem, 0); + }else if($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && (in_array(ItemTypeIds::toBlockTypeId($typeId), $this->furnanceAcceptedFuels) || $typeId == ItemTypeIds::CHARCOAL) && $furnanceInventory->canAddFuel($singleItem)){ + $this->transferItem($inventory, $furnanceInventory, $singleItem, 1); + } + } + } + + private function transferItem($sourceInventory, $targetInventory, Item $item, int $slot = null) : void{ + $sourceInventory->removeItem($item); + + if($slot === null){ + $sourceInventory->removeItem($item); + $targetInventory->addItem($item); + return; + } + + $currentItem = $targetInventory->getItem($slot); + + if($currentItem->isNull()){ + $targetInventory->setItem($slot, $item); + return; + } + + $currentItem->setCount($currentItem->getCount() + 1); + $targetInventory->setItem($slot, $currentItem); + } + //TODO: redstone logic, sucking logic } From 21dc611cec29e21654d7b40e0cc6f55df8e1a092 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 16:34:52 +0000 Subject: [PATCH 07/85] move furnance accepted values to furnance inventory --- src/block/Hopper.php | 37 ++------------------- src/block/inventory/FurnaceInventory.php | 41 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 91d0dbcbcd9..a67a69f53ad 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -41,39 +41,6 @@ class Hopper extends Transparent{ private int $facing = Facing::DOWN; - private array $furnanceAcceptedInputs = [ - ItemTypeIds::RAW_BEEF, - ItemTypeIds::RAW_PORKCHOP, - ItemTypeIds::RAW_CHICKEN, - ItemTypeIds::RAW_MUTTON, - ItemTypeIds::RAW_RABBIT, - ItemTypeIds::RAW_SALMON, - // Need to add raw cod - ]; - private array $furnanceAcceptedFuels = [ - BlockTypeIds::OAK_PLANKS, - BlockTypeIds::SPRUCE_PLANKS, - BlockTypeIds::BIRCH_PLANKS, - BlockTypeIds::JUNGLE_PLANKS, - BlockTypeIds::ACACIA_PLANKS, - BlockTypeIds::DARK_OAK_PLANKS, - BlockTypeIds::OAK_PLANKS, - BlockTypeIds::MANGROVE_PLANKS, - BlockTypeIds::CHERRY_PLANKS, - BlockTypeIds::CRIMSON_PLANKS, - BlockTypeIds::WARPED_PLANKS, - BlockTypeIds::OAK_LOG, - BlockTypeIds::SPRUCE_LOG, - BlockTypeIds::BIRCH_LOG, - BlockTypeIds::OAK_PLANKS, - BlockTypeIds::JUNGLE_LOG, - BlockTypeIds::ACACIA_LOG, - BlockTypeIds::DARK_OAK_LOG, - BlockTypeIds::MANGROVE_LOG, - BlockTypeIds::CHERRY_LOG, - //Need to add stripped logs - ]; - protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); @@ -186,9 +153,9 @@ private function transferToFurnance(TileHopper $tileHopper, Furnace $facingBlock $singleItem = $itemStack->pop(1); $typeId = $singleItem->getTypeId(); - if($hopperFacing === Facing::DOWN && in_array($typeId, $this->furnanceAcceptedInputs) && $furnanceInventory->canAddSmelting($singleItem)){ + if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ $this->transferItem($inventory, $furnanceInventory, $singleItem, 0); - }else if($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && (in_array(ItemTypeIds::toBlockTypeId($typeId), $this->furnanceAcceptedFuels) || $typeId == ItemTypeIds::CHARCOAL) && $furnanceInventory->canAddFuel($singleItem)){ + }else if($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ $this->transferItem($inventory, $furnanceInventory, $singleItem, 1); } } diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 017cec83373..693e18ed832 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -23,9 +23,11 @@ namespace pocketmine\block\inventory; +use pocketmine\block\BlockTypeIds; use pocketmine\crafting\FurnaceType; use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; +use pocketmine\item\ItemTypeIds; use pocketmine\item\VanillaItems; use pocketmine\world\Position; @@ -36,6 +38,40 @@ class FurnaceInventory extends SimpleInventory implements BlockInventory{ public const SLOT_FUEL = 1; public const SLOT_RESULT = 2; + private array $furnanceAcceptedInputs = [ + ItemTypeIds::RAW_BEEF, + ItemTypeIds::RAW_PORKCHOP, + ItemTypeIds::RAW_CHICKEN, + ItemTypeIds::RAW_MUTTON, + ItemTypeIds::RAW_RABBIT, + ItemTypeIds::RAW_SALMON, + // Need to add raw cod + ]; + + private array $furnanceAcceptedFuels = [ + BlockTypeIds::OAK_PLANKS, + BlockTypeIds::SPRUCE_PLANKS, + BlockTypeIds::BIRCH_PLANKS, + BlockTypeIds::JUNGLE_PLANKS, + BlockTypeIds::ACACIA_PLANKS, + BlockTypeIds::DARK_OAK_PLANKS, + BlockTypeIds::OAK_PLANKS, + BlockTypeIds::MANGROVE_PLANKS, + BlockTypeIds::CHERRY_PLANKS, + BlockTypeIds::CRIMSON_PLANKS, + BlockTypeIds::WARPED_PLANKS, + BlockTypeIds::OAK_LOG, + BlockTypeIds::SPRUCE_LOG, + BlockTypeIds::BIRCH_LOG, + BlockTypeIds::OAK_PLANKS, + BlockTypeIds::JUNGLE_LOG, + BlockTypeIds::ACACIA_LOG, + BlockTypeIds::DARK_OAK_LOG, + BlockTypeIds::MANGROVE_LOG, + BlockTypeIds::CHERRY_LOG, + //Need to add stripped logs + ]; + public function __construct( Position $holder, private FurnaceType $furnaceType @@ -71,12 +107,17 @@ public function setSmelting(Item $item) : void{ } public function canAddSmelting(Item $item) : bool{ + if(!in_array($item->getTypeId(), $this->furnanceAcceptedInputs)) return false; + if($this->getSmelting()->isNull()) return true; return $this->getSmelting()->getTypeId() === $item->getTypeId(); } public function canAddFuel(Item $item) : bool{ + $typeId = $item->getTypeId(); + if(!in_array(ItemTypeIds::toBlockTypeId($typeId), $this->furnanceAcceptedFuels) && $typeId != ItemTypeIds::CHARCOAL) return false; + if($this->getFuel()->isNull()) return true; return $this->getFuel()->getTypeId() === $item->getTypeId(); From f35384f3cbdb371fcc113add1ac789a731109d2e Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 16:36:47 +0000 Subject: [PATCH 08/85] fixes code style issues --- src/block/Hopper.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index a67a69f53ad..dc74ed2cea7 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -23,8 +23,8 @@ namespace pocketmine\block; -use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\tile\Furnace as TileFurnance; +use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; @@ -34,7 +34,6 @@ use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -use pocketmine\item\ItemTypeIds; class Hopper extends Transparent{ use PoweredByRedstoneTrait; From 42d9e882ed7a4a4d958872cfbda78e28e995da68 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 16:48:33 +0000 Subject: [PATCH 09/85] fix code style issues --- src/block/inventory/FurnaceInventory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 693e18ed832..8eac971a496 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -107,7 +107,7 @@ public function setSmelting(Item $item) : void{ } public function canAddSmelting(Item $item) : bool{ - if(!in_array($item->getTypeId(), $this->furnanceAcceptedInputs)) return false; + if(!in_array($item->getTypeId(), $this->furnanceAcceptedInputs, true)) return false; if($this->getSmelting()->isNull()) return true; @@ -116,7 +116,7 @@ public function canAddSmelting(Item $item) : bool{ public function canAddFuel(Item $item) : bool{ $typeId = $item->getTypeId(); - if(!in_array(ItemTypeIds::toBlockTypeId($typeId), $this->furnanceAcceptedFuels) && $typeId != ItemTypeIds::CHARCOAL) return false; + if(!in_array(ItemTypeIds::toBlockTypeId($typeId), $this->furnanceAcceptedFuels, true) && $typeId != ItemTypeIds::CHARCOAL) return false; if($this->getFuel()->isNull()) return true; From 41c97644d6bedd87d9c53b1559fa0e93f07a27bb Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 16:50:11 +0000 Subject: [PATCH 10/85] fix code style issues --- src/block/Hopper.php | 2 +- src/block/inventory/FurnaceInventory.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index dc74ed2cea7..ddfcc8e9e6c 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -154,7 +154,7 @@ private function transferToFurnance(TileHopper $tileHopper, Furnace $facingBlock if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ $this->transferItem($inventory, $furnanceInventory, $singleItem, 0); - }else if($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ + }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ $this->transferItem($inventory, $furnanceInventory, $singleItem, 1); } } diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 8eac971a496..591149285a5 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -28,9 +28,10 @@ use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; use pocketmine\item\ItemTypeIds; -use pocketmine\item\VanillaItems; use pocketmine\world\Position; +use function in_array; + class FurnaceInventory extends SimpleInventory implements BlockInventory{ use BlockInventoryTrait; From 0dca10b896592571f4218d2eeec8a0246c33c7a0 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 16:52:59 +0000 Subject: [PATCH 11/85] code style fixes --- src/block/Hopper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index ddfcc8e9e6c..0094acb47c9 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -146,12 +146,12 @@ private function transferToFurnance(TileHopper $tileHopper, Furnace $facingBlock for($i = 0; $i < 5; $i++){ $itemStack = $inventory->getItem($i); - + if($itemStack->isNull()) continue; - + $singleItem = $itemStack->pop(1); $typeId = $singleItem->getTypeId(); - + if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ $this->transferItem($inventory, $furnanceInventory, $singleItem, 0); }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ From 3ef603bebcd980cd5658a6aa5f487f807ddfa56c Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 17:28:21 +0000 Subject: [PATCH 12/85] styling and bug fixes --- src/block/Hopper.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 0094acb47c9..8883535e715 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -28,6 +28,7 @@ use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -101,7 +102,7 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, 8); } - public function push(){ + public function push() : void{ $tile = $this->position->getWorld()->getTile($this->position); if(!$tile instanceof TileHopper) return; @@ -160,7 +161,7 @@ private function transferToFurnance(TileHopper $tileHopper, Furnace $facingBlock } } - private function transferItem($sourceInventory, $targetInventory, Item $item, int $slot = null) : void{ + private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot = null) : void{ $sourceInventory->removeItem($item); if($slot === null){ From d62e46e62be9a691a2a7e4c194baca99c0b224ec Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 21:48:49 +0000 Subject: [PATCH 13/85] add interface for interacting with hopper --- src/block/HopperInteractable.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/block/HopperInteractable.php diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php new file mode 100644 index 00000000000..a6d5f6b570c --- /dev/null +++ b/src/block/HopperInteractable.php @@ -0,0 +1,30 @@ + Date: Mon, 17 Jul 2023 21:49:07 +0000 Subject: [PATCH 14/85] individual hopper and furnance implementations --- src/block/Furnace.php | 48 +++++++++++++++++++++++++++++- src/block/Hopper.php | 69 +++++++------------------------------------ 2 files changed, 57 insertions(+), 60 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index d943f8cc613..a70cdc3d42d 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -24,16 +24,19 @@ namespace pocketmine\block; use pocketmine\block\tile\Furnace as TileFurnace; +use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; +use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use function mt_rand; -class Furnace extends Opaque{ +class Furnace extends Opaque implements HopperInteractable{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; @@ -92,4 +95,47 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, 1); //TODO: check this } } + + public function pull(TileHopper $tileHopper) : void{ + $furnanceTile = $this->position->getWorld()->getTile($this->position); + if(!$furnanceTile instanceof TileFurnace) return; + + $hopperFacing = $tileHopper->getBlock()->getFacing(); + $hopperInventory = $tileHopper->getInventory(); + $furnanceInventory = $furnanceTile->getInventory(); + + for($i = 0; $i < 5; $i++){ + $itemStack = $hopperInventory->getItem($i); + + if($itemStack->isNull()) continue; + + $singleItem = $itemStack->pop(1); + + if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ + $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, 0); + }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ + $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, 1); + } + } + } + + private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot = null) : void{ + $sourceInventory->removeItem($item); + + if($slot === null){ + $sourceInventory->removeItem($item); + $targetInventory->addItem($item); + return; + } + + $currentItem = $targetInventory->getItem($slot); + + if($currentItem->isNull()){ + $targetInventory->setItem($slot, $item); + return; + } + + $currentItem->setCount($currentItem->getCount() + 1); + $targetInventory->setItem($slot, $currentItem); + } } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 8883535e715..a2dd39c7ded 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -36,7 +36,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -class Hopper extends Transparent{ +class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; private int $facing = Facing::DOWN; @@ -98,29 +98,23 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); - $this->push(); $world->scheduleDelayedBlockUpdate($this->position, 8); - } - public function push() : void{ $tile = $this->position->getWorld()->getTile($this->position); if(!$tile instanceof TileHopper) return; - + $facingBlock = $this->getSide($this->facing); + if(!$facingBlock instanceof HopperInteractable) return; - match($facingBlock::class){ - Hopper::class => $this->transferToHopper($tile, $facingBlock), - Furnace::class => $this->transferToFurnance($tile, $facingBlock), - default => null - }; + $facingBlock->pull($tile); } - private function transferToHopper(TileHopper $tileHopper, Hopper $facingBlock) : void{ - $facingTile = $this->position->getWorld()->getTile($facingBlock->position); - if(!$facingTile instanceof TileHopper) return; + public function pull(TileHopper $tileHopper) : void{ + $hopperTile = $this->position->getWorld()->getTile($this->position); + if(!$hopperTile instanceof TileHopper) return; $sourceInventory = $tileHopper->getInventory(); - $targetInventory = $facingTile->getInventory(); + $targetInventory = $hopperTile->getInventory(); for($i = 0; $i < 5; $i++){ $itemStack = $sourceInventory->getItem($i); @@ -130,56 +124,13 @@ private function transferToHopper(TileHopper $tileHopper, Hopper $facingBlock) : $singleItem = $itemStack->pop(1); if($targetInventory->canAddItem($singleItem)){ - $this->transferItem($sourceInventory, $targetInventory, $singleItem); + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); } break; } } - private function transferToFurnance(TileHopper $tileHopper, Furnace $facingBlock) : void{ - $facingTile = $this->position->getWorld()->getTile($facingBlock->position); - if(!$facingTile instanceof TileFurnance) return; - - $hopperFacing = $tileHopper->getBlock()->getFacing(); - $inventory = $tileHopper->getInventory(); - $furnanceInventory = $facingTile->getInventory(); - - for($i = 0; $i < 5; $i++){ - $itemStack = $inventory->getItem($i); - - if($itemStack->isNull()) continue; - - $singleItem = $itemStack->pop(1); - $typeId = $singleItem->getTypeId(); - - if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ - $this->transferItem($inventory, $furnanceInventory, $singleItem, 0); - }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ - $this->transferItem($inventory, $furnanceInventory, $singleItem, 1); - } - } - } - - private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot = null) : void{ - $sourceInventory->removeItem($item); - - if($slot === null){ - $sourceInventory->removeItem($item); - $targetInventory->addItem($item); - return; - } - - $currentItem = $targetInventory->getItem($slot); - - if($currentItem->isNull()){ - $targetInventory->setItem($slot, $item); - return; - } - - $currentItem->setCount($currentItem->getCount() + 1); - $targetInventory->setItem($slot, $currentItem); - } - //TODO: redstone logic, sucking logic } From e7a75b89f77ebaeed2d7874ecc2bddbd80d6d367 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 21:53:08 +0000 Subject: [PATCH 15/85] code style fixes --- src/block/Hopper.php | 4 +--- src/block/HopperInteractable.php | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index a2dd39c7ded..341e451ad93 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -23,12 +23,10 @@ namespace pocketmine\block; -use pocketmine\block\tile\Furnace as TileFurnance; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -105,7 +103,7 @@ public function onScheduledUpdate() : void{ $facingBlock = $this->getSide($this->facing); if(!$facingBlock instanceof HopperInteractable) return; - + $facingBlock->pull($tile); } diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index a6d5f6b570c..c4e95639091 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -27,4 +27,4 @@ interface HopperInteractable{ public function pull(TileHopper $tileHopper) : void; -} \ No newline at end of file +} From d65112b8938092c8f37b0346c51a3688f34339e7 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 21:55:26 +0000 Subject: [PATCH 16/85] code style fix --- src/block/Hopper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 341e451ad93..acdfa27cca4 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -97,13 +97,13 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); $world->scheduleDelayedBlockUpdate($this->position, 8); - + $tile = $this->position->getWorld()->getTile($this->position); if(!$tile instanceof TileHopper) return; - + $facingBlock = $this->getSide($this->facing); if(!$facingBlock instanceof HopperInteractable) return; - + $facingBlock->pull($tile); } From dc778fb1826366a29f407e8051723e8140d86cb3 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 22:06:07 +0000 Subject: [PATCH 17/85] remove explicit item check --- src/block/inventory/FurnaceInventory.php | 38 +----------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 591149285a5..6195fd82f49 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -39,40 +39,6 @@ class FurnaceInventory extends SimpleInventory implements BlockInventory{ public const SLOT_FUEL = 1; public const SLOT_RESULT = 2; - private array $furnanceAcceptedInputs = [ - ItemTypeIds::RAW_BEEF, - ItemTypeIds::RAW_PORKCHOP, - ItemTypeIds::RAW_CHICKEN, - ItemTypeIds::RAW_MUTTON, - ItemTypeIds::RAW_RABBIT, - ItemTypeIds::RAW_SALMON, - // Need to add raw cod - ]; - - private array $furnanceAcceptedFuels = [ - BlockTypeIds::OAK_PLANKS, - BlockTypeIds::SPRUCE_PLANKS, - BlockTypeIds::BIRCH_PLANKS, - BlockTypeIds::JUNGLE_PLANKS, - BlockTypeIds::ACACIA_PLANKS, - BlockTypeIds::DARK_OAK_PLANKS, - BlockTypeIds::OAK_PLANKS, - BlockTypeIds::MANGROVE_PLANKS, - BlockTypeIds::CHERRY_PLANKS, - BlockTypeIds::CRIMSON_PLANKS, - BlockTypeIds::WARPED_PLANKS, - BlockTypeIds::OAK_LOG, - BlockTypeIds::SPRUCE_LOG, - BlockTypeIds::BIRCH_LOG, - BlockTypeIds::OAK_PLANKS, - BlockTypeIds::JUNGLE_LOG, - BlockTypeIds::ACACIA_LOG, - BlockTypeIds::DARK_OAK_LOG, - BlockTypeIds::MANGROVE_LOG, - BlockTypeIds::CHERRY_LOG, - //Need to add stripped logs - ]; - public function __construct( Position $holder, private FurnaceType $furnaceType @@ -108,8 +74,6 @@ public function setSmelting(Item $item) : void{ } public function canAddSmelting(Item $item) : bool{ - if(!in_array($item->getTypeId(), $this->furnanceAcceptedInputs, true)) return false; - if($this->getSmelting()->isNull()) return true; return $this->getSmelting()->getTypeId() === $item->getTypeId(); @@ -117,7 +81,7 @@ public function canAddSmelting(Item $item) : bool{ public function canAddFuel(Item $item) : bool{ $typeId = $item->getTypeId(); - if(!in_array(ItemTypeIds::toBlockTypeId($typeId), $this->furnanceAcceptedFuels, true) && $typeId != ItemTypeIds::CHARCOAL) return false; + if($item->getFuelTime() == 0) return false; if($this->getFuel()->isNull()) return true; From 8a046d8d810440c080d2833e5ccc605380e910c5 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 22:08:55 +0000 Subject: [PATCH 18/85] remove unused namespaces --- src/block/inventory/FurnaceInventory.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 6195fd82f49..cb6620d7599 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -23,11 +23,9 @@ namespace pocketmine\block\inventory; -use pocketmine\block\BlockTypeIds; use pocketmine\crafting\FurnaceType; use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; -use pocketmine\item\ItemTypeIds; use pocketmine\world\Position; use function in_array; From 3a34c3bc4725819d6fb4822e91452541c2ca9446 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 22:09:15 +0000 Subject: [PATCH 19/85] remove unused function --- src/block/inventory/FurnaceInventory.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index cb6620d7599..0aebbe7feba 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -28,8 +28,6 @@ use pocketmine\item\Item; use pocketmine\world\Position; -use function in_array; - class FurnaceInventory extends SimpleInventory implements BlockInventory{ use BlockInventoryTrait; From 78f8ceb8d1a15aacbd5fc0ddeaafc5ee51830f3b Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 22:18:50 +0000 Subject: [PATCH 20/85] code style fixes --- src/block/Hopper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index acdfa27cca4..347d3d30a0d 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -100,10 +100,10 @@ public function onScheduledUpdate() : void{ $tile = $this->position->getWorld()->getTile($this->position); if(!$tile instanceof TileHopper) return; - + $facingBlock = $this->getSide($this->facing); if(!$facingBlock instanceof HopperInteractable) return; - + $facingBlock->pull($tile); } From b746c06c3d4181d5a42a60426e2075fbfa3465e4 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 22:24:23 +0000 Subject: [PATCH 21/85] fix code style --- src/block/Hopper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 347d3d30a0d..c614485978a 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -97,13 +97,13 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); $world->scheduleDelayedBlockUpdate($this->position, 8); - + $tile = $this->position->getWorld()->getTile($this->position); if(!$tile instanceof TileHopper) return; - + $facingBlock = $this->getSide($this->facing); if(!$facingBlock instanceof HopperInteractable) return; - + $facingBlock->pull($tile); } From eaaf7411b4efc46bfb9f07f9b16009b902f3bcee Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 22:40:53 +0000 Subject: [PATCH 22/85] type check to fix facing issue --- src/block/Furnace.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index a70cdc3d42d..a430e25ccb4 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -100,7 +100,10 @@ public function pull(TileHopper $tileHopper) : void{ $furnanceTile = $this->position->getWorld()->getTile($this->position); if(!$furnanceTile instanceof TileFurnace) return; - $hopperFacing = $tileHopper->getBlock()->getFacing(); + $hopperBlock = $tileHopper->getBlock(); + if(!$hopperBlock instanceof Hopper) return; + + $hopperFacing = $hopperBlock->getFacing(); $hopperInventory = $tileHopper->getInventory(); $furnanceInventory = $furnanceTile->getInventory(); From 26009e5eb2c54fa8d740937fa94535e72c97863d Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 17 Jul 2023 22:43:34 +0000 Subject: [PATCH 23/85] code style fix --- src/block/Furnace.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index a430e25ccb4..89dbebbb728 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -102,7 +102,7 @@ public function pull(TileHopper $tileHopper) : void{ $hopperBlock = $tileHopper->getBlock(); if(!$hopperBlock instanceof Hopper) return; - + $hopperFacing = $hopperBlock->getFacing(); $hopperInventory = $tileHopper->getInventory(); $furnanceInventory = $furnanceTile->getInventory(); From 94f6c6d1b14a0b2e442160392a83eb781d08145b Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 19 Jul 2023 18:28:47 +0000 Subject: [PATCH 24/85] slot should not be optional and remove old code --- src/block/Furnace.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 89dbebbb728..5f826902de4 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -122,15 +122,9 @@ public function pull(TileHopper $tileHopper) : void{ } } - private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot = null) : void{ + private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot) : void{ $sourceInventory->removeItem($item); - if($slot === null){ - $sourceInventory->removeItem($item); - $targetInventory->addItem($item); - return; - } - $currentItem = $targetInventory->getItem($slot); if($currentItem->isNull()){ From 07f02235020859380917d00d0a7ad3f88190ff5f Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 19 Jul 2023 18:33:18 +0000 Subject: [PATCH 25/85] reduce hardcodings --- src/block/Furnace.php | 6 +++--- src/block/Hopper.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 5f826902de4..6b6f781965b 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -107,7 +107,7 @@ public function pull(TileHopper $tileHopper) : void{ $hopperInventory = $tileHopper->getInventory(); $furnanceInventory = $furnanceTile->getInventory(); - for($i = 0; $i < 5; $i++){ + for($i = 0; $i < $furnanceInventory->getSize(); $i++){ $itemStack = $hopperInventory->getItem($i); if($itemStack->isNull()) continue; @@ -115,9 +115,9 @@ public function pull(TileHopper $tileHopper) : void{ $singleItem = $itemStack->pop(1); if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ - $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, 0); + $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, $furnanceInventory::SLOT_INPUT); }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ - $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, 1); + $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, $furnanceInventory::SLOT_FUEL); } } } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index c614485978a..98363f90aa4 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -114,7 +114,7 @@ public function pull(TileHopper $tileHopper) : void{ $sourceInventory = $tileHopper->getInventory(); $targetInventory = $hopperTile->getInventory(); - for($i = 0; $i < 5; $i++){ + for($i = 0; $i < $sourceInventory->getSize(); $i++){ $itemStack = $sourceInventory->getItem($i); if($itemStack->isNull()) continue; From 15af315a9d9832e51fa1a8d695c71cd397232882 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 19 Jul 2023 18:44:04 +0000 Subject: [PATCH 26/85] pull should return a bool for successful transfer --- src/block/HopperInteractable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index c4e95639091..d0e2454b49a 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -26,5 +26,5 @@ use pocketmine\block\tile\Hopper as TileHopper; interface HopperInteractable{ - public function pull(TileHopper $tileHopper) : void; + public function pull(TileHopper $tileHopper) : bool; } From 4164c6dbb811538082e7651f9a6e6c9c167e62d3 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 19 Jul 2023 22:45:04 +0000 Subject: [PATCH 27/85] scheduling corrections and return bool --- src/block/Furnace.php | 10 +++++++--- src/block/Hopper.php | 21 ++++++++++++--------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 6b6f781965b..7c43d497af1 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -96,12 +96,12 @@ public function onScheduledUpdate() : void{ } } - public function pull(TileHopper $tileHopper) : void{ + public function pull(TileHopper $tileHopper) : bool{ $furnanceTile = $this->position->getWorld()->getTile($this->position); - if(!$furnanceTile instanceof TileFurnace) return; + if(!$furnanceTile instanceof TileFurnace) return false; $hopperBlock = $tileHopper->getBlock(); - if(!$hopperBlock instanceof Hopper) return; + if(!$hopperBlock instanceof Hopper) return false; $hopperFacing = $hopperBlock->getFacing(); $hopperInventory = $tileHopper->getInventory(); @@ -116,10 +116,14 @@ public function pull(TileHopper $tileHopper) : void{ if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, $furnanceInventory::SLOT_INPUT); + return true; }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, $furnanceInventory::SLOT_FUEL); + return true; } } + + return false; } private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot) : void{ diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 98363f90aa4..d7784cd4e5c 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -96,7 +96,6 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); - $world->scheduleDelayedBlockUpdate($this->position, 8); $tile = $this->position->getWorld()->getTile($this->position); if(!$tile instanceof TileHopper) return; @@ -104,12 +103,14 @@ public function onScheduledUpdate() : void{ $facingBlock = $this->getSide($this->facing); if(!$facingBlock instanceof HopperInteractable) return; - $facingBlock->pull($tile); + $updateTime = $facingBlock->pull($tile) ? 8 : 1; + + $world->scheduleDelayedBlockUpdate($this->position, $updateTime); } - public function pull(TileHopper $tileHopper) : void{ + public function pull(TileHopper $tileHopper) : bool{ $hopperTile = $this->position->getWorld()->getTile($this->position); - if(!$hopperTile instanceof TileHopper) return; + if(!$hopperTile instanceof TileHopper) return false; $sourceInventory = $tileHopper->getInventory(); $targetInventory = $hopperTile->getInventory(); @@ -121,13 +122,15 @@ public function pull(TileHopper $tileHopper) : void{ $singleItem = $itemStack->pop(1); - if($targetInventory->canAddItem($singleItem)){ - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); - } + if(!$targetInventory->canAddItem($singleItem)) continue; + + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); - break; + return true; } + + return false; } //TODO: redstone logic, sucking logic From beaa1bbb63383165231a9dde6eed5e68c87e45ea Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 19 Jul 2023 22:50:47 +0000 Subject: [PATCH 28/85] fix comparison --- src/block/inventory/FurnaceInventory.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 0aebbe7feba..93461f72d00 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -72,15 +72,14 @@ public function setSmelting(Item $item) : void{ public function canAddSmelting(Item $item) : bool{ if($this->getSmelting()->isNull()) return true; - return $this->getSmelting()->getTypeId() === $item->getTypeId(); + return $item->canStackWith($this->getSmelting()); } public function canAddFuel(Item $item) : bool{ - $typeId = $item->getTypeId(); if($item->getFuelTime() == 0) return false; if($this->getFuel()->isNull()) return true; - return $this->getFuel()->getTypeId() === $item->getTypeId(); + return $item->canStackWith($this->getFuel()); } } From a5a18a5f9066510da5205b2bab8f4a0b04c65c99 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 19 Jul 2023 23:32:16 +0000 Subject: [PATCH 29/85] correctly handles maxstacksize --- src/block/inventory/FurnaceInventory.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 93461f72d00..2fbe50e51be 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -72,14 +72,22 @@ public function setSmelting(Item $item) : void{ public function canAddSmelting(Item $item) : bool{ if($this->getSmelting()->isNull()) return true; + $currentInput = $this->getSmelting(); + + if($currentInput->getCount() === $currentInput->getMaxStackSize()) return false; + return $item->canStackWith($this->getSmelting()); } public function canAddFuel(Item $item) : bool{ if($item->getFuelTime() == 0) return false; - if($this->getFuel()->isNull()) return true; + $currentFuel = $this->getFuel(); + + if($currentFuel->isNull()) return true; + + if($currentFuel->getCount() === $currentFuel->getMaxStackSize()) return false; - return $item->canStackWith($this->getFuel()); + return $item->canStackWith($currentFuel); } } From b4994cb515b4534f6d92f2fd4b14e1bf8416ec01 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 19 Jul 2023 23:36:45 +0000 Subject: [PATCH 30/85] code style fix --- src/block/Hopper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index d7784cd4e5c..8ddc14feb5a 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -104,7 +104,7 @@ public function onScheduledUpdate() : void{ if(!$facingBlock instanceof HopperInteractable) return; $updateTime = $facingBlock->pull($tile) ? 8 : 1; - + $world->scheduleDelayedBlockUpdate($this->position, $updateTime); } From 2b5f10ea6dacbe74e0c68c5e2f644177acc424f8 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Thu, 20 Jul 2023 03:43:17 +0000 Subject: [PATCH 31/85] implement chest pulling logic --- src/block/Chest.php | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 45c19050585..cd87f8fdebf 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -24,6 +24,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Chest as TileChest; +use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; @@ -34,7 +35,7 @@ use pocketmine\math\Vector3; use pocketmine\player\Player; -class Chest extends Transparent{ +class Chest extends Transparent implements HopperInteractable{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; @@ -97,4 +98,29 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function getFuelTime() : int{ return 300; } + + public function pull(TileHopper $tileHopper) : bool{ + $chestTile = $this->position->getWorld()->getTile($this->position); + if(!$chestTile instanceof TileChest) return false; + + $sourceInventory = $tileHopper->getInventory(); + $targetInventory = $chestTile->getInventory(); + + for($i = 0; $i < $sourceInventory->getSize(); $i++){ + $itemStack = $sourceInventory->getItem($i); + + if($itemStack->isNull()) continue; + + $singleItem = $itemStack->pop(1); + + if(!$targetInventory->canAddItem($singleItem)) continue; + + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); + + return true; + } + + return false; + } } From 0e87884646da8fe78b6b934de99a43ba6e6c04b0 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Thu, 20 Jul 2023 16:37:02 +0000 Subject: [PATCH 32/85] Change pull to push --- src/block/Chest.php | 2 +- src/block/Furnace.php | 2 +- src/block/Hopper.php | 4 ++-- src/block/HopperInteractable.php | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index cd87f8fdebf..1925048be0f 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -99,7 +99,7 @@ public function getFuelTime() : int{ return 300; } - public function pull(TileHopper $tileHopper) : bool{ + public function push(TileHopper $tileHopper) : bool{ $chestTile = $this->position->getWorld()->getTile($this->position); if(!$chestTile instanceof TileChest) return false; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 7c43d497af1..336cc727e52 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -96,7 +96,7 @@ public function onScheduledUpdate() : void{ } } - public function pull(TileHopper $tileHopper) : bool{ + public function push(TileHopper $tileHopper) : bool{ $furnanceTile = $this->position->getWorld()->getTile($this->position); if(!$furnanceTile instanceof TileFurnace) return false; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 8ddc14feb5a..65672342e35 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -103,12 +103,12 @@ public function onScheduledUpdate() : void{ $facingBlock = $this->getSide($this->facing); if(!$facingBlock instanceof HopperInteractable) return; - $updateTime = $facingBlock->pull($tile) ? 8 : 1; + $updateTime = $facingBlock->push($tile) ? 8 : 1; $world->scheduleDelayedBlockUpdate($this->position, $updateTime); } - public function pull(TileHopper $tileHopper) : bool{ + public function push(TileHopper $tileHopper) : bool{ $hopperTile = $this->position->getWorld()->getTile($this->position); if(!$hopperTile instanceof TileHopper) return false; diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index d0e2454b49a..8b9e1fe4d59 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -26,5 +26,5 @@ use pocketmine\block\tile\Hopper as TileHopper; interface HopperInteractable{ - public function pull(TileHopper $tileHopper) : bool; + public function push(TileHopper $tileHopper) : bool; } From 6425daf180cb91a64b909a56eec10715faa422dd Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Thu, 20 Jul 2023 17:04:34 +0000 Subject: [PATCH 33/85] implements pulling from a chest --- src/block/Hopper.php | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 65672342e35..12016b718ec 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -23,6 +23,7 @@ namespace pocketmine\block; +use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; @@ -98,16 +99,55 @@ public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); $tile = $this->position->getWorld()->getTile($this->position); - if(!$tile instanceof TileHopper) return; + if(!$tile instanceof TileHopper) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } $facingBlock = $this->getSide($this->facing); - if(!$facingBlock instanceof HopperInteractable) return; + $topBlock = $this->getSide(Facing::UP); + if(!$facingBlock instanceof HopperInteractable && !$topBlock instanceof Chest) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } + $pullSuccess = $this->pull($tile); + + if($pullSuccess && !$facingBlock instanceof HopperInteractable){ + $world->scheduleDelayedBlockUpdate($this->position, 8); + return; + } + + if(!$facingBlock instanceof HopperInteractable) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } $updateTime = $facingBlock->push($tile) ? 8 : 1; $world->scheduleDelayedBlockUpdate($this->position, $updateTime); } + + + public function pull(TileHopper $tileHopper) : bool{ + $blockAbove = $this->getSide(Facing::UP); + if(!$blockAbove instanceof Chest) return false; + + $tileChest = $blockAbove->position->getWorld()->getTile($blockAbove->position); + if(!$tileChest instanceof TileChest) return false; + + $sourceInventory = $tileChest->getInventory(); + $targetInventory = $tileHopper->getInventory(); + + for($i = 0; $i < $sourceInventory->getSize(); $i++){ + $itemStack = $sourceInventory->getItem($i); + + if($itemStack->isNull()) continue; + + $singleItem = $itemStack->pop(1); + + if(!$targetInventory->canAddItem($singleItem)) continue; + + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); + + return true; + } + + return false; + } + public function push(TileHopper $tileHopper) : bool{ $hopperTile = $this->position->getWorld()->getTile($this->position); if(!$hopperTile instanceof TileHopper) return false; From eb7384965a086555310a90b1318d41bf9c7616d2 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Thu, 20 Jul 2023 22:01:34 +0000 Subject: [PATCH 34/85] code style fix --- src/block/Hopper.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 12016b718ec..df8586dd28c 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -118,8 +118,6 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, $updateTime); } - - public function pull(TileHopper $tileHopper) : bool{ $blockAbove = $this->getSide(Facing::UP); if(!$blockAbove instanceof Chest) return false; From 7bf4fc0af5c29e998120bbc1fafcef27a3d44e16 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Fri, 21 Jul 2023 02:25:17 +0000 Subject: [PATCH 35/85] hopper to hopper action now working --- src/block/Hopper.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index df8586dd28c..4a2e0ab3904 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -34,6 +34,7 @@ use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; +use pocketmine\Server; class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; @@ -103,7 +104,7 @@ public function onScheduledUpdate() : void{ $facingBlock = $this->getSide($this->facing); $topBlock = $this->getSide(Facing::UP); - if(!$facingBlock instanceof HopperInteractable && !$topBlock instanceof Chest) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } + if(!$facingBlock instanceof HopperInteractable && !$topBlock instanceof Chest && !$topBlock instanceof Hopper) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } $pullSuccess = $this->pull($tile); @@ -120,12 +121,12 @@ public function onScheduledUpdate() : void{ public function pull(TileHopper $tileHopper) : bool{ $blockAbove = $this->getSide(Facing::UP); - if(!$blockAbove instanceof Chest) return false; + if(!$blockAbove instanceof Chest && !$blockAbove instanceof Hopper) return false; - $tileChest = $blockAbove->position->getWorld()->getTile($blockAbove->position); - if(!$tileChest instanceof TileChest) return false; + $tile = $blockAbove->position->getWorld()->getTile($blockAbove->position); + if(!$tile instanceof TileChest && !$tile instanceof TileHopper) return false; - $sourceInventory = $tileChest->getInventory(); + $sourceInventory = $tile->getInventory(); $targetInventory = $tileHopper->getInventory(); for($i = 0; $i < $sourceInventory->getSize(); $i++){ From 57f7cd269b1e503692cd2c953979bfa9953ff4a2 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Fri, 21 Jul 2023 02:30:00 +0000 Subject: [PATCH 36/85] cleanup --- src/block/Hopper.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 4a2e0ab3904..672462ed1a8 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -34,7 +34,6 @@ use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -use pocketmine\Server; class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; From ffc5a92039fd4bdb6718b6869e7187499354ca97 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Fri, 21 Jul 2023 17:48:28 +0000 Subject: [PATCH 37/85] minor refactoring to reduce duplicate code --- src/block/Hopper.php | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 672462ed1a8..eb7b664262d 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -28,6 +28,7 @@ use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -128,22 +129,7 @@ public function pull(TileHopper $tileHopper) : bool{ $sourceInventory = $tile->getInventory(); $targetInventory = $tileHopper->getInventory(); - for($i = 0; $i < $sourceInventory->getSize(); $i++){ - $itemStack = $sourceInventory->getItem($i); - - if($itemStack->isNull()) continue; - - $singleItem = $itemStack->pop(1); - - if(!$targetInventory->canAddItem($singleItem)) continue; - - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); - - return true; - } - - return false; + return $this->transferItem($sourceInventory, $targetInventory); } public function push(TileHopper $tileHopper) : bool{ @@ -153,6 +139,10 @@ public function push(TileHopper $tileHopper) : bool{ $sourceInventory = $tileHopper->getInventory(); $targetInventory = $hopperTile->getInventory(); + return $this->transferItem($sourceInventory, $targetInventory); + } + + private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory) : bool{ for($i = 0; $i < $sourceInventory->getSize(); $i++){ $itemStack = $sourceInventory->getItem($i); From 7e9173b4ebf6d01fbabf01dc08454039b95f8086 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 24 Jul 2023 04:41:37 +0000 Subject: [PATCH 38/85] Complete rewrite to make proper use of interface --- src/block/Chest.php | 22 +++++++++++--- src/block/Furnace.php | 45 ++++++++++++++++++++++------- src/block/Hopper.php | 49 +++++++++++++++----------------- src/block/HopperInteractable.php | 4 ++- 4 files changed, 78 insertions(+), 42 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 1925048be0f..c242b3d52c0 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -29,6 +29,7 @@ use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; +use pocketmine\inventory\BaseInventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -99,13 +100,26 @@ public function getFuelTime() : int{ return 300; } - public function push(TileHopper $tileHopper) : bool{ - $chestTile = $this->position->getWorld()->getTile($this->position); - if(!$chestTile instanceof TileChest) return false; + public function pull(TileHopper $tileHopper) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileChest) return false; $sourceInventory = $tileHopper->getInventory(); - $targetInventory = $chestTile->getInventory(); + $targetInventory = $currentTile->getInventory(); + return $this->transferItem($sourceInventory, $targetInventory); + } + + public function push(BaseInventory $targetInventory) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileChest) return false; + + $sourceInventory = $currentTile->getInventory(); + + return $this->transferItem($sourceInventory, $targetInventory); + } + + private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ for($i = 0; $i < $sourceInventory->getSize(); $i++){ $itemStack = $sourceInventory->getItem($i); diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 336cc727e52..b24df5e823f 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -23,12 +23,14 @@ namespace pocketmine\block; +use pocketmine\block\inventory\FurnaceInventory; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\inventory\BaseInventory; use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -96,29 +98,32 @@ public function onScheduledUpdate() : void{ } } - public function push(TileHopper $tileHopper) : bool{ - $furnanceTile = $this->position->getWorld()->getTile($this->position); - if(!$furnanceTile instanceof TileFurnace) return false; + public function pull(TileHopper $tileHopper) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileFurnace) return false; + + $targetInventory = $currentTile->getInventory(); + if(!$targetInventory instanceof FurnaceInventory) return false; $hopperBlock = $tileHopper->getBlock(); if(!$hopperBlock instanceof Hopper) return false; $hopperFacing = $hopperBlock->getFacing(); - $hopperInventory = $tileHopper->getInventory(); - $furnanceInventory = $furnanceTile->getInventory(); - for($i = 0; $i < $furnanceInventory->getSize(); $i++){ - $itemStack = $hopperInventory->getItem($i); + $sourceInventory = $tileHopper->getInventory(); + + for($i = 0; $i < $targetInventory->getSize(); $i++){ + $itemStack = $sourceInventory->getItem($i); if($itemStack->isNull()) continue; $singleItem = $itemStack->pop(1); - if($hopperFacing === Facing::DOWN && $furnanceInventory->canAddSmelting($singleItem)){ - $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, $furnanceInventory::SLOT_INPUT); + if($hopperFacing === Facing::DOWN && $targetInventory->canAddSmelting($singleItem)){ + $this->transferItem($sourceInventory, $targetInventory, $singleItem, $targetInventory::SLOT_INPUT); return true; - }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $furnanceInventory->canAddFuel($singleItem)){ - $this->transferItem($hopperInventory, $furnanceInventory, $singleItem, $furnanceInventory::SLOT_FUEL); + }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $targetInventory->canAddFuel($singleItem)){ + $this->transferItem($sourceInventory, $targetInventory, $singleItem, $targetInventory::SLOT_FUEL); return true; } } @@ -126,6 +131,24 @@ public function push(TileHopper $tileHopper) : bool{ return false; } + public function push(BaseInventory $targetInventory) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileFurnace) return false; + + $sourceInventory = $currentTile->getInventory(); + + $itemStack = $sourceInventory->getItem($sourceInventory::SLOT_RESULT); + + if($itemStack->isNull()) return false; + + $singleItem = $itemStack->pop(1); + + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); + + return true; + } + private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot) : void{ $sourceInventory->removeItem($item); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index eb7b664262d..487c1e00d2e 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -23,12 +23,11 @@ namespace pocketmine\block; -use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\inventory\SimpleInventory; +use pocketmine\inventory\BaseInventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -99,50 +98,48 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); - $tile = $this->position->getWorld()->getTile($this->position); - if(!$tile instanceof TileHopper) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } - $facingBlock = $this->getSide($this->facing); $topBlock = $this->getSide(Facing::UP); - if(!$facingBlock instanceof HopperInteractable && !$topBlock instanceof Chest && !$topBlock instanceof Hopper) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } - $pullSuccess = $this->pull($tile); + if($topBlock instanceof HopperInteractable){ + $tileHopper = $this->position->getWorld()->getTile($this->position); + if($tileHopper instanceof TileHopper){ + $pushSuccess = $topBlock->push($tileHopper->getInventory()); + } + } - if($pullSuccess && !$facingBlock instanceof HopperInteractable){ - $world->scheduleDelayedBlockUpdate($this->position, 8); - return; + if($facingBlock instanceof HopperInteractable){ + $tileHopper = $this->position->getWorld()->getTile($this->position); + if($tileHopper instanceof TileHopper){ + $pullSuccess = $facingBlock->pull($tileHopper); + } } - if(!$facingBlock instanceof HopperInteractable) { $world->scheduleDelayedBlockUpdate($this->position, 1); return; } - $updateTime = $facingBlock->push($tile) ? 8 : 1; + $nextTick = ($pushSuccess || $pullSuccess) ? 8 : 1; - $world->scheduleDelayedBlockUpdate($this->position, $updateTime); + $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } public function pull(TileHopper $tileHopper) : bool{ - $blockAbove = $this->getSide(Facing::UP); - if(!$blockAbove instanceof Chest && !$blockAbove instanceof Hopper) return false; + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileHopper) return false; - $tile = $blockAbove->position->getWorld()->getTile($blockAbove->position); - if(!$tile instanceof TileChest && !$tile instanceof TileHopper) return false; - - $sourceInventory = $tile->getInventory(); - $targetInventory = $tileHopper->getInventory(); + $sourceInventory = $tileHopper->getInventory(); + $targetInventory = $currentTile->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); } - public function push(TileHopper $tileHopper) : bool{ - $hopperTile = $this->position->getWorld()->getTile($this->position); - if(!$hopperTile instanceof TileHopper) return false; + public function push(BaseInventory $targetInventory) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileHopper) return false; - $sourceInventory = $tileHopper->getInventory(); - $targetInventory = $hopperTile->getInventory(); + $sourceInventory = $currentTile->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); } - private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory) : bool{ + private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ for($i = 0; $i < $sourceInventory->getSize(); $i++){ $itemStack = $sourceInventory->getItem($i); diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 8b9e1fe4d59..5ad42d738ed 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -24,7 +24,9 @@ namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; +use pocketmine\inventory\BaseInventory; interface HopperInteractable{ - public function push(TileHopper $tileHopper) : bool; + public function push(BaseInventory $targetInventory) : bool; + public function pull(TileHopper $tileHopper) : bool; } From 9ce19a3f1fe9f7d2c644811d0fb5e3661fde623c Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 24 Jul 2023 04:45:55 +0000 Subject: [PATCH 39/85] fix bugs --- src/block/Furnace.php | 1 - src/block/Hopper.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index b24df5e823f..4427a0409d5 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -103,7 +103,6 @@ public function pull(TileHopper $tileHopper) : bool{ if(!$currentTile instanceof TileFurnace) return false; $targetInventory = $currentTile->getInventory(); - if(!$targetInventory instanceof FurnaceInventory) return false; $hopperBlock = $tileHopper->getBlock(); if(!$hopperBlock instanceof Hopper) return false; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 487c1e00d2e..1ca2d8af3b5 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -115,7 +115,7 @@ public function onScheduledUpdate() : void{ } } - $nextTick = ($pushSuccess || $pullSuccess) ? 8 : 1; + $nextTick = ($pushSuccess ?? false || $pullSuccess ?? false) ? 8 : 1; $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } From adadddb16c5246698466b90cd795b79c363fe237 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 24 Jul 2023 04:53:53 +0000 Subject: [PATCH 40/85] bug fixes --- src/block/Furnace.php | 1 - src/block/Hopper.php | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 4427a0409d5..9c2c31e6c3f 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -23,7 +23,6 @@ namespace pocketmine\block; -use pocketmine\block\inventory\FurnaceInventory; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 1ca2d8af3b5..c54a80eb9b6 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -101,6 +101,9 @@ public function onScheduledUpdate() : void{ $facingBlock = $this->getSide($this->facing); $topBlock = $this->getSide(Facing::UP); + $pushSuccess = false; + $pullSuccess = false; + if($topBlock instanceof HopperInteractable){ $tileHopper = $this->position->getWorld()->getTile($this->position); if($tileHopper instanceof TileHopper){ @@ -115,7 +118,7 @@ public function onScheduledUpdate() : void{ } } - $nextTick = ($pushSuccess ?? false || $pullSuccess ?? false) ? 8 : 1; + $nextTick = ($pushSuccess || $pullSuccess ) ? 8 : 1; $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } From 917a6c4ba4a067d16d2cd4de31e52d429d2572de Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 24 Jul 2023 16:10:59 +0000 Subject: [PATCH 41/85] change interface and all methods to pullFrom/pushTo --- src/block/Chest.php | 4 ++-- src/block/Furnace.php | 4 ++-- src/block/Hopper.php | 8 ++++---- src/block/HopperInteractable.php | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index c242b3d52c0..815d6d1a737 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -100,7 +100,7 @@ public function getFuelTime() : int{ return 300; } - public function pull(TileHopper $tileHopper) : bool{ + public function pullFrom(TileHopper $tileHopper) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest) return false; @@ -110,7 +110,7 @@ public function pull(TileHopper $tileHopper) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function push(BaseInventory $targetInventory) : bool{ + public function pushTo(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest) return false; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 9c2c31e6c3f..1eb6c265e09 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -97,7 +97,7 @@ public function onScheduledUpdate() : void{ } } - public function pull(TileHopper $tileHopper) : bool{ + public function pullFrom(TileHopper $tileHopper) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace) return false; @@ -129,7 +129,7 @@ public function pull(TileHopper $tileHopper) : bool{ return false; } - public function push(BaseInventory $targetInventory) : bool{ + public function pushTo(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace) return false; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index c54a80eb9b6..845accdae94 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -107,14 +107,14 @@ public function onScheduledUpdate() : void{ if($topBlock instanceof HopperInteractable){ $tileHopper = $this->position->getWorld()->getTile($this->position); if($tileHopper instanceof TileHopper){ - $pushSuccess = $topBlock->push($tileHopper->getInventory()); + $pushSuccess = $topBlock->pushTo($tileHopper->getInventory()); } } if($facingBlock instanceof HopperInteractable){ $tileHopper = $this->position->getWorld()->getTile($this->position); if($tileHopper instanceof TileHopper){ - $pullSuccess = $facingBlock->pull($tileHopper); + $pullSuccess = $facingBlock->pullFrom($tileHopper); } } @@ -123,7 +123,7 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } - public function pull(TileHopper $tileHopper) : bool{ + public function pullFrom(TileHopper $tileHopper) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper) return false; @@ -133,7 +133,7 @@ public function pull(TileHopper $tileHopper) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function push(BaseInventory $targetInventory) : bool{ + public function pushTo(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper) return false; diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 5ad42d738ed..3830a6b9c43 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -27,6 +27,6 @@ use pocketmine\inventory\BaseInventory; interface HopperInteractable{ - public function push(BaseInventory $targetInventory) : bool; - public function pull(TileHopper $tileHopper) : bool; + public function pushTo(BaseInventory $targetInventory) : bool; + public function pullFrom(TileHopper $tileHopper) : bool; } From 499685b32fe399efa6919d10ba360d56d78bdb77 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 24 Jul 2023 16:19:23 +0000 Subject: [PATCH 42/85] use foreach instead of for --- src/block/Chest.php | 4 +--- src/block/Hopper.php | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 815d6d1a737..9fbc894aea0 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -120,9 +120,7 @@ public function pushTo(BaseInventory $targetInventory) : bool{ } private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ - for($i = 0; $i < $sourceInventory->getSize(); $i++){ - $itemStack = $sourceInventory->getItem($i); - + foreach($sourceInventory->getContents() as $itemStack){ if($itemStack->isNull()) continue; $singleItem = $itemStack->pop(1); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 845accdae94..a32e93482c1 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -143,9 +143,7 @@ public function pushTo(BaseInventory $targetInventory) : bool{ } private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ - for($i = 0; $i < $sourceInventory->getSize(); $i++){ - $itemStack = $sourceInventory->getItem($i); - + foreach($sourceInventory->getContents() as $itemStack){ if($itemStack->isNull()) continue; $singleItem = $itemStack->pop(1); From 4d3a4c76e9b8baed75b6a63ab0123a5308f3afee Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 01:30:10 +0000 Subject: [PATCH 43/85] Changing interface definition to pass in inventory and hopper --- src/block/Chest.php | 3 +-- src/block/Furnace.php | 7 +------ src/block/Hopper.php | 19 +++++++++---------- src/block/HopperInteractable.php | 4 ++-- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index a864d279277..9418d6c6804 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -98,11 +98,10 @@ public function getFuelTime() : int{ return 300; } - public function pullFrom(TileHopper $tileHopper) : bool{ + public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest) return false; - $sourceInventory = $tileHopper->getInventory(); $targetInventory = $currentTile->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); diff --git a/src/block/Furnace.php b/src/block/Furnace.php index ce54bf7756f..3c7d5d64203 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -95,19 +95,14 @@ public function onScheduledUpdate() : void{ } } - public function pullFrom(TileHopper $tileHopper) : bool{ + public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace) return false; $targetInventory = $currentTile->getInventory(); - $hopperBlock = $tileHopper->getBlock(); - if(!$hopperBlock instanceof Hopper) return false; - $hopperFacing = $hopperBlock->getFacing(); - $sourceInventory = $tileHopper->getInventory(); - for($i = 0; $i < $targetInventory->getSize(); $i++){ $itemStack = $sourceInventory->getItem($i); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index a32e93482c1..8e6f1c41ea2 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -98,6 +98,12 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); + $hopperBlock = $this->position->getWorld()->getBlock($this->position); + if(!$hopperBlock instanceof Hopper) return; + + $tileHopper = $this->position->getWorld()->getTile($this->position); + if(!$tileHopper instanceof TileHopper) return; + $facingBlock = $this->getSide($this->facing); $topBlock = $this->getSide(Facing::UP); @@ -105,17 +111,11 @@ public function onScheduledUpdate() : void{ $pullSuccess = false; if($topBlock instanceof HopperInteractable){ - $tileHopper = $this->position->getWorld()->getTile($this->position); - if($tileHopper instanceof TileHopper){ - $pushSuccess = $topBlock->pushTo($tileHopper->getInventory()); - } + $pushSuccess = $topBlock->pushTo($tileHopper->getInventory()); } if($facingBlock instanceof HopperInteractable){ - $tileHopper = $this->position->getWorld()->getTile($this->position); - if($tileHopper instanceof TileHopper){ - $pullSuccess = $facingBlock->pullFrom($tileHopper); - } + $pullSuccess = $facingBlock->pullFrom($tileHopper->getInventory(), $hopperBlock); } $nextTick = ($pushSuccess || $pullSuccess ) ? 8 : 1; @@ -123,11 +123,10 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } - public function pullFrom(TileHopper $tileHopper) : bool{ + public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper) return false; - $sourceInventory = $tileHopper->getInventory(); $targetInventory = $currentTile->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 3830a6b9c43..67fd05c4090 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -23,10 +23,10 @@ namespace pocketmine\block; -use pocketmine\block\tile\Hopper as TileHopper; +use pocketmine\block\Hopper; use pocketmine\inventory\BaseInventory; interface HopperInteractable{ public function pushTo(BaseInventory $targetInventory) : bool; - public function pullFrom(TileHopper $tileHopper) : bool; + public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool; } From 9f1b265d46a63aa48fd5ef3dfb1e2b1663fc96a0 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 01:31:53 +0000 Subject: [PATCH 44/85] Changing interface definition --- src/block/Chest.php | 4 ++-- src/block/Furnace.php | 4 ++-- src/block/Hopper.php | 8 ++++---- src/block/HopperInteractable.php | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 9418d6c6804..963b5d3bee5 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -98,7 +98,7 @@ public function getFuelTime() : int{ return 300; } - public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ + public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest) return false; @@ -107,7 +107,7 @@ public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : return $this->transferItem($sourceInventory, $targetInventory); } - public function pushTo(BaseInventory $targetInventory) : bool{ + public function doHopperPush(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest) return false; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 3c7d5d64203..728808e3250 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -95,7 +95,7 @@ public function onScheduledUpdate() : void{ } } - public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ + public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace) return false; @@ -122,7 +122,7 @@ public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : return false; } - public function pushTo(BaseInventory $targetInventory) : bool{ + public function doHopperPush(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace) return false; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 8e6f1c41ea2..b2ad8c87557 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -111,11 +111,11 @@ public function onScheduledUpdate() : void{ $pullSuccess = false; if($topBlock instanceof HopperInteractable){ - $pushSuccess = $topBlock->pushTo($tileHopper->getInventory()); + $pushSuccess = $topBlock->doHopperPush($tileHopper->getInventory()); } if($facingBlock instanceof HopperInteractable){ - $pullSuccess = $facingBlock->pullFrom($tileHopper->getInventory(), $hopperBlock); + $pullSuccess = $facingBlock->doHopperPull($tileHopper->getInventory(), $hopperBlock); } $nextTick = ($pushSuccess || $pullSuccess ) ? 8 : 1; @@ -123,7 +123,7 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } - public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ + public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper) return false; @@ -132,7 +132,7 @@ public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : return $this->transferItem($sourceInventory, $targetInventory); } - public function pushTo(BaseInventory $targetInventory) : bool{ + public function doHopperPush(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper) return false; diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 67fd05c4090..05d854d1a53 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -27,6 +27,6 @@ use pocketmine\inventory\BaseInventory; interface HopperInteractable{ - public function pushTo(BaseInventory $targetInventory) : bool; - public function pullFrom(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool; + public function doHopperPush(BaseInventory $targetInventory) : bool; + public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool; } From 88b4800fe5347f5a4623bd0d926340d8bf61c60d Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 01:41:37 +0000 Subject: [PATCH 45/85] Add missing braces where applicable --- src/block/Chest.php | 16 ++++++++++++---- src/block/Furnace.php | 16 ++++++++++++---- src/block/Hopper.php | 24 ++++++++++++++++++------ 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 963b5d3bee5..0a1522eb437 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -100,7 +100,9 @@ public function getFuelTime() : int{ public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileChest) return false; + if(!$currentTile instanceof TileChest){ + return false; + } $targetInventory = $currentTile->getInventory(); @@ -109,7 +111,9 @@ public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock public function doHopperPush(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileChest) return false; + if(!$currentTile instanceof TileChest){ + return false; + } $sourceInventory = $currentTile->getInventory(); @@ -118,11 +122,15 @@ public function doHopperPush(BaseInventory $targetInventory) : bool{ private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ foreach($sourceInventory->getContents() as $itemStack){ - if($itemStack->isNull()) continue; + if($itemStack->isNull()){ + continue; + } $singleItem = $itemStack->pop(1); - if(!$targetInventory->canAddItem($singleItem)) continue; + if(!$targetInventory->canAddItem($singleItem)){ + continue; + } $sourceInventory->removeItem($singleItem); $targetInventory->addItem($singleItem); diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 728808e3250..1c11bef9c2a 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -97,7 +97,9 @@ public function onScheduledUpdate() : void{ public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileFurnace) return false; + if(!$currentTile instanceof TileFurnace){ + return false; + } $targetInventory = $currentTile->getInventory(); @@ -106,7 +108,9 @@ public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock for($i = 0; $i < $targetInventory->getSize(); $i++){ $itemStack = $sourceInventory->getItem($i); - if($itemStack->isNull()) continue; + if($itemStack->isNull()){ + continue; + } $singleItem = $itemStack->pop(1); @@ -124,13 +128,17 @@ public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock public function doHopperPush(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileFurnace) return false; + if(!$currentTile instanceof TileFurnace){ + return false; + } $sourceInventory = $currentTile->getInventory(); $itemStack = $sourceInventory->getItem($sourceInventory::SLOT_RESULT); - if($itemStack->isNull()) return false; + if($itemStack->isNull()){ + return false; + } $singleItem = $itemStack->pop(1); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index b2ad8c87557..7ece3a21285 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -99,10 +99,14 @@ public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); $hopperBlock = $this->position->getWorld()->getBlock($this->position); - if(!$hopperBlock instanceof Hopper) return; + if(!$hopperBlock instanceof Hopper){ + return; + } $tileHopper = $this->position->getWorld()->getTile($this->position); - if(!$tileHopper instanceof TileHopper) return; + if(!$tileHopper instanceof TileHopper){ + return; + } $facingBlock = $this->getSide($this->facing); $topBlock = $this->getSide(Facing::UP); @@ -125,7 +129,9 @@ public function onScheduledUpdate() : void{ public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileHopper) return false; + if(!$currentTile instanceof TileHopper){ + return false; + } $targetInventory = $currentTile->getInventory(); @@ -134,7 +140,9 @@ public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock public function doHopperPush(BaseInventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileHopper) return false; + if(!$currentTile instanceof TileHopper){ + return false; + } $sourceInventory = $currentTile->getInventory(); @@ -143,11 +151,15 @@ public function doHopperPush(BaseInventory $targetInventory) : bool{ private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ foreach($sourceInventory->getContents() as $itemStack){ - if($itemStack->isNull()) continue; + if($itemStack->isNull()){ + continue; + } $singleItem = $itemStack->pop(1); - if(!$targetInventory->canAddItem($singleItem)) continue; + if(!$targetInventory->canAddItem($singleItem)){ + continue; + } $sourceInventory->removeItem($singleItem); $targetInventory->addItem($singleItem); From f394a2cb60e3da82faa8535e52254c29d2ca5494 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 01:48:59 +0000 Subject: [PATCH 46/85] better grouping of variables --- src/block/Hopper.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 7ece3a21285..d373e063057 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -108,16 +108,14 @@ public function onScheduledUpdate() : void{ return; } - $facingBlock = $this->getSide($this->facing); $topBlock = $this->getSide(Facing::UP); - $pushSuccess = false; - $pullSuccess = false; - if($topBlock instanceof HopperInteractable){ $pushSuccess = $topBlock->doHopperPush($tileHopper->getInventory()); } + $facingBlock = $this->getSide($this->facing); + $pullSuccess = false; if($facingBlock instanceof HopperInteractable){ $pullSuccess = $facingBlock->doHopperPull($tileHopper->getInventory(), $hopperBlock); } From 4ba5f5a1eddac231ec25449fb858239f705d47f5 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 02:10:05 +0000 Subject: [PATCH 47/85] move transferitem to a trait --- src/block/utils/HopperInteractableTrait.php | 49 +++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/block/utils/HopperInteractableTrait.php diff --git a/src/block/utils/HopperInteractableTrait.php b/src/block/utils/HopperInteractableTrait.php new file mode 100644 index 00000000000..5adabcd056f --- /dev/null +++ b/src/block/utils/HopperInteractableTrait.php @@ -0,0 +1,49 @@ +getContents() as $itemStack){ + if($itemStack->isNull()){ + continue; + } + + $singleItem = $itemStack->pop(1); + + if(!$targetInventory->canAddItem($singleItem)){ + continue; + } + + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); + + return true; + } + + return false; + } +} From 6963b2c1759ebbf4707aa406c7a96ef51916313e Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 02:10:15 +0000 Subject: [PATCH 48/85] reduce duplicate code with a trait --- src/block/Chest.php | 23 ++--------------------- src/block/Hopper.php | 23 ++--------------------- 2 files changed, 4 insertions(+), 42 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 0a1522eb437..e7c545be469 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -26,6 +26,7 @@ use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; +use pocketmine\block\utils\HopperInteractableTrait; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; use pocketmine\inventory\BaseInventory; @@ -37,6 +38,7 @@ class Chest extends Transparent implements HopperInteractable{ use FacesOppositePlacingPlayerTrait; + use HopperInteractableTrait; /** * @return AxisAlignedBB[] @@ -119,25 +121,4 @@ public function doHopperPush(BaseInventory $targetInventory) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - - private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ - foreach($sourceInventory->getContents() as $itemStack){ - if($itemStack->isNull()){ - continue; - } - - $singleItem = $itemStack->pop(1); - - if(!$targetInventory->canAddItem($singleItem)){ - continue; - } - - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); - - return true; - } - - return false; - } } diff --git a/src/block/Hopper.php b/src/block/Hopper.php index d373e063057..bda519af70a 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -24,6 +24,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; +use pocketmine\block\utils\HopperInteractableTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; @@ -37,6 +38,7 @@ class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; + use HopperInteractableTrait; private int $facing = Facing::DOWN; @@ -147,26 +149,5 @@ public function doHopperPush(BaseInventory $targetInventory) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ - foreach($sourceInventory->getContents() as $itemStack){ - if($itemStack->isNull()){ - continue; - } - - $singleItem = $itemStack->pop(1); - - if(!$targetInventory->canAddItem($singleItem)){ - continue; - } - - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); - - return true; - } - - return false; - } - //TODO: redstone logic, sucking logic } From b1ddd4356d2f1f486394d223775dd5d9c39abe58 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 02:19:22 +0000 Subject: [PATCH 49/85] code style fix --- src/block/Furnace.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 1c11bef9c2a..9a23088e8af 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -24,7 +24,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Furnace as TileFurnace; -use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; From 9ab8df542023735cce82a34ab411cb14b464766a Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 02:28:42 +0000 Subject: [PATCH 50/85] code style fix --- src/block/Chest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index e7c545be469..921a7492302 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -24,7 +24,6 @@ namespace pocketmine\block; use pocketmine\block\tile\Chest as TileChest; -use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HopperInteractableTrait; use pocketmine\block\utils\SupportType; From e87df4dc8a00c020264d9ce88bc6364c1c54cb9b Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 02:32:02 +0000 Subject: [PATCH 51/85] bug fix --- src/block/Furnace.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 9a23088e8af..752f4732c28 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -147,7 +147,7 @@ public function doHopperPush(BaseInventory $targetInventory) : bool{ return true; } - private function transferItem(SimpleInventory $sourceInventory, SimpleInventory $targetInventory, Item $item, int $slot) : void{ + private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory, Item $item, int $slot) : void{ $sourceInventory->removeItem($item); $currentItem = $targetInventory->getItem($slot); From f3f534da281d5bf4ec34d52361ad0721c00773d9 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 02:54:47 +0000 Subject: [PATCH 52/85] code style fix --- src/block/utils/HopperInteractableTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/utils/HopperInteractableTrait.php b/src/block/utils/HopperInteractableTrait.php index 5adabcd056f..c9ceb6a8f95 100644 --- a/src/block/utils/HopperInteractableTrait.php +++ b/src/block/utils/HopperInteractableTrait.php @@ -26,7 +26,7 @@ use pocketmine\inventory\BaseInventory; trait HopperInteractableTrait{ - public function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ + public function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ foreach($sourceInventory->getContents() as $itemStack){ if($itemStack->isNull()){ continue; From 9a3a5c9a5bbb72a4078b9876ba614f86421932bf Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 03:00:06 +0000 Subject: [PATCH 53/85] code style fixes --- src/block/Furnace.php | 1 - src/block/HopperInteractable.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 752f4732c28..5fd08ed506b 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -28,7 +28,6 @@ use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\inventory\BaseInventory; -use pocketmine\inventory\SimpleInventory; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 05d854d1a53..e5f13053011 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -23,7 +23,6 @@ namespace pocketmine\block; -use pocketmine\block\Hopper; use pocketmine\inventory\BaseInventory; interface HopperInteractable{ From 01b57a141bacffed9540e549131eed8523e1051f Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 18:32:58 +0000 Subject: [PATCH 54/85] Pass hopper block instead of base inventory --- src/block/Chest.php | 9 ++++++++- src/block/Furnace.php | 9 ++++++++- src/block/Hopper.php | 10 ++++++++-- src/block/HopperInteractable.php | 3 ++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 921a7492302..8105680e5e7 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -24,6 +24,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Chest as TileChest; +use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HopperInteractableTrait; use pocketmine\block\utils\SupportType; @@ -99,12 +100,18 @@ public function getFuelTime() : int{ return 300; } - public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ + public function doHopperPull(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest){ return false; } + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + $sourceInventory = $tileHopper->getInventory(); $targetInventory = $currentTile->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 5fd08ed506b..0d1ae284d0b 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -23,6 +23,7 @@ namespace pocketmine\block; +use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\crafting\FurnaceType; @@ -93,12 +94,18 @@ public function onScheduledUpdate() : void{ } } - public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ + public function doHopperPull(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace){ return false; } + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + $sourceInventory = $tileHopper->getInventory(); $targetInventory = $currentTile->getInventory(); $hopperFacing = $hopperBlock->getFacing(); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index bda519af70a..5c830a875f9 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -119,7 +119,7 @@ public function onScheduledUpdate() : void{ $facingBlock = $this->getSide($this->facing); $pullSuccess = false; if($facingBlock instanceof HopperInteractable){ - $pullSuccess = $facingBlock->doHopperPull($tileHopper->getInventory(), $hopperBlock); + $pullSuccess = $facingBlock->doHopperPull($hopperBlock); } $nextTick = ($pushSuccess || $pullSuccess ) ? 8 : 1; @@ -127,12 +127,18 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } - public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool{ + public function doHopperPull(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper){ return false; } + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + $sourceInventory = $tileHopper->getInventory(); $targetInventory = $currentTile->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index e5f13053011..39be34b8ff2 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -23,9 +23,10 @@ namespace pocketmine\block; +use pocketmine\block\Hopper; use pocketmine\inventory\BaseInventory; interface HopperInteractable{ public function doHopperPush(BaseInventory $targetInventory) : bool; - public function doHopperPull(BaseInventory $sourceInventory, Hopper $hopperBlock) : bool; + public function doHopperPull(Hopper $hopperBlock) : bool; } From ac8a21b40e70f35d7d2f0f7281d6cdfa053da943 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 18:36:57 +0000 Subject: [PATCH 55/85] use inventory instead of baseinventory --- src/block/Chest.php | 3 ++- src/block/Furnace.php | 5 +++-- src/block/Hopper.php | 3 ++- src/block/HopperInteractable.php | 4 ++-- src/block/utils/HopperInteractableTrait.php | 4 ++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 8105680e5e7..b239e99021b 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -30,6 +30,7 @@ use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; use pocketmine\inventory\BaseInventory; +use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -117,7 +118,7 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function doHopperPush(BaseInventory $targetInventory) : bool{ + public function doHopperPush(Inventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest){ return false; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 0d1ae284d0b..ffcfb84aad6 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -29,6 +29,7 @@ use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\inventory\BaseInventory; +use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -131,7 +132,7 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return false; } - public function doHopperPush(BaseInventory $targetInventory) : bool{ + public function doHopperPush(Inventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace){ return false; @@ -153,7 +154,7 @@ public function doHopperPush(BaseInventory $targetInventory) : bool{ return true; } - private function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory, Item $item, int $slot) : void{ + private function transferItem(Inventory $sourceInventory, Inventory $targetInventory, Item $item, int $slot) : void{ $sourceInventory->removeItem($item); $currentItem = $targetInventory->getItem($slot); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 5c830a875f9..7c3be352df2 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -29,6 +29,7 @@ use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\inventory\BaseInventory; +use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -144,7 +145,7 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function doHopperPush(BaseInventory $targetInventory) : bool{ + public function doHopperPush(Inventory $targetInventory) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper){ return false; diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 39be34b8ff2..d16d73050f7 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -24,9 +24,9 @@ namespace pocketmine\block; use pocketmine\block\Hopper; -use pocketmine\inventory\BaseInventory; +use pocketmine\inventory\Inventory; interface HopperInteractable{ - public function doHopperPush(BaseInventory $targetInventory) : bool; + public function doHopperPush(Inventory $targetInventory) : bool; public function doHopperPull(Hopper $hopperBlock) : bool; } diff --git a/src/block/utils/HopperInteractableTrait.php b/src/block/utils/HopperInteractableTrait.php index c9ceb6a8f95..0aadb546fde 100644 --- a/src/block/utils/HopperInteractableTrait.php +++ b/src/block/utils/HopperInteractableTrait.php @@ -23,10 +23,10 @@ namespace pocketmine\block\utils; -use pocketmine\inventory\BaseInventory; +use pocketmine\inventory\Inventory; trait HopperInteractableTrait{ - public function transferItem(BaseInventory $sourceInventory, BaseInventory $targetInventory) : bool{ + public function transferItem(Inventory $sourceInventory, Inventory $targetInventory) : bool{ foreach($sourceInventory->getContents() as $itemStack){ if($itemStack->isNull()){ continue; From 1fabd94c690029c709c3d932f5ae3bda36f302e9 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 18:41:41 +0000 Subject: [PATCH 56/85] code style corrections --- src/block/Chest.php | 1 - src/block/Furnace.php | 1 - src/block/Hopper.php | 1 - 3 files changed, 3 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index b239e99021b..0401a59a675 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -29,7 +29,6 @@ use pocketmine\block\utils\HopperInteractableTrait; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; -use pocketmine\inventory\BaseInventory; use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index ffcfb84aad6..50dff6bfe26 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -28,7 +28,6 @@ use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\inventory\BaseInventory; use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\Facing; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 7c3be352df2..501b24b17dd 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -28,7 +28,6 @@ use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\inventory\BaseInventory; use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; From 95d426d26fb11359721d2928d92c54042c620967 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 18:44:08 +0000 Subject: [PATCH 57/85] code style fixes --- src/block/Furnace.php | 2 +- src/block/HopperInteractable.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 50dff6bfe26..1a911ac76be 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -23,8 +23,8 @@ namespace pocketmine\block; -use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\tile\Furnace as TileFurnace; +use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index d16d73050f7..bcb3357b2a2 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -23,7 +23,6 @@ namespace pocketmine\block; -use pocketmine\block\Hopper; use pocketmine\inventory\Inventory; interface HopperInteractable{ From 3be17503191bf32e9e633164b2d1c556288b4391 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 22:55:13 +0000 Subject: [PATCH 58/85] improve readability --- src/block/Furnace.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 1a911ac76be..627dc4b06a0 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -23,6 +23,7 @@ namespace pocketmine\block; +use pocketmine\block\inventory\FurnaceInventory; use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; @@ -120,10 +121,10 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ $singleItem = $itemStack->pop(1); if($hopperFacing === Facing::DOWN && $targetInventory->canAddSmelting($singleItem)){ - $this->transferItem($sourceInventory, $targetInventory, $singleItem, $targetInventory::SLOT_INPUT); + $this->transferItem($sourceInventory, $targetInventory, $singleItem, FurnaceInventory::SLOT_INPUT); return true; }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $targetInventory->canAddFuel($singleItem)){ - $this->transferItem($sourceInventory, $targetInventory, $singleItem, $targetInventory::SLOT_FUEL); + $this->transferItem($sourceInventory, $targetInventory, $singleItem, FurnaceInventory::SLOT_FUEL); return true; } } From efb49ad34d6f7b17dc7a8fcd748d739853aeaf36 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 22:56:53 +0000 Subject: [PATCH 59/85] use getResult when pushing --- src/block/Furnace.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 627dc4b06a0..216af935c00 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -140,7 +140,7 @@ public function doHopperPush(Inventory $targetInventory) : bool{ $sourceInventory = $currentTile->getInventory(); - $itemStack = $sourceInventory->getItem($sourceInventory::SLOT_RESULT); + $itemStack = $sourceInventory->getResult(); if($itemStack->isNull()){ return false; From 491d1f38c81914e3cf4ae17d9650cb49c2de4161 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 23:07:33 +0000 Subject: [PATCH 60/85] Performance corrections --- src/block/inventory/FurnaceInventory.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 2fbe50e51be..8322b183d29 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -70,13 +70,17 @@ public function setSmelting(Item $item) : void{ } public function canAddSmelting(Item $item) : bool{ - if($this->getSmelting()->isNull()) return true; - $currentInput = $this->getSmelting(); - if($currentInput->getCount() === $currentInput->getMaxStackSize()) return false; + if($currentInput->isNull()){ + return true; + } + + if($currentInput->getCount() >= $currentInput->getMaxStackSize()){ + return false; + } - return $item->canStackWith($this->getSmelting()); + return $item->canStackWith($currentInput); } public function canAddFuel(Item $item) : bool{ From e4e31b0df3b523367bb778915f564cb4932fd8da Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 25 Jul 2023 23:12:40 +0000 Subject: [PATCH 61/85] remove unneccesary --- src/block/Furnace.php | 4 ++-- src/block/utils/HopperInteractableTrait.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 216af935c00..d434bdb6b2d 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -118,7 +118,7 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ continue; } - $singleItem = $itemStack->pop(1); + $singleItem = $itemStack->pop(); if($hopperFacing === Facing::DOWN && $targetInventory->canAddSmelting($singleItem)){ $this->transferItem($sourceInventory, $targetInventory, $singleItem, FurnaceInventory::SLOT_INPUT); @@ -146,7 +146,7 @@ public function doHopperPush(Inventory $targetInventory) : bool{ return false; } - $singleItem = $itemStack->pop(1); + $singleItem = $itemStack->pop(); $sourceInventory->removeItem($singleItem); $targetInventory->addItem($singleItem); diff --git a/src/block/utils/HopperInteractableTrait.php b/src/block/utils/HopperInteractableTrait.php index 0aadb546fde..343a2ed4b64 100644 --- a/src/block/utils/HopperInteractableTrait.php +++ b/src/block/utils/HopperInteractableTrait.php @@ -32,7 +32,7 @@ public function transferItem(Inventory $sourceInventory, Inventory $targetInvent continue; } - $singleItem = $itemStack->pop(1); + $singleItem = $itemStack->pop(); if(!$targetInventory->canAddItem($singleItem)){ continue; From b3c83651e938ea1906a6ad0d12f1fa1c79f2de8a Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 26 Jul 2023 01:19:13 +0000 Subject: [PATCH 62/85] pass through hopper block instead of inventory --- src/block/Chest.php | 9 +++++++-- src/block/Furnace.php | 8 +++++++- src/block/Hopper.php | 16 ++++++++-------- src/block/HopperInteractable.php | 4 +--- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 0401a59a675..3bf37215749 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -29,7 +29,6 @@ use pocketmine\block\utils\HopperInteractableTrait; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; -use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -117,13 +116,19 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function doHopperPush(Inventory $targetInventory) : bool{ + public function doHopperPush(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest){ return false; } + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + $sourceInventory = $currentTile->getInventory(); + $targetInventory = $tileHopper->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index d434bdb6b2d..38f85cd6a4b 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -132,13 +132,19 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return false; } - public function doHopperPush(Inventory $targetInventory) : bool{ + public function doHopperPush(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace){ return false; } + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + $sourceInventory = $currentTile->getInventory(); + $targetInventory = $tileHopper->getInventory(); $itemStack = $sourceInventory->getResult(); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 501b24b17dd..b78d8e162da 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -28,7 +28,6 @@ use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; -use pocketmine\inventory\Inventory; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -105,15 +104,10 @@ public function onScheduledUpdate() : void{ return; } - $tileHopper = $this->position->getWorld()->getTile($this->position); - if(!$tileHopper instanceof TileHopper){ - return; - } - $topBlock = $this->getSide(Facing::UP); $pushSuccess = false; if($topBlock instanceof HopperInteractable){ - $pushSuccess = $topBlock->doHopperPush($tileHopper->getInventory()); + $pushSuccess = $topBlock->doHopperPush($hopperBlock); } $facingBlock = $this->getSide($this->facing); @@ -144,13 +138,19 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function doHopperPush(Inventory $targetInventory) : bool{ + public function doHopperPush(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper){ return false; } + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + $sourceInventory = $currentTile->getInventory(); + $targetInventory = $tileHopper->getInventory(); return $this->transferItem($sourceInventory, $targetInventory); } diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index bcb3357b2a2..2dc93b73adc 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -23,9 +23,7 @@ namespace pocketmine\block; -use pocketmine\inventory\Inventory; - interface HopperInteractable{ - public function doHopperPush(Inventory $targetInventory) : bool; + public function doHopperPush(Hopper $hopperBlock) : bool; public function doHopperPull(Hopper $hopperBlock) : bool; } From 9ab0ac1c6264c6339edc14fb12895f31cc05a31a Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 26 Jul 2023 16:40:22 +0000 Subject: [PATCH 63/85] correct push/pull --- src/block/Chest.php | 4 ++-- src/block/Furnace.php | 56 +++++++++++++++++++++---------------------- src/block/Hopper.php | 8 +++---- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/block/Chest.php b/src/block/Chest.php index 3bf37215749..5703c27b12b 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -99,7 +99,7 @@ public function getFuelTime() : int{ return 300; } - public function doHopperPull(Hopper $hopperBlock) : bool{ + public function doHopperPush(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest){ return false; @@ -116,7 +116,7 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function doHopperPush(Hopper $hopperBlock) : bool{ + public function doHopperPull(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileChest){ return false; diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 38f85cd6a4b..1e10e8ddb92 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -106,6 +106,34 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return false; } + $sourceInventory = $currentTile->getInventory(); + $targetInventory = $tileHopper->getInventory(); + + $itemStack = $sourceInventory->getResult(); + + if($itemStack->isNull()){ + return false; + } + + $singleItem = $itemStack->pop(); + + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); + + return true; + } + + public function doHopperPush(Hopper $hopperBlock) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileFurnace){ + return false; + } + + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + $sourceInventory = $tileHopper->getInventory(); $targetInventory = $currentTile->getInventory(); @@ -132,34 +160,6 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return false; } - public function doHopperPush(Hopper $hopperBlock) : bool{ - $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileFurnace){ - return false; - } - - $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); - if(!$tileHopper instanceof TileHopper){ - return false; - } - - $sourceInventory = $currentTile->getInventory(); - $targetInventory = $tileHopper->getInventory(); - - $itemStack = $sourceInventory->getResult(); - - if($itemStack->isNull()){ - return false; - } - - $singleItem = $itemStack->pop(); - - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); - - return true; - } - private function transferItem(Inventory $sourceInventory, Inventory $targetInventory, Item $item, int $slot) : void{ $sourceInventory->removeItem($item); diff --git a/src/block/Hopper.php b/src/block/Hopper.php index b78d8e162da..d849aa2506f 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -107,13 +107,13 @@ public function onScheduledUpdate() : void{ $topBlock = $this->getSide(Facing::UP); $pushSuccess = false; if($topBlock instanceof HopperInteractable){ - $pushSuccess = $topBlock->doHopperPush($hopperBlock); + $pushSuccess = $topBlock->doHopperPull($hopperBlock); } $facingBlock = $this->getSide($this->facing); $pullSuccess = false; if($facingBlock instanceof HopperInteractable){ - $pullSuccess = $facingBlock->doHopperPull($hopperBlock); + $pullSuccess = $facingBlock->doHopperPush($hopperBlock); } $nextTick = ($pushSuccess || $pullSuccess ) ? 8 : 1; @@ -121,7 +121,7 @@ public function onScheduledUpdate() : void{ $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } - public function doHopperPull(Hopper $hopperBlock) : bool{ + public function doHopperPush(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper){ return false; @@ -138,7 +138,7 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - public function doHopperPush(Hopper $hopperBlock) : bool{ + public function doHopperPull(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper){ return false; From 0037b08cd45ceb2167af92930042fa8d0e1c9fa2 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 26 Jul 2023 16:43:45 +0000 Subject: [PATCH 64/85] add comments for interface --- src/block/HopperInteractable.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 2dc93b73adc..735db3c4e2b 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -24,6 +24,15 @@ namespace pocketmine\block; interface HopperInteractable{ + /** + * Returns true/false if a hopper was successfully able to + * push an item + */ public function doHopperPush(Hopper $hopperBlock) : bool; + + /** + * Returns true/false if a hopper was successfully able to + * pull an item + */ public function doHopperPull(Hopper $hopperBlock) : bool; } From 93cfda5e1fd2838fcca79584f3fcda3f6245a1b7 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 31 Jul 2023 19:11:39 +0000 Subject: [PATCH 65/85] style fix --- src/block/Hopper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index d849aa2506f..89551fdf340 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -116,7 +116,7 @@ public function onScheduledUpdate() : void{ $pullSuccess = $facingBlock->doHopperPush($hopperBlock); } - $nextTick = ($pushSuccess || $pullSuccess ) ? 8 : 1; + $nextTick = ($pushSuccess || $pullSuccess) ? 8 : 1; $world->scheduleDelayedBlockUpdate($this->position, $nextTick); } From fe66be10f13011077fc9a8828882ce23426079bf Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 31 Jul 2023 19:15:34 +0000 Subject: [PATCH 66/85] logic fix --- src/block/Hopper.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 89551fdf340..bdfe7541001 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -104,18 +104,18 @@ public function onScheduledUpdate() : void{ return; } - $topBlock = $this->getSide(Facing::UP); - $pushSuccess = false; - if($topBlock instanceof HopperInteractable){ - $pushSuccess = $topBlock->doHopperPull($hopperBlock); - } - $facingBlock = $this->getSide($this->facing); $pullSuccess = false; if($facingBlock instanceof HopperInteractable){ $pullSuccess = $facingBlock->doHopperPush($hopperBlock); } + $topBlock = $this->getSide(Facing::UP); + $pushSuccess = false; + if($topBlock instanceof HopperInteractable){ + $pushSuccess = $topBlock->doHopperPull($hopperBlock); + } + $nextTick = ($pushSuccess || $pullSuccess) ? 8 : 1; $world->scheduleDelayedBlockUpdate($this->position, $nextTick); From 7ac0cba996c61a16db7ae6096c18d75bf5ddd39f Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Mon, 31 Jul 2023 19:21:14 +0000 Subject: [PATCH 67/85] remove useless check hopper can't face up --- src/block/Furnace.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 1e10e8ddb92..b8398dd11ae 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -151,7 +151,7 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ if($hopperFacing === Facing::DOWN && $targetInventory->canAddSmelting($singleItem)){ $this->transferItem($sourceInventory, $targetInventory, $singleItem, FurnaceInventory::SLOT_INPUT); return true; - }elseif($hopperFacing !== Facing::DOWN && $hopperFacing !== Facing::UP && $targetInventory->canAddFuel($singleItem)){ + }elseif($hopperFacing !== Facing::DOWN && $targetInventory->canAddFuel($singleItem)){ $this->transferItem($sourceInventory, $targetInventory, $singleItem, FurnaceInventory::SLOT_FUEL); return true; } From 8c8f9307f50ba4083fdd63ed9617dacf175f98c6 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Tue, 1 Aug 2023 02:54:23 +0000 Subject: [PATCH 68/85] introduce cooldown --- src/block/Hopper.php | 46 ++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index bdfe7541001..348abf3e310 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -39,8 +39,12 @@ class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; use HopperInteractableTrait; + public const TRANSFER_COOLDOWN = 8; + private int $facing = Facing::DOWN; + private int $currentCooldown = 0; + protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); $w->bool($this->powered); @@ -104,24 +108,34 @@ public function onScheduledUpdate() : void{ return; } - $facingBlock = $this->getSide($this->facing); - $pullSuccess = false; - if($facingBlock instanceof HopperInteractable){ - $pullSuccess = $facingBlock->doHopperPush($hopperBlock); - } + if($this->hopperOnCooldown()){ + $this->currentCooldown--; + }else{ + $facingBlock = $this->getSide($this->facing); + $pullSuccess = false; + if($facingBlock instanceof HopperInteractable){ + $pullSuccess = $facingBlock->doHopperPush($hopperBlock); + } - $topBlock = $this->getSide(Facing::UP); - $pushSuccess = false; - if($topBlock instanceof HopperInteractable){ - $pushSuccess = $topBlock->doHopperPull($hopperBlock); - } + $topBlock = $this->getSide(Facing::UP); + $pushSuccess = false; + if($topBlock instanceof HopperInteractable){ + $pushSuccess = $topBlock->doHopperPull($hopperBlock); + } - $nextTick = ($pushSuccess || $pullSuccess) ? 8 : 1; + if($pullSuccess || $pushSuccess){ + $this->currentCooldown = self::TRANSFER_COOLDOWN; + } + } - $world->scheduleDelayedBlockUpdate($this->position, $nextTick); + $world->scheduleDelayedBlockUpdate($this->position, 1); } public function doHopperPush(Hopper $hopperBlock) : bool{ + if($this->hopperOnCooldown()){ + return false; + } + $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper){ return false; @@ -139,6 +153,10 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ } public function doHopperPull(Hopper $hopperBlock) : bool{ + if($this->hopperOnCooldown()){ + return false; + } + $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileHopper){ return false; @@ -155,5 +173,9 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } + private function hopperOnCooldown() : bool{ + return $this->currentCooldown > 0; + } + //TODO: redstone logic, sucking logic } From e312ee10c7b3ef483b48fc9c699745c3fce7a369 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 2 Aug 2023 19:06:01 +0000 Subject: [PATCH 69/85] use constant instead of hardcoded value --- src/block/Hopper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 348abf3e310..29600dd37f8 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -84,7 +84,7 @@ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Blo $this->facing = $face === Facing::DOWN ? Facing::DOWN : Facing::opposite($face); $world = $this->position->getWorld(); - $world->scheduleDelayedBlockUpdate($blockReplace->position, 8); + $world->scheduleDelayedBlockUpdate($blockReplace->position, self::TRANSFER_COOLDOWN); return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } From 136167fcfc84d80c8cce5bb2911f479d281c4908 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 2 Aug 2023 19:08:54 +0000 Subject: [PATCH 70/85] better naming --- src/block/Hopper.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 29600dd37f8..6000332e825 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -108,7 +108,7 @@ public function onScheduledUpdate() : void{ return; } - if($this->hopperOnCooldown()){ + if($this->isOnCooldown()){ $this->currentCooldown--; }else{ $facingBlock = $this->getSide($this->facing); @@ -132,7 +132,7 @@ public function onScheduledUpdate() : void{ } public function doHopperPush(Hopper $hopperBlock) : bool{ - if($this->hopperOnCooldown()){ + if($this->isOnCooldown()){ return false; } @@ -153,7 +153,7 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ } public function doHopperPull(Hopper $hopperBlock) : bool{ - if($this->hopperOnCooldown()){ + if($this->isOnCooldown()){ return false; } @@ -173,7 +173,7 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return $this->transferItem($sourceInventory, $targetInventory); } - private function hopperOnCooldown() : bool{ + private function isOnCooldown() : bool{ return $this->currentCooldown > 0; } From 716b9b0935d9245f8361e70e86c02d3d420ce464 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 2 Aug 2023 19:10:22 +0000 Subject: [PATCH 71/85] style fixes --- src/block/inventory/FurnaceInventory.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 8322b183d29..7789b00743e 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -84,11 +84,15 @@ public function canAddSmelting(Item $item) : bool{ } public function canAddFuel(Item $item) : bool{ - if($item->getFuelTime() == 0) return false; + if($item->getFuelTime() == 0){ + return false; + } $currentFuel = $this->getFuel(); - if($currentFuel->isNull()) return true; + if($currentFuel->isNull()){ + return true; + } if($currentFuel->getCount() === $currentFuel->getMaxStackSize()) return false; From 8ea906ff3a09c3935d0a35b5087ceaea34655756 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Wed, 2 Aug 2023 19:11:10 +0000 Subject: [PATCH 72/85] style fix --- src/block/inventory/FurnaceInventory.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 7789b00743e..07658eb8c36 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -94,7 +94,9 @@ public function canAddFuel(Item $item) : bool{ return true; } - if($currentFuel->getCount() === $currentFuel->getMaxStackSize()) return false; + if($currentFuel->getCount() === $currentFuel->getMaxStackSize()){ + return false; + } return $item->canStackWith($currentFuel); } From cb06633297b8ed294c55a9183d899c7c7a70217d Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Thu, 3 Aug 2023 22:40:16 +0000 Subject: [PATCH 73/85] minor equality fix --- src/block/inventory/FurnaceInventory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 07658eb8c36..55ccc23bf63 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -84,7 +84,7 @@ public function canAddSmelting(Item $item) : bool{ } public function canAddFuel(Item $item) : bool{ - if($item->getFuelTime() == 0){ + if($item->getFuelTime() === 0){ return false; } From 4f1934fa93ea6966a140861ca64b350f6b431ac6 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Fri, 4 Aug 2023 20:31:39 +0000 Subject: [PATCH 74/85] make push/pull order match interface --- src/block/Furnace.php | 56 +++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index b8398dd11ae..956c6969a59 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -95,34 +95,6 @@ public function onScheduledUpdate() : void{ } } - public function doHopperPull(Hopper $hopperBlock) : bool{ - $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileFurnace){ - return false; - } - - $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); - if(!$tileHopper instanceof TileHopper){ - return false; - } - - $sourceInventory = $currentTile->getInventory(); - $targetInventory = $tileHopper->getInventory(); - - $itemStack = $sourceInventory->getResult(); - - if($itemStack->isNull()){ - return false; - } - - $singleItem = $itemStack->pop(); - - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); - - return true; - } - public function doHopperPush(Hopper $hopperBlock) : bool{ $currentTile = $this->position->getWorld()->getTile($this->position); if(!$currentTile instanceof TileFurnace){ @@ -160,6 +132,34 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ return false; } + public function doHopperPull(Hopper $hopperBlock) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileFurnace){ + return false; + } + + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + $sourceInventory = $currentTile->getInventory(); + $targetInventory = $tileHopper->getInventory(); + + $itemStack = $sourceInventory->getResult(); + + if($itemStack->isNull()){ + return false; + } + + $singleItem = $itemStack->pop(); + + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); + + return true; + } + private function transferItem(Inventory $sourceInventory, Inventory $targetInventory, Item $item, int $slot) : void{ $sourceInventory->removeItem($item); From 8e980810d76e15c838b801308b522188c52a9916 Mon Sep 17 00:00:00 2001 From: Joseph Williamson Date: Fri, 4 Aug 2023 20:44:15 +0000 Subject: [PATCH 75/85] bug fix --- src/block/Furnace.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/block/Furnace.php b/src/block/Furnace.php index 956c6969a59..aa39de1f3df 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -111,7 +111,7 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ $hopperFacing = $hopperBlock->getFacing(); - for($i = 0; $i < $targetInventory->getSize(); $i++){ + for($i = 0; $i < $sourceInventory->getSize(); $i++){ $itemStack = $sourceInventory->getItem($i); if($itemStack->isNull()){ From 917fae9a6a00131ea60fd01f8acecec83b954cf0 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Fri, 6 Oct 2023 18:39:06 +0200 Subject: [PATCH 76/85] refactoring and apply lock system - Moove HopperInteractableTrait into an helper class - Hopper now use current server tick to check their cooldown --- src/block/Chest.php | 19 ++++---- src/block/Furnace.php | 30 +++++------- src/block/Hopper.php | 46 ++++++++----------- src/block/inventory/FurnaceInventory.php | 2 +- ...ableTrait.php => HopperTransferHelper.php} | 33 +++++++------ 5 files changed, 60 insertions(+), 70 deletions(-) rename src/block/utils/{HopperInteractableTrait.php => HopperTransferHelper.php} (55%) diff --git a/src/block/Chest.php b/src/block/Chest.php index 5703c27b12b..31e66a3164c 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -26,7 +26,7 @@ use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HopperInteractableTrait; +use pocketmine\block\utils\HopperTransferHelper; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; use pocketmine\item\Item; @@ -37,7 +37,6 @@ class Chest extends Transparent implements HopperInteractable{ use FacesOppositePlacingPlayerTrait; - use HopperInteractableTrait; /** * @return AxisAlignedBB[] @@ -110,10 +109,10 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ return false; } - $sourceInventory = $tileHopper->getInventory(); - $targetInventory = $currentTile->getInventory(); - - return $this->transferItem($sourceInventory, $targetInventory); + return HopperTransferHelper::transferOneItem( + $tileHopper->getInventory(), + $currentTile->getInventory() + ); } public function doHopperPull(Hopper $hopperBlock) : bool{ @@ -127,9 +126,9 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return false; } - $sourceInventory = $currentTile->getInventory(); - $targetInventory = $tileHopper->getInventory(); - - return $this->transferItem($sourceInventory, $targetInventory); + return HopperTransferHelper::transferOneItem( + $currentTile->getInventory(), + $tileHopper->getInventory() + ); } } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index aa39de1f3df..80e60fd17d1 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -27,6 +27,7 @@ use pocketmine\block\tile\Furnace as TileFurnace; use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; +use pocketmine\block\utils\HopperTransferHelper; use pocketmine\crafting\FurnaceType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\inventory\Inventory; @@ -111,22 +112,20 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ $hopperFacing = $hopperBlock->getFacing(); - for($i = 0; $i < $sourceInventory->getSize(); $i++){ - $itemStack = $sourceInventory->getItem($i); - - if($itemStack->isNull()){ + foreach($sourceInventory->getContents() as $item) { + if($item->isNull()){ continue; } - $singleItem = $itemStack->pop(); + $singleItem = $item->pop(); if($hopperFacing === Facing::DOWN && $targetInventory->canAddSmelting($singleItem)){ $this->transferItem($sourceInventory, $targetInventory, $singleItem, FurnaceInventory::SLOT_INPUT); - return true; }elseif($hopperFacing !== Facing::DOWN && $targetInventory->canAddFuel($singleItem)){ $this->transferItem($sourceInventory, $targetInventory, $singleItem, FurnaceInventory::SLOT_FUEL); - return true; } + + return true; } return false; @@ -146,18 +145,11 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ $sourceInventory = $currentTile->getInventory(); $targetInventory = $tileHopper->getInventory(); - $itemStack = $sourceInventory->getResult(); - - if($itemStack->isNull()){ - return false; - } - - $singleItem = $itemStack->pop(); - - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); - - return true; + return HopperTransferHelper::transferSpecificItem( + $sourceInventory, + $targetInventory, + $sourceInventory->getResult() + ); } private function transferItem(Inventory $sourceInventory, Inventory $targetInventory, Item $item, int $slot) : void{ diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 6000332e825..4a5910ac7a2 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -24,7 +24,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; -use pocketmine\block\utils\HopperInteractableTrait; +use pocketmine\block\utils\HopperTransferHelper; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; @@ -37,13 +37,12 @@ class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; - use HopperInteractableTrait; public const TRANSFER_COOLDOWN = 8; private int $facing = Facing::DOWN; - private int $currentCooldown = 0; + private int $lastActionTick = 0; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); @@ -83,8 +82,7 @@ public function getSupportType(int $facing) : SupportType{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $this->facing = $face === Facing::DOWN ? Facing::DOWN : Facing::opposite($face); - $world = $this->position->getWorld(); - $world->scheduleDelayedBlockUpdate($blockReplace->position, self::TRANSFER_COOLDOWN); + $this->lastActionTick = $this->position->getWorld()->getServer()->getTick(); return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -103,28 +101,21 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); - $hopperBlock = $this->position->getWorld()->getBlock($this->position); - if(!$hopperBlock instanceof Hopper){ - return; - } - - if($this->isOnCooldown()){ - $this->currentCooldown--; - }else{ + if(!$this->isOnCooldown()){ $facingBlock = $this->getSide($this->facing); - $pullSuccess = false; + $pushSuccess = false; if($facingBlock instanceof HopperInteractable){ - $pullSuccess = $facingBlock->doHopperPush($hopperBlock); + $pushSuccess = $facingBlock->doHopperPush($this); } $topBlock = $this->getSide(Facing::UP); - $pushSuccess = false; + $pullSuccess = false; if($topBlock instanceof HopperInteractable){ - $pushSuccess = $topBlock->doHopperPull($hopperBlock); + $pullSuccess = $topBlock->doHopperPull($this); } if($pullSuccess || $pushSuccess){ - $this->currentCooldown = self::TRANSFER_COOLDOWN; + $this->lastActionTick = $world->getServer()->getTick(); } } @@ -146,10 +137,10 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ return false; } - $sourceInventory = $tileHopper->getInventory(); - $targetInventory = $currentTile->getInventory(); - - return $this->transferItem($sourceInventory, $targetInventory); + return HopperTransferHelper::transferOneItem( + $tileHopper->getInventory(), + $currentTile->getInventory() + ); } public function doHopperPull(Hopper $hopperBlock) : bool{ @@ -167,14 +158,15 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ return false; } - $sourceInventory = $currentTile->getInventory(); - $targetInventory = $tileHopper->getInventory(); - - return $this->transferItem($sourceInventory, $targetInventory); + return HopperTransferHelper::transferOneItem( + $currentTile->getInventory(), + $tileHopper->getInventory() + ); } private function isOnCooldown() : bool{ - return $this->currentCooldown > 0; + $currentTick = $this->position->getWorld()->getServer()->getTick(); + return $currentTick - $this->lastActionTick < self::TRANSFER_COOLDOWN; } //TODO: redstone logic, sucking logic diff --git a/src/block/inventory/FurnaceInventory.php b/src/block/inventory/FurnaceInventory.php index 55ccc23bf63..c97763ccee3 100644 --- a/src/block/inventory/FurnaceInventory.php +++ b/src/block/inventory/FurnaceInventory.php @@ -94,7 +94,7 @@ public function canAddFuel(Item $item) : bool{ return true; } - if($currentFuel->getCount() === $currentFuel->getMaxStackSize()){ + if($currentFuel->getCount() >= $currentFuel->getMaxStackSize()){ return false; } diff --git a/src/block/utils/HopperInteractableTrait.php b/src/block/utils/HopperTransferHelper.php similarity index 55% rename from src/block/utils/HopperInteractableTrait.php rename to src/block/utils/HopperTransferHelper.php index 343a2ed4b64..d60019a822f 100644 --- a/src/block/utils/HopperInteractableTrait.php +++ b/src/block/utils/HopperTransferHelper.php @@ -24,26 +24,33 @@ namespace pocketmine\block\utils; use pocketmine\inventory\Inventory; +use pocketmine\item\Item; -trait HopperInteractableTrait{ - public function transferItem(Inventory $sourceInventory, Inventory $targetInventory) : bool{ - foreach($sourceInventory->getContents() as $itemStack){ - if($itemStack->isNull()){ - continue; +class HopperTransferHelper{ + public static function transferOneItem(Inventory $sourceInventory, Inventory $targetInventory) : bool{ + foreach($sourceInventory->getContents() as $item){ + if(self::transferSpecificItem($sourceInventory, $targetInventory, $item)){ + return true; } + } - $singleItem = $itemStack->pop(); + return false; + } - if(!$targetInventory->canAddItem($singleItem)){ - continue; - } + public static function transferSpecificItem(Inventory $sourceInventory, Inventory $targetInventory, Item $item) : bool{ + if($item->isNull()){ + return false; + } - $sourceInventory->removeItem($singleItem); - $targetInventory->addItem($singleItem); + $singleItem = $item->pop(); - return true; + if(!$targetInventory->canAddItem($singleItem)){ + return false; } - return false; + $sourceInventory->removeItem($singleItem); + $targetInventory->addItem($singleItem); + + return true; } } From a785ed1044a58373a8ef26671eea6efbdb81ea2f Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Fri, 6 Oct 2023 21:10:13 +0200 Subject: [PATCH 77/85] add BrewingStand --- src/block/BrewingStand.php | 104 ++++++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index 03969316494..6445f0299ca 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -23,11 +23,18 @@ namespace pocketmine\block; +use pocketmine\block\inventory\BrewingStandInventory; use pocketmine\block\tile\BrewingStand as TileBrewingStand; +use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\BrewingStandSlot; +use pocketmine\block\utils\HopperTransferHelper; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\inventory\Inventory; use pocketmine\item\Item; +use pocketmine\item\ItemTypeIds; +use pocketmine\item\Potion; +use pocketmine\item\PotionType; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -36,7 +43,7 @@ use function array_key_exists; use function spl_object_id; -class BrewingStand extends Transparent{ +class BrewingStand extends Transparent implements HopperInteractable{ /** * @var BrewingStandSlot[] @@ -128,4 +135,99 @@ public function onScheduledUpdate() : void{ } } } + + public function doHopperPush(Hopper $hopperBlock) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileBrewingStand){ + return false; + } + + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + $sourceInventory = $tileHopper->getInventory(); + $targetInventory = $currentTile->getInventory(); + + $hopperFacing = $hopperBlock->getFacing(); + + foreach($sourceInventory->getContents() as $item){ + if($item->isNull()){ + continue; + } + + $singleItem = $item->pop(); + + if($hopperFacing === Facing::DOWN){ + $ingredient = $targetInventory->getItem(BrewingStandInventory::SLOT_INGREDIENT); + if($ingredient->isNull() || $ingredient->canStackWith($singleItem)){ + $this->transferItem($sourceInventory, $targetInventory, $singleItem, BrewingStandInventory::SLOT_INGREDIENT); + + return true; + } + }else{ + if($singleItem->getTypeId() === ItemTypeIds::BLAZE_POWDER){ + $this->transferItem($sourceInventory, $targetInventory, $singleItem, BrewingStandInventory::SLOT_FUEL); + + return true; + }elseif($singleItem instanceof Potion && $singleItem->getType() === PotionType::WATER){ + foreach(BrewingStandSlot::cases() as $slot){ + $bottle = $targetInventory->getItem($slot->getSlotNumber()); + if($bottle->isNull()){ + $this->transferItem($sourceInventory, $targetInventory, $singleItem, $slot->getSlotNumber()); + + return true; + } + } + } + } + } + + return false; + } + + public function doHopperPull(Hopper $hopperBlock) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof TileBrewingStand){ + return false; + } + + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + $sourceInventory = $currentTile->getInventory(); + $targetInventory = $tileHopper->getInventory(); + + foreach(BrewingStandSlot::cases() as $slot){ + $bottle = $sourceInventory->getItem($slot->getSlotNumber()); + if(!$bottle->isNull()){ + if(HopperTransferHelper::transferSpecificItem( + $sourceInventory, + $targetInventory, + $bottle + )){ + return true; + } + } + } + + return false; + } + + private function transferItem(Inventory $sourceInventory, Inventory $targetInventory, Item $item, int $slot) : void{ + $sourceInventory->removeItem($item); + + $currentItem = $targetInventory->getItem($slot); + + if($currentItem->isNull()){ + $targetInventory->setItem($slot, $item); + return; + } + + $currentItem->setCount($currentItem->getCount() + 1); + $targetInventory->setItem($slot, $currentItem); + } } From 8414455ff5ca76cdb27a4343819eca2071f7840c Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Fri, 6 Oct 2023 21:15:57 +0200 Subject: [PATCH 78/85] add redstone lock system --- src/block/Hopper.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index a994123b3e6..0755fa55cfc 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -82,7 +82,11 @@ public function getSupportType(int $facing) : SupportType{ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $this->facing = $face === Facing::DOWN ? Facing::DOWN : Facing::opposite($face); - $this->lastActionTick = $this->position->getWorld()->getServer()->getTick(); + $world = $this->position->getWorld(); + $this->lastActionTick = $world->getServer()->getTick(); + if(!$this->powered){ + $world->scheduleDelayedBlockUpdate($this->position, 1); + } return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -99,6 +103,10 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player } public function onScheduledUpdate() : void{ + if($this->powered){ + return; + } + $world = $this->position->getWorld(); if(!$this->isOnCooldown()){ From b726f559a2cdb7e656a821789e7729747489d9d4 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Fri, 6 Oct 2023 21:26:59 +0200 Subject: [PATCH 79/85] improve docs + fix hopper transfer cooldown --- src/block/Hopper.php | 10 ++++++++-- src/block/HopperInteractable.php | 9 +++++++-- src/block/utils/HopperTransferHelper.php | 9 +++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 0755fa55cfc..d4cacd678a8 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -145,10 +145,16 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ return false; } - return HopperTransferHelper::transferOneItem( + if(HopperTransferHelper::transferOneItem( $tileHopper->getInventory(), $currentTile->getInventory() - ); + )){ + $hopperBlock->lastActionTick = $this->position->getWorld()->getServer()->getTick(); + $hopperBlock->position->getWorld()->scheduleDelayedBlockUpdate($hopperBlock->position, self::TRANSFER_COOLDOWN); + return true; + } + + return false; } public function doHopperPull(Hopper $hopperBlock) : bool{ diff --git a/src/block/HopperInteractable.php b/src/block/HopperInteractable.php index 735db3c4e2b..0fb3aaeb14e 100644 --- a/src/block/HopperInteractable.php +++ b/src/block/HopperInteractable.php @@ -23,16 +23,21 @@ namespace pocketmine\block; +/** + * This interface is used to mark blocks that can be interacted with by hoppers. + * This is used to prevent hoppers from trying to interact with blocks that don't support it. + * If you want to make a block interactable by hoppers, implement this interface. + */ interface HopperInteractable{ /** * Returns true/false if a hopper was successfully able to - * push an item + * push an item into this block (e.g. an item was successfully added to the block inventory) */ public function doHopperPush(Hopper $hopperBlock) : bool; /** * Returns true/false if a hopper was successfully able to - * pull an item + * pull an item from this block (e.g. an item was successfully removed from the block inventory) */ public function doHopperPull(Hopper $hopperBlock) : bool; } diff --git a/src/block/utils/HopperTransferHelper.php b/src/block/utils/HopperTransferHelper.php index d60019a822f..cd7aa46a426 100644 --- a/src/block/utils/HopperTransferHelper.php +++ b/src/block/utils/HopperTransferHelper.php @@ -27,6 +27,11 @@ use pocketmine\item\Item; class HopperTransferHelper{ + /** + * Find one item from the source inventory and transfer it to the target inventory. + * Check the items from the start to the end of the inventory. + * Returns true if an item was transferred, false otherwise. + */ public static function transferOneItem(Inventory $sourceInventory, Inventory $targetInventory) : bool{ foreach($sourceInventory->getContents() as $item){ if(self::transferSpecificItem($sourceInventory, $targetInventory, $item)){ @@ -37,6 +42,10 @@ public static function transferOneItem(Inventory $sourceInventory, Inventory $ta return false; } + /** + * Transfer the one of the specified item from the source inventory to the target inventory. + * Returns true if the item was transferred, false otherwise. + */ public static function transferSpecificItem(Inventory $sourceInventory, Inventory $targetInventory, Item $item) : bool{ if($item->isNull()){ return false; From e9d8dde7881e9ad1c0720093ec379ccffb1b65f3 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Fri, 6 Oct 2023 21:35:54 +0200 Subject: [PATCH 80/85] implement container block --- src/block/Barrel.php | 4 +- src/block/Chest.php | 37 +---------- src/block/ShulkerBox.php | 4 +- .../HopperInteractableContainerTrait.php | 65 +++++++++++++++++++ 4 files changed, 73 insertions(+), 37 deletions(-) create mode 100644 src/block/utils/HopperInteractableContainerTrait.php diff --git a/src/block/Barrel.php b/src/block/Barrel.php index 1dce2376b1b..e3612918652 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -25,6 +25,7 @@ use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\utils\AnyFacingTrait; +use pocketmine\block\utils\HopperInteractableContainerTrait; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -33,7 +34,8 @@ use pocketmine\world\BlockTransaction; use function abs; -class Barrel extends Opaque{ +class Barrel extends Opaque implements HopperInteractable{ + use HopperInteractableContainerTrait; use AnyFacingTrait; protected bool $open = false; diff --git a/src/block/Chest.php b/src/block/Chest.php index d8323ad256e..0cbb1c605a9 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -24,9 +24,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Chest as TileChest; -use pocketmine\block\tile\Hopper as TileHopper; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\HopperTransferHelper; +use pocketmine\block\utils\HopperInteractableContainerTrait; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; use pocketmine\item\Item; @@ -36,6 +35,7 @@ use pocketmine\player\Player; class Chest extends Transparent implements HopperInteractable{ + use HopperInteractableContainerTrait; use FacesOppositePlacingPlayerTrait; /** @@ -98,37 +98,4 @@ public function getFuelTime() : int{ return 300; } - public function doHopperPush(Hopper $hopperBlock) : bool{ - $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileChest){ - return false; - } - - $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); - if(!$tileHopper instanceof TileHopper){ - return false; - } - - return HopperTransferHelper::transferOneItem( - $tileHopper->getInventory(), - $currentTile->getInventory() - ); - } - - public function doHopperPull(Hopper $hopperBlock) : bool{ - $currentTile = $this->position->getWorld()->getTile($this->position); - if(!$currentTile instanceof TileChest){ - return false; - } - - $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); - if(!$tileHopper instanceof TileHopper){ - return false; - } - - return HopperTransferHelper::transferOneItem( - $currentTile->getInventory(), - $tileHopper->getInventory() - ); - } } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index d557401eec3..015e48e3973 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -25,6 +25,7 @@ use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\utils\AnyFacingTrait; +use pocketmine\block\utils\HopperInteractableContainerTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\item\Item; @@ -32,7 +33,8 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; -class ShulkerBox extends Opaque{ +class ShulkerBox extends Opaque implements HopperInteractable{ + use HopperInteractableContainerTrait; use AnyFacingTrait; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ diff --git a/src/block/utils/HopperInteractableContainerTrait.php b/src/block/utils/HopperInteractableContainerTrait.php new file mode 100644 index 00000000000..9feba953f8f --- /dev/null +++ b/src/block/utils/HopperInteractableContainerTrait.php @@ -0,0 +1,65 @@ +position->getWorld()->getTile($this->position); + if(!$currentTile instanceof Container){ + return false; + } + + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + return HopperTransferHelper::transferOneItem( + $tileHopper->getInventory(), + $currentTile->getInventory() + ); + } + + public function doHopperPull(Hopper $hopperBlock) : bool{ + $currentTile = $this->position->getWorld()->getTile($this->position); + if(!$currentTile instanceof Container){ + return false; + } + + $tileHopper = $this->position->getWorld()->getTile($hopperBlock->position); + if(!$tileHopper instanceof TileHopper){ + return false; + } + + return HopperTransferHelper::transferOneItem( + $currentTile->getInventory(), + $tileHopper->getInventory() + ); + } + +} From f2940a44b9b4f131459d541d6cef542fc1f40162 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Fri, 6 Oct 2023 22:17:51 +0200 Subject: [PATCH 81/85] implement entity picking system + rename cooldown to transfer cooldown --- src/block/Hopper.php | 53 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index d4cacd678a8..e0fe0aafd29 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -28,21 +28,26 @@ use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; +use pocketmine\entity\object\ItemEntity; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\BlockTransaction; +use function array_shift; +use function count; class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; public const TRANSFER_COOLDOWN = 8; + public const ENTITY_PICKUP_COOLDOWN = 8; private int $facing = Facing::DOWN; - private int $lastActionTick = 0; + private int $lastTransferActionTick = 0; + private int $lastEntityPickupTick = 0; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); @@ -83,7 +88,7 @@ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Blo $this->facing = $face === Facing::DOWN ? Facing::DOWN : Facing::opposite($face); $world = $this->position->getWorld(); - $this->lastActionTick = $world->getServer()->getTick(); + $this->lastTransferActionTick = $world->getServer()->getTick(); if(!$this->powered){ $world->scheduleDelayedBlockUpdate($this->position, 1); } @@ -109,7 +114,12 @@ public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); - if(!$this->isOnCooldown()){ + $currentTile = $world->getTile($this->position); + if(!$currentTile instanceof TileHopper){ + return; + } + + if(!$this->isTransferInCooldown()){ $facingBlock = $this->getSide($this->facing); $pushSuccess = false; if($facingBlock instanceof HopperInteractable){ @@ -123,7 +133,27 @@ public function onScheduledUpdate() : void{ } if($pullSuccess || $pushSuccess){ - $this->lastActionTick = $world->getServer()->getTick(); + $this->lastTransferActionTick = $world->getServer()->getTick(); + } + } + + if(!$this->isEntityPickingInCooldown()){ + $boxe = AxisAlignedBB::one()->expand(0, 1, 0)->offset($this->position->x, $this->position->y, $this->position->z); + foreach($world->getNearbyEntities($boxe) as $entity){ + if(!$entity instanceof ItemEntity){ + continue; + } + + $item = $entity->getItem(); + $ret = $currentTile->getInventory()->addItem($item); + if(count($ret) > 0){ + $newItem = array_shift($ret); + $entity->setStackSize($newItem->getCount()); + }else{ + $entity->flagForDespawn(); + } + + break; } } @@ -131,7 +161,7 @@ public function onScheduledUpdate() : void{ } public function doHopperPush(Hopper $hopperBlock) : bool{ - if($this->isOnCooldown()){ + if($this->isTransferInCooldown()){ return false; } @@ -149,7 +179,7 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ $tileHopper->getInventory(), $currentTile->getInventory() )){ - $hopperBlock->lastActionTick = $this->position->getWorld()->getServer()->getTick(); + $hopperBlock->lastTransferActionTick = $this->position->getWorld()->getServer()->getTick(); $hopperBlock->position->getWorld()->scheduleDelayedBlockUpdate($hopperBlock->position, self::TRANSFER_COOLDOWN); return true; } @@ -158,7 +188,7 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ } public function doHopperPull(Hopper $hopperBlock) : bool{ - if($this->isOnCooldown()){ + if($this->isTransferInCooldown()){ return false; } @@ -178,9 +208,14 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ ); } - private function isOnCooldown() : bool{ + private function isTransferInCooldown() : bool{ + $currentTick = $this->position->getWorld()->getServer()->getTick(); + return $currentTick - $this->lastTransferActionTick < self::TRANSFER_COOLDOWN; + } + + private function isEntityPickingInCooldown() : bool{ $currentTick = $this->position->getWorld()->getServer()->getTick(); - return $currentTick - $this->lastActionTick < self::TRANSFER_COOLDOWN; + return $currentTick - $this->lastEntityPickupTick < self::ENTITY_PICKUP_COOLDOWN; } //TODO: redstone logic, sucking logic From 1b651d62dbfcc77dc496032097b32b60817ac4d2 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Tue, 10 Oct 2023 21:47:06 +0200 Subject: [PATCH 82/85] Hopper: fix schedule block update cancel when locked --- src/block/Hopper.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index e0fe0aafd29..6890b92e82a 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -89,9 +89,7 @@ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Blo $world = $this->position->getWorld(); $this->lastTransferActionTick = $world->getServer()->getTick(); - if(!$this->powered){ - $world->scheduleDelayedBlockUpdate($this->position, 1); - } + $world->scheduleDelayedBlockUpdate($this->position, 1); return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -108,12 +106,13 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player } public function onScheduledUpdate() : void{ + $world = $this->position->getWorld(); + $world->scheduleDelayedBlockUpdate($this->position, 1); + if($this->powered){ return; } - $world = $this->position->getWorld(); - $currentTile = $world->getTile($this->position); if(!$currentTile instanceof TileHopper){ return; @@ -156,8 +155,6 @@ public function onScheduledUpdate() : void{ break; } } - - $world->scheduleDelayedBlockUpdate($this->position, 1); } public function doHopperPush(Hopper $hopperBlock) : bool{ @@ -218,5 +215,5 @@ private function isEntityPickingInCooldown() : bool{ return $currentTick - $this->lastEntityPickupTick < self::ENTITY_PICKUP_COOLDOWN; } - //TODO: redstone logic, sucking logic + //TODO: redstone logic } From 14a53e1807747cb23bcbf04e5a51259c03b62620 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Tue, 10 Oct 2023 21:51:04 +0200 Subject: [PATCH 83/85] hopper: dont recalculate picking box each time --- src/block/Hopper.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 6890b92e82a..97d470d8bae 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -48,6 +48,7 @@ class Hopper extends Transparent implements HopperInteractable{ private int $lastTransferActionTick = 0; private int $lastEntityPickupTick = 0; + private AxisAlignedBB $pickingBox; protected function describeBlockOnlyState(RuntimeDataDescriber $w) : void{ $w->facingExcept($this->facing, Facing::UP); @@ -137,8 +138,7 @@ public function onScheduledUpdate() : void{ } if(!$this->isEntityPickingInCooldown()){ - $boxe = AxisAlignedBB::one()->expand(0, 1, 0)->offset($this->position->x, $this->position->y, $this->position->z); - foreach($world->getNearbyEntities($boxe) as $entity){ + foreach($world->getNearbyEntities($this->getPickingBox()) as $entity){ if(!$entity instanceof ItemEntity){ continue; } @@ -215,5 +215,13 @@ private function isEntityPickingInCooldown() : bool{ return $currentTick - $this->lastEntityPickupTick < self::ENTITY_PICKUP_COOLDOWN; } + public function getPickingBox() : AxisAlignedBB { + return $this->pickingBox ??= $this->recalculateBoundingBox(); + } + + protected function recalculateBoundingBox() : ?AxisAlignedBB { + return AxisAlignedBB::one()->expand(0, 1, 0)->offset($this->position->x, $this->position->y, $this->position->z); + } + //TODO: redstone logic } From 54f356f0729852648c8028be4819d6cf8180e951 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Wed, 11 Oct 2023 18:47:43 +0200 Subject: [PATCH 84/85] add events --- src/block/Hopper.php | 39 +++++++++------ src/event/block/HopperActionEvent.php | 59 +++++++++++++++++++++++ src/event/block/HopperPickupItemEvent.php | 47 ++++++++++++++++++ 3 files changed, 131 insertions(+), 14 deletions(-) create mode 100644 src/event/block/HopperActionEvent.php create mode 100644 src/event/block/HopperPickupItemEvent.php diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 97d470d8bae..cb1a7f572f6 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -29,6 +29,8 @@ use pocketmine\block\utils\SupportType; use pocketmine\data\runtime\RuntimeDataDescriber; use pocketmine\entity\object\ItemEntity; +use pocketmine\event\block\HopperActionEvent; +use pocketmine\event\block\HopperPickupItemEvent; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; @@ -108,27 +110,21 @@ public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player public function onScheduledUpdate() : void{ $world = $this->position->getWorld(); - $world->scheduleDelayedBlockUpdate($this->position, 1); - - if($this->powered){ - return; - } - - $currentTile = $world->getTile($this->position); - if(!$currentTile instanceof TileHopper){ - return; - } - if(!$this->isTransferInCooldown()){ + if(!$this->powered && !$this->isTransferInCooldown()){ $facingBlock = $this->getSide($this->facing); $pushSuccess = false; - if($facingBlock instanceof HopperInteractable){ + $ev = new HopperActionEvent($this, $facingBlock, HopperActionEvent::ACTION_PUSH); + $ev->call(); + if(!$ev->isCancelled() && $facingBlock instanceof HopperInteractable){ $pushSuccess = $facingBlock->doHopperPush($this); } $topBlock = $this->getSide(Facing::UP); $pullSuccess = false; - if($topBlock instanceof HopperInteractable){ + $ev = new HopperActionEvent($this, $topBlock, HopperActionEvent::ACTION_PULL); + $ev->call(); + if(!$ev->isCancelled() && $topBlock instanceof HopperInteractable){ $pullSuccess = $topBlock->doHopperPull($this); } @@ -137,12 +133,25 @@ public function onScheduledUpdate() : void{ } } - if(!$this->isEntityPickingInCooldown()){ + if(!$this->powered && !$this->isEntityPickingInCooldown()){ + $currentTile = $world->getTile($this->position); + if(!$currentTile instanceof TileHopper){ + return; + } + foreach($world->getNearbyEntities($this->getPickingBox()) as $entity){ if(!$entity instanceof ItemEntity){ continue; } + if(HopperPickupItemEvent::hasHandlers()){ + $ev = new HopperPickupItemEvent($entity, $this); + $ev->call(); + if($ev->isCancelled()){ + continue; + } + } + $item = $entity->getItem(); $ret = $currentTile->getInventory()->addItem($item); if(count($ret) > 0){ @@ -155,6 +164,8 @@ public function onScheduledUpdate() : void{ break; } } + + $world->scheduleDelayedBlockUpdate($this->position, 1); } public function doHopperPush(Hopper $hopperBlock) : bool{ diff --git a/src/event/block/HopperActionEvent.php b/src/event/block/HopperActionEvent.php new file mode 100644 index 00000000000..520cdc632b9 --- /dev/null +++ b/src/event/block/HopperActionEvent.php @@ -0,0 +1,59 @@ +targetBlock; + } + + public function getAction() : int{ + return $this->action; + } +} diff --git a/src/event/block/HopperPickupItemEvent.php b/src/event/block/HopperPickupItemEvent.php new file mode 100644 index 00000000000..e7573af7ae1 --- /dev/null +++ b/src/event/block/HopperPickupItemEvent.php @@ -0,0 +1,47 @@ +entity; + } +} From 23fcb55179e19bc9bb55522cc876f3481ca0e7f6 Mon Sep 17 00:00:00 2001 From: ShockedPlot7560 Date: Thu, 12 Oct 2023 18:02:17 +0200 Subject: [PATCH 85/85] optimize hopper Scheduling updates Need to store cooldown in Hopper tile --- src/block/Hopper.php | 46 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/block/Hopper.php b/src/block/Hopper.php index cb1a7f572f6..26bd38ecfb7 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -39,6 +39,7 @@ use pocketmine\world\BlockTransaction; use function array_shift; use function count; +use function min; class Hopper extends Transparent implements HopperInteractable{ use PoweredByRedstoneTrait; @@ -91,8 +92,9 @@ public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Blo $this->facing = $face === Facing::DOWN ? Facing::DOWN : Facing::opposite($face); $world = $this->position->getWorld(); - $this->lastTransferActionTick = $world->getServer()->getTick(); - $world->scheduleDelayedBlockUpdate($this->position, 1); + $this->updateTransferCooldown(); + $this->updateEntityPickingCooldown(); + $world->scheduleDelayedBlockUpdate($this->position, $this->getNextTickUpdate()); return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player); } @@ -129,7 +131,7 @@ public function onScheduledUpdate() : void{ } if($pullSuccess || $pushSuccess){ - $this->lastTransferActionTick = $world->getServer()->getTick(); + $this->updateTransferCooldown(); } } @@ -161,11 +163,13 @@ public function onScheduledUpdate() : void{ $entity->flagForDespawn(); } + $this->updateEntityPickingCooldown(); + break; } } - $world->scheduleDelayedBlockUpdate($this->position, 1); + $world->scheduleDelayedBlockUpdate($this->position, $this->getNextTickUpdate()); } public function doHopperPush(Hopper $hopperBlock) : bool{ @@ -187,8 +191,8 @@ public function doHopperPush(Hopper $hopperBlock) : bool{ $tileHopper->getInventory(), $currentTile->getInventory() )){ - $hopperBlock->lastTransferActionTick = $this->position->getWorld()->getServer()->getTick(); - $hopperBlock->position->getWorld()->scheduleDelayedBlockUpdate($hopperBlock->position, self::TRANSFER_COOLDOWN); + $hopperBlock->updateTransferCooldown(); + // don't schedule another update, hopper block update themselves automatically if needed return true; } @@ -216,6 +220,14 @@ public function doHopperPull(Hopper $hopperBlock) : bool{ ); } + public function getPickingBox() : AxisAlignedBB { + return $this->pickingBox ??= $this->recalculateBoundingBox(); + } + + protected function recalculateBoundingBox() : ?AxisAlignedBB { + return AxisAlignedBB::one()->expand(0, 1, 0)->offset($this->position->x, $this->position->y, $this->position->z); + } + private function isTransferInCooldown() : bool{ $currentTick = $this->position->getWorld()->getServer()->getTick(); return $currentTick - $this->lastTransferActionTick < self::TRANSFER_COOLDOWN; @@ -226,12 +238,26 @@ private function isEntityPickingInCooldown() : bool{ return $currentTick - $this->lastEntityPickupTick < self::ENTITY_PICKUP_COOLDOWN; } - public function getPickingBox() : AxisAlignedBB { - return $this->pickingBox ??= $this->recalculateBoundingBox(); + private function updateTransferCooldown() : void{ + $this->lastTransferActionTick = $this->position->getWorld()->getServer()->getTick(); } - protected function recalculateBoundingBox() : ?AxisAlignedBB { - return AxisAlignedBB::one()->expand(0, 1, 0)->offset($this->position->x, $this->position->y, $this->position->z); + private function updateEntityPickingCooldown() : void{ + $this->lastEntityPickupTick = $this->position->getWorld()->getServer()->getTick(); + } + + private function getNextTickUpdate() : int { + $currentTick = $this->position->getWorld()->getServer()->getTick(); + + $nextTick = 1; + if($this->isTransferInCooldown()) { + $nextTick = self::TRANSFER_COOLDOWN - ($currentTick - $this->lastTransferActionTick); + } + if($this->isEntityPickingInCooldown()) { + $nextTick = min($nextTick, self::ENTITY_PICKUP_COOLDOWN - ($currentTick - $this->lastEntityPickupTick)); + } + + return $nextTick; } //TODO: redstone logic