Генерация структур
Генерация структур
В этом уроке я напишу, как генерировать структуры в inner core. Мы будем генерировать факел ниже примерно в каждом 50 чанке.
Для начала нужно создать функцию, которая будет устанавливать по переданным ей координатам структуру:
function buildBigTorch(x, y, z) { World.setBlock(x, y, z, 98); World.setBlock(x, y + 1, z, 98); World.setBlock(x, y + 2, z, 87); World.setBlock(x, y + 2, z, 51); World.setBlock(x + 1, y + 2, z, 98); World.setBlock(x - 1, y + 2, z, 98); World.setBlock(x, y + 2, z + 1, 98); World.setBlock(x, y + 2, z - 1, 98); } |
Сама генерация происходит с помощью колбека «GenerateChunk». При генерации нового чанка он срабатывает и передаёт координаты начала чанка. Для того чтобы факел из блоков не появлялся в каждом чанке необходимо испольлзовать Math.random(). Каждый 50 чанк это 1/50 — 2%. Стоит сказать, что это не значит, что факел будет генерироваться ровно каждые 50 чанков, так как это определяется случайно, но если брать много факелов, то в среднем они будут генерироваться раз в 50 чанков. Ниже код, с помощью которого будет происходить генерация с вероятностью 2%:
if (Math.random() < 1/50) {} |
Теперь нужно научится находить случайные координаты внутри чанка. Функция Math.random() возвращает значение от 0 до 1, НЕ включая 1. [0;1). Также важно сказать, что координаты чанка отличаются от мировых, и высчитываются по формуле: Math.floor(мировые координаты/16), то есть делённые на 16 и округлённые в меньшую сторону координаты блоков. Это можно использовать при получении случайных координат — умножаем на размер чанка и округляем в меньшую сторону:
var x = chunkX*16 + Math.floor(Math.random() * 16); var z = chunkZ*16 + Math.floor(Math.random() * 16); |
Необходимо чтобы факел генерировался прямо на поверхности, а не где-то под землёй. Для определения поверхности мы используем цикл while и переменную y. При каждой итерации (читай повторении) от переменной будет отниматься 1. Как только блок под этими координатами можно будет считать землёй, цикл перестанет выполнятся и мы сгенерируем структуру. Изначально переменная y = 200 — высота с которой начнётся проверка, выбрал её для того, чтобы не проверять лишние 56 блоков, где гарантировано не может быть поверхности. Также напишем, чтобы переменная y не была меньше 0, на случай, если так и не будет найден блок земли, травы или камня.
var y = 200; var blockID = World.getBlock(x, y - 1, z).id; while(blockID != 3 && blockID != 2 && blockID != 1 && y>0) { blockID = World.getBlock(x, y - 1, z).id; y--; } |
Поверхностью мы считаем или землю, или траву или блок камня. Теперь просто вызовем функцию постройки факела:
buildBigTorch(x, y, z); |
Вот и всё, это действительно очень просто, ниже весь код.
function buildBigTorch(x, y, z) { World.setBlock(x, y, z, 98); World.setBlock(x, y + 1, z, 98); World.setBlock(x, y + 2, z, 87); World.setBlock(x, y + 2, z, 51); World.setBlock(x + 1, y + 2, z, 98); World.setBlock(x - 1, y + 2, z, 98); World.setBlock(x, y + 2, z + 1, 98); World.setBlock(x, y + 2, z - 1, 98); } Callback.addCallback("GenerateChunk", function(chunkX, chunkZ) { if (Math.random() < 1/50) { blockID = World.getBlock(x, y - 1, z).id; y--; } buildBigTorch(x, y, z); }); |
Comments