Проблемы с условием генерации структур

Версия Minecraft
1.12.1
Доброго времени суток. Проблема следующая, не могу настроить условия для генерации структуры. Например, я хочу чтобы структура находилась в воде (как ванильный Подводный Храм), но сделать это своими силами не получается. Обучался по видео на youtube, в целом там парень показал как генерировать свои структуры, но видимо тех знаний мне не хватает.

Вот код:

public class TestStructureGenerator implements IWorldGenerator {

   //@formatter:eek:ff

   TestHouse TestHouse = new TestHouse();

   //@formatter:eek:n

   @Override
   public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
       switch (world.provider.getDimension()) {
           case 0: //Overworld
               this.runtestGenerator(world, random, chunkX, chunkZ);
               break;

           case -1: //Nether

               break;

           case 1: //End

               break;
       }
   }

   public void runtestGenerator(World world, Random random, int chunkX, int chunkZ) {
       int x=chunkX * 16 + random.nextInt(16);
       int z=chunkZ * 16 + random.nextInt(16);
       int xy=x >> 4;
       int zy=z >> 4;
       int height=world.getChunkFromChunkCoords(xy, zy).getHeight(new BlockPos(x & 15, 0, z & 15));
       int y=height;

       if (world.getBlockState(new BlockPos(x, y, z)).getBlock() == (Blocks.GRAVEL)) {

           if (world.getBiome(new BlockPos(x, y, z)).getBiomeClass().equals(BiomeOcean.class)) {

               if ((random.nextInt(100) + 1) <= 100) {

                   boolean place=true;

                   for (int j=0; j < 7; j++) {
                       for (int k=0; k < 13; k++) {
                           for (int i=0; i < 4; i++) {
                               if (world.getBlockState(new BlockPos(i + x, j + y + 1, k + z)).getBlock() != Blocks.AIR) {
                                   place=false;
                               }
                           }
                       }
                   }
                   if (place) {
                       TestHouse.generate(world, random, new BlockPos(x, y, z));
                   }
               }
           }
       }
   }
}


Сама по себе генерация работает, например тестил "В пустыне" нормально все генерируется, там всё просто.. Поставил условие getBlockState - Blocks.Sand, биом Desert, и в принципе всё. Но под водой так не проканывает.
Сорри если была такая тема, ввёл в поиске ничего не нашёл. Кто может помочь, не проходите пожалуйста мимо. Буду очень благодарен
 
3,005
192
592
У тебя проверка на блоки воздуха:
if (world.getBlockState(new BlockPos(i + x, j + y + 1, k + z)).getBlock() != Blocks.AIR)
Поставь на блоки воды.
Но там вроде не getBlock() != Blocks.AIR, а через материал.
(Точно не знаю, загугли.)
 
Doc написал(а):
У тебя проверка на блоки воздуха...

Хм.. Если начистоту, даже не знаю какой запрос в гугле вводить. А насчёт материала пробовал вот так:
.getMaterial() != Material.WATER)

- ноль реакции. Убирал это условие совсем, тоже ноль реакции...
 
3,005
192
592
".getMaterial() != Material.WATER" - если материал у блока НЕ вода.
А не чего, что в океане есть вода?
И что спавнить тоже нужно в воде. А ты проверяешь, что воды там нету.
(Замени на ==.)
 
Doc написал(а):
".getMaterial() != Material.WATER" - если материал у блока НЕ вода...

Не чел, это не та проверка.. Это же условие, чтобы структура НЕ генерировалась на блоках воды, или блоках воздуха в мире. Или я не прав?
P.S: Заменял на ==, ничего.
 
3,005
192
592
boolean place=true;
Если булеан place - тру - то структура может сгенерироваться.
Если false - то не может.
Вот у тебя через for проверка, что там блоки воды и что структура может сгенерироваться.
А если там не вода - то он делает false, значит структура не может сгенерироваться.
 
3,005
192
592
Попробуй вообще убрать for'ы и place = false, потом зайти, посмотри. Должны появиться.
 
Doc написал(а):
Попробуй вообще убрать for'ы и place = false, потом зайти, посмотри. Должны появиться.

Ммм.. Не помогло. Убрал вроде всё что не нужно, код такой:

if (world.getBlockState(new BlockPos(x, y, z)).getBlock() == (Blocks.GRAVEL)) {

           if (world.getBiome(new BlockPos(x, y, z)).getBiomeClass().equals(BiomeOcean.class)) {

               if ((random.nextInt(100) + 1) <= 100) {

                   boolean place=true;

                   if (place) {
                       TestHouse.generate(world, random, new BlockPos(x, y, z));
                   }
               }
           }
       }
   }
}


Но ничего не сгенерировалось. Печаль. Может я не всё убрал?
 
3,005
192
592
После
world.getBlockState(new BlockPos(x, y, z)).getBlock() == (Blocks.GRAVEL)
Поставь вывод в консоль чего-либо, если будет выводиться - то странно, если не будет - то что-то с высотой.
 
3,005
192
592
world.setBlockState(new BlockPos(0,250,0), Blocks.STONE.getDefaultState);
Летаешь по миру над океаном, после тп на 0 250 0, если там есть блок камня - то знаешь, что код работает. Если нету - то код не работает.
(Ну а так, есть java вывод.. Но это уже другая история.)
 
Doc написал(а):
Если нету - то код не работает...

Нет.. Полетал над океаном (там такая генерация мира, что вокруг точки спавна только один океан и есть), тпшнулся, ничего. Слушай.. Но сам код в первоначальном виде работает.. точно говорю. Есть доказательства) Первый скриншот это собственно генерация в пустыне, а второй, если не ставить условие

if (world.getBlockState(new BlockPos(x, y, z)).getBlock() == (Blocks.GRAVEL)) {

То получается вот такая ерунда над морем. Но не в воде

P.S: С частотой генерации переборщил
 

Вложения

  • 2017-09-17_12.43.33.jpg
    2017-09-17_12.43.33.jpg
    297.4 KB · Просмотры: 11
  • 2017-09-17_17.00.41.jpg
    2017-09-17_17.00.41.jpg
    296.5 KB · Просмотры: 13
Сверху