age === self::STAGE_MATURE){ return mt_rand(2, 3); }elseif($this->age >= self::STAGE_BUSH_SOME_BERRIES){ return mt_rand(1, 2); } return 0; } private function canBeSupportedAt(Block $block) : bool{ $supportBlock = $block->getSide(Facing::DOWN); return $supportBlock->getTypeId() !== BlockTypeIds::FARMLAND && //bedrock-specific thing (bug?) ($supportBlock->hasTypeTag(BlockTypeTags::DIRT) || $supportBlock->hasTypeTag(BlockTypeTags::MUD)); } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ $world = $this->position->getWorld(); if($this->age < self::STAGE_MATURE && $item instanceof Fertilizer){ $block = clone $this; $block->age++; if(BlockEventHelper::grow($this, $block, $player)){ $item->pop(); } }elseif(($dropAmount = $this->getBerryDropAmount()) > 0){ $world->setBlock($this->position, $this->setAge(self::STAGE_BUSH_NO_BERRIES)); $world->dropItem($this->position, $this->asItem()->setCount($dropAmount)); $world->addSound($this->position, new SweetBerriesPickSound()); } return true; } public function asItem() : Item{ return VanillaItems::SWEET_BERRIES(); } public function getDropsForCompatibleTool(Item $item) : array{ $count = match($this->age){ self::STAGE_MATURE => FortuneDropHelper::discrete($item, 2, 3), self::STAGE_BUSH_SOME_BERRIES => FortuneDropHelper::discrete($item, 1, 2), default => 0 }; return [ $this->asItem()->setCount($count) ]; } public function ticksRandomly() : bool{ return $this->age < self::STAGE_MATURE; } public function onRandomTick() : void{ if($this->age < self::STAGE_MATURE && mt_rand(0, 2) === 1){ $block = clone $this; ++$block->age; BlockEventHelper::grow($this, $block, null); } } public function hasEntityCollision() : bool{ return true; } public function onEntityInside(Entity $entity) : bool{ if($this->age >= self::STAGE_BUSH_NO_BERRIES && $entity instanceof Living){ $entity->resetFallDistance(); //TODO: in MCPE, this only triggers if moving while inside the bush block - we don't have the system to deal //with that reliably right now $entity->attack(new EntityDamageByBlockEvent($this, $entity, EntityDamageByBlockEvent::CAUSE_CONTACT, 1)); } return true; } }