文章目录
事件系统
事件分两种:一种是 FML Mod 加载事件,在 FMLJavaModLoadingContext.get().getModEventBus()
中注册;另一种是游戏内事件,在 MinecraftForge.EVENT_BUS
中注册。
在事件总线上注册监听器
监听器需要在 Mod 的构造函数中注册。具体接口的用法去看 net.minecraftforge.eventbus.api.IEventBus
的注释吧,咱就不在这里赘述了。
FML Mod 加载事件
这类事件都是在进入游戏主界面前触发的事件,多用于注册各种对象。这里的事件发布于 FMLJavaModLoadingContext.get().getModEventBus()
上。
Mod 加载顺序(从 Log 里面读出来的,如有错误还烦请指正):
- LifeCycleEvent:CONSTRUCT (不能监听)
- 这里是执行你的 Mod 主类的构造函数
- 用来注册事件侦听器
Mod.EventBusSubscriber
注解的事件侦听器也是在这时候被注册的- 在这里注册 Mod 的 配置文件
- RegistryEvent.NewRegistry
- 用于新建 Registry
- RegistryEvent.Register<T>
- 这里 T 是注册项的基类
- 具体顺序:引用自 Forge 文档
-
RegistryEvents are currently supported for the following types:
Block
,Item
,Potion
,Biome
,SoundEvent
,PotionType
,Enchantment
,IRecipe
,VillagerProfession
,EntityEntry
- 最后是 Mod 自定义的 Registry
- 不建议用事件的
register
方法注册,建议使用 DeferredRegister 注册 DeferredRegister<T>
开始注册,并为RegistryObject<T>
填充实例
- 生成、读取 Mod 配置文件(无事件)
- 先生成 Client 的配置文件
- 后生成 Common 的配置文件
- FMLCommonSetupEvent
- Capability 在这时注册
- LifecycleEvent:SIDED_SETUP
- 这里区分启动的端,如果是服务端,则触发
FMLDedicatedServerSetupEvent
- 如果是客户端,则触发
FMLClientSetupEvent
- 这里区分启动的端,如果是服务端,则触发
- Forge Version Check
- 这里会检查 Forge 和 Mod 的版本是否为最新
- InterModEnque