Урок по программированию в MineTweaker 3. Урок №2 - ОСНОВНЫЕ РЕЦЕПТЫ

Отец
  1. Офлайн
  2. Администратор
  3. 16 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 1 отправлено 00:33, 27.05.2018
Прикрепленная картинка


Урок по программированию в MineTweaker 3
ссылка на мод

УРОК №2
ОСНОВНЫЕ РЕЦЕПТЫ


Использование вспомогательного мода MineTweaker RecipeMaker
Если вы не хотите возиться с кодом, добавлять или удалять рецепты вручную, то обратите внимание на замечательный аддон для MineTweaker от автора DoubleDoorDevelopment под названием MineTweaker RecipeMaker

Использование обозначений в рецепте
Основное, что можно делать с помощью MineTweaker - это добавление/удаление рецептов. В MineTweaker нет визульного редактора, только "голый" код в виде скриптового языка. Поэтому вы должны понять, как написать ваш рецепт в виде кода.
В прошлом уроке, на примере функции print, вы смогли увидеть возможности MineTweaker:
print("My text");

Правда, это очень простой пример. Куда более полезной функуцей является функция добавления рецепта:
recipes.addShaped(что_хотим_получитьингридиенты);

Эта строчка вызывает функцию addShaped для добавления рецепта к объекту. Обратите внимание, что данная функция добавляет исключительно рецепт крафта для объекта. Скажем, если вы захотите добавить рецепт внутрь печки или в какую-нибудь машину из мода, то за это будут отвечать другие функции. Об этих функциях мы поговорим немного позже.
Какие-же аргументы необходимо присвоить функции addShaped? В качестве аргументов мы должны использовать получаемый результат и составляющие (ингридиенты) рецепта.
Давайте, в качестве примера, возьмем Железный штаны и опишем их рецепт в виде кода:

Прикрепленная картинка


Код рецепта для MineTweaker будет выглядеть следующим образом:
[[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>],
[<minecraft:iron_ingot>, null, <minecraft:iron_ingot>],
[<minecraft:iron_ingot>, null, <minecraft:iron_ingot>]]


Если вы раньше не имели опыта программирования, то данный код может испугать. Правда, в нем нет ничего страшного, представьте его в таком виде:

Прикрепленная картинка


Каждый элемент в MineTweaker имеет свое название заключенное в угловые скобки. Это правило действует для всех элементов в том числе руды или жидкостей.
Таким образом, название железного слитка для 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 все равно его прочитает и запустит. Также вы можете один раз присвоить переменную железному слитку и использовать ее в дальнейшем коде. Как это сделать, будет описано в конце урока.

Основные рецепты
Небольшая вводная. Давайте рассмотрим рецепт палки. В ванильном рецепте Minecraft палки крафтятся из двух досок и в результате мы получаем 4 палки. Причем доски должны располагаться друг над другом.
Но, что если мы хотим изменить это? Что делать, если, допустим, мы считаем более правильным и логичным располагать доски не по вертикали, а по диагонали? (палку же мы получаем с наклоном, не так-ли?)
Изменить рецепт палочки проще простого. Создайте скрипт со следующим содержанием:
recipes.remove(<minecraft:stick>);
recipes.addShaped(<minecraft:stick> * 4, [[<minecraft:planks>, null], [null, <minecraft:planks>]]);


Запустите Minecraft или перезапустите скрипт, если вы в игре. Теперь возьмите две дубовые деревянные доски (oak wood planks) и проверьте рецепт.
Все работает? Отлично! Но, в этом рецепте есть ошибка: если вы вместо дубовых досок будете использовать березовые или еловые, то рецепт не будет работать.
Почему? Спросите вы. А все потому, что доски имеют мета данные. По умолчанию, если вы не указываете мета данные, MineTweaker присваивает значение равное 0, а это дуб. Но, мы хотим использовать в своем рецепте любые доски.
К счастью это легко исправить. При использовании имен мы можем добавлять мета данные. Например, если в качестве мета данных использовать 1: <minecraft:planks:1> это будут еловые доски. Также, мы можем использовать в качестве мета данных символ "*". Этот символ разрешает использовать любое значение мета данных: <minecraft:planks:*>
Измените свой рецепт и перезагрузите скрипт:
recipes.remove(<minecraft:stick>);
recipes.addShaped(<minecraft:stick> * 4, [[<minecraft:planks:*>, null], [null, <minecraft:planks:*>]]);


