跳到主要内容

事件系统

FPSMatch 事件发布在 MinecraftForge.EVENT_BUS。事件适合低耦合观察、奖励、外部统计和有限拦截;核心胜负规则仍应放在地图或 RoundRule 中。

@SubscribeEvent
public static void onKill(FPSMapEvent.PlayerEvent.KillEvent event) {
if (!(event.getMap() instanceof EliminationMap)) return;
ServerPlayer killer = event.getPlayer();
ServerPlayer dead = event.getDead();
}

地图事件

事件可取消说明
LoadEvent地图数据已加载
StartEvent取消后 start() 返回 false
ReloadEvent阻止重载
ResetEvent重置通知
ClearEvent阻止清理
VictoryEvent提供比分、玩家和队伍结算快照

玩家事件

事件可取消说明
JoinEvent / LeaveEvent阻止加入或离开默认流程
HurtEvent可取消并可修改伤害值
DeathEvent取消意味着监听器负责保持生命状态一致
KillRecordEvent只阻止击杀统计写入
KillEvent击杀已确定的通知
LoggedInEvent地图玩家登录通知
LoggedOutEvent慎用,可能影响预留状态
PickupItemEvent / TossItemEvent控制物品行为
ChatEvent控制地图内聊天

只有 event.isCancelable() 为真时才能取消。VictoryEventKillEvent 是结果通知,不是改变结果的拦截点。

其他事件

  • FPSMTeamEvent.JoinEventLeaveEvent
  • FPSMGunDamageEventFPSMGunFireEventFPSMGunKillEvent
  • FPSMGunReloadEventFPSMGunShootEvent
  • FPSMThrowGrenadeEvent
  • PlayerObtainItemEvent
  • FPSMShopEvent.DataInit

注册类事件包括 RegisterFPSMapEventRegisterFPSMCommandEventRegisterFPSMSaveDataEventRegisterListenerModuleEvent。它们只应在注册阶段处理,不能在 tick 中重复注册。

事件处理器应保持短小,并先按地图类型过滤。复杂可变状态放回地图或 Capability,清理时才能被明确释放。

选择扩展位置

伤害拦截与最终击杀通知发生在不同阶段,具体流程见伤害、出局与统计。开始事件发生在模式完成初始化之前;需要在开始成功后执行的行为,应放在模式确认 super.start() 成功的后续步骤。

能力实例监听事件时,先比较 event.getMap() 与宿主对象,避免其他地图的事件改变本组件状态;完整说明见能力生命周期