getWorld(); $origin = $consumer->getPosition(); $minX = $origin->getFloorX() - 8; $minY = min($origin->getFloorY(), $consumer->getWorld()->getMaxY()) - 8; $minZ = $origin->getFloorZ() - 8; $maxX = $minX + 16; $maxY = $minY + 16; $maxZ = $minZ + 16; for($attempts = 0; $attempts < 16; ++$attempts){ $x = mt_rand($minX, $maxX); $y = mt_rand($minY, $maxY); $z = mt_rand($minZ, $maxZ); while($y >= 0 && !$world->getBlockAt($x, $y, $z)->isSolid()){ $y--; } if($y < 0){ continue; } $blockUp = $world->getBlockAt($x, $y + 1, $z); $blockUp2 = $world->getBlockAt($x, $y + 2, $z); if($blockUp->isSolid() || $blockUp instanceof Liquid || $blockUp2->isSolid() || $blockUp2 instanceof Liquid){ continue; } //Sounds are broadcasted at both source and destination $world->addSound($origin, new EndermanTeleportSound()); $consumer->teleport($target = new Vector3($x + 0.5, $y + 1, $z + 0.5)); $world->addSound($target, new EndermanTeleportSound()); break; } } public function getCooldownTicks() : int{ return 20; } }