成员和领地操作
文档/dominion-api/成员和领地操作

成员和领地操作

用 Provider 执行受控的数据操作,并在异步完成后继续业务流程。

自动添加成员

public void addPlayerToDominion(
        CommandSender operator,
        DominionDTO dominion,
        UUID targetUuid
) {
    PlayerDTO target = api.getPlayer(targetUuid);
    if (target == null) {
        operator.sendMessage("Dominion 中没有这名玩家的数据。");
        return;
    }

    api.getMemberProvider()
            .addMember(operator, dominion, target)
            .thenAccept(member -> {
                if (member == null) {
                    operator.sendMessage("添加成员失败。");
                    return;
                }
                operator.sendMessage("成员已添加。");
            });
}

传入 operator 会让 Dominion 按该身份检查管理权限。后台自动化任务可以传入控制台,但应由配置明确授权,而不是把所有玩家操作都提升为控制台操作。

给成员设置个人权限

MemberDTO member = api.getMember(dominion, targetUuid);
if (member == null) return;

api.getMemberProvider()
        .setMemberFlag(operator, dominion, member, Flags.CONTAINER, true)
        .thenAccept(updated -> {
            if (updated == null) {
                getLogger().warning("Could not grant container access.");
            }
        });

如果权限是角色性质的,应创建组并通过 GroupProvider.setGroupFlag 配置,再把成员加入组;这样比给每个成员复制同一组权限更容易维护。

创建顶级领地

CuboidDTO area = new CuboidDTO(
        minX, minY, minZ,
        maxX, maxY, maxZ
);

api.getDominionProvider()
        .createDominion(
                Bukkit.getConsoleSender(),
                "auto-claim",
                ownerUuid,
                world,
                area,
                null,
                false
        )
        .thenAccept(created -> {
            if (created == null) {
                getLogger().warning("The claim was rejected by Dominion.");
                return;
            }
            getLogger().info("Created " + created.getName());
        });

不要把创建成功当作只要数据库插入成功即可。Provider 还会检查名称、玩家额度、尺寸、重叠、父子边界和经济规则。