Forge 1.16.5 如何监听玩家登录?一个可编译的最小示例
模组已经出现在列表里,玩家进服时,控制台却一行日志也没有。排查这个问题,可以沿着事件的发送位置往回找。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。上面的完整示例走实例注册这条路径。选好一种写法,可以避免多个监听器实例对同一次登录各写一遍日志。
怎样验证回调真的触发了
- 从项目的 Forge 开发运行配置启动游戏,先停在主菜单。此时模组应已加载,玩家登录日志应在进入世界之后出现。
- 进入单人世界,或者让一个玩家连入已加载该模组的测试服务器。在运行日志中搜索完整的
[loginwatch] player login event received,它对应的是玩家进入游戏时的通知。 - 退出并重新进入同一世界,比较两次进入时的新增日志。若一次进服出现两条,先检查是否从两个入口分别创建并注册了监听器。若一直没有,先核对模组 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。
- 点赞
- 收藏
- 关注作者
评论(0)