Jump to content

[MineTweaker3] Учебное пособие: Основные рецепты


BazZziliuS
 Share

Recommended Posts

Использование обозначения рецепта
Самые основные изменения, которые вы можете выполнить в MineTweaker, - это добавление и удаление рецепта. Визуального редактора нет, только язык сценариев, поэтому вы должны понимать, как записывать свои рецепты в виде текста.

Чтобы определить его функциональность, вы должны вызвать функции. Примером функции является print, которую вы видели ранее и которая принимает один аргумент:

print("My text");

Это было легко. Более полезной функцией, например, является функция добавления рецепта в форме:

recipes.addShaped(recipe output, recipe contents)

Эта строка, по сути, означает "вызовите функцию addShaped для объекта recipes". Объект recipes - это специальный объект, доступный из любого места вашего кода и содержащий все функции, связанные с добавлением и удалением рецептов приготовления. Обратите внимание, что объект recipes управляет только рецептами для крафта - например, рецептами печи управляет объект furnace (о котором вы узнаете в следующем руководстве), а у машин с модами есть еще разные методы управления рецептами.

Теперь, как нам вызвать функцию добавления формы с соответствующими аргументами? Нам нужно сообщить ему, каким должен быть результат и каким должен быть рецепт.

Давайте возьмем, к примеру, рецепт железных леггинсов, который заключается в следующем:
Recipe_leggings_iron.png.714dd7191e3cab1b876cc914d00f91a3.png

Для этого рецепта используется следующее обозначение минитвейкера:

[[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>],
[<minecraft:iron_ingot>, null, <minecraft:iron_ingot>],
[<minecraft:iron_ingot>, null, <minecraft:iron_ingot>]]

Это может показаться загадочным, если вы раньше не занимались программированием, но принцип довольно прост. Вы можете визуализировать рецепт следующим образом:
Recipe_leggings_iron_brackets.png.38b880ae086b87ac91c654a897caf5c9.png

Каждый элемент в minetweaker имеет свое собственное имя, заключенное в угловые скобки, чтобы сообщить ему "найдите мне элемент с этим именем". Это обозначение в угловых скобках будет использоваться во многих местах - от извлечения элементов до словарных статей о руде и названий жидкостей. Название предмета для железного слитка - <minecraft:iron_ingot>, а железные леггинсы - <minecraft:iron_leggings>.

А как насчет пустых мест? Вы не можете просто пропустить записи - вы должны поместить что-то, чтобы указать "это пусто". У MineTweaker есть специальное слово для таких объектов, и это "null".

Таким образом, мы можем определить рецепт леггинсов с помощью следующего кода:

recipes.addShaped(<minecraft:iron_leggings>,[
[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>],
[<minecraft:iron_ingot>, null, <minecraft:iron_ingot>],
[<minecraft:iron_ingot>, null, <minecraft:iron_ingot>]]);

Или вы можете разделить строку по-другому для удобства чтения, поскольку MineTweaker не заботится о том, как вы разделяете свой код на строки. Вы также можете один раз извлечь железный слиток, присвоить его переменной, а затем повторно использовать, как будет описано в конце этого руководства.


Основные рецепты
Визуального редактора нет, поэтому вы должны понимать, как записывать свои рецепты в виде текста.

В качестве небольшого введения давайте рассмотрим рецепт приготовления палочек. В ванильном майнкрафте требуется 2 деревянные доски, чтобы сделать 4 палочки, и они должны располагаться друг над другом. Но что, если мы захотим это изменить? Что, если, скажем, мы сочтем более логичным вместо этого поместить два деревянных бруска по диагонали? (эта палка диагональная, верно?)

Изменить рецепт палочек удивительно просто. Создайте скрипт со следующим содержимым:

recipes.remove(<minecraft:stick>);
recipes.addShaped(<minecraft:stick> * 4, [[<minecraft:planks>, null], [null, <minecraft:planks>]]);

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

Это работает? Отлично! Но теперь вы, возможно, заметили недостаток в рецепте: если вы положите березовые или еловые дрова, это не сработает!

Почему это не работает? Элемент "доски" имеет подпункты, которые отличаются не только названием элемента, но и его мета-значением. По умолчанию, если вы извлекаете элемент с синтаксисом скобок, MineTweaker предполагает, что вам нужен элемент с мета-значением 0. И вот что он вернул - предмет "дубовые доски". Но нам нужен ингредиент, который по сути означает "любой сорт дерева".

К счастью, это легко исправить. При использовании синтаксиса скобок, помимо имени, мы также можем определить мета-значение. Например, <minecraft:planks:1> относится к еловому дереву. Мы также можем использовать подстановочный знак (*), чтобы получить элемент, означающий "любое мета-значение хорошо": <minecraft:planks:*>.

Таким образом, измените свой рецепт и перезагрузите:

recipes.remove(<minecraft:stick>);
recipes.addShaped(<minecraft:stick> * 4, [[<minecraft:planks:*>, null], [null, <minecraft:planks:*>]]);

Исправлено! Конечно, вы должны использовать статью в словаре руды для досок, что было бы еще лучше, поскольку она была бы совместима с досками, добавленными модом 🙂

Если вам нужно полное название предмета, вы можете подержать его в руке и использовать команду /minetweaker hand. Он напечатает имя и скопирует его в буфер обмена, так что вы можете просто вставить его непосредственно в свой скрипт


Другие виды рецептов
Форменные рецепты - это рецепты, в которых ингредиенты должны быть расположены в правильной форме, чтобы они сработали. Не все рецепты Minecraft имеют форму - некоторые не заботятся о форме. MineTweaker поддерживает те, у кого есть функция addShapeless:

