Внешний вид предметов 26.1.2
Узнайте, как динамически окрашивать предметы с помощью настраиваемых источников окрашивания.
Вы можете управлять внешним видом предмета через его клиентскую часть (client item). Список стандартных ванильных модификаций доступен на Minecraft Wiki.
Среди них часто используется тип Tint Sources (источники окрашивания), который позволяет изменять цвет предмета на основе предопределенных условий.
Существует лишь несколько источников окрашивания, поэтому давайте разберём, как создать собственный.
В этом примере мы будем использовать предмет блока ModBlocks.WAXCAP, зарегистрированный в разделе Тонирование блоков.
Завершите создание предмета, добавив:
- Клиентскую часть предмета в
/items/waxcap.json - Модель предмета в
/models/item/waxcap.json - Тестуру в
/textures/item/waxcap.png
Теперь у предмета должна появиться текстура.

Как вы можете видеть, мы используем текстуру в оттенках серого (grayscale). Давайте добавим цвет с помощью источника окрашивания (tint source).
Источники окрашивания предметов
Давайте зарегистрируем свой источник окрашивания, чтобы покрасить наш предмет Waxcap: во время дождя предмет будет синим, а в остальное время — коричневым.
Сначала вам нужно определить источник окрашивания предмета (item tint source). Это делается путем реализации интерфейса ItemTintSource в классе или записи (record).
java
public record RainTintSource(int color) implements ItemTintSource {
public RainTintSource() {
this(ARGB.opaque(0x00BFFF)); // Color code in hex format
}
}1
2
3
4
5
2
3
4
5
Поскольку это часть клиентского определения предмета, значения окрашивания можно изменить с помощью ресурс-пака. Поэтому вам нужно определить MapCodec, способный считывать ваше определение окрашивания. В данном случае источник окрашивания будет иметь целочисленное значение (int), описывающее цвет во время дождя. Мы можем использовать встроенный ExtraCodecs.RGB_COLOR_CODEC для сборки нашего кодека.
java
public static final MapCodec<RainTintSource> MAP_CODEC = RecordCodecBuilder.mapCodec(
instance -> instance.group(
ExtraCodecs.RGB_COLOR_CODEC.fieldOf("color").forGetter(RainTintSource::color)).apply(instance, RainTintSource::new)
);1
2
3
4
2
3
4
Затем мы можем вернуть этот кодек в методе type().
java
@Override
public @NotNull MapCodec<? extends ItemTintSource> type() {
return MAP_CODEC;
}1
2
3
4
2
3
4
Наконец, мы можем реализовать метод calculate, который будет определять итоговый цвет окрашивания. Значение color — это как раз тот цвет, который приходит из ресурс-пака.
java
@Override
public int calculate(ItemStack itemStack, @Nullable ClientLevel clientLevel, @Nullable LivingEntity livingEntity) {
if (clientLevel != null && clientLevel.isRaining()) {
return ARGB.opaque(this.color);
}
return ARGB.opaque(0xFFEFD5); // Color code in hex format
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
После этого нам нужно зарегистрировать наш источник окрашивания предмета. Это делается в клиентском инициализаторе с помощью ID_MAPPER, объявленного в ItemTintSources.
java
ItemTintSources.ID_MAPPER.put(Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "color"), RainTintSource.MAP_CODEC);1
Как только это будет готово, мы сможем использовать наш источник окрашивания в клиентском определении предмета.
json
{
"model": {
"type": "minecraft:model",
"model": "example-mod:item/waxcap",
"tints": [
{
"type": "example-mod:color",
"color": -16728065
}
]
}
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Теперь вы можете наблюдать за изменением цвета предмета прямо в игре.

