finish create contract expand

This commit is contained in:
zhangyuheng 2024-02-05 21:35:13 +08:00
parent 07acadd79e
commit f2dfe0c6a1
2 changed files with 190 additions and 40 deletions

View File

@ -2,8 +2,10 @@ 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;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
@ -15,35 +17,62 @@ public class DominionController {
/**
* 创建领地
*
* @param owner 拥有者
* @param name 领地名称
* @param loc1 位置1
* @param loc2 位置2
* @return 创建的领地
*/
public static DominionDTO create(Player owner, String name, Location loc1, Location loc2) {
DominionDTO dominion = createDTO(owner, name, loc1, loc2);
if (dominion == null) return null;
List<DominionDTO> exist_dominions = DominionDTO.selectAll(owner.getWorld().getName());
for (DominionDTO exist_dominion : exist_dominions) {
if (isIntersect(exist_dominion, dominion)) {
Notification.error(owner, "" + exist_dominion.getName() + " 冲突");
return null;
}
}
return DominionDTO.insert(dominion);
return create(owner, name, loc1, loc2, "");
}
/**
* 创建子领地
*
* @param owner 拥有者
* @param name 领地名称
* @param loc1 位置1
* @param loc2 位置2
* @param parent_dominion_name 父领地名称
* @return 创建的领地
*/
public static DominionDTO create(Player owner, String name,
Location loc1, Location loc2,
String parent_dominion_name) {
DominionDTO dominion = createDTO(owner, name, loc1, loc2);
if (dominion == null) return null;
DominionDTO parent_dominion = DominionDTO.select(parent_dominion_name);
if (!loc1.getWorld().equals(loc2.getWorld())) {
Notification.error(owner, "禁止跨世界操作");
return null;
}
if (!owner.getWorld().equals(loc1.getWorld())) {
Notification.error(owner, "禁止跨世界操作");
return null;
}
DominionDTO dominion = new DominionDTO(owner.getUniqueId(), name, owner.getWorld().getName(),
(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.max(loc1.getY(), loc2.getY()), (int) Math.max(loc1.getZ(), loc2.getZ()));
DominionDTO parent_dominion;
if (parent_dominion_name.isEmpty()) {
parent_dominion = DominionDTO.select(-1);
} else {
parent_dominion = DominionDTO.select(parent_dominion_name);
}
if (parent_dominion == null) {
Notification.error(owner, "父领地 " + parent_dominion_name + " 不存在");
if (parent_dominion_name.isEmpty()) {
XLogger.err("根领地丢失!");
}
return null;
}
// 是否是父领地的拥有者
if (!isOwner(owner, parent_dominion)) {
if (!isOwner(owner, parent_dominion) && parent_dominion.getId() != -1) {
return null;
}
// 如果parent_dominion不为-1 检查是否在同一世界
if (parent_dominion.getId() != -1 && !parent_dominion.getWorld().equals(dominion.getWorld())) {
Notification.error(owner, "禁止跨世界操作");
return null;
}
// 检查是否超出父领地范围
@ -52,11 +81,11 @@ public class DominionController {
return null;
}
// 获取此父领地的所有子领地
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(parent_dominion.getId());
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), parent_dominion.getId());
// 检查是否与其他子领地冲突
for (DominionDTO sub_dominion : sub_dominions) {
if (isIntersect(sub_dominion, dominion)) {
Notification.error(owner, "领地 " + sub_dominion.getName() + " 冲突");
Notification.error(owner, "领地 " + sub_dominion.getName() + " 冲突");
return null;
}
}
@ -68,7 +97,16 @@ public class DominionController {
return dominion.setParentDomId(parent_dominion.getId());
}
public static DominionDTO expand(Player operator, Integer size){
/**
* 向一个方向扩展领地
* 会尝试对操作者当前所在的领地进行操作当操作者不在一个领地内或者在子领地内时
* 需要手动指定要操作的领地名称
*
* @param operator 操作者
* @param size 扩展的大小
* @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());
@ -79,6 +117,14 @@ public class DominionController {
return expand(operator, size, dominions.get(0).getName());
}
/**
* 向一个方向扩展领地
*
* @param operator 操作者
* @param size 扩展的大小
* @param dominion_name 领地名称
* @return 扩展后的领地
*/
public static DominionDTO expand(Player operator, Integer size, String dominion_name) {
Location location = operator.getLocation();
BlockFace face = operator.getFacing();
@ -123,9 +169,22 @@ public class DominionController {
Notification.error(operator, "无效的方向");
return null;
}
List<DominionDTO> exist_dominions = DominionDTO.selectAll(dominion.getWorld());
// 校验是否超出父领地范围
DominionDTO parent_dominion = DominionDTO.select(dominion.getParentDomId());
if (parent_dominion == null) {
Notification.error(operator, "父领地丢失");
return null;
}
if (!isContained(x1, y1, z1, x2, y2, z2, parent_dominion)) {
Notification.error(operator, "超出父领地 " + parent_dominion.getName() + " 范围");
return null;
}
// 获取同世界下的所有同级领地
List<DominionDTO> exist_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getParentDomId());
for (DominionDTO exist_dominion : exist_dominions) {
if (isIntersect(exist_dominion, x1, y1, z1, x2, y2, z2)) {
// 如果是自己跳过
if (exist_dominion.getId().equals(dominion.getId())) continue;
Notification.error(operator, "" + exist_dominion.getName() + " 冲突");
return null;
}
@ -133,6 +192,94 @@ public class DominionController {
return dominion.setXYZ(x1, y1, z1, x2, y2, z2);
}
/**
* 缩小领地
* 会尝试对操作者当前所在的领地进行操作当操作者不在一个领地内或者在子领地内时
* 需要手动指定要操作的领地名称
*
* @param operator 操作者
* @param size 缩小的大小
* @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, "你不在一个领地内或在子领地内,无法确定你要操作的领地,请手动指定要操作的领地名称");
return null;
}
return contract(operator, size, dominions.get(0).getName());
}
/**
* 缩小领地
*
* @param operator 操作者
* @param size 缩小的大小
* @param dominion_name 领地名称
* @return 缩小后的领地
*/
public static DominionDTO contract(Player operator, Integer size, String dominion_name) {
Location location = operator.getLocation();
BlockFace face = operator.getFacing();
DominionDTO dominion = DominionDTO.select(dominion_name);
if (dominion == null) {
Notification.error(operator, "领地 " + dominion_name + " 不存在");
return null;
}
if (!isOwner(operator, dominion)) {
return null;
}
if (!location.getWorld().getName().equals(dominion.getWorld())) {
Notification.error(operator, "禁止跨世界操作");
return null;
}
Integer x1 = dominion.getX1();
Integer y1 = dominion.getY1();
Integer z1 = dominion.getZ1();
Integer x2 = dominion.getX2();
Integer y2 = dominion.getY2();
Integer z2 = dominion.getZ2();
switch (face) {
case NORTH:
z2 -= size;
break;
case SOUTH:
z1 += size;
break;
case WEST:
x2 -= size;
break;
case EAST:
x1 += size;
break;
case UP:
y2 -= size;
break;
case DOWN:
y1 += size;
break;
default:
Notification.error(operator, "无效的方向");
return null;
}
// 校验第二组坐标是否小于第一组坐标
if (x1 >= x2 || y1 >= y2 || z1 >= z2) {
Notification.error(operator, "缩小后的领地无效");
return null;
}
// 获取所有的子领地
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId());
for (DominionDTO sub_dominion : sub_dominions) {
if (!isContained(sub_dominion, x1, y1, z1, x2, y2, z2)) {
Notification.error(operator, "缩小后的领地 " + dominion_name + " 无法包含子领地 " + sub_dominion.getName());
return null;
}
}
return dominion.setXYZ(x1, y1, z1, x2, y2, z2);
}
/**
* 判断两个领地是否相交
@ -158,20 +305,16 @@ public class DominionController {
sub.getZ1() >= parent.getZ1() && sub.getZ2() <= parent.getZ2();
}
public static DominionDTO createDTO(Player owner, String name,
Location loc1, Location loc2) {
if (!loc1.getWorld().equals(loc2.getWorld())) {
Notification.error(owner, "禁止跨世界操作");
return null;
}
if (!owner.getWorld().equals(loc1.getWorld())) {
Notification.error(owner, "禁止跨世界操作");
return null;
}
return new DominionDTO(owner.getUniqueId(), name, owner.getWorld().getName(),
(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.max(loc1.getY(), loc2.getY()), (int) Math.max(loc1.getZ(), loc2.getZ()));
private static boolean isContained(Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2, DominionDTO parent) {
return x1 >= parent.getX1() && x2 <= parent.getX2() &&
y1 >= parent.getY1() && y2 <= parent.getY2() &&
z1 >= parent.getZ1() && z2 <= parent.getZ2();
}
private static boolean isContained(DominionDTO sub, Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) {
return sub.getX1() >= x1 && sub.getX2() <= x2 &&
sub.getY1() >= y1 && sub.getY2() <= y2 &&
sub.getZ1() >= z1 && sub.getZ2() <= z2;
}
public static boolean isOwner(Player player, DominionDTO dominion) {

View File

@ -77,34 +77,41 @@ public class DominionDTO {
}
public static List<DominionDTO> selectAll() {
String sql = "SELECT * FROM dominion";
String sql = "SELECT * FROM dominion WHERE id > 0";
return query(sql);
}
public static List<DominionDTO> selectAll(String world) {
String sql = "SELECT * FROM dominion WHERE world = '" + world + "'";
String sql = "SELECT * FROM dominion WHERE world = '" + world + "' AND id > 0";
return query(sql);
}
public static List<DominionDTO> search(String name) {
String sql = "SELECT * FROM dominion WHERE name LIKE '%" + name + "%'";
String sql = "SELECT * FROM dominion WHERE name LIKE '%" + name + "%' AND id > 0";
return query(sql);
}
public static List<DominionDTO> selectAll(UUID owner) {
String sql = "SELECT * FROM dominion WHERE owner = '" + owner.toString() + "'";
String sql = "SELECT * FROM dominion WHERE owner = '" + owner.toString() + "' AND id > 0";
return query(sql);
}
public static DominionDTO select(Integer id) {
if (id == -1) {
return new DominionDTO(-1,
UUID.fromString("00000000-0000-0000-0000-000000000000"),
"根领地", "all",
-2147483648, -2147483648, -2147483648,
2147483647, 2147483647, 2147483647, -1);
}
String sql = "SELECT * FROM dominion WHERE id = " + id;
List<DominionDTO> dominions = query(sql);
if (dominions.size() == 0) return null;
return dominions.get(0);
}
public static List<DominionDTO> selectByParentId(Integer parentId) {
String sql = "SELECT * FROM dominion WHERE parent_dom_id = " + parentId;
public static List<DominionDTO> selectByParentId(String world, Integer parentId) {
String sql = "SELECT * FROM dominion WHERE world = '" + world + "' AND parent_dom_id = " + parentId + " AND id > 0";
return query(sql);
}
@ -112,12 +119,12 @@ public class DominionDTO {
String sql = "SELECT * FROM dominion WHERE world = '" + world + "' AND " +
"x1 <= " + x + " AND x2 >= " + x + " AND " +
"y1 <= " + y + " AND y2 >= " + y + " AND " +
"z1 <= " + z + " AND z2 >= " + z;
"z1 <= " + z + " AND z2 >= " + z + " AND " + "id > 0";
return query(sql);
}
public static DominionDTO select(String name) {
String sql = "SELECT * FROM dominion WHERE name = '" + name + "'";
String sql = "SELECT * FROM dominion WHERE name = '" + name + "' AND id > 0";
List<DominionDTO> dominions = query(sql);
if (dominions.size() == 0) return null;
return dominions.get(0);