Генерация слоистых плато (1.7.10)

4,167
68
693
Здравствуйте всем...
Продолжаю мучить генерацию...
Придумал себе задачку такую, что даже объяснить трудно...
Попробую:

В общем, надобно сгенерировать плоские каменные плато с определёнными рудами внутри и верхним слоем кастомных блоков. Причём руды должны концентрироваться у самого верха этого плато под кастомным слоем.


Собственно, вопросы следующие:
1. Может кто-нибудь подсказать оптимальную последовательность генерации подобной структуры? Проще сгенерировать каменный холм (знает кто-нибудь как генерируются холмы?) и срезать его на уровне 63 блока или выбрать точку на поверхности и образовать вокруг неё каменную плюху с рудами?
2. Каким образом сделать так, чтобы данные плато генерировались только на равнинах (то есть на поверхности), а не внутри гор или холмов? (по сути, это должно напоминать озёра только каменные).
3. Каким образом напихать в эту структуру нужные руды и задать их концентрацию у поверхности? Возможно стоит генерировать всё вместе за один заход, ибо не представляю как потом выяснить моя ли эта структура или обычный выход камня на поверхность.

Спасибо.
 
Я вроде как понял.
Послойное строение разных пород камей. Чтобы в определённое породе камней, генерировалась определённые руды.
А так-же помимо подземных пород камней, генерировались различные структуры: вулканы, горы и т.п..
Подобия генерации из мода TFC (я подробно не знаю как именно генерируется в этом моде, но для примера думаю, можно посмотреть [код open source]).
 
Ну... И всё же не совсем ) Я даже, пожалуй, знаю, как сгенерировать определённые руды в определённой породе камней... Тут ничего сложного быть не должно... Но мне нужно генерировать породы в обычном камне, но в конкретной его структуре...

Тут скорее нужно смотреть генерацию озёр лавы, ведь есть лава, а есть вокруг неё слой камня... (пока нет возможности заглянуть в прогу, к сожалению).

Пожалуй, воспользуюсь советом Agravaine и вечером выложу скрин... Сразу всё станет ясно )
 
В общем, структура должна быть какая-то такая:
IF32Kzmbb9c.jpg


Драгоценные блоки взял для наглядности )))
То есть это плоская местность с верхним слоем из одного блока и рудами, концентрирующимися кверху. При этом камень в этом месте должен образовывать что-то на подобии возвышения (не должно быть земли).
[merge_posts_bbcode]Добавлено: 17.06.2015 21:45:15[/merge_posts_bbcode]

Хотя, на самом деле, мысля есть, как это можно сделать... Ща попробую.
 
Можно сделать счетчик слоев от шапки. Чем дальше слой, тем меньше вероятность генерации руды.
 
Произвольной формы - это какой? Можно генерировать уже готовые фигуры с разным радиусом или размером, такие как цилиндры / сферы / треугольники / квадраты.
 
WorldEdit - Отличный OpenSource пример. Вот метод, который генерирует цилиндр, да еще и принимает параметры. Перевести на фордж будет не трудно, так как этот код из ядра WE, которое одно и для WE в виде плагина, и для WE в виде мода на фордж.
 
Кстати, делюсь результатами труда )))

Вместо того, чтобы генерировать геометрические фигуры решил пойти кривым другим путём и выращивать структуру прямо по месту в несколько этапов )))

