🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
Страница написана для версии игры:
1.21.4
Блоки являются основой строительства в Minecraft. Как и всё здесь, блоки хранятся в реестрах.
Если вы прошли туториал Создание первого предмета, этот процесс будет вам хорошо знаком. Необходимо создать метод для регистрации блока и предмета блока.
Поместите этот метод в класс ModBlocks
(или как вы его назовете).
Что-то подобное Mojang делают с ванильными блоками. Вы можете обратиться к классу Blocks
, чтобы увидеть, как они это делают.
public class ModBlocks {
private static Block register(String name, Function<AbstractBlock.Settings, Block> blockFactory, AbstractBlock.Settings settings, boolean shouldRegisterItem) {
// Create a registry key for the block
RegistryKey<Block> blockKey = keyOfBlock(name);
// Create the block instance
Block block = blockFactory.apply(settings.registryKey(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.
RegistryKey<Item> itemKey = keyOfItem(name);
BlockItem blockItem = new BlockItem(block, new Item.Settings().registryKey(itemKey));
Registry.register(Registries.ITEM, itemKey, blockItem);
}
return Registry.register(Registries.BLOCK, blockKey, block);
}
private static RegistryKey<Block> keyOfBlock(String name) {
return RegistryKey.of(RegistryKeys.BLOCK, Identifier.of(FabricDocsReference.MOD_ID, name));
}
private static RegistryKey<Item> keyOfItem(String name) {
return RegistryKey.of(RegistryKeys.ITEM, Identifier.of(FabricDocsReference.MOD_ID, name));
}
}
Как и в случае с предметами, необходимо убедиться, что класс загружен, чтобы все статические поля с экземплярами ваших блоков были инициализированы.
Вы можете сделать это, создав фиктивный метод initialize
, который можно вызвать в вашем инициализаторе мода для запуска статической инициализации.
INFO
Если вы не знаете, что такое статическая инициализация, это процесс инициализации статических полей в классе. Она выполняется, когда JVM загружает класс, и завершается до создания какого-либо экземпляра класса.
public class ModBlocks {
// ...
public static void initialize() {}
}
public class FabricDocsReferenceBlocks implements ModInitializer {
@Override
public void onInitialize() {
ModBlocks.initialize();
}
}
Подобно предметам, блоки имеют в своем конструкторе класс Blocks.Settings
, который определяет такие свойства блока как его звуковые эффекты и уровень добычи.
Мы не будем рассматривать здесь все настройки, вы можете сами заглянуть в класс, чтобы увидеть их варианты, которые говорят сами за себя.
Для примера мы создадим простой блок, который имеет свойства земли, но представляет другой материал.
RegistryKey<Block>
, который используется как уникальный идентификатор нашего блока, он передается в Registry.register в предыдущем методе утилиты.RegistryKey<Block>
также требуется сборщику AbstractBlock.Settings
.TIP
Вы можете использовать AbstractBlock.Settings.copy(AbstractBlock block)
, чтобы скопировать параметры существующего блока. В данном случае мы могли бы использовать Blocks.DIRT
для копирования параметров блока земли, но для примера мы используем конструктор.
public static final Block CONDENSED_DIRT = register(
"condensed_dirt",
Block::new,
AbstractBlock.Settings.create().sounds(BlockSoundGroup.GRASS),
true
);
Поскольку BlockItem
был создан и зарегистрирован автоматически, для добавления его в группу элементов необходимо использовать метод Block.asItem()
для получения экземпляра BlockItem
.
Для автоматического создания предмета блока мы можем передать true
параметру shouldRegisterItem
метода register
, который мы создали на предыдущем шаге.
Для этого примера мы используем пользовательскую группу предметов, созданную на странице Собственные вкладки предметов.
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
Вы должны поместить это в функцию initialize()
в ваш класс.
После этого ваш блок появится в творческом инвентаре, и вы сможете разместить его в мире!
Осталось несколько проблем: предмет блока не имеет названия, а блок не имеет текстуры, модели блока и модели предмета.
Чтобы добавить перевод, необходимо создать ключ перевода в файле перевода - assets/mod-id/lang/en_us.json
.
Minecraft будет использовать этот перевод в творческом инвентаре и других местах, где отображается название блока, например, в качестве ответе команды.
{
"block.mod_id.condensed_dirt": "Condensed Dirt"
}
Вы можете перезапустить игру или создать свой мод и нажать F3+T, чтобы применить изменения — и вы увидите, что у блока есть имя в творческом инвентаре и других местах, таких как экран статистики.
Все текстуры блоков можно найти в папке assets/mod-id/textures/block
- пример текстуры для блока «Condensed Dirt» доступен для бесплатного использования.
Чтобы текстура отображалась в игре, вы должны создать блочную модель, которую можно найти в файле assets/mod-id/models/block/condensed_dirt.json
для блока "Condensed Dirt". Для этого блока мы будем использовать тип модели block/cube_all
.
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "fabric-docs-reference:block/condensed_dirt"
}
}
Чтобы блок отображался в вашем инвентаре, вам необходимо создать Описание модели предмета, которое указывает на вашу модель блока. В этом примере описание модели элемента для блока "Condensed Dirt" можно найти по адресу assets/mod-id/items/condensed_dirt.json
.
{
"model": {
"type": "minecraft:model",
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
TIP
Вам нужно создать описание модели элемента только в том случае, если вы зарегистрировали BlockItem
вместе со своим блоком!
При загрузке игры вы можете заметить, что текстура по-прежнему отсутствует. Это связано с тем, что вам необходимо добавить определение состояния блока.
Определение blockstate используется для указания игре, какую модель следует визуализировать на основе текущего состояния блока.
Для примера блок, который не имеет сложного состояния, в определении требуется только одна запись.
Этот файл должен находиться в папке assets/mod-id/blockstates
, а его имя должно совпадать с идентификатором блока, использованным при регистрации вашего блока в классе ModBlocks
. Например, если идентификатор блока — condensed_dirt
, файл должен называться condensed_dirt.json
.
{
"variants": {
"": {
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
}
TIP
Состояния блоков невероятно сложны, поэтому они будут рассмотрены далее на [отдельной странице] (./blockstates).
Перезапуск игры или перезагрузка через F3+T для применения изменений — вы сможете увидеть текстуру блока в инвентаре и физически в мире:
При разрушении блока в режиме выживания вы можете увидеть, что блок не выпадает. Возможно для этого вам понадобится эта функция, однако, чтобы блок выпадал как предмет при разрушении, необходимо реализовать его таблицу добычи. Файл таблицы добычи должен быть помещен в папку data/mod-id/loot_table/blocks/
.
INFO
Для более глубокого понимания таблиц добычи вы можете обратиться к официальной странице Minecraft Wiki - Loot Tables.
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "fabric-docs-reference:condensed_dirt"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}
В таблице добычи указано, какой предмет выпадет из блока, когда блок сломан и когда он взорван взрывом.
Вы также можете захотеть, чтобы ваш блок можно было собирать только определенным инструментом — например, вы можете захотеть ускорить сбор с помощью лопаты.
Все теги инструментов должны быть помещены в папку data/minecraft/tags/block/mineable/
, где имя файла зависит от типа используемого инструмента, одного из следующих:
hoe.json
axe.json
pickaxe.json
shovel.json
Содержимое файла довольно простое — это список элементов, которые следует добавить в теге.
В этом примере, блок «Condensed Dirt» добавляется к тегу shovel
.
{
"replace": false,
"values": ["fabric-docs-reference:condensed_dirt"]
}
Если вы хотите, чтобы для добычи блока требовался инструмент, вам нужно добавить .requiresTool()
к настройкам вашего блока, а также добавить соответствующий тег уровня добычи.
Аналогично тег уровня добычи можно найти в папке data/minecraft/tags/block/
, он имеет следующий формат:
needs_stone_tool.json
- Минимальный уровень: каменные инструментыneeds_iron_tool.json
- Минимальный уровень: железные инструментыneeds_diamond_tool.json
- Минимальный уровень: алмазные инструменты.Файл имеет тот же формат, что и файл инструмента для сбора — список элементов, которые необходимо добавить в теге.
Если вы добавляете в свой мод несколько блоков, вы можете рассмотреть возможность использования Генерации данных для автоматизации процесса создания моделей блоков и элементов, определений состояний блоков и таблиц добычи.