finish PlayerPrivilege commands, DominionFlag commands

This commit is contained in:
zhangyuheng 2024-02-07 00:57:43 +08:00
parent ee967fbb4d
commit fe9dabf7a0
10 changed files with 343 additions and 54 deletions

View File

@ -1,10 +1,15 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.utils.Notification;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class Apis {
public static Player playerOnly(CommandSender sender) {
if (!(sender instanceof Player)) {
@ -30,4 +35,15 @@ public class Apis {
Notification.info(sender, " 领地的对角点坐标为 x1=" + x1 + " y1=" + y1 + " z1=" + z1 + " x2=" + x2 + " y2=" + y2 + " z2=" + z2);
}
public static void autoPoints(Player player) {
Integer size = Dominion.config.getAutoCreateRadius();
Location location = player.getLocation();
Location location1 = new Location(location.getWorld(), location.getX() - size, location.getY() - size, location.getZ() - size);
Location location2 = new Location(location.getWorld(), location.getX() + size, location.getY() + size, location.getZ() + size);
List<Location> points = new ArrayList<>();
points.add(location1);
points.add(location2);
Dominion.pointsSelect.put(player.getUniqueId(), points);
}
}

View File

@ -0,0 +1,36 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.controllers.FlagsController;
import cn.lunadeer.dominion.utils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class DominionFlag {
/**
* 设置领地权限
* /dominion set <权限名称> <true/false> [领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void setDominionFlag(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length == 3) {
if (FlagsController.setFlag(player, args[1], Boolean.parseBoolean(args[2])) == null) {
Notification.error(sender, "设置领地权限失败");
}
} else if (args.length == 4) {
if (FlagsController.setFlag(player, args[1], Boolean.parseBoolean(args[2]), args[3]) == null) {
Notification.error(sender, "设置领地权限失败");
}
} else {
Notification.error(sender, "用法: /dominion set <权限名称> <true/false> [领地名称]");
}
}
}

View File

@ -9,14 +9,16 @@ import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.commands.Apis.sizeInfo;
import static cn.lunadeer.dominion.commands.Apis.*;
import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion;
public class DominionOperate {
/**
* 创建领地
* /dominion create <领地名称>
*
* @param sender 命令发送者
* @param args 命令参数
@ -34,22 +36,50 @@ public class DominionOperate {
return;
}
String name = args[1];
DominionDTO dominionDTO = DominionDTO.select(name);
if (dominionDTO != null) {
Notification.error(sender, "已经存在名称为 " + name + " 的领地");
return;
}
dominionDTO = DominionController.create(player, name, points.get(0), points.get(1));
if (dominionDTO == null) {
if (DominionController.create(player, name, points.get(0), points.get(1)) == null) {
Notification.error(sender, "创建领地失败");
return;
}
Notification.info(sender, "成功创建领地: " + name);
Notification.info(sender, "成功创建: " + name);
}
/**
* 创建子领地
* /dominion create_sub <子领地名称> [父领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void createSubDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion create_sub <子领地名称> [父领地名称]");
return;
}
List<Location> points = Dominion.pointsSelect.get(player.getUniqueId());
if (points == null || points.size() != 2) {
Notification.error(sender, "请先使用木棍选择子领地的对角线两点,或使用 /dominion auto_create_sub <子领地名称> [父领地名称] 创建自动子领地");
return;
}
if (args.length == 2) {
if (DominionController.create(player, args[1], points.get(0), points.get(1)) != null) {
Notification.info(sender, "成功创建子领地: " + args[1]);
return;
}
} else {
if (DominionController.create(player, args[1], points.get(0), points.get(1), args[2]) != null) {
Notification.info(sender, "成功创建子领地: " + args[1]);
return;
}
}
Notification.error(sender, "创建子领地失败");
}
/**
* 自动创建领地
* 会在玩家当前位置的周围创建一个 20x20x20 的领地
* 会在玩家当前位置的周围创建一个领地
* /dominion auto_create <领地名称>
*
* @param sender 命令发送者
* @param args 命令参数
@ -61,23 +91,36 @@ public class DominionOperate {
Notification.error(sender, "用法: /dominion auto_create <领地名称>");
return;
}
String name = args[1];
DominionDTO dominionDTO = DominionDTO.select(name);
if (dominionDTO != null) {
Notification.error(sender, "已经存在名称为 " + name + " 的领地");
return;
}
Location location = player.getLocation();
Location location1 = new Location(location.getWorld(), location.getX() - 10, location.getY() - 10, location.getZ() - 10);
Location location2 = new Location(location.getWorld(), location.getX() + 10, location.getY() + 10, location.getZ() + 10);
dominionDTO = DominionController.create(player, name, location1, location2);
if (dominionDTO == null) {
Notification.error(sender, "创建领地失败");
return;
}
Notification.info(sender, "成功创建领地: " + name);
autoPoints(player);
createDominion(sender, args);
}
/**
* 自动创建子领地
* 会在玩家当前位置的周围创建一个子领地
* /dominion auto_create_sub <子领地名称> [父领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void autoCreateSubDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion auto_create_sub <子领地名称> [父领地名称]");
return;
}
autoPoints(player);
createSubDominion(sender, args);
}
/**
* 扩张领地
* /dominion expand [大小] [领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void expandDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
@ -111,4 +154,70 @@ public class DominionOperate {
sizeInfo(sender, dominionDTO);
}
}
/**
* 缩小领地
* /dominion contract [大小] [领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void contractDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion contract [大小] [领地名称]");
return;
}
int size = 10;
String name = "";
if (args.length == 2) {
try {
size = Integer.parseInt(args[1]);
} catch (Exception e) {
Notification.error(sender, "大小格式错误");
return;
}
}
if (args.length == 3) {
name = args[2];
}
DominionDTO dominionDTO;
if (name.isEmpty()) {
dominionDTO = DominionController.contract(player, size);
} else {
dominionDTO = DominionController.contract(player, size, name);
}
if (dominionDTO == null) {
Notification.error(sender, "缩小领地失败");
} else {
Notification.info(sender, "成功缩小领地: " + dominionDTO.getName() + " " + size);
sizeInfo(sender, dominionDTO);
}
}
/**
* 删除领地
* /dominion delete <领地名称> [force]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void deleteDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length == 2) {
String name = args[1];
DominionController.delete(player, name, false);
return;
}
if (args.length == 3) {
String name = args[1];
if (args[2].equals("force")) {
DominionController.delete(player, name, true);
return;
}
}
Notification.error(sender, "用法: /dominion delete <领地名称> [force]");
}
}

View File

@ -0,0 +1,66 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.utils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.controllers.PrivilegeController.clearPrivilege;
import static cn.lunadeer.dominion.controllers.PrivilegeController.setPrivilege;
public class PlayerPrivilege {
/**
* 设置玩家权限
* /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void setPlayerPrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length != 4 && args.length != 5) {
Notification.error(sender, "用法: /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]");
return;
}
if (args.length == 4) {
if (setPrivilege(player, args[1], args[2], Boolean.parseBoolean(args[3]))) {
return;
}
} else {
if (setPrivilege(player, args[1], args[2], Boolean.parseBoolean(args[3]), args[4])) {
return;
}
}
Notification.error(sender, "设置玩家权限失败");
}
/**
* 重置玩家权限
* /dominion clear_privilege <玩家名称> [领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void clearPlayerPrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion clear_privilege <玩家名称> [领地名称]");
return;
}
if (args.length == 2) {
if (clearPrivilege(player, args[1])) {
return;
}
} else {
if (clearPrivilege(player, args[1], args[2])) {
return;
}
}
Notification.error(sender, "重置玩家权限失败");
}
}

View File

@ -25,7 +25,12 @@ public class DominionController {
* @return 创建的领地
*/
public static DominionDTO create(Player owner, String name, Location loc1, Location loc2) {
return create(owner, name, loc1, loc2, "");
DominionDTO parent = getPlayerCurrentDominion(owner);
if (parent == null) {
return create(owner, name, loc1, loc2, "");
} else {
return create(owner, name, loc1, loc2, parent.getName());
}
}
/**
@ -41,6 +46,10 @@ public class DominionController {
public static DominionDTO create(Player owner, String name,
Location loc1, Location loc2,
String parent_dominion_name) {
if (DominionDTO.select(name) != null) {
Notification.error(owner, "已经存在名称为 " + name + " 的领地");
return null;
}
if (!loc1.getWorld().equals(loc2.getWorld())) {
Notification.error(owner, "禁止跨世界操作");
return null;

View File

@ -0,0 +1,21 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import java.util.List;
import java.util.UUID;
public class PlayerController {
public static PlayerDTO getPlayerDTO(String playerName) {
return PlayerDTO.select(playerName);
}
public static List<PlayerDTO> searchPlayer(String playerName) {
return PlayerDTO.search(playerName);
}
public static List<PlayerDTO> allPlayers() {
return PlayerDTO.all();
}
}

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.dominion.utils.Notification;
@ -19,38 +20,42 @@ public class PrivilegeController {
/**
* 清空玩家特权
*
* @param operator 操作者
* @param player 玩家
* @param operator 操作者
* @param player_name 玩家
* @return 是否清空成功
*/
public static boolean clearPrivilege(Player operator, UUID player) {
public static boolean clearPrivilege(Player operator, String player_name) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) return false;
return clearPrivilege(operator, player, dominion.getName());
return clearPrivilege(operator, player_name, dominion.getName());
}
/**
* 清空玩家特权
*
* @param operator 操作者
* @param player 玩家
* @param player_name 玩家
* @param dominionName 领地名称
* @return 是否清空成功
*/
public static boolean clearPrivilege(Player operator, UUID player, String dominionName) {
public static boolean clearPrivilege(Player operator, String player_name, String dominionName) {
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) {
Notification.error(operator, "领地 " + dominionName + " 不存在");
return false;
}
if (noAuthToChangeFlags(operator, dominion)) return false;
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player, dominion.getId());
List<PrivilegeTemplateDTO> templates = getPlayerPrivilegeTemplates(player, dominion.getId());
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
Notification.error(operator, "玩家 " + player_name + " 不存在或没有登录过");
return false;
}
List<PrivilegeTemplateDTO> templates = getPlayerPrivilegeTemplates(player.getUuid(), dominion.getId());
if (templates.size() < 1) {
return true;
}
for (PrivilegeTemplateDTO template : templates) {
PlayerPrivilegeDTO.delete(player, dominion.getId(), template.getId());
PlayerPrivilegeDTO.delete(player.getUuid(), dominion.getId(), template.getId());
}
return true;
}
@ -58,38 +63,43 @@ public class PrivilegeController {
/**
* 设置玩家特权
*
* @param operator 操作者
* @param player 玩家
* @param flag 权限名称
* @param value 权限值
* @param operator 操作者
* @param player_name 玩家
* @param flag 权限名称
* @param value 权限值
* @return 是否设置成功
*/
public static boolean setPrivilege(Player operator, UUID player, String flag, boolean value) {
public static boolean setPrivilege(Player operator, String player_name, String flag, boolean value) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) return false;
return setPrivilege(operator, player, flag, value, dominion.getName());
return setPrivilege(operator, player_name, flag, value, dominion.getName());
}
/**
* 设置玩家特权
*
* @param operator 操作者
* @param player 玩家
* @param player_name 玩家
* @param flag 权限名称
* @param value 权限值
* @param dominionName 领地名称
* @return 是否设置成功
*/
public static boolean setPrivilege(Player operator, UUID player, String flag, boolean value, String dominionName) {
public static boolean setPrivilege(Player operator, String player_name, String flag, boolean value, String dominionName) {
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) {
Notification.error(operator, "领地 " + dominionName + " 不存在");
return false;
}
if (noAuthToChangeFlags(operator, dominion)) return false;
List<PrivilegeTemplateDTO> templates = getPlayerPrivilegeTemplates(player, dominion.getId());
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
Notification.error(operator, "玩家 " + player_name + " 不存在或没有登录过");
return false;
}
List<PrivilegeTemplateDTO> templates = getPlayerPrivilegeTemplates(player.getUuid(), dominion.getId());
if (templates.size() < 1) {
PrivilegeTemplateDTO template = createPlayerPrivilege(operator, player, dominion.getId());
PrivilegeTemplateDTO template = createPlayerPrivilege(operator, player.getUuid(), dominion.getId());
if (template == null) return false;
templates.add(template);
}
@ -103,7 +113,7 @@ public class PrivilegeController {
}
PrivilegeTemplateDTO privilege = templates.get(0);
if (Objects.equals(flag, "admin")) {
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player, dominion.getId());
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
for (PlayerPrivilegeDTO p : privileges) {
if (p.getPrivilegeTemplateID().equals(privilege.getId())) {
p = p.setAdmin(value);
@ -117,7 +127,7 @@ public class PrivilegeController {
Notification.error(operator, "没有找到玩家权限关联数据");
return false;
}
if (!Apis.updateTemplateFlag(privilege, flag, value)){
if (!Apis.updateTemplateFlag(privilege, flag, value)) {
Notification.error(operator, "未知的领地权限 " + flag);
return false;
}

View File

@ -20,12 +20,13 @@ public class PlayerDTO {
return re;
}
public PlayerDTO onJoin() {
return update(this);
public static List<PlayerDTO> all() {
String sql = "SELECT * FROM player_name";
return query(sql);
}
public static List<PlayerDTO> search(String name) {
return select(name);
public PlayerDTO onJoin() {
return update(this);
}
private static List<PlayerDTO> query(String sql) {
@ -54,7 +55,14 @@ public class PlayerDTO {
return players.get(0);
}
private static List<PlayerDTO> select(String name) {
public static PlayerDTO select(String name) {
String sql = "SELECT * FROM player_name WHERE last_known_name = '" + name + "'";
List<PlayerDTO> players = query(sql);
if (players.size() == 0) return null;
return players.get(0);
}
public static List<PlayerDTO> search(String name) {
// 模糊搜索
String sql = "SELECT * FROM player_name WHERE last_known_name LIKE '%" + name + "%'";
return query(sql);

View File

@ -20,6 +20,7 @@ public class ConfigManager {
_db_name = _file.getString("Database.Name", "dominion");
_db_user = _file.getString("Database.User", "postgres");
_db_pass = _file.getString("Database.Pass", "postgres");
_auto_create_radius = _file.getInt("AutoCreateRadius", 10);
}
public Boolean isDebug() {
@ -50,7 +51,6 @@ public class ConfigManager {
return _db_user;
}
public void setDbPass(String db_pass) {
_db_pass = db_pass;
_file.set("Database.Pass", db_pass);
@ -64,6 +64,16 @@ public class ConfigManager {
return _db_pass;
}
public Integer getAutoCreateRadius() {
return _auto_create_radius;
}
public void setAutoCreateRadius(Integer radius) {
_auto_create_radius = radius;
_file.set("AutoCreateRadius", radius);
_plugin.saveConfig();
}
private final Dominion _plugin;
private FileConfiguration _file;
@ -74,4 +84,6 @@ public class ConfigManager {
private String _db_user;
private String _db_pass;
private String _db_name;
private Integer _auto_create_radius;
}

View File

@ -5,4 +5,6 @@ Database:
User: dominion
Pass: dominion
AutoCreateRadius: 10
Debug: false