From fe9dabf7a004b8988008e23c0c1e3eb15bf83c89 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Wed, 7 Feb 2024 00:57:43 +0800 Subject: [PATCH] finish PlayerPrivilege commands, DominionFlag commands --- .../cn/lunadeer/dominion/commands/Apis.java | 16 ++ .../dominion/commands/DominionFlag.java | 36 ++++ .../dominion/commands/DominionOperate.java | 161 +++++++++++++++--- .../dominion/commands/PlayerPrivilege.java | 66 +++++++ .../controllers/DominionController.java | 11 +- .../controllers/PlayerController.java | 21 +++ .../controllers/PrivilegeController.java | 52 +++--- .../cn/lunadeer/dominion/dtos/PlayerDTO.java | 18 +- .../dominion/utils/ConfigManager.java | 14 +- src/main/resources/config.yml | 2 + 10 files changed, 343 insertions(+), 54 deletions(-) create mode 100644 src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java create mode 100644 src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java create mode 100644 src/main/java/cn/lunadeer/dominion/controllers/PlayerController.java diff --git a/src/main/java/cn/lunadeer/dominion/commands/Apis.java b/src/main/java/cn/lunadeer/dominion/commands/Apis.java index be4b562..b4e7b96 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Apis.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Apis.java @@ -1,10 +1,15 @@ package cn.lunadeer.dominion.commands; +import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.List; + public class Apis { public static Player playerOnly(CommandSender sender) { if (!(sender instanceof Player)) { @@ -30,4 +35,15 @@ public class Apis { Notification.info(sender, " 领地的对角点坐标为 x1=" + x1 + " y1=" + y1 + " z1=" + z1 + " x2=" + x2 + " y2=" + y2 + " z2=" + z2); } + public static void autoPoints(Player player) { + Integer size = Dominion.config.getAutoCreateRadius(); + Location location = player.getLocation(); + Location location1 = new Location(location.getWorld(), location.getX() - size, location.getY() - size, location.getZ() - size); + Location location2 = new Location(location.getWorld(), location.getX() + size, location.getY() + size, location.getZ() + size); + List points = new ArrayList<>(); + points.add(location1); + points.add(location2); + Dominion.pointsSelect.put(player.getUniqueId(), points); + } + } diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java b/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java new file mode 100644 index 0000000..322703f --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionFlag.java @@ -0,0 +1,36 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.controllers.DominionController; +import cn.lunadeer.dominion.controllers.FlagsController; +import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; + +public class DominionFlag { + + /** + * 设置领地权限 + * /dominion set <权限名称> [领地名称] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void setDominionFlag(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length == 3) { + if (FlagsController.setFlag(player, args[1], Boolean.parseBoolean(args[2])) == null) { + Notification.error(sender, "设置领地权限失败"); + } + } else if (args.length == 4) { + if (FlagsController.setFlag(player, args[1], Boolean.parseBoolean(args[2]), args[3]) == null) { + Notification.error(sender, "设置领地权限失败"); + } + } else { + Notification.error(sender, "用法: /dominion set <权限名称> [领地名称]"); + } + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java index 4cd55c5..61e4640 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java +++ b/src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java @@ -9,14 +9,16 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.ArrayList; import java.util.List; -import static cn.lunadeer.dominion.commands.Apis.playerOnly; -import static cn.lunadeer.dominion.commands.Apis.sizeInfo; +import static cn.lunadeer.dominion.commands.Apis.*; +import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion; public class DominionOperate { /** * 创建领地 + * /dominion create <领地名称> * * @param sender 命令发送者 * @param args 命令参数 @@ -34,22 +36,50 @@ public class DominionOperate { return; } String name = args[1]; - DominionDTO dominionDTO = DominionDTO.select(name); - if (dominionDTO != null) { - Notification.error(sender, "已经存在名称为 " + name + " 的领地"); - return; - } - dominionDTO = DominionController.create(player, name, points.get(0), points.get(1)); - if (dominionDTO == null) { + if (DominionController.create(player, name, points.get(0), points.get(1)) == null) { Notification.error(sender, "创建领地失败"); return; } - Notification.info(sender, "成功创建领地: " + name); + Notification.info(sender, "成功创建: " + name); + } + + /** + * 创建子领地 + * /dominion create_sub <子领地名称> [父领地名称] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void createSubDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 2 && args.length != 3) { + Notification.error(sender, "用法: /dominion create_sub <子领地名称> [父领地名称]"); + return; + } + List points = Dominion.pointsSelect.get(player.getUniqueId()); + if (points == null || points.size() != 2) { + Notification.error(sender, "请先使用木棍选择子领地的对角线两点,或使用 /dominion auto_create_sub <子领地名称> [父领地名称] 创建自动子领地"); + return; + } + if (args.length == 2) { + if (DominionController.create(player, args[1], points.get(0), points.get(1)) != null) { + Notification.info(sender, "成功创建子领地: " + args[1]); + return; + } + } else { + if (DominionController.create(player, args[1], points.get(0), points.get(1), args[2]) != null) { + Notification.info(sender, "成功创建子领地: " + args[1]); + return; + } + } + Notification.error(sender, "创建子领地失败"); } /** * 自动创建领地 - * 会在玩家当前位置的周围创建一个 20x20x20 的领地 + * 会在玩家当前位置的周围创建一个领地 + * /dominion auto_create <领地名称> * * @param sender 命令发送者 * @param args 命令参数 @@ -61,23 +91,36 @@ public class DominionOperate { Notification.error(sender, "用法: /dominion auto_create <领地名称>"); return; } - String name = args[1]; - DominionDTO dominionDTO = DominionDTO.select(name); - if (dominionDTO != null) { - Notification.error(sender, "已经存在名称为 " + name + " 的领地"); - return; - } - Location location = player.getLocation(); - Location location1 = new Location(location.getWorld(), location.getX() - 10, location.getY() - 10, location.getZ() - 10); - Location location2 = new Location(location.getWorld(), location.getX() + 10, location.getY() + 10, location.getZ() + 10); - dominionDTO = DominionController.create(player, name, location1, location2); - if (dominionDTO == null) { - Notification.error(sender, "创建领地失败"); - return; - } - Notification.info(sender, "成功创建领地: " + name); + autoPoints(player); + createDominion(sender, args); } + /** + * 自动创建子领地 + * 会在玩家当前位置的周围创建一个子领地 + * /dominion auto_create_sub <子领地名称> [父领地名称] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void autoCreateSubDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 2 && args.length != 3) { + Notification.error(sender, "用法: /dominion auto_create_sub <子领地名称> [父领地名称]"); + return; + } + autoPoints(player); + createSubDominion(sender, args); + } + + /** + * 扩张领地 + * /dominion expand [大小] [领地名称] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ public static void expandDominion(CommandSender sender, String[] args) { Player player = playerOnly(sender); if (player == null) return; @@ -111,4 +154,70 @@ public class DominionOperate { sizeInfo(sender, dominionDTO); } } + + /** + * 缩小领地 + * /dominion contract [大小] [领地名称] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void contractDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 2 && args.length != 3) { + Notification.error(sender, "用法: /dominion contract [大小] [领地名称]"); + return; + } + int size = 10; + String name = ""; + if (args.length == 2) { + try { + size = Integer.parseInt(args[1]); + } catch (Exception e) { + Notification.error(sender, "大小格式错误"); + return; + } + } + if (args.length == 3) { + name = args[2]; + } + DominionDTO dominionDTO; + if (name.isEmpty()) { + dominionDTO = DominionController.contract(player, size); + } else { + dominionDTO = DominionController.contract(player, size, name); + } + if (dominionDTO == null) { + Notification.error(sender, "缩小领地失败"); + } else { + Notification.info(sender, "成功缩小领地: " + dominionDTO.getName() + " " + size); + sizeInfo(sender, dominionDTO); + } + } + + /** + * 删除领地 + * /dominion delete <领地名称> [force] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void deleteDominion(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length == 2) { + String name = args[1]; + DominionController.delete(player, name, false); + return; + } + if (args.length == 3) { + String name = args[1]; + if (args[2].equals("force")) { + DominionController.delete(player, name, true); + return; + } + } + Notification.error(sender, "用法: /dominion delete <领地名称> [force]"); + } } diff --git a/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java b/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java new file mode 100644 index 0000000..d5663a5 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/commands/PlayerPrivilege.java @@ -0,0 +1,66 @@ +package cn.lunadeer.dominion.commands; + +import cn.lunadeer.dominion.dtos.PlayerDTO; +import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static cn.lunadeer.dominion.commands.Apis.playerOnly; +import static cn.lunadeer.dominion.controllers.PrivilegeController.clearPrivilege; +import static cn.lunadeer.dominion.controllers.PrivilegeController.setPrivilege; + +public class PlayerPrivilege { + + /** + * 设置玩家权限 + * /dominion set_privilege <玩家名称> <权限名称> [领地名称] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void setPlayerPrivilege(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 4 && args.length != 5) { + Notification.error(sender, "用法: /dominion set_privilege <玩家名称> <权限名称> [领地名称]"); + return; + } + if (args.length == 4) { + if (setPrivilege(player, args[1], args[2], Boolean.parseBoolean(args[3]))) { + return; + } + } else { + if (setPrivilege(player, args[1], args[2], Boolean.parseBoolean(args[3]), args[4])) { + return; + } + } + Notification.error(sender, "设置玩家权限失败"); + } + + /** + * 重置玩家权限 + * /dominion clear_privilege <玩家名称> [领地名称] + * + * @param sender 命令发送者 + * @param args 命令参数 + */ + public static void clearPlayerPrivilege(CommandSender sender, String[] args) { + Player player = playerOnly(sender); + if (player == null) return; + if (args.length != 2 && args.length != 3) { + Notification.error(sender, "用法: /dominion clear_privilege <玩家名称> [领地名称]"); + return; + } + if (args.length == 2) { + if (clearPrivilege(player, args[1])) { + return; + } + } else { + if (clearPrivilege(player, args[1], args[2])) { + return; + } + } + Notification.error(sender, "重置玩家权限失败"); + } + +} diff --git a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java index a6f6bbf..c8d8e37 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/DominionController.java @@ -25,7 +25,12 @@ public class DominionController { * @return 创建的领地 */ public static DominionDTO create(Player owner, String name, Location loc1, Location loc2) { - return create(owner, name, loc1, loc2, ""); + DominionDTO parent = getPlayerCurrentDominion(owner); + if (parent == null) { + return create(owner, name, loc1, loc2, ""); + } else { + return create(owner, name, loc1, loc2, parent.getName()); + } } /** @@ -41,6 +46,10 @@ public class DominionController { public static DominionDTO create(Player owner, String name, Location loc1, Location loc2, String parent_dominion_name) { + if (DominionDTO.select(name) != null) { + Notification.error(owner, "已经存在名称为 " + name + " 的领地"); + return null; + } if (!loc1.getWorld().equals(loc2.getWorld())) { Notification.error(owner, "禁止跨世界操作"); return null; diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PlayerController.java b/src/main/java/cn/lunadeer/dominion/controllers/PlayerController.java new file mode 100644 index 0000000..a1e98e6 --- /dev/null +++ b/src/main/java/cn/lunadeer/dominion/controllers/PlayerController.java @@ -0,0 +1,21 @@ +package cn.lunadeer.dominion.controllers; + +import cn.lunadeer.dominion.dtos.PlayerDTO; + +import java.util.List; +import java.util.UUID; + +public class PlayerController { + + public static PlayerDTO getPlayerDTO(String playerName) { + return PlayerDTO.select(playerName); + } + + public static List searchPlayer(String playerName) { + return PlayerDTO.search(playerName); + } + + public static List allPlayers() { + return PlayerDTO.all(); + } +} diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java index 7d6c620..f890aad 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -1,6 +1,7 @@ package cn.lunadeer.dominion.controllers; import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.dominion.utils.Notification; @@ -19,38 +20,42 @@ public class PrivilegeController { /** * 清空玩家特权 * - * @param operator 操作者 - * @param player 玩家 + * @param operator 操作者 + * @param player_name 玩家 * @return 是否清空成功 */ - public static boolean clearPrivilege(Player operator, UUID player) { + public static boolean clearPrivilege(Player operator, String player_name) { DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); if (dominion == null) return false; - return clearPrivilege(operator, player, dominion.getName()); + return clearPrivilege(operator, player_name, dominion.getName()); } /** * 清空玩家特权 * * @param operator 操作者 - * @param player 玩家 + * @param player_name 玩家 * @param dominionName 领地名称 * @return 是否清空成功 */ - public static boolean clearPrivilege(Player operator, UUID player, String dominionName) { + public static boolean clearPrivilege(Player operator, String player_name, String dominionName) { DominionDTO dominion = DominionDTO.select(dominionName); if (dominion == null) { Notification.error(operator, "领地 " + dominionName + " 不存在"); return false; } if (noAuthToChangeFlags(operator, dominion)) return false; - List privileges = PlayerPrivilegeDTO.select(player, dominion.getId()); - List templates = getPlayerPrivilegeTemplates(player, dominion.getId()); + PlayerDTO player = PlayerController.getPlayerDTO(player_name); + if (player == null) { + Notification.error(operator, "玩家 " + player_name + " 不存在或没有登录过"); + return false; + } + List templates = getPlayerPrivilegeTemplates(player.getUuid(), dominion.getId()); if (templates.size() < 1) { return true; } for (PrivilegeTemplateDTO template : templates) { - PlayerPrivilegeDTO.delete(player, dominion.getId(), template.getId()); + PlayerPrivilegeDTO.delete(player.getUuid(), dominion.getId(), template.getId()); } return true; } @@ -58,38 +63,43 @@ public class PrivilegeController { /** * 设置玩家特权 * - * @param operator 操作者 - * @param player 玩家 - * @param flag 权限名称 - * @param value 权限值 + * @param operator 操作者 + * @param player_name 玩家 + * @param flag 权限名称 + * @param value 权限值 * @return 是否设置成功 */ - public static boolean setPrivilege(Player operator, UUID player, String flag, boolean value) { + public static boolean setPrivilege(Player operator, String player_name, String flag, boolean value) { DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); if (dominion == null) return false; - return setPrivilege(operator, player, flag, value, dominion.getName()); + return setPrivilege(operator, player_name, flag, value, dominion.getName()); } /** * 设置玩家特权 * * @param operator 操作者 - * @param player 玩家 + * @param player_name 玩家 * @param flag 权限名称 * @param value 权限值 * @param dominionName 领地名称 * @return 是否设置成功 */ - public static boolean setPrivilege(Player operator, UUID player, String flag, boolean value, String dominionName) { + public static boolean setPrivilege(Player operator, String player_name, String flag, boolean value, String dominionName) { DominionDTO dominion = DominionDTO.select(dominionName); if (dominion == null) { Notification.error(operator, "领地 " + dominionName + " 不存在"); return false; } if (noAuthToChangeFlags(operator, dominion)) return false; - List templates = getPlayerPrivilegeTemplates(player, dominion.getId()); + PlayerDTO player = PlayerController.getPlayerDTO(player_name); + if (player == null) { + Notification.error(operator, "玩家 " + player_name + " 不存在或没有登录过"); + return false; + } + List templates = getPlayerPrivilegeTemplates(player.getUuid(), dominion.getId()); if (templates.size() < 1) { - PrivilegeTemplateDTO template = createPlayerPrivilege(operator, player, dominion.getId()); + PrivilegeTemplateDTO template = createPlayerPrivilege(operator, player.getUuid(), dominion.getId()); if (template == null) return false; templates.add(template); } @@ -103,7 +113,7 @@ public class PrivilegeController { } PrivilegeTemplateDTO privilege = templates.get(0); if (Objects.equals(flag, "admin")) { - List privileges = PlayerPrivilegeDTO.select(player, dominion.getId()); + List privileges = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId()); for (PlayerPrivilegeDTO p : privileges) { if (p.getPrivilegeTemplateID().equals(privilege.getId())) { p = p.setAdmin(value); @@ -117,7 +127,7 @@ public class PrivilegeController { Notification.error(operator, "没有找到玩家权限关联数据"); return false; } - if (!Apis.updateTemplateFlag(privilege, flag, value)){ + if (!Apis.updateTemplateFlag(privilege, flag, value)) { Notification.error(operator, "未知的领地权限 " + flag); return false; } diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java index 4fed5e2..12513b8 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java @@ -20,12 +20,13 @@ public class PlayerDTO { return re; } - public PlayerDTO onJoin() { - return update(this); + public static List all() { + String sql = "SELECT * FROM player_name"; + return query(sql); } - public static List search(String name) { - return select(name); + public PlayerDTO onJoin() { + return update(this); } private static List query(String sql) { @@ -54,7 +55,14 @@ public class PlayerDTO { return players.get(0); } - private static List select(String name) { + public static PlayerDTO select(String name) { + String sql = "SELECT * FROM player_name WHERE last_known_name = '" + name + "'"; + List players = query(sql); + if (players.size() == 0) return null; + return players.get(0); + } + + public static List search(String name) { // 模糊搜索 String sql = "SELECT * FROM player_name WHERE last_known_name LIKE '%" + name + "%'"; return query(sql); diff --git a/src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java b/src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java index 21afba7..d852138 100644 --- a/src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java +++ b/src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java @@ -20,6 +20,7 @@ public class ConfigManager { _db_name = _file.getString("Database.Name", "dominion"); _db_user = _file.getString("Database.User", "postgres"); _db_pass = _file.getString("Database.Pass", "postgres"); + _auto_create_radius = _file.getInt("AutoCreateRadius", 10); } public Boolean isDebug() { @@ -50,7 +51,6 @@ public class ConfigManager { return _db_user; } - public void setDbPass(String db_pass) { _db_pass = db_pass; _file.set("Database.Pass", db_pass); @@ -64,6 +64,16 @@ public class ConfigManager { return _db_pass; } + public Integer getAutoCreateRadius() { + return _auto_create_radius; + } + + public void setAutoCreateRadius(Integer radius) { + _auto_create_radius = radius; + _file.set("AutoCreateRadius", radius); + _plugin.saveConfig(); + } + private final Dominion _plugin; private FileConfiguration _file; @@ -74,4 +84,6 @@ public class ConfigManager { private String _db_user; private String _db_pass; private String _db_name; + + private Integer _auto_create_radius; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f56d9ba..5882e6d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -5,4 +5,6 @@ Database: User: dominion Pass: dominion +AutoCreateRadius: 10 + Debug: false \ No newline at end of file