You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Forge 1.21.1模组加载失败报错求助:ServerStartingEvent监听器参数类型不匹配问题

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接口的事件,所以才会报参数类型不匹配的错误。

具体解决步骤:

  1. 先搞懂两种事件总线的分工

    • 模组事件总线(通过FMLJavaModLoadingContext.get().getModEventBus()获取):负责处理模组加载、初始化相关的事件,比如FMLCommonSetupEvent这类实现了IModBusEvent的事件。
    • Forge事件总线(通过MinecraftForge.EVENT_BUS获取):负责处理游戏运行时的各种事件,比如服务器启动、玩家加入/离开、方块交互这些事件,ServerStartingEvent就属于这一类。
  2. 修正你的注册代码
    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) {
        // 处理逻辑
    }
    
  3. 关于你要做的玩家加入/离开事件
    比如PlayerLoggedInEvent(玩家加入)、PlayerLoggedOutEvent(玩家离开)这些事件,同样属于Forge事件总线的范畴,所以也要按照上面的方式注册到MinecraftForge.EVENT_BUS上,不能注册到Mod总线。

这样修改后,你的模组应该就能正常加载,不会再出现参数类型不匹配的错误了。

备注:内容来源于stack exchange,提问作者Code Corruption

火山引擎 最新活动