Skip to main content
Version: 1.20.x

纹理色调

原版中的许多方块和物品会根据它们的位置或特性(如草)改变其纹理颜色。模型支持在面上指定“色调索引”,这是可以由BlockColorItemColor处理的整数。有关如何在原版模型中定义色调索引的信息,请参阅wiki

BlockColor/ItemColor

这两个都是单方法接口。BlockColor接受一个BlockState、一个(可为空的)BlockAndTintGetter和一个(可为空的)BlockPosItemColor接受一个ItemStack。它们都采用一个int参数tintIndex,它是正在着色的面的色调索引。 它们都返回一个int,一个颜色乘数。这个int被视为4个无符号字节,即alpha、red、green和blue,按照从最高有效字节到最低有效字节的顺序。对于着色面上的每个像素,每个颜色通道的值是(int)((float) base * multiplier / 255.0),其中base是通道的原始值,multiplier是颜色乘数的关联字节。 请注意,方块不使用Alpha通道。例如,未着色的草纹理看起来是白色和灰色的。草的BlockColorItemColor返回颜色乘数,red和blue分量较低,但alpha和green分量较高(至少在温暖的生物群系中),因此当执行乘法时,绿色会被带出,红色/蓝色会减少。

如果物品继承自builtin/generated模型,则每个层(“layer0”、“layer1”等)都有与其层索引相对应的色调索引。

创建颜色处理器

BlockColor需要注册到游戏的BlockColors实例中。BlockColors可以通过RegisterColorHandlersEvent$Block获取,BlockColor可以通过#register注册。请注意,这不会导致给定方块的BlockItem被着色。BlockItem是物品,需要使用ItemColor进行着色。

@SubscribeEvent
public void registerBlockColors(RegisterColorHandlersEvent.Block event){
event.register(myBlockColor, coloredBlock1, coloredBlock2, ...);
}

ItemColor需要注册到游戏的ItemColors实例中。ItemColors可以通过RegisterColorHandlersEvent$Item获取,ItemColor可以通过#register注册。此方法也被重载为接受Block,它只是将物品Block#asItem的颜色处理器注册为物品(即方块的BlockItem)。

@SubscribeEvent
public void registerItemColors(RegisterColorHandlersEvent.Item event){
event.register(myItemColor, coloredItem1, coloredItem2, ...);
}