🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
Ця сторінка написана для версії:
1.21.4
Ця сторінка написана для версії:
1.21.4
Блоки є будівельними блоками Minecraft (без каламбуру) - як і все інше в Minecraft, вони зберігаються в реєстрах.
Якщо ви завершили сторінку Створення свого першого предмета, цей процес здасться вам дуже знайомим – вам потрібно буде створити метод, який реєструє ваш блок і його блок-предмет.
Вам слід помістити цей метод у клас під назвою ModBlocks
(або як ви хочете його назвати).
Mojang робить щось надзвичайно подібне з ванілльними блоками; ви можете звернутися до класу Blocks
, щоб побачити, як вони це роблять.
public class ModBlocks {
public static Block register(Block block, RegistryKey<Block> blockKey, boolean shouldRegisterItem) {
// 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) {
// Items need to be registered with a different type of registry key, but the ID
// can be the same.
RegistryKey<Item> itemKey = RegistryKey.of(RegistryKeys.ITEM, blockKey.getValue());
BlockItem blockItem = new BlockItem(block, new Item.Settings().registryKey(itemKey));
Registry.register(Registries.ITEM, itemKey, blockItem);
}
return Registry.register(Registries.BLOCK, blockKey, block);
}
}
Як і з предметами, вам потрібно переконатися, що клас завантажено, щоб усі статичні поля, що містять екземпляри вашого блоку, були ініціалізовані.
Ви можете зробити це, створивши фіктивний метод 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>
, який використовується як унікальний ID для нашого блоку, він передається в Registry.register
у попередньому методі утиліти.RegistryKey<Block>
також потрібен конструктору AbstractBlock.Settings
.TIP
Ви також можете використовувати AbstractBlock.Settings.copy(AbstractBlock block)
, щоб скопіювати налаштування блоку що існує, у цьому випадку ми могли б використати Blocks.DIRT
, щоб скопіювати налаштування dirt, але для прикладу ми скористаємося конструктором.
public static final RegistryKey<Block> CONDENSED_DIRT_KEY = RegistryKey.of(
RegistryKeys.BLOCK,
Identifier.of(FabricDocsReference.MOD_ID, "condensed_dirt")
);
public static final Block CONDENSED_DIRT = register(
new Block(AbstractBlock.Settings.create().registryKey(CONDENSED_DIRT_KEY).sounds(BlockSoundGroup.GRASS)),
CONDENSED_DIRT_KEY,
true
);
Щоб автоматично створити блок-предмет ми можемо передати true
параметру shouldRegisterItem
методу register
, який ми створили на попередньому кроці.
Оскільки BlockItem
створюється та реєструється автоматично, щоб додати його до групи предметів, ви повинні використати метод Block.asItem()
, щоб отримати примірник BlockItem
.
У цьому прикладі ми використаємо спеціальну групу предметів, створену на сторінці Групи власних предметів.
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
Ви повинні розмістити це у функції initialize()
вашого класу.
Тепер ви повинні помітити, що ваш блок знаходиться у творчому інвентарі, і його можна розмістити у світі!
Однак є кілька проблем: блок-предмет не має назви, і блок не має текстури, моделі блоку чи моделі предмета.
Щоб додати переклад, ви повинні створити ключ перекладу у своєму файлі перекладу - assets/mod-id/lang/en_us.json
, це англійська, для української створіть uk_ua.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"
}
}
Щоб блок позувався у вашому інвентарі, вам потрібно буде створити опис моделі предмета](../items/first-item#creating-the-item-model-description), який вказує на вашу модель блоку. Для цього прикладу опис моделі предмета для блоку «Condensed Dirt» можна знайти у assets/mod-id/items/condensed_dirt.json
.
{
"model": {
"type": "minecraft:model",
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
TIP
Вам потрібно лише створити опис моделі предмета, якщо ви зареєстрували BlockItem
разом зі своїм блоком!
Коли ви завантажуєте гру, ви можете помітити, що текстури все ще немає. Це тому, що вам потрібно додати визначення стану блоку.
Визначення стану блоку використовується для вказівки грі, яку модель промальовувати на основі поточного стану блоку.
Для прикладу блоку, який не має складного стану блока, у визначенні потрібен лише один запис.
Цей файл має міститися в папці assets/mod-id/blockstates
, а його назва має збігатися з ідентифікатором блоку, який використовується під час реєстрації вашого блоку в класі ModBlocks
. Наприклад, якщо ID блоку condensed_dirt
, файл повинен мати назву condensed_dirt.json
.
{
"variants": {
"": {
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
}
TIP
Стани блоків неймовірно складні, тому вони будуть розглянуті далі на їхній окремій сторінці.
Перезапустіть гру або перезавантажте за допомогою F3+T, щоб застосувати зміни – ви зможете побачити блокову текстуру в інвентарі та фізично у світі:
Під час розбивання блоку під час виживання ви можете побачити, що блок не падає — можливо, вам потрібна ця функція, однак, щоб ваш блок випадав як предмет під час ламання, ви повинні застосувати його таблицю здобичі — файл таблиці здобичі слід розмістити в теку data/mod-id/loot_table/blocks/
.
INFO
Щоб краще зрозуміти таблиці здобичі, ви можете звернутися до сторінки Minecraft Wiki - Таблиці здобичі.
{
"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
- потребує як мінімум діамантові інструменти.Файл має той самий формат, що й файл інструменту збору врожаю – список предметів, які потрібно додати до теґу.
Якщо ви додаєте кілька блоків до свого моду, ви можете розглянути можливість використання генерації даних для автоматизації процесу створення моделей блоків і предметів, визначень стану блоків і таблиць здобичі.