你可以通过客户端物品来修改物品的外观。 Minecraft Wiki 上有一个原版修改列表。
其中一种常用的是 着色源,它允许你根据预设条件改变物品的颜色。
预定义的着色源数量有限,所以我们来看看如何创建自己的着色源。
在本例中,我们先来注册一个物品。 如果你不熟悉这个过程,请先阅读关于物品注册的说明。
java
public static final Item WAXCAP_BLOCK_ITEM = Registry.register(
BuiltInRegistries.ITEM,
Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "waxcap"),
new BlockItem(WAXCAP_BLOCK, new Item.Properties()
.setId(WAXCAP_BLOCK_ITEM_KEY))
);1
2
3
4
5
6
2
3
4
5
6
请务必添加:
物品应该会出现在游戏中。

如你所见,我们使用的是灰度纹理。 接下来,我们使用着色源添加一些颜色。
物品着色源
让我们注册一个自定义着色源来为 Waxcap 物品着色,这样下雨时物品会呈现蓝色,其他情况则呈现棕色。
首先,你需要定义一个自定义物品着色源。 这可以通过在类或记录上实现 ItemTintSource 接口来实现。
java
public record RainTintSource(int color) implements ItemTintSource {
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)
);
public RainTintSource() {
this(ARGB.opaque(0x00BFFF)); // Color code in hex format
}
@Override
public int calculate(ItemStack itemStack, @Nullable ClientLevel clientLevel, @Nullable LivingEntity livingEntity) {
if (clientLevel != null && clientLevel.isRaining()) {
return ARGB.opaque(color);
}
return ARGB.opaque(0xFFEFD5); // Color code in hex format
}
@Override
public @NotNull MapCodec<? extends ItemTintSource> type() {
return MAP_CODEC;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
由于这是客户端物品定义的一部分,因此可以通过资源包更改色调值。 所以你需要定义一个能够读取色调定义的 Map Codec。 在本例中,色调源将包含一个 int 值,用于描述下雨时的颜色。 我们可以使用内置的 ExtraCodecs.RGB_COLOR_CODEC 来构建我们的 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() 中返回这个 Codec。
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(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
接下来,我们需要注册我们的物品着色源。 这是在客户端初始化器中使用在 ItemTintSources 中声明的 ID_MAPPER 完成的。
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
你可以在游戏中观察到物品颜色的变化。

