总线
在编写代码之前,介绍一下事件系统。
所谓事件就是我们游戏中所作出的动作、附魔、达成条件替换、特殊效果等一系列都属于事件,但是我们所编写的事件系统不是Minecraft自带的,是Forge实现的。
如果要详细了解可以查看Boson 1.16其中还牵扯总线的概念与事件处理器。
在编写事件时有两种方式 一种是实例方式,一种是静态的方式。
public class MyForgeEventHandler {
@SubscribeEvent
public void pickupItem(EntityItemPickupEvent event) {
System.out.println("666!");
}
}
@SubscribeEvent
注解,这个注解的作用就是标记下方的pickupItem
方法是一个事件处理器
所监听的事件是由其中的参数控制
EntityItemPickupEvent
,说明监听的是实体捡起物品这个事件。
当然写完只会还需要注册到总线中(Forge总线和Mod总线)
Forge总线负责的就是除了生命周期事件外的所有事件
命令:MinecraftForge.EVENT_BUS.register()
Mod总线主要负责游戏的生命周期事件,也就是初始化过程的事件
命令:FMLJavaModLoadingContext.get().getModEventBus().register()
所以这个例子我们就要注册到Forge总线中(可以在初始建立的java类中写入,直接当成所有总线的类)
FMLJavaModLoadingContext.get().getModEventBus().register()
如果都采取实例方法的注册会变得非常麻烦,这时就可以使用Forge提供的静态方法
在类上加入
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)注解
其中最后的MOD为Mod总线 Forge为Forge总线。
题外话:我们可以把modid封装在使用时直接调用
@Mod(类名.MODID)
public class 类名{
public static final String MODID = "自己的MODID";
}
将自己的modid封装一下在调用的时候直接调用类
物品
明确具体步骤 创建自己物品的类继承原版中的物品--》》实例化物品--》》注册物品
1.首先创建两个平级的包 存放我们的物品等和总线各种实例化(名字看自己)
这里就用我自己的来进行介绍 在common中再次创建item包存放我们所有item类后创建咱们的一个物品类并且让这个类继承原版的Item
类
public class testItem extends Item {
public testItem(Properties p_i48487_1_) {
super(p_i48487_1_);
}
}
非常EZ,然后我们要重写一下这个构造方法(也可以在实例时写入属于的位置和属性)
public class testItem extends Item {
public testItem() {
super(new Properties().group(ItemGroup.MATERIALS));
}
}
其中Properties方法就是确定这个物品的属性和属于创造中的哪一个物品栏(MATERIALS就是杂物的意思)
之后,我们去实例和注册这个物品
在core包中 建立init包存放我们的注册和实例 建立ItemInit类
public class ItemInit {
//注册对象
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, BlitzMod.MODID);
public static final RegistryObject<testItem> TEST_ITEM = ITEMS.register("test_item", testItem::new);
}
第一句就是注册我们这个类中的全部内容
DeferredRegister<Item>这个泛型表明我们需要注册的东西是物品
DeferredRegister.create(ForgeRegistries.ITEMS, BlitzMod.MOD_ID)
创建了一个实例,这个类里有两个参数ForgeRegistries.ITEMS
代表了我们要注册的是物品,第二个参数填入的应该是你的modId
第二句就是实例化我们的物品
也是通过RegistryObject<testItem>泛型 其中存放我们的物品 其中参数第一个为【注册名】,第二个为【注册对象的实例】 具体为什么只能用小写看文献就对了^^具体我也不清楚。
这样我们就完成了实例和注册,就差最后的实现声明。
上文提到过注册总线 我们已经将实例与注册准备好接下来就是将它放入我们的MOD总线中
public BlitzMod(){
ItemInit.ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
}
(写到Mod注解下类的实例方法中)。
此时我们开启游戏