Генерация 1.12.2 (консультация)

Версия Minecraft
1.12.2
Всем салют. Вопрос такой - надо генерировать камушки на поверхности. До этого писал подобное под версию 1.7.10, теперь испытываю некоторые трудности.
Логика генератора, как я понимаю, теперь строится на том, что генератор теперь не может просто ставить блок, а что-то им заменяет. Так или иначе прошу совета, как это можно написать лучше (мы же за развитие навыков, верно?=) ), ибо этот код работает, но мне не нравится, как я его написал.
А еще там есть типо ошибка в консоли, которая как бы не ошибка, но неприятно ее видеть.
Код:
[19:21:12] [Server thread/WARN] [FML]: Tutorial Mod loaded a new chunk [11, 3] in dimension 0 (overworld) while populating chunk [12, 4], causing cascading worldgen lag.
[19:21:12] [Server thread/WARN] [FML]: Please report this to the mod's issue tracker. This log can be disabled in the Forge config.
[19:21:12] [Server thread/WARN] [FML]: Tutorial Mod loaded a new chunk [10, 3] in dimension 0 (overworld) while populating chunk [11, 3], causing cascading worldgen lag.
[19:21:12] [Server thread/WARN] [FML]: Please report this to the mod's issue tracker. This log can be disabled in the Forge config.
[19:21:12] [Server thread/WARN] [FML]: Tutorial Mod loaded a new chunk [9, 3] in dimension 0 (overworld) while populating chunk [11, 3], causing cascading worldgen lag.
[19:21:12] [Server thread/WARN] [FML]: Please report this to the mod's issue tracker. This log can be disabled in the Forge config.
[19:21:12] [Server thread/WARN] [FML]: Tutorial Mod loaded a new chunk [8, 3] in dimension 0 (overworld) while populating chunk [9, 3], causing cascading worldgen lag.
[19:21:12] [Server thread/WARN] [FML]: Please report this to the mod's issue tracker. This log can be disabled in the Forge config.
[19:21:12] [Server thread/WARN] [FML]: Tutorial Mod loaded a new chunk [7, 3] in dimension 0 (overworld) while populating chunk [9, 3], causing cascading worldgen lag.
[19:21:12] [Server thread/WARN] [FML]: Please report this to the mod's issue tracker. This log can be disabled in the Forge config.
Код:
switch (world.provider.getDimension())
{
    case 0:
        runGenGround(ModBlocks.tutorialMultiOre.getDefaultState(), 1, 8, 1, 255, BlockMatcher.forBlock(Blocks.AIR), world, random, chunkX, chunkZ);
        break;
}

private void runGenGround(IBlockState blockToGen, int blockAmount, int chancesToSpawn, int minHeight, int maxHeight, Predicate<IBlockState> blockToReplace, World world, Random rand, int chunk_X, int chunk_Z) {
    if (minHeight < 0 || maxHeight > 256 || minHeight > maxHeight)
        throw new IllegalArgumentException("Illegal Height Arguments for WorldGenerator");
    WorldGenMinable generator = new WorldGenMinable(blockToGen, blockAmount, blockToReplace);
    for (int i = 0; i < chancesToSpawn; i++) {
        int x = chunk_X * 16 + rand.nextInt(16);
        int y = maxHeight;
        int z = chunk_Z * 16 + rand.nextInt(16);

        /*
             * Generate blocks on ground
             * 1 - check, if current block is AIR
             * 2 - check, if block under AIR is GRASS
             * 3 - move "checker" down, return to pos 2
             * 4 - if 2 is true - set block to ore
             *
             * not using generator, use world.set
             *
             * */
        Block currentBlock = world.getBlockState(new BlockPos(x, y, z)).getBlock();
        if (currentBlock.equals(Blocks.AIR)) {
            for (int j = 255; j > 0; j--) {
                Block searchedBlock = world.getBlockState(new BlockPos(x, j, z)).getBlock();
                if (searchedBlock.equals(Blocks.GRASS)) {
                    //generator.generate(world, rand, new BlockPos(x, y, z));
                    world.setBlockState(new BlockPos(x, j += 1, z), ModBlocks.tutorialMultiOre.getDefaultState());
                    break;
                }
            }
        }

    }
}
1561566593215.png
 
4,045
63
645
Для развитие навыков вот тебе статейка. Сразу поймёшь из-за чего ошибка и как её решить:
Исследование экстремальных лагов во время генерации мира.
Теперь по поводу кода.
1. Не нужно каждый раз отсчитывать от максимальной высоты. Я уже отвечал кому-то в прошлый раз, что в мире есть спец метод для нахождения самой высокой точки world.getActualHeight(x, z); (тебе же нужна трава, верно? Она, как правило, и есть самая высокая)... Находишь высшую точку, проверяешь на траву, ставишь блок. Фсё.
2. Чтобы указать блокпозу выше выбранной не обязательно создавать её вручную, можно написать pos.up(); // или up(число);

И да... Ты зачем-то создал генератор руды, и нигде его не используешь.
 
Последнее редактирование:
1,057
50
234
int x = chunk_X * 16 + rand.nextInt(16) + 8;
int z = chunk_Z * 16 + rand.nextInt(16) + 8;
 
7,099
324
1,510
7,099
324
1,510
Так если вылезет, то будет каскадная генерация. Тот код не проверяет с какой стороны соседние чанки загружены, а всегда сдвигает в положительную сторону
 
7,099
324
1,510
Вообще-то это зависит от ядра. Например, ультрамайн загружает вокруг игрока с приоритетом на видимость, а не просто "с востока на запад-с юга на север"
 
Спасибо за ответы. Текущая ситуация:
Вопрос с WARN'ами решил, спасибо @Liahim за его ссылку про каскадную генерацию. Так же спасибо @CMTV
Вопрос с перебором не решил. Не могу понять, как пользоваться world.getActualHeight()
Проблема в том, что y = world.getActualHeight(new BlockPos(x, 0, z)); использовать таким образом нельзя, как сказал @BlesseNtumble , ибо этот метод аргументы не принимает, но тогда вопрос, как это применять касательно x и z? Или pos. Не могу же я ему сказать "вычисли мне высоту", мне нужно "вычисли мне высоту на таких-то координатах ширины и долготы. В общем не догоняю, подскажите =D
 
7,099
324
1,510
Сверху