diff --git a/README.md b/README.md index 8dae5ae..356435f 100644 --- a/README.md +++ b/README.md @@ -31,22 +31,137 @@ 1. 将插件放入服务器的 `plugins` 目录下 2. 重启服务器 -3. 在 `plugins/XXXXXXX/config.yml` 中配置 +3. 在 `plugins/Dominion/config.yml` 中配置 4. 重启服务器 ## 玩家使用方法 +### 1. 创建领地 + +领地有两种创建方式:1.手动选择区域创建;2.以操作者为中心自动创建。 + +手动创建:需要使用箭矢作为选区工具,依次使用左键点选领地长方体区域的第一个点、右键点击长方体区域的第二个点。然后使用`/dominion create <领地名称>`创建领地,领地名称不可与其他领地重复。 + +自动创建:不需要选择对角线点,会以玩家为中心自动创建一定区域的领地。使用 `/dominion auto_create <领地名称>`即可自动创建领地区域。 + +### 2. 领地管理 + +使用`/dominion menu`可以打开领地系统的可视化操作文字界面(TUI),单击【我的领地】可以查看自己创建的所有领地。 + +![](https://ssl.lunadeer.cn:14437/i/2024/02/16/65cf80216464b.png) + +单击对应领地的【管理】即可进入对应领地的管理界面。 + +![](https://ssl.lunadeer.cn:14437/i/2024/02/16/65cf807884b37.png) + +单击【权限设置】即可配置其他玩家在领地内的行为控制。 + +![](/media/202402/2024-02-16_233445_1258510.4401325488988944.png) + +绿色打勾表明启用,红色方框表示关闭。单击可以切换对应权限的开关状态。 + +![](https://ssl.lunadeer.cn:14437/i/2024/02/16/65cf80dcd4b4d.png) + +### 3. 玩家特权 + +在领地管理界面单击【玩家权限】即可管理玩家在此领地内的特权,请注意:玩家特权的优先级要高于领地权限控制。 + +![](https://ssl.lunadeer.cn:14437/i/2024/02/16/65cf830224cde.png) + +默认没有玩家拥有特权,可以点击【选择玩家创建特权】选择玩家创建其特权,注意:此处只会显示登录过服务器的玩家名称,因此暂时不支持对从没有在服务器登录过的玩家进行操作。 + +![](https://ssl.lunadeer.cn:14437/i/2024/02/16/65cf82f10c88e.png) + +选择了对应玩家后即可管理玩家在此领地的特权。 + +![](https://ssl.lunadeer.cn:14437/i/2024/02/16/65cf84498fc4c.png) + +![](https://ssl.lunadeer.cn:14437/i/2024/02/16/65cf84600f24d.png) + +同样可以点击【清除】,即可删除此玩家在此领地的所有特权。 + +管理员:你可以在玩家特权中将一个玩家设置为【管理员】,那么此玩家即可拥有所有特权,同时此玩家还会**拥有此领地的权限编辑权限**,但是无法对领地大小进行编辑,同时也无法设置其他玩家为管理员。 + +### 4. 领地范围编辑 + +总体而言对范围进行编辑有扩大与缩小两个操作。 + +扩大:面向想要扩大的方向,使用命令`/dominion expand [大小] [领地名称]`。 + +缩小:面向想要缩小的方向,使用命令`/dominion contract [大小] [领地名称]`。 + +其中大小和领地名称都是可选的,如果不填写,则大小默认为10,领地默认为当前所在领地。 + +请注意:1.如果需要填写领地名则同时需要填写大小;2.一般不建议在领地外进行扩大缩小操作;3.当对子领地进行操作时需要指明子领地名称。 + +### 5. 子领地 + +创建方法与普通领地相同,可以使用自动创建,也可以手动创建。 + +命令分别为: + +`/dominion create_sub <子领地名称> [父领地名称]` + +`/dominion auto_create_sub <子领地名称> [父领地名称]` + +当不填写父领地名称时会尝试以当前所在领地为父领地进行创建。 + +当玩家处在一个子领地内时,其行为只收到子领地的权限控制,即权限大小为: + +玩家子领地特权 > 子领地 > 父领地特权 > 父领地 + ## 管理员指南 ## 指令 ### 玩家指令 +以下指令尖括号`<>`表示必填参数,方括号`[]`表示可选参数。 + +| 指令名 | 指令 | +|-----|----| +| 打开交互菜单 | `/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 <玩家名称> [领地名称] [页码]` | + ### 管理员指令 +暂无 + ## 配置文件参考 ```yaml +Database: + Host: localhost + Port: 5432 + Name: dominion + User: dominion + Pass: dominion + +AutoCreateRadius: 10 +MaxX: 128 +MaxY: 64 +MaxZ: 128 + +BlueMap: true + +Debug: false ``` ## TODO diff --git a/pom.xml b/pom.xml index e06ab3e..1e7f84e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.3-beta + 1.4-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/commands/Helper.java b/src/main/java/cn/lunadeer/dominion/commands/Helper.java index dd4131b..c8b799e 100644 --- a/src/main/java/cn/lunadeer/dominion/commands/Helper.java +++ b/src/main/java/cn/lunadeer/dominion/commands/Helper.java @@ -2,6 +2,7 @@ package cn.lunadeer.dominion.commands; import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.dtos.DominionDTO; +import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -53,14 +54,28 @@ public class Helper { "vehicle_destroy"); } + /** + * 获取玩家可管理的领地列表 + * + * @param sender 命令发送者 + * @return 领地列表 + */ public static List playerDominions(CommandSender sender) { List dominions_name = new ArrayList<>(); Player player = playerOnly(sender); if (player == null) return dominions_name; - List dominions = DominionController.all(player); - for (DominionDTO dominion : dominions) { + List dominions_own = DominionController.all(player); + List dominions_admin = PlayerPrivilegeDTO.selectAll(player.getUniqueId()); + for (DominionDTO dominion : dominions_own) { dominions_name.add(dominion.getName()); } + for (PlayerPrivilegeDTO privilege : dominions_admin) { + if (privilege.getAdmin()) { + DominionDTO dom = DominionDTO.select(privilege.getDomID()); + if (dom == null) continue; + dominions_name.add(dom.getName()); + } + } return dominions_name; } diff --git a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java index e6038f9..a1d9675 100644 --- a/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java +++ b/src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java @@ -4,6 +4,7 @@ import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.utils.Notification; +import org.bukkit.entity.NPC; import org.bukkit.entity.Player; import java.util.UUID; @@ -99,6 +100,13 @@ public class PrivilegeController { if (privilege == null) return false; } switch (flag) { + case "admin": + if (notOwner(operator, dominion)) { + Notification.error(operator, "你不是领地 " + dominionName + " 的拥有者,无法设置其他玩家为管理员"); + return false; + } + privilege.setAdmin(value); + break; case "anchor": privilege.setAnchor(value); break; @@ -231,6 +239,10 @@ public class PrivilegeController { } private static PlayerPrivilegeDTO createPlayerPrivilege(Player operator, UUID player, DominionDTO dom) { + if (operator.getUniqueId() == player) { + Notification.error(operator, "你不能给自己设置特权"); + return null; + } PlayerPrivilegeDTO privilege = new PlayerPrivilegeDTO(player, dom.getId(), dom.getAnchor(), dom.getAnimalKilling(), dom.getAnvil(), dom.getBeacon(), dom.getBed(), dom.getBrew(), dom.getBreak(), dom.getButton(), diff --git a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java index 7d23ef4..66d41df 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/PlayerPrivilegeDTO.java @@ -77,6 +77,11 @@ public class PlayerPrivilegeDTO { return query(sql); } + public static List selectAll(UUID player) { + String sql = "SELECT * FROM player_privilege WHERE player_uuid = '" + player + "';"; + return query(sql); + } + private final Integer id; private final UUID playerUUID; private Boolean admin; diff --git a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java index b24fa74..4d14b72 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/PrivilegeInfo.java @@ -53,6 +53,15 @@ public class PrivilegeInfo { .append(Button.create("特权列表", "/dominion privilege_list " + dominion.getName())) .append("特权信息") ); + if (privilege.getAdmin()) { + view.add(Line.create() + .append(Button.createGreen("☑", "/dominion set_privilege " + playerName + " admin false " + dominion.getName() + " " + page)) + .append("管理员")); + } else { + view.add(Line.create() + .append(Button.createRed("☐", "/dominion set_privilege " + playerName + " admin true " + dominion.getName() + " " + page)) + .append("管理员")); + } if (privilege.getAnchor()) { view.add(Line.create() .append(Button.createGreen("☑", "/dominion set_privilege " + playerName + " anchor false " + dominion.getName() + " " + page)) diff --git a/src/main/java/cn/lunadeer/dominion/tuis/SelectPlayer.java b/src/main/java/cn/lunadeer/dominion/tuis/SelectPlayer.java index f2650a3..15d5636 100644 --- a/src/main/java/cn/lunadeer/dominion/tuis/SelectPlayer.java +++ b/src/main/java/cn/lunadeer/dominion/tuis/SelectPlayer.java @@ -16,6 +16,7 @@ public class SelectPlayer { // /dominion select_player_create_privilege <领地名称> [页码] public static void show(CommandSender sender, String[] args) { Player player = playerOnly(sender); + if (player == null) return; int page = 1; if (args.length == 3) { try { @@ -28,6 +29,9 @@ public class SelectPlayer { view.title("选择玩家以创建特权").subtitle("只能选择已经登录过的玩家"); List players = PlayerController.allPlayers(); for (PlayerDTO p : players) { + if (p.getUuid() == player.getUniqueId()) { + continue; + } view.add(Line.create(). append(Button.create(p.getLastKnownName(), "/dominion create_privilege " + p.getLastKnownName() + " " + dominion_name + " b")));