diff --git a/README.md b/README.md index 38c15eb..8fa66dc 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,8 @@ 领地有两种创建方式:1.手动选择区域创建;2.以操作者为中心自动创建。 -手动创建:需要使用箭矢作为选区工具,依次使用左键点选领地长方体区域的第一个点、右键点击长方体区域的第二个点。然后使用`/dominion create <领地名称>`创建领地,领地名称不可与其他领地重复。 +手动创建:需要使用箭矢作为选区工具,依次使用左键点选领地长方体区域的第一个点、右键点击长方体区域的第二个点。然后使用`/dominion create <领地名称>` +创建领地,领地名称不可与其他领地重复。 自动创建:不需要选择对角线点,会以玩家为中心自动创建一定区域的领地。使用 `/dominion auto_create <领地名称>`即可自动创建领地区域。 @@ -80,7 +81,8 @@ 同样可以点击【清除】,即可删除此玩家在此领地的所有特权。 -管理员:你可以在玩家特权中将一个玩家设置为【管理员】,那么此玩家即可拥有所有特权,同时此玩家还会**拥有此领地的权限编辑权限**,但是无法对领地大小进行编辑,同时也无法设置其他玩家为管理员。 +管理员:你可以在玩家特权中将一个玩家设置为【管理员】,那么此玩家即可拥有所有特权,同时此玩家还会**拥有此领地的权限编辑权限** +,但是无法对领地大小进行编辑,同时也无法设置其他玩家为管理员。 ### 4. 领地范围编辑 @@ -118,29 +120,32 @@ 以下指令尖括号`<>`表示必填参数,方括号`[]`表示可选参数。 -| 指令名 | 指令 | -|-----|----| -| 打开交互菜单 | `/dominion menu` | -| 列出所有领地 | `/dominion list` | -| 查看帮助 | `/dominion help [页码]` | -| 查看领地信息 | `/dominion info [领地名称]` | -| 查看领地权限信息 | `/dominion flag_info <领地名称> [页码]` | -| 管理领地 | `/dominion manage <领地名称>` | -| 创建领地 | `/dominion create <领地名称>` | -| 自动创建领地 | `/dominion auto_create <领地名称>` | -| 创建子领地 | `/dominion create_sub <子领地名称> [父领地名称]` | -| 自动创建子领地 | `/dominion auto_create_sub <子领地名称> [父领地名称]` | -| 扩张领地 | `/dominion expand [大小] [领地名称]` | -| 缩小领地 | `/dominion contract [大小] [领地名称]` | -| 删除领地 | `/dominion delete <领地名称> [force]` | -| 设置领地权限 | `/dominion set <权限名称> [领地名称]` | -| 创建玩家特权 | `/dominion create_privilege <玩家名称> [领地名称]` | -| 设置玩家特权 | `/dominion set_privilege <玩家名称> <权限名称> [领地名称]` | -| 重置玩家特权 | `/dominion clear_privilege <玩家名称> [领地名称]` | -| 查看领地玩家特权列表 | `/dominion privilege_list [领地名称] [页码]` | -| 查看玩家特权信息 | `/dominion privilege_info <玩家名称> [领地名称] [页码]` | -| 设置进入领地的提示语 | `/dominion set_enter_msg <提示语> [领地名称]` | -| 设置离开领地的提示语 | `/dominion set_leave_msg <提示语> [领地名称]` | +| 指令名 | 指令 | +|------------|-------------------------------------------------------------| +| 打开交互菜单 | `/dominion menu` | +| 查看帮助 | `/dominion help [页码]` | +| 创建领地 | `/dominion create <领地名称>` | +| 自动创建领地 | `/dominion auto_create <领地名称>` | +| 创建子领地 | `/dominion create_sub <子领地名称> [父领地名称]` | +| 自动创建子领地 | `/dominion auto_create_sub <子领地名称> [父领地名称]` | +| 管理领地 | `/dominion manage <领地名称>` | +| 扩张领地 | `/dominion expand [大小] [领地名称]` | +| 缩小领地 | `/dominion contract [大小] [领地名称]` | +| 设置进入领地的提示语 | `/dominion set_enter_msg <提示语> [领地名称]` | +| 设置离开领地的提示语 | `/dominion set_leave_msg <提示语> [领地名称]` | +| 重命名领地 | `/dominion rename <原领地名称> <新领地名称>` | +| 转让领地 | `/dominion give <领地名称> <玩家名称>` | +| 删除领地 | `/dominion delete <领地名称>` | +| ---------- | ---------- | +| 列出所有领地 | `/dominion list` | +| 查看领地信息 | `/dominion info [领地名称]` | +| 查看领地权限信息 | `/dominion flag_info <领地名称> [页码]` | +| 设置领地权限 | `/dominion set <权限名称> [领地名称]` | +| 创建玩家特权 | `/dominion create_privilege <玩家名称> [领地名称]` | +| 设置玩家特权 | `/dominion set_privilege <玩家名称> <权限名称> [领地名称]` | +| 重置玩家特权 | `/dominion clear_privilege <玩家名称> [领地名称]` | +| 查看领地玩家特权列表 | `/dominion privilege_list [领地名称] [页码]` | +| 查看玩家特权信息 | `/dominion privilege_info <玩家名称> [领地名称] [页码]` | ### 管理员指令 @@ -164,7 +169,7 @@ MaxZ: 128 AutoClean: Enabled: false AfterDays: 180 - + BlueMap: true Debug: false diff --git a/pom.xml b/pom.xml index 5ac54d1..efbf874 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.7.0-beta + 1.8.0-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/Commands.java b/src/main/java/cn/lunadeer/dominion/Commands.java index 4c45e41..b448f66 100644 --- a/src/main/java/cn/lunadeer/dominion/Commands.java +++ b/src/main/java/cn/lunadeer/dominion/Commands.java @@ -123,6 +123,12 @@ public class Commands implements TabExecutor { case "set_leave_msg": DominionOperate.setLeaveMessage(sender, args); break; + case "rename": + DominionOperate.renameDominion(sender, args); + break; + case "give": + DominionOperate.giveDominion(sender, args); + break; default: return false; } @@ -149,7 +155,9 @@ public class Commands implements TabExecutor { "create", "auto_create", "create_sub", "auto_create_sub", "expand", "contract", "delete", "set", "create_privilege", "set_privilege", "clear_privilege", "list", "privilege_info", "set_enter_msg", - "set_leave_msg" + "set_leave_msg", + "rename", + "give" ); } if (args.length == 2) { @@ -165,6 +173,8 @@ public class Commands implements TabExecutor { case "manage": case "flag_info": case "privilege_list": + case "rename": + case "give": return playerDominions(sender); case "set": return dominionFlags(); @@ -201,6 +211,10 @@ public class Commands implements TabExecutor { case "set_enter_msg": case "set_leave_msg": return playerDominions(sender); + case "rename": + return Collections.singletonList("输入新领地名称"); + case "give": + return playerNames(); } } if (args.length == 4) { diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index 9da807d..17b0cd6 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -211,7 +211,7 @@ public class DominionOperate { return; } } - Notification.error(sender, "用法: /dominion delete <领地名称> [force]"); + Notification.error(sender, "用法: /dominion delete <领地名称>"); } /** @@ -255,4 +255,48 @@ public class DominionOperate { } Notification.error(sender, "用法: /dominion set_leave_msg <提示语> [领地名称]"); } + + /** + * 重命名领地 + * /dominion rename <原领地名称> <新领地名称> + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void renameDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 3) { + Notification.error(sender, "用法: /dominion rename <原领地名称> <新领地名称>"); + return; + } + DominionController.rename(player, args[1], args[2]); + } + + /** + * 转让领地 + * /dominion give <领地名称> <玩家名称> [force] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void giveDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length == 3) { + String dom_name = args[1]; + String player_name = args[2]; + DominionController.give(player, dom_name, player_name, false); + return; + } + if (args.length == 4) { + String dom_name = args[1]; + String player_name = args[2]; + if (args[3].equals("force")) { + DominionController.give(player, dom_name, player_name, true); + return; + } + } + Notification.error(sender, "用法: /dominion give <领地名称> <玩家名称>"); + } } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java index 741512c..0b8c503 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java @@ -2,6 +2,7 @@ package cn.lunadeer.dominion.controllers; import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.utils.Notification; import cn.lunadeer.dominion.utils.Time; import cn.lunadeer.dominion.utils.XLogger; @@ -9,7 +10,9 @@ import org.bukkit.Location; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import static cn.lunadeer.dominion.controllers.Apis.*; @@ -29,7 +32,7 @@ public class DominionController { * @return 创建的领地 */ public static DominionDTO create(Player owner, String name, Location loc1, Location loc2) { - DominionDTO parent = getPlayerCurrentDominion(owner,false); + DominionDTO parent = getPlayerCurrentDominion(owner, false); if (parent == null) { return create(owner, name, loc1, loc2, ""); } else { @@ -314,7 +317,7 @@ public class DominionController { if (notOwner(operator, dominion)) { return; } - List sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId()); + List sub_dominions = getSubDominionsRecursive(dominion); if (!force) { Notification.warn(operator, "删除领地 " + dominion_name + " 会同时删除其所有子领地,是否继续?"); String sub_names = ""; @@ -323,7 +326,7 @@ public class DominionController { } if (sub_dominions.size() > 0) { sub_names = sub_names.substring(0, sub_names.length() - 2); - Notification.warn(operator, "当前子领地(不包含子领地的子领地等):" + sub_names); + Notification.warn(operator, "当前子领地:" + sub_names); } Notification.warn(operator, "输入 /dominion delete " + dominion_name + " force 确认删除"); return; @@ -364,6 +367,7 @@ public class DominionController { return; } dominion.setJoinMessage(message); + Notification.info(operator, "成功设置领地 " + dominion_name + " 的进入消息"); } /** @@ -398,6 +402,82 @@ public class DominionController { return; } dominion.setLeaveMessage(message); + Notification.info(operator, "成功设置领地 " + dominion_name + " 的离开消息"); + } + + /** + * 重命名领地 + * + * @param operator 操作者 + * @param old_name 旧名称 + * @param new_name 新名称 + */ + public static void rename(Player operator, String old_name, String new_name) { + DominionDTO dominion = DominionDTO.select(old_name); + if (dominion == null) { + Notification.error(operator, "领地 " + old_name + " 不存在"); + return; + } + if (notOwner(operator, dominion)) { + Notification.error(operator, "你不是领地 " + old_name + " 的拥有者,无法执行此操作"); + return; + } + if (DominionDTO.select(new_name) != null) { + Notification.error(operator, "已经存在名称为 " + new_name + " 的领地"); + return; + } + dominion.setName(new_name); + Notification.info(operator, "成功将领地 " + old_name + " 重命名为 " + new_name); + } + + /** + * 转让领地 + * + * @param operator 操作者 + * @param dom_name 领地名称 + * @param player_name 玩家名称 + * @param force 是否强制转让 + */ + public static void give(Player operator, String dom_name, String player_name, boolean force) { + if (Objects.equals(player_name, operator.getName())) { + Notification.error(operator, "你不能将领地转让给自己"); + return; + } + DominionDTO dominion = DominionDTO.select(dom_name); + if (dominion == null) { + Notification.error(operator, "领地 " + dom_name + " 不存在"); + return; + } + if (notOwner(operator, dominion)) { + return; + } + PlayerDTO player = PlayerController.getPlayerDTO(player_name); + if (player == null) { + Notification.error(operator, "玩家 " + player_name + " 不存在"); + return; + } + if (dominion.getParentDomId() != -1) { + Notification.error(operator, "子领地无法转让,你可以通过将玩家设置为管理员来让其管理子领地"); + return; + } + List sub_dominions = getSubDominionsRecursive(dominion); + if (!force) { + Notification.warn(operator, "转让领地 " + dom_name + " 给 " + player_name + " 会同时转让其所有子领地,是否继续?"); + String sub_names = ""; + for (DominionDTO sub_dominion : sub_dominions) { + sub_names = sub_dominion.getName() + ", "; + } + if (sub_dominions.size() > 0) { + sub_names = sub_names.substring(0, sub_names.length() - 2); + Notification.warn(operator, "当前子领地:" + sub_names); + } + Notification.warn(operator, "输入 /dominion give " + dom_name + " " + player_name + " force 确认转让"); + return; + } + for (DominionDTO sub_dominion : sub_dominions) { + sub_dominion.setOwner(player.getUuid()); + } + Notification.info(operator, "成功将领地 " + dom_name + " 及其所有子领地转让给 " + player_name); } /** @@ -435,4 +515,14 @@ public class DominionController { sub.getY1() >= y1 && sub.getY2() <= y2 && sub.getZ1() >= z1 && sub.getZ2() <= z2; } + + private static List getSubDominionsRecursive(DominionDTO dominion) { + List sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId()); + List sub_sub_dominions = new ArrayList<>(); + for (DominionDTO sub_dominion : sub_dominions) { + sub_sub_dominions.addAll(getSubDominionsRecursive(sub_dominion)); + } + sub_dominions.addAll(sub_sub_dominions); + return sub_dominions; + } } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java index 3bf0228..f5b0f8d 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java @@ -321,7 +321,7 @@ public class DominionDTO { private Integer id; private UUID owner; - private final String name; + private String name; private final String world; private Integer x1; private Integer y1; @@ -396,6 +396,11 @@ public class DominionDTO { return name; } + public DominionDTO setName(String name) { + this.name = name; + return update(this); + } + public String getWorld() { return world; } diff --git a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java index e4abd85..59a6beb 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/Apis.java @@ -75,28 +75,31 @@ public class Apis { if (player == null) return; int page = getPage(args); ListView view = ListView.create(5, "/dominion help"); - view.title("领地插件命令帮助") + view.title("领地插件命令帮助 <>表示必填参数 []表示可选参数") .add(Line.create().append("打开交互菜单").append(Button.create("/dominion menu", "/dominion menu"))) - .add(Line.create().append("列出所有领地").append(Button.create("/dominion list", "/dominion list"))) .add(Line.create().append("查看帮助").append(Button.create("/dominion help [页码]", "/dominion help 1"))) - .add(Line.create().append("查看领地信息").append(Button.create("/dominion info [领地名称]", "/dominion info"))) - .add(Line.create().append("查看领地权限信息").append(Button.create("/dominion flag_info <领地名称> [页码]", "/dominion flag_info"))) - .add(Line.create().append("管理领地").append("/dominion manage <领地名称>")) .add(Line.create().append("创建领地").append("/dominion create <领地名称>")) .add(Line.create().append("自动创建领地").append("/dominion auto_create <领地名称>")) .add(Line.create().append("创建子领地").append("/dominion create_sub <子领地名称> [父领地名称]")) .add(Line.create().append("自动创建子领地").append("/dominion auto_create_sub <子领地名称> [父领地名称]")) + .add(Line.create().append("管理领地").append("/dominion manage <领地名称>")) .add(Line.create().append("扩张领地").append("/dominion expand [大小] [领地名称]")) .add(Line.create().append("缩小领地").append("/dominion contract [大小] [领地名称]")) + .add(Line.create().append("设置进入领地的提示语").append("/dominion set_enter_msg <提示语> [领地名称]")) + .add(Line.create().append("设置离开领地的提示语").append("/dominion set_leave_msg <提示语> [领地名称]")) + .add(Line.create().append("重命名领地").append("/dominion rename <原领地名称> <新领地名称>")) + .add(Line.create().append("转让领地").append("/dominion give <领地名称> <玩家名称> [force]")) .add(Line.create().append("删除领地").append("/dominion delete <领地名称> [force]")) + // 以下指令主要被用于 ui 触发 + .add(Line.create().append("列出所有领地").append(Button.create("/dominion list", "/dominion list"))) + .add(Line.create().append("查看领地信息").append(Button.create("/dominion info [领地名称]", "/dominion info"))) + .add(Line.create().append("查看领地权限信息").append(Button.create("/dominion flag_info <领地名称> [页码]", "/dominion flag_info"))) .add(Line.create().append("设置领地权限").append("/dominion set <权限名称> [领地名称]")) .add(Line.create().append("创建玩家特权").append("/dominion create_privilege <玩家名称> [领地名称]")) .add(Line.create().append("设置玩家特权").append("/dominion set_privilege <玩家名称> <权限名称> [领地名称]")) .add(Line.create().append("重置玩家特权").append("/dominion clear_privilege <玩家名称> [领地名称]")) .add(Line.create().append("查看领地玩家特权列表").append("/dominion privilege_list [领地名称] [页码]")) .add(Line.create().append("查看玩家特权信息").append("/dominion privilege_info <玩家名称> [领地名称] [页码]")) - .add(Line.create().append("设置进入领地的提示语").append("/dominion set_enter_msg <提示语> [领地名称]")) - .add(Line.create().append("设置离开领地的提示语").append("/dominion set_leave_msg <提示语> [领地名称]")) .showOn(player, page); }