minetest_modding_book/_ru/items/nodes_items_crafting.md

18 KiB
Raw Blame History

title layout root idx description redirect_from
Блоки, предметы и крафт default ../.. 2.1 Вы узнаете как зарегистрировать новый блок, предмет или рецепт с помощью register_node, register_item и register_craft. /ru/chapters/nodes_items_crafting.html

Введение

Регистрация новых блоков, ингредиентов и рецептов встречается практически во всех модах.

Что такое Блоки и Предметы?

Все блоки и инструменты также являются Предметами. Предмет — это то, что может лежать в инвентаре (даже если правила игры это запрещают).

Блок — это Предмет, который может быть поставлен или найден в мире. В каждом вокселе мира всегда находится один и только один блок (пустое место — это, обычно, блок воздуха).

Обычные предметы (не блоки) не могут быть поставлены в мире, а могут только находиться в инвентаре или выпадать в мир.

Инструмент похож на обычный предмет, но его можно использовать. Когда вы используете инструмент, шкала его прочности уменьшается до тех пор, пока он не сломается. Инструменты не могут быть сгруппированы в стак. В будущем, возможно, Инструменты не будут выделяться в отдельный тип, поскольку различие между ними и обычными предметами довольно условное.

Регистрация предметов

Объявление предмета состоит из названия и аттрибутов. В аттрибутах записаны различные параметры, влияющие на поведение предмета.

core.register_craftitem("modname:itemname", {
    description = "My Special Item",
    inventory_image = "modname_itemname.png"
})

Названия предметов

У каждого предмета есть название для обращения к нему, которое должно иметь следующий формат:

modname:itemname

modname — это имя мода, в котором предмет зарегистрирован, а itemname — это название самого предмета. Название предмета должно быть уникальным и должно отражать его суть.

Для написания modname и itemname используются только строчные буквы английского алфавита, цифры и подчёркивания.

Псевдонимы

У предметов могут быть псевдонимы. Игровой движок работает с псевдонимами предметов как будто это сами предметы. Псевдонимы используются в двух случаях:

  • Чтобы переименовать удалённые предметы на что нибудь другое. На карте или в инвентаре могут появится неизвестные блоки (unknown nodes), если просто удалить предмет из мода без исправления кода.
  • Для сокращения названий. Команда /giveme dirt получается короче, чем /giveme default:dirt.

Зарегистрировать псевдоним очень просто. Нужно запомнить правильный порядок аргументов from → to, гле from — это псевдоним, а to — это сам предмет.

core.register_alias("dirt", "default:dirt")

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

itemname = core.registered_aliases[itemname] or itemname

Текстуры

Файлы текстур нужно класть в папку textures/ и давать имена в следующем формате: modname_itemname.png.\ Можно использовать текстуры в формате JPEG, но они не поддерживают прозрачность и, обычно, плохо выглядят при низком разрешении. Лучше использовать формат PNG.

Обычно, текстуры в Minetest имеют размер 16 на 16 пикселей. Вообще, разрешение может быть любым, но рекомендуется использовать значения степени двойки, например 16, 32, 64 или 128. В противном случае они могут вызвать проблемы с производительностью на старых компьютерах и особенно телефонах.

Регистрация простого блока

Блоки регистрируются так же, как и предметы, только другой функцией:

core.register_node("mymod:diamond", {
    description = "Alien Diamond",
    tiles = {"mymod_diamond.png"},
    is_ground_content = true,
    groups = {cracky=3, stone=1}
})

При объявлении блока в список аттрибутов добавляются дополнительные свойства, характерные для блоков.

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

сверху (+Y), снизу (-Y), справа (+X), слева (-X), сзади (+Z), спереди (-Z).
(+Y, -Y, +X, -X, +Z, -Z)

Запомните, что +Y это верх в Minetest, как и в большинстве других игр.

core.register_node("mymod:diamond", {
    description = "Alien Diamond",
    tiles = {
        "mymod_diamond_up.png",    -- y+
        "mymod_diamond_down.png",  -- y-
        "mymod_diamond_right.png", -- x+
        "mymod_diamond_left.png",  -- x-
        "mymod_diamond_back.png",  -- z+
        "mymod_diamond_front.png", -- z-
    },
    is_ground_content = true,
    groups = {cracky = 3},
    drop = "mymod:diamond_fragments"
    -- ^  Выпадает не сам алмаз, а mymod:diamond_framgents
})

Свойство is_ground_content позволяет генерировать пещеры в каменной толще. Это важно для всех блоков, которые должны появляться под землёй в процессе генерации карты. Пещеры прорезаются после того, как будут сгенерированы все остальные блоки в данной области.

Рецепты

Существует несколько типов рецептов, которые указываются через свойство type.

  • shaped — Ингредиенты должны быть сложены в правильном порядке.
  • shapeless — Порядок ингредиентов не важен, важно лишь их наличие и количество.
  • cooking — Можно приготовить в печи.
  • fuel — Может быть топливом для печи.
  • tool_repair — Можно отремонтировать инструментом.

