Merge branch 'abstractOperatprImpl'
All checks were successful
Java CI-CD with Maven / build (push) Successful in 6m40s

# Conflicts:
#	pom.xml
This commit is contained in:
zhangyuheng 2024-05-29 16:54:26 +08:00
commit 7a2842333f
16 changed files with 532 additions and 378 deletions

View File

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

View File

@ -250,6 +250,11 @@ public class Cache {
return player_uuid_to_privilege.get(player.getUniqueId()).get(dominion.getId()); return player_uuid_to_privilege.get(player.getUniqueId()).get(dominion.getId());
} }
public PlayerPrivilegeDTO getPlayerPrivilege(UUID player_uuid, DominionDTO dominion) {
if (!player_uuid_to_privilege.containsKey(player_uuid)) return null;
return player_uuid_to_privilege.get(player_uuid).get(dominion.getId());
}
private static boolean isInDominion(@Nullable DominionDTO dominion, Player player) { private static boolean isInDominion(@Nullable DominionDTO dominion, Player player) {
if (dominion == null) return false; if (dominion == null) return false;
if (!Objects.equals(dominion.getWorld(), player.getWorld().getName())) return false; if (!Objects.equals(dominion.getWorld(), player.getWorld().getName())) return false;
@ -265,8 +270,7 @@ public class Cache {
return id_dominions.get(id); return id_dominions.get(id);
} }
public int getPlayerDominionCount(Player player) { public int getPlayerDominionCount(UUID player_uuid) {
UUID player_uuid = player.getUniqueId();
int count = 0; int count = 0;
for (DominionDTO dominion : id_dominions.values()) { for (DominionDTO dominion : id_dominions.values()) {
if (dominion.getOwner().equals(player_uuid)) { if (dominion.getOwner().equals(player_uuid)) {

View File

@ -49,7 +49,7 @@ public class DominionNode {
return dominionNode == null ? null : dominionNode.dominion; return dominionNode == null ? null : dominionNode.dominion;
} }
private static boolean isInDominion(@Nullable DominionDTO dominion, Location location) { public static boolean isInDominion(@Nullable DominionDTO dominion, Location location) {
if (dominion == null) return false; if (dominion == null) return false;
if (!Objects.equals(dominion.getWorld(), location.getWorld().getName())) return false; if (!Objects.equals(dominion.getWorld(), location.getWorld().getName())) return false;
double x = location.getX(); double x = location.getX();

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.commands; package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.FlagsController; import cn.lunadeer.dominion.controllers.FlagsController;
import cn.lunadeer.dominion.tuis.DominionFlagInfo; import cn.lunadeer.dominion.tuis.DominionFlagInfo;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
@ -20,29 +21,21 @@ public class DominionFlag {
public static void setDominionFlag(CommandSender sender, String[] args) { public static void setDominionFlag(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 3) { if (args.length == 3) {
if (FlagsController.setFlag(player, args[1], Boolean.parseBoolean(args[2])) == null) { FlagsController.setFlag(operator, args[1], Boolean.parseBoolean(args[2]));
Notification.error(sender, "设置领地权限失败");
}
} else if (args.length == 4) { } else if (args.length == 4) {
if (FlagsController.setFlag(player, args[1], Boolean.parseBoolean(args[2]), args[3]) == null) { FlagsController.setFlag(operator, args[1], Boolean.parseBoolean(args[2]), args[3]);
Notification.error(sender, "设置领地权限失败");
}
} else if (args.length == 5) { } else if (args.length == 5) {
if (FlagsController.setFlag(player, args[1], Boolean.parseBoolean(args[2]), args[3]) == null) { FlagsController.setFlag(operator, args[1], Boolean.parseBoolean(args[2]), args[3]);
Notification.error(sender, "设置领地权限失败");
}
String[] newArgs = new String[3]; String[] newArgs = new String[3];
newArgs[0] = "flag_info"; newArgs[0] = "flag_info";
newArgs[1] = args[3]; newArgs[1] = args[3];
newArgs[2] = args[4]; newArgs[2] = args[4];
DominionFlagInfo.show(sender, newArgs); DominionFlagInfo.show(sender, newArgs);
return;
} else { } else {
Notification.error(sender, "用法: /dominion set <权限名称> <true/false> [领地名称]"); Notification.error(sender, "用法: /dominion set <权限名称> <true/false> [领地名称]");
return;
} }
Notification.info(sender, "设置领地权限 %s 为 %s", args[1], args[2]);
} }
} }

View File

@ -2,6 +2,8 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
@ -17,6 +19,7 @@ import org.bukkit.entity.Player;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.*; import static cn.lunadeer.dominion.commands.Apis.*;
@ -41,11 +44,8 @@ public class DominionOperate {
return; return;
} }
String name = args[1]; String name = args[1];
if (DominionController.create(player, name, points.get(0), points.get(1)) == null) { BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
Notification.error(sender, "创建领地失败"); DominionController.create(operator, name, points.get(0), points.get(1));
return;
}
Notification.info(sender, "成功创建: %s", name);
} }
/** /**
@ -67,18 +67,12 @@ public class DominionOperate {
Notification.error(sender, "请先使用工具选择子领地的对角线两点,或使用 /dominion auto_create_sub <子领地名称> [父领地名称] 创建自动子领地"); Notification.error(sender, "请先使用工具选择子领地的对角线两点,或使用 /dominion auto_create_sub <子领地名称> [父领地名称] 创建自动子领地");
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 2) { if (args.length == 2) {
if (DominionController.create(player, args[1], points.get(0), points.get(1)) != null) { DominionController.create(operator, args[1], points.get(0), points.get(1));
Notification.info(sender, "成功创建子领地: %s", args[1]);
return;
}
} else { } else {
if (DominionController.create(player, args[1], points.get(0), points.get(1), args[2]) != null) { DominionController.create(operator, args[1], points.get(0), points.get(1), args[2]);
Notification.info(sender, "成功创建子领地: %s", args[1]);
return;
}
} }
Notification.error(sender, "创建子领地失败");
} }
/** /**
@ -156,17 +150,11 @@ public class DominionOperate {
if (args.length == 3) { if (args.length == 3) {
name = args[2]; name = args[2];
} }
DominionDTO dominionDTO; BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (name.isEmpty()) { if (name.isEmpty()) {
dominionDTO = DominionController.expand(player, size); DominionController.expand(operator, size);
} else { } else {
dominionDTO = DominionController.expand(player, size, name); DominionController.expand(operator, size, name);
}
if (dominionDTO == null) {
Notification.error(sender, "扩展领地失败");
} else {
Notification.info(sender, "成功扩展领地: %s %d", dominionDTO.getName(), size);
sizeInfo(sender, dominionDTO);
} }
} }
@ -199,17 +187,11 @@ public class DominionOperate {
if (args.length == 3) { if (args.length == 3) {
name = args[2]; name = args[2];
} }
DominionDTO dominionDTO; BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (name.isEmpty()) { if (name.isEmpty()) {
dominionDTO = DominionController.contract(player, size); DominionController.contract(operator, size);
} else { } else {
dominionDTO = DominionController.contract(player, size, name); DominionController.contract(operator, size, name);
}
if (dominionDTO == null) {
Notification.error(sender, "缩小领地失败");
} else {
Notification.info(sender, "成功缩小领地: %s %d", dominionDTO.getName(), size);
sizeInfo(sender, dominionDTO);
} }
} }
@ -223,15 +205,16 @@ public class DominionOperate {
public static void deleteDominion(CommandSender sender, String[] args) { public static void deleteDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 2) { if (args.length == 2) {
String name = args[1]; String name = args[1];
DominionController.delete(player, name, false); DominionController.delete(operator, name, false);
return; return;
} }
if (args.length == 3) { if (args.length == 3) {
String name = args[1]; String name = args[1];
if (args[2].equals("force")) { if (args[2].equals("force")) {
DominionController.delete(player, name, true); DominionController.delete(operator, name, true);
return; return;
} }
} }
@ -248,12 +231,13 @@ public class DominionOperate {
public static void setEnterMessage(CommandSender sender, String[] args) { public static void setEnterMessage(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 2) { if (args.length == 2) {
DominionController.setJoinMessage(player, args[1]); DominionController.setJoinMessage(operator, args[1]);
return; return;
} }
if (args.length == 3) { if (args.length == 3) {
DominionController.setJoinMessage(player, args[1], args[2]); DominionController.setJoinMessage(operator, args[1], args[2]);
return; return;
} }
Notification.error(sender, "用法: /dominion set_enter_msg <提示语> [领地名称]"); Notification.error(sender, "用法: /dominion set_enter_msg <提示语> [领地名称]");
@ -269,12 +253,13 @@ public class DominionOperate {
public static void setLeaveMessage(CommandSender sender, String[] args) { public static void setLeaveMessage(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 2) { if (args.length == 2) {
DominionController.setLeaveMessage(player, args[1]); DominionController.setLeaveMessage(operator, args[1]);
return; return;
} }
if (args.length == 3) { if (args.length == 3) {
DominionController.setLeaveMessage(player, args[1], args[2]); DominionController.setLeaveMessage(operator, args[1], args[2]);
return; return;
} }
Notification.error(sender, "用法: /dominion set_leave_msg <提示语> [领地名称]"); Notification.error(sender, "用法: /dominion set_leave_msg <提示语> [领地名称]");
@ -290,12 +275,16 @@ public class DominionOperate {
public static void setTpLocation(CommandSender sender, String[] args) { public static void setTpLocation(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 1) { if (args.length == 1) {
DominionController.setTpLocation(player); DominionController.setTpLocation(operator,
player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ());
return; return;
} }
if (args.length == 2) { if (args.length == 2) {
DominionController.setTpLocation(player, args[1]); DominionController.setTpLocation(operator,
player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ(),
args[1]);
return; return;
} }
Notification.error(sender, "用法: /dominion set_tp_location [领地名称]"); Notification.error(sender, "用法: /dominion set_tp_location [领地名称]");
@ -311,11 +300,12 @@ public class DominionOperate {
public static void renameDominion(CommandSender sender, String[] args) { public static void renameDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length != 3) { if (args.length != 3) {
Notification.error(sender, "用法: /dominion rename <原领地名称> <新领地名称>"); Notification.error(sender, "用法: /dominion rename <原领地名称> <新领地名称>");
return; return;
} }
DominionController.rename(player, args[1], args[2]); DominionController.rename(operator, args[1], args[2]);
} }
/** /**
@ -328,17 +318,18 @@ public class DominionOperate {
public static void giveDominion(CommandSender sender, String[] args) { public static void giveDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 3) { if (args.length == 3) {
String dom_name = args[1]; String dom_name = args[1];
String player_name = args[2]; String player_name = args[2];
DominionController.give(player, dom_name, player_name, false); DominionController.give(operator, dom_name, player_name, false);
return; return;
} }
if (args.length == 4) { if (args.length == 4) {
String dom_name = args[1]; String dom_name = args[1];
String player_name = args[2]; String player_name = args[2];
if (args[3].equals("force")) { if (args[3].equals("force")) {
DominionController.give(player, dom_name, player_name, true); DominionController.give(operator, dom_name, player_name, true);
return; return;
} }
} }

View File

@ -1,6 +1,8 @@
package cn.lunadeer.dominion.commands; package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.controllers.PrivilegeController; import cn.lunadeer.dominion.controllers.PrivilegeController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
@ -15,6 +17,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.autoPoints; import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.commands.Apis.playerOnly;
@ -32,7 +35,8 @@ public class OpenCUI {
@Override @Override
public void handleData(String input) { public void handleData(String input) {
XLogger.debug("renameDominionCB.run: %s", input); XLogger.debug("renameDominionCB.run: %s", input);
DominionController.rename(sender, oldName, input); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.rename(operator, oldName, input);
DominionManage.show(sender, new String[]{"manage", input}); DominionManage.show(sender, new String[]{"manage", input});
} }
} }
@ -49,7 +53,8 @@ public class OpenCUI {
@Override @Override
public void handleData(String input) { public void handleData(String input) {
XLogger.debug("editJoinMessageCB.run: %s", input); XLogger.debug("editJoinMessageCB.run: %s", input);
DominionController.setJoinMessage(sender, input, dominionName); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setJoinMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName}); DominionManage.show(sender, new String[]{"manage", dominionName});
} }
} }
@ -66,7 +71,8 @@ public class OpenCUI {
@Override @Override
public void handleData(String input) { public void handleData(String input) {
XLogger.debug("editLeaveMessageCB.run: %s", input); XLogger.debug("editLeaveMessageCB.run: %s", input);
DominionController.setLeaveMessage(sender, input, dominionName); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setLeaveMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName}); DominionManage.show(sender, new String[]{"manage", dominionName});
} }
} }
@ -82,17 +88,18 @@ public class OpenCUI {
public void handleData(String input) { public void handleData(String input) {
XLogger.debug("createDominionCB.run: %s", input); XLogger.debug("createDominionCB.run: %s", input);
autoPoints(sender); autoPoints(sender);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
Map<Integer, Location> points = Dominion.pointsSelect.get(sender.getUniqueId()); Map<Integer, Location> points = Dominion.pointsSelect.get(sender.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) { if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "自动选点失败"); Notification.error(sender, "自动选点失败");
return; return;
} }
if (DominionController.create(sender, input, points.get(0), points.get(1)) != null) { operator.getResponse().thenAccept(result -> {
Notification.info(sender, "成功创建: %s", input); if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){
DominionManage.show(sender, new String[]{"list"}); DominionManage.show(sender, new String[]{"list"});
} else { }
Notification.error(sender, "创建领地失败"); });
} DominionController.create(operator, input, points.get(0), points.get(1));
} }
} }
@ -108,11 +115,15 @@ public class OpenCUI {
@Override @Override
public void handleData(String input) { public void handleData(String input) {
XLogger.debug("createPrivilegeCB.run: %s", input); XLogger.debug("createPrivilegeCB.run: %s", input);
if (PrivilegeController.createPrivilege(sender, input, dominionName)) { BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionPrivilegeList.show(sender, new String[]{"privilege_list", dominionName}); PrivilegeController.createPrivilege(operator, input, dominionName);
} else { operator.getResponse().thenAccept(result -> {
SelectPlayer.show(sender, new String[]{"select_player_create_privilege", dominionName}); if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){
} DominionPrivilegeList.show(sender, new String[]{"privilege_list", dominionName});
} else {
SelectPlayer.show(sender, new String[]{"select_player_create_privilege", dominionName});
}
});
} }
} }

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.commands; package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.tuis.DominionPrivilegeList; import cn.lunadeer.dominion.tuis.DominionPrivilegeList;
import cn.lunadeer.dominion.tuis.PrivilegeInfo; import cn.lunadeer.dominion.tuis.PrivilegeInfo;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
@ -21,22 +22,16 @@ public class PlayerPrivilege {
public static void createPlayerPrivilege(CommandSender sender, String[] args) { public static void createPlayerPrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length != 2 && args.length != 3 && args.length != 4) { if (args.length != 2 && args.length != 3 && args.length != 4) {
Notification.error(sender, "用法: /dominion create_privilege <玩家名称> [领地名称]"); Notification.error(sender, "用法: /dominion create_privilege <玩家名称> [领地名称]");
return; return;
} }
if (args.length == 2) { if (args.length == 2) {
if (!createPrivilege(player, args[1])) { createPrivilege(operator, args[1]);
Notification.error(sender, "创建玩家特权失败");
return;
}
} else { } else {
if (!createPrivilege(player, args[1], args[2])) { createPrivilege(operator, args[1], args[2]);
Notification.error(sender, "创建玩家特权失败");
return;
}
} }
Notification.info(sender, "成功创建玩家特权 %s", args[1]);
if (args.length == 4) { if (args.length == 4) {
String[] newArgs = new String[2]; String[] newArgs = new String[2];
newArgs[0] = "privilege_list"; newArgs[0] = "privilege_list";
@ -55,34 +50,22 @@ public class PlayerPrivilege {
public static void setPlayerPrivilege(CommandSender sender, String[] args) { public static void setPlayerPrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 4) { if (args.length == 4) {
if (!setPrivilege(player, args[1], args[2], Boolean.parseBoolean(args[3]))) { setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]));
Notification.error(sender, "设置玩家权限失败");
return;
}
} else if (args.length == 5) { } else if (args.length == 5) {
if (!setPrivilege(player, args[1], args[2], Boolean.parseBoolean(args[3]), args[4])) { setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]), args[4]);
Notification.error(sender, "设置玩家权限失败");
return;
}
} else if (args.length == 6) { } else if (args.length == 6) {
if (!setPrivilege(player, args[1], args[2], Boolean.parseBoolean(args[3]), args[4])) { setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]), args[4]);
Notification.error(sender, "设置玩家权限失败");
return;
}
String[] newArgs = new String[4]; String[] newArgs = new String[4];
newArgs[0] = "privilege_info"; newArgs[0] = "privilege_info";
newArgs[1] = args[1]; newArgs[1] = args[1];
newArgs[2] = args[4]; newArgs[2] = args[4];
newArgs[3] = args[5]; newArgs[3] = args[5];
PrivilegeInfo.show(sender, newArgs); PrivilegeInfo.show(sender, newArgs);
return;
} else { } else {
Notification.error(sender, "用法: /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]"); Notification.error(sender, "用法: /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]");
return;
} }
Notification.info(sender, "设置玩家的 %s 权限为 %s", args[2], args[3]);
} }
/** /**
@ -95,22 +78,16 @@ public class PlayerPrivilege {
public static void clearPlayerPrivilege(CommandSender sender, String[] args) { public static void clearPlayerPrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length != 2 && args.length != 3 && args.length != 4) { if (args.length != 2 && args.length != 3 && args.length != 4) {
Notification.error(sender, "用法: /dominion clear_privilege <玩家名称> [领地名称]"); Notification.error(sender, "用法: /dominion clear_privilege <玩家名称> [领地名称]");
return; return;
} }
if (args.length == 2) { if (args.length == 2) {
if (!clearPrivilege(player, args[1])) { clearPrivilege(operator, args[1]);
Notification.error(sender, "重置玩家权限失败");
return;
}
} else { } else {
if (!clearPrivilege(player, args[1], args[2])) { clearPrivilege(operator, args[1], args[2]);
Notification.error(sender, "重置玩家权限失败");
return;
}
} }
Notification.info(sender, "成功清除玩家 %s 的权限", args[1]);
if (args.length == 4) { if (args.length == 4) {
String[] newArgs = new String[3]; String[] newArgs = new String[3];
newArgs[0] = "privilege_list"; newArgs[0] = "privilege_list";

View File

@ -0,0 +1,59 @@
package cn.lunadeer.dominion.controllers;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public interface AbstractOperator {
public static class Result {
public static final Integer SUCCESS = 0;
public static final Integer WARNING = 1;
public static final Integer FAILURE = 2;
private Integer success;
private String message;
public Result(Integer success, String message, Object... args) {
this.success = success;
this.message = String.format(message, args);
}
public Result setMessage(String message, Object... args) {
this.message = String.format(message, args);
return this;
}
public Result appendMessage(String message, Object... args) {
this.message += " ";
this.message += String.format(message, args);
return this;
}
public Integer getStatus() {
return success;
}
public String getMessage() {
return message;
}
}
public UUID getUniqueId();
public boolean isOp();
public void setResponse(Result result);
public @Nullable Location getLocation();
public Player getPlayer();
public BlockFace getDirection();
public CompletableFuture<Result> getResponse();
}

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.controllers; package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
@ -11,19 +12,17 @@ import java.util.List;
public class Apis { public class Apis {
public static boolean notOwner(Player player, DominionDTO dominion) { public static boolean notOwner(AbstractOperator player, DominionDTO dominion) {
if (player.isOp()) return false; if (player.isOp()) return false;
if (dominion.getOwner().equals(player.getUniqueId())) return false; return !dominion.getOwner().equals(player.getUniqueId());
Notification.error(player, "你不是领地 %s 的拥有者,无法执行此操作", dominion.getName());
return true;
} }
public static boolean noAuthToChangeFlags(Player player, DominionDTO dominion) { public static boolean noAuthToChangeFlags(AbstractOperator player, DominionDTO dominion) {
if (player.isOp()) return false; if (player.isOp()) return false;
if (!dominion.getOwner().equals(player.getUniqueId())) { if (!dominion.getOwner().equals(player.getUniqueId())) {
PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId()); PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) { if (privileges == null || !privileges.getAdmin()) {
Notification.error(player, "你不是领地 %s 的拥有者或管理员,无权修改权限", dominion.getName()); player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不是领地 %s 的拥有者或管理员,无权修改权限", dominion.getName()));
return true; return true;
} }
} }
@ -37,40 +36,19 @@ public class Apis {
* @param player 玩家 * @param player 玩家
* @return 当前所在的领地 * @return 当前所在的领地
*/ */
public static DominionDTO getPlayerCurrentDominion(Player player, boolean show_warning) { public static DominionDTO getPlayerCurrentDominion(AbstractOperator player) {
Location location = player.getLocation(); Location location = player.getLocation();
List<DominionDTO> dominions = DominionDTO.selectByLocation(location.getWorld().getName(), if (location == null) {
(int) location.getX(), (int) location.getY(), (int) location.getZ()); player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "无法获取你的位置信息"));
if (dominions.size() != 1) {
if (show_warning) {
Notification.error(player, "你不在一个领地内或在子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称");
}
return null; return null;
} }
return dominions.get(0); DominionDTO dominion = Cache.instance.getDominion(location);
} if (dominion == null || dominion.getParentDomId() != -1) {
return dominion;
public static DominionDTO getPlayerCurrentDominion(Player player) {
return getPlayerCurrentDominion(player, true);
}
public static BlockFace getFace(Player player) {
float yaw = player.getYaw();
float pitch = player.getPitch();
if (pitch > -45 && pitch < 45) {
if (yaw > -45 && yaw < 45) {
return BlockFace.SOUTH;
} else if (yaw > 135 || yaw < -135) {
return BlockFace.NORTH;
} else if (yaw > 45 && yaw < 135) {
return BlockFace.WEST;
} else {
return BlockFace.EAST;
}
} else if (pitch > 45) {
return BlockFace.DOWN;
} else { } else {
return BlockFace.UP; player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你当前在子领地内,请指定要操作的领地名称"));
return null;
} }
} }
} }

