为了方便管理被注册物品,最好创建一个子包:物品子包名,用来存放要注册的物品的类,为了节省空间(),需要在主包名下(主类名.java同一个包,其实在哪都行)新建一个管理各种注册的类:总注册类名.java →:

//物品注册需要通过物品注册事件来注册,而该事件的注册与主类中的事件不同,要走一般事件总线注册,虽然读者不是很容易理解,但是如下是用法:
//通过@Mod.EventBusSubscriber(modid = 主包名.主类名.MODID)修饰的类里面的静态事件都会自动走一般事件总线进行注册,所以我们写上如下总注册类:
@Mod.EventBusSubscriber(modid = 主包名.主类名.MODID)
public final class 总注册类名{
    //创建公开 静态 Calorific类(Item的子类) calorific名的对象备以注册
    public static Calorific calorific;
    //@SubscribeEvent修饰代表这是一个事件监听方法
    @SubscribeEvent
    //创建公开(要被FML读取) 静态(满足上上上面说的注册方法的要求) 无返回值(FML要求不返回) 注册物品方法名的用于注册物品的方法,实际上他是一个事件监听方法。
    //传入的事件为RegistryEvent.Register<Item>,其中的Item就是物品的总父类,泛型形式输入
    public static void 注册物品方法名(RegistryEvent.Register<Item> event) {
        //event.getRegistry().registerAll(此处传入),此为群体注册方法,可传入多个物品对象一起注册
        event.getRegistry().registerAll(
            //形式如下:要注册物品实例名 = new 对应物品类(构造参).setCreativeTab(本模组创造背包页面名).setUnlocalizedName("MODID:国际化翻译用的标识名").setRegistryName("MODID:物品注册名")
            //setCreativeTab是将注册物品加入创造背包的指定页面,setUnlocalizedName是设置翻译名标识后面讲,setRegistryName设置物品的注册名,和modid类似
            calorific = (Calorific) new Calorific().setCreativeTab(KALPAS_CREATIVE_TAB).setUnlocalizedName("MODID.calorific").setRegistryName("MODID:calorific")
        );

    }
    //新建一个属于自己模组的创造背包页面吧
    public static final CreativeTabs 本模组创造背包页面名 = new CreativeTabs("MODID") {
        //重写页面标签页图标获取方法来设置图标
        @Override
        public ItemStack getTabIconItem() {
            //返回一个物品堆就行,此处new了一个物品堆对象,构造参传入的是原版的钻石
            return new ItemStack(Items.DIAMOND);
        }
    };

}

至此,总注册类名.java内仅剩下Calorific类没有解释那么接下来我们在物品子包中创建一个Calorific.java →:

//公开(总注册类要读)Calorific(类名)extends Item(继承物品类)
public class Calorific extends Item {
    //编写该类公开(可调用)构造器,此处设置为无需传参所以public Calorific()
    public Calorific() {
        //继承Item构造器
        super();
        //表明物品有状态分枝树,比如工具的有电没电状态
        setHasSubtypes(true);
        //设置损伤值耐久、分枝树(彩色羊毛)代号
        setMaxDamage(0);
        //设置最大堆叠,下面设为了1,默认64
        setMaxStackSize(1);
        //设置损伤值能不能变动(绿色羊毛不能通过修复变成白色羊毛),下设置的意思是不可变动
        setNoRepair();
        //更多设置可以去看Item类,这些是较为常用的
    }
    //功能示例,Item类中写了许多功能方法,我们先思考一个功能,然后去寻找Item类是否给我们预设了相关方法,如果预设,只需要进行重写即可,下面是设置物品作为燃料的功能
    @Override
    public int getItemBurnTime(ItemStack itemStack)
    {
        //可以直接返回一个燃烧时间,也可以通过各种方法计算后返回(比如获取原版煤的返回)
        return 800;
    }
    //如果没有我想要的功能怎么办,那就需要自己写了。例如塞入你写的功能方块后,通过功能方块获取到改物品实例对象(后面讲),然后调用下面自己写的方法执行代码
    public void killThemAll()
    {
        //执行如下自定义代码
        方块.获得世界().击杀世界所有生物();
    }
}

此类写完,也就是说,传入总注册类物品注册方法,物品注册语句的对象仍然是一个Item的子类,注册成为了一个咱们的特定物品。
仍有另一种实现物品功能的方法,例如上述我们定义了Calorific是一个燃料方法,那么我们整一个燃料开始燃烧的事件的监听方法,比如暂时把这个方法塞到主注册类里就能用

//修饰符上面讲了
@SubscribeEvent
//方法名字自己填,事件传入的是FurnaceFuelBurnTimeEvent,这个事件有两个参数可以操作,一个是设置当前燃料燃烧时间,一个是消耗后的燃料物品堆(后设置)。
public static void onCalorificBurn(FurnaceFuelBurnTimeEvent e) {
    //用翻译代号判断是不是咱的物品
    if(e.getItemStack().getUnlocalizedName().equals(calorific.getUnlocalizedName())) {
        //燃烧后物品堆数量为0,但下句设置物品堆数量为1(构造器中该物品最大堆叠为1),这句功能是物品不消耗。
        e.getItemStack().setCount(1);
    }
}
//这样就实现了无限燃料

这样一个简单的物品就创造好了,如果想要注册一个功能原版就具有的物品,建议不继承Item而是继承原版写好的对Item的子类,例如ItemFood等,可以使用IDEA查看。

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