跳到主要内容

事件系统

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() 为真时才能取消。VictoryEvent 和 KillEvent 是结果通知,不是改变结果的拦截点。

其他事件​

  • FPSMTeamEvent.JoinEvent、LeaveEvent
  • FPSMGunDamageEvent、FPSMGunFireEvent、FPSMGunKillEvent
  • FPSMGunReloadEvent、FPSMGunShootEvent
  • FPSMThrowGrenadeEvent
  • PlayerObtainItemEvent
  • FPSMShopEvent.DataInit

注册类事件包括 RegisterFPSMapEvent、RegisterFPSMCommandEvent、RegisterFPSMSaveDataEvent 和 RegisterListenerModuleEvent。它们只应在注册阶段处理,不能在 tick 中重复注册。

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

选择扩展位置​

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

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