Не понимаю почему не генерируется блок

Версия Minecraft
1.12.2
103
2
2
Хочу сделать генерацию "кустиков". Пытался переделать генерацию руды чтобы блок который мне надо спавнить был на траве.
Код:
public class ModWorldGen implements IWorldGenerator {

    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
        if (world.provider.getDimension()==0){
            generateOverworld(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
        }
    }


    private void generateOverworld(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider)
    {
        generateOre(BlocksRegister.EVILEMERALDORE.getDefaultState(), world, random, chunkX * 16, chunkZ *16, 16,64,random.nextInt(1)+4, 1);
        generateBlockOnTop(BlocksRegister.BUSH.getDefaultState(), world, random,chunkX * 16, chunkZ *16, 1, 10);
    }

    private void generateOre(IBlockState ore, World world, Random random, int x, int z, int minY, int maxY,int size, int chances)
    {
        int deltaY = maxY - minY;

        for (int i=0; i < chances; i++)
        {
            BlockPos pos = new BlockPos(x + random.nextInt(16), minY + random.nextInt(deltaY), z + random.nextInt(16));

            WorldGenMinable generator = new WorldGenMinable(ore,size);
            generator.generate(world, random, pos);

        }

    }

    private void generateBlockOnTop(IBlockState ore, World world, Random random, int x, int z,int size, int chances)
    {
        int deltaY = calculateGenerationHeight(world, x, z, Blocks.GRASS);

        for (int i=0; i < chances; i++)
        {
            BlockPos pos = new BlockPos(x + random.nextInt(16), deltaY, z + random.nextInt(16) );

            WorldGenMinable generator = new WorldGenMinable(ore,size);
            generator.generate(world, random, pos);

        }

    }

    private static int calculateGenerationHeight(World world, int x, int z, Block topBlock)
    {
        int y = world.getHeight();
        boolean foundGround = false;

        while(!foundGround && y-- >= 0)
        {
            Block block = world.getBlockState(new BlockPos(x,y,z)).getBlock();
            foundGround = block == topBlock;
        }

        return y;
    }
}
Спавн руды работает, а спавн кустика нет.
 
Решение
Во-первых, зачем ты так много раз и столькими разными способами одновременно ищешь блок на поверхности земли?
Для этих целей в мире есть специальный метод world.getActualHeight(x, z) или что-то типа этого. Просто рандомишь горизонтальные координаты и передаёшь ему. Он находит тебе самую высокую точку.
Затем проверяй её на траву и всё.
Во-вторых, ты ставишь свой куст прямо в воздух, не проверяя есть ли под ним основа. Возможно, он просто не может стоять без неё.
В-третьих, ты уверен, что кусты не спавнятся? Возможно стоит поставить в цикле большее число?

Ты не прочитал основы java перед тем как начинать моддить
:m_faceplam:
4,046
63
645
Потому что спавн руды по умолчанию заменяет блоки камня, а кусты должны расти "в воздухе".
Лучше смотри как сухой куст генерируется.

И не нужно каждый раз создавать новый генератор, да ещё и в цикле.
Создай его один раз в теле класса и пользуйся.
 
103
2
2
Потому что спавн руды по умолчанию заменяет блоки камня, а кусты должны расти "в воздухе".
Лучше смотри как сухой куст генерируется.

И не нужно каждый раз создавать новый генератор, да ещё и в цикле.
Создай его один раз в теле класса и пользуйся.

Я посмотрел код сухого куста и попытался написать это:
generateBlockOnTop(world, random, chunkX*16, chunkZ*16);
Java:
private void generateBlockOnTop(World worldIn, Random rand,int x,int z)
    {
        int y=calculateGenerationHeight(worldIn, x, z, Blocks.GRASS);

        BlockPos position = new BlockPos(x + rand.nextInt(16), y + rand.nextInt(y), z + rand.nextInt(16));
        for (IBlockState iblockstate = worldIn.getBlockState(position); (iblockstate.getBlock().isAir(iblockstate, worldIn, position) || iblockstate.getBlock().isLeaves(iblockstate, worldIn, position)) && position.getY() > 0; iblockstate = worldIn.getBlockState(position))
        {
            position = position.down();
        }

        for (int i = 0; i < 4; ++i)
        {
            BlockPos blockpos = position.add(rand.nextInt(8) - rand.nextInt(8), rand.nextInt(4) - rand.nextInt(4), rand.nextInt(8) - rand.nextInt(8));

            if (worldIn.isAirBlock(blockpos))
            {
                worldIn.setBlockState(blockpos, BlocksRegister.EVILEMERALDBLOCK.getDefaultState(), 2);
            }
        }

    }
но это не работает, что я делаю не так?
 
5,021
47
784
4,046
63
645
Во-первых, зачем ты так много раз и столькими разными способами одновременно ищешь блок на поверхности земли?
Для этих целей в мире есть специальный метод world.getActualHeight(x, z) или что-то типа этого. Просто рандомишь горизонтальные координаты и передаёшь ему. Он находит тебе самую высокую точку.
Затем проверяй её на траву и всё.
Во-вторых, ты ставишь свой куст прямо в воздух, не проверяя есть ли под ним основа. Возможно, он просто не может стоять без неё.
В-третьих, ты уверен, что кусты не спавнятся? Возможно стоит поставить в цикле большее число?

Ты не прочитал основы java перед тем как начинать моддить
:m_faceplam:
 
103
2
2
Во-первых, зачем ты так много раз и столькими разными способами одновременно ищешь блок на поверхности земли?
Для этих целей в мире есть специальный метод world.getActualHeight(x, z) или что-то типа этого. Просто рандомишь горизонтальные координаты и передаёшь ему. Он находит тебе самую высокую точку.
Затем проверяй её на траву и всё.
Во-вторых, ты ставишь свой куст прямо в воздух, не проверяя есть ли под ним основа. Возможно, он просто не может стоять без неё.
В-третьих, ты уверен, что кусты не спавнятся? Возможно стоит поставить в цикле большее число?

Я получение высоты взял из своего спавна деревьев. Куст у меня был без свойств как обычный блок. После того как ты написал мне про world.getActualHeight() у меня всё заработало, только кусты спавнились в воздухе, но я потом в кусте написал код чтобы они в воздухе не были и я получил то что хотел.
Я проверяю появились ли нужные блоки руды, деревьев и т.д. через мод на xray, я в него заношу свои блоки и летаю по миру в поисках.

Спасибо что помог.
 
Сверху