事件联动
文档/dominion-api/事件联动

事件联动

通过 Dominion 事件响应状态变化,或在数据操作落库前阻止/调整操作。

进入和离开领地

@EventHandler
public void onEnter(PlayerMoveInDominionEvent event) {
    DominionDTO dominion = event.getDominion();
    Player player = event.getPlayer();

    player.sendMessage("你进入了 " + dominion.getName());
}

@EventHandler
public void onLeave(PlayerMoveOutDominionEvent event) {
    DominionDTO dominion = event.getDominion();
    if (dominion == null) return;
    getLogger().info(event.getPlayer().getName() + " left " + dominion.getName());
}

如果只希望一个处理器覆盖“进入、离开、领地切换”,监听 PlayerCrossDominionBorderEvent

@EventHandler
public void onBorder(PlayerCrossDominionBorderEvent event) {
    DominionDTO from = event.getFrom();
    DominionDTO to = event.getTo();
    // from 或 to 可能为 null
}

取消领地创建

@EventHandler
public void onCreate(DominionCreateEvent event) {
    if (event.getName().startsWith("system-")) {
        event.setCancelled(true);
    }
}

事件被取消后,对应 Provider Future 会以失败结果结束。不要只在事件中显示提示却不取消,也不要在事件结束后再尝试回滚数据库。

修改操作参数

许多数据操作事件允许修改新值,例如:

  • DominionRenameEvent#setNewName
  • DominionSetGuestFlagEvent#setNewValue
  • DominionSetEnvFlagEvent#setNewValue
  • DominionSetTpLocationEvent#setNewTpLocation
  • DominionTransferEvent#setNewOwner
  • DominionReSizeEvent#setDirectionsetSize

修改后仍会经过 Dominion 后续合法性检查。事件可写不代表附属可以绕过权限、重叠、经济或父子领地约束。

获取操作结果

数据操作在事件分发之后才真正执行。需要在成功后发放奖励、同步外部系统或发送通知时,用事件提供的回调:

@EventHandler
public void onMemberAdded(MemberAddedEvent event) {
    if (event.isCancelled()) return;

    event.afterAdded(member -> {
        if (member == null) return;
        // 这里才处理添加结果
        getLogger().info("Member added: " + member.getPlayerUUID());
    });
}

创建/修改类事件通常提供 afterCreatedafterModified,成员和组事件提供 afterAddedafterRemovedafterSet。确切名称以目标事件的 JavaDoc 为准。

事件优先级

默认使用 EventPriority.NORMAL 即可。只有在明确需要与其他附属协调时才调整优先级:

  • 需要尽早拒绝操作时使用较低优先级,并保留其他插件修改事件的机会;
  • 需要观察最终事件参数时使用较高优先级,但不要在 MONITOR 阶段修改数据;
  • 不要在高频移动事件中做阻塞操作。