Стан блоку — це частина даних, що прикріплюється до окремого блоку у світі Minecraft та містить інформацію про блок у вигляді властивостей. Ось кілька прикладів властивостей, які в стандартній версії гри зберігаються в станах блоків:
- Обертання: Зазвичай використовується для колод та інших природних блоків.
- Активний: Широко використовується у пристроях з редстоуном і блоках, таких як піч або коптильня.
- Вік: Використовується в посівах, траві, саджанцях, ламінарії тощо.
Ви, напевно, розумієте чому вони корисні - вони уникають необхідності зберігати дані NBT дані у блоковій сутності - зменшуючи розмір світу, та запобігаючи проблемам із TPS!
Визначення станів блоку знаходиться у теці assets/mod-id/blockstates.
Наприклад: Блок колонна
Minecraft має деякі користувальницькі класи, які дозволять вам швидко створити певні типи блоків - в цьому прикладі розглядається створення блоку з властивістю axios шляхом створення блоку "Condensed Oak Log".
Ванільний клас PillarBlock дозволяє розміщувати блок по осях X, Y або Z.
java
public static final Block CONDENSED_OAK_LOG = register(
"condensed_oak_log",
PillarBlock::new,
AbstractBlock.Settings.create().sounds(BlockSoundGroup.WOOD),
true
);1
2
3
4
5
6
7
2
3
4
5
6
7
Блоки колон мають дві текстури, верхню та бічну - вони використовують модель block/cube_column.
Як і зазвичай, з усіма текстурами блоків, текстури можна знайти в assets/mod-id/textures/block
Оскільки стовпчик має два положення, горизонтальне та вертикальне, нам потрібно буде створити два окремих файли моделі:
condensed_oak_log_horizontal.json, який розширює модельblock/cube_column_horizontal.condensed_oak_log.json, який розширює модельblock/cube_column.
Приклад файлу condensed_oak_log_horizontal.json:
json
{
"parent": "minecraft:block/cube_column_horizontal",
"textures": {
"end": "fabric-docs-reference:block/condensed_oak_log_top",
"side": "fabric-docs-reference:block/condensed_oak_log"
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
INFO
Remember, blockstate files can be found in the assets/mod-id/blockstates folder, the name of the blockstate file should match the block ID used when registering your block in the ModBlocks class. For instance, if the block ID is condensed_oak_log, the file should be named condensed_oak_log.json.
Щоб детальніше ознайомитися з усіма модифікаторами, доступними у файлах стану блоку, перегляньте сторінку Вікі Minecraft — Моделі (Стани блоків).
Далі нам потрібно створити файл стану блоку, і саме тут відбувається магія. Блоки стовпів мають три осі, тому ми будемо використовувати конкретні моделі для таких ситуацій:
axis=x– коли блок розміщено вздовж осі X, ми повертатимемо модель у позитивному напрямку X.axis=y– коли блок розміщено вздовж осі Y, ми будемо використовувати звичайну вертикальну модель.axis=z– коли блок розміщується вздовж осі Z, ми повертаємо модель у позитивний X.
json
{
"variants": {
"axis=x": {
"model": "fabric-docs-reference:block/condensed_oak_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "fabric-docs-reference:block/condensed_oak_log"
},
"axis=z": {
"model": "fabric-docs-reference:block/condensed_oak_log_horizontal",
"x": 90
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Як завжди, вам потрібно буде створити переклад для свого блоку та модель предмета, яка є батьками будь-якої з двох моделей.

Власні стани блоків
Спеціальні стани блоку чудові, якщо ваш блок має унікальні властивості - іноді ви можете виявити, що ваш блок може повторно використовувати ванілльні властивості.
У цьому прикладі буде створено унікальну логічну властивість під назвою activated - коли гравець натискає ПКМ по блоку, він змінюватиме значення activated=false на activated=true, відповідно змінюючи свою текстуру.
Створення властивості
По-перше, вам потрібно буде створити саму властивість — оскільки це логічне значення, ми використаємо метод BooleanProperty.of.
java
public class PrismarineLampBlock extends Block {
public static final BooleanProperty ACTIVATED = BooleanProperty.of("activated");
}1
2
3
4
2
3
4
Далі ми маємо додати властивість до менеджера стану блоку в методі appendProperties. Щоб отримати доступ до конструктора, вам потрібно змінити метод:
java
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(ACTIVATED);
}1
2
3
4
5
2
3
4
5
Ви також повинні встановити стан за замовчуванням для властивості activated у конструкторі вашого спеціального блоку.
java
public PrismarineLampBlock(Settings settings) {
super(settings);
// Set the default state of the block to be deactivated.
setDefaultState(getDefaultState().with(ACTIVATED, false));
}1
2
3
4
5
6
7
2
3
4
5
6
7
Використання властивості
У цьому прикладі змінюється логічна властивість activated, коли гравець взаємодіє з блоком. Для цього ми можемо замінити метод onUse:
java
@Override
protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {
if (!player.getAbilities().allowModifyWorld) {
// Skip if the player isn't allowed to modify the world.
return ActionResult.PASS;
} else {
// Get the current value of the "activated" property
boolean activated = state.get(ACTIVATED);
// Flip the value of activated and save the new blockstate.
world.setBlockState(pos, state.with(ACTIVATED, !activated));
// Play a click sound to emphasise the interaction.
world.playSound(player, pos, SoundEvents.BLOCK_COMPARATOR_CLICK, SoundCategory.BLOCKS, 1.0F, 1.0F);
return ActionResult.SUCCESS;
}
}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
Візуалізація власності
Перед створенням файлу стану блоку вам потрібно буде надати текстури як для активованого, так і для деактивованого станів блоку, а також для моделі блоку.
Використовуйте свої знання про моделі блоків, щоб створити дві моделі для блоку: одну для активованого стану та одну для деактивованого стану. Зробивши це, ви можете розпочати створення файлу стану блоку.
Оскільки ви створили нову властивість, вам потрібно буде оновити файл стану блоку для врахування цієї властивості.
Якщо у вас є кілька властивостей у блоці, вам потрібно врахувати всі можливі комбінації. Наприклад, activated і axis призведе до 6 комбінацій (два можливі значення для activated і три можливі значення для axis).
Оскільки цей блок має лише два можливі варіанти, оскільки він має лише одну властивість («активовано»), стан блоку JSON виглядатиме приблизно так:
json
{
"variants": {
"activated=false": {
"model": "fabric-docs-reference:block/prismarine_lamp"
},
"activated=true": {
"model": "fabric-docs-reference:block/prismarine_lamp_on"
}
}
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
TIP
Не забудьте додати опис моделі предмета для блоку, щоб він показувався в інвентарі!
Оскільки прикладом блоку є лампа, нам також потрібно змусити її випромінювати світло, коли властивість activated має значення true. Це можна зробити через налаштування блоку, передані конструктору під час реєстрації блоку.
Ви можете використовувати метод luminance, щоб установити рівень світла, випромінюваного блоком, ми можемо створити статичний метод у класі PrismarineLampBlock, щоб повернути рівень освітлення на основі властивості activated, і передати його як посилання на метод до методу luminance:
java
public static int getLuminance(BlockState currentBlockState) {
// Get the value of the "activated" property.
boolean activated = currentBlockState.get(PrismarineLampBlock.ACTIVATED);
// Return a light level if activated = true
return activated ? 15 : 0;
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
java
public static final Block PRISMARINE_LAMP = register(
"prismarine_lamp",
PrismarineLampBlock::new,
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.LANTERN)
.luminance(PrismarineLampBlock::getLuminance),
true
);1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Коли ви все завершите, кінцевий результат має виглядати приблизно так:



