예제 #1
0
파일: Hopper.php 프로젝트: iTXTech/Genisys
 public function onUpdate()
 {
     if (!$this->getBlock() instanceof HopperBlock) {
         return false;
     }
     //Pickup dropped items
     //This can happen at any time regardless of cooldown
     $area = clone $this->getBlock()->getBoundingBox();
     //Area above hopper to draw items from
     $area->maxY = ceil($area->maxY) + 1;
     //Account for full block above, not just 1 + 5/8
     foreach ($this->getLevel()->getChunkEntities($this->getBlock()->x >> 4, $this->getBlock()->z >> 4) as $entity) {
         if (!$entity instanceof DroppedItem or !$entity->isAlive()) {
             continue;
         }
         if (!$entity->boundingBox->intersectsWith($area)) {
             continue;
         }
         $item = $entity->getItem();
         if (!$item instanceof Item) {
             continue;
         }
         if ($item->getCount() < 1) {
             $entity->kill();
             continue;
         }
         if ($this->inventory->canAddItem($item)) {
             $this->inventory->addItem($item);
             $entity->kill();
         }
     }
     if (!$this->canUpdate()) {
         //Hoppers only update CONTENTS every 8th tick
         $this->namedtag->TransferCooldown->setValue($this->namedtag->TransferCooldown->getValue() - 1);
         return true;
     }
     //Suck items from above tile inventories
     $source = $this->getLevel()->getTile($this->getBlock()->getSide(Vector3::SIDE_UP));
     if ($source instanceof Tile and $source instanceof InventoryHolder) {
         $inventory = $source->getInventory();
         $item = clone $inventory->getItem($inventory->firstOccupied());
         $item->setCount(1);
         if ($this->inventory->canAddItem($item)) {
             $this->inventory->addItem($item);
             $inventory->removeItem($item);
             $this->resetCooldownTicks();
             if ($source instanceof Hopper) {
                 $source->resetCooldownTicks();
             }
         }
     }
     //Feed item into target inventory
     //Do not do this if there's a hopper underneath this hopper, to follow vanilla behaviour
     if (!$this->getLevel()->getTile($this->getBlock()->getSide(Vector3::SIDE_DOWN)) instanceof Hopper) {
         $target = $this->getLevel()->getTile($this->getBlock()->getSide($this->getBlock()->getDamage()));
         if ($target instanceof Tile and $target instanceof InventoryHolder) {
             $inv = $target->getInventory();
             foreach ($this->inventory->getContents() as $item) {
                 if ($item->getId() === Item::AIR or $item->getCount() < 1) {
                     continue;
                 }
                 $targetItem = clone $item;
                 $targetItem->setCount(1);
                 if ($inv->canAddItem($targetItem)) {
                     $inv->addItem($targetItem);
                     $this->inventory->removeItem($targetItem);
                     $this->resetCooldownTicks();
                     if ($target instanceof Hopper) {
                         $target->resetCooldownTicks();
                     }
                     break;
                 }
             }
         }
     }
     return true;
 }