Тонирование блоков 26.1.2
Узнайте, как динамически тонировать блок.
Иногда может потребоваться, чтобы внешний вид блоков обрабатывался в игре особым образом. Например, к некоторым блокам, таким как трава, применяется тонировка.
Давайте посмотрим, как можно изменить внешний вид блока.
Для этого примера давайте зарегистрируем блок. Если вы не знакомы с этим процессом, сначала прочитайте о регистрации блока.
java
public static final Block WAXCAP = register(
"waxcap",
Block::new,
BlockBehaviour.Properties.of()
.noCollision()
.instabreak()
.offsetType(BlockBehaviour.OffsetType.XYZ),
true
);1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Обязательно добавьте:
- Состояние блока в
/blockstates/waxcap.json - модель в
/models/block/waxcap.json - текстура в
/textures/block/waxcap.png
Если все правильно, вы сможете увидеть блок в игре.

Источники тонировки блоков
Хотя наш блок выглядит нормально в игре, его текстура — в оттенках серого. Мы можем динамически применить цветовую тонировку, как это происходит с листвой в ванильной игре, которая меняет цвет в зависимости от биома.
Fabric API предоставляет BlockColorRegistry для регистрации списка BlockTintSource, которые мы будем использовать для динамической окраски блока.
Используем этот API, чтобы зарегистрировать тонировку так, чтобы наш блок восковика выглядел зелёным, если он размещён на траве, а в остальных случаях — коричневым.
В вашем клиентском инициализаторе зарегистрируйте блок в ColorProviderRegistry вместе с соответствующей логикой.
java
BlockColorRegistry.register(List.of(new BlockTintSource() {
@Override
public int colorInWorld(BlockState state, BlockAndTintGetter level, BlockPos pos) {
BlockState stateBelow = level.getBlockState(pos.below());
if (stateBelow.is(Blocks.GRASS_BLOCK)) {
return 0xFF98FB98; // Color code in hex format
}
return 0xFFFFDAB9; // Color code in hex format
}
@Override
public int color(BlockState state) {
return 0xFFFFDAB9; // Color code in hex format
}
}), ModBlocks.WAXCAP);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Теперь блок будет окрашиваться в зависимости от того, где он размещён.


