Minecraft 1.12.2 Mod开发笔记——新的物品

在Mod中添加一个新的物品分为3步:

  • 创建物品
  • 注册物品
  • 添加模型和材质
  • (设置语言文件)

创建物品

Minecraft中,所有的物品继承于 Item 类,我们试着创建一个铁板。

moonfan.mymod.item 包下新建一个类 ItemIronPlate 并继承 Item 类:

public class ItemIronPlate extends Item {
    public ItemIronPlate(){
    }
}

注册物品

物品需要在注册表内注册后才能被加载,而注册是一个事件,我们可以用之前事件系统的内容来解决。

在 item 包内新建 ItemLoader.java,这里直接使用简便的 @Mod.EventBusSubscriber

@Mod.EventBusSubscriber
public class ItemLoader {
    public static Item ironPlate = new ItemIronPlate();
    
    @SubscribeEvent
    public static void registerItem(RegistryEvent.Register<Item> event){
        event.getRegistry().register(ironPlate.setRegistryName("mymod:iron_plate"));
    }
}

event.getRegistry() 获取注册表,用 register() 注册单一物品,用 registerAll() 注册传入的所有物品。

物品需要一个用于注册的名字,经过查看源码以及参考其他 mod,注册名应该使用 modid:物品注册名 的格式,其中物品名使用下划线命名法。如果没有用冒号,比如 modid.物品注册名,forge会将其整体视为一个物品注册名,在前面添加上 modid: 前缀。

现在,我们进入游戏,使用 give 命令来获取这个方块。

给物品添加模型和材质

现在手里的物品还是紫黑块,我们需要添加模型和材质。模型可以理解成对物品的形状、位置、旋转等的规定,材质就是我们看到的物品所显示的图片。

添加模型及材质也是一个事件,在 ItemLoader 里添加:

@SubscribeEvent
public static void registerItemModel(ModelRegistryEvent event){
        ModelLoader.setCustomModelResourceLocation(ironPlate,0,new ModelResourceLocation(ironPlate.getRegistryName(),"inventory"));
}

这个方法指明物品的模型所在的位置,至于那个0以及 inventory 暂时没有明白具体含义。

然后新建目录 resources/assets/mymod/models/item/,再新建 iron_plate.json,复制以下内容:

{
    "parent": "item/generated",
    "textures": {
        "layer0": "mymod:items/iron_plate"
    }
}
  • parent 模型的继承关系,Minecraft中有一些直接可以拿来用的基本模型:
    • generated 普通物品的模型,比如鸡蛋,铁锭等等物品栏和拿在手里没有区别的物品
    • handheld 拿在手中的工具,如剑、镐、斧等,这个模型对物品栏中显示的图片做了旋转等变换,拿在手里的工具能够显示为真正的“拿在手里”而不是有一个奇怪的角度
    • ······
  • 资源文件中的路径为 modid: 开头,对应 resources/assets/modid/ 目录,如果不加 modid: 前缀,默认为 minecraft: 即 Minecraft 自带材质路径。
  • textures 模型所用的材质图片,简单的使用 layer0 作为图片字段即可。这里表示定位到 mymod/textures/items/iron_plate.png。

现在我们可以新建目录 resources/assets/mymod/textures/items/ ,将图片(png格式,最好为16x16的倍数)放在这里,重新运行,你会看到紫黑块变成了你设置的材质。这里我直接使用了沉浸工程Mod中的铁板图片

iron_plate

创造模式物品栏

显然,物品需要一个放进一个创造模式物品栏里,give命令实在是太麻烦了。

我们直接在 ItemIronPlate() 构造器里加一句 setCreativeTab(CreativeTabs.FOOD); 就好了,原版物品栏的名称可以在CreativeTabs类里找到。

新的创造模式物品栏

在MyMod.java这个主类里添加字段:

public static final CreativeTabs MY_TAB = new CreativeTabs(MODID) {
    @Override
    public ItemStack getTabIconItem() {
        return new ItemStack(ItemLoader.ironPlate);
    }
};

再在 ItemIronPlate() 构造器里加入 setCreativeTab(MyMod.MY_TAB);。重启游戏,你会看到一个新的创造模式物品栏。

注意:必须以某种方式设置 Tab 的 Icon,如果留 null会引发崩溃

本地化

现在我们的物品还是一个 item.null.name 的名字,我们需要更正。

  • 我们需要一个名称,用于不限语言的代指某个物品,这个名字叫 UnlocalizedName 或者 TranslationKey
  • 我们需要语言文件,将上面的代指名称翻译成各种语言,翻译后的名称叫本地化名称
  • 代指名称使用物品的 setUnlocalizedName() 方法进行设置(新的版本为 setTranslationKey() )
  • 本地化名称使用语言文件(*.lang)进行设置。

借鉴沉浸工程、林业等 mod 的写法,代指名称使用 modid.物品名的下划线命名 的形式

ItemIronPlate() 中添加

setUnlocalizedName("mymod.iron_plate");

新建文件夹 resources/assets/mymod/lang/,新建 en_us.lang 文件,对应英文版本,在里面写入(无需多余空格、引号等字符):

item.mymod.iron_plate.name=Iron Plate

然后我们新建 zh_cn.lang,对应中文版本,写法同上。

注意:1.12语言文件名应该使用全小写,比如 zh_cn 而不是 zh_CN

更实用的:哪里显示不正常,就写到等号左边,创造模式物品栏名称等均可设置

posted @ 2020-02-08 11:31  0.0~~  阅读(4268)  评论(1编辑  收藏  举报