少女祈祷中...

当你想要有一个跟原版的刷怪蛋,染色皮革盔甲一样,随着NBT改变颜色的物品时,你就需要像下面一样注册一个彩色渲染

首先,让我们看看原版是怎么实现的,在ItemRender类里面我们看到了这么个对象 ItemColor ,在renderQuadList方法中,会调用这个对象的getColor方法,拿到一个颜色,然后把这个颜色作为这个面的遮罩。

ItemColor类内默认注册了很多原版物品,好在这里有一个Forge提供的钩子可以给开发者把自己模组的物品添加进去
net.minecraftforge.client.ForgeHooksClient.onItemColorsInit(itemcolors, pColors);

现在我们只需要订阅这个事件RegisterColorHandlersEvent.Item evt来实现这个功能

1
2
3
4
5
6
7
8
9
10
11
12
@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = Utils.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ClientEvent {
@SubscribeEvent(priority = EventPriority.LOW)
public static void onColorRegister(RegisterColorHandlersEvent.Item evt)
{
evt.register(
(pStack, pTintIndex) ->
pTintIndex == 0 ? -1 : ((DanmakuItem)pStack.getItem()).getColor(pStack),
ItemRegistry.ItemDanmaku.get()
);
}
}

可以通过事件的register方法,使用ItemColor类内部的register方法,来把模组物品注册进去
这个方法有两个参数(ItemColor itemColor, ItemLike… items)
在示例中,第二个参数是要注册的物品,可以写多个Item对象
我们通过lambda表达式新建了一个ItemColor对象作为第一个参数,这里的pTintIndex指的是材质里的层

1
2
3
4
5
6
7
{
"parent": "item/generated",
"textures": {
"layer0": "lively_danmaku:item/danmaku_in",
"layer1": "lively_danmaku:item/danmaku_out"
}
}

在这个danmaku.json中,我们看到有两个材质文件,他们分别对应着pTintIndex=0和pTintIndex=1
在示例中,我们看到,当pTintIndex == 0时返回-1,当pTintIndex != 0时,返回了DanmakuItem类里的getColor方法
也就是说,会对第二个贴图danmaku_out进行染色

这时候,我们就可以在DanmakuItem类里定义一个getColor方法,返回物品NBT中的颜色参数

1
2
3
4
5
6
public int getColor(ItemStack itemStack) {
if (itemStack.getOrCreateTag().get("danmaku_color") != null) {
return Integer.parseInt(String.valueOf(itemStack.getOrCreateTag().get("danmaku_color")));
}
else return Color.WHITE.getRGB();
}

到现在,我们就完成了对模组物品的特定层数的贴图的自定义颜色渲染