📜  算法测验|须藤放置[1.8] |问题8(1)

📅  最后修改于: 2023-12-03 14:56:44.282000             🧑  作者: Mango

算法测验-须藤放置[1.8]-问题8

本次算法测验将选取Minecraft模组“须藤放置”中的常见问题,并提供相应的解决方案。本篇为第1.8版本的问题8:如何实现发光物品?

问题描述

在Minecraft游戏中,有些物品可以发光,如萤石块、下界之星等。但是,如果自己写mod,如何实现这样的发光效果呢?

解决方案
方案一:使用模型文件

在资源包中定义模型文件,设定材质贴图,再在模型文件中设定光照贴图,即可实现发光效果。

具体步骤如下:

  1. 在模型文件(例如:item/block)中添加"overrides"代码段,并在其中设定光照贴图:
{
    "predicate": {
        "custom_model_data": X
    },
    "model": "block/item",
    "textures": {
        "lightmap": "block/Y"
    },
    "tintindex": 0
}

其中,X为数字,表示该模型文件的自定义数据值;Y为字符串,表示光照贴图的名称(需要事先定义)。

  1. 在光照贴图文件中设定发光效果:
{
    "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坐标。

  1. 在模组的代码中调用模型文件。
方案二:使用模型事件

在模组的代码中注册模型使用事件(ModelRegistryEvent),并在该事件中调用发光的物品材质,即可实现发光效果。

具体步骤如下:

  1. 在注册事件中添加如下代码:
@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为颜色值。

  1. 在光照贴图文件中设定发光效果(步骤同方案一)。
方案三:使用Forge光源

在Forge框架中,可通过使用Forge光源实现发光效果。

具体步骤如下:

  1. 在物品注册事件中添加如下代码:
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)。

结语

通过以上三种方式,即可实现发光物品。推荐使用方案一和方案二,可自定义光照贴图,效果更佳。