事件联动
通过 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#setDirection、setSize。
修改后仍会经过 Dominion 后续合法性检查。事件可写不代表附属可以绕过权限、重叠、经济或父子领地约束。
获取操作结果
数据操作在事件分发之后才真正执行。需要在成功后发放奖励、同步外部系统或发送通知时,用事件提供的回调:
@EventHandler
public void onMemberAdded(MemberAddedEvent event) {
if (event.isCancelled()) return;
event.afterAdded(member -> {
if (member == null) return;
// 这里才处理添加结果
getLogger().info("Member added: " + member.getPlayerUUID());
});
}
创建/修改类事件通常提供 afterCreated 或 afterModified,成员和组事件提供 afterAdded、afterRemoved 或 afterSet。确切名称以目标事件的 JavaDoc 为准。
事件优先级
默认使用 EventPriority.NORMAL 即可。只有在明确需要与其他附属协调时才调整优先级:
- 需要尽早拒绝操作时使用较低优先级,并保留其他插件修改事件的机会;
- 需要观察最终事件参数时使用较高优先级,但不要在
MONITOR阶段修改数据; - 不要在高频移动事件中做阻塞操作。