Статья-заготовка. В процессе редактирования |
Автор | |
---|---|
Последняя версия | |
Совместимо с | |
Ссылки |
MineTweaker 3 — мод для SSP и SMP режимов игры Minecraft, который позволяет редактировать, менять и удалять рецепты крафтов из оригинальной игры и модификаций.
Является удобным инструментом при создании сборок из различных модификаций, а также для решения проблем с поддержкой крафтов между различными модами.
В папке minecraft, создается папка script в которую можно помещать свои файлы конфигурации с расширением "zs"
.
Также, в папке minecraft создается файл логов "minetweaker.log"
в котором удобно отслеживать названия объектов, группы ore dictionary, и типы сундуков с лутом, для последующего использования в скриптах.
На данный момент существует аналог CraftTweaker от автора aredlll08, поддерживаются версии игры от 1.7.10 до актуальной 1.11.2
Описание установки модификации в стандартном лаунчере:
".minecraft"
появится папка "mods"
..minecraft/mods
..minecraft/scripts
(если папки нет, создайте ее) файл конфигурации "project.zs" (вместо названия project можно использовать свое, набранное латиницей)Описание установки модификации в лаунчере MultiMC:
/mt names
- вывести в minetweaker.log список всех игровых названий объектов, а также их внутренние названия
/mt hand
- если взять в руки какой-либо предмет и набрать эту команду, то в буфер обмена автоматически сохранится внутреннее название этого предмета, которое сразу можно использовать в скрипте.
/mt reload
- обновить файл "project.zs" для применения внесенных в него изменений в игре.
/mt loot
- вывести в minetweaker.log список всех типов сундуков с лутом, а также их возможное содержимое.
/mt oredict
- вывести в minetweaker.log список всех групп ore dictionary c списком входящих в них объектов
/mt research
- (если у вас установлен Thaumcraft) вывести в minetweaker.log список всех исследований Thaumcraft
Для того чтобы закомментировать скрипт, или добавить в качестве комментария к скрипту какую-то фразу, можно использовать один из перечисленных способов:
//Так можно закомментировать строку
# И так тоже можно закомментировать строку
/* А так можно закомментировать целый набор строк главное не забыть закрыть комментарии в конце */
Для того чтобы узнать правильное название предмета, следует ввести в игре команду /minetweaker names
а затем, произведя поиск в файле "minetweaker.log"
по имени объекта в игре, при помощи комбинации клавиш Ctrl+F внутреннего названия объекта. Именно это название нужно использовать в скриптах.
Если вы не можете найти название какого-то объекта в списке, то возможно он использует метаданные. Так, к примеру разные цвета шерсти обращаются по метаданным к прародителю - белой шерсти, а различные красители к своему прародителю - чернильному мешку.
Для того чтобы найти прародитель нужно включить в игре отображение id в названии объектов. Для этого нужно нажать комбинацию клавиш F3+H (вне инвентаря), затем найти прародителя, и произведя поиск в файле "minetweaker.log"
по игровому имени прародителя, найти его внутреннее, а затем, обращаться через него, к нужному объекту, вводя в угловых скобочках после двоеточия - метаданные нужного объекта Пример:
<minecraft:wool> - белая шерсть 35 <minecraft:dye> - чернильный мешок 351
<minecraft:wool:1> - оранжевая шерсть 35:1 <minecraft:wool:4> - желтая шерсть 35:4 <minecraft:wool:15> - черная шерсть 35:15 <minecraft:dye:3> - какао бобы 351:3 <minecraft:dye:4> - дазурит 351:4 <minecraft:dye:15> - костяная мука 351:15
Если в крафте должен использоваться не только прародитель, или вызванный через метаданные объект, а все объекты использующие эти метаданные, начиная от прародителя (к примеру шерсть всех цветов, или любой краситель) то после двоеточия стоит указывать *.
Пример:
<minecraft:wool:*> - в рецепте используется шерсть всех цветов <minecraft:dye:*> - в рецепте используются любые красители
По каким-то причинам может понадобится обратиться к какому-то объекту целым каскадом команд, поскольку внутренний язык не предусматривает одновременного отношения к объекту сразу по нескольким параметрам, можно создать переменную, к которой присвоить какой-то объект, а затем - обращаться через неё.
Для создания переменной используется команды var
и val
.
Пример присвоения переменной wool
объекта белая шерсть <minecraft:wool>
:
var wool = <minecraft:wool>
Названия переменных записываются слитно без пробелов и спец-символов. Используемый регистр имеет значение.
Пример двух разных переменных:
var wool = <minecraft:wool> var WooL = <minecraft:wool:15>
Команда val
применяется так-же как и предыдущая, но с одной небольшой поправкой, после объявления этой переменной ее уже нельзя переименовать.
Пример:
val stick = <minecraft:stick>; var stick = <minecraft:bread>; // ОШИБКА, нельзя переименовывать!
Имеются в виду Shaped рецепты, то есть те, в которых важен порядок и расположение ингредиентов в сетке крафта.
Все описанные в рамочках скрипты вводятся в файле "project.zs"
Для добавления нового рецепта 2x2 используется следующий шаблон:
recipes.addShaped(<>, [[<>, <>], [<>, <>]]);
Результат следует вводить в первые угловые скобки. Предметы, которые должны служить ингредиентами вводятся в массив ниже, в том же порядке в котором они будут использоваться в сетке крафта в игре. Пример крафта верстака из дубовых досок ниже:
recipes.addShaped(<minecraft:crafting_table>, [[<minecraft:planks>, <minecraft:planks>], [<minecraft:planks>, <minecraft:planks>]]);
Если в крафте не должны быть задействованы какие-то клетки, то вместо угловых скобочек пишется null
. Также, если на выходе должно получится несколько объектов, то после результата ставите * и указывает количество выходного результата в числовом эквиваленте.
Пример крафта 4-х палочек из двух дубовых досок:
recipes.addShaped(<minecraft:stick> * 4, [[<minecraft:planks>, null], [<minecraft:planks>, null]]);
Для добавления рецепта для верстака, то есть 3х3, необходимо всего лишь расширить массив в шаблоне:
recipes.addShaped(<>, [[<>, <>, <>], [<>, <>, <>], [<>, <>, <>]]);
В остальном, ничего не меняется. Крафт 16-и решеток из шести железных слитков, в качестве примера, ниже:
recipes.addShaped(<minecraft:iron_bars> * 16, [[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>], [<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>], [null, null, null]]);
Для удаления всех возможных крафтов некого объекта достаточно написать вот такую строчку:
recipes.remove(<>);
Указав в угловых скобках тот объект, рецепты которого должны полностью исчезнуть из списка возможных крафтов.
Пример удаления всех возможных крафтов ванильного верстака (в том числе и добавляемых модификациями):
recipes.remove(<minecraft:crafting_table>);
Если же нужно удалить только один, какой-то определенный рецепт, то делаем все то же самое, только слегка дополнив скрипт.
Пример удаления крафта железной кирки ниже:
recipes.remove(<minecraft:iron_pickaxe>, [[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>], [null, <minecraft:stick>, null], [null, <minecraft:stick>, null]]);
Если в вашей сборке есть возможность создать железную кирку каким-то другим способом, то этот другой способ останется рабочим, а имевшийся ванильный рецепт - пропадет.
Имеются в виду Shapeless рецепты, то есть те, в которых порядок и расположение ингредиентов не важно, важно только их наличие в сетке крафта.
Все описанные в рамочках скрипты вводятся в файле "project.zs"
Добавление бесформенных рецептов происходит по схожему шаблону, только в отличие от предыдущих, совершенно не обязательно правильно расставлять все объекты в массиве, достаточно их указать через запятую:
recipes.addShapeless (<>, [<>, <>, null]);
Пример крафта оранжевого красителя:
recipes.addShapeless (<minecraft:dye:14>, [<minecraft:dye:1>, <minecraft:dye:11>]);
Пример крафта черной шерсти:
recipes.addShapeless (<minecraft:wool:15>, [<minecraft:wool>, <minecraft:dye>]);
Удаление всех бесформенных рецептов какого-то одного объекта ни чем не отличается от удаления всех рецептов какого-то форменного рецепта:
recipes.remove(<>);
Пример удаления всех возможных крафтов оранжевой шерсти (в том числе и добавляемых модификациями):
recipes.remove(<minecraft:wool:1>);
В случае же удаления какого-то одного бесформенного рецепта вводится схожая с удалением форменного рецепта строчка, только участвующие в крафте ингредиенты достаточно перечислить через запятую в строчку:
recipes.remove (<minecraft:wool:15>, [<minecraft:wool>, <minecraft:dye>]);
Всё, нет больше в майнкрафте возможности сделать черную шерсть. Ну разве что найти овцу, покрасить ее а затем постричь.
Все описанные в рамочках скрипты вводятся в файле "project.zs"
Чтобы добавить новый рецепт для печек, нужно воспользоваться следующим шаблоном:
furnace.addRecipe(<>, <>);
Где, в первых фигурных скобках пишется получаемый при переплавке объект, а во вторых - тот, из которого этот объект получился.
Пример получения слитка железа из железной руды:
furnace.addRecipe(<minecraft:iron_ingot>, <minecraft:iron_ore>);
Также, вставляя между запятой и закрывающей фигурной скобочкой, звездочку * и указывая цифру, можно указать сколько предметов мы получим при переплавке какого-то объекта.
Пример получения трех слитков железа при переплавке железной двери:
furnace.addRecipe(<minecraft:iron_ingot> * 3, <minecraft:iron_door>);
Как известно при переплавке чего-либо мы получаем опыт, когда забираем результат. Чтобы указать количество опыта (в уровнях) получаемое после обработки в печке нужно указать его через запятую внутри круглых скобок.
Пример получения опыта при переплавке двери на основе предыдущего примера:
furnace.addRecipe(<minecraft:iron_ingot> * 3, <minecraft:iron_door>, 0,5);
Еще можно добавить новое топливо, используемое по шаблону:
furnace.setFuel(<>, num);
Где в угловых скобках указывается объект, служащий топливом, а вместо num указывается время горения в тиках.
Пример добавления ванильного топлива (с его реальной продолжительностью):
furnace.setFuel(<minecraft:sapling:*>, 100); furnace.setFuel(<minecraft:wooden_slab:*>, 150); furnace.setFuel(<minecraft:wooden_sword>, 200); furnace.setFuel(<minecraft:planks:*>, 300); furnace.setFuel(<minecraft:coal>, 1600); furnace.setFuel(<minecraft:blaze_rod>, 2400); furnace.setFuel(<minecraft:coal_block>, 16000); furnace.setFuel(<minecraft:lava_bucket>, 20000);
Шаблон удаления рецепта для печки:
furnace.remove(<>);
Пример удаления рецепта переплавки железной руды в железный слиток:
furnace.remove(<minecraft:iron_ingot>, <minecraft:iron_ore>)
Для добавления рецепта для какого-то мода, по прежнему нужно внутреннее название того объекта для которого добавляется рецепт.
После чего, пишется строчка вида:
mods.название_мода.название_объекта.addRecipe(<>);
Пример добавления рецепта для Алтаря в моде Blood Magic:
mods.bloodmagic.Altar.addRecipe(<minecraft:glowstone_dust>, <minecraft:redstone>, 3, 5000, 20, 20);
Судя по этой строке, мы обращаемся к объекту в моде Blood Magic, под названием Алтарь крови, и добавляем в него рецепт создания светопыли из красной пыли, при этом требуется уровень алтаря - 3, 5000 единиц крови в алтаре, в течении 20-и тиков и скорость потери крови за тик - 20 единиц.
Альтернативный вариант - импортировать объекты и рецепты из мода, командой:
import mods.название_мода.объект;
А затем обратится к этому объекту, добавляя или убирая рецепт, так-же, как обращались к печке в предыдущем разделе. Пример:
import mods.ic2.Compressor; Compressor.addRecipe(<minecraft:planks>, <minecraft:stick>);
То есть тех, которые имеют полную поддержку в моде.
А также аддоны к моду:
То есть тех, при добавлении рецептов для которых, происходят краши, или возникают проблемы:
Для создания описания или изменения названия на русский язык, рекомендуется использовать [этот] сайт. В окне слева вводится текст на русском, затем вы нажимаете на кнопку в виде стрелки вправо и в окне справа выводится последовательность английских символов разделенных слэшами. По сути это зашифрованные русские буквы, после чего вам достаточно вставить строчку из таких символов в строчку со скриптом, внутрь кавычек.
Стрелка "влево" используется для обратного перевода, для того чтобы увидеть оригинальный текст.
Шаблон:
<>.displayName = "";
Для того чтобы узнать внутреннее имя предмета, можно воспользоваться одной из консольных команд, поиском по minetweaker.log или как в примере ниже:
print(<minecraft:chest>.displayName);
При вводе этой команды в логе запишется имя предмета, в данном случае сундука. Затем, чтобы поменять название сундука в игре достаточно написать следующую строчку:
<minecraft:chest>.displayName = "Storage Box";
При этом теперь сундук будет называться не "Chest" или "Сундук", а "Storage Box". Если же вы хотите изменить название, или описание, на русском, воспользуйтесь советом в начале этого раздела.
Пример смены названия сундука на "Сундучище":
<minecraft:chest>.displayName = "\u0421\u0443\u043d\u0434\u0443\u0447\u0438\u0449\u0435";
Шаблон:
<>.addTooltip("");
Tooltip или описание можно добавлять как целому ряду объектов, к примеру с помощью Ore Dictionary:
<ore:plankWood>.addTooltip("These are wood planks"); <ore:plankWood>.addTooltip("\u042d\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u044f\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u043a\u0438"); //"Это деревянные доски"
Также, при желании можно добавлять описание к какому-то конкретному объекту:
<minecraft:stick>.addTooltip("This is stick"); <minecraft:stick>.addTooltip("\u042d\u0442\u043e \u043f\u0430\u043b\u043a\u0430"); //Это палка
Такое описание будет видно всегда, когда вы наводите курсор в инвентаре на объект, и будет писаться прямо под заголовком.
Если вы хотите, чтобы описание появлялось только когда вы наводите курсор на предмет и зажимаете ⇧ Shift, то вам нужно воспользоваться следующим шаблоном:
<>.addShiftTooltip("");
Так-же как и обычное описание, такое может применяться сразу к нескольким объектам по Ore Dictionary или к одному конкретному:
<ore:iron_ingot>.addShiftTooltip("That's all iron ingots"); <minecraft:diamond_sword>.addShiftTooltip("It is crystalline!");
По умолчанию описание пишется темно-фиолетовым цветом, курсивом, однако вы можете сами задать формат текста, который будет выводится в описании, для этого нужно добавить параметр format.color/font
.
В качестве примера поменяем алмазному мечу, цвет описания на светло-голубой:
<minecraft:diamond_sword>.addTooltip(format.blue("It is crystalline!"));
Теперь сменим тип написания шрифта... пусть он будет полужирным:
<minecraft:diamond_sword>.addTooltip(format.blue(format.bold("It is crystalline!")));
Теперь вся надпись будет нежно-голубого цвета, полужирным шрифтом.
Конечно же, вы можете применить форматирование к разным частям текста, для этого нужно разбить текст, записав отдельные его части в кавычках и поставить между ними знаки плюса, вот так:
<minecraft:diamond_sword>.addShiftTooltip("It is" + "crystalline!");
В данном примере мы не увидим особых изменений, однако теперь мы можем применить к этим двум частям текста разное форматирование.
Давайте применим к последнему слову уже знакомое вам форматирование, а к первым двум, иное:
<minecraft:diamond_sword>.addShiftTooltip(format.red("It is") + format.blue(format.bold("crystalline!")));
Cписок всех цветов, которые вы можете применить к тексту, расположен ниже:
format.black //Черный format.darkBlue //Синий format.darkGreen //Темно-зеленый format.darkAqua //Темно-синий format.darkRed //Темно-красный format.darkPurple //Темно-фиолетовый format.gold //Желтый format.gray //Серый format.darkGray //Темно-серый format.blue //Голубой format.green //Зеленый format.aqua //Светло-синий format.red //Красный format.lightPurple //Светло-фиолетовый format.yellow //Светло-желтый format.white //Белый
Список всех форматов шрифтов которые можно применить к тексту:
format.obfuscated //Затемненный format.bold //Полужирный format.strikethrough //Зачеркнутый format.underline //Нижнее подчеркивание format.italic //Наклонный
Так-же вы можете изменить содержание предметов, присвоив их какой-то переменной, а потом через эту переменную обратившись к их содержимому.
Пример обращения к NBT данным:
val Dsword = <minecraft:diamond_sword>; val TagDsword = Dsword.withTag({display: {Name: "Epic Sword", Lore: ["Oh, it's...", "It's really power!"]}});
При использовании такой строчки, вы получите алмазный меч, который будет иметь название "Epic Sword", и описание которое будет идти в две строчки, первая строчка "Oh, it's...", вторая "It's really power!". При этом если вы скрафтите обычный, алмазный меч, то он не будет иметь никакого измененного названия, и/или описания. Для того чтобы увидеть измененные свойства, нужно добавить крафт такого меча, к примеру:
recipes.addShapeless(TagDsword, [Dsword, <minecraft:gold_ingot>, <minecraft:diamond>]);
В результате подобного бесформенного рецепта при использовании алмазного меча (ведь ранее вы создали переменную имеющую свойство алмазного меча, так почему же не использовать вместо внутреннего имени - переменную?), алмаза и золотого слитка вы получите обычный алмазный меч, но с необычным названием и описанием.
Предположим, поскольку это "Эпический Меч", единственный в своем роде, то он должен уметь восстанавливаться, ремонтироваться. Мы можем воспользоваться наковальней, но в таком случае мы скорее всего получим обычный меч, давайте создадим рецепт, в котором если прочность меча будет составлять 100 единиц, то при комбинации с алмазом мы сможем восстановить его до исходного состояния. Естественно у предмета должна быть изначально какая-то прочность, к примеру если это инструмент, броня и оружие. Блок не имеет внутренней прочности.
Давайте попробуем. Для начала создадим переменную с сломанным мечом "Эпическим мечом":
val BrokenTagDsword = TagDsword.withDamage(100);
А затем создадим рецепт для ремонта этого меча:
recipes.addShapeless(TagDsword, [BrokenTagDsword, <minecraft:diamond>);
Теперь, когда прочность меча станет равна 100 единиц, то скомбинировав его с алмазом мы получим целый "Эпический меч". Однако, если прочность выше 100 единиц, или ниже, то рецепт может не сработать. Как же тогда поступить?
В таком случае нужно воспользоваться одним из перечисленных параметров ниже (в качестве примера использовалась та же переменная с алмазным мечом):
Dsword.onlyDamaged(); // Этот параметр принимает любой поврежденный алмазный меч (но только поврежденные) Dsword.onlyDamageAtLeast(15); // Этот параметр принимает поврежденный алмазный меч с прочностью ниже 15 Dsword.onlyDamageAtMost(100); // Этот параметр принимает поврежденный алмазный меч с прочностью выше 100 Dsword.onlyDamageBetween(15, 100); // Этот параметр принимает поврежденный алмазный меч с прочностью не ниже 15 но не выше 100
Используя эти параметры вы можете создавать не только уникальные рецепты для починки инструментов или оружия, но и для получения предметов с особыми свойствами. Или с другими параметрами обусловленными вашей историей.
Кстати, вам ничто не мешает объединять эти параметры в одной строчке, к примеру таким образом:
BrokenTagDsword.withDamage(100).withTag({display: {Name: "Epic Sword", Lore: ["Oh, it's...", "It's really power!"]}});
Давайте предположим, что мы хотим создавать больше ресурсов, с использованием дополнительного инструмента?
К примеру, увеличивать получение досок из дуба? В таком случае мы создадим рецепт подобного типа:
recipes.addShapeless(<minecraft:planks> * 6, [<minecraft:stone_axe>, <minecraft:log>]);
То есть просто положив блок дуба в сетку крафта, мы получали 4 доски, а теперь, комбинируя дуб и топор мы получаем целых шесть!
Но к сожалению топор каждый раз бесследно исчезает.
Давайте это исправим:
recipes.addShapeless(<minecraft:planks> * 6, [<minecraft:stone_axe>.reuse(), <minecraft:log>]);
Теперь, когда мы будем забирать результат (доски) из окна крафта, то бревно будет пропадать, а топор оставаться. Отлично!
Однако это не совсем честно с точки зрения баланса, ведь машина-лесопилка тратит энергию при распиле бревна на 6 досок.
Давайте каждый такой рецепт будет отнимать у топора часть прочности:
recipes.addShapeless(<minecraft:planks> * 6, [<minecraft:stone_axe>.transformDamage(), <minecraft:log>]);
Теперь каждое использование топора будет отнимать у него 1 единицу прочности, количество прочности которое будет отниматься, мы конечно же можем задать:
recipes.addShapeless(<minecraft:planks> * 6, [<minecraft:stone_axe>.transformDamage(10), <minecraft:log>]);
Теперь топор будет тратится значительно быстрее, при каждом использовании в крафте шести досок.
А теперь давайте создадим рецепт, для получения обсидиана на раннем этапе игры, без алмазной кирки, просто, комбинируя два ведра, одно с водой, другое с лавой:
recipes.addShapeless(<minecraft:obsidian>, [<minecraft:water_bucket>, <minecraft:lava_bucket>]);
Конечно мы можем предположить что в данном рецепте оба ведра потратятся, но вдруг мы хотим чтобы они оставались, а пропадало только их содержимое? У ведер нет прочности, значит тот вариант что с топором - не пройдет.
И тут нам на помощь придет следующая команда (ингредиенты перечислены в столбик, для наглядности):
recipes.addShaped(<minecraft:obsidian>, [[ <minecraft:water_bucket>.transformReplace(<minecraft:bucket>), <minecraft:lava_bucket>.transformReplace(<minecraft:bucket>), ]]);
В результате, после того как вы заберете результат - блок обсидиана, у вас в окне крафта останутся два пустых ведра. Заполненные ведра как бы "трансформируются" в них.
Конечно же никто не мешает вам сделать более сбалансированный рецепт, к примеру, после такого крафта, ведра безнадежно портятся, и могут идти только на слитки. Причем они должны сразу возвращаться в инвентарь, не оставаясь в слотах верстака.
В таком случае идеальным будет следующий параметр:
recipes.addShaped(<minecraft:obsidian>, [[ <minecraft:water_bucket>.giveBack(<minecraft:iron_ingot> * 2), <minecraft:lava_bucket>.giveBack(<minecraft:iron_ingot> * 2), ]]);
Отлично, теперь после получения обсидиана, слоты верстака очистятся, а в инвентарь нам попадет 4 слитка железа.
Кстати, довольно часто Minecraft способен определить какой предмет используется в крафте, и если взять изначальный рецепт крафта блока обсидиана, то ведра остались бы в любом случае:
recipes.addShapeless(<minecraft:obsidian>, [[ <minecraft:water_bucket>, <minecraft:lava_bucket> ]]);
Но вдруг мы все же хотим чтобы ведра не оставались? Хотим сделать игру более сложной. Тут нам не поможет параметр .transformReplace(<>);
, ведь он превращает что-то во что-то, тут нам поможет иной параметр:
recipes.addShapeless(<minecraft:obsidian>, [[ <minecraft:water_bucket>.noReturn(), <minecraft:lava_bucket>.noReturn() ]]);
Вот теперь, при крафте обсидиана, ведра гарантированно исчезнут, и не вернутся ни пустые, ни полные.