mirror of
https://github.com/ColdeZhang/Dominion.git
synced 2024-10-19 00:36:40 +08:00
finish main controller some command api
This commit is contained in:
parent
f2dfe0c6a1
commit
ee967fbb4d
@ -3,9 +3,15 @@ package cn.lunadeer.dominion;
|
||||
import cn.lunadeer.dominion.utils.ConfigManager;
|
||||
import cn.lunadeer.dominion.utils.Database;
|
||||
import cn.lunadeer.dominion.utils.XLogger;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.postgresql.core.Tuple;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public final class Dominion extends JavaPlugin {
|
||||
|
||||
@ -37,4 +43,5 @@ public final class Dominion extends JavaPlugin {
|
||||
public static Dominion instance;
|
||||
public static ConfigManager config;
|
||||
public static Connection dbConnection;
|
||||
public static Map<UUID, List<Location>> pointsSelect = new HashMap<>();
|
||||
}
|
||||
|
33
src/main/java/cn/lunadeer/dominion/commands/Apis.java
Normal file
33
src/main/java/cn/lunadeer/dominion/commands/Apis.java
Normal file
@ -0,0 +1,33 @@
|
||||
package cn.lunadeer.dominion.commands;
|
||||
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class Apis {
|
||||
public static Player playerOnly(CommandSender sender) {
|
||||
if (!(sender instanceof Player)) {
|
||||
Notification.error(sender, "该命令只能由玩家执行");
|
||||
return null;
|
||||
}
|
||||
return (Player) sender;
|
||||
}
|
||||
|
||||
public static void sizeInfo(CommandSender sender, DominionDTO dominionDTO) {
|
||||
Integer x1 = dominionDTO.getX1();
|
||||
Integer y1 = dominionDTO.getY1();
|
||||
Integer z1 = dominionDTO.getZ1();
|
||||
Integer x2 = dominionDTO.getX2();
|
||||
Integer y2 = dominionDTO.getY2();
|
||||
Integer z2 = dominionDTO.getZ2();
|
||||
Notification.info(sender, "领地 " + dominionDTO.getName() + " 的尺寸信息:");
|
||||
Notification.info(sender, " 大小为" + (x2 - x1) + " x" + (y2 - y1) + " x" + (z2 - z1));
|
||||
Notification.info(sender, " 中心坐标为 " + (x1 + (x2 - x1) / 2) + " " + (y1 + (y2 - y1) / 2) + " " + (z1 + (z2 - z1) / 2));
|
||||
Notification.info(sender, " 高度为 " + (y2 - y1));
|
||||
Notification.info(sender, " 体积为 " + (x2 - x1) * (y2 - y1) * (z2 - z1));
|
||||
Notification.info(sender, " 领地的世界为 " + dominionDTO.getWorld());
|
||||
Notification.info(sender, " 领地的对角点坐标为 x1=" + x1 + " y1=" + y1 + " z1=" + z1 + " x2=" + x2 + " y2=" + y2 + " z2=" + z2);
|
||||
}
|
||||
|
||||
}
|
114
src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
Normal file
114
src/main/java/cn/lunadeer/dominion/commands/DominionOperate.java
Normal file
@ -0,0 +1,114 @@
|
||||
package cn.lunadeer.dominion.commands;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.controllers.DominionController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
|
||||
import static cn.lunadeer.dominion.commands.Apis.sizeInfo;
|
||||
|
||||
public class DominionOperate {
|
||||
/**
|
||||
* 创建领地
|
||||
*
|
||||
* @param sender 命令发送者
|
||||
* @param args 命令参数
|
||||
*/
|
||||
public static void createDominion(CommandSender sender, String[] args) {
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
if (args.length != 2) {
|
||||
Notification.error(sender, "用法: /dominion create <领地名称>");
|
||||
return;
|
||||
}
|
||||
List<Location> points = Dominion.pointsSelect.get(player.getUniqueId());
|
||||
if (points == null || points.size() != 2) {
|
||||
Notification.error(sender, "请先使用木棍选择领地的对角线两点,或使用 /dominion auto_create <领地名称> 创建自动领地");
|
||||
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) {
|
||||
Notification.error(sender, "创建领地失败");
|
||||
return;
|
||||
}
|
||||
Notification.info(sender, "成功创建领地: " + name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动创建领地
|
||||
* 会在玩家当前位置的周围创建一个 20x20x20 的领地
|
||||
*
|
||||
* @param sender 命令发送者
|
||||
* @param args 命令参数
|
||||
*/
|
||||
public static void autoCreateDominion(CommandSender sender, String[] args) {
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
if (args.length != 2) {
|
||||
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);
|
||||
}
|
||||
|
||||
public static void expandDominion(CommandSender sender, String[] args) {
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
if (args.length != 2 && args.length != 3) {
|
||||
Notification.error(sender, "用法: /dominion expand [大小] [领地名称]");
|
||||
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.expand(player, size);
|
||||
} else {
|
||||
dominionDTO = DominionController.expand(player, size, name);
|
||||
}
|
||||
if (dominionDTO == null) {
|
||||
Notification.error(sender, "扩展领地失败");
|
||||
} else {
|
||||
Notification.info(sender, "成功扩展领地: " + dominionDTO.getName() + " " + size);
|
||||
sizeInfo(sender, dominionDTO);
|
||||
}
|
||||
}
|
||||
}
|
154
src/main/java/cn/lunadeer/dominion/controllers/Apis.java
Normal file
154
src/main/java/cn/lunadeer/dominion/controllers/Apis.java
Normal file
@ -0,0 +1,154 @@
|
||||
package cn.lunadeer.dominion.controllers;
|
||||
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
|
||||
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Apis {
|
||||
|
||||
public static boolean notOwner(Player player, DominionDTO dominion) {
|
||||
if (player.isOp()) return false;
|
||||
if (dominion.getOwner().equals(player.getUniqueId())) return false;
|
||||
Notification.error(player, "你不是领地 " + dominion.getName() + " 的拥有者,无法执行此操作");
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean noAuthToChangeFlags(Player player, DominionDTO dominion) {
|
||||
if (player.isOp()) return false;
|
||||
if (!dominion.getOwner().equals(player.getUniqueId())) {
|
||||
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId());
|
||||
for (PlayerPrivilegeDTO privilege : privileges) {
|
||||
if (privilege.getAdmin()) return false;
|
||||
}
|
||||
Notification.error(player, "你不是领地 " + dominion.getName() + " 的拥有者或管理员,无法执行此操作");
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取玩家当前所在的领地
|
||||
* 如果玩家不在一个领地内或者在子领地内,会提示玩家手动指定要操作的领地名称
|
||||
*
|
||||
* @param player 玩家
|
||||
* @return 当前所在的领地
|
||||
*/
|
||||
public static DominionDTO getPlayerCurrentDominion(Player player) {
|
||||
Location location = player.getLocation();
|
||||
List<DominionDTO> dominions = DominionDTO.selectByLocation(location.getWorld().getName(),
|
||||
(int) location.getX(), (int) location.getY(), (int) location.getZ());
|
||||
if (dominions.size() != 1) {
|
||||
Notification.error(player, "你不在一个领地内或在子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称");
|
||||
return null;
|
||||
}
|
||||
return dominions.get(0);
|
||||
}
|
||||
|
||||
|
||||
public static boolean updateTemplateFlag(PrivilegeTemplateDTO privilege, String flag, boolean value) {
|
||||
switch (flag) {
|
||||
case "anchor":
|
||||
privilege.setAnchor(value);
|
||||
break;
|
||||
case "animal_killing":
|
||||
privilege.setAnimalKilling(value);
|
||||
break;
|
||||
case "anvil":
|
||||
privilege.setAnvil(value);
|
||||
break;
|
||||
case "beacon":
|
||||
privilege.setBeacon(value);
|
||||
break;
|
||||
case "bed":
|
||||
privilege.setBed(value);
|
||||
break;
|
||||
case "brew":
|
||||
privilege.setBrew(value);
|
||||
break;
|
||||
case "button":
|
||||
privilege.setButton(value);
|
||||
break;
|
||||
case "cake":
|
||||
privilege.setCake(value);
|
||||
break;
|
||||
case "container":
|
||||
privilege.setContainer(value);
|
||||
break;
|
||||
case "craft":
|
||||
privilege.setCraft(value);
|
||||
break;
|
||||
case "diode":
|
||||
privilege.setDiode(value);
|
||||
break;
|
||||
case "door":
|
||||
privilege.setDoor(value);
|
||||
break;
|
||||
case "dye":
|
||||
privilege.setDye(value);
|
||||
break;
|
||||
case "egg":
|
||||
privilege.setEgg(value);
|
||||
break;
|
||||
case "enchant":
|
||||
privilege.setEnchant(value);
|
||||
break;
|
||||
case "ender_pearl":
|
||||
privilege.setEnderPearl(value);
|
||||
break;
|
||||
case "feed":
|
||||
privilege.setFeed(value);
|
||||
break;
|
||||
case "glow":
|
||||
privilege.setGlow(value);
|
||||
break;
|
||||
case "honey":
|
||||
privilege.setHoney(value);
|
||||
break;
|
||||
case "hook":
|
||||
privilege.setHook(value);
|
||||
break;
|
||||
case "ignite":
|
||||
privilege.setIgnite(value);
|
||||
break;
|
||||
case "mob_killing":
|
||||
privilege.setMobKilling(value);
|
||||
break;
|
||||
case "move":
|
||||
privilege.setMove(value);
|
||||
break;
|
||||
case "place":
|
||||
privilege.setPlace(value);
|
||||
break;
|
||||
case "pressure":
|
||||
privilege.setPressure(value);
|
||||
break;
|
||||
case "riding":
|
||||
privilege.setRiding(value);
|
||||
break;
|
||||
case "shear":
|
||||
privilege.setShear(value);
|
||||
break;
|
||||
case "shoot":
|
||||
privilege.setShoot(value);
|
||||
break;
|
||||
case "trade":
|
||||
privilege.setTrade(value);
|
||||
break;
|
||||
case "vehicle_destroy":
|
||||
privilege.setVehicleDestroy(value);
|
||||
break;
|
||||
case "harvest":
|
||||
privilege.setHarvest(value);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,8 +1,6 @@
|
||||
package cn.lunadeer.dominion.controllers;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.utils.Database;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import cn.lunadeer.dominion.utils.Time;
|
||||
import cn.lunadeer.dominion.utils.XLogger;
|
||||
@ -11,7 +9,9 @@ import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion;
|
||||
import static cn.lunadeer.dominion.controllers.Apis.notOwner;
|
||||
|
||||
public class DominionController {
|
||||
|
||||
@ -67,7 +67,7 @@ public class DominionController {
|
||||
return null;
|
||||
}
|
||||
// 是否是父领地的拥有者
|
||||
if (!isOwner(owner, parent_dominion) && parent_dominion.getId() != -1) {
|
||||
if (notOwner(owner, parent_dominion) && parent_dominion.getId() != -1) {
|
||||
return null;
|
||||
}
|
||||
// 如果parent_dominion不为-1 检查是否在同一世界
|
||||
@ -80,7 +80,7 @@ public class DominionController {
|
||||
Notification.error(owner, "超出父领地 " + parent_dominion_name + " 范围");
|
||||
return null;
|
||||
}
|
||||
// 获取此父领地的所有子领地
|
||||
// 获取此领地的所有同级领地
|
||||
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), parent_dominion.getId());
|
||||
// 检查是否与其他子领地冲突
|
||||
for (DominionDTO sub_dominion : sub_dominions) {
|
||||
@ -107,14 +107,11 @@ public class DominionController {
|
||||
* @return 扩展后的领地
|
||||
*/
|
||||
public static DominionDTO expand(Player operator, Integer size) {
|
||||
Location location = operator.getLocation();
|
||||
List<DominionDTO> dominions = DominionDTO.selectByLocation(location.getWorld().getName(),
|
||||
(int) location.getX(), (int) location.getY(), (int) location.getZ());
|
||||
if (dominions.size() != 1) {
|
||||
Notification.error(operator, "你不在一个领地内或在一个子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称");
|
||||
DominionDTO dominion = getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) {
|
||||
return null;
|
||||
}
|
||||
return expand(operator, size, dominions.get(0).getName());
|
||||
return expand(operator, size, dominion.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -133,7 +130,7 @@ public class DominionController {
|
||||
Notification.error(operator, "领地 " + dominion_name + " 不存在");
|
||||
return null;
|
||||
}
|
||||
if (!isOwner(operator, dominion)) {
|
||||
if (notOwner(operator, dominion)) {
|
||||
return null;
|
||||
}
|
||||
if (!location.getWorld().getName().equals(dominion.getWorld())) {
|
||||
@ -202,14 +199,11 @@ public class DominionController {
|
||||
* @return 缩小后的领地
|
||||
*/
|
||||
public static DominionDTO contract(Player operator, Integer size) {
|
||||
Location location = operator.getLocation();
|
||||
List<DominionDTO> dominions = DominionDTO.selectByLocation(location.getWorld().getName(),
|
||||
(int) location.getX(), (int) location.getY(), (int) location.getZ());
|
||||
if (dominions.size() != 1) {
|
||||
Notification.error(operator, "你不在一个领地内或在子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称");
|
||||
DominionDTO dominion = getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) {
|
||||
return null;
|
||||
}
|
||||
return contract(operator, size, dominions.get(0).getName());
|
||||
return contract(operator, size, dominion.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -228,7 +222,7 @@ public class DominionController {
|
||||
Notification.error(operator, "领地 " + dominion_name + " 不存在");
|
||||
return null;
|
||||
}
|
||||
if (!isOwner(operator, dominion)) {
|
||||
if (notOwner(operator, dominion)) {
|
||||
return null;
|
||||
}
|
||||
if (!location.getWorld().getName().equals(dominion.getWorld())) {
|
||||
@ -280,6 +274,105 @@ public class DominionController {
|
||||
return dominion.setXYZ(x1, y1, z1, x2, y2, z2);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除领地 会同时删除其所有子领地
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param dominion_name 领地名称
|
||||
* @param force 是否强制删除
|
||||
*/
|
||||
public static void delete(Player operator, String dominion_name, boolean force) {
|
||||
DominionDTO dominion = DominionDTO.select(dominion_name);
|
||||
if (dominion == null) {
|
||||
Notification.error(operator, "领地 " + dominion_name + " 不存在");
|
||||
return;
|
||||
}
|
||||
if (notOwner(operator, dominion)) {
|
||||
return;
|
||||
}
|
||||
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId());
|
||||
if (!force) {
|
||||
Notification.warn(operator, "删除领地 " + dominion_name + " 会同时删除其所有子领地,是否继续?");
|
||||
String sub_names = "";
|
||||
for (DominionDTO sub_dominion : sub_dominions) {
|
||||
sub_names = sub_dominion.getName() + ", ";
|
||||
}
|
||||
if (sub_dominions.size() > 0) {
|
||||
sub_names = sub_names.substring(0, sub_names.length() - 2);
|
||||
Notification.warn(operator, "当前子领地(不包含子领地的子领地等):" + sub_names);
|
||||
}
|
||||
Notification.warn(operator, "输入 /dominion force_delete " + dominion_name + " 确认删除");
|
||||
return;
|
||||
}
|
||||
DominionDTO.delete(dominion);
|
||||
Notification.info(operator, "领地 " + dominion_name + " 及其所有子领地已删除");
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置领地的进入消息
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param message 消息
|
||||
*/
|
||||
public static void setJoinMessage(Player operator, String message) {
|
||||
DominionDTO dominion = getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) {
|
||||
return;
|
||||
}
|
||||
setJoinMessage(operator, dominion.getName(), message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置进入领地的消息
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param dominion_name 领地名称
|
||||
* @param message 消息
|
||||
*/
|
||||
public static void setJoinMessage(Player operator, String dominion_name, String message) {
|
||||
DominionDTO dominion = DominionDTO.select(dominion_name);
|
||||
if (dominion == null) {
|
||||
Notification.error(operator, "领地 " + dominion_name + " 不存在");
|
||||
return;
|
||||
}
|
||||
if (notOwner(operator, dominion)) {
|
||||
return;
|
||||
}
|
||||
dominion.setJoinMessage(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置领地的离开消息
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param message 消息
|
||||
*/
|
||||
public static void setLeaveMessage(Player operator, String message) {
|
||||
DominionDTO dominion = getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) {
|
||||
return;
|
||||
}
|
||||
setLeaveMessage(operator, dominion.getName(), message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置离开领地的消息
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param dominion_name 领地名称
|
||||
* @param message 消息
|
||||
*/
|
||||
public static void setLeaveMessage(Player operator, String dominion_name, String message) {
|
||||
DominionDTO dominion = DominionDTO.select(dominion_name);
|
||||
if (dominion == null) {
|
||||
Notification.error(operator, "领地 " + dominion_name + " 不存在");
|
||||
return;
|
||||
}
|
||||
if (notOwner(operator, dominion)) {
|
||||
return;
|
||||
}
|
||||
dominion.setLeaveMessage(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断两个领地是否相交
|
||||
@ -316,12 +409,4 @@ public class DominionController {
|
||||
sub.getY1() >= y1 && sub.getY2() <= y2 &&
|
||||
sub.getZ1() >= z1 && sub.getZ2() <= z2;
|
||||
}
|
||||
|
||||
public static boolean isOwner(Player player, DominionDTO dominion) {
|
||||
if (dominion.getOwner().equals(player.getUniqueId())) return true;
|
||||
Notification.error(player, "你不是领地 " + dominion.getName() + " 的拥有者,无法执行此操作");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,82 @@
|
||||
package cn.lunadeer.dominion.controllers;
|
||||
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;
|
||||
|
||||
public class FlagsController {
|
||||
|
||||
/**
|
||||
* 设置领地权限
|
||||
* @param operator 操作者
|
||||
* @param flag 权限名称
|
||||
* @param value 权限值
|
||||
* @return 设置后的领地信息
|
||||
*/
|
||||
public static DominionDTO setFlag(Player operator, String flag, boolean value){
|
||||
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) return null;
|
||||
return setFlag(operator, flag, value, dominion.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置领地权限
|
||||
* @param operator 操作者
|
||||
* @param flag 权限名称
|
||||
* @param value 权限值
|
||||
* @param dominionName 领地名称
|
||||
* @return 设置后的领地信息
|
||||
*/
|
||||
public static DominionDTO setFlag(Player operator, String flag, boolean value, String dominionName) {
|
||||
DominionDTO dominion = DominionDTO.select(dominionName);
|
||||
if (dominion == null) {
|
||||
Notification.error(operator, "领地 " + dominionName + " 不存在");
|
||||
return null;
|
||||
}
|
||||
if (noAuthToChangeFlags(operator, dominion)) return null;
|
||||
switch (flag) {
|
||||
case "anchor": return dominion.setAnchor(value);
|
||||
case "animal_killing": return dominion.setAnimalKilling(value);
|
||||
case "anvil": return dominion.setAnvil(value);
|
||||
case "beacon": return dominion.setBeacon(value);
|
||||
case "bed": return dominion.setBed(value);
|
||||
case "brew": return dominion.setBrew(value);
|
||||
case "button": return dominion.setButton(value);
|
||||
case "cake": return dominion.setCake(value);
|
||||
case "container": return dominion.setContainer(value);
|
||||
case "craft": return dominion.setCraft(value);
|
||||
case "creeper_explode": return dominion.setCreeperExplode(value);
|
||||
case "diode": return dominion.setDiode(value);
|
||||
case "door": return dominion.setDoor(value);
|
||||
case "dye": return dominion.setDye(value);
|
||||
case "egg": return dominion.setEgg(value);
|
||||
case "enchant": return dominion.setEnchant(value);
|
||||
case "ender_pearl": return dominion.setEnderPearl(value);
|
||||
case "feed": return dominion.setFeed(value);
|
||||
case "fire_spread": return dominion.setFireSpread(value);
|
||||
case "flow_in_protection": return dominion.setFlowInProtection(value);
|
||||
case "glow": return dominion.setGlow(value);
|
||||
case "grow": return dominion.setGrow(value);
|
||||
case "honey": return dominion.setHoney(value);
|
||||
case "hook": return dominion.setHook(value);
|
||||
case "ignite": return dominion.setIgnite(value);
|
||||
case "mob_killing": return dominion.setMobKilling(value);
|
||||
case "move": return dominion.setMove(value);
|
||||
case "place": return dominion.setPlace(value);
|
||||
case "pressure": return dominion.setPressure(value);
|
||||
case "riding": return dominion.setRiding(value);
|
||||
case "shear": return dominion.setShear(value);
|
||||
case "shoot": return dominion.setShoot(value);
|
||||
case "tnt_explode": return dominion.setTntExplode(value);
|
||||
case "trade": return dominion.setTrade(value);
|
||||
case "vehicle_destroy": return dominion.setVehicleDestroy(value);
|
||||
case "wither_spawn": return dominion.setWitherSpawn(value);
|
||||
case "harvest": return dominion.setHarvest(value);
|
||||
default:
|
||||
Notification.error(operator, "未知的领地权限 " + flag);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,148 @@
|
||||
package cn.lunadeer.dominion.controllers;
|
||||
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
|
||||
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;
|
||||
|
||||
public class GroupController {
|
||||
|
||||
/**
|
||||
* 创建权限组
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param name 权限组名称
|
||||
* @return 是否创建成功
|
||||
*/
|
||||
public static PrivilegeTemplateDTO create(Player operator, String name) {
|
||||
PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(name, operator.getUniqueId(), true);
|
||||
template = PrivilegeTemplateDTO.insert(template);
|
||||
if (template == null) {
|
||||
Notification.error(operator, "创建权限组失败");
|
||||
return null;
|
||||
}
|
||||
return template;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除权限组
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param name 权限组名称
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
public static boolean delete(Player operator, String name) {
|
||||
PrivilegeTemplateDTO.delete(operator.getUniqueId(), name);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置权限组的权限
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param name 权限组名称
|
||||
* @param flag 权限名称
|
||||
* @param value 权限值
|
||||
* @return 是否设置成功
|
||||
*/
|
||||
public static boolean setFlag(Player operator, String name, String flag, boolean value) {
|
||||
PrivilegeTemplateDTO privilege = PrivilegeTemplateDTO.select(operator.getUniqueId(), name);
|
||||
if (privilege == null) {
|
||||
Notification.error(operator, "没有找到权限组 " + name);
|
||||
return false;
|
||||
}
|
||||
if (!Apis.updateTemplateFlag(privilege, flag, value)) {
|
||||
Notification.error(operator, "未知的领地权限 " + flag);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加玩家到权限组
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @param groupName 权限组名称
|
||||
* @return 是否添加成功
|
||||
*/
|
||||
public static boolean addPlayer(Player operator, UUID player, String groupName) {
|
||||
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) return false;
|
||||
return addPlayer(operator, player, groupName, dominion.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加玩家到权限组
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @param groupName 权限组名称
|
||||
* @param dominionName 领地名称
|
||||
* @return 是否添加成功
|
||||
*/
|
||||
public static boolean addPlayer(Player operator, UUID player, String groupName, String dominionName) {
|
||||
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), groupName);
|
||||
if (template == null) {
|
||||
Notification.error(operator, "没有找到权限组 " + groupName + " 或者需要先创建权限组");
|
||||
return false;
|
||||
}
|
||||
DominionDTO dominion = DominionDTO.select(dominionName);
|
||||
if (dominion == null) {
|
||||
Notification.error(operator, "领地 " + dominionName + " 不存在");
|
||||
return false;
|
||||
}
|
||||
if (noAuthToChangeFlags(operator, dominion)) return false;
|
||||
PlayerPrivilegeDTO privilege = new PlayerPrivilegeDTO(player, false, dominion.getId(), template.getId());
|
||||
privilege = PlayerPrivilegeDTO.insert(privilege);
|
||||
if (privilege == null) {
|
||||
Notification.error(operator, "添加玩家 " + player + " 到权限组 " + groupName + " 失败");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从权限组中移除玩家
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @param groupName 权限组名称
|
||||
* @return 是否移除成功
|
||||
*/
|
||||
public static boolean removePlayer(Player operator, UUID player, String groupName) {
|
||||
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) return false;
|
||||
return removePlayer(operator, player, groupName, dominion.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* 从权限组中移除玩家
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @param groupName 权限组名称
|
||||
* @param dominionName 领地名称
|
||||
* @return 是否移除成功
|
||||
*/
|
||||
public static boolean removePlayer(Player operator, UUID player, String groupName, String dominionName) {
|
||||
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), groupName);
|
||||
if (template == null) {
|
||||
Notification.error(operator, "没有找到权限组 " + groupName);
|
||||
return false;
|
||||
}
|
||||
DominionDTO dominion = DominionDTO.select(dominionName);
|
||||
if (dominion == null) {
|
||||
Notification.error(operator, "领地 " + dominionName + " 不存在");
|
||||
return false;
|
||||
}
|
||||
if (noAuthToChangeFlags(operator, dominion)) return false;
|
||||
PlayerPrivilegeDTO.delete(player, dominion.getId(), template.getId());
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,155 @@
|
||||
package cn.lunadeer.dominion.controllers;
|
||||
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
|
||||
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import cn.lunadeer.dominion.utils.XLogger;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;
|
||||
|
||||
public class PrivilegeController {
|
||||
|
||||
/**
|
||||
* 清空玩家特权
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @return 是否清空成功
|
||||
*/
|
||||
public static boolean clearPrivilege(Player operator, UUID player) {
|
||||
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) return false;
|
||||
return clearPrivilege(operator, player, dominion.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空玩家特权
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @param dominionName 领地名称
|
||||
* @return 是否清空成功
|
||||
*/
|
||||
public static boolean clearPrivilege(Player operator, UUID player, 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());
|
||||
if (templates.size() < 1) {
|
||||
return true;
|
||||
}
|
||||
for (PrivilegeTemplateDTO template : templates) {
|
||||
PlayerPrivilegeDTO.delete(player, dominion.getId(), template.getId());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置玩家特权
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @param flag 权限名称
|
||||
* @param value 权限值
|
||||
* @return 是否设置成功
|
||||
*/
|
||||
public static boolean setPrivilege(Player operator, UUID player, String flag, boolean value) {
|
||||
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
|
||||
if (dominion == null) return false;
|
||||
return setPrivilege(operator, player, flag, value, dominion.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置玩家特权
|
||||
*
|
||||
* @param operator 操作者
|
||||
* @param player 玩家
|
||||
* @param flag 权限名称
|
||||
* @param value 权限值
|
||||
* @param dominionName 领地名称
|
||||
* @return 是否设置成功
|
||||
*/
|
||||
public static boolean setPrivilege(Player operator, UUID player, 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());
|
||||
if (templates.size() < 1) {
|
||||
PrivilegeTemplateDTO template = createPlayerPrivilege(operator, player, dominion.getId());
|
||||
if (template == null) return false;
|
||||
templates.add(template);
|
||||
}
|
||||
if (templates.size() > 1) {
|
||||
Notification.error(operator, "玩家特权拥有多个权限模板,建议使用 clear_privilege 清空此玩家特权后重新设置");
|
||||
XLogger.warn("玩家特权拥有多个权限模板,使用搜索到的第一个 id: " + templates.get(0).getId() + " 进行操作,请检查数据库");
|
||||
XLogger.warn("其他权限模板如下:");
|
||||
for (int i = 1; i < templates.size(); i++) {
|
||||
XLogger.warn(" id: " + templates.get(i).getId());
|
||||
}
|
||||
}
|
||||
PrivilegeTemplateDTO privilege = templates.get(0);
|
||||
if (Objects.equals(flag, "admin")) {
|
||||
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player, dominion.getId());
|
||||
for (PlayerPrivilegeDTO p : privileges) {
|
||||
if (p.getPrivilegeTemplateID().equals(privilege.getId())) {
|
||||
p = p.setAdmin(value);
|
||||
if (p == null) {
|
||||
Notification.error(operator, "更新玩家特权失败");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Notification.error(operator, "没有找到玩家权限关联数据");
|
||||
return false;
|
||||
}
|
||||
if (!Apis.updateTemplateFlag(privilege, flag, value)){
|
||||
Notification.error(operator, "未知的领地权限 " + flag);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static PrivilegeTemplateDTO createPlayerPrivilege(Player operator, UUID player, Integer domID) {
|
||||
PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(player.toString(), operator.getUniqueId(), false);
|
||||
template = PrivilegeTemplateDTO.insert(template);
|
||||
if (template == null) {
|
||||
Notification.error(operator, "创建玩家特权失败");
|
||||
return null;
|
||||
}
|
||||
PlayerPrivilegeDTO privilege = new PlayerPrivilegeDTO(player, false, domID, template.getId());
|
||||
privilege = PlayerPrivilegeDTO.insert(privilege);
|
||||
if (privilege == null) {
|
||||
Notification.error(operator, "创建玩家特权关联玩家时失败");
|
||||
PrivilegeTemplateDTO.delete(template);
|
||||
return null;
|
||||
}
|
||||
return template;
|
||||
}
|
||||
|
||||
private static List<PrivilegeTemplateDTO> getPlayerPrivilegeTemplates(UUID player, Integer domID) {
|
||||
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(player, domID);
|
||||
List<PrivilegeTemplateDTO> templates = new ArrayList<>();
|
||||
for (PlayerPrivilegeDTO privilege : privileges) {
|
||||
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(privilege.getPrivilegeTemplateID());
|
||||
if (template == null) continue;
|
||||
if (template.getGroup()) continue; // 跳过组权限
|
||||
templates.add(template);
|
||||
}
|
||||
return templates;
|
||||
}
|
||||
}
|
@ -22,11 +22,10 @@ public class PlayerPrivilegeDTO {
|
||||
return players.get(0);
|
||||
}
|
||||
|
||||
public static PlayerPrivilegeDTO select(UUID playerUUID) {
|
||||
String sql = "SELECT * FROM player_privilege WHERE player_uuid = '" + playerUUID + "'";
|
||||
List<PlayerPrivilegeDTO> players = query(sql);
|
||||
if (players.size() == 0) return null;
|
||||
return players.get(0);
|
||||
public static List<PlayerPrivilegeDTO> select(UUID playerUUID, Integer dom_id) {
|
||||
String sql = "SELECT * FROM player_privilege WHERE player_uuid = '" + playerUUID + "' " +
|
||||
"AND dom_id = " + dom_id;
|
||||
return query(sql);
|
||||
}
|
||||
|
||||
public static PlayerPrivilegeDTO select(Integer dom_id) {
|
||||
@ -36,15 +35,15 @@ public class PlayerPrivilegeDTO {
|
||||
return players.get(0);
|
||||
}
|
||||
|
||||
public static PlayerPrivilegeDTO select(Integer dom_id, UUID playerUUID) {
|
||||
String sql = "SELECT * FROM player_privilege WHERE dom_id = " + dom_id + " AND player_uuid = '" + playerUUID + "'";
|
||||
List<PlayerPrivilegeDTO> players = query(sql);
|
||||
if (players.size() == 0) return null;
|
||||
return players.get(0);
|
||||
public static void delete(UUID player, Integer domID, Integer privilegeTemplateID) {
|
||||
String sql = "DELETE FROM player_privilege WHERE player_uuid = '" + player + "' " +
|
||||
"AND dom_id = " + domID + " " +
|
||||
"AND privilege_template_id = " + privilegeTemplateID;
|
||||
query(sql);
|
||||
}
|
||||
|
||||
public static void delete(PlayerPrivilegeDTO player) {
|
||||
String sql = "DELETE FROM player_privilege WHERE id = " + player.getId();
|
||||
public static void delete(UUID player) {
|
||||
String sql = "DELETE FROM player_privilege WHERE player_uuid = '" + player + "'";
|
||||
query(sql);
|
||||
}
|
||||
|
||||
@ -79,9 +78,9 @@ public class PlayerPrivilegeDTO {
|
||||
return privilegeTemplateID;
|
||||
}
|
||||
|
||||
public void setAdmin(Boolean admin) {
|
||||
public PlayerPrivilegeDTO setAdmin(Boolean admin) {
|
||||
this.admin = admin;
|
||||
update(this);
|
||||
return update(this);
|
||||
}
|
||||
|
||||
private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Integer privilegeTemplateID) {
|
||||
|
@ -28,6 +28,30 @@ public class PrivilegeTemplateDTO {
|
||||
return query(sql);
|
||||
}
|
||||
|
||||
public static List<PrivilegeTemplateDTO> searchGroup(String name){
|
||||
String sql = "SELECT * FROM privilege_template WHERE name LIKE '%" + name + "%' AND group = true";
|
||||
return query(sql);
|
||||
}
|
||||
|
||||
public static List<PrivilegeTemplateDTO> searchGroup(UUID creator){
|
||||
String sql = "SELECT * FROM privilege_template WHERE creator = '" + creator.toString() + "' AND group = true";
|
||||
return query(sql);
|
||||
}
|
||||
|
||||
public static PrivilegeTemplateDTO select(Integer id) {
|
||||
String sql = "SELECT * FROM privilege_template WHERE id = " + id;
|
||||
List<PrivilegeTemplateDTO> templates = query(sql);
|
||||
if (templates.size() == 0) return null;
|
||||
return templates.get(0);
|
||||
}
|
||||
|
||||
public static PrivilegeTemplateDTO select(UUID creator, String name) {
|
||||
String sql = "SELECT * FROM privilege_template WHERE creator = '" + creator.toString() + "' AND name = '" + name + "'";
|
||||
List<PrivilegeTemplateDTO> templates = query(sql);
|
||||
if (templates.size() == 0) return null;
|
||||
return templates.get(0);
|
||||
}
|
||||
|
||||
public static List<PrivilegeTemplateDTO> search(String name) {
|
||||
String sql = "SELECT * FROM privilege_template WHERE name LIKE '%" + name + "%'";
|
||||
return query(sql);
|
||||
@ -43,6 +67,11 @@ public class PrivilegeTemplateDTO {
|
||||
query(sql);
|
||||
}
|
||||
|
||||
public static void delete(UUID creator, String name) {
|
||||
String sql = "DELETE FROM privilege_template WHERE creator = '" + creator.toString() + "' AND name = '" + name + "'";
|
||||
query(sql);
|
||||
}
|
||||
|
||||
private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO privilege) {
|
||||
String sql = "UPDATE privilege_template SET " +
|
||||
"name = '" + privilege.getName() + "', " +
|
||||
|
@ -143,6 +143,7 @@ public class Database {
|
||||
" trade BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" vehicle_destroy BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" harvest BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" UNIQUE (name, creator)," +
|
||||
" FOREIGN KEY (creator) REFERENCES player_name(uuid)" +
|
||||
")";
|
||||
|
||||
|
@ -6,7 +6,8 @@ import net.kyori.adventure.text.TextComponent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.lunadeer.dominion.utils.STUI.ViewStyles.*;
|
||||
import static cn.lunadeer.dominion.utils.STUI.ViewStyles.main_color;
|
||||
import static cn.lunadeer.dominion.utils.STUI.ViewStyles.sub_color;
|
||||
|
||||
|
||||
public class Pagination {
|
||||
|
@ -7,7 +7,7 @@ import org.bukkit.entity.Player;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.lunadeer.dominion.utils.STUI.ViewStyles.*;
|
||||
import static cn.lunadeer.dominion.utils.STUI.ViewStyles.main_color;
|
||||
|
||||
public class View {
|
||||
protected TextComponent title_decorate = Component.text("━", main_color);
|
||||
|
@ -4,3 +4,8 @@ main: cn.lunadeer.dominion.Dominion
|
||||
api-version: '1.20'
|
||||
load: STARTUP
|
||||
folia-supported: true
|
||||
commands:
|
||||
Dominion:
|
||||
description: 领地插件命令
|
||||
usage: /dominion <cmd>
|
||||
aliases: [dominion, dom]
|
Loading…
Reference in New Issue
Block a user