View File

@ -0,0 +1,85 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public class BukkitPlayerOperator implements AbstractOperator {
private final org.bukkit.entity.Player player;
private final CompletableFuture<Result> response = new CompletableFuture<>();
public BukkitPlayerOperator(org.bukkit.entity.Player player) {
this.player = player;
}
@Override
public UUID getUniqueId() {
return player.getUniqueId();
}
@Override
public boolean isOp() {
return player.isOp();
}
@Override
public void setResponse(Result result) {
response.complete(result);
}
@Override
public Location getLocation() {
return player.getLocation();
}
@Override
public Player getPlayer() {
return player;
}
@Override
public BlockFace getDirection() {
float yaw = player.getYaw();
float pitch = player.getPitch();
if (pitch > -45 && pitch < 45) {
if (yaw > -45 && yaw < 45) {
return BlockFace.SOUTH;
} else if (yaw > 135 || yaw < -135) {
return BlockFace.NORTH;
} else if (yaw > 45 && yaw < 135) {
return BlockFace.WEST;
} else {
return BlockFace.EAST;
}
} else if (pitch > 45) {
return BlockFace.DOWN;
} else {
return BlockFace.UP;
}
}
@Override
public CompletableFuture<Result> getResponse() {
return response;
}
public static BukkitPlayerOperator create(org.bukkit.entity.Player player) {
BukkitPlayerOperator operator = new BukkitPlayerOperator(player);
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.SUCCESS)) {
Notification.info(player, result.getMessage());
} else if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.WARNING)) {
Notification.warn(player, result.getMessage());
} else {
Notification.error(player, result.getMessage());
}
});
return operator;
}
}

