wetness = $r->readBoundedInt(3, 0, self::MAX_WETNESS); } protected function encodeState(BlockDataWriter $w) : void{ $w->writeInt(3, $this->wetness); } public function getWetness() : int{ return $this->wetness; } /** @return $this */ public function setWetness(int $wetness) : self{ if($wetness < 0 || $wetness > self::MAX_WETNESS){ throw new \InvalidArgumentException("Wetness must be in range 0 ... " . self::MAX_WETNESS); } $this->wetness = $wetness; return $this; } /** * @return AxisAlignedBB[] */ protected function recalculateCollisionBoxes() : array{ return [AxisAlignedBB::one()]; //TODO: this should be trimmed at the top by 1/16, but MCPE currently treats them as a full block (https://bugs.mojang.com/browse/MCPE-12109) } public function onNearbyBlockChange() : void{ if($this->getSide(Facing::UP)->isSolid()){ $this->position->getWorld()->setBlock($this->position, VanillaBlocks::DIRT()); } } public function ticksRandomly() : bool{ return true; } public function onRandomTick() : void{ if(!$this->canHydrate()){ if($this->wetness > 0){ $this->wetness--; $this->position->getWorld()->setBlock($this->position, $this, false); }else{ $this->position->getWorld()->setBlock($this->position, VanillaBlocks::DIRT()); } }elseif($this->wetness < self::MAX_WETNESS){ $this->wetness = self::MAX_WETNESS; $this->position->getWorld()->setBlock($this->position, $this, false); } } public function onEntityLand(Entity $entity) : ?float{ if($entity instanceof Living && lcg_value() < $entity->getFallDistance() - 0.5){ $ev = new EntityTrampleFarmlandEvent($entity, $this); $ev->call(); if(!$ev->isCancelled()){ $this->getPosition()->getWorld()->setBlock($this->getPosition(), VanillaBlocks::DIRT()); } } return null; } protected function canHydrate() : bool{ //TODO: check rain $start = $this->position->add(-4, 0, -4); $end = $this->position->add(4, 1, 4); for($y = $start->y; $y <= $end->y; ++$y){ for($z = $start->z; $z <= $end->z; ++$z){ for($x = $start->x; $x <= $end->x; ++$x){ if($this->position->getWorld()->getBlockAt($x, $y, $z) instanceof Water){ return true; } } } } return false; } public function getDropsForCompatibleTool(Item $item) : array{ return [ VanillaBlocks::DIRT()->asItem() ]; } public function getPickedItem(bool $addUserData = false) : Item{ return VanillaBlocks::DIRT()->asItem(); } }