Forge 1.21.1模组加载失败报错求助:ServerStartingEvent监听器参数类型不匹配问题
嘿Code,我来帮你捋清楚这个问题!
首先先打消你的第一个顾虑:你提到的.get()和.get().getModEventBus()标记为过时的问题,和当前的报错完全无关,而且确实很多开发者在1.21.1里还在继续用,暂时不会影响功能,Forge标记过时只是为后续API迭代做准备,你不用纠结这个点。
接下来看你遇到的核心报错:
java.lang.IllegalArgumentException: Listener for event class net.minecraftforge.event.server.ServerStartingEvent takes an argument that is not a subtype of the base type interface net.minecraftforge.fml.event.IModBusEvent
这个错误的原因很明确:ServerStartingEvent不属于Mod事件总线(Mod Event Bus)的事件范畴,它是属于**Forge事件总线(Forge Event Bus)**的事件。你现在错误地把它注册到了Mod事件总线上,而Mod总线只接受实现IModBusEvent接口的事件,所以才会报参数类型不匹配的错误。
具体解决步骤:
先搞懂两种事件总线的分工:
- 模组事件总线(通过
FMLJavaModLoadingContext.get().getModEventBus()获取):负责处理模组加载、初始化相关的事件,比如FMLCommonSetupEvent这类实现了IModBusEvent的事件。 - Forge事件总线(通过
MinecraftForge.EVENT_BUS获取):负责处理游戏运行时的各种事件,比如服务器启动、玩家加入/离开、方块交互这些事件,ServerStartingEvent就属于这一类。
- 模组事件总线(通过
修正你的注册代码:
把ServerStartingEvent的监听器从Mod事件总线转移到Forge事件总线。举个代码示例:public class YourModMainClass { public YourModMainClass() { // 模组总线:处理模组加载相关事件 FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onModSetup); // Forge总线:处理游戏运行时事件(包括ServerStartingEvent) MinecraftForge.EVENT_BUS.register(this); } // 模组总线的事件处理方法(实现IModBusEvent) private void onModSetup(final FMLCommonSetupEvent event) { // 你的模组初始化逻辑,比如注册物品/方块 } // Forge总线的事件处理方法,需要用@SubscribeEvent注解 @SubscribeEvent public void onServerStarting(ServerStartingEvent event) { // 你原本的ServerStartingEvent处理代码 } }或者你也可以用
addListener的方式注册Forge总线的事件,不过要注意方法的访问权限:// 在你的模组构造方法里添加 MinecraftForge.EVENT_BUS.addListener(this::onServerStarting); // 对应的处理方法(可以是private,但建议用public避免权限问题) public void onServerStarting(ServerStartingEvent event) { // 处理逻辑 }关于你要做的玩家加入/离开事件:
比如PlayerLoggedInEvent(玩家加入)、PlayerLoggedOutEvent(玩家离开)这些事件,同样属于Forge事件总线的范畴,所以也要按照上面的方式注册到MinecraftForge.EVENT_BUS上,不能注册到Mod总线。
这样修改后,你的模组应该就能正常加载,不会再出现参数类型不匹配的错误了。
备注:内容来源于stack exchange,提问作者Code Corruption