Код:
public void generateOverworld(World world, Random rand, int X1, int Z1) {
        
int rad = 20; /*Это примерный размер солончака*/
        
int randPosX = X1 + rand.nextInt(16);
int randPosZ = Z1 + rand.nextInt(16);
        
if (rand.nextInt(5) == 0){ /*Частота их появления*/
            
for (int randPosY = 60; randPosY < 75; randPosY++){ /*Здесь я выбираю место для начальной точки роста*/

if ((world.getBlock(randPosX, randPosY, randPosZ) == Blocks.grass ||
     world.getBlock(randPosX, randPosY, randPosZ) == Blocks.stone) &&
     world.getBlock(randPosX - 2, randPosY, randPosZ).getMaterial().isSolid() &&
     world.getBlock(randPosX + 2, randPosY, randPosZ).getMaterial().isSolid() &&
     world.getBlock(randPosX, randPosY, randPosZ - 2).getMaterial().isSolid() &&
     world.getBlock(randPosX, randPosY, randPosZ + 2).getMaterial().isSolid() &&
     world.getBlock(randPosX, randPosY - 3, randPosZ).getMaterial().isSolid() &&
     world.getFullBlockLightValue(randPosX, randPosY + 1, randPosZ) >= 13 &&
     world.getFullBlockLightValue(randPosX - 2, randPosY + 1, randPosZ) >= 13 &&
     world.getFullBlockLightValue(randPosX + 2, randPosY + 1, randPosZ) >= 13 &&
     world.getFullBlockLightValue(randPosX, randPosY + 1, randPosZ - 2) >= 13 &&
     world.getFullBlockLightValue(randPosX, randPosY + 1, randPosZ + 2) >= 13){

     world.setBlockToAir(randPosX, randPosY + 1, randPosZ); /*Это для того, чтобы повсюду не валялись семечки, выпавшие с травы )))*/
     world.setBlockToAir(randPosX, randPosY - 1, randPosZ);
     world.setBlock(randPosX, randPosY - 2, randPosZ, SaltMod.saltLake);
            
     for (int i = 2; i < rad; i++){ /*Количество итераций (проходок) чуть меньше указанного размера солончака, чтобы оставалось место для оформления берегов*/
                
     for (int x = randPosX - rad; x < randPosX + rad; x++) {
     for (int z = randPosZ - rad; z < randPosZ + rad; z++) { /*Сканируемая зона. Размер солончака здесь является своеобразным радиусом охвата. Затем с вероятностью 33,3% наращиваю у начальной точки по любому техническому блоку с каждой стороны*/
                
     if (rand.nextInt(2) == 0 &&
         world.getBlock(x - 1, randPosY, z).getMaterial().isSolid() &&
         world.getBlock(x + 1, randPosY, z).getMaterial().isSolid() &&
         world.getBlock(x, randPosY, z - 1).getMaterial().isSolid() &&
         world.getBlock(x, randPosY, z + 1).getMaterial().isSolid() &&
         world.getBlock(x, randPosY - 3, z).getMaterial().isSolid() &&
         world.getFullBlockLightValue(x, randPosY + 1, z) >= 14 &&
        (world.getBlock(x - 1, randPosY - 2, z) == SaltMod.saltLake ||
         world.getBlock(x + 1, randPosY - 2, z) == SaltMod.saltLake ||
         world.getBlock(x, randPosY - 2, z - 1) == SaltMod.saltLake ||
         world.getBlock(x, randPosY - 2, z + 1) == SaltMod.saltLake))
        {
             world.setBlockToAir(x, randPosY + 1, z);
             world.setBlockToAir(x, randPosY - 1, z);
             world.setBlock(x, randPosY - 2, z, SaltMod.saltBlock);
        }
     }
  }

  for (int x = randPosX - rad; x < randPosX + rad; x++) {
  for (int z = randPosZ - rad; z < randPosZ + rad; z++) { /*Ну а тут технический блок заменяю на нужный мне*/
            
   if (world.getBlock(x, randPosY - 2, z) == SaltMod.saltBlock)
      {
           world.setBlock(x, randPosY - 2, z, SaltMod.saltLake);
      }
   }
}
}
/*Затем вся эта ботва повторяется столько раз, каков указанный размер*/
/*Далее следует долгое кропотливое оформление берегов и внутренностей солончака, которое я приводить не буду*/

Да... Знаю, что метод кривоват и затратен в смысле скорости, но он даёт достаточно натуральные на вид структуры )))

Возможно, кто-нибудь подскажет как его можно оптимизировать.

Ну а выглядит это всё так:
w2Wd7EfLM9g.jpg

JDm263zUsPM.jpg

v1ri6rboH4I.jpg

nn-4pb1eeeo.jpg

jimMkuh1H2A.jpg

[merge_posts_bbcode]Добавлено: 23.06.2015 01:22:11[/merge_posts_bbcode]

Вот теперь думаю, надо бы, чтобы следы соли оставались и на стенках... В связи с этим вопрос: как лучше это реализовать?

1. Создать блок с моделью, у которого будут бортики, появляющиеся при наличии рядом других блоков (как у забора)?
2. Создать технический прозрачный блок, появляющийся над блоком солончака и отвечающий за следы соли (по типу лиан)?
3. Воздействовать солончаком на текстуру соседних блоков, наслаивая на них следы соли? Как бы это сделать?
4. Создать блок солёной земли, солёного камня, солёного бог знает чего ещё и размещать из по соседству?
5. Тупо забить?

Голосование пошло )))
 
Переместить соль, что не в камне, в отдельный блок - по-моему, хорошая идея. Только пусть не роется лопатой, ИРЛ обычно формируется достаточно прочный камень(Ну или наносы на камнях, если озеро слабое).
 
Именно наносы я и имел ввиду )
А отдельный блок имеется ввиду вариант 2 или вариант 4?

Я тут подумал, создам ка блок засоленной земли и распихаю по периметру. Только вот, если по соседству не земля, эффекта не будет.
 
Блин, просто при генерации проверь какую сторону блока надо окрасить в соль (Если воздух)
 
svk написал(а):
Блин, просто при генерации проверь какую сторону блока надо окрасить в соль (Если воздух)

Сторону какого блока? Возможно красить соседние блоки?
Как я понимаю, для этого нужно создавать свой блок, пихать его по периметру и уже его сторону окрашивать.

А если имеется ввиду вариант 2, то создавать прозрачный блок не хочется, ибо кое-где на солончаке формируются кристаллы соли. И там, где они растут, этот блок разместить не удастся, следовательно и окраски берегов тоже не будет.

Liahim написал(а):
Только вот, если по соседству не земля, эффекта не будет.

А про соседство я другое имел ввиду... Землю-то я создам и покрашу... Но вот если к берегу подходит пласт камня, то странно будет выглядеть рядом засоленная земля и чистенький камень. А создавать для этого ещё и камень с разводами как-то глупо.
 
Liahim написал(а):
Именно наносы я и имел ввиду )
А отдельный блок имеется ввиду вариант 2 или вариант 4?

Я тут подумал, создам ка блок засоленной земли и распихаю по периметру. Только вот, если по соседству не земля, эффекта не будет.

Лучше 2. Универсальнее будет.
 
Назад
Сверху