Forge 1.16.5 如何监听玩家登录?一个可编译的最小示例

举报
yd_241387476 发表于 2026/11/04 10:00:47 2026/11/04
【摘要】 用玩家登录事件说明 Forge 主事件总线和模组生命周期总线的区别,给出实例注册的完整 Java 示例、编译验证结果及进服排查步骤。

模组已经出现在列表里,玩家进服时,控制台却一行日志也没有。排查这个问题,可以沿着事件的发送位置往回找。Forge 1.16.5 的 BasicEventHooks.firePlayerLoggedIn 会把 PlayerEvent.PlayerLoggedInEvent 投递到 MinecraftForge.EVENT_BUS。把监听器注册到这条总线,才能收到这次通知。

把处理方法放进模组入口

下面的模组 ID 是 loginwatch,要与项目 META-INF/mods.toml 中的 modId 一致。如果工程里已经有带 @Mod 的入口类,把构造方法中的注册语句和处理方法加到现有类即可。日志使用 JDK 自带的 Logger,示例也没有引用客户端界面类。

package example.loginwatch;

import java.util.logging.Logger;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod("loginwatch")
public final class LoginWatch {
    private static final Logger LOG = Logger.getLogger("loginwatch");

    public LoginWatch() {
        MinecraftForge.EVENT_BUS.register(this);
    }

    @SubscribeEvent
    public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) {
        LOG.info("[loginwatch] player login event received");
    }
}

这里有两步。构造方法里的 register(this) 把当前实例交给 Forge。@SubscribeEvent 标在公开的实例方法上,方法唯一的参数给出了订阅的事件类型。按这种写法,一个普通 Java 类就能处理事件,无需另写 IEventListener.invoke(...)。

为什么放在这里

加载模组与玩家进服发生在不同的时刻。FMLCommonSetupEvent 和 FMLClientSetupEvent 属于模组生命周期,由模组事件总线分发。玩家登录发生在游戏运行期间,由 Forge 主总线分发。如果把同一个登录处理方法注册到模组总线上,启动成功也收不到这个事件。把注册动作只放在客户端初始化回调里,还会漏掉独立服务器。

有些项目习惯把事件放进单独的静态类。Forge 1.16.x 也支持用 @Mod.EventBusSubscriber(modid = "loginwatch", bus = Mod.EventBusSubscriber.Bus.FORGE) 自动注册,此时带 @SubscribeEvent 的处理方法应为 static。上面的完整示例走实例注册这条路径。选好一种写法,可以避免多个监听器实例对同一次登录各写一遍日志。

怎样验证回调真的触发了

  1. 从项目的 Forge 开发运行配置启动游戏,先停在主菜单。此时模组应已加载,玩家登录日志应在进入世界之后出现。
  2. 进入单人世界,或者让一个玩家连入已加载该模组的测试服务器。在运行日志中搜索完整的 [loginwatch] player login event received,它对应的是玩家进入游戏时的通知。
  3. 退出并重新进入同一世界,比较两次进入时的新增日志。若一次进服出现两条,先检查是否从两个入口分别创建并注册了监听器。若一直没有,先核对模组 ID、事件总线、方法参数和实际加载的构建产物。

本文的验证范围

示例使用官方 Forge 1.16.5-36.2.42 的 universal 包和该版本声明的 EventBus 4.0.0,以 javac --release 8 -proc:none 编译通过。检查生成的 class,可见 Java 8 字节码、登录事件参数和订阅注解。事件派发位置已对照同版本的 Forge 源码。上面的进服和重连是游戏内验收步骤,本次核验到编译与源码为止。

本文根据本站「安全问答」的《Forge 1165中注册一个事件监听器怎么写》(条目 h50s)经 AI 辅助改写。技术出处为 Forge Documentation 1.16.x 的 Events / Basic Usage 章节,以及 Forge 36.2.42 中的 BasicEventHooks 和 PlayerEvent。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。