View File

@ -2,13 +2,15 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.DominionNode;
import cn.lunadeer.dominion.commands.OpenCUI;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.utils.Time;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.ParticleRender; import cn.lunadeer.minecraftpluginutils.ParticleRender;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -16,6 +18,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
import static cn.lunadeer.dominion.controllers.Apis.*; import static cn.lunadeer.dominion.controllers.Apis.*;
public class DominionController { public class DominionController {
@ -31,69 +34,68 @@ public class DominionController {
/** /**
* 创建领地 * 创建领地
* *
* @param owner 拥有者 * @param operator 拥有者
* @param name 领地名称 * @param name 领地名称
* @param loc1 位置1 * @param loc1 位置1
* @param loc2 位置2 * @param loc2 位置2
* @return 创建的领地 * @return 创建的领地
*/ */
public static DominionDTO create(Player owner, String name, Location loc1, Location loc2) { public static void create(AbstractOperator operator, String name, Location loc1, Location loc2) {
DominionDTO parent = getPlayerCurrentDominion(owner, false); DominionDTO parent = getPlayerCurrentDominion(operator);
if (parent == null) { if (parent == null) {
return create(owner, name, loc1, loc2, ""); create(operator, name, loc1, loc2, "");
} else { } else {
return create(owner, name, loc1, loc2, parent.getName()); create(operator, name, loc1, loc2, parent.getName());
} }
} }
/** /**
* 创建子领地 * 创建子领地
* *
* @param owner 拥有者 * @param operator 拥有者
* @param name 领地名称 * @param name 领地名称
* @param loc1 位置1 * @param loc1 位置1
* @param loc2 位置2 * @param loc2 位置2
* @param parent_dominion_name 父领地名称 * @param parent_dominion_name 父领地名称
* @return 创建的领地 * @return 创建的领地
*/ */
public static DominionDTO create(Player owner, String name, public static void create(AbstractOperator operator, String name,
Location loc1, Location loc2, Location loc1, Location loc2,
String parent_dominion_name) { String parent_dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建领地失败");
if (name.isEmpty()) { if (name.isEmpty()) {
Notification.error(owner, "领地名称不能为空"); operator.setResponse(FAIL.appendMessage("领地名称不能为空"));
return null; return;
} }
if (name.contains(" ")) { if (name.contains(" ")) {
Notification.error(owner, "领地名称不能包含空格"); operator.setResponse(FAIL.appendMessage("领地名称不能包含空格"));
return null; return;
} }
if (DominionDTO.select(name) != null) { if (DominionDTO.select(name) != null) {
Notification.error(owner, "已经存在名称为 %s 的领地", name); operator.setResponse(FAIL.appendMessage("已经存在名称为 %s 的领地", name));
return null; return;
} }
if (!loc1.getWorld().equals(loc2.getWorld())) { if (!loc1.getWorld().equals(loc2.getWorld())) {
Notification.error(owner, "禁止跨世界操作"); operator.setResponse(FAIL.appendMessage("选点世界不一致"));
return null; return;
}
if (!owner.getWorld().equals(loc1.getWorld())) {
Notification.error(owner, "禁止跨世界操作");
return null;
} }
// 检查世界是否可以创建 // 检查世界是否可以创建
if (worldNotValid(owner)) { if (worldNotValid(operator, loc1.getWorld().getName())) {
return null; operator.setResponse(FAIL.appendMessage("禁止在世界 %s 创建领地", loc1.getWorld().getName()));
return;
} }
// 检查领地数量是否达到上限 // 检查领地数量是否达到上限
if (amountNotValid(owner)) { if (amountNotValid(operator)) {
return null; operator.setResponse(FAIL.appendMessage("你的领地数量已达上限(%d个)", Dominion.config.getLimitAmount()));
return;
} }
// 检查领地大小是否合法 // 检查领地大小是否合法
if (sizeNotValid(owner, if (sizeNotValid(operator,
loc1.getBlockX(), loc1.getBlockY(), loc1.getBlockZ(), loc1.getBlockX(), loc1.getBlockY(), loc1.getBlockZ(),
loc2.getBlockX(), loc2.getBlockY(), loc2.getBlockZ())) { loc2.getBlockX(), loc2.getBlockY(), loc2.getBlockZ())) {
return null; return;
} }
DominionDTO dominion = new DominionDTO(owner.getUniqueId(), name, owner.getWorld().getName(), DominionDTO dominion = new DominionDTO(operator.getUniqueId(), name, loc1.getWorld().getName(),
(int) Math.min(loc1.getX(), loc2.getX()), (int) Math.min(loc1.getY(), loc2.getY()), (int) Math.min(loc1.getX(), loc2.getX()), (int) Math.min(loc1.getY(), loc2.getY()),
(int) Math.min(loc1.getZ(), loc2.getZ()), (int) Math.max(loc1.getX(), loc2.getX()), (int) Math.min(loc1.getZ(), loc2.getZ()), (int) Math.max(loc1.getX(), loc2.getX()),
(int) Math.max(loc1.getY(), loc2.getY()), (int) Math.max(loc1.getZ(), loc2.getZ())); (int) Math.max(loc1.getY(), loc2.getY()), (int) Math.max(loc1.getZ(), loc2.getZ()));
@ -104,39 +106,40 @@ public class DominionController {
parent_dominion = DominionDTO.select(parent_dominion_name); parent_dominion = DominionDTO.select(parent_dominion_name);
} }
if (parent_dominion == null) { if (parent_dominion == null) {
Notification.error(owner, "父领地 %s 不存在", parent_dominion_name); operator.setResponse(FAIL.appendMessage("父领地 %s 不存在", parent_dominion_name));
if (parent_dominion_name.isEmpty()) { if (parent_dominion_name.isEmpty()) {
XLogger.err("根领地丢失!"); XLogger.err("根领地丢失!");
} }
return null; return;
} }
// 是否是父领地的拥有者 // 是否是父领地的拥有者
if (parent_dominion.getId() != -1) { if (parent_dominion.getId() != -1) {
if (notOwner(owner, parent_dominion)) { if (notOwner(operator, parent_dominion)) {
return null; operator.setResponse(FAIL.appendMessage("你不是父领地 %s 的拥有者,无法创建子领地", parent_dominion_name));
return;
} }
} }
// 如果parent_dominion不为-1 检查是否在同一世界 // 如果parent_dominion不为-1 检查是否在同一世界
if (parent_dominion.getId() != -1 && !parent_dominion.getWorld().equals(dominion.getWorld())) { if (parent_dominion.getId() != -1 && !parent_dominion.getWorld().equals(dominion.getWorld())) {
Notification.error(owner, "禁止跨世界操作"); operator.setResponse(FAIL.appendMessage("父领地与子领地不在同一世界。"));
return null; return;
} }
// 检查深度是否达到上限 // 检查深度是否达到上限
if (depthNotValid(owner, parent_dominion)) { if (depthNotValid(operator, parent_dominion)) {
return null; return;
} }
// 检查是否超出父领地范围 // 检查是否超出父领地范围
if (!isContained(dominion, parent_dominion)) { if (!isContained(dominion, parent_dominion)) {
Notification.error(owner, "超出父领地 %s 范围", parent_dominion.getName()); operator.setResponse(FAIL.appendMessage("超出父领地 %s 范围", parent_dominion.getName()));
return null; return;
} }
// 获取此领地的所有同级领地 // 获取此领地的所有同级领地
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), parent_dominion.getId()); List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), parent_dominion.getId());
// 检查是否与其他子领地冲突 // 检查是否与其他子领地冲突
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
if (isIntersect(sub_dominion, dominion)) { if (isIntersect(sub_dominion, dominion)) {
Notification.error(owner, "与领地 %s 冲突", sub_dominion.getName()); operator.setResponse(FAIL.appendMessage("与领地 %s 冲突", sub_dominion.getName()));
return null; return;
} }
} }
// 检查经济 // 检查经济
@ -148,20 +151,23 @@ public class DominionController {
count = (loc2.getBlockX() - loc1.getBlockX() + 1) * (loc2.getBlockY() - loc1.getBlockY() + 1) * (loc2.getBlockZ() - loc1.getBlockZ() + 1); count = (loc2.getBlockX() - loc1.getBlockX() + 1) * (loc2.getBlockY() - loc1.getBlockY() + 1) * (loc2.getBlockZ() - loc1.getBlockZ() + 1);
} }
float price = count * Dominion.config.getEconomyPrice(); float price = count * Dominion.config.getEconomyPrice();
if (Dominion.vault.getEconomy().getBalance(owner) < price) { if (Dominion.vault.getEconomy().getBalance(operator.getPlayer()) < price) {
Notification.error(owner, "你的余额不足,创建此领地需要 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()); operator.setResponse(FAIL.appendMessage("你的余额不足,创建此领地需要 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()));
return null; return;
} }
Notification.info(owner, "已扣除 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "已扣除 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()));
Dominion.vault.getEconomy().withdrawPlayer(owner, price); Dominion.vault.getEconomy().withdrawPlayer(operator.getPlayer(), price);
} }
dominion = DominionDTO.insert(dominion); dominion = DominionDTO.insert(dominion);
if (dominion == null) { if (dominion == null) {
Notification.error(owner, "创建失败,详细错误请联系管理员查询日志(当前时间:%s", Time.nowStr()); operator.setResponse(FAIL.appendMessage("创建领地失败,数据库错误,请联系管理员"));
return null; return;
} }
ParticleRender.showBoxFace(Dominion.instance, owner, loc1, loc2); if (operator instanceof BukkitPlayerOperator) {
return dominion.setParentDomId(parent_dominion.getId()); ParticleRender.showBoxFace(Dominion.instance, operator.getPlayer(), loc1, loc2);
}
dominion.setParentDomId(parent_dominion.getId());
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功创建领地 %s", name));
} }
/** /**
@ -173,12 +179,13 @@ public class DominionController {
* @param size 扩展的大小 * @param size 扩展的大小
* @return 扩展后的领地 * @return 扩展后的领地
*/ */
public static DominionDTO expand(Player operator, Integer size) { public static void expand(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
return null; operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "无法获取你所处的领地,请指定名称"));
return;
} }
return expand(operator, size, dominion.getName()); expand(operator, size, dominion.getName());
} }
/** /**
@ -189,16 +196,19 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
* @return 扩展后的领地 * @return 扩展后的领地
*/ */
public static DominionDTO expand(Player operator, Integer size, String dominion_name) { public static void expand(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "扩展领地失败");
Location location = operator.getLocation(); Location location = operator.getLocation();
BlockFace face = getFace(operator); BlockFace face = operator.getDirection();
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
return null; return;
} }
if (!location.getWorld().getName().equals(dominion.getWorld())) { if (location != null) {
Notification.error(operator, "禁止跨世界操作"); if (!location.getWorld().getName().equals(dominion.getWorld())) {
return null; operator.setResponse(FAIL.appendMessage("禁止跨世界操作"));
return;
}
} }
Integer x1 = dominion.getX1(); Integer x1 = dominion.getX1();
Integer y1 = dominion.getY1(); Integer y1 = dominion.getY1();
@ -226,21 +236,21 @@ public class DominionController {
y1 -= size; y1 -= size;
break; break;
default: default:
Notification.error(operator, "无效的方向"); operator.setResponse(FAIL.appendMessage("无效的方向"));
return null; return;
} }
if (sizeNotValid(operator, x1, y1, z1, x2, y2, z2)) { if (sizeNotValid(operator, x1, y1, z1, x2, y2, z2)) {
return null; return;
} }
// 校验是否超出父领地范围 // 校验是否超出父领地范围
DominionDTO parent_dominion = DominionDTO.select(dominion.getParentDomId()); DominionDTO parent_dominion = DominionDTO.select(dominion.getParentDomId());
if (parent_dominion == null) { if (parent_dominion == null) {
Notification.error(operator, "父领地丢失"); operator.setResponse(FAIL.appendMessage("父领地丢失"));
return null; return;
} }
if (!isContained(x1, y1, z1, x2, y2, z2, parent_dominion)) { if (!isContained(x1, y1, z1, x2, y2, z2, parent_dominion)) {
Notification.error(operator, "超出父领地 %s 范围", parent_dominion.getName()); operator.setResponse(FAIL.appendMessage("超出父领地 %s 范围", parent_dominion.getName()));
return null; return;
} }
// 获取同世界下的所有同级领地 // 获取同世界下的所有同级领地
List<DominionDTO> exist_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getParentDomId()); List<DominionDTO> exist_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getParentDomId());
@ -248,10 +258,11 @@ public class DominionController {
if (isIntersect(exist_dominion, x1, y1, z1, x2, y2, z2)) { if (isIntersect(exist_dominion, x1, y1, z1, x2, y2, z2)) {
// 如果是自己跳过 // 如果是自己跳过
if (exist_dominion.getId().equals(dominion.getId())) continue; if (exist_dominion.getId().equals(dominion.getId())) continue;
Notification.error(operator, " %s 冲突", exist_dominion.getName()); operator.setResponse(FAIL.appendMessage("与领地 %s 冲突", exist_dominion.getName()));
return null; return;
} }
} }
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功扩展领地 %s %d格", dominion_name, size);
// 检查经济 // 检查经济
if (Dominion.config.getEconomyEnable()) { if (Dominion.config.getEconomyEnable()) {
int count; int count;
@ -261,17 +272,21 @@ public class DominionController {
count = (x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1) - dominion.getVolume(); count = (x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1) - dominion.getVolume();
} }
float price = count * Dominion.config.getEconomyPrice(); float price = count * Dominion.config.getEconomyPrice();
if (Dominion.vault.getEconomy().getBalance(operator) < price) { if (Dominion.vault.getEconomy().getBalance(operator.getPlayer()) < price) {
Notification.error(operator, "你的余额不足,扩展此领地需要 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()); operator.setResponse(FAIL.appendMessage("你的余额不足,扩展此领地需要 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()));
return null; return;
} }
Notification.info(operator, "已扣除 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()); SUCCESS.appendMessage("已扣除 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural());
Dominion.vault.getEconomy().withdrawPlayer(operator, price); Dominion.vault.getEconomy().withdrawPlayer(operator.getPlayer(), price);
} }
ParticleRender.showBoxFace(Dominion.instance, operator, if (operator instanceof BukkitPlayerOperator) {
new Location(location.getWorld(), x1, y1, z1), World world = Dominion.instance.getServer().getWorld(dominion.getWorld());
new Location(location.getWorld(), x2, y2, z2)); ParticleRender.showBoxFace(Dominion.instance, operator.getPlayer(),
return dominion.setXYZ(x1, y1, z1, x2, y2, z2); new Location(world, x1, y1, z1),
new Location(world, x2, y2, z2));
}
dominion.setXYZ(x1, y1, z1, x2, y2, z2);
operator.setResponse(SUCCESS);
} }
/** /**
@ -283,12 +298,13 @@ public class DominionController {
* @param size 缩小的大小 * @param size 缩小的大小
* @return 缩小后的领地 * @return 缩小后的领地
*/ */
public static DominionDTO contract(Player operator, Integer size) { public static void contract(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
return null; operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "无法获取你所处的领地,请指定名称"));
return;
} }
return contract(operator, size, dominion.getName()); contract(operator, size, dominion.getName());
} }
/** /**
@ -299,16 +315,19 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
* @return 缩小后的领地 * @return 缩小后的领地
*/ */
public static DominionDTO contract(Player operator, Integer size, String dominion_name) { public static void contract(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "缩小领地失败");
Location location = operator.getLocation(); Location location = operator.getLocation();
BlockFace face = getFace(operator); BlockFace face = operator.getDirection();
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
return null; return;
} }
if (!location.getWorld().getName().equals(dominion.getWorld())) { if (location != null) {
Notification.error(operator, "禁止跨世界操作"); if (!location.getWorld().getName().equals(dominion.getWorld())) {
return null; operator.setResponse(FAIL.appendMessage("禁止跨世界操作"));
return;
}
} }
Integer x1 = dominion.getX1(); Integer x1 = dominion.getX1();
Integer y1 = dominion.getY1(); Integer y1 = dominion.getY1();
@ -336,25 +355,26 @@ public class DominionController {
y1 += size; y1 += size;
break; break;
default: default:
Notification.error(operator, "无效的方向"); operator.setResponse(FAIL.appendMessage("无效的方向"));
return null; return;
} }
// 校验第二组坐标是否小于第一组坐标 // 校验第二组坐标是否小于第一组坐标
if (x1 >= x2 || y1 >= y2 || z1 >= z2) { if (x1 >= x2 || y1 >= y2 || z1 >= z2) {
Notification.error(operator, "缩小后的领地无效"); operator.setResponse(FAIL.appendMessage("缩小后的领地大小无效"));
return null; return;
} }
if (sizeNotValid(operator, x1, y1, z1, x2, y2, z2)) { if (sizeNotValid(operator, x1, y1, z1, x2, y2, z2)) {
return null; return;
} }
// 获取所有的子领地 // 获取所有的子领地
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId()); List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId());
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
if (!isContained(sub_dominion, x1, y1, z1, x2, y2, z2)) { if (!isContained(sub_dominion, x1, y1, z1, x2, y2, z2)) {
Notification.error(operator, "缩小后的领地 %s 无法包含子领地 %s", dominion_name, sub_dominion.getName()); operator.setResponse(FAIL.appendMessage("缩小后的领地无法包含子领地 %s", sub_dominion.getName()));
return null; return;
} }
} }
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功缩小领地 %s %d格", dominion_name, size);
// 退还经济 // 退还经济
if (Dominion.config.getEconomyEnable()) { if (Dominion.config.getEconomyEnable()) {
int count; int count;
@ -364,13 +384,17 @@ public class DominionController {
count = dominion.getVolume() - (x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1); count = dominion.getVolume() - (x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1);
} }
float refund = count * Dominion.config.getEconomyPrice() * Dominion.config.getEconomyRefund(); float refund = count * Dominion.config.getEconomyPrice() * Dominion.config.getEconomyRefund();
Dominion.vault.getEconomy().depositPlayer(operator, refund); Dominion.vault.getEconomy().depositPlayer(operator.getPlayer(), refund);
Notification.info(operator, "已经退还 %.2f %s", refund, Dominion.vault.getEconomy().currencyNamePlural()); SUCCESS.appendMessage("退还 %.2f %s", refund, Dominion.vault.getEconomy().currencyNamePlural());
} }
ParticleRender.showBoxFace(Dominion.instance, operator, if (operator instanceof BukkitPlayerOperator) {
new Location(location.getWorld(), x1, y1, z1), World world = Dominion.instance.getServer().getWorld(dominion.getWorld());
new Location(location.getWorld(), x2, y2, z2)); ParticleRender.showBoxFace(Dominion.instance, operator.getPlayer(),
return dominion.setXYZ(x1, y1, z1, x2, y2, z2); new Location(world, x1, y1, z1),
new Location(world, x2, y2, z2));
}
dominion.setXYZ(x1, y1, z1, x2, y2, z2);
operator.setResponse(SUCCESS);
} }
/** /**
@ -380,26 +404,30 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
* @param force 是否强制删除 * @param force 是否强制删除
*/ */
public static void delete(Player operator, String dominion_name, boolean force) { public static void delete(AbstractOperator operator, String dominion_name, boolean force) {
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
return; return;
} }
List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion); List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion);
if (!force) { if (!force) {
Notification.warn(operator, "删除领地 %s 会同时删除其所有子领地,是否继续?", dominion_name); AbstractOperator.Result WARNING = new AbstractOperator.Result(AbstractOperator.Result.WARNING, "删除领地 %s 会同时删除其所有子领地,是否继续?", dominion_name);
String sub_names = ""; String sub_names = "";
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
sub_names = sub_dominion.getName() + ", "; sub_names = sub_dominion.getName() + ", ";
} }
if (sub_dominions.size() > 0) { if (sub_dominions.size() > 0) {
sub_names = sub_names.substring(0, sub_names.length() - 2); sub_names = sub_names.substring(0, sub_names.length() - 2);
Notification.warn(operator, "当前子领地:" + sub_names); WARNING.appendMessage("(子领地:%s)", sub_names);
} }
Notification.warn(operator, "输入 /dominion delete %s force 确认删除", dominion_name); if (operator instanceof BukkitPlayerOperator) {
Notification.warn(operator.getPlayer(), "输入 /dominion delete %s force 确认删除", dominion_name);
}
operator.setResponse(WARNING);
return; return;
} }
DominionDTO.delete(dominion); DominionDTO.delete(dominion);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "领地 %s 及其所有子领地已删除", dominion_name);
// 退还经济 // 退还经济
if (Dominion.config.getEconomyEnable()) { if (Dominion.config.getEconomyEnable()) {
int count = 0; int count = 0;
@ -413,10 +441,10 @@ public class DominionController {
} }
} }
float refund = count * Dominion.config.getEconomyPrice() * Dominion.config.getEconomyRefund(); float refund = count * Dominion.config.getEconomyPrice() * Dominion.config.getEconomyRefund();
Dominion.vault.getEconomy().depositPlayer(operator, refund); Dominion.vault.getEconomy().depositPlayer(operator.getPlayer(), refund);
Notification.info(operator, "已经退还 %.2f %s", refund, Dominion.vault.getEconomy().currencyNamePlural()); SUCCESS.appendMessage("退还 %.2f %s", refund, Dominion.vault.getEconomy().currencyNamePlural());
} }
Notification.info(operator, "领地 %s 及其所有子领地已删除", dominion_name); operator.setResponse(SUCCESS);
} }
/** /**
@ -425,7 +453,7 @@ public class DominionController {
* @param operator 操作者 * @param operator 操作者
* @param message 消息 * @param message 消息
*/ */
public static void setJoinMessage(Player operator, String message) { public static void setJoinMessage(AbstractOperator operator, String message) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
return; return;
@ -440,13 +468,13 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
* @param message 消息 * @param message 消息
*/ */
public static void setJoinMessage(Player operator, String message, String dominion_name) { public static void setJoinMessage(AbstractOperator operator, String message, String dominion_name) {
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
return; return;
} }
dominion.setJoinMessage(message); dominion.setJoinMessage(message);
Notification.info(operator, "成功设置领地 %s 的进入消息", dominion_name); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功设置领地 %s 的进入消息", dominion_name));
} }
/** /**
@ -455,7 +483,7 @@ public class DominionController {
* @param operator 操作者 * @param operator 操作者
* @param message 消息 * @param message 消息
*/ */
public static void setLeaveMessage(Player operator, String message) { public static void setLeaveMessage(AbstractOperator operator, String message) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
return; return;
@ -470,13 +498,13 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
* @param message 消息 * @param message 消息
*/ */
public static void setLeaveMessage(Player operator, String message, String dominion_name) { public static void setLeaveMessage(AbstractOperator operator, String message, String dominion_name) {
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
return; return;
} }
dominion.setLeaveMessage(message); dominion.setLeaveMessage(message);
Notification.info(operator, "成功设置领地 %s 的离开消息", dominion_name); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功设置领地 %s 的离开消息", dominion_name));
} }
/** /**
@ -484,12 +512,12 @@ public class DominionController {
* *
* @param operator 操作者 * @param operator 操作者
*/ */
public static void setTpLocation(Player operator) { public static void setTpLocation(AbstractOperator operator, int x, int y, int z) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
return; return;
} }
setTpLocation(operator, dominion.getName()); setTpLocation(operator, x, y, z, dominion.getName());
} }
/** /**
@ -498,26 +526,27 @@ public class DominionController {
* @param operator 操作者 * @param operator 操作者
* @param dominion_name 领地名称 * @param dominion_name 领地名称
*/ */
public static void setTpLocation(Player operator, String dominion_name) { public static void setTpLocation(AbstractOperator operator, int x, int y, int z, String dominion_name) {
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在", dominion_name));
return; return;
} }
World world = Dominion.instance.getServer().getWorld(dominion.getWorld());
if (world == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "世界 %s 不存在", dominion.getWorld()));
return;
}
Location loc = new Location(world, x, y, z);
// 检查是否在领地内 // 检查是否在领地内
if (operator.getWorld().getName().equals(dominion.getWorld()) && if (isInDominion(dominion, loc)) {
operator.getLocation().getBlockX() >= dominion.getX1() &&
operator.getLocation().getBlockX() <= dominion.getX2() &&
operator.getLocation().getBlockY() >= dominion.getY1() &&
operator.getLocation().getBlockY() <= dominion.getY2() &&
operator.getLocation().getBlockZ() >= dominion.getZ1() &&
operator.getLocation().getBlockZ() <= dominion.getZ2()) {
Location loc = operator.getLocation();
loc.setY(loc.getY() + 1.5); loc.setY(loc.getY() + 1.5);
dominion.setTpLocation(loc); dominion.setTpLocation(loc);
Notification.info(operator, "成功设置领地 %s 的传送点,坐标:%d %d %d", operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS,
dominion_name, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); "成功设置领地 %s 的传送点 %d %d %d", dominion_name
, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
} else { } else {
Notification.error(operator, "你不在领地 %s 内,无法设置传送点", dominion_name); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "传送点不在领地 %s 内", dominion_name));
} }
} }
@ -528,17 +557,18 @@ public class DominionController {
* @param old_name 旧名称 * @param old_name 旧名称
* @param new_name 新名称 * @param new_name 新名称
*/ */
public static void rename(Player operator, String old_name, String new_name) { public static void rename(AbstractOperator operator, String old_name, String new_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "重命名领地失败");
if (new_name.isEmpty()) { if (new_name.isEmpty()) {
Notification.error(operator, "新名称不能为空"); operator.setResponse(FAIL.appendMessage("新名称不能为空"));
return; return;
} }
if (new_name.contains(" ")) { if (new_name.contains(" ")) {
Notification.error(operator, "领地名称不能包含空格"); operator.setResponse(FAIL.appendMessage("领地名称不能包含空格"));
return; return;
} }
if (Objects.equals(old_name, new_name)) { if (Objects.equals(old_name, new_name)) {
Notification.error(operator, "新名称与旧名称相同"); operator.setResponse(FAIL.appendMessage("新名称与旧名称相同"));
return; return;
} }
DominionDTO dominion = getExistDomAndIsOwner(operator, old_name); DominionDTO dominion = getExistDomAndIsOwner(operator, old_name);
@ -546,11 +576,11 @@ public class DominionController {
return; return;
} }
if (DominionDTO.select(new_name) != null) { if (DominionDTO.select(new_name) != null) {
Notification.error(operator, "已经存在名称为 %s 的领地", new_name); operator.setResponse(FAIL.appendMessage("已经存在名称为 %s 的领地", new_name));
return; return;
} }
dominion.setName(new_name); dominion.setName(new_name);
Notification.info(operator, "成功将领地 %s 重命名为 %s", old_name, new_name); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功将领地 %s 重命名为 %s", old_name, new_name));
} }
/** /**
@ -561,9 +591,15 @@ public class DominionController {
* @param player_name 玩家名称 * @param player_name 玩家名称
* @param force 是否强制转让 * @param force 是否强制转让
*/ */
public static void give(Player operator, String dom_name, String player_name, boolean force) { public static void give(AbstractOperator operator, String dom_name, String player_name, boolean force) {
if (Objects.equals(player_name, operator.getName())) { AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "转让领地失败");
Notification.error(operator, "你不能将领地转让给自己"); PlayerDTO operatorDTO = PlayerDTO.select(operator.getUniqueId());
if (operatorDTO == null) {
operator.setResponse(FAIL.appendMessage("操作者信息丢失,请联系管理员"));
return;
}
if (Objects.equals(player_name, operatorDTO.getLastKnownName())) {
operator.setResponse(FAIL.appendMessage("不能将领地转让给自己"));
return; return;
} }
DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name);
@ -572,32 +608,35 @@ public class DominionController {
} }
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
Notification.error(operator, "玩家 %s 不存在", player_name); operator.setResponse(FAIL.appendMessage("玩家 %s 不存在", player_name));
return; return;
} }
if (dominion.getParentDomId() != -1) { if (dominion.getParentDomId() != -1) {
Notification.error(operator, "子领地无法转让,你可以通过将玩家设置为管理员来让其管理子领地"); operator.setResponse(FAIL.appendMessage("子领地无法转让,你可以通过将 %s 设置为管理员来让其管理领地 %s ", player_name, dom_name));
return; return;
} }
List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion); List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion);
if (!force) { if (!force) {
Notification.warn(operator, "转让领地 %s 给 %s 会同时转让其所有子领地,是否继续?", dom_name, player_name); AbstractOperator.Result WARNING = new AbstractOperator.Result(AbstractOperator.Result.WARNING, "转让领地 %s 给 %s 会同时转让其所有子领地,是否继续?", dom_name, player_name);
String sub_names = ""; String sub_names = "";
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
sub_names = sub_dominion.getName() + ", "; sub_names = sub_dominion.getName() + ", ";
} }
if (sub_dominions.size() > 0) { if (sub_dominions.size() > 0) {
sub_names = sub_names.substring(0, sub_names.length() - 2); sub_names = sub_names.substring(0, sub_names.length() - 2);
Notification.warn(operator, "当前子领地:%s", sub_names); WARNING.appendMessage("(子领地:%s)", sub_names);
} }
Notification.warn(operator, "输入 /dominion give %s %s force 确认转让", dom_name, player_name); if (operator instanceof BukkitPlayerOperator) {
Notification.warn(operator.getPlayer(), "输入 /dominion give %s %s force 确认转让", dom_name, player_name);
}
operator.setResponse(WARNING);
return; return;
} }
dominion.setOwner(player.getUuid()); dominion.setOwner(player.getUuid());
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
sub_dominion.setOwner(player.getUuid()); sub_dominion.setOwner(player.getUuid());
} }
Notification.info(operator, "成功将领地 %s 及其所有子领地转让给 %s", dom_name, player_name); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功将领地 %s 及其所有子领地转让给 %s", dom_name, player_name));
} }
/** /**
@ -652,7 +691,8 @@ public class DominionController {
return sub_dominions; return sub_dominions;
} }
private static boolean sizeNotValid(Player operator, int x1, int y1, int z1, int x2, int y2, int z2) { private static boolean sizeNotValid(AbstractOperator operator, int x1, int y1, int z1, int x2, int y2, int z2) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "尺寸不合法");
if (operator.isOp() && Dominion.config.getLimitOpBypass()) { if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false; return false;
} }
@ -676,33 +716,34 @@ public class DominionController {
int y_length = y2 - y1; int y_length = y2 - y1;
int z_length = z2 - z1; int z_length = z2 - z1;
if (x_length < 4 || y_length < 4 || z_length < 4) { if (x_length < 4 || y_length < 4 || z_length < 4) {
Notification.error(operator, "领地的任意一边长度不得小于4"); operator.setResponse(FAIL.appendMessage("领地的任意一边长度不得小于4"));
return true; return true;
} }
if (x_length > Dominion.config.getLimitSizeX() && Dominion.config.getLimitSizeX() > 0) { if (x_length > Dominion.config.getLimitSizeX() && Dominion.config.getLimitSizeX() > 0) {
Notification.error(operator, "领地X方向长度不能超过 %s", Dominion.config.getLimitSizeX()); operator.setResponse(FAIL.appendMessage("领地X方向长度不能超过 %s", Dominion.config.getLimitSizeX()));
return true; return true;
} }
if (y_length > Dominion.config.getLimitSizeY() && Dominion.config.getLimitSizeY() > 0) { if (y_length > Dominion.config.getLimitSizeY() && Dominion.config.getLimitSizeY() > 0) {
Notification.error(operator, "领地Y方向高度不能超过 %s", Dominion.config.getLimitSizeY()); operator.setResponse(FAIL.appendMessage("领地Y方向高度不能超过 %s", Dominion.config.getLimitSizeY()));
return true; return true;
} }
if (z_length > Dominion.config.getLimitSizeZ() && Dominion.config.getLimitSizeZ() > 0) { if (z_length > Dominion.config.getLimitSizeZ() && Dominion.config.getLimitSizeZ() > 0) {
Notification.error(operator, "领地Z方向长度不能超过 %s", Dominion.config.getLimitSizeZ()); operator.setResponse(FAIL.appendMessage("领地Z方向长度不能超过 %s", Dominion.config.getLimitSizeZ()));
return true; return true;
} }
if (y2 > Dominion.config.getLimitMaxY()) { if (y2 > Dominion.config.getLimitMaxY()) {
Notification.error(operator, "领地Y坐标不能超过 %s", Dominion.config.getLimitMaxY()); operator.setResponse(FAIL.appendMessage("领地Y坐标不能超过 %s", Dominion.config.getLimitMaxY()));
return true; return true;
} }
if (y1 < Dominion.config.getLimitMinY()) { if (y1 < Dominion.config.getLimitMinY()) {
Notification.error(operator, "领地Y坐标不能低于 %s", Dominion.config.getLimitMinY()); operator.setResponse(FAIL.appendMessage("领地Y坐标不能低于 %s", Dominion.config.getLimitMinY()));
return true; return true;
} }
return false; return false;
} }
private static boolean depthNotValid(Player operator, DominionDTO parent_dom) { private static boolean depthNotValid(AbstractOperator operator, DominionDTO parent_dom) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "子领地深度不合法");
if (operator.isOp() && Dominion.config.getLimitOpBypass()) { if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false; return false;
} }
@ -710,7 +751,7 @@ public class DominionController {
return false; return false;
} }
if (parent_dom.getId() != -1 && Dominion.config.getLimitDepth() == 0) { if (parent_dom.getId() != -1 && Dominion.config.getLimitDepth() == 0) {
Notification.error(operator, "不允许创建子领地"); operator.setResponse(FAIL.appendMessage("不允许创建子领地"));
return true; return true;
} }
if (parent_dom.getId() == -1) { if (parent_dom.getId() == -1) {
@ -722,42 +763,35 @@ public class DominionController {
level++; level++;
} }
if (level >= Dominion.config.getLimitDepth()) { if (level >= Dominion.config.getLimitDepth()) {
Notification.error(operator, "子领地嵌套深度不能超过 %s", Dominion.config.getLimitDepth()); operator.setResponse(FAIL.appendMessage("子领地嵌套深度不能超过 %s", Dominion.config.getLimitDepth()));
return true; return true;
} }
return false; return false;
} }
private static boolean amountNotValid(Player operator) { private static boolean amountNotValid(AbstractOperator operator) {
if (operator.isOp() && Dominion.config.getLimitOpBypass()) { if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false; return false;
} }
if (Cache.instance.getPlayerDominionCount(operator) >= Dominion.config.getLimitAmount() && Dominion.config.getLimitAmount() != -1) { return Cache.instance.getPlayerDominionCount(operator.getUniqueId()) >= Dominion.config.getLimitAmount() && Dominion.config.getLimitAmount() != -1;
Notification.error(operator, "你的领地数量已达上限,当前上限为 %s", Dominion.config.getLimitAmount());
return true;
}
return false;
} }
private static boolean worldNotValid(Player operator) { private static boolean worldNotValid(AbstractOperator operator, String world) {
if (operator.isOp() && Dominion.config.getLimitOpBypass()) { if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false; return false;
} }
if (Dominion.config.getWorldBlackList().contains(operator.getWorld().getName())) { return Dominion.config.getWorldBlackList().contains(world);
Notification.error(operator, "禁止在世界 %s 创建领地", operator.getWorld().getName());
return true;
}
return false;
} }
private static DominionDTO getExistDomAndIsOwner(Player operator, String dominion_name) { private static DominionDTO getExistDomAndIsOwner(AbstractOperator operator, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "");
DominionDTO dominion = DominionDTO.select(dominion_name); DominionDTO dominion = DominionDTO.select(dominion_name);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "领地 %s 不存在", dominion_name); operator.setResponse(FAIL.setMessage("领地 %s 不存在", dominion_name));
return null; return null;
} }
if (notOwner(operator, dominion)) { if (notOwner(operator, dominion)) {
Notification.error(operator, "你不是领地 %s 的拥有者,无法执行此操作", dominion_name); operator.setResponse(FAIL.setMessage("你不是领地 %s 的拥有者", dominion_name));
return null; return null;
} }
return dominion; return dominion;

View File

@ -17,10 +17,11 @@ public class FlagsController {
* @param value 权限值 * @param value 权限值
* @return 设置后的领地信息 * @return 设置后的领地信息
*/ */
public static DominionDTO setFlag(Player operator, String flag, boolean value) { public static void setFlag(AbstractOperator operator, String flag, boolean value) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) return null; if (dominion == null) return;
return setFlag(operator, flag, value, dominion.getName()); setFlag(operator, flag, value, dominion.getName());
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置领地权限 %s 为 %s", flag, value));
} }
/** /**
@ -32,18 +33,19 @@ public class FlagsController {
* @param dominionName 领地名称 * @param dominionName 领地名称
* @return 设置后的领地信息 * @return 设置后的领地信息
*/ */
public static DominionDTO setFlag(Player operator, String flag, boolean value, String dominionName) { public static void setFlag(AbstractOperator operator, String flag, boolean value, String dominionName) {
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "领地 %s 不存在", dominionName); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在", dominionName));
return null; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return null; if (noAuthToChangeFlags(operator, dominion)) return;
Flag f = Flag.getFlag(flag); Flag f = Flag.getFlag(flag);
if (f == null) { if (f == null) {
Notification.error(operator, "未知的领地权限 %s", flag); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "未知的领地权限 %s", flag));
return null; return;
} }
return dominion.setFlagValue(f, value); dominion.setFlagValue(f, value);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置领地权限 %s 为 %s", flag, value));
} }
} }

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.controllers; package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
@ -16,47 +17,57 @@ import static cn.lunadeer.dominion.controllers.Apis.notOwner;
public class PrivilegeController { public class PrivilegeController {
/** /**
* 清空玩家特权 * 清空玩家成员权限
* *
* @param operator 操作者 * @param operator 操作者
* @param player_name 玩家 * @param player_name 玩家
* @return 是否清空成功 * @return 是否清空成功
*/ */
public static boolean clearPrivilege(Player operator, String player_name) { public static void clearPrivilege(AbstractOperator operator, String player_name) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "你不在任何领地内,请指定领地名称 /dominion clear_privilege <玩家名称> <领地名称>"); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion clear_privilege <玩家名称> <领地名称>"));
return false; return;
} }
return clearPrivilege(operator, player_name, dominion.getName()); clearPrivilege(operator, player_name, dominion.getName());
} }
/** /**
* 清空玩家特权 * 清空玩家成员权限
* *
* @param operator 操作者 * @param operator 操作者
* @param player_name 玩家 * @param player_name 玩家
* @param dominionName 领地名称 * @param dominionName 领地名称
* @return 是否清空成功 * @return 是否清空成功
*/ */
public static boolean clearPrivilege(Player operator, String player_name, String dominionName) { public static void clearPrivilege(AbstractOperator operator, String player_name, String dominionName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "清空玩家 %s 在领地 %s 的权限失败", player_name, dominionName);
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "领地 %s 不存在", dominionName); operator.setResponse(FAIL.appendMessage("领地 %s 不存在", dominionName));
return false; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return false; if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
Notification.error(operator, "玩家 %s 不存在或没有登录过", player_name); operator.setResponse(FAIL.appendMessage("玩家 %s 不存在或没有登录过", player_name));
return false; return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.appendMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName));
return;
}
if (privilege.getAdmin() && notOwner(operator, dominion)) {
operator.setResponse(FAIL.appendMessage("你不是领地 %s 的拥有者,无法移除一个领地管理员", dominionName));
return;
} }
PlayerPrivilegeDTO.delete(player.getUuid(), dominion.getId()); PlayerPrivilegeDTO.delete(player.getUuid(), dominion.getId());
return true; operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "清空玩家 %s 在领地 %s 的权限成功", player_name, dominionName));
} }
/** /**
* 设置玩家特权 * 设置玩家成员权限
* *
* @param operator 操作者 * @param operator 操作者
* @param player_name 玩家 * @param player_name 玩家
@ -64,17 +75,17 @@ public class PrivilegeController {
* @param value 权限值 * @param value 权限值
* @return 是否设置成功 * @return 是否设置成功
*/ */
public static boolean setPrivilege(Player operator, String player_name, String flag, boolean value) { public static void setPrivilege(AbstractOperator operator, String player_name, String flag, boolean value) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "你不在任何领地内,请指定领地名称 /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]"); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]"));
return false; return;
} }
return setPrivilege(operator, player_name, flag, value, dominion.getName()); setPrivilege(operator, player_name, flag, value, dominion.getName());
} }
/** /**
* 设置玩家特权 * 设置玩家成员权限
* *
* @param operator 操作者 * @param operator 操作者
* @param player_name 玩家 * @param player_name 玩家
@ -83,75 +94,82 @@ public class PrivilegeController {
* @param dominionName 领地名称 * @param dominionName 领地名称
* @return 是否设置成功 * @return 是否设置成功
*/ */
public static boolean setPrivilege(Player operator, String player_name, String flag, boolean value, String dominionName) { public static void setPrivilege(AbstractOperator operator, String player_name, String flag, boolean value, String dominionName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 失败", player_name, dominionName, flag, value);
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "领地 %s 不存在,无法设置特权", dominionName); operator.setResponse(FAIL.appendMessage("领地 %s 不存在", dominionName));
return false; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return false; if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
Notification.error(operator, "玩家 %s 不存在或没有登录过", player_name); operator.setResponse(FAIL.appendMessage("玩家 %s 不存在或没有登录过", player_name));
return false; return;
} }
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId()); PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
privilege = createPlayerPrivilege(operator, player.getUuid(), dominion); privilege = createPlayerPrivilege(operator, player.getUuid(), dominion);
if (privilege == null) return false; if (privilege == null) return;
} }
if (flag.equals("admin")) { if (flag.equals("admin")) {
if (notOwner(operator, dominion)) { if (notOwner(operator, dominion)) {
Notification.error(operator, "你不是领地 %s 的拥有者,无法设置其他玩家为管理员", dominionName); operator.setResponse(FAIL.appendMessage("你不是领地 %s 的拥有者,无法设置/取消其他玩家为管理员", dominionName));
return false; return;
} }
privilege.setAdmin(value); privilege.setAdmin(value);
} else { } else {
Flag f = Flag.getFlag(flag); Flag f = Flag.getFlag(flag);
if (f == null) { if (f == null) {
Notification.error(operator, "未知的领地权限 %s", flag); operator.setResponse(FAIL.appendMessage("未知的领地权限 %s", flag));
return false; return;
} }
privilege.setFlagValue(f, value); privilege.setFlagValue(f, value);
} }
Notification.info(operator, "设置玩家在领地 %s 的权限 %s 为 %s", dominionName, flag, value); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 成功", player_name, dominionName, flag, value));
return true;
} }
public static boolean createPrivilege(Player operator, String player_name) { public static void createPrivilege(AbstractOperator operator, String player_name) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator); DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "你不在任何领地内,请指定领地名称 /dominion create_privilege <玩家名称> <领地名称>"); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion create_privilege <玩家名称> <领地名称>"));
return false; return;
} }
return createPrivilege(operator, player_name, dominion.getName()); createPrivilege(operator, player_name, dominion.getName());
} }
public static boolean createPrivilege(Player operator, String player_name, String dominionName) { public static void createPrivilege(AbstractOperator operator, String player_name, String dominionName) {
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
Notification.error(operator, "领地 %s 不存在,无法创建特权", dominionName); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在,无法创建成员权限", dominionName));
return false; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return false; if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
Notification.error(operator, "玩家 %s 不存在或没有登录过", player_name); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "玩家 %s 不存在或没有登录过", player_name));
return false; return;
}
if (createPlayerPrivilege(operator, player.getUuid(), dominion) != null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建玩家 %s 在领地 %s 的成员权限成功", player_name, dominionName));
} }
return createPlayerPrivilege(operator, player.getUuid(), dominion) != null;
} }
private static PlayerPrivilegeDTO createPlayerPrivilege(Player operator, UUID player, DominionDTO dom) { private static PlayerPrivilegeDTO createPlayerPrivilege(AbstractOperator operator, UUID player, DominionDTO dom) {
XLogger.debug("operator: " + operator.getUniqueId() + " player: " + player); XLogger.debug("operator: " + operator.getUniqueId() + " player: " + player);
if (operator.getUniqueId().equals(player)) { if (operator.getUniqueId().equals(player)) {
Notification.error(operator, "你不能给自己设置特权"); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不能给自己设置成员权限"));
return null; return null;
} }
PlayerPrivilegeDTO privilege = new PlayerPrivilegeDTO(player, dom); PlayerDTO playerDTO = PlayerDTO.select(player);
privilege = PlayerPrivilegeDTO.insert(privilege); PlayerPrivilegeDTO privilege = Cache.instance.getPlayerPrivilege(player, dom);
if (privilege != null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建玩家成员权限失败,玩家 %s 已经是领地 %s 的成员", playerDTO.getLastKnownName(), dom.getName()));
return null;
}
privilege = PlayerPrivilegeDTO.insert(new PlayerPrivilegeDTO(player, dom));
if (privilege == null) { if (privilege == null) {
Notification.error(operator, "创建玩家特权失败,可能是此玩家已存在特权"); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建玩家成员权限失败,请联系管理员"));
return null; return null;
} }
return privilege; return privilege;

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
@ -38,7 +39,7 @@ public class Apis {
if (args.length >= 2) { if (args.length >= 2) {
return DominionDTO.select(args[1]); return DominionDTO.select(args[1]);
} else { } else {
return getPlayerCurrentDominion(player); return Cache.instance.getPlayerCurrentDominion(player);
} }
} }
@ -54,7 +55,7 @@ public class Apis {
if (args.length >= 3) { if (args.length >= 3) {
return DominionDTO.select(args[2]); return DominionDTO.select(args[2]);
} else { } else {
return getPlayerCurrentDominion(player); return Cache.instance.getPlayerCurrentDominion(player);
} }
} }

