新增重命名与转让领地指令以及功能
Java CI-CD with Maven / build (push) Failing after 25m13s Details

This commit is contained in:
zhangyuheng 2024-02-23 11:19:31 +08:00
parent b797140d30
commit 4f667d58d4
7 changed files with 201 additions and 40 deletions

View File

@ -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 <权限名称> <true/false> [领地名称]` |
| 创建玩家特权 | `/dominion create_privilege <玩家名称> [领地名称]` |
| 设置玩家特权 | `/dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]` |
| 重置玩家特权 | `/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 <权限名称> <true/false> [领地名称]` |
| 创建玩家特权 | `/dominion create_privilege <玩家名称> [领地名称]` |
| 设置玩家特权 | `/dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]` |
| 重置玩家特权 | `/dominion clear_privilege <玩家名称> [领地名称]` |
| 查看领地玩家特权列表 | `/dominion privilege_list [领地名称] [页码]` |
| 查看玩家特权信息 | `/dominion privilege_info <玩家名称> [领地名称] [页码]` |
### 管理员指令
@ -164,7 +169,7 @@ MaxZ: 128
AutoClean:
Enabled: false
AfterDays: 180
BlueMap: true
Debug: false

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId>
<version>1.7.0-beta</version>
<version>1.8.0-beta</version>
<packaging>jar</packaging>
<name>Dominion</name>

View File

@ -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) {

View File

@ -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 <领地名称> <玩家名称>");
}
}

View File

@ -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<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId());
List<DominionDTO> 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<DominionDTO> 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<DominionDTO> getSubDominionsRecursive(DominionDTO dominion) {
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId());
List<DominionDTO> 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;
}
}

View File

@ -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;
}

View File

@ -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 <权限名称> <true/false> [领地名称]"))
.add(Line.create().append("创建玩家特权").append("/dominion create_privilege <玩家名称> [领地名称]"))
.add(Line.create().append("设置玩家特权").append("/dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]"))
.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);
}