Стан блока — це частина даних, що прикріплюється до окремого блока у світі Minecraft та містить інформацію про блок у вигляді властивостей. Ось кілька прикладів властивостей, які в стандартній версії гри зберігаються в станах блоків:
- Rotation: Зазвичай використовується для колод та інших природних блоків.
- Activated: Широко використовується у пристроях з редстоуном і блоках, таких як піч або коптильня.
- Age: Використовується в урожаях, рослинности, паростках, ламінарії тощо.
Ви, напевно, розумієте чому вони корисні — вони уникають необхідності зберігати дані NBT дані у блоках-сутностях — зменшуючи розмір світу, та запобігаючи проблемам із TPS!
Визначення станів блока знаходиться у теці assets/example-mod/blockstates.
Наприклад: Блок колона
Minecraft має деякі власні класи, які дозволять вам швидко створити певні типи блоків — в цьому прикладі розглядається створення блока з властивістю axios шляхом створення блока «Condensed Oak Log».
Усталений клас RotatedPillarBlock дозволяє розміщувати блок на осях X, Y або Z.
java
public static final Block CONDENSED_OAK_LOG = register(
"condensed_oak_log",
RotatedPillarBlock::new,
BlockBehaviour.Properties.of().sound(SoundType.WOOD),
true
);1
2
3
4
5
6
7
2
3
4
5
6
7
Блоки колон мають дві текстури, верхню та бокову — вони використовують модель block/cube_column.
Як і зазвичай, з усіма текстурами блоків, текстури можна знайти в assets/example-mod/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": "example-mod:block/condensed_oak_log_top",
"side": "example-mod:block/condensed_oak_log"
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
INFO
Пам'ятайте, файли стану блока можна знайти в теці assets/example-mod/blockstates, а його назва має збігатися з ID блока, використаним під час реєстрації вашого блока в класі ModBlocks. Наприклад, якщо ID блока condensed_oak_log, файл повинен мати назву condensed_oak_log.json.
Щоб детальніше ознайомитися з усіма модифікаторами, доступними у файлах стану блока, перегляньте сторінку Wiki Minecraft — Моделі (Стани блоків).
Далі нам потрібно створити файл стану блока, і саме тут відбувається магія. Блоки колони мають три осі, тому ми будемо використовувати конкретні моделі для таких ситуацій:
axis=x— коли блок розміщено вздовж осі X, ми повертатимемо модель у позитивному напрямку X.axis=y— коли блок розміщено вздовж осі Y, ми будемо використовувати звичайну вертикальну модель.axis=z— коли блок розміщується вздовж осі Z, ми повертаємо модель у позитивний X.
json
{
"variants": {
"axis=x": {
"model": "example-mod:block/condensed_oak_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "example-mod:block/condensed_oak_log"
},
"axis=z": {
"model": "example-mod: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.create.
java
public class PrismarineLampBlock extends Block {
public static final BooleanProperty ACTIVATED = BooleanProperty.create("activated");
}1
2
3
4
2
3
4
Далі ми маємо додати властивість до менеджера стану блока в методі createBlockStateDefinition. Щоб отримати доступ до конструктора, вам потрібно змінити метод:
java
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(ACTIVATED);
}1
2
3
4
5
2
3
4
5
Ви також повинні встановити усталений стан для властивості activated у конструкторі вашого спеціального блока.
java
public PrismarineLampBlock(Properties settings) {
super(settings);
// Set the default state of the block to be deactivated.
registerDefaultState(defaultBlockState().setValue(ACTIVATED, false));
}1
2
3
4
5
6
7
2
3
4
5
6
7
Використання властивості
У цьому прикладі змінюється логічна властивість activated, коли гравець взаємодіє з блоком. Для цього ми можемо замінити метод useWithoutItem:
java
@Override
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hit) {
if (!player.getAbilities().mayBuild) {
// Skip if the player isn't allowed to modify the level.
return InteractionResult.PASS;
} else {
// Get the current value of the "activated" property
boolean activated = state.getValue(ACTIVATED);
// Flip the value of activated and save the new blockstate.
level.setBlockAndUpdate(pos, state.setValue(ACTIVATED, !activated));
// Play a click sound to emphasise the interaction.
level.playSound(player, pos, SoundEvents.COMPARATOR_CLICK, SoundSource.BLOCKS, 1.0F, 1.0F);
return InteractionResult.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": "example-mod:block/prismarine_lamp"
},
"activated=true": {
"model": "example-mod: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. Це можна зробити через налаштування блока, передані конструктору під час реєстрації блока.
Ви можете використовувати метод lightLevel, щоб установити рівень світла, випромінюваного блоком, ми можемо створити статичний метод у класі PrismarineLampBlock, щоб повернути рівень освітлення на основі властивості activated, і передати його як посилання на метод до методу lightLevel:
java
public static int getLuminance(BlockState currentBlockState) {
// Get the value of the "activated" property.
boolean activated = currentBlockState.getValue(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,
BlockBehaviour.Properties.of()
.sound(SoundType.LANTERN)
.lightLevel(PrismarineLampBlock::getLuminance),
true
);1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Коли ви все завершите, кінцевий результат має виглядати приблизно так:



