Создание вашего первого блока
Блоки являются основой строительства в Minecraft. Как и всё здесь, блоки хранятся в реестрах.
Подготовка класса вашего блока
Если вы прошли туториал Создание первого предмета, этот процесс будет вам хорошо знаком. Необходимо создать метод для регистрации блока и предмета блока.
Поместите этот метод в класс ModBlocks (или как вы его назовете).
Что-то подобное Mojang делают с ванильными блоками. Вы можете обратиться к классу Blocks, чтобы увидеть, как они это делают.
java
public class ModBlocks {
private static Block register(String name, Function<BlockBehaviour.Properties, Block> blockFactory, BlockBehaviour.Properties settings, boolean shouldRegisterItem) {
// Create a registry key for the block
ResourceKey<Block> blockKey = keyOfBlock(name);
// Create the block instance
Block block = blockFactory.apply(settings.setId(blockKey));
// Sometimes, you may not want to register an item for the block.
// Eg: if it's a technical block like `minecraft:moving_piston` or `minecraft:end_gateway`
if (shouldRegisterItem) {
// Items need to be registered with a different type of registry key, but the ID
// can be the same.
ResourceKey<Item> itemKey = keyOfItem(name);
BlockItem blockItem = new BlockItem(block, new Item.Properties().setId(itemKey).useBlockDescriptionPrefix());
Registry.register(BuiltInRegistries.ITEM, itemKey, blockItem);
}
return Registry.register(BuiltInRegistries.BLOCK, blockKey, block);
}
private static ResourceKey<Block> keyOfBlock(String name) {
return ResourceKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name));
}
private static ResourceKey<Item> keyOfItem(String name) {
return ResourceKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name));
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Как и в случае с предметами, необходимо убедиться, что класс загружен, чтобы все статические поля с экземплярами ваших блоков были инициализированы.
Это можно сделать, создав пустой метод initialize, который может быть вызван в инициализаторе вашего мода, чтобы запустить статическую инициализацию.
INFO
Если вы не знакомы со статической инициализацией, это процесс инициализации статических полей в классе. Это происходит при загрузке класса JVM и выполняется до создания любых экземпляров этого класса.
java
public class ModBlocks {
// ...
public static void initialize() {}
}1
2
3
4
5
2
3
4
5
java
public class ExampleModBlocks implements ModInitializer {
@Override
public void onInitialize() {
ModBlocks.initialize();
}
}1
2
3
4
5
6
2
3
4
5
6
Создание И Регистрирование Вашего Блока
Как и предметы, блоки принимают в конструкторе класс BlockBehaviour.Properties, который задаёт свойства блока, такие как звуковые эффекты и уровень добычи.
Мы не будем рассматривать здесь все параметры: вы можете самостоятельно посмотреть класс и ознакомиться с различными опциями, которые должны быть интуитивно понятны.
В качестве примера мы создадим простой блок со свойствами земли, но из другого материала.
- Мы создаём настройки блока аналогично тому, как создавали настройки предмета в руководстве по предметам.
- Мы указываем методу
registerсоздать экземплярBlockиз настроек блока, вызвав конструкторBlock.
TIP
Вы также можете использовать BlockBehaviour.Properties.ofFullCopy(BlockBehaviour block), чтобы скопировать настройки существующего блока. В данном случае мы могли бы использовать Blocks.DIRT, чтобы скопировать настройки земли, но в качестве примера используем builder.
java
public static final Block CONDENSED_DIRT = register(
"condensed_dirt",
Block::new,
BlockBehaviour.Properties.of().sound(SoundType.GRASS),
true
);1
2
3
4
5
6
2
3
4
5
6
Чтобы автоматически создать предмет блока, мы можем передать true в параметр shouldRegisterItem метода register, который мы создали на предыдущем шаге.
Добавление предмета вашего блока в креативную вкладку
Поскольку BlockItem создаётся и регистрируется автоматически, чтобы добавить его в креативную вкладку, нужно использовать метод Block.asItem(), чтобы получить экземпляр BlockItem.
В этом примере мы добавим блок во вкладку BUILDING_BLOCKS. Чтобы вместо этого добавить блок в пользовательскую креативную вкладку, см. Пользовательские креативные вкладки.
java
CreativeModeTabEvents.modifyOutputEvent(CreativeModeTabs.BUILDING_BLOCKS).register((creativeTab) -> {
creativeTab.accept(ModBlocks.CONDENSED_DIRT.asItem());
});1
2
3
2
3
Это следует разместить внутри функции initialize() вашего класса.
Теперь вы должны заметить, что ваш блок есть в творческом инвентаре и его можно размещать в мире!

