# 为什么我的事件订阅了没用?!
# 先检查你注册的方式
| 如果你是这么注册的…… | 那你应该这样订阅…… | 方法的访问级别…… |
|---|---|---|
@Mod.EventBusSubscriber(modid = "my_mod") | @SubscribeEvent public static void on(Event event) | 必须为 public |
MinecraftForge.EVENT_BUS.register(new MyEventListener()) | @SubscribeEvent public void on(Event event) | 必须为 public |
MinecraftForge.EVENT_BUS.register(MyEventListener.class) | @SubscribeEvent public static void on(Event event) | 必须为 public |
MinecraftForge.EVENT_BUS.addListener(MyEventListener::on) | public static void on(Event event) | 无限制 |
MinecraftForge.EVENT_BUS.addGenericListener(MyEventListener::on) | public static void on(GenericEvent<T> event) | 无限制 |
# 再检查你是否用错了事件总线
下列事件应该出现在 Mod 加载总线上:
FMLCommonSetupEventFMLClientSetupEventFMLDedicatedServerSetupEvent- 所有 IMC 相关事件,包括:
InterModEnqueueEventInterModProcessEvent
FMLLoadCompleteEventrunData用到的GatherDataEvent- 所有
ModConfig.ModConfigEvent,包括:ModConfig.ModConfigEvent.LoadingModConfig.ModConfigEvent.Reloading
- 所有
RegistryEvent.Register<T> - 所有
ColorHandlerEvent,包括:ColorHandlerEvent.BlockColorHandlerEvent.Item
ModelBakeEventModelRegistryEventParticleFactoryRegisterEventTextureStitchEvent(包括Pre和Post)
# 你有两个选择
一般来说,需要走 Mod 总线的事件都应当在 Mod 主类的构造器里就订阅完成:
public class MyMod {
public MyMod() {
IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
bus.register(...);
bus.addListener(...);
bus.addGenericListener(...);
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
或者,如果你用 @Mod.EventBusSubscriber,那你的代码应该这样写:
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = "my_mod")
1