View File

@ -48,11 +48,12 @@ public class DominionPrivilegeList {
for (PlayerPrivilegeDTO privilege : privileges) { for (PlayerPrivilegeDTO privilege : privileges) {
PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID()); PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID());
if (p_player == null) continue; if (p_player == null) continue;
view.add(Line.create() Line line = Line.create()
.append(p_player.getLastKnownName()) .append(p_player.getLastKnownName())
.append(Button.createGreen("配置权限").setExecuteCommand("/dominion privilege_info " + p_player.getLastKnownName() + " " + dominion.getName()).build()) .append(Button.createGreen("配置权限").setExecuteCommand("/dominion privilege_info " + p_player.getLastKnownName() + " " + dominion.getName()).build());
.append(Button.createRed("移除成员").setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b").build()) if (!player.getName().equals(p_player.getLastKnownName()) && !privilege.getAdmin())
); line.append(Button.createRed("移除成员").setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b").build());
view.add(line);
} }
view.showOn(player, page); view.showOn(player, page);
} }

View File

@ -33,7 +33,7 @@ public class ListDominion {
view.add(Line.create().append(Component.text("-= 以下为你拥有管理员权限的领地 =-", ViewStyles.main_color))); view.add(Line.create().append(Component.text("-= 以下为你拥有管理员权限的领地 =-", ViewStyles.main_color)));
for (String dominion : admin_dominions) { for (String dominion : admin_dominions) {
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + dominion).build(); TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + dominion).build();
view.add(Line.create().append(dominion).append(manage)); view.add(Line.create().append(manage).append(dominion));
} }
view.showOn(player, page); view.showOn(player, page);
} }
@ -47,7 +47,7 @@ public class ListDominion {
for (DominionNode node : dominionTree) { for (DominionNode node : dominionTree) {
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.dominion.getName()).build(); TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.dominion.getName()).build();
TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.dominion.getName()).build(); TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.dominion.getName()).build();
Line line = Line.create().append(prefix + node.dominion.getName()).append(manage).append(delete); Line line = Line.create().append(delete).append(manage).append(prefix + node.dominion.getName());
lines.add(line); lines.add(line);
lines.addAll(BuildTreeLines(node.children, depth + 1)); lines.addAll(BuildTreeLines(node.children, depth + 1));
} }