zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    LeetCode 146
    Codeforces Round #644 (Div. 3) 题解
    AtCoder Grand Contest 044
    约数个数求解+约数求和(唯一分解定理)(遍历map的写法!)
    [蓝桥杯][2013年第四届真题]危险系数(DFS)
    Codeforces Round #674 (Div. 3)(A->D(前缀和出现次数))
    Codeforces Round #673 (Div. 2)B. Two Arrays(贪心)
    Codeforces Round #672 (Div. 2)(A->C2)(B位运算,C贪心,DP)
    质数笔记
    2020 CCPC
  • 原文地址:https://www.cnblogs.com/moonfan/p/12275853.html
Copyright © 2011-2022 走看看