Jump to content

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


BazZziliuS
 Share

Recommended Posts

До сих пор мы узнали о том, как добавлять или удалять простые рецепты. Но что, если входные и выходные данные также включают значения повреждений или метки NBT?
 

Метка NBT в выводе
В качестве выходных данных можно определить как повреждение, так и метку NBT. Давайте возьмем кирку в качестве нашей игрушки для этого урока:

val stick = <minecraft:stick>;
val pick = <minecraft:stone_pickaxe>;
val damagedPick = pick.withDamage(10);
val stickedPick = pick.withTag({display: {Name: "Палочки выбирают", Lore: ["Этот выбор", "Был приклеен"]}});

recipes.addShaped(damagedPick, [[pick, stick]]);
recipes.addShaped(stickedPick, [[pick, stick], [stick, stick]]);

Приготовив кирку из 1 или 3 палочек, как в рецепте, вы получите предмет с соответствующим уроном и названием / знаниями соответственно.
 

Входные условия
Вы также можете потребовать, чтобы входные данные содержали определенные теги NBT. Допустим, вы готовите рецепт, для приготовления которого требуется наш маринад. Давайте изменим наш файл:

val stick = <minecraft:stick>;
val pick = <minecraft:stone_pickaxe>;
val damagedPick = pick.withDamage(10);
val stickedPick = pick.withTag({display: {Name: "Sticked pick", Lore: ["This pick", "Has been sticked"]}});

recipes.addShaped(damagedPick, [[pick, stick]]);
recipes.addShaped(stickedPick, [[pick, stick], [stick, stick]]);

val stonedPick = pick.withTag({display: {Name: "Stoned pick", Lore: ["This pick", "Has been experimenting too much"]}});
val onlyStickedPick = pick.onlyWithTag({display: {Name: "Sticked pick"}});
val cobble = <minecraft:cobblestone>;
recipes.addShaped(stonedPick, [[onlyStickedPick, cobble], [cobble, cobble]]);

А как насчет части знаний в нашей подборке? Поскольку ваше условие содержит только имя, часть знаний игнорируется - при установке условия для тега данных MineTweaker заботится только о указанном вами содержимом и игнорирует все остальное.

Обратите внимание на разницу между with Tag и onlyWithTag. withTag предназначен для вывода и является точным тегом, который будет выводиться. onlyWithTag предназначен для ввода и задает условие. Применение withTag к входным данным никак не влияет на рецепт.

Существуют и другие условия:

myItem.onlyDamaged(); // принимаются только поврежденные товары
myItem.onlyDamageAtLeast(15); // принимаются только предметы с повреждением не менее 15
myItem.onlyDamageAtMost(100); // принимаются только предметы с повреждением не более 100
myItem.onlyDamageBetween(15, 100); // принимаются только предметы с повреждением от 15 до 100

К одному ингредиенту также можно добавить несколько условий:

myItem.onlyDamaged().onlyWithTag({display: {Name: "Sticked pick"}});

 

Повторное использование выходных данных и преобразования
Начиная с MineTweaker 3.0.2, теперь можно повторно использовать предметы, возвращать пустые ведра в сетку для крафта (или любой другой предмет, который вы хотите) или повреждать предметы при крафте.

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

recipes.addShapeless(<minecraft:stick> * 3, [<minecraft:stone_axe>, <ore:woodPlanks>]);

Милый. Но каменный топор расходуется, и это немного раздражает. Мы можем исправить это с помощью модификатора повторного использования:

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

Отлично! Мы можем использовать топор повторно. А что, если бы мы также хотели, чтобы топор был поврежден, когда вы им пользуетесь?

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

Мы также можем нанести более 1 урона при крафте:

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

Представьте, что мы хотели бы приготовить рецепт превращения грязи в траву, объединив грязь, ведро с водой и пшеницу. Мы могли бы приготовить этот рецепт:

recipes.addShapeless(<minecraft:grass>, [<minecraft:dirt>, <minecraft:water_bucket>, <minecraft:wheat>]);

Однако на его создание уйдет целое ведро. Мы можем сказать MineTweaker, чтобы он вернул пустое ведро позже:

recipes.addShaped(<minecraft:grass>, [[
    <minecraft:dirt>,
    <minecraft:water_bucket>.transformReplace(<minecraft:bucket>),
    <minecraft:wheat>
]]);

Теперь создание травяного блока вернет пустое ведро для крафта в сетку для крафта.

Иногда моды определяют свое собственное поведение, когда вы используете их предметы во время крафта. Аналогично, Minecraft вернет вам пустое ведро, когда вы используете его в рецепте крафта. Если вы этого не хотите, вы можете сказать элементу, чтобы он вообще ничего не возвращал:

recipes.addShaped(<minecraft:grass>, [[
    <minecraft:dirt>,
    <minecraft:water_bucket>.noReturn(),
    <minecraft:wheat>
]]);

Если вы хотите вернуть что-то, но этого нет в инвентаре для крафта, вы также можете использовать "Вернуть". Возврат может быть использован без аргументов, и в этом случае он вернет исходный предмет, или он может быть использован с предметом, и в этом случае этот предмет будет возвращен обратно в инвентарь игрока:

recipes.addShaped(<minecraft:grass>, [[
    <minecraft:dirt>,
    <minecraft:water_bucket>.giveBack(<minecraft:iron_ore> * 3),
    <minecraft:wheat>
]]);

Возврат обычно также имеет побочный эффект подавления поведения возврата модного элемента. Таким образом, в этих случаях это может быть удобной альтернативой модификатору transformReplace.


Функциональные рецепты
При добавлении рецепта вы также можете указать дополнительный аргумент, который является пользовательской функцией. Эта функция может программно определять выходные данные вашего рецепта.

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

Давайте начнем с добавления к нему функции:

recipes.addShapeless(<minecraft:stone_pickaxe>, [<minecraft:stone_pickaxe>, <minecraft:cobblestone>], function(output, inputs, crafting) {
  // подлежащий реализации
}

Теперь нам нужно посмотреть на стоимость кирки. Чтобы получить фактические значения входных данных, нам нужно пометить их именем, и MineTweaker сохранит его в списке входных данных:

recipes.addShapeless(<minecraft:stone_pickaxe>, [<minecraft:stone_pickaxe>.marked("pick"), <minecraft:cobblestone>], function(output, inputs, crafting) {
  // подлежащий реализации. inputs.pick теперь содержит кирку, используемую в качестве входных данных
}

Тогда это просто вопрос написания кода для починки кирки:

recipes.addShapeless(<minecraft:stone_pickaxe>, [<minecraft:stone_pickaxe>.anyDamage().marked("pick"), <minecraft:cobblestone>], function(output, inputs, crafting) {
  // максимум здесь для того, чтобы убедиться, что урон не станет отрицательным
  // исправляет 25 повреждений за булыжник
  return inputs.pick.withDamage(max(0, inputs.pick.damage - 25));
});
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...