2024-11-29 07:55:28 +03:00
|
|
|
|
---
|
2024-11-29 07:58:25 +03:00
|
|
|
|
title: Блоки, предметы и крафт
|
2024-11-29 07:55:28 +03:00
|
|
|
|
layout: default
|
|
|
|
|
root: ../..
|
|
|
|
|
idx: 2.1
|
2024-11-29 07:58:25 +03:00
|
|
|
|
description: Вы узнаете как зарегистрировать новый блок, предмет или рецепт с помощью register_node, register_item и register_craft.
|
|
|
|
|
redirect_from: /ru/chapters/nodes_items_crafting.html
|
2024-11-29 07:55:28 +03:00
|
|
|
|
---
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
## Введение <!-- omit in toc -->
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Регистрация новых блоков, ингредиентов и рецептов встречается практически
|
|
|
|
|
во всех модах.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
- [Что такое Блоки и Предметы?](#what-are-nodes-and-items)
|
|
|
|
|
- [Регистрация предметов](#registering-items)
|
|
|
|
|
- [Названия предметов](#item-names)
|
|
|
|
|
- [Псевдонимы](#item-aliases)
|
|
|
|
|
- [Текстуры](#textures)
|
|
|
|
|
- [Регистрация простого блока](#registering-a-basic-node)
|
|
|
|
|
- [Рецепты](#crafting)
|
2024-11-29 07:55:28 +03:00
|
|
|
|
- [Shaped](#shaped)
|
|
|
|
|
- [Shapeless](#shapeless)
|
2024-11-29 07:58:25 +03:00
|
|
|
|
- [Cooking и Fuel](#cooking-and-fuel)
|
|
|
|
|
- [Группы](#groups)
|
|
|
|
|
- [Инструменты, Возможности, and Способы ломания](#tools-capabilities-and-dig-types)
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
## Что такое Блоки и Предметы?
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Все блоки и инструменты также являются Предметами. Предмет — это то,
|
|
|
|
|
что может лежать в инвентаре (даже если правила игры это запрещают).
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Блок — это Предмет, который может быть поставлен или найден в мире. В каждом
|
|
|
|
|
вокселе мира всегда находится один и только один блок (пустое место — это,
|
|
|
|
|
обычно, блок воздуха).
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Обычные предметы (не блоки) не могут быть поставлены в мире, а могут только
|
|
|
|
|
находиться в инвентаре или выпадать в мир.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Инструмент похож на обычный предмет, но его можно использовать. Когда вы
|
|
|
|
|
используете инструмент, шкала его прочности уменьшается до тех пор, пока он
|
|
|
|
|
не сломается. Инструменты не могут быть сгруппированы в стак. В будущем,
|
|
|
|
|
возможно, Инструменты не будут выделяться в отдельный тип, поскольку различие
|
|
|
|
|
между ними и обычными предметами довольно условное.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
## Регистрация предметов
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Объявление предмета состоит из *названия* и *аттрибутов*.
|
|
|
|
|
В аттрибутах записаны различные параметры, влияющие на поведение предмета.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_craftitem("modname:itemname", {
|
|
|
|
|
description = "My Special Item",
|
|
|
|
|
inventory_image = "modname_itemname.png"
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
### Названия предметов
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
У каждого предмета есть название для обращения к нему, которое должно иметь
|
|
|
|
|
следующий формат:
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
modname:itemname
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
`modname` — это имя мода, в котором предмет зарегистрирован, а `itemname` — это
|
|
|
|
|
название самого предмета. Название предмета должно быть уникальным и должно
|
|
|
|
|
отражать его суть.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Для написания `modname` и `itemname` используются только строчные буквы
|
|
|
|
|
английского алфавита, цифры и подчёркивания.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
### Псевдонимы
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
У предметов могут быть *псевдонимы*. Игровой движок работает с псевдонимами
|
|
|
|
|
предметов как будто это сами предметы. Псевдонимы используются в двух случаях:
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
* Чтобы переименовать удалённые предметы на что нибудь другое. На карте или
|
|
|
|
|
в инвентаре могут появится *неизвестные блоки* (unknown nodes), если
|
|
|
|
|
просто удалить предмет из мода без исправления кода.
|
|
|
|
|
* Для сокращения названий. Команда `/giveme dirt` получается короче,
|
|
|
|
|
чем `/giveme default:dirt`.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Зарегистрировать псевдоним очень просто. Нужно запомнить правильный порядок
|
|
|
|
|
аргументов `from → to`, гле *from* — это псевдоним, а *to* — это сам предмет.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_alias("dirt", "default:dirt")
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Моды должны всегд разименовывать псевдонимы перед тем как работать с именем
|
|
|
|
|
предмета, потому что движок сам этого не делает. Но это довольно просто:
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
itemname = core.registered_aliases[itemname] or itemname
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
### Текстуры
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Файлы текстур нужно класть в папку textures/ и давать имена в следующем
|
|
|
|
|
формате: `modname_itemname.png`.\\
|
|
|
|
|
Можно использовать текстуры в формате JPEG, но они не поддерживают прозрачность
|
|
|
|
|
и, обычно, плохо выглядят при низком разрешении. Лучше использовать формат PNG.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Обычно, текстуры в Minetest имеют размер 16 на 16 пикселей. Вообще, разрешение
|
|
|
|
|
может быть любым, но рекомендуется использовать значения степени двойки,
|
|
|
|
|
например 16, 32, 64 или 128. В противном случае они могут вызвать проблемы
|
|
|
|
|
с производительностью на старых компьютерах и особенно телефонах.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
## Регистрация простого блока
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Блоки регистрируются так же, как и предметы, только другой функцией:
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_node("mymod:diamond", {
|
|
|
|
|
description = "Alien Diamond",
|
|
|
|
|
tiles = {"mymod_diamond.png"},
|
|
|
|
|
is_ground_content = true,
|
|
|
|
|
groups = {cracky=3, stone=1}
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
При объявлении блока в список аттрибутов добавляются дополнительные свойства,
|
|
|
|
|
характерные для блоков.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Свойство `tiles` — это таблица с именами текстур этого блока.
|
|
|
|
|
Если указана только одна текстура, она используется для всех сторон блока.
|
|
|
|
|
Если нужно указать разные текстуры для сторон, то они должны быть перечислены
|
|
|
|
|
в следующем порядке:
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
сверху (+Y), снизу (-Y), справа (+X), слева (-X), сзади (+Z), спереди (-Z).
|
2024-11-29 07:55:28 +03:00
|
|
|
|
(+Y, -Y, +X, -X, +Z, -Z)
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Запомните, что +Y это верх в Minetest, как и в большинстве других игр.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
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"
|
2024-11-29 07:58:25 +03:00
|
|
|
|
-- ^ Выпадает не сам алмаз, а mymod:diamond_framgents
|
2024-11-29 07:55:28 +03:00
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Свойство `is_ground_content` позволяет генерировать пещеры в каменной толще.
|
|
|
|
|
Это важно для всех блоков, которые должны появляться под землёй в процессе
|
|
|
|
|
генерации карты. Пещеры прорезаются после того, как будут сгенерированы все
|
|
|
|
|
остальные блоки в данной области.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
## Рецепты
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Существует несколько типов рецептов, которые указываются через свойство `type`.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
* shaped — Ингредиенты должны быть сложены в правильном порядке.
|
|
|
|
|
* shapeless — Порядок ингредиентов не важен, важно лишь их наличие
|
|
|
|
|
и количество.
|
|
|
|
|
* cooking — Можно приготовить в печи.
|
|
|
|
|
* fuel — Может быть топливом для печи.
|
|
|
|
|
* tool_repair — Можно отремонтировать инструментом.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Рецепты крфта — это не предметы, и поэтому им не нужно указывать имя.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
### Shaped
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Для рецептов `shaped` важно расположение ингредиентов в сетке крафта.
|
|
|
|
|
В примере ниже фрагменты нужно расположить в форме стула, чтобы рецепт
|
|
|
|
|
сработал:
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
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", ""}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Обратите внимание на пустую колонку в правой части.
|
|
|
|
|
Так обозначается, что *должна* быть пустая колонка справа, иначе рецепт
|
|
|
|
|
не будет работать.
|
|
|
|
|
Если пустая колонка не требуется, постые строки можно не указывать:
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_craft({
|
|
|
|
|
output = "mymod:diamond_chair 99",
|
|
|
|
|
recipe = {
|
|
|
|
|
{"mymod:diamond_fragments", "" },
|
|
|
|
|
{"mymod:diamond_fragments", "mymod:diamond_fragments"},
|
|
|
|
|
{"mymod:diamond_fragments", "mymod:diamond_fragments"}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Свойство type можно не указывать, потому что все рецепты по умолчанию
|
|
|
|
|
считаются shaped.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
### Shapeless
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
В рецептах `shapeless` не важно расположение ингредиентов, они просто должны
|
|
|
|
|
быть.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_craft({
|
|
|
|
|
type = "shapeless",
|
|
|
|
|
output = "mymod:diamond 3",
|
|
|
|
|
recipe = {
|
|
|
|
|
"mymod:diamond_fragments",
|
|
|
|
|
"mymod:diamond_fragments",
|
|
|
|
|
"mymod:diamond_fragments",
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
### Cooking и Fuel
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Рецепты типа `cooking` предназначены не для сетки крафта, а для приготовления
|
|
|
|
|
в различных типах печей.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_craft({
|
|
|
|
|
type = "cooking",
|
|
|
|
|
output = "mymod:diamond_fragments",
|
|
|
|
|
recipe = "default:coalblock",
|
|
|
|
|
cooktime = 10,
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Единственное отличие в коде такого рецепта заключается в том, что поле recipe —
|
|
|
|
|
это просто одно свойство, а не таблица. Кроме того, в таких рецептах можно
|
|
|
|
|
указывать свойство "cooktime", в котором задаётся время приготовления.
|
|
|
|
|
По умоланию, оно равно 3.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Указанный выше рецепт работает, когда во входной слот печи кладут блок угля,
|
|
|
|
|
а в слот топлива — какое-нибудь топливо. Через 10 секунд на выходе получается
|
|
|
|
|
кусочек алмаза.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Рецепты типа `fuel` дополняют рецепты типа `cooking`. Они указывают, что
|
|
|
|
|
можно использовать в качестве топлива в печах.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_craft({
|
|
|
|
|
type = "fuel",
|
|
|
|
|
recipe = "mymod:diamond",
|
|
|
|
|
burntime = 300,
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
У таких рецептов нет свойства output, но есть свойство burntime, определяющее
|
|
|
|
|
время горения предмета в печи (в секнудах). В данном примере алмаз получается
|
|
|
|
|
хорошим топливом, потому что он горит целых 300 секунд!
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
## Группы
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Предметы можно объединять в группы, и в группах может быть множество предметов.
|
|
|
|
|
Принадлежность к группе указывается с помощью аттрибута `groups` в таблице
|
|
|
|
|
аттрибутов.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
groups = {cracky = 3, wood = 1}
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Есть несколько причин указывать группы.
|
|
|
|
|
Во первых, группы позволяют указать такие свойства, как способ ломания блока
|
|
|
|
|
и его горючесть.
|
|
|
|
|
Во вторых, в рецептах крафта в качестве ингредиентов можно указывать группы
|
|
|
|
|
вместо конкретных предметов.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
core.register_craft({
|
|
|
|
|
type = "shapeless",
|
|
|
|
|
output = "mymod:diamond_thing 3",
|
|
|
|
|
recipe = {"group:wood", "mymod:diamond"}
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
## Инструменты, Возможности, и Способы ломания
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
Способы ломания — это группы, которые обозначают, насколько блок устойчив
|
|
|
|
|
к разным типам инструментов.
|
|
|
|
|
Чем большее значение задано группе, тем проще сломать блок данным видом
|
|
|
|
|
инструмента.
|
|
|
|
|
Можно комбинировать несколько способов ломания, чтобы позволить игрокам
|
|
|
|
|
эффективнее использовать разные виды инструментов.
|
|
|
|
|
Если не указать никакой из способов ломания, блок нельзя будет сломать.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
| Группа | Инструмент | Описание |
|
|
|
|
|
|-------------------------|------------|--------------------------------------------------------------------------------------|
|
|
|
|
|
| crumbly | лопата | Земля, песок |
|
|
|
|
|
| cracky | кирка | Твердый (но хрупкий) материал. Например, камень. |
|
|
|
|
|
| snappy | *любой* | Можно сломать чем угодно. Например, листья, неболшие растения, проволока. |
|
|
|
|
|
| choppy | топор | Можно разрубить. Например, деревья, доски. |
|
|
|
|
|
| fleshy | меч | Живые объекты, такие как животные или игроки.<br>Могут быть эффекты крови при ударе. |
|
|
|
|
|
| explody | ? | Может взрываться |
|
|
|
|
|
| oddly_breakable_by_hand | *любой* | Факелы и подобные быстро ломаемые вещи |
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
У каждого инструмента есть Возможности — это список типов ломания
|
|
|
|
|
с соответствующими свойствами, такими как время ломания и степень износа.
|
|
|
|
|
Кроме того, можно указывать максимально допустимую прочность блоков, которые
|
|
|
|
|
можно ломать данным инструментом. Таким образом можно запретить ломать твёрдые
|
|
|
|
|
блоки слишком простыми инструментами. Обычно, всем инструментам указывают все
|
|
|
|
|
возможные способы ломания, делая неподходящие способы сильно неэффективными.
|
|
|
|
|
Если игрок пытается сломать блок инструментом, не поддерживающим такой тип
|
|
|
|
|
блоков, то будет применяться свойство рук, а не инструмента.
|
2024-11-29 07:55:28 +03:00
|
|
|
|
|
|
|
|
|
```lua
|
|
|
|
|
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},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
2024-11-29 07:58:25 +03:00
|
|
|
|
`groupcaps` — это список поддерживаемых Способов ломания.
|
|
|
|
|
`damage_groups` позволяет указать, каким образом инструмент повреждает блок,
|
|
|
|
|
это будет описано позже в главе "Объекты, Игроки и Сущности".
|