为了方便管理被注册物品,最好创建一个子包:物品子包名,用来存放要注册的物品的类,为了节省空间(),需要在主包名下(主类名.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查看。