@Override
	public void populate(World world, Random random, Chunk source) {
		ChunkSnapshot snapshot = source.getChunkSnapshot();

		for (int i = 0; i < ITERATIONS; i++) {
			if (random.nextInt(100) < TORCH_CHANCE) {
				attemptloop: for (int j = 0; j < ATTEMPTS; j++) {
					int x = random.nextInt(16);
					int z = random.nextInt(16);
					int y = snapshot.getHighestBlockYAt(x, z);
					if (y < 19) {
						continue;
					}
					y = random.nextInt(y - 18) + 18;

					Block base = source.getBlock(x, y, z);
					for (BlockFace direction : directions) {
						if (base.getRelative(direction).getType() == Material.AIR) {
							base.getRelative(direction).setType(Material.TORCH);
							break attemptloop;
						}
					}
				}
			}
		}
	}