Генерация структур

Генерация структур

В этом уроке я напишу, как генерировать структуры в 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);
});
This entry was posted in InnerCore. Bookmark the permalink.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *