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中的铁板图片
创造模式物品栏
显然,物品需要一个放进一个创造模式物品栏里,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
更实用的:哪里显示不正常,就写到等号左边,创造模式物品栏名称等均可设置