📅  最后修改于: 2023-12-03 14:56:44.282000             🧑  作者: Mango
本次算法测验将选取Minecraft模组“须藤放置”中的常见问题,并提供相应的解决方案。本篇为第1.8版本的问题8:如何实现发光物品?
在Minecraft游戏中,有些物品可以发光,如萤石块、下界之星等。但是,如果自己写mod,如何实现这样的发光效果呢?
在资源包中定义模型文件,设定材质贴图,再在模型文件中设定光照贴图,即可实现发光效果。
具体步骤如下:
{
"predicate": {
"custom_model_data": X
},
"model": "block/item",
"textures": {
"lightmap": "block/Y"
},
"tintindex": 0
}
其中,X为数字,表示该模型文件的自定义数据值;Y为字符串,表示光照贴图的名称(需要事先定义)。
{
"ambientocclusion": false,
"textures": {
"particle": "blocks/Z",
"layer0": "blocks/W"
},
"elements": [
{
"name": "main",
"from": [ X1, Y1, Z1],
"to": [ X2, Y2, Z2],
"faces": {
"up": {"uv": [ U1, V1, U2, V2], "texture": "#layer0", "cullface": "up"},
...
}
}
],
"render_contoller": {
"flat": {}
},
"properties": {
"emit": true
}
}
其中,Z和W为字符串,表示贴图文件;X1,Y1,Z1等为数字,表示物品的三维形状;U1,V1,U2,V2等为数字,表示贴图的UV坐标。
在模组的代码中注册模型使用事件(ModelRegistryEvent),并在该事件中调用发光的物品材质,即可实现发光效果。
具体步骤如下:
@SubscribeEvent
public static void onModelRegistry(ModelRegistryEvent event) {
// 注册模型使用事件
ModelLoader.setCustomModelResourceLocation(YOUR_ITEM, YOUR_ITEM.getMetadata(),
new ModelResourceLocation(YOUR_ITEM.getRegistryName(), "inventory") {
@Override
public ModelBakery getModelBakery() {
return event.getModelLoader();
}
});
// 调用材质
Minecraft.getMinecraft().getBlockColors().registerBlockColorHandler(
(state, worldIn, pos, tintIndex) -> YOUR_COLOR, YOUR_ITEM);
}
其中,YOUR_ITEM为物品对象,YOUR_COLOR为颜色值。
在Forge框架中,可通过使用Forge光源实现发光效果。
具体步骤如下:
ModelLoader.setCustomModelResourceLocation(YOUR_ITEM, YOUR_ITEM.getMetadata(),
new ModelResourceLocation(YOUR_ITEM.getRegistryName(), "inventory"));
YOUR_ITEM.setLightLevel(YOUR_LIGHT_LEVEL);
其中,YOUR_ITEM为物品对象,YOUR_LIGHT_LEVEL为发光强度(最大值为15)。
通过以上三种方式,即可实现发光物品。推荐使用方案一和方案二,可自定义光照贴图,效果更佳。