public function populate(ChunkManager $level, $chunkX, $chunkZ, Random $random) { $chunk = $level->getChunk($chunkX, $chunkZ); if ($level instanceof Level or $level instanceof SimpleChunkManager) { $waterHeight = $level->getWaterHeight(); } else { $waterHeight = 0; } for ($x = 0; $x < 16; ++$x) { for ($z = 0; $z < 16; ++$z) { $biome = Biome::getBiome($chunk->getBiomeId($x, $z)); $cover = $biome->getGroundCover(); if (count($cover) > 0) { $diffY = 0; if (!$cover[0]->isSolid()) { $diffY = 1; } $column = $chunk->getBlockIdColumn($x, $z); for ($y = 127; $y > 0; --$y) { if ($column[$y] !== "" and !Block::get(ord($column[$y]))->isTransparent()) { break; } } $startY = min(127, $y + $diffY); $endY = $startY - count($cover); for ($y = $startY; $y > $endY and $y >= 0; --$y) { $b = $cover[$startY - $y]; if ($column[$y] === "" and $b->isSolid()) { break; } if ($y <= $waterHeight and $b->getId() == Block::GRASS and $chunk->getBlockId($x, $y + 1, $z) == Block::STILL_WATER) { $b = Block::get(Block::DIRT); } if ($b->getDamage() === 0) { $chunk->setBlockId($x, $y, $z, $b->getId()); } else { $chunk->setBlock($x, $y, $z, $b->getId(), $b->getDamage()); } } } } } }