Рецепты
Предметы в игре, помимо того что могут быть просто найдены в различных структурах, создаются на верстаке, переплавляются в печи или получаются в результате работы механизмов и ритуалов. Все кроме последнего должно быть зарегистрировано как рецепт, который сейчас будет рассмотрен.
Форма и ее отсутствие
Здесь все просто. Либо форм есть, либо те же предметы можно хаотично расскидать по слотам крафта (создания) и получить результат. К бесформенным рецептам можно отнести красители, зажигалку, вагонетки с сундуками, воронками и прочее. Остальные же, имеют форму и должны быть расположены с предопределенным сочетанием слотов.
Любой рецепт определяет предметы, которое должны находиться в сетке крафта. Для бесформенных рецептов списка в виде массива из предметов будет достаточно. Что же касается имеющих форму, необходимо предоставить игре паттерн (шаблон). Паттерн заполняет ячейки сетки крафта, образуя собой форму рецепта.
Представим, что у нас появилась необходимость добавить рецепт для двери. Зачем создавать дверь из досок, если можно использовать для этого палки?
[
[VanillaItemID.stick, VanillaItemID.stick],
[VanillaItemID.stick, VanillaItemID.stick],
[VanillaItemID.stick, VanillaItemID.stick]
]
Так выглядит паттерн рецепта, если представить его в виде двумерного массива из идентификаторов. Вроде неплохо, но зачем дублировать один и тот же идентификатор шесть раз. Разработчики игры, вероятно, подумали также, благодаря чему помимо паттерна к нам приходит понятие маски.
Маска определяет ключевые ссылки для паттерна. Несовсем понятно? Давайте рассмотрим это на примере.
// вот маска
{
s: VanillaItemID.stick
}
// а вот и паттерн, основанный на маске
[
"ss",
"ss",
"ss"
]
Маска позволяет задать список предметов для его последующего использования в паттерне. Ключи представляют собой символ, он не должен повторяться и обычно выделяет начало идентификатора. Думаю, можно переходить к практическому применению.
Крафтинг
Внутреигровой верстак представляет собой сетку крафта из слотов 3x3, сам игрок же может использовать собственный инвентарь для создания предметов и блоков в сетке 2x2. Это основная игровая механика, вокруг которой выстроена большая часть рецептов.
Бесформенный
Итак, вам неважно в какой последовательности будут распологаться предметы в слотах. Для добавления таких рецептов используются методы:
Recipes.addShapeless({
id: VanillaItemID.diamond, count: 1, data: 0
}, [
{ id: VanillaItemID.iron_ingot, data: 0 },
{ id: VanillaItemID.gold_ingot, data: -1 },
{ id: VanillaItemID.flint }
]);
Recipes.addShapeless2(VanillaItemID.diamond, 1, 0, [
{ id: VanillaItemID.iron_ingot, data: 0 },
{ id: VanillaItemID.gold_ingot, data: -1 },
{ id: VanillaItemID.flint }
]);
Это добавит рецепт крафта для алмаза из слитка железа и золота, скрещенныx с кремнием. Сами методы идентичны, за исключением того что первый обрабатывает объект и может принимать экстру.
Мета предмета может указывать как на весь идентификатор (-1), так и иметь ввиду только основной предмет, исключая его вариации (0). По умолчанию используется именно последнее, как это представлено в случае с кремнием.
Паттерном по маске
Куда более частым способом регистрации рецептов остается задание конкретной формы. Форма представляет собой комбинацию маски, описывающей идентификаторы предметов, и паттерна, представляющего из себя сетку:
Recipes.addShaped({
id: VanillaItemID.sapling, count: 1, data: 0
}, ["l", "l", "o"], [
"o", VanillaBlockID.log, 0,
"l", VanillaBlockID.leaves, 0
]);
Recipes.addShaped2(VanillaItemID.sapling, 1, 0, ["l", "l", "o"], [
"o", VanillaBlockID.log, 0,
"l", VanillaBlockID.leaves, 0
]);
Здесь же, комбинация из бревна и двух блоков листвы позволяет получить нам росток. При этом явно указан паттерн, вертикальный ряд этих блоков — листва, листва и бревно. Как и в случае с бесформенным крафтом, методы практически идентичны друг другу.
Маска состоит из массива перечисления символьного ключа, идентификатора предмета и его меты. Символьным ключом может быть любой ASCII символ, то есть любой из латиницы, чувствительный к регистру (могут быть вместе ключи h
и H
, не конфликтуя с друг другом).
В случаях, если сетка паттерна меньше сетки верстака, сетка паттерна может быть размещена в любом месте верстака для получения результата. Простым примером здесь будет факел, в какую бы часть слотов не были размещены уголь над палкой, результат идентичен.
Дополним рецепт ростка выше, добавив чуть больше листвы для его создания:
Recipes.addShaped2(VanillaItemID.sapling, 1, 0, [" l ", "lll", " o "], [
"o", VanillaBlockID.log, 0,
"l", VanillaBlockID.leaves, 0
]);
Такой рецепт называют полноразмерным, то есть занимающим все слоты сетки крафта. Помимо листвы в паттерне, здесь появились "пустые" клетки. Пробелы в крафтах задают отсутствие предмета, для этого не нужно добавлят ь предмет воздуха в маску.
Переплавка
Помимо крафтинга на верстаке, не менее значимой механикой остается переплавка. Кроме обычной печки, здесь используются коптильня и плавильная печь. В регистрации рецептов нет ничего сложного:
Recipes.addFurnace(VanillaItemID.rotten_flesh, 0, VanillaItemID.leather, 0);
Что переплавит гнилую плоть в кожу, как это реализовано в проекте Ender Craft. Вторым аргументом после каждого идентификатора идет мета, она может принимать любую вариацию (-1).
И не менее важным аспектом переплавки остается топливо. В его добавлении также нет ничего сложного:
Recipes.addFurnaceFuel(VanillaBlockID.magma, 0, 400);
Это добавит возможность использовать магму как топливо, она будет "гореть" 20 секунд (400 тиков). Что касается переплавки руд в плавильной печи и приготовления еды в коптильне, предметы или блоки должны быть определены в соответствующую категорию творческого инвентаря.