监听事件
文档/dominion-api/监听事件

监听事件

使用进入/离开事件和数据操作事件完成通知、拦截与后处理。

进入领地时发送提示

@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) {
        // 从一个领地切换到另一个领地
    }
}