查询与权限
文档/dominion-api/查询与权限

查询与权限

获取领地、成员和组,并在玩家动作前执行正确的 Dominion 权限检查。

查询当前位置领地

DominionDTO dominion = api.getDominion(location);
if (dominion == null) {
    // 未认领区域,按你的附属默认逻辑处理
    return;
}
String name = dominion.getName();
UUID owner = dominion.getOwner();

这是最适合菜单、提示、日志和动作预检查的查询方式。位置对象应当来自当前事件,并确认其世界不是 null

查询玩家当前领地

DominionDTO current = api.getPlayerCurrentDominion(player);

该方法会参与 Dominion 的玩家当前位置缓存,并可能触发进入/离开事件。只想读取当前方块所属的领地时,使用 getDominion(player.getLocation())

查询成员和权限组

MemberDTO member = api.getMember(dominion, player.getUniqueId());
if (member != null) {
    GroupDTO group = api.getGroup(member);
    boolean personalContainer = member.getFlagValue(Flags.CONTAINER);
    boolean groupContainer = group != null && group.getFlagValue(Flags.CONTAINER);
}

上例适合展示数据。不要只用 personalContainer || groupContainer 自己实现最终权限:Dominion 还要考虑所有者、访客、world-wide 规则、管理权限和其他优先级。最终动作请调用 checkPrivilegeFlag

权限检查

需要 Dominion 正常反馈

if (!api.checkPrivilegeFlag(
        block.getLocation(),
        Flags.BREAK_BLOCK,
        player
)) {
    return;
}
// 执行你的后续逻辑

静默检查

boolean allowed = api.checkPrivilegeFlagSilence(
        location,
        Flags.CONTAINER,
        player
);

静默版本不会发送 Dominion 的拒绝提示,也不会触发相关反馈事件,适合菜单是否显示按钮、后台预检查和不会直接代表玩家动作的联动。真实动作若需要向玩家说明拒绝原因,使用非静默版本。

环境检查

if (api.checkEnvironmentFlag(location, Flags.FIRE_SPREAD)) {
    // 该位置的 Dominion 环境规则允许火焰扩散
}

环境检查不需要玩家参数。推荐使用按位置的重载,以便同时考虑 world-wide 规则;checkEnvironmentFlag(DominionDTO, EnvFlag) 只在你明确只想检查某个领地对象时使用。

多服务器和缓存

按 ID、名称、所有者和组查询的部分方法会读取 Dominion 的本地/多服缓存。缓存不是实时数据库连接:

  • 不要把 DTO 的引用长期保存成永久事实;需要使用时重新查询;
  • 不要直接改数据库或 Dominion 内部缓存;
  • 跨服联动要准备目标服务器暂时不可用、缓存延迟和传送失败;
  • 领地删除或成员移除后,旧 DTO 可能仍被你的异步回调持有,使用前重新确认状态。