成员和领地操作
用 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 还会检查名称、玩家额度、尺寸、重叠、父子边界和经济规则。