Однако есть несколько проблем — предмет блока не имеет названия, а у блока нет ни текстуры, ни модели блока, ни модели предмета.
Добавление переводов блока
Чтобы добавить перевод, нужно создать ключ перевода в вашем файле переводов — assets/example-mod/lang/en_us.json.
Minecraft будет использовать этот перевод в творческом инвентаре и в других местах, где отображается название блока, например в ответах команд.
json
{
"block.example-mod.condensed_dirt": "Condensed Dirt"
}1
2
3
2
3
Вы можете либо перезапустить игру, либо собрать мод и нажать F3+T, чтобы применить изменения — после этого вы увидите, что у блока есть название в творческом инвентаре и в других местах, например на экране статистики.
Модели и текстуры
Все текстуры блоков находятся в папке assets/example-mod/textures/block — пример текстуры для блока «Сжатая земля» можно свободно использовать.
Чтобы текстура отображалась в игре, нужно создать модель блока, которая находится в файле assets/example-mod/models/block/condensed_dirt.json для блока «Сжатая земля». Для этого блока мы будем использовать тип модели block/cube_all.
json
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "example-mod:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
Чтобы блок отображался в вашем инвентаре, нужно создать клиентский предмет, который указывает на модель вашего блока. В этом примере клиентский предмет для блока «Сжатая земля» находится в assets/example-mod/items/condensed_dirt.json.
json
{
"model": {
"type": "minecraft:model",
"model": "example-mod:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
TIP
Вам нужно создавать клиентский предмет только в том случае, если вы зарегистрировали BlockItem вместе с вашим блоком!
При загрузке игры вы можете заметить, что текстура всё ещё отсутствует. Это происходит потому, что нужно добавить определение blockstate.
Создание определения состояния блока
Определение blockstate используется для того, чтобы указать игре, какую модель нужно отрисовывать в зависимости от текущего состояния блока.
Для примерного блока, у которого нет сложного blockstate, в определении нужен только один элемент.
Этот файл должен находиться в папке assets/example-mod/blockstates, а его имя должно совпадать с ID блока, используемым при регистрации блока в классе ModBlocks. Например, если ID блока condensed_dirt, файл должен называться condensed_dirt.json.
json
{
"variants": {
"": {
"model": "example-mod:block/condensed_dirt"
}
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
TIP
Blockstate очень сложны, поэтому они будут рассмотрены отдельно на следующей странице — blockstates.
Перезапустив игру или обновив её с помощью F3+T для применения изменений, вы должны увидеть текстуру блока в инвентаре и непосредственно в мире:

Добавление дропа блока
При разрушении блока в режиме выживания может быть замечено, что блок не выпадает — это может быть ожидаемым поведением. Однако чтобы блок выпадал как предмет при разрушении, необходимо реализовать таблицу добычи блока. Файл loot table должен находиться в папке data/example-mod/loot_table/blocks/.
INFO
Для более глубокого понимания таблиц добычи вы можете обратиться к странице Minecraft Wiki — Таблицы добычи.
json
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "example-mod:condensed_dirt"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Эта таблица добычи обеспечивает выпадение одного предмета блока при его разрушении, а также при взрыве.
Рекомендация инструмента для добычи
Вы также можете сделать так, чтобы ваш блок можно было добывать только определённым инструментом — например, ускорить добычу блока с помощью лопаты.
Все теги инструментов должны находиться в папке data/minecraft/tags/block/mineable/, где имя файла зависит от типа используемого инструмента и может быть одним из следующих:
hoe.jsonaxe.jsonpickaxe.jsonshovel.json
Содержимое файла довольно простое — это список предметов, которые должны быть добавлены в тег.
Этот пример добавляет блок «Сжатая земля» в тег shovel.
json
{
"replace": false,
"values": ["example-mod:condensed_dirt"]
}1
2
3
4
2
3
4
Если вы хотите, чтобы для добычи блока требовался инструмент, нужно добавить .requiresCorrectToolForDrops() в настройки блока, а также указать соответствующий тег уровня добычи.
Уровни добычи
Аналогично, тег уровня добычи находится в папке data/minecraft/tags/block/ и имеет следующий формат:
needs_stone_tool.json— минимальный уровень: каменные инструментыneeds_iron_tool.json— минимальный уровень: железные инструментыneeds_diamond_tool.json— минимальный уровень: алмазные инструменты.
Файл имеет тот же формат, что и файл для инструмента добычи — список предметов, добавляемых в тег.
Дополнительные заметки
Если вы добавляете несколько блоков в ваш мод, стоит рассмотреть использование генерации данных, чтобы автоматизировать создание моделей блоков и предметов, определений blockstate и таблиц добычи.







