Over долгая генерация, а то и вовсе виснет.

Версия Minecraft
1.7.10
5,018
47
783
Народ, есть такой код ворлгена. 
Код:
 private void generateSurface(World world, Random random, int x, int z) {
 for (int y = 1; y < world.getHeight(); ++y) {
 for (int x1 = x; x1 < x + 8; ++x1) {
 for (int z1 = z; z1 < z + 8; ++z1) {


 int ranZ1 = random.nextInt(7) - 2;

 if (world.getBlock(x1, y - 1, z1 + ranZ1) == Blocks.grass && world.isAirBlock(x1, y, z1 + ranZ1))
 if (world.getBlock(x1 + 1, y, z1 + ranZ1) == Blocks.log && world.getBlockMetadata(x1 + 1, y, z1 + ranZ1) == 0 && world.isAirBlock(x1 + 1, y, z1)){
 world.setBlock(x1, y , z1 + ranZ1, MyBlocks.underOakMushroom);
 }

 if (world.getBlock(x1, y - 1, z1 + ranZ1) == Blocks.grass && world.isAirBlock(x1, y, z1 + ranZ1))
 if (world.getBlock(x1, y, z1 + ranZ1) == Blocks.log && world.getBlockMetadata(x1 + 1, y, z1 + ranZ1) == 2 && world.isAirBlock(x1 + 1, y, z1)){
 world.setBlock(x1, y, z1 + ranZ1, MyBlocks.mushroomBirchMushroom);
 }
 }
 for (int z1 = z; z1 < z + 3; ++z1) {
 int ranZ1 = random.nextInt(10) - 2;
 int ranX1 = random.nextInt(10) - 2;
 if (world.getBiomeGenForCoords(x1, z1) == BiomeGenBase.forest || world.getBiomeGenForCoords(x1, z1 + 1) == BiomeGenBase.forestHills
 || world.getBiomeGenForCoords(x1, z1) == BiomeGenBase.birchForestHills || world.getBiomeGenForCoords(x1 + 1, z1) == BiomeGenBase.birchForest) {
 if (world.getBlock(x1, y - 1, z1 + ranZ1) == Blocks.grass && world.getBlock(x1, y + 1, z1) == Blocks.air && world.isAirBlock(x1 + 1, y, z1))
 {
 world.setBlock(x1 + 2, y, z1 + ranZ1, MyBlocks.whiteMushroom);
 world.setBlock(x1 - 2, y, z1 + ranZ1, MyBlocks.gruzdMushroom);
 world.setBlock(x1 + ranX1, y, z1 + 1, MyBlocks.opyataMushroom);
 world.setBlock(x1 + ranX1 , y, z1 + ranZ1, MyBlocks.masloMushroom);

 }

 }
 


 if (world.getBiomeGenForCoords(x1, z1) == BiomeGenBase.taiga || world.getBiomeGenForCoords(x1, z1 + 1) == BiomeGenBase.taigaHills
 )
 { 
 if (world.getBlock(x1, y - 1, z1 + ranZ1) == Blocks.grass && world.getBlock(x1, y + 1, z1) == Blocks.air)
 if (world.getBlock(x1 + 1, y, z1 + ranZ1) == Blocks.log && world.isAirBlock(x1 + 1, y, z1))
 world.setBlock(x1 + 3, y, z1 + ranZ1, MyBlocks.underElovMushroom);
 world.setBlock(x1 - 2, y, z1 + 3, MyBlocks.underSosnovMushroom);
 }
 }
 }
 }
 }
}

Все работает, ну уж очень медленно, а если ввести рандомную x1 то и вовсе можно по 10 минут ждать. ПОмогите, можно ли это как то оптимизировать?
 
2,505
81
397
Можно. Расстановка ифоф ужасна. Ты один и тот же блок по несколько раз проверяешь на траву и прочее. Также, не думаю, что хорошая идея начинать проход по у с самого неба. В чанке или где-то еще, не помню, должна быть переменная отвечающая за максимально высокий блок. Проверять блоки до самого низа мира тоже не стоит. Под камнями деревья уже не растут, а если и растут, то на них можно забить. Таким образом, ты обрежешь очень приличную область поиска, процентов 90
 
5,018
47
783
Dahaka написал(а):
Можно. Расстановка ифоф ужасна. Ты один и тот же блок по несколько раз проверяешь на траву и прочее. Также, не думаю, что хорошая идея начинать проход по у с самого неба. В чанке или где-то еще, не помню, должна быть переменная отвечающая за максимально высокий блок. Проверять блоки до самого низа мира тоже не стоит.  Под камнями деревья уже не растут, а если и растут, то на них можно забить. Таким образом, ты обрежешь очень приличную область поиска, процентов 90

Можно, поточнее, пожалуйста, что за переменная ,где ее искать, и как ее использовать?
 
5,018
47
783
Dahaka написал(а):
В чанке, скорее всего. Чанк можно достать из мира. Использовать также, как и любые другие.

Не пойму, ты имеешь ввиду, лезть в ванильный класс с чанком?

p.s чтобы я не делал. Он почему то виснет на 82% или 83% генерации мира
 
5,018
47
783
608
5
15
А ещё покопайся у меня в темах, там должен быть код для того что-бы из чанка доставать массив блоков (таким образом мы не будем по 100 раз доставать чанк через getBlock/setBlock и нагрузка значительно понизится)
 
Сверху