Все отлично! Теперь мы можем использовать в крафте абсолютно любые доски.
Если вы не знаете, как узнать название предмета, то возьмите его в руки и введи команду /minetweaker hand. Название предмета отобразится на экране и скопируется в буфер, так что вы можете вставить его непосредственно в скрипт.

Другие виды рецептов
Обратите внимание на слово Shaped в функции addShaped.
Shaped - это рецепт, ингридиенты которого должны быть разложены в правильной форме, как в пазле. Правильно сложенные кусочки образуют картинку. Не все рецепты 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:*>]]);

Теперь, рецепт палочек, помимо основного, имеет еще и зеркальный вариант.

Удаление рецептов
В Minecraft существую такие предметы, которые имеют несколько вариантов крафта и что делать, если мы хотим удалить всего лишь один рецепт, при этом оставить рабочими другие?
В этом случае необходимо конкретно указывать, какой рецепт следует удалить:
recipes.removeShaped(<minecraft:stick>, [[<minecraft:planks:*>], [<minecraft:planks:*>]]);

Такой вариант позволит удалить только один, конкретно указанный, рецепт, оставив рабочими все остальные, альтернативные рецепты.
Если вы хотите удалить все форменные (Shaped) или все бесформенные (Shapeless) рецепты, то это делает таким образом:
recipes.removeShaped(<minecraft:stick>);
recipes.removeShapeless(<minecraft:stick>);


Также, при удалении бесформенных рецептов (Shapeless), функции removeShapeless можно указать один или несколько ингридиентов, а потом сказать MineTweaker, что оставшаяся часть рецепта может содержать все, что угодно:
recipes.removeShapeless(<minecraft:wool:*>, [<minecraft:wool>]); // удаляет все рецепты цветной шерсти

Мета данные и урон предметов
Довольно часто, предметы имеют несколько подразделов. Хорошо примером являются уголь (coal) и древесный уголь (charcoal). Они имеют одинаковое название (ID) (minecraft:coal), но имеют разные мета данные.

В своем коде вы можете указать мета данные, чтобы разделить уголь на обычный и древесный:
var coal = <minecraft:coal:0>; // тоже самое, что и <minecraft:coal>
var charcoal = <minecraft:coal:1>;


Когда метаданные не указаны, то MineTweaker по умолчанию подставляет значение 0.

Если вы хотите в рецепте указать любой вид угля, то в этом случае в качестве мета данных используется "*":
var anyCoal = <minecraft:coal:*>;

Многие инструменты в Minecraft могут иметь повреждения. При использовании следующего скрипта, ингридиенты, участвующие в крафте, не должны их иметь:
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 сначала отменяет все изменения, которые были до этого сделаны, а потом снова выполняет новый скрипт.
Однако, некоторые механизмы (машины) из модов не поддерживают такую перезагрузку. В этом случае старый рецепт "зависнет" в игре до тех пор, пока клиент игры (или сервер) не будет перезапущен. Имейте это в виду!

Использование переменных
Для того, чтобы облегчить написание скриптов и не запоминать каждый раз, как называется тот или иной предмет, можно использовать переменные. Переменные могут быть val и var.
val stick = <minecraft:stick>;
val planks = <minecraft:planks:*>;
recipes.remove(stick);
recipes.addShaped(stick * 4, [[planks, null], [null, planks]]);


Благодаря переменной val (val stick = <minecraft:stick>;) мы вместо названия <minecraft:stick> в скрипте можем использовать название stick.
Точно также используется и переменная var:
var stick = <minecraft:stick>;
var planks = <minecraft:planks:*>;
recipes.remove(stick);
recipes.addShaped(stick * 4, [[planks, null], [null, planks]]);


Разница между val и var в том, что после объявления переменной val ее уже нельзя будет переименовать. Пример:
val stick = <minecraft:stick>;
stick = <minecraft:bread>;
// ОШИБКА, нельзя переименовывать!


Последний раз редактировал ipv2007 00:41, 27.05.2018
 
Перейти
Найти

Тема закрыта.

  1. Данная тема закрыта. Вы не можете отвечать в ней.