[1.7.10] Вопросы о генерации

Led

291
3
0
Здравствуйте, уважаемые со-форумцы!
Хотелось бы поднять несколько вопросов, касающихся генерации блока в мире.
Сразу хочу заметить, что код не мой. Потому я прошу не закидывать меня помидорами в связи с правилом 1.1.6.
Я нагло стырил следующий код из Applied Energistics 2.
Код:
    public void generateSurface(World world, Random rand, int chunkX, int chunkZ) {
        for (int i = 0; i < 30; i++)
        {
          int randPosX = chunkX + rand.nextInt(16);
          int randPosY = rand.nextInt(62);
          int randPosZ = chunkZ + rand.nextInt(16);
          (new WorldGenMinable(ModBlocks.BlockLegendaryOre, 4)).generate(world, rand,randPosX, randPosY, randPosZ);
        }
     }

И да, совершенно верно, я не совсем понимаю, как он работает. Я только лишь разобрался, что при изменении 4 в (ModBlocks.BlockLegendaryOre, 4), изменяется размер жилы. Количество совершенных циклов я так понимаю определяет количество жил в чанке. Но, вот rand.nextInt(16), rand.nextInt(62), chunkZ + rand.nextInt(16) вообще не приложу ума к чему относятся.
Сразу же хочу отписаться, есть несколько целей, связанных с генерацией: 
  1. Генерировать блок Легендарной руды (ModBlock.BlockLegendaryOre) в ничтожно малом количестве (1 блок на 5-7 чанков). Желательно вблизи лавы (пока вообще не знаю, как такое провернуть (логика подсказывает изучить цветы, но что-то не нашел пока ничего)).
  2. Генерировать несколько блоков (Гранит, Андезит, Диорит) жилами, подобно тому, как это происходит в 1.8+, но с некоторым отличием: жила должна встречаться редко (1 жила на 5-7 чанков), но она должна быть крупная (100-170 блоков).
  3. Изменить генерацию ванильного золота (уменьшить его количество в 5-10 раз (логика подсказывает по поводу перехвата инвентов ванильной генерации, но опять не въезжаю, куда их крутить (тему про инвенты проштудировал)))
Заранее спасибо.
С Уважением, Led.
 
На такие вопросы и отвечать приятно. Все подробно расписано и понятно.
chunkX и chunkZ - координаты чанка. Чтобы раскидать руду по всему чанку, мы использует рандом.
1. Убери цикл и просто сделай проверку: if(rand.nextInt(7) == 0).
2. Тоже самое, что и в первом пункте.
3. Вроде есть ивент, но я не пробовал.
 
Спасибо большое за ответ, Agravaine!

Сейчас буду пробовать воплощать изложенное тобой.

Появился еще один побочный вопрос - Как ограничивать локализацию генерации по оси ординат?

Заранее Благодарен, Led

________

Вроде все работает.
Но прошу разъяснений: за что отвечает условие
Код:
if(rand.nextInt(7) == 0)

что такое rand.nextInt(7)?
что означает цифра 7?
и почему оно должно быть равно нулю?

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

и еще вопрос - чем манипулировать что бы сделать генерацию жил чаще/реже (я хочу сделать что бы жилы встречались еще более редко)?
 
Это же базовая джава, ты чего?
rand - рандом, nextInt(7) - генерирует случайное число от 0 до 6.
Метод generate вызывается один раз на чанк. Значит шанс заспавниться у руды один к семи.
 
Оу, точно
Спасибо большое, сразу не приметил
Стыдно даже как то за такой вопрос)

Остался ещё вопрос про ограничение локации генерации по оси игрек
А так же генерация вблизи лавы
Заранее спасибо, led.
 
Код:
int randPosY = rand.nextInt(62);
Это отвечает за высоту по Y: от 0 до 61.
А вблизи лавы просто:
Либо сканируй область нужного размера:

Код:
for(int i = -3; i <= 3; i++){
    for(int j = -3; j <= 3; j++){
        for(int k = -3; k <= 3; k++){
            if(world.getBlock(randPosX + i, randPosY + j, randPosZ + k) == Blocks.lava){
                // В радиусе 3 блоков есть лава, значит генерируем руду
            }
        }
    }
}

Либо просто проверяй блоки вокруг.
 
А как генерировать блок с определенным мета?
 
Agravaine написал(а):
У тебя же есть координаты )
От них и отталкивайся)
Подскажи, добрый человек
Что то я совсем не въезжаю в связь с метаайдиблоков и координат
 
Led написал(а):
Код:
          (new WorldGenMinable(ModBlocks.BlockLegendaryOre, 4)).generate(world, rand,randPosX, randPosY, randPosZ);
ModBlocks.BlockLegendaryOre - какой блок генерируется,
4 - количество в жиле,
метадата будет равна 0, и генерироваться будет в камнях.
Но если смотреть WorldGenMinable, то там есть и другие конструкторы.
Код:
          (new WorldGenMinable(ModBlocks.BlockLegendaryOre, 4, 8, Blocks.stone)).generate(world, rand,randPosX, randPosY, randPosZ);
...
8 - метадата,
Blocks.stone - и генерироваться в камнях (для ада в адских камнях - изменить на "Blocks.netherrack", для края в камне края - изменить на "Blocks.end_stone").
 
Спасибо большое!
Очень приятно читать такой понятный и полный ответ
Еще вопрос, а где, кроме как в исходниках, можно подчерпывать такую информацию самостоятельно?
 
Пожалуйста.
Google поиск - "Minecraft Forge Ore Generation", но во-основном я видел только на англоязычных сайтах, то что надо.
 
Назад
Сверху