监听事件
使用进入/离开事件和数据操作事件完成通知、拦截与后处理。
进入领地时发送提示
@EventHandler
public void onEnter(PlayerMoveInDominionEvent event) {
Player player = event.getPlayer();
DominionDTO dominion = event.getDominion();
player.sendMessage("欢迎来到 " + dominion.getName());
}
不要用每 tick 扫描所有在线玩家来做同一件事。Dominion 已经提供了边界事件,使用事件可以减少重复查询。
阻止保留名称
@EventHandler
public void onCreate(DominionCreateEvent event) {
if (event.getName().startsWith("server-")) {
event.setCancelled(true);
event.getOperator().sendMessage("该名称前缀由服务器保留。");
}
}
这是数据实际处理前的事件。若要修改名称,可以调用 event.setName(...),但修改结果还会继续接受 Dominion 的名称规则和其他合法性检查。
成功添加成员后处理
@EventHandler
public void onMemberAdded(MemberAddedEvent event) {
if (event.isCancelled()) return;
event.afterAdded(member -> {
if (member == null) return;
Player player = Bukkit.getPlayer(member.getPlayerUUID());
if (player == null) return;
// 根据目标服务端的线程模型切回合适的实体调度器
player.sendMessage("你已加入领地 " + event.getDominion().getName());
});
}
afterAdded 回调可能在异步线程执行。涉及在线玩家、菜单或世界的代码,应使用 Paper/Folia 提供的合适调度方式;不要假设回调一定在 Bukkit 主线程。
使用统一边界事件
@EventHandler
public void onBorder(PlayerCrossDominionBorderEvent event) {
DominionDTO from = event.getFrom();
DominionDTO to = event.getTo();
if (to != null && from == null) {
// 从未认领区域进入领地
} else if (to == null && from != null) {
// 从领地离开到未认领区域
} else if (from != null && to != null) {
// 从一个领地切换到另一个领地
}
}