Рецепты крфта — это не предметы, и поэтому им не нужно указывать имя.

Shaped

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

core.register_craft({
    type = "shaped",
    output = "mymod:diamond_chair 99",
    recipe = {
        {"mymod:diamond_fragments", "",                         ""},
        {"mymod:diamond_fragments", "mymod:diamond_fragments",  ""},
        {"mymod:diamond_fragments", "mymod:diamond_fragments",  ""}
    }
})

Обратите внимание на пустую колонку в правой части. Так обозначается, что должна быть пустая колонка справа, иначе рецепт не будет работать. Если пустая колонка не требуется, постые строки можно не указывать:

core.register_craft({
    output = "mymod:diamond_chair 99",
    recipe = {
        {"mymod:diamond_fragments", ""                       },
        {"mymod:diamond_fragments", "mymod:diamond_fragments"},
        {"mymod:diamond_fragments", "mymod:diamond_fragments"}
    }
})

Свойство type можно не указывать, потому что все рецепты по умолчанию считаются shaped.

Shapeless

В рецептах shapeless не важно расположение ингредиентов, они просто должны быть.

core.register_craft({
    type = "shapeless",
    output = "mymod:diamond 3",
    recipe = {
        "mymod:diamond_fragments",
        "mymod:diamond_fragments",
        "mymod:diamond_fragments",
    },
})

Cooking и Fuel

Рецепты типа cooking предназначены не для сетки крафта, а для приготовления в различных типах печей.

core.register_craft({
    type = "cooking",
    output = "mymod:diamond_fragments",
    recipe = "default:coalblock",
    cooktime = 10,
})

Единственное отличие в коде такого рецепта заключается в том, что поле recipe — это просто одно свойство, а не таблица. Кроме того, в таких рецептах можно указывать свойство "cooktime", в котором задаётся время приготовления. По умоланию, оно равно 3.

Указанный выше рецепт работает, когда во входной слот печи кладут блок угля, а в слот топлива — какое-нибудь топливо. Через 10 секунд на выходе получается кусочек алмаза.

Рецепты типа fuel дополняют рецепты типа cooking. Они указывают, что можно использовать в качестве топлива в печах.

core.register_craft({
    type = "fuel",
    recipe = "mymod:diamond",
    burntime = 300,
})

У таких рецептов нет свойства output, но есть свойство burntime, определяющее время горения предмета в печи (в секнудах). В данном примере алмаз получается хорошим топливом, потому что он горит целых 300 секунд!

Группы

Предметы можно объединять в группы, и в группах может быть множество предметов. Принадлежность к группе указывается с помощью аттрибута groups в таблице аттрибутов.

groups = {cracky = 3, wood = 1}

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

core.register_craft({
    type = "shapeless",
    output = "mymod:diamond_thing 3",
    recipe = {"group:wood", "mymod:diamond"}
})

Инструменты, Возможности, и Способы ломания

Способы ломания — это группы, которые обозначают, насколько блок устойчив к разным типам инструментов. Чем большее значение задано группе, тем проще сломать блок данным видом инструмента. Можно комбинировать несколько способов ломания, чтобы позволить игрокам эффективнее использовать разные виды инструментов. Если не указать никакой из способов ломания, блок нельзя будет сломать.

Группа Инструмент Описание
crumbly лопата Земля, песок
cracky кирка Твердый (но хрупкий) материал. Например, камень.
snappy любой Можно сломать чем угодно. Например, листья, неболшие растения, проволока.
choppy топор Можно разрубить. Например, деревья, доски.
fleshy меч Живые объекты, такие как животные или игроки.
Могут быть эффекты крови при ударе.
explody ? Может взрываться
oddly_breakable_by_hand любой Факелы и подобные быстро ломаемые вещи

У каждого инструмента есть Возможности — это список типов ломания с соответствующими свойствами, такими как время ломания и степень износа. Кроме того, можно указывать максимально допустимую прочность блоков, которые можно ломать данным инструментом. Таким образом можно запретить ломать твёрдые блоки слишком простыми инструментами. Обычно, всем инструментам указывают все возможные способы ломания, делая неподходящие способы сильно неэффективными. Если игрок пытается сломать блок инструментом, не поддерживающим такой тип блоков, то будет применяться свойство рук, а не инструмента.

core.register_tool("mymod:tool", {
    description = "My Tool",
    inventory_image = "mymod_tool.png",
    tool_capabilities = {
        full_punch_interval = 1.5,
        max_drop_level = 1,
        groupcaps = {
            crumbly = {
                maxlevel = 2,
                uses = 20,
                times = { [1]=1.60, [2]=1.20, [3]=0.80 }
            },
        },
        damage_groups = {fleshy=2},
    },
})

groupcaps — это список поддерживаемых Способов ломания. damage_groups позволяет указать, каким образом инструмент повреждает блок, это будет описано позже в главе "Объекты, Игроки и Сущности".