recipes.addShapeless(<minecraft:stick> * 4, [<ore:plankWood>, <ore:plankWood>]);

Теперь не имеет значения, как вы размещаете свои доски - вы всегда можете изготовить палочки. Обратите внимание, что в этом примере, однако, вы больше не можете изготовить деревянную прижимную пластину.

Начиная с версии 3.0.7, также возможно регистрировать зеркальные рецепты. Продолжаем с нашими палочками (не забудьте сначала удалить предыдущие рецепты):

recipes.addShapedMirrored(<minecraft:stick> * 4, [[<minecraft:planks:*>, null], [null, <minecraft:planks:*>]]);

Теперь не имеет значения, повторяете ли вы рецепт - он все равно работает!


Удаление конкретного рецепта
Пока что мы решили, что удалим все рецепты для стика. В ванильном майнкрафте тоже есть только один, так что это не проблема. Но что, если мы захотим быть более конкретными? Часто существует несколько рецептов для одного и того же продукта, и мы можем захотеть удалить один, но сохранить остальные.

В этом случае можно быть более конкретным:

recipes.removeShaped(<minecraft:stick>, [[<minecraft:planks:*>], [<minecraft:planks:*>]]);

Это удалит только один рецепт - даже если есть другие рецепты.

Также можно удалить все рецепты, которые имеют форму, или все рецепты, которые не имеют формы, просто вызвав:

recipes.removeShaped(<minecraft:stick>);
recipes.removeShapeless(<minecraft:stick>);

Кроме того, шаблоны подстановочных знаков можно использовать для указания того, что любой элемент будет соответствовать определенной позиции, если он не пустой:

recipes.removeShaped(<minecraft:stick>, [[<*>], [<*>]]);

Аналогично, при удалении бесформенных рецептов можно указать только один или несколько ингредиентов бесформенного рецепта, а затем сообщить minetweaker, что оставшаяся часть рецепта может содержать что угодно:

recipes.removeShapeless(<minecraft:wool:*>, [<minecraft:wool>]); // удаляет все рецепты окрашивания шерсти


Подпункты и значения ущерба
Довольно часто элементы имеют несколько подпунктов. Очень хорошо известным примером являются уголь и древесный уголь. Оба имеют одинаковый идентификатор (minecraft:coal), но имеют разное мета-значение.

При загрузке элемента вы можете указать мета-значение для подпункта:

var coal = <minecraft:coal:0>; // такой же, как <minecraft:coal>
var charcoal = <minecraft:coal:1>;

Если подпункт не указан, для подпункта заполняется :0.

Если вы хотите, чтобы рецепт соответствовал какому-либо подпункту, вы можете использовать синтаксис подстановочных знаков:

var anyCoal = <minecraft:coal:*>;

Многие виды предметов также могут быть повреждены. При использовании такого продукта в качестве ингредиента для рецепта, по умолчанию, повреждение не допускается. Например:

var pick = <minecraft:stone_pickaxe>;
var iron = <minecraft:iron_ingot>;
recipes.addRecipe(<minecraft:iron_pickaxe>, [[iron, iron, iron], [null, pick, null]]);

В приведенном выше рецепте поврежденная кирка не будет принята. Это можно легко изменить с помощью модификатора .anyDamage():

var pick = <minecraft:stone_pickaxe>.anyDamage();
var iron = <minecraft:iron_ingot>;
// upgrade pick recipe :)
recipes.addShaped(<minecraft:iron_pickaxe>, [[iron, iron, iron], [null, pick, null]]);


Перезагрузка и рецепты
Когда вы перезагружали скрипты, вы, возможно, заметили, что при перезагрузке скрипта рецепт не дублируется. Аналогично, если дополнение к рецепту удалено из сценария и сценарий перезагружен, рецепт фактически удаляется из игры, даже если может не быть заявления, явно запрашивающего такое удаление.

MineTweaker запоминает такие действия, как добавление и удаление рецепта. Когда скрипт перезагружается (или загружается путем подключения к другому серверу), MineTweaker сначала отменит все записанные изменения, которые были внесены, прежде чем он выполнит новый скрипт.

Однако многие мод-машины не поддерживают такое удаление рецепта. В этом случае рецепт будет "застрять" в игре до тех пор, пока не будет перезагружена вся игра. Для сервера это означает, что рецепт останется в списке до перезапуска сервера; для клиента это означает, что рецепт будет показан и с ним будут действовать так, как если бы он существовал, хотя при попытке создания фактическое создание завершится неудачей. Такое поведение невозможно исправить; авторы соответствующих модов должны предоставить достаточный API, чтобы гарантировать возможность удаления рецепта.


Использование переменных
Вы обнаруживаете, что просматриваете один и тот же элемент снова и снова, используя синтаксис скобок? Может быть удобно запомнить значение на потом; что можно сделать с помощью операторов val и var:

val stick = <minecraft:stick>;
val planks = <minecraft:planks:*>;
recipes.remove(stick);
recipes.addShaped(stick * 4, [[planks, null], [null, planks]]);

В этом примере var может быть использован для:

var stick = <minecraft:stick>;
var planks = <minecraft:planks:*>;
recipes.remove(stick);
recipes.addShaped(stick * 4, [[planks, null], [null, planks]]);

Разница между var и val заключается в том, что значение val не может быть изменено после его объявления:

val stick = <minecraft:stick>;
stick = <minecraft:bread>; // ошибка
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...