🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
This page is written for:
1.21
This page is written for:
1.21
Блоки являются основой строительства в Minecraft. Как и всё здесь, блоки хранятся в реестрах.
Если вы прошли туториал Создание первого предмета, этот процесс будет вам хорошо знаком. Необходимо создать метод для регистрации блока и предмета блока.
Поместите этот метод в класс ModBlocks
(или как вы его назовете).
Что-то подобное Mojang делают с ванильными блоками. Вы можете обратиться к классу Blocks
, чтобы увидеть, как они это делают.
public class ModBlocks {
public static Block register(Block block, String name, boolean shouldRegisterItem) {
// Register the block and its item.
Identifier id = Identifier.of(FabricDocsReference.MOD_ID, name);
// Sometimes, you may not want to register an item for the block.
// Eg: if it's a technical block like `minecraft:air` or `minecraft:end_gateway`
if (shouldRegisterItem) {
BlockItem blockItem = new BlockItem(block, new Item.Settings());
Registry.register(Registries.ITEM, id, blockItem);
}
return Registry.register(Registries.BLOCK, id, block);
}
}
Как и в случае с предметами, необходимо убедиться, что класс загружен, чтобы все статические поля с экземплярами ваших блоков были инициализированы.
Это можно сделать, создав пустой метод initialize
, который может быть вызван в инициализаторе вашего мода, чтобы запустить статическую инициализацию.
INFO
Если вы не знаете, что такое статическая инициализация, это процесс инициализации статических полей в классе. Она выполняется, когда JVM загружает класс, и завершается до создания какого-либо экземпляра класса.
public class ModBlocks {
// ...
public static void initialize() {}
}
public class FabricDocsReferenceBlocks implements ModInitializer {
@Override
public void onInitialize() {
ModBlocks.initialize();
}
}
Подобно предметам, блоки имеют в своем конструкторе класс Blocks.Settings
, который определяет такие свойства блока как его звуковые эффекты и уровень добычи.
Мы не будем рассматривать здесь все настройки, вы можете сами заглянуть в класс, чтобы увидеть их варианты, которые говорят сами за себя.
Для примера мы создадим простой блок, который имеет свойства земли, но представляет другой материал.
TIP
Вы можете использовать AbstractBlock.Settings.copy(AbstractBlock block)
, чтобы скопировать параметры существующего блока. В данном случае мы могли бы использовать Blocks.DIRT
для копирования параметров блока земли, но для примера мы используем конструктор.
public static final Block CONDENSED_DIRT = register(
new Block(AbstractBlock.Settings.create().sounds(BlockSoundGroup.GRASS)),
"condensed_dirt",
true
);
Для автоматического создания предмета блока мы можем передать true
параметру shouldRegisterItem
метода register
, который мы создали на предыдущем шаге.
Поскольку BlockItem
был создан и зарегистрирован автоматически, для добавления его в группу элементов необходимо использовать метод Block.asItem()
для получения экземпляра BlockItem
.
Для этого примера мы используем пользовательскую группу предметов, созданную на странице Собственные вкладки предметов.
public static final Block CONDENSED_OAK_LOG = register(
new PillarBlock(
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.WOOD)
), "condensed_oak_log", true
);
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
После этого ваш блок появится в творческом инвентаре, и вы сможете разместить его в мире!
.
Осталось несколько проблем: предмет блока не имеет названия, а блок не имеет текстуры, модели блока и модели предмета.
Чтобы добавить перевод, необходимо создать ключ перевода в файле перевода - assets/<mod id here>/lang/en_us.json
.
Minecraft будет использовать этот перевод в творческом инвентаре и других местах, где отображается название блока, например, в качестве ответе команды.
{
"block.mod_id.condensed_dirt": "Condensed Dirt"
}
Вы можете перезапустить игру или создать свой мод и нажать F3 + T, чтобы применить изменения. После этого вы увидите, что у блока есть имя в творческом инвентаре и других местах, например на экране статистики.
Все текстуры блоков можно найти в папке assets/<mod id here>/textures/block
- пример текстуры для блока «Condensed Dirt» доступен для бесплатного использования.
Чтобы текстура отображалась в игре, необходимо создать блок и модель предмета, которые можно найти в соответствующих местах для блока «Condensed Dirt»:
assets/<mod id here>/models/block/condensed_dirt.json
assets/<mod id here>/models/item/condensed_dirt.json
Модель элемента довольно проста, она может просто использовать модель блока в качестве родительской, поскольку большинство моделей блоков поддерживают визуализацию в графическом интерфейсе:
{
"parent": "fabric-docs-reference:block/condensed_dirt"
}
Однако в нашем случае модель блока должна быть родительской для модели block/cube_all
:
{
"parent": "block/cube_all",
"textures": {
"all": "fabric-docs-reference:block/condensed_dirt"
}
}
При загрузке игры вы можете заметить, что текстура по-прежнему отсутствует. Это связано с тем, что вам необходимо добавить определение состояния блока.
Определение blockstate используется для указания игре, какую модель следует визуализировать на основе текущего состояния блока.
Для примера блок, который не имеет сложного состояния, в определении требуется только одна запись.
Этот файл должен находиться в папке assets/mod_id/blockstates
, а его имя должно совпадать с идентификатором блока, использованным при регистрации вашего блока в классе ModBlocks
. Например, если идентификатор блока — condensed_dirt
, файл должен называться condensed_dirt.json
.
{
"variants": {
"": { "model": "mod_id:block/condensed_dirt" }
}
}
Состояния блоков действительно сложны, поэтому они рассматриваются на следующей странице: Состояния блоков
Перезапустите игру или перезагрузите только assets с помощью F3 + T, чтобы применить изменения. Вы должны будете увидеть текстуру блока в инвентаре и в мире:
При разрушении блока в режиме выживания вы можете увидеть, что блок не выпадает. Возможно для этого вам понадобится эта функция, однако, чтобы блок выпадал как предмет при разрушении, необходимо реализовать его таблицу добычи. Файл таблицы добычи должен быть помещен в папку data/<mod id here>/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"
]
}
Аналогично тег уровня добычи можно найти в той же папке, он имеет следующий формат:
needs_stone_tool.json
- Минимальный уровень: каменные инструментыneeds_iron_tool.json
- Минимальный уровень: железные инструментыneeds_diamond_tool.json
- Минимальный уровень: алмазные инструменты.Файл имеет тот же формат, что и файл инструмента для сбора — список элементов, которые необходимо добавить в теге.
Если вы добавляете в свой mod несколько блоков, вы можете рассмотреть возможность использования Генерации данных для автоматизации процесса создания моделей блоков и предметов, определений состояний блоков и таблиц добычи.