Compare commits

...

70 Commits

Author SHA1 Message Date
zhangyuheng 0d714a402b 修复权限组设置tp权限无法生效的问题 2024-07-03 15:37:14 +08:00
zhangyuheng 21a5b10a97 更新表名、内部变量名,规范项目内部分命名 2024-07-03 14:51:40 +08:00
zhangyuheng e690b3f66a 新增龙蛋保护权限
Java CI-CD with Maven / build (push) Successful in 9m42s Details
2024-07-03 11:19:16 +08:00
zhangyuheng 9b94a2c5a6 优化了权限设置拦截
Java CI-CD with Maven / build (push) Successful in 10m10s Details
2024-07-01 21:08:46 +08:00
zhangyuheng 9a36ddbc06 修复了选择权限组成员时出现多个重复权限的问题 2024-07-01 21:05:36 +08:00
zhangyuheng 2f7ae111a9 修复了选择权限组成员时无法翻页的问题
Java CI-CD with Maven / build (push) Successful in 7m25s Details
2024-07-01 01:41:08 +08:00
zhangyuheng bf9aa8414c 重构了tui相关的页面逻辑代码
Java CI-CD with Maven / build (push) Successful in 29m8s Details
2024-06-30 21:25:25 +08:00
zhangyuheng 73fe76c3c7 修复权限组飞行发光设置不生效问题 2024-06-30 09:48:28 +08:00
zhangyuheng 2f8a0f2e23 新增输入内容合法性检查 2024-06-30 00:40:45 +08:00
zhangyuheng 68c6ccd5d0 优化权限组列表展示 2024-06-30 00:01:39 +08:00
zhangyuheng f4b234928a 重构部分CUI结构 2024-06-29 12:41:55 +08:00
zhangyuheng aa30f178de 优化选择成员界面副标题内容 2024-06-29 11:19:29 +08:00
zhangyuheng e2508904f4 修复了权限组相关bug,初步测试可用 2024-06-29 00:46:54 +08:00
zhangyuheng 146fa32480 实现了权限组功能(未测试) 2024-06-28 17:41:12 +08:00
zhangyuheng 27a7dea809 实现了权限组功能(未测试) 2024-06-28 17:40:51 +08:00
zhangyuheng 13c6d59b04 更新 readme
Java CI-CD with Maven / build (push) Successful in 8m41s Details
2024-06-26 16:21:02 +08:00
zhangyuheng b7b7311d5f Merge branch 'res-migration'
# Conflicts:
#	pom.xml
2024-06-26 16:20:01 +08:00
zhangyuheng 266db4850e 新增传送倒计时提示 2024-06-26 14:49:26 +08:00
zhangyuheng 3156bda387 Merge branch 'master' into res-migration
# Conflicts:
#	pom.xml
#	src/main/java/cn/lunadeer/dominion/Commands.java
#	src/main/java/cn/lunadeer/dominion/dtos/DominionDTO.java
#	src/main/java/cn/lunadeer/dominion/dtos/PlayerDTO.java
2024-06-26 10:12:24 +08:00
zhangyuheng 8196d6d225 修复了无法从residence迁移tp点的问题 2024-06-26 10:03:51 +08:00
zhangyuheng 2dfbae52cf 新增配置项,控制是否可以从residence迁移数据 2024-06-25 19:49:02 +08:00
zhangyuheng 98093f2532 初步实现了从residence迁移数据的功能 2024-06-25 17:38:28 +08:00
zhangyuheng 90245ce5b6 新增:动物生成(繁殖)、对村民造成伤害、村民繁殖,三种权限(行为)控制
Java CI-CD with Maven / build (push) Successful in 7m50s Details
2024-06-25 10:37:38 +08:00
zhangyuheng 570ea0c75c 修复没有权限仍然能打开告示牌编辑界面的问题(修复前:可以打开,但是不能编辑;修复后直接无法打开) 2024-06-25 10:15:54 +08:00
zhangyuheng 26bc618b93 修复没有权限仍然能通过床设置重生点的权限漏洞 2024-06-25 09:43:20 +08:00
zhangyuheng e33be83b07 修复在领地外仍然能触发按钮的权限漏洞 2024-06-25 09:31:48 +08:00
zhangyuheng a090ea7bf1 修复了无法修改管理员发光效果的bug
Java CI-CD with Maven / build (push) Successful in 8m38s Details
2024-06-24 13:49:46 +08:00
zhangyuheng f608041e9a 移除部分旧代码,优化import 2024-06-24 10:50:22 +08:00
zhangyuheng 9089d7ae34 Merge branch 'mysql-impl'
Java CI-CD with Maven / build (push) Successful in 8m38s Details
# Conflicts:
#	pom.xml
#	src/main/java/cn/lunadeer/dominion/Cache.java
2024-06-23 10:10:08 +08:00
zhangyuheng a568d87ff6 修复玩家修改名字时领地丢失的问题
Java CI-CD with Maven / build (push) Successful in 14m4s Details
2024-06-21 23:54:07 +08:00
zhangyuheng 17870432fe 优化领地缓存更新加载策略,提高效率 2024-06-21 15:49:40 +08:00
zhangyuheng 723ac794fe 优化成员权限缓存更新加载策略,提高效率 2024-06-21 14:57:21 +08:00
zhangyuheng 278ce8a686 优化成员权限缓存更新加载策略,提高效率 2024-06-21 14:33:21 +08:00
zhangyuheng 2f9c4cd73a 修复bukkit核心无法使用expand/contract问题 2024-06-21 10:00:07 +08:00
zhangyuheng d23c368d10 修复数据类型错误 2024-06-21 00:58:34 +08:00
zhangyuheng ea9be48c68 新增缓存计时器 2024-06-21 00:46:31 +08:00
zhangyuheng abab7967b0 优化dominion dto内容结构,将原始变量合并到Field中 2024-06-20 17:58:33 +08:00
zhangyuheng 6f0b97f458 初步实现mysql支持,初步测试了三种数据库(暂无问题) 2024-06-20 00:53:46 +08:00
zhangyuheng cac0b91734 初步实现mysql适配 2024-06-19 21:01:20 +08:00
zhangyuheng 7a6798bed1 修改dto代码适配新数据库工具库 2024-06-19 18:00:51 +08:00
zhangyuheng 268648e492 修复某些情况下无法正确hook到经济插件问题
Java CI-CD with Maven / build (push) Successful in 9m14s Details
2024-06-18 16:30:31 +08:00
zhangyuheng 03cb1af603 初步实现mysql适配,但暂时存在returning语法缺失问题 2024-06-17 17:51:43 +08:00
zhangyuheng 2299630e15 将tnt爆炸、火焰蔓延等领地独有的(非玩家行为)控制从“访客权限”移动到“环境设置”,避免歧义
Java CI-CD with Maven / build (push) Successful in 7m34s Details
2024-06-17 15:12:51 +08:00
zhangyuheng 4bd817bd84 实现了卫星地图自定义色块功能
Java CI-CD with Maven / build (push) Successful in 7m44s Details
2024-06-17 10:31:25 +08:00
zhangyuheng 7328e9aff1 优化了数据库连接方式 2024-06-14 14:17:30 +08:00
zhangyuheng 78095df43a 修复了当关闭领地传送时拥有者也无法传送的问题
Java CI-CD with Maven / build (push) Successful in 9m52s Details
2024-06-12 23:43:40 +08:00
zhangyuheng d492663e8d 修复了修改发光、飞行权限时无法立即生效只有重新进出领地才会生效的问题 2024-06-12 23:42:37 +08:00
zhangyuheng dc50603a91 新增告示牌编辑权限
Java CI-CD with Maven / build (push) Successful in 8m12s Details
2024-06-12 16:07:35 +08:00
zhangyuheng 7d28622904 修改部分菜单命名
Java CI-CD with Maven / build (push) Successful in 8m11s Details
2024-06-12 15:36:06 +08:00
zhangyuheng d28d20757b 初步实现了迁移 2024-06-12 15:08:22 +08:00
zhangyuheng 8613feda90 完善readme 2024-06-10 19:08:51 +08:00
zhangyuheng 75ba23f593 新增cui提示消息,合并bukkit适配
Java CI-CD with Maven / build (push) Successful in 14m31s Details
2024-06-09 23:48:23 +08:00
zhangyuheng e731a9023d Merge branch 'bukkit-impl'
# Conflicts:
#	pom.xml
#	src/main/java/cn/lunadeer/dominion/controllers/PrivilegeController.java
2024-06-09 21:35:55 +08:00
zhangyuheng 4c80ad292e 实现了权限模板套用功能
Java CI-CD with Maven / build (push) Successful in 8m1s Details
2024-06-08 09:35:30 +08:00
zhangyuheng ae1444c469 实现了成员权限模板界面 2024-06-07 13:11:51 +08:00
zhangyuheng dcf52b0954 修复了bukkit下消息提示报错问题 2024-06-06 13:24:06 +08:00
zhangyuheng fbd47a49af 完成了对bukkit的适配,优化了经济系统的实现方式 2024-06-06 10:49:27 +08:00
zhangyuheng 9271860511 实现了基本功能 2024-06-05 22:51:54 +08:00
zhangyuheng e7900d72cd 优化传送失败时的消息提示
Java CI-CD with Maven / build (push) Successful in 10m40s Details
2024-06-05 14:46:58 +08:00
zhangyuheng c3f4c6f502 优化尺寸输出代码 2024-06-02 23:38:23 +08:00
zhangyuheng 9b7917aa14 修复了选区价格和创建价格不符问题、修复了玩家重新上线时飞行权限不生效问题
Java CI-CD with Maven / build (push) Successful in 13m14s Details
2024-06-02 23:18:13 +08:00
zhangyuheng 7b4d26970b 修复了创建领地失败,提示数据库错误的问题。
Java CI-CD with Maven / build (push) Successful in 13m3s Details
2024-06-02 17:01:54 +08:00
zhangyuheng 08d6e93e7e 优化了错误处理框架 2024-06-01 12:39:00 +08:00
zhangyuheng c30e5d9d66 领地提示语新增支持占位符
Java CI-CD with Maven / build (push) Successful in 6m41s Details
2024-06-01 09:59:55 +08:00
zhangyuheng a8e36f4759 新增玩家名字排序
Java CI-CD with Maven / build (push) Successful in 10m56s Details
2024-05-31 21:29:11 +08:00
zhangyuheng 5d614d4760 修复了操作领地时自动选择领地失败问题
Java CI-CD with Maven / build (push) Successful in 12m11s Details
2024-05-31 21:03:00 +08:00
zhangyuheng a34cc43cbf 实现了对权限列表的排序
Java CI-CD with Maven / build (push) Successful in 10m0s Details
2024-05-31 20:47:50 +08:00
zhangyuheng 6666fb6131 优化了数据表的生成方式
Java CI-CD with Maven / build (push) Successful in 1h11m11s Details
2024-05-31 17:30:08 +08:00
zhangyuheng 31ba268f2f 新增flags json序列化 2024-05-30 18:20:40 +08:00
zhangyuheng 5c3e0d847b 新增所有领地界面、成员新增tag便于标识身份
Java CI-CD with Maven / build (push) Successful in 8m37s Details
2024-05-30 10:07:22 +08:00
80 changed files with 4869 additions and 1844 deletions

View File

@ -8,6 +8,8 @@
### [统计页面](https://bstats.org/plugin/bukkit/Dominion/21445) | [Hangar](https://hangar.papermc.io/zhangyuheng/Dominion)
[![CodeFactor](https://www.codefactor.io/repository/github/deergiteamirror/dominion/badge/master)](https://www.codefactor.io/repository/github/deergiteamirror/dominion/overview/master)
</div>
## 简介
@ -28,15 +30,16 @@
## 功能介绍
- 支持 Postgresql 或 sqlite 存储数据;
- 支持 Postgresql、Mysql、Sqlite3 存储数据;
- 支持BlueMap卫星地图渲染
- 支持为玩家单独设置特权;
- 支持设置领地管理员;
- 支持子领地;
- 采用 TUI 方式进行权限配置交互,简单快捷;
- 支持基础价格系统
- 支持经济系统(需要 Vault 前置)
- 领地区域可视化;
- 管理员可在游戏内使用TUI配置领地系统
- 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据1.33.7+
<div style="text-align: center;">
@ -57,7 +60,7 @@
## 支持版本
- 1.20.1+ (Paper、Folia)
- 1.20.1+ (Bukkit、Spigot、Paper、Folia)
## TODO

11
pom.xml
View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId>
<version>1.30.5-beta</version>
<version>1.35.0-beta</version>
<packaging>jar</packaging>
<name>Dominion</name>
@ -82,7 +82,7 @@
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>MinecraftPluginUtils</artifactId>
<version>1.3.0-SNAPSHOT</version>
<version>1.3.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.github.BlueMap-Minecraft</groupId>
@ -91,10 +91,9 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<scope>provided</scope>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
</project>

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger;
import com.flowpowered.math.vector.Vector2d;
import de.bluecolored.bluemap.api.BlueMapAPI;
@ -17,112 +18,116 @@ public class BlueMapConnect {
if (!Dominion.config.getBlueMap()) {
return;
}
try {
BlueMapAPI.getInstance().ifPresent(api -> {
Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
for (DominionDTO dominion : Cache.instance.getDominions()) {
if (!world_dominions.containsKey(dominion.getWorld())) {
world_dominions.put(dominion.getWorld(), new ArrayList<>());
Scheduler.runTaskAsync(() -> {
try {
BlueMapAPI.getInstance().ifPresent(api -> {
Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
for (DominionDTO dominion : Cache.instance.getDominions()) {
if (!world_dominions.containsKey(dominion.getWorld())) {
world_dominions.put(dominion.getWorld(), new ArrayList<>());
}
world_dominions.get(dominion.getWorld()).add(dominion);
}
world_dominions.get(dominion.getWorld()).add(dominion);
}
for (Map.Entry<String, List<DominionDTO>> d : world_dominions.entrySet()) {
api.getWorld(d.getKey()).ifPresent(world -> {
MarkerSet markerSet = MarkerSet.builder()
.label("Dominion")
.build();
for (DominionDTO dominion : d.getValue()) {
Collection<Vector2d> vectors = new ArrayList<>();
vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ1() + 0.001));
vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ1() + 0.001));
vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ2() - 0.001));
vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ2() - 0.001));
Shape shape = new Shape(vectors);
double x = vectors.iterator().next().getX();
double z = vectors.iterator().next().getY();
double y = dominion.getY1();
Color line = new Color(0, 191, 255, 0.8F);
Color fill = new Color(0, 191, 255, 0.2F);
if (dominion.getParentDomId() != -1) { // for children dominion
line = new Color(240, 230, 140, 0.8F);
fill = new Color(240, 230, 140, 0.2F);
}
ExtrudeMarker marker = ExtrudeMarker.builder()
.label(dominion.getName())
.position(x, y, z)
.shape(shape, dominion.getY1() + 0.001f, dominion.getY2() - 0.001f)
.lineColor(line)
.fillColor(fill)
for (Map.Entry<String, List<DominionDTO>> d : world_dominions.entrySet()) {
api.getWorld(d.getKey()).ifPresent(world -> {
MarkerSet markerSet = MarkerSet.builder()
.label("Dominion")
.build();
markerSet.getMarkers()
.put(dominion.getName(), marker);
}
for (BlueMapMap map : world.getMaps()) {
map.getMarkerSets().put(d.getKey() + "-" + markerSet.getLabel(), markerSet);
}
});
}
});
} catch (NoClassDefFoundError e) {
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。");
XLogger.err(e.getMessage());
}
for (DominionDTO dominion : d.getValue()) {
Collection<Vector2d> vectors = new ArrayList<>();
vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ1() + 0.001));
vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ1() + 0.001));
vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ2() - 0.001));
vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ2() - 0.001));
Shape shape = new Shape(vectors);
double x = vectors.iterator().next().getX();
double z = vectors.iterator().next().getY();
double y = dominion.getY1();
int r = dominion.getColorR();
int g = dominion.getColorG();
int b = dominion.getColorB();
Color line = new Color(r, g, b, 0.8F);
Color fill = new Color(r, g, b, 0.2F);
ExtrudeMarker marker = ExtrudeMarker.builder()
.label(dominion.getName())
.position(x, y, z)
.shape(shape, dominion.getY1() + 0.001f, dominion.getY2() - 0.001f)
.lineColor(line)
.fillColor(fill)
.build();
markerSet.getMarkers()
.put(dominion.getName(), marker);
}
for (BlueMapMap map : world.getMaps()) {
map.getMarkerSets().put(d.getKey() + "-" + markerSet.getLabel(), markerSet);
}
});
}
});
} catch (NoClassDefFoundError e) {
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。");
XLogger.err(e.getMessage());
}
});
}
public static void renderMCA(Map<String, List<String>> mca_files) {
if (!Dominion.config.getBlueMap()) {
return;
}
try {
BlueMapAPI.getInstance().ifPresent(api -> {
for (String world : mca_files.keySet()) {
api.getWorld(world).ifPresent(bmWorld -> {
MarkerSet markerSet = MarkerSet.builder()
.label("MCA")
.defaultHidden(true)
.build();
for (String file : mca_files.get(world)) {
// r.-1.-1.mca
int mca_x = Integer.parseInt(file.split("\\.")[1]);
int mca_z = Integer.parseInt(file.split("\\.")[2]);
int world_x1 = mca_x * 512;
int world_x2 = (mca_x + 1) * 512;
int world_z1 = mca_z * 512;
int world_z2 = (mca_z + 1) * 512;
Collection<Vector2d> vectors = new ArrayList<>();
vectors.add(new Vector2d(world_x1 + 0.001, world_z1 + 0.001));
vectors.add(new Vector2d(world_x2 - 0.001, world_z1 + 0.001));
vectors.add(new Vector2d(world_x2 - 0.001, world_z2 - 0.001));
vectors.add(new Vector2d(world_x1 + 0.001, world_z2 - 0.001));
Shape shape = new Shape(vectors);
double x = vectors.iterator().next().getX();
double z = vectors.iterator().next().getY();
double y = -64;
Color line = new Color(0, 204, 0, 0.8F);
Color fill = new Color(0, 204, 0, 0.2F);
ExtrudeMarker marker = ExtrudeMarker.builder()
.label(file)
.position(x, y, z)
.shape(shape, -64, 320)
.lineColor(line)
.fillColor(fill)
Scheduler.runTaskAsync(() -> {
try {
BlueMapAPI.getInstance().ifPresent(api -> {
for (String world : mca_files.keySet()) {
api.getWorld(world).ifPresent(bmWorld -> {
MarkerSet markerSet = MarkerSet.builder()
.label("MCA")
.defaultHidden(true)
.build();
markerSet.getMarkers()
.put(file, marker);
}
for (BlueMapMap map : bmWorld.getMaps()) {
map.getMarkerSets().put(world + "-" + markerSet.getLabel(), markerSet);
}
});
}
});
} catch (NoClassDefFoundError e) {
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。");
XLogger.err(e.getMessage());
}
for (String file : mca_files.get(world)) {
// r.-1.-1.mca
int mca_x = Integer.parseInt(file.split("\\.")[1]);
int mca_z = Integer.parseInt(file.split("\\.")[2]);
int world_x1 = mca_x * 512;
int world_x2 = (mca_x + 1) * 512;
int world_z1 = mca_z * 512;
int world_z2 = (mca_z + 1) * 512;
Collection<Vector2d> vectors = new ArrayList<>();
vectors.add(new Vector2d(world_x1 + 0.001, world_z1 + 0.001));
vectors.add(new Vector2d(world_x2 - 0.001, world_z1 + 0.001));
vectors.add(new Vector2d(world_x2 - 0.001, world_z2 - 0.001));
vectors.add(new Vector2d(world_x1 + 0.001, world_z2 - 0.001));
Shape shape = new Shape(vectors);
double x = vectors.iterator().next().getX();
double z = vectors.iterator().next().getY();
double y = -64;
Color line = new Color(0, 204, 0, 0.8F);
Color fill = new Color(0, 204, 0, 0.2F);
ExtrudeMarker marker = ExtrudeMarker.builder()
.label(file)
.position(x, y, z)
.shape(shape, -64, 320)
.lineColor(line)
.fillColor(fill)
.build();
markerSet.getMarkers()
.put(file, marker);
}
for (BlueMapMap map : bmWorld.getMaps()) {
map.getMarkerSets().put(world + "-" + markerSet.getLabel(), markerSet);
}
});
}
});
} catch (NoClassDefFoundError e) {
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。");
XLogger.err(e.getMessage());
}
});
}
}

View File

@ -1,13 +1,11 @@
package cn.lunadeer.dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.ParticleRender;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger;
import net.kyori.adventure.text.Component;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@ -26,16 +24,20 @@ public class Cache {
public Cache() {
player_current_dominion_id = new HashMap<>();
loadDominions();
loadPlayerPrivileges();
loadMembers();
loadGroups();
}
/**
* 从数据库加载所有领地
* 如果idToLoad为null则加载所有领地
*
* @param idToLoad 领地ID
*/
public void loadDominions() {
public void loadDominions(Integer idToLoad) {
if (_last_update_dominion.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadDominionsExecution directly");
loadDominionsExecution();
loadDominionsExecution(idToLoad);
} else {
if (_update_dominion_is_scheduled.get()) return;
XLogger.debug("schedule loadDominionsExecution");
@ -43,70 +45,158 @@ public class Cache {
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get())) / 1000 * 20L;
Scheduler.runTaskLaterAsync(() -> {
XLogger.debug("run loadDominionsExecution scheduled");
loadDominionsExecution();
loadDominionsExecution(idToLoad);
_update_dominion_is_scheduled.set(false);
},
delay_tick);
}
}
private void loadDominionsExecution() {
id_dominions = new ConcurrentHashMap<>();
world_dominion_tree = new ConcurrentHashMap<>();
dominion_children = new ConcurrentHashMap<>();
List<DominionDTO> dominions = DominionDTO.selectAll();
Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
for (DominionDTO d : dominions) {
if (!world_dominions.containsKey(d.getWorld())) {
world_dominions.put(d.getWorld(), new ArrayList<>());
public void loadDominions() {
loadDominions(null);
}
private void loadDominionsExecution(Integer idToLoad) {
Scheduler.runTaskAsync(() -> {
long start = System.currentTimeMillis();
int count = 0;
if (idToLoad == null) {
id_dominions = new ConcurrentHashMap<>();
world_dominion_tree = new ConcurrentHashMap<>();
dominion_children = new ConcurrentHashMap<>();
List<DominionDTO> dominions = DominionDTO.selectAll();
count = dominions.size();
Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
for (DominionDTO d : dominions) {
if (!world_dominions.containsKey(d.getWorld())) {
world_dominions.put(d.getWorld(), new ArrayList<>());
}
world_dominions.get(d.getWorld()).add(d);
id_dominions.put(d.getId(), d);
if (!dominion_children.containsKey(d.getParentDomId())) {
dominion_children.put(d.getParentDomId(), new ArrayList<>());
}
dominion_children.get(d.getParentDomId()).add(d.getId());
}
for (Map.Entry<String, List<DominionDTO>> entry : world_dominions.entrySet()) {
world_dominion_tree.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue()));
}
} else {
DominionDTO dominion = DominionDTO.select(idToLoad);
if (dominion == null && id_dominions.containsKey(idToLoad)) {
id_dominions.remove(idToLoad);
} else if (dominion != null) {
id_dominions.put(idToLoad, dominion);
count = 1;
}
}
world_dominions.get(d.getWorld()).add(d);
id_dominions.put(d.getId(), d);
if (!dominion_children.containsKey(d.getParentDomId())) {
dominion_children.put(d.getParentDomId(), new ArrayList<>());
}
dominion_children.get(d.getParentDomId()).add(d.getId());
}
for (Map.Entry<String, List<DominionDTO>> entry : world_dominions.entrySet()) {
world_dominion_tree.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue()));
}
BlueMapConnect.render();
_last_update_dominion.set(System.currentTimeMillis());
BlueMapConnect.render();
recheckPlayerState = true;
_last_update_dominion.set(System.currentTimeMillis());
XLogger.debug("loadDominionsExecution cost: %d ms for %d dominions"
, System.currentTimeMillis() - start, count);
});
}
/**
* 从数据库加载所有玩家特权
* 如果player_uuid为null则加载所有玩家的特权
*
* @param player_uuid 玩家UUID
*/
public void loadPlayerPrivileges() {
if (_last_update_privilege.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
loadPlayerPrivilegesExecution();
public void loadMembers(UUID player_uuid) {
if (_last_update_member.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadMembersExecution directly");
loadMembersExecution(player_uuid);
} else {
if (_update_privilege_is_scheduled.get()) return;
_update_privilege_is_scheduled.set(true);
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get())) / 1000 * 20L;
if (_update_member_is_scheduled.get()) return;
XLogger.debug("schedule loadMembersExecution");
_update_member_is_scheduled.set(true);
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_member.get())) / 1000 * 20L;
Scheduler.runTaskLaterAsync(() -> {
loadPlayerPrivilegesExecution();
_update_privilege_is_scheduled.set(false);
XLogger.debug("run loadMembersExecution scheduled");
loadMembersExecution(player_uuid);
_update_member_is_scheduled.set(false);
},
delay_tick);
}
}
private void loadPlayerPrivilegesExecution() {
List<PlayerPrivilegeDTO> all_privileges = PlayerPrivilegeDTO.selectAll();
if (all_privileges == null) {
XLogger.err("加载玩家特权失败");
return;
}
player_uuid_to_privilege = new ConcurrentHashMap<>();
for (PlayerPrivilegeDTO privilege : all_privileges) {
UUID player_uuid = privilege.getPlayerUUID();
if (!player_uuid_to_privilege.containsKey(player_uuid)) {
player_uuid_to_privilege.put(player_uuid, new ConcurrentHashMap<>());
public void loadMembers() {
loadMembers(null);
}
private void loadMembersExecution(UUID player_to_update) {
Scheduler.runTaskAsync(() -> {
long start = System.currentTimeMillis();
List<MemberDTO> all_privileges;
if (player_to_update == null) {
all_privileges = MemberDTO.selectAll();
player_uuid_to_member = new ConcurrentHashMap<>();
} else {
all_privileges = MemberDTO.selectAll(player_to_update);
if (!player_uuid_to_member.containsKey(player_to_update)) {
player_uuid_to_member.put(player_to_update, new ConcurrentHashMap<>());
}
player_uuid_to_member.get(player_to_update).clear();
}
player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege);
for (MemberDTO privilege : all_privileges) {
UUID player_uuid = privilege.getPlayerUUID();
if (!player_uuid_to_member.containsKey(player_uuid)) {
player_uuid_to_member.put(player_uuid, new ConcurrentHashMap<>());
}
player_uuid_to_member.get(player_uuid).put(privilege.getDomID(), privilege);
}
recheckPlayerState = true;
_last_update_member.set(System.currentTimeMillis());
XLogger.debug("loadMembersExecution cost: %d ms for %d privileges"
, System.currentTimeMillis() - start, all_privileges.size());
});
}
public void loadGroups() {
loadGroups(null);
}
public void loadGroups(Integer groupId) {
if (_last_update_group.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadGroupsExecution directly");
loadGroupExecution(groupId);
} else {
if (_update_group_is_scheduled.get()) return;
XLogger.debug("schedule loadGroupsExecution");
_update_group_is_scheduled.set(true);
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_group.get())) / 1000 * 20L;
Scheduler.runTaskLaterAsync(() -> {
XLogger.debug("run loadGroupsExecution scheduled");
loadGroupExecution(groupId);
_update_group_is_scheduled.set(false);
},
delay_tick);
}
_last_update_privilege.set(System.currentTimeMillis());
}
private void loadGroupExecution(Integer groupId) {
Scheduler.runTaskAsync(() -> {
long start = System.currentTimeMillis();
if (groupId == null) {
id_groups = new ConcurrentHashMap<>();
List<GroupDTO> groups = GroupDTO.selectAll();
for (GroupDTO group : groups) {
id_groups.put(group.getId(), group);
}
} else {
GroupDTO group = GroupDTO.select(groupId);
if (group == null && id_groups.containsKey(groupId)) {
id_groups.remove(groupId);
} else if (group != null) {
id_groups.put(groupId, group);
}
}
recheckPlayerState = true;
_last_update_group.set(System.currentTimeMillis());
XLogger.debug("loadGroupsExecution cost: %d ms", System.currentTimeMillis() - start);
});
}
/**
@ -125,8 +215,13 @@ public class Cache {
last_dominion = id_dominions.get(last_in_dom_id);
}
if (isInDominion(last_dominion, player)) {
if (dominion_children.get(last_in_dom_id) == null) {
if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).size() == 0) {
// 如果玩家仍在领地内且领地没有子领地则直接返回
if (recheckPlayerState) {
lightOrNot(player, last_dominion);
flyOrNot(player, last_dominion);
recheckPlayerState = false;
}
return last_dominion;
}
}
@ -137,18 +232,14 @@ public class Cache {
return last_dominion;
}
if (last_dom_id != -1) {
// if (last_dominion.getParentDomId() == -1)
// Notification.info(player, "您已离开领地:%s", last_dominion.getName());
// else
// Notification.info(player, "您已离开子领地:%s", last_dominion.getName());
player.sendActionBar(Component.text(last_dominion.getLeaveMessage()));
String msg = last_dominion.getLeaveMessage();
msg = msg.replace("${DOM_NAME}", last_dominion.getName());
Notification.actionBar(player, msg);
}
if (current_dom_id != -1) {
// if (current_dominion.getParentDomId() == -1)
// Notification.info(player, "您正在进入领地:%s", current_dominion.getName());
// else
// Notification.info(player, "您正在进入子领地:%s", current_dominion.getName());
player.sendActionBar(Component.text(current_dominion.getJoinMessage()));
String msg = current_dominion.getJoinMessage();
msg = msg.replace("${DOM_NAME}", current_dominion.getName());
Notification.actionBar(player, msg);
}
lightOrNot(player, current_dominion); // 发光检查
@ -167,6 +258,17 @@ public class Cache {
return current_dominion;
}
/**
* 玩家退出时调用 用于清除玩家当前所在领地
* 会将玩家当前所在领地设置为null
* 这样当玩家下次进入领地时会重新检查玩家所在位置
*
* @param player 玩家
*/
public void onPlayerQuit(Player player) {
player_current_dominion_id.put(player.getUniqueId(), null);
}
/**
* 检查玩家是否需要设置为发光
*
@ -181,9 +283,18 @@ public class Cache {
player.setGlowing(false);
return;
}
PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion);
MemberDTO privilege = getMember(player, dominion);
if (privilege != null) {
player.setGlowing(privilege.getFlagValue(Flag.GLOW));
if (privilege.getGroupId() == -1) {
player.setGlowing(privilege.getFlagValue(Flag.GLOW));
} else {
GroupDTO group = getGroup(privilege.getGroupId());
if (group != null) {
player.setGlowing(group.getFlagValue(Flag.GLOW));
} else {
player.setGlowing(dominion.getFlagValue(Flag.GLOW));
}
}
} else {
player.setGlowing(dominion.getFlagValue(Flag.GLOW));
}
@ -209,9 +320,18 @@ public class Cache {
player.setAllowFlight(false);
return;
}
PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion);
MemberDTO privilege = getMember(player, dominion);
if (privilege != null) {
player.setAllowFlight(privilege.getFlagValue(Flag.FLY));
if (privilege.getGroupId() == -1) {
player.setAllowFlight(privilege.getFlagValue(Flag.FLY));
} else {
GroupDTO group = getGroup(privilege.getGroupId());
if (group != null) {
player.setAllowFlight(group.getFlagValue(Flag.FLY));
} else {
player.setAllowFlight(dominion.getFlagValue(Flag.FLY));
}
}
} else {
player.setAllowFlight(dominion.getFlagValue(Flag.FLY));
}
@ -227,7 +347,7 @@ public class Cache {
if (player == null) return dominionTree;
for (List<DominionNode> tree : world_dominion_tree.values()) {
for (DominionNode node : tree) {
if (node.dominion.getOwner().equals(player.getUuid())) {
if (node.getDominion().getOwner().equals(player.getUuid())) {
dominionTree.add(node);
}
}
@ -235,6 +355,18 @@ public class Cache {
return dominionTree;
}
public List<DominionNode> getAllDominionTree() {
List<DominionNode> dominionTree = new ArrayList<>();
for (List<DominionNode> tree : world_dominion_tree.values()) {
dominionTree.addAll(tree);
}
return dominionTree;
}
public GroupDTO getGroup(Integer id) {
return id_groups.get(id);
}
/**
* 获取玩家在指定领地的特权
* 如果玩家不存在特权则返回null
@ -243,14 +375,14 @@ public class Cache {
* @param dominion 领地
* @return 特权表
*/
public PlayerPrivilegeDTO getPlayerPrivilege(Player player, DominionDTO dominion) {
if (!player_uuid_to_privilege.containsKey(player.getUniqueId())) return null;
return player_uuid_to_privilege.get(player.getUniqueId()).get(dominion.getId());
public MemberDTO getMember(Player player, DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null;
return player_uuid_to_member.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());
public MemberDTO getMember(UUID player_uuid, DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player_uuid)) return null;
return player_uuid_to_member.get(player_uuid).get(dominion.getId());
}
private static boolean isInDominion(@Nullable DominionDTO dominion, Player player) {
@ -278,6 +410,25 @@ public class Cache {
return count;
}
public List<ResMigration.ResidenceNode> getResidenceData(UUID player_uuid) {
if (residence_data == null) {
residence_data = new HashMap<>();
List<ResMigration.ResidenceNode> residences = ResMigration.extractFromResidence(Dominion.instance);
for (ResMigration.ResidenceNode node : residences) {
if (node == null) {
continue;
}
if (!residence_data.containsKey(node.owner)) {
XLogger.debug("residence_data put %s", node.owner);
residence_data.put(node.owner, new ArrayList<>());
}
residence_data.get(node.owner).add(node);
}
XLogger.debug("residence_data: %d", residence_data.size());
}
return residence_data.get(player_uuid);
}
public List<DominionDTO> getDominions() {
return new ArrayList<>(id_dominions.values());
}
@ -285,14 +436,19 @@ public class Cache {
public static Cache instance;
private ConcurrentHashMap<Integer, DominionDTO> id_dominions;
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree;
private ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, PlayerPrivilegeDTO>> player_uuid_to_privilege; // 玩家所有的特权
private ConcurrentHashMap<Integer, GroupDTO> id_groups;
private ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, MemberDTO>> player_uuid_to_member; // 玩家所有的特权
private final Map<UUID, Integer> player_current_dominion_id; // 玩家当前所在领地
private ConcurrentHashMap<Integer, List<Integer>> dominion_children;
private final AtomicLong _last_update_dominion = new AtomicLong(0);
private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false);
private final AtomicLong _last_update_privilege = new AtomicLong(0);
private final AtomicBoolean _update_privilege_is_scheduled = new AtomicBoolean(false);
private final AtomicLong _last_update_member = new AtomicLong(0);
private final AtomicBoolean _update_member_is_scheduled = new AtomicBoolean(false);
private final AtomicLong _last_update_group = new AtomicLong(0);
private final AtomicBoolean _update_group_is_scheduled = new AtomicBoolean(false);
private static final long UPDATE_INTERVAL = 1000 * 4;
private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态发光飞行
public final Map<UUID, LocalDateTime> NextTimeAllowTeleport = new java.util.HashMap<>();
private Map<UUID, List<ResMigration.ResidenceNode>> residence_data = null;
}

View File

@ -2,8 +2,17 @@ package cn.lunadeer.dominion;
import cn.lunadeer.dominion.commands.*;
import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.cuis.*;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.tuis.*;
import cn.lunadeer.dominion.tuis.AllDominion;
import cn.lunadeer.dominion.tuis.Menu;
import cn.lunadeer.dominion.tuis.MigrateList;
import cn.lunadeer.dominion.tuis.SysConfig;
import cn.lunadeer.dominion.tuis.dominion.DominionList;
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.SizeInfo;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
@ -18,24 +27,6 @@ import java.util.List;
import static cn.lunadeer.dominion.commands.Helper.*;
public class Commands implements TabExecutor {
/*
创建领地 /dominion create <领地名称>
自动创建领地 /dominion auto_create <领地名称>
创建子领地 /dominion create_sub <子领地名称> [父领地名称]
自动创建子领地 /dominion auto_create_sub <子领地名称> [父领地名称]
扩张领地 /dominion expand [大小] [领地名称]
缩小领地 /dominion contract [大小] [领地名称]
删除领地 /dominion delete <领地名称> [force]
设置领地权限 /dominion set <权限名称> <true/false> [领地名称]
设置玩家权限 /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]
重置玩家权限 /dominion clear_privilege <玩家名称> [领地名称]
创建权限组 /dominion create_group <权限组名称>
删除权限组 /dominion delete_group <权限组名称>
设置权限组权限 /dominion set_group <权限组名称> <权限名称> <true/false>
设置玩家在某个领地归属的权限组 /dominion add_player <玩家名称> <权限组名称> [领地名称]
删除玩家在某个领地归属的权限组 /dominion remove_player <玩家名称> <权限组名称> [领地名称]
*/
/**
* Executes the given command, returning its success.
@ -60,19 +51,19 @@ public class Commands implements TabExecutor {
Menu.show(sender, args);
break;
case "list":
ListDominion.show(sender, args);
DominionList.show(sender, args);
break;
case "help":
cn.lunadeer.dominion.tuis.Apis.printHelp(sender, args);
break;
case "info":
DominionSizeInfo.show(sender, args);
SizeInfo.show(sender, args);
break;
case "manage":
DominionManage.show(sender, args);
break;
case "flag_info":
DominionFlagInfo.show(sender, args);
case "guest_setting":
GuestSetting.show(sender, args);
break;
case "create":
DominionOperate.createDominion(sender, args);
@ -98,24 +89,6 @@ public class Commands implements TabExecutor {
case "set":
DominionFlag.setDominionFlag(sender, args);
break;
case "create_privilege":
PlayerPrivilege.createPlayerPrivilege(sender, args);
break;
case "set_privilege":
PlayerPrivilege.setPlayerPrivilege(sender, args);
break;
case "clear_privilege":
PlayerPrivilege.clearPlayerPrivilege(sender, args);
break;
case "privilege_list":
DominionPrivilegeList.show(sender, args);
break;
case "privilege_info":
PrivilegeInfo.show(sender, args);
break;
case "select_player_create_privilege":
SelectPlayer.show(sender, args);
break;
case "set_enter_msg":
DominionOperate.setEnterMessage(sender, args);
break;
@ -143,27 +116,64 @@ public class Commands implements TabExecutor {
case "export_mca":
Operator.exportMca(sender, args);
break;
case "config":
DominionConfig.show(sender, args);
case "sys_config":
SysConfig.show(sender, args);
break;
case "set_config":
SetConfig.handler(sender, args);
break;
case "all_dominion":
AllDominion.show(sender, args);
break;
case "migrate_list":
MigrateList.show(sender, args);
break;
case "migrate":
Migration.migrate(sender, args);
break;
case "set_map_color":
DominionOperate.setMapColor(sender, args);
break;
case "env_setting":
EnvSetting.show(sender, args);
break;
// ---=== Sub Command ===---
case "member":
Member.handle(sender, args);
break;
case "group":
Group.handle(sender, args);
break;
case "template":
Template.handle(sender, args);
break;
// ---=== CUI ===---
case "cui_rename":
OpenCUI.RenameDominion(sender, args);
RenameDominion.open(sender, args);
break;
case "cui_edit_join_message":
OpenCUI.EditJoinMessage(sender, args);
EditJoinMessage.open(sender, args);
break;
case "cui_edit_leave_message":
OpenCUI.EditLeaveMessage(sender, args);
EditLeaveMessage.open(sender, args);
break;
case "cui_create":
OpenCUI.CreateDominion(sender, args);
CreateDominion.open(sender, args);
break;
case "cui_create_privilege":
OpenCUI.CreatePrivilege(sender, args);
case "cui_member_add":
MemberAdd.open(sender, args);
break;
case "cui_template_create":
CreateTemplate.open(sender, args);
break;
case "cui_set_map_color":
SetMapColor.open(sender, args);
break;
case "cui_create_group":
CreateGroup.open(sender, args);
break;
case "cui_rename_group":
RenameGroup.open(sender, args);
break;
default:
return false;
@ -187,9 +197,8 @@ public class Commands implements TabExecutor {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (args.length == 1) {
return Arrays.asList("menu", "help", "info", "manage", "flag_info", "privilege_list",
return Arrays.asList("menu", "help", "info", "manage", "guest_setting",
"create", "auto_create", "create_sub", "auto_create_sub", "expand", "contract", "delete", "set",
"create_privilege", "set_privilege", "clear_privilege", "list", "privilege_info",
"set_enter_msg",
"set_leave_msg",
"set_tp_location",
@ -199,23 +208,35 @@ public class Commands implements TabExecutor {
"reload_cache",
"reload_config",
"export_mca",
"config"
"sys_config",
"all_dominion",
"set_map_color",
"member",
"group",
"template"
);
}
if (args.length > 1 && args[0].equals("member")) {
return Member.handleTab(sender, args);
}
if (args.length > 1 && args[0].equals("group")) {
return Group.handleTab(sender, args);
}
if (args.length > 1 && args[0].equals("template")) {
return Template.handleTab(sender, args);
}
if (args.length == 2) {
switch (args[0]) {
case "help":
case "list":
case "config":
return Collections.singletonList("页码(可选)");
case "sys_config":
case "create":
case "auto_create":
return Collections.singletonList("输入领地名称");
case "delete":
case "info":
case "manage":
case "flag_info":
case "privilege_list":
case "guest_setting":
case "rename":
case "give":
case "set_tp_location":
@ -224,11 +245,6 @@ public class Commands implements TabExecutor {
return allDominions();
case "set":
return dominionFlags();
case "create_privilege":
case "set_privilege":
case "clear_privilege":
case "privilege_info":
return playerNames();
case "expand":
case "contract":
return Collections.singletonList("大小(整数)");
@ -239,23 +255,21 @@ public class Commands implements TabExecutor {
return Collections.singletonList("进入提示语内容");
case "set_leave_msg":
return Collections.singletonList("离开提示语内容");
case "set_map_color":
return Collections.singletonList("输入颜色(16进制)");
}
}
if (args.length == 3) {
switch (args[0]) {
case "set":
return boolOptions();
case "set_privilege":
return playerPrivileges();
case "expand":
case "contract":
case "clear_privilege":
case "create_privilege":
case "privilege_info":
case "auto_create_sub":
case "create_sub":
case "set_enter_msg":
case "set_leave_msg":
case "set_map_color":
return playerDominions(sender);
case "rename":
return Collections.singletonList("输入新领地名称");
@ -267,18 +281,16 @@ public class Commands implements TabExecutor {
switch (args[0]) {
case "set":
return playerDominions(sender);
case "set_privilege":
return boolOptions();
}
}
return null;
}
private static List<String> boolOptions() {
public static List<String> boolOptions() {
return Arrays.asList("true", "false");
}
private static List<String> playerNames() {
public static List<String> playerNames() {
List<PlayerDTO> players = PlayerController.allPlayers();
List<String> names = new ArrayList<>();
for (PlayerDTO player : players) {

View File

@ -6,6 +6,8 @@ import cn.lunadeer.dominion.events.SelectPointEvents;
import cn.lunadeer.dominion.managers.ConfigManager;
import cn.lunadeer.dominion.managers.DatabaseTables;
import cn.lunadeer.minecraftpluginutils.*;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseType;
import cn.lunadeer.minecraftpluginutils.scui.CuiManager;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -26,8 +28,8 @@ public final class Dominion extends JavaPlugin {
new XLogger(this);
config = new ConfigManager(this);
XLogger.setDebug(config.isDebug());
database = new DatabaseManager(this,
config.getDbType().equals("pgsql") ? DatabaseManager.TYPE.POSTGRESQL : DatabaseManager.TYPE.SQLITE,
new DatabaseManager(this,
DatabaseType.valueOf(config.getDbType().toUpperCase()),
config.getDbHost(),
config.getDbPort(),
config.getDbName(),
@ -37,13 +39,8 @@ public final class Dominion extends JavaPlugin {
new Scheduler(this);
AutoClean.run();
Cache.instance = new Cache();
if (config.getEconomyEnable()) {
vault = new VaultConnect(this);
if (vault.getEconomy() == null) {
XLogger.err("你没有安装 Vault 前置插件,无法使用经济功能。");
config.setEconomyEnable(false);
}
new VaultConnect(this);
}
Bukkit.getPluginManager().registerEvents(new PlayerEvents(), this);
@ -63,7 +60,7 @@ public final class Dominion extends JavaPlugin {
Bukkit.getPluginManager().registerEvents(new CuiManager(this), this);
XLogger.info("领地插件已启动");
XLogger.info("版本:" + this.getPluginMeta().getVersion());
XLogger.info("版本:" + this.getDescription().getVersion());
// http://patorjk.com/software/taag/#p=display&f=Big&t=Dominion
XLogger.info(" _____ _ _");
XLogger.info(" | __ \\ (_) (_)");
@ -79,12 +76,11 @@ public final class Dominion extends JavaPlugin {
@Override
public void onDisable() {
// Plugin shutdown logic
DatabaseManager.instance.close();
}
public static Dominion instance;
public static ConfigManager config;
public static DatabaseManager database;
public static Map<UUID, Map<Integer, Location>> pointsSelect = new HashMap<>();
private GiteaReleaseCheck giteaReleaseCheck;
public static VaultConnect vault;
}

View File

@ -5,30 +5,52 @@ import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.*;
public class DominionNode {
public DominionDTO dominion;
public List<DominionNode> children = new ArrayList<>();
private Integer dominion_id;
private List<DominionNode> children = new ArrayList<>();
public DominionDTO getDominion() {
return Cache.instance.getDominion(dominion_id);
}
public List<DominionNode> getChildren() {
return children;
}
public static List<DominionNode> BuildNodeTree(Integer rootId, List<DominionDTO> dominions) {
List<DominionNode> dominionTree = new ArrayList<>();
// 映射父节点ID到其子节点列表
Map<Integer, List<DominionDTO>> parentToChildrenMap = new HashMap<>();
for (DominionDTO dominion : dominions) {
if (Objects.equals(dominion.getParentDomId(), rootId)) {
parentToChildrenMap
.computeIfAbsent(dominion.getParentDomId(), k -> new ArrayList<>())
.add(dominion);
}
// 递归构建节点树
return buildTree(rootId, parentToChildrenMap);
}
private static List<DominionNode> buildTree(Integer rootId, Map<Integer, List<DominionDTO>> parentToChildrenMap) {
List<DominionNode> dominionTree = new ArrayList<>();
List<DominionDTO> children = parentToChildrenMap.get(rootId);
if (children != null) {
for (DominionDTO dominion : children) {
DominionNode node = new DominionNode();
node.dominion = dominion;
node.children = BuildNodeTree(dominion.getId(), dominions);
node.dominion_id = dominion.getId();
node.children = buildTree(dominion.getId(), parentToChildrenMap);
dominionTree.add(node);
}
}
return dominionTree;
}
public static DominionNode getLocInDominionNode(@NotNull List<DominionNode> nodes, @NotNull Location loc) {
for (DominionNode node : nodes) {
if (isInDominion(node.dominion, loc)) {
if (isInDominion(node.getDominion(), loc)) {
if (node.children.isEmpty()) {
return node;
} else {
@ -48,7 +70,7 @@ public class DominionNode {
if (nodes == null) return null;
if (nodes.isEmpty()) return null;
DominionNode dominionNode = getLocInDominionNode(nodes, loc);
return dominionNode == null ? null : dominionNode.dominion;
return dominionNode == null ? null : dominionNode.getDominion();
}
public static boolean isInDominion(@Nullable DominionDTO dominion, Location location) {

View File

@ -1,62 +0,0 @@
package cn.lunadeer.dominion;
import cn.lunadeer.minecraftpluginutils.XLogger;
import net.milkbowl.vault.chat.Chat;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
public class VaultConnect {
private Economy econ = null;
private Permission perms = null;
private Chat chat = null;
private JavaPlugin plugin;
public VaultConnect(JavaPlugin plugin) {
this.plugin = plugin;
if (!setupEconomy()) {
XLogger.err("你没有安装 Vault 前置插件,无法使用经济功能,如果不需要使用经济功能请前往配置文件关闭。");
return;
}
setupPermissions();
setupChat();
}
private boolean setupEconomy() {
if (plugin.getServer().getPluginManager().getPlugin("Vault") == null) {
return false;
}
RegisteredServiceProvider<Economy> rsp = plugin.getServer().getServicesManager().getRegistration(Economy.class);
if (rsp == null) {
return false;
}
econ = rsp.getProvider();
return econ != null;
}
private boolean setupChat() {
RegisteredServiceProvider<Chat> rsp = plugin.getServer().getServicesManager().getRegistration(Chat.class);
chat = rsp.getProvider();
return chat != null;
}
private boolean setupPermissions() {
RegisteredServiceProvider<Permission> rsp = plugin.getServer().getServicesManager().getRegistration(Permission.class);
perms = rsp.getProvider();
return perms != null;
}
public Economy getEconomy() {
return econ;
}
public Permission getPermissions() {
return perms;
}
public Chat getChat() {
return chat;
}
}

View File

@ -62,4 +62,8 @@ public class Apis {
return false;
}
public static String CommandParser(String command, Object... args) {
return String.format(command, args);
}
}

View File

@ -2,7 +2,9 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.FlagsController;
import cn.lunadeer.dominion.tuis.DominionFlagInfo;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -29,10 +31,15 @@ public class DominionFlag {
} else if (args.length == 5) {
FlagsController.setFlag(operator, args[1], Boolean.parseBoolean(args[2]), args[3]);
String[] newArgs = new String[3];
newArgs[0] = "flag_info";
newArgs[0] = Flag.isDominionOnlyFlag(args[1]) ? "env_info" : "flag_info";
newArgs[1] = args[3];
newArgs[2] = args[4];
DominionFlagInfo.show(sender, newArgs);
if (Flag.isDominionOnlyFlag(args[1])) {
EnvSetting.show(sender, newArgs);
} else {
GuestSetting.show(sender, newArgs);
}
} else {
Notification.error(sender, "用法: /dominion set <权限名称> <true/false> [领地名称]");
}

View File

@ -2,12 +2,12 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Cache;
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.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.Teleport;
@ -19,9 +19,10 @@ import org.bukkit.entity.Player;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.*;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class DominionOperate {
/**
@ -350,25 +351,50 @@ public class DominionOperate {
Notification.error(sender, "用法: /dominion tp <领地名称>");
return;
}
if (!Dominion.config.getTpEnable()) {
Notification.error(sender, "管理员没有开启领地传送功能");
return;
}
DominionDTO dominionDTO = DominionDTO.select(args[1]);
if (dominionDTO == null) {
Notification.error(sender, "领地不存在");
return;
}
PlayerPrivilegeDTO privilegeDTO = PlayerPrivilegeDTO.select(player.getUniqueId(), dominionDTO.getId());
if (privilegeDTO == null) {
if (!dominionDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "此领地禁止传送");
return;
if (player.isOp() && Dominion.config.getLimitOpBypass()) {
Notification.warn(sender, "你是OP将忽略领地传送限制");
Location location = dominionDTO.getTpLocation();
if (location == null) {
int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2;
int z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
World world = Dominion.instance.getServer().getWorld(dominionDTO.getWorld());
location = new Location(world, x, player.getLocation().getY(), z);
XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());
}
} else {
if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你不被允许传送到这个领地");
return;
Teleport.doTeleportSafely(player, location);
Notification.info(player, "已将你传送到 " + dominionDTO.getName());
return;
}
if (!Dominion.config.getTpEnable()) {
Notification.error(sender, "管理员没有开启领地传送功能");
return;
}
MemberDTO privilegeDTO = MemberDTO.select(player.getUniqueId(), dominionDTO.getId());
if (!player.getUniqueId().equals(dominionDTO.getOwner())) { // 领地所有人可以传送到自己的领地
if (privilegeDTO == null) {
if (!dominionDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "此领地禁止传送");
return;
}
} else {
if (privilegeDTO.getGroupId() == -1) {
if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你不被允许传送到这个领地");
return;
}
} else {
GroupDTO groupDTO = Cache.instance.getGroup(privilegeDTO.getGroupId());
if (!groupDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你所在的权限组组不被允许传送到这个领地");
return;
}
}
}
}
@ -383,21 +409,65 @@ public class DominionOperate {
}
if (Dominion.config.getTpDelay() > 0) {
Notification.info(player, "传送将在 %d 秒后执行", Dominion.config.getTpDelay());
Scheduler.runTaskAsync(() -> {
int i = Dominion.config.getTpDelay();
while (i > 0) {
if (!player.isOnline()) {
return;
}
Notification.actionBar(player, "传送倒计时 %d 秒", i);
i--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
XLogger.err(e.getMessage());
}
}
});
}
Cache.instance.NextTimeAllowTeleport.put(player.getUniqueId(), now.plusSeconds(Dominion.config.getTpCoolDown()));
Scheduler.runTaskLater(() -> {
Location location = dominionDTO.getTpLocation();
int center_x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2;
int center_z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
World world = Dominion.instance.getServer().getWorld(dominionDTO.getWorld());
if (location == null) {
int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2;
int z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
World world = Dominion.instance.getServer().getWorld(dominionDTO.getWorld());
location = new Location(world, x, player.getLocation().getY(), z);
location = new Location(world, center_x, player.getLocation().getY(), center_z);
XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());
} else if (!isInDominion(dominionDTO, location)) {
location = new Location(world, center_x, player.getLocation().getY(), center_z);
XLogger.warn("领地 %s 传送点不在领地内,将尝试传送到中心点", dominionDTO.getName());
}
if (player.isOnline()) {
Teleport.doTeleportSafely(player, location);
Notification.info(player, "已将你传送到 " + dominionDTO.getName());
Teleport.doTeleportSafely(player, location).thenAccept(b -> {
if (b) {
Notification.info(player, "已将你传送到 " + dominionDTO.getName());
} else {
Notification.error(player, "传送失败,请重试");
}
});
}
}, 20L * Dominion.config.getTpDelay());
}
/**
* 设置领地卫星地图地块颜色
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void setMapColor(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length < 2) {
Notification.error(sender, "用法: /dominion set_map_color <颜色> [领地名称]");
return;
}
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 2) {
DominionController.setMapColor(operator, args[1]);
} else {
DominionController.setMapColor(operator, args[1], args[2]);
}
}
}

View File

@ -0,0 +1,261 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.GroupController;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupList;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.group.SelectMember;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static cn.lunadeer.dominion.Commands.boolOptions;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.commands.Helper.*;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class Group {
/**
* /dominion group create <领地名称> <权限组名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void createGroup(CommandSender sender, String[] args) {
try {
if (args.length < 4) {
Notification.error(sender, "用法: /dominion group create <领地名称> <权限组名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String groupName = args[3];
GroupController.createGroup(operator, dominionName, groupName);
GroupList.show(sender, dominionName);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* /dominion group delete <领地名称> <权限组名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void deleteGroup(CommandSender sender, String[] args) {
try {
if (args.length < 4) {
Notification.error(sender, "用法: /dominion group delete <领地名称> <权限组名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String groupName = args[3];
GroupController.deleteGroup(operator, dominionName, groupName);
GroupList.show(sender, dominionName);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* /dominion group rename <领地名称> <权限组旧名称> <新名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void renameGroup(CommandSender sender, String[] args) {
try {
if (args.length < 5) {
Notification.error(sender, "用法: /dominion group rename <领地名称> <权限组旧名称> <新名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String oldGroupName = args[3];
String newGroupName = args[4];
GroupController.renameGroup(operator, dominionName, oldGroupName, newGroupName);
GroupSetting.show(sender, dominionName, newGroupName);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* /dominion group set_flag <领地名称> <权限组名称> <权限名称> <true|false>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void setGroupFlag(CommandSender sender, String[] args) {
try {
if (args.length < 6) {
Notification.error(sender, "用法: /dominion group set_flag <领地名称> <权限组名称> <权限名称> <true|false>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String groupName = args[3];
String flag = args[4];
boolean value = Boolean.parseBoolean(args[5]);
int page = getPage(args, 6);
GroupController.setGroupFlag(operator, dominionName, groupName, flag, value);
GroupSetting.show(sender, dominionName, groupName, page);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* /dominion group add_member <领地名称> <权限组名称> <玩家名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void addMember(CommandSender sender, String[] args) {
try {
if (args.length < 5) {
Notification.error(sender, "用法: /dominion group add_member <领地名称> <权限组名称> <玩家名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String groupName = args[3];
String playerName = args[4];
int page = getPage(args, 5);
GroupController.addMember(operator, dominionName, groupName, playerName);
GroupList.show(sender, dominionName, page);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* /dominion group remove_member <领地名称> <权限组名称> <玩家名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void removeMember(CommandSender sender, String[] args) {
try {
if (args.length < 5) {
Notification.error(sender, "用法: /dominion group remove_member <领地名称> <权限组名称> <玩家名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String groupName = args[3];
String playerName = args[4];
int page = getPage(args, 5);
GroupController.removeMember(operator, dominionName, groupName, playerName);
GroupList.show(sender, dominionName, page);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
switch (args[1]) {
case "create":
createGroup(sender, args);
break;
case "delete":
deleteGroup(sender, args);
break;
case "rename":
renameGroup(sender, args);
break;
case "set_flag":
setGroupFlag(sender, args);
break;
case "add_member":
addMember(sender, args);
break;
case "remove_member":
removeMember(sender, args);
break;
case "select_member":
SelectMember.show(sender, args);
break;
case "setting":
GroupSetting.show(sender, args);
break;
case "list":
GroupList.show(sender, args);
break;
}
}
public static @Nullable List<String> handleTab(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length == 2) {
return Arrays.asList("create", "delete", "rename", "set_flag", "add_member", "remove_member",
"select_member", "list");
}
if (args.length == 3) {
switch (args[1]) {
case "create":
case "delete":
case "rename":
case "set_flag":
case "add_member":
case "remove_member":
case "select_member":
case "setting":
case "list":
return playerDominions(sender);
}
}
if (args.length == 4) {
switch (args[1]) {
case "create":
return Collections.singletonList("新权限组名称");
case "delete":
case "rename":
case "set_flag":
case "add_member":
case "remove_member":
case "select_member":
case "setting":
return dominionGroups(args[2]);
}
}
if (args.length == 5) {
switch (args[1]) {
case "rename":
return Collections.singletonList("权限组新名称");
case "set_flag":
return playerPrivileges();
case "remove_member":
return groupPlayers(args[2], args[3]);
}
}
if (args.length == 6) {
switch (args[1]) {
case "set_flag":
return boolOptions();
}
}
return null;
}
}

View File

@ -1,9 +1,7 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.*;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -40,6 +38,32 @@ public class Helper {
return dominions_name;
}
public static List<String> dominionGroups(String dominionName) {
List<String> groups_name = new ArrayList<>();
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) return groups_name;
List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId());
for (GroupDTO group : groups) {
groups_name.add(group.getName());
}
return groups_name;
}
public static List<String> groupPlayers(String domName, String groupName) {
List<String> players_name = new ArrayList<>();
DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) return players_name;
GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) return players_name;
List<MemberDTO> privileges = MemberDTO.selectByDomGroupId(dominion.getId(), group.getId());
for (MemberDTO privilege : privileges) {
PlayerDTO player = PlayerDTO.select(privilege.getPlayerUUID());
if (player == null) continue;
players_name.add(player.getLastKnownName());
}
return players_name;
}
public static List<String> playerOwnDominions(CommandSender sender) {
List<String> dominions_name = new ArrayList<>();
Player player = playerOnly(sender);
@ -55,8 +79,8 @@ public class Helper {
List<String> dominions_name = new ArrayList<>();
Player player = playerOnly(sender);
if (player == null) return dominions_name;
List<PlayerPrivilegeDTO> dominions_admin = PlayerPrivilegeDTO.selectAll(player.getUniqueId());
for (PlayerPrivilegeDTO privilege : dominions_admin) {
List<MemberDTO> dominions_admin = MemberDTO.selectAll(player.getUniqueId());
for (MemberDTO privilege : dominions_admin) {
if (privilege.getAdmin()) {
DominionDTO dom = DominionDTO.select(privilege.getDomID());
if (dom == null) continue;
@ -75,4 +99,15 @@ public class Helper {
return dominions_name;
}
public static List<String> allTemplates(CommandSender sender) {
List<String> templates_name = new ArrayList<>();
Player player = playerOnly(sender);
if (player == null) return templates_name;
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
for (PrivilegeTemplateDTO template : templates) {
templates_name.add(template.getName());
}
return templates_name;
}
}

View File

@ -0,0 +1,210 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.MemberController;
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList;
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectTemplate;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static cn.lunadeer.dominion.Commands.boolOptions;
import static cn.lunadeer.dominion.Commands.playerNames;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.commands.Helper.*;
public class Member {
/**
* 创建玩家特权
* /dominion member add <领地名称> <玩家名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void member_add(CommandSender sender, String[] args) {
try {
if (args.length < 4) {
Notification.error(sender, "用法: /dominion member add <领地名称> <玩家名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String playerName = args[3];
MemberController.memberAdd(operator, dominionName, playerName);
MemberList.show(sender, dominionName);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* 设置玩家权限
* /dominion member set_flag <领地名称> <玩家名称> <权限名称> <true/false>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void member_set_flag(CommandSender sender, String[] args) {
try {
if (args.length < 6) {
Notification.error(sender, "用法: /dominion member set_flag <领地名称> <玩家名称> <权限名称> <true/false>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String playerName = args[3];
String flagName = args[4];
boolean flagValue = Boolean.parseBoolean(args[5]);
Integer page = args.length == 7 ? Integer.parseInt(args[6]) : 1;
MemberController.setMemberFlag(operator, dominionName, playerName, flagName, flagValue);
MemberSetting.show(sender, dominionName, playerName, page);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* 重置玩家权限
* /dominion member remove <领地名称> <玩家名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void member_remove(CommandSender sender, String[] args) {
try {
if (args.length < 4) {
Notification.error(sender, "用法: /dominion member remove <领地名称> <玩家名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String playerName = args[3];
MemberController.memberRemove(operator, dominionName, playerName);
MemberList.show(sender, dominionName);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* 应用权限模板
* /dominion member apply_template <领地名称> <玩家名称> <模板名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void member_apply_template(CommandSender sender, String[] args) {
try {
if (args.length < 5) {
Notification.error(sender, "用法: /dominion member apply_template <领地名称> <玩家名称> <模板名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String dominionName = args[2];
String playerName = args[3];
String templateName = args[4];
MemberController.applyTemplate(operator, dominionName, playerName, templateName);
MemberSetting.show(sender, dominionName, playerName);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
switch (args[1]) {
case "add":
Member.member_add(sender, args);
break;
case "set_flag":
Member.member_set_flag(sender, args);
break;
case "remove":
Member.member_remove(sender, args);
break;
case "apply_template":
Member.member_apply_template(sender, args);
break;
case "list":
MemberList.show(sender, args);
break;
case "setting":
MemberSetting.show(sender, args);
break;
case "select_player":
SelectPlayer.show(sender, args);
break;
case "select_template":
SelectTemplate.show(sender, args);
break;
}
}
public static @Nullable List<String> handleTab(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length == 2) {
return Arrays.asList("add", "set_flag", "remove", "apply_template", "list", "setting", "select_player", "select_template");
}
if (args.length == 3) {
switch (args[1]) {
case "add":
case "remove":
case "list":
case "setting":
case "set_flag":
case "apply_template":
case "select_player":
case "select_template":
return playerDominions(sender);
}
}
if (args.length == 4) {
switch (args[1]) {
case "add":
case "remove":
case "set_flag":
case "apply_template":
case "setting":
case "select_template":
case "select_player":
return playerNames();
case "list":
return Collections.singletonList("页码(可选)");
}
}
if (args.length == 5) {
switch (args[1]) {
case "set_flag":
return playerPrivileges();
case "apply_template":
return allTemplates(sender);
case "setting":
case "select_template":
return Collections.singletonList("页码(可选)");
}
}
if (args.length == 6) {
switch (args[1]) {
case "set_flag":
return boolOptions();
}
}
return null;
}
}

View File

@ -0,0 +1,95 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.MigrateList;
import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class Migration {
public static void migrate(CommandSender sender, String[] args) {
try {
Player player = playerOnly(sender);
if (player == null) return;
if (!Dominion.config.getResidenceMigration()) {
Notification.error(sender, "Residence 迁移功能没有开启");
return;
}
if (args.length < 2) {
Notification.error(sender, "用法: /dominion migrate <res领地名称>");
return;
}
String resName = args[1];
List<ResMigration.ResidenceNode> res_data = Cache.instance.getResidenceData(player.getUniqueId());
if (res_data == null) {
Notification.error(sender, "你没有可迁移的数据");
return;
}
ResMigration.ResidenceNode resNode = res_data.stream().filter(node -> node.name.equals(resName)).findFirst().orElse(null);
if (resNode == null) {
Notification.error(sender, "未找到指定的 Residence 领地");
return;
}
if (!resNode.owner.equals(player.getUniqueId())) {
Notification.error(sender, "你不是该领地的所有者,无法迁移此领地");
return;
}
create(player, resNode, "");
if (args.length == 3 ) {
int parentId = Integer.parseInt(args[2]);
String[] newArgs = new String[2];
newArgs[0] = "migrate_list";
newArgs[1] = String.valueOf(parentId);
MigrateList.show(sender, newArgs);
}
} catch (Exception e) {
Notification.error(sender, "迁移失败: " + e.getMessage());
}
}
private static void create(Player player, ResMigration.ResidenceNode node, String parentName) {
BukkitPlayerOperator operator = new BukkitPlayerOperator(player);
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.SUCCESS)) {
DominionDTO dominion = DominionDTO.select(node.name);
if (dominion == null) {
return;
}
dominion.setTpLocation(node.tpLoc)
.setJoinMessage(node.joinMessage)
.setLeaveMessage(node.leaveMessage);
for (String msg : result.getMessages()) {
Notification.info(player, msg);
}
Notification.info(player, "领地 " + node.name + " 已从 Residence 迁移至 Dominion");
if (node.children != null) {
for (ResMigration.ResidenceNode child : node.children) {
create(player, child, node.name);
}
}
} else if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.WARNING)) {
for (String msg : result.getMessages()) {
Notification.warn(player, msg);
}
} else {
for (String msg : result.getMessages()) {
Notification.error(player, msg);
}
}
});
DominionController.create(operator, node.name, node.loc1, node.loc2, parentName, true);
}
}

View File

@ -1,184 +0,0 @@
package cn.lunadeer.dominion.commands;
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.PrivilegeController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionManage;
import cn.lunadeer.dominion.tuis.DominionPrivilegeList;
import cn.lunadeer.dominion.tuis.SelectPlayer;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class OpenCUI {
private static class renameDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String oldName;
public renameDominionCB(Player sender, String oldName) {
this.sender = sender;
this.oldName = oldName;
}
@Override
public void handleData(String input) {
XLogger.debug("renameDominionCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.rename(operator, oldName, input);
DominionManage.show(sender, new String[]{"manage", input});
}
}
private static class editJoinMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editJoinMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editJoinMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setJoinMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
private static class editLeaveMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editLeaveMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editLeaveMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setLeaveMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
private static class createDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
public createDominionCB(Player sender) {
this.sender = sender;
}
@Override
public void handleData(String input) {
XLogger.debug("createDominionCB.run: %s", input);
autoPoints(sender);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
Map<Integer, Location> points = Dominion.pointsSelect.get(sender.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "自动选点失败");
return;
}
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)){
DominionManage.show(sender, new String[]{"list"});
}
});
DominionController.create(operator, input, points.get(0), points.get(1));
}
}
private static class createPrivilegeCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public createPrivilegeCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("createPrivilegeCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
PrivilegeController.createPrivilege(operator, input, dominionName);
operator.getResponse().thenAccept(result -> {
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});
}
});
}
}
public static void RenameDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]);
CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title("领地重命名");
view.open(player);
}
public static void EditJoinMessage(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title("编辑欢迎提示语");
view.open(player);
}
public static void EditLeaveMessage(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title("编辑离开提示语");
view.open(player);
}
public static void CreateDominion(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback createDominionCB = new createDominionCB(player);
CuiTextInput view = CuiTextInput.create(createDominionCB).setText("未命名领地").title("输入要创建的领地名称");
view.open(player);
}
public static void CreatePrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback createPrivilegeCB = new createPrivilegeCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员");
view.open(player);
}
}

View File

@ -28,9 +28,14 @@ public class Operator {
});
Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在从数据库重新加载玩家权限缓存...");
Cache.instance.loadPlayerPrivileges();
Cache.instance.loadMembers();
Notification.info(sender, "玩家权限缓存已重新加载");
});
Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在从数据库重新加载权限组缓存...");
Cache.instance.loadGroups();
Notification.info(sender, "权限组缓存已重新加载");
});
}
public static void exportMca(CommandSender sender, String[] args) {

View File

@ -1,99 +0,0 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.tuis.DominionPrivilegeList;
import cn.lunadeer.dominion.tuis.PrivilegeInfo;
import cn.lunadeer.minecraftpluginutils.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.*;
public class PlayerPrivilege {
/**
* 创建玩家特权
* /dominion create_privilege <玩家名称> [领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void createPlayerPrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length != 2 && args.length != 3 && args.length != 4) {
Notification.error(sender, "用法: /dominion create_privilege <玩家名称> [领地名称]");
return;
}
if (args.length == 2) {
createPrivilege(operator, args[1]);
} else {
createPrivilege(operator, args[1], args[2]);
}
if (args.length == 4) {
String[] newArgs = new String[2];
newArgs[0] = "privilege_list";
newArgs[1] = args[2];
DominionPrivilegeList.show(sender, newArgs);
}
}
/**
* 设置玩家权限
* /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;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length == 4) {
setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]));
} else if (args.length == 5) {
setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]), args[4]);
} else if (args.length == 6) {
setPrivilege(operator, args[1], args[2], Boolean.parseBoolean(args[3]), args[4]);
String[] newArgs = new String[4];
newArgs[0] = "privilege_info";
newArgs[1] = args[1];
newArgs[2] = args[4];
newArgs[3] = args[5];
PrivilegeInfo.show(sender, newArgs);
} else {
Notification.error(sender, "用法: /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]");
}
}
/**
* 重置玩家权限
* /dominion clear_privilege <玩家名称> [领地名称]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void clearPlayerPrivilege(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length != 2 && args.length != 3 && args.length != 4) {
Notification.error(sender, "用法: /dominion clear_privilege <玩家名称> [领地名称]");
return;
}
if (args.length == 2) {
clearPrivilege(operator, args[1]);
} else {
clearPrivilege(operator, args[1], args[2]);
}
if (args.length == 4) {
String[] newArgs = new String[3];
newArgs[0] = "privilege_list";
newArgs[1] = args[2];
DominionPrivilegeList.show(sender, newArgs);
}
}
}

View File

@ -1,7 +1,7 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.tuis.DominionConfig;
import cn.lunadeer.dominion.tuis.SysConfig;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
@ -67,6 +67,9 @@ public class SetConfig {
case "economy_refund":
setEconomyRefund(sender, args);
break;
case "residence_migration":
setResidenceMigration(sender, args);
break;
default:
Notification.error(sender, "未知参数");
}
@ -78,7 +81,7 @@ public class SetConfig {
String[] newArgs = new String[2];
newArgs[0] = "config";
newArgs[1] = String.valueOf(page);
DominionConfig.show(sender, newArgs);
SysConfig.show(sender, newArgs);
}
}
@ -250,4 +253,10 @@ public class SetConfig {
Dominion.config.setEconomyRefund(economyRefund);
}
}
private static void setResidenceMigration(CommandSender sender, String[] args) {
boolean residenceMigration = Boolean.parseBoolean(args[2]);
Dominion.config.setResidenceMigration(residenceMigration);
refreshPageOrNot(sender, args);
}
}

View File

@ -0,0 +1,151 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.tuis.template.TemplateList;
import cn.lunadeer.dominion.tuis.template.TemplateSetting;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static cn.lunadeer.dominion.Commands.boolOptions;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.commands.Helper.allTemplates;
import static cn.lunadeer.dominion.commands.Helper.playerPrivileges;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class Template {
/**
* 创建权限模板
* /dominion template create <模板名称> [页码]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void createTemplate(CommandSender sender, String[] args) {
try {
if (args.length < 3) {
Notification.error(sender, "用法: /dominion template create <模板名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
TemplateController.createTemplate(operator, args[2]);
TemplateList.show(sender);
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* 删除权限模板
* /dominion template delete <模板名称> [页码]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void deleteTemplate(CommandSender sender, String[] args) {
try {
if (args.length < 3) {
Notification.error(sender, "用法: /dominion template delete <模板名称>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
TemplateController.deleteTemplate(operator, args[2]);
TemplateList.show(sender, getPage(args, 3));
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
/**
* 编辑模板
* /dominion template set_flag <模板名称> <权限名称> <true/false> [页码]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void setTemplateFlag(CommandSender sender, String[] args) {
try {
if (args.length < 5) {
Notification.error(sender, "用法: /dominion template set_flag <模板名称> <权限名称> <true/false>");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String templateName = args[2];
String flagName = args[3];
boolean value = Boolean.parseBoolean(args[4]);
TemplateController.setTemplateFlag(operator, templateName, flagName, value);
TemplateSetting.show(sender, templateName, getPage(args, 5));
} catch (Exception e) {
Notification.error(sender, e.getMessage());
}
}
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
switch (args[1]) {
case "list":
TemplateList.show(sender, args);
break;
case "setting":
TemplateSetting.show(sender, args);
break;
case "delete":
Template.deleteTemplate(sender, args);
break;
case "create":
Template.createTemplate(sender, args);
break;
case "set_flag":
Template.setTemplateFlag(sender, args);
break;
}
}
public static @Nullable List<String> handleTab(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length == 2) {
return Arrays.asList("list", "setting", "delete", "create", "set_flag");
}
if (args.length == 3) {
switch (args[1]) {
case "create":
return Collections.singletonList("输入模板名称");
case "delete":
case "set_flag":
case "setting":
return allTemplates(sender);
case "list":
return Collections.singletonList("页码(可选)");
}
}
if (args.length == 4) {
switch (args[1]) {
case "set_flag":
return playerPrivileges();
case "setting":
return Collections.singletonList("页码(可选)");
}
}
if (args.length == 5) {
switch (args[1]) {
case "set_flag":
return boolOptions();
}
}
return null;
}
}

View File

@ -5,6 +5,8 @@ import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
@ -16,21 +18,16 @@ public interface AbstractOperator {
public static final Integer FAILURE = 2;
private Integer success;
private String message;
private List<String> messages;
public Result(Integer success, String message, Object... args) {
this.success = success;
this.message = String.format(message, args);
this.messages = new ArrayList<>();
this.messages.add(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);
public Result addMessage(String message, Object... args) {
this.messages.add(String.format(message, args));
return this;
}
@ -38,8 +35,8 @@ public interface AbstractOperator {
return success;
}
public String getMessage() {
return message;
public List<String> getMessages() {
return messages;
}
}

View File

@ -2,13 +2,8 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.dominion.dtos.MemberDTO;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import java.util.List;
public class Apis {
@ -20,7 +15,7 @@ public class Apis {
public static boolean noAuthToChangeFlags(AbstractOperator player, DominionDTO dominion) {
if (player.isOp()) return false;
if (!dominion.getOwner().equals(player.getUniqueId())) {
PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId());
MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) {
player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不是领地 %s 的拥有者或管理员,无权修改权限", dominion.getName()));
return true;
@ -43,7 +38,10 @@ public class Apis {
return null;
}
DominionDTO dominion = Cache.instance.getDominion(location);
if (dominion == null || dominion.getParentDomId() != -1) {
if (dominion == null) {
return null;
}
if (dominion.getParentDomId() == -1) {
return dominion;
} else {
player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你当前在子领地内,请指定要操作的领地名称"));

View File

@ -45,8 +45,8 @@ public class BukkitPlayerOperator implements AbstractOperator {
@Override
public BlockFace getDirection() {
float yaw = player.getYaw();
float pitch = player.getPitch();
float yaw = player.getLocation().getYaw();
float pitch = player.getLocation().getPitch();
if (pitch > -45 && pitch < 45) {
if (yaw > -45 && yaw < 45) {
return BlockFace.SOUTH;
@ -73,11 +73,17 @@ public class BukkitPlayerOperator implements AbstractOperator {
BukkitPlayerOperator operator = new BukkitPlayerOperator(player);
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.SUCCESS)) {
Notification.info(player, result.getMessage());
for (String msg : result.getMessages()) {
Notification.info(player, msg);
}
} else if (Objects.equals(result.getStatus(), BukkitPlayerOperator.Result.WARNING)) {
Notification.warn(player, result.getMessage());
for (String msg : result.getMessages()) {
Notification.warn(player, msg);
}
} else {
Notification.error(player, result.getMessage());
for (String msg : result.getMessages()) {
Notification.error(player, msg);
}
}
});
return operator;

View File

@ -2,12 +2,11 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache;
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.PlayerDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.ParticleRender;
import cn.lunadeer.minecraftpluginutils.VaultConnect;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Location;
import org.bukkit.World;
@ -19,7 +18,8 @@ import java.util.List;
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.getPlayerCurrentDominion;
import static cn.lunadeer.dominion.controllers.Apis.notOwner;
public class DominionController {
@ -38,7 +38,6 @@ public class DominionController {
* @param name 领地名称
* @param loc1 位置1
* @param loc2 位置2
* @return 创建的领地
*/
public static void create(AbstractOperator operator, String name, Location loc1, Location loc2) {
DominionDTO parent = getPlayerCurrentDominion(operator);
@ -57,36 +56,51 @@ public class DominionController {
* @param loc1 位置1
* @param loc2 位置2
* @param parent_dominion_name 父领地名称
* @return 创建的领地
*/
public static void create(AbstractOperator operator, String name,
Location loc1, Location loc2,
String parent_dominion_name) {
create(operator, name, loc1, loc2, parent_dominion_name, false);
}
/**
* 创建子领地
*
* @param operator 拥有者
* @param name 领地名称
* @param loc1 位置1
* @param loc2 位置2
* @param parent_dominion_name 父领地名称
* @param skipEco 是否跳过经济检查
*/
public static void create(AbstractOperator operator, String name,
Location loc1, Location loc2,
String parent_dominion_name, boolean skipEco) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建领地失败");
if (name.isEmpty()) {
operator.setResponse(FAIL.appendMessage("领地名称不能为空"));
operator.setResponse(FAIL.addMessage("领地名称不能为空"));
return;
}
if (name.contains(" ")) {
operator.setResponse(FAIL.appendMessage("领地名称不能包含空格"));
operator.setResponse(FAIL.addMessage("领地名称不能包含空格"));
return;
}
if (DominionDTO.select(name) != null) {
operator.setResponse(FAIL.appendMessage("已经存在名称为 %s 的领地", name));
operator.setResponse(FAIL.addMessage("已经存在名称为 %s 的领地", name));
return;
}
if (!loc1.getWorld().equals(loc2.getWorld())) {
operator.setResponse(FAIL.appendMessage("选点世界不一致"));
operator.setResponse(FAIL.addMessage("选点世界不一致"));
return;
}
// 检查世界是否可以创建
if (worldNotValid(operator, loc1.getWorld().getName())) {
operator.setResponse(FAIL.appendMessage("禁止在世界 %s 创建领地", loc1.getWorld().getName()));
operator.setResponse(FAIL.addMessage("禁止在世界 %s 创建领地", loc1.getWorld().getName()));
return;
}
// 检查领地数量是否达到上限
if (amountNotValid(operator)) {
operator.setResponse(FAIL.appendMessage("你的领地数量已达上限(%d个)", Dominion.config.getLimitAmount()));
operator.setResponse(FAIL.addMessage("你的领地数量已达上限(%d个)", Dominion.config.getLimitAmount()));
return;
}
// 检查领地大小是否合法
@ -106,7 +120,7 @@ public class DominionController {
parent_dominion = DominionDTO.select(parent_dominion_name);
}
if (parent_dominion == null) {
operator.setResponse(FAIL.appendMessage("父领地 %s 不存在", parent_dominion_name));
operator.setResponse(FAIL.addMessage("父领地 %s 不存在", parent_dominion_name));
if (parent_dominion_name.isEmpty()) {
XLogger.err("根领地丢失!");
}
@ -115,13 +129,13 @@ public class DominionController {
// 是否是父领地的拥有者
if (parent_dominion.getId() != -1) {
if (notOwner(operator, parent_dominion)) {
operator.setResponse(FAIL.appendMessage("你不是父领地 %s 的拥有者,无法创建子领地", parent_dominion_name));
operator.setResponse(FAIL.addMessage("你不是父领地 %s 的拥有者,无法创建子领地", parent_dominion_name));
return;
}
}
// 如果parent_dominion不为-1 检查是否在同一世界
if (parent_dominion.getId() != -1 && !parent_dominion.getWorld().equals(dominion.getWorld())) {
operator.setResponse(FAIL.appendMessage("父领地与子领地不在同一世界。"));
operator.setResponse(FAIL.addMessage("父领地与子领地不在同一世界。"));
return;
}
// 检查深度是否达到上限
@ -130,7 +144,7 @@ public class DominionController {
}
// 检查是否超出父领地范围
if (!isContained(dominion, parent_dominion)) {
operator.setResponse(FAIL.appendMessage("超出父领地 %s 范围", parent_dominion.getName()));
operator.setResponse(FAIL.addMessage("超出父领地 %s 范围", parent_dominion.getName()));
return;
}
// 获取此领地的所有同级领地
@ -138,29 +152,33 @@ public class DominionController {
// 检查是否与其他子领地冲突
for (DominionDTO sub_dominion : sub_dominions) {
if (isIntersect(sub_dominion, dominion)) {
operator.setResponse(FAIL.appendMessage("与领地 %s 冲突", sub_dominion.getName()));
operator.setResponse(FAIL.addMessage("与领地 %s 冲突", sub_dominion.getName()));
return;
}
}
// 检查经济
if (Dominion.config.getEconomyEnable()) {
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
count = (loc2.getBlockX() - loc1.getBlockX() + 1) * (loc2.getBlockZ() - loc1.getBlockZ() + 1);
} else {
count = (loc2.getBlockX() - loc1.getBlockX() + 1) * (loc2.getBlockY() - loc1.getBlockY() + 1) * (loc2.getBlockZ() - loc1.getBlockZ() + 1);
}
float price = count * Dominion.config.getEconomyPrice();
if (Dominion.vault.getEconomy().getBalance(operator.getPlayer()) < price) {
operator.setResponse(FAIL.appendMessage("你的余额不足,创建此领地需要 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()));
if (Dominion.config.getEconomyEnable() && !skipEco) {
if (!VaultConnect.instance.economyAvailable()) {
operator.setResponse(FAIL.addMessage("没有可用的经济插件系统,请联系服主。"));
return;
}
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "已扣除 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()));
Dominion.vault.getEconomy().withdrawPlayer(operator.getPlayer(), price);
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
count = dominion.getSquare();
} else {
count = dominion.getVolume();
}
float price = count * Dominion.config.getEconomyPrice();
if (VaultConnect.instance.getBalance(operator.getPlayer()) < price) {
operator.setResponse(FAIL.addMessage("你的余额不足,创建此领地需要 %.2f %s", price, VaultConnect.instance.currencyNamePlural()));
return;
}
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "已扣除 %.2f %s", price, VaultConnect.instance.currencyNamePlural()));
VaultConnect.instance.withdrawPlayer(operator.getPlayer(), price);
}
dominion = DominionDTO.insert(dominion);
if (dominion == null) {
operator.setResponse(FAIL.appendMessage("创建领地失败,数据库错误,请联系管理员"));
operator.setResponse(FAIL.addMessage("创建领地失败,数据库错误,请联系管理员"));
return;
}
if (operator instanceof BukkitPlayerOperator) {
@ -177,7 +195,6 @@ public class DominionController {
*
* @param operator 操作者
* @param size 扩展的大小
* @return 扩展后的领地
*/
public static void expand(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator);
@ -194,7 +211,6 @@ public class DominionController {
* @param operator 操作者
* @param size 扩展的大小
* @param dominion_name 领地名称
* @return 扩展后的领地
*/
public static void expand(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "扩展领地失败");
@ -206,7 +222,7 @@ public class DominionController {
}
if (location != null) {
if (!location.getWorld().getName().equals(dominion.getWorld())) {
operator.setResponse(FAIL.appendMessage("禁止跨世界操作"));
operator.setResponse(FAIL.addMessage("禁止跨世界操作"));
return;
}
}
@ -236,7 +252,7 @@ public class DominionController {
y1 -= size;
break;
default:
operator.setResponse(FAIL.appendMessage("无效的方向"));
operator.setResponse(FAIL.addMessage("无效的方向"));
return;
}
if (sizeNotValid(operator, x1, y1, z1, x2, y2, z2)) {
@ -245,11 +261,11 @@ public class DominionController {
// 校验是否超出父领地范围
DominionDTO parent_dominion = DominionDTO.select(dominion.getParentDomId());
if (parent_dominion == null) {
operator.setResponse(FAIL.appendMessage("父领地丢失"));
operator.setResponse(FAIL.addMessage("父领地丢失"));
return;
}
if (!isContained(x1, y1, z1, x2, y2, z2, parent_dominion)) {
operator.setResponse(FAIL.appendMessage("超出父领地 %s 范围", parent_dominion.getName()));
operator.setResponse(FAIL.addMessage("超出父领地 %s 范围", parent_dominion.getName()));
return;
}
// 获取同世界下的所有同级领地
@ -258,13 +274,17 @@ public class DominionController {
if (isIntersect(exist_dominion, x1, y1, z1, x2, y2, z2)) {
// 如果是自己跳过
if (exist_dominion.getId().equals(dominion.getId())) continue;
operator.setResponse(FAIL.appendMessage("与领地 %s 冲突", exist_dominion.getName()));
operator.setResponse(FAIL.addMessage("与领地 %s 冲突", exist_dominion.getName()));
return;
}
}
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功扩展领地 %s %d格", dominion_name, size);
// 检查经济
if (Dominion.config.getEconomyEnable()) {
if (!VaultConnect.instance.economyAvailable()) {
operator.setResponse(FAIL.addMessage("没有可用的经济插件系统,请联系服主。"));
return;
}
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
count = (x2 - x1 + 1) * (z2 - z1 + 1) - dominion.getSquare();
@ -272,12 +292,12 @@ public class DominionController {
count = (x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1) - dominion.getVolume();
}
float price = count * Dominion.config.getEconomyPrice();
if (Dominion.vault.getEconomy().getBalance(operator.getPlayer()) < price) {
operator.setResponse(FAIL.appendMessage("你的余额不足,扩展此领地需要 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural()));
if (VaultConnect.instance.getBalance(operator.getPlayer()) < price) {
operator.setResponse(FAIL.addMessage("你的余额不足,扩展此领地需要 %.2f %s", price, VaultConnect.instance.currencyNamePlural()));
return;
}
SUCCESS.appendMessage("已扣除 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural());
Dominion.vault.getEconomy().withdrawPlayer(operator.getPlayer(), price);
SUCCESS.addMessage("已扣除 %.2f %s", price, VaultConnect.instance.currencyNamePlural());
VaultConnect.instance.withdrawPlayer(operator.getPlayer(), price);
}
if (operator instanceof BukkitPlayerOperator) {
World world = Dominion.instance.getServer().getWorld(dominion.getWorld());
@ -296,7 +316,6 @@ public class DominionController {
*
* @param operator 操作者
* @param size 缩小的大小
* @return 缩小后的领地
*/
public static void contract(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator);
@ -313,7 +332,6 @@ public class DominionController {
* @param operator 操作者
* @param size 缩小的大小
* @param dominion_name 领地名称
* @return 缩小后的领地
*/
public static void contract(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "缩小领地失败");
@ -325,7 +343,7 @@ public class DominionController {
}
if (location != null) {
if (!location.getWorld().getName().equals(dominion.getWorld())) {
operator.setResponse(FAIL.appendMessage("禁止跨世界操作"));
operator.setResponse(FAIL.addMessage("禁止跨世界操作"));
return;
}
}
@ -355,12 +373,12 @@ public class DominionController {
y1 += size;
break;
default:
operator.setResponse(FAIL.appendMessage("无效的方向"));
operator.setResponse(FAIL.addMessage("无效的方向"));
return;
}
// 校验第二组坐标是否小于第一组坐标
if (x1 >= x2 || y1 >= y2 || z1 >= z2) {
operator.setResponse(FAIL.appendMessage("缩小后的领地大小无效"));
operator.setResponse(FAIL.addMessage("缩小后的领地大小无效"));
return;
}
if (sizeNotValid(operator, x1, y1, z1, x2, y2, z2)) {
@ -370,13 +388,17 @@ public class DominionController {
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)) {
operator.setResponse(FAIL.appendMessage("缩小后的领地无法包含子领地 %s", sub_dominion.getName()));
operator.setResponse(FAIL.addMessage("缩小后的领地无法包含子领地 %s", sub_dominion.getName()));
return;
}
}
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功缩小领地 %s %d格", dominion_name, size);
// 退还经济
if (Dominion.config.getEconomyEnable()) {
if (!VaultConnect.instance.economyAvailable()) {
operator.setResponse(FAIL.addMessage("没有可用的经济插件系统,请联系服主。"));
return;
}
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
count = dominion.getSquare() - (x2 - x1 + 1) * (z2 - z1 + 1);
@ -384,8 +406,8 @@ public class DominionController {
count = dominion.getVolume() - (x2 - x1 + 1) * (y2 - y1 + 1) * (z2 - z1 + 1);
}
float refund = count * Dominion.config.getEconomyPrice() * Dominion.config.getEconomyRefund();
Dominion.vault.getEconomy().depositPlayer(operator.getPlayer(), refund);
SUCCESS.appendMessage("已退还 %.2f %s", refund, Dominion.vault.getEconomy().currencyNamePlural());
VaultConnect.instance.depositPlayer(operator.getPlayer(), refund);
SUCCESS.addMessage("已退还 %.2f %s", refund, VaultConnect.instance.currencyNamePlural());
}
if (operator instanceof BukkitPlayerOperator) {
World world = Dominion.instance.getServer().getWorld(dominion.getWorld());
@ -418,7 +440,7 @@ public class DominionController {
}
if (sub_dominions.size() > 0) {
sub_names = sub_names.substring(0, sub_names.length() - 2);
WARNING.appendMessage("(子领地:%s)", sub_names);
WARNING.addMessage("(子领地:%s)", sub_names);
}
if (operator instanceof BukkitPlayerOperator) {
Notification.warn(operator.getPlayer(), "输入 /dominion delete %s force 确认删除", dominion_name);
@ -430,6 +452,10 @@ public class DominionController {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "领地 %s 及其所有子领地已删除", dominion_name);
// 退还经济
if (Dominion.config.getEconomyEnable()) {
if (!VaultConnect.instance.economyAvailable()) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "退款失败,没有可用的经济插件系统,请联系服主。"));
return;
}
int count = 0;
if (Dominion.config.getEconomyOnlyXZ()) {
for (DominionDTO sub_dominion : sub_dominions) {
@ -441,8 +467,8 @@ public class DominionController {
}
}
float refund = count * Dominion.config.getEconomyPrice() * Dominion.config.getEconomyRefund();
Dominion.vault.getEconomy().depositPlayer(operator.getPlayer(), refund);
SUCCESS.appendMessage("已退还 %.2f %s", refund, Dominion.vault.getEconomy().currencyNamePlural());
VaultConnect.instance.depositPlayer(operator.getPlayer(), refund);
SUCCESS.addMessage("已退还 %.2f %s", refund, VaultConnect.instance.currencyNamePlural());
}
operator.setResponse(SUCCESS);
}
@ -560,15 +586,15 @@ public class DominionController {
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()) {
operator.setResponse(FAIL.appendMessage("新名称不能为空"));
operator.setResponse(FAIL.addMessage("新名称不能为空"));
return;
}
if (new_name.contains(" ")) {
operator.setResponse(FAIL.appendMessage("领地名称不能包含空格"));
operator.setResponse(FAIL.addMessage("领地名称不能包含空格"));
return;
}
if (Objects.equals(old_name, new_name)) {
operator.setResponse(FAIL.appendMessage("新名称与旧名称相同"));
operator.setResponse(FAIL.addMessage("新名称与旧名称相同"));
return;
}
DominionDTO dominion = getExistDomAndIsOwner(operator, old_name);
@ -576,7 +602,7 @@ public class DominionController {
return;
}
if (DominionDTO.select(new_name) != null) {
operator.setResponse(FAIL.appendMessage("已经存在名称为 %s 的领地", new_name));
operator.setResponse(FAIL.addMessage("已经存在名称为 %s 的领地", new_name));
return;
}
dominion.setName(new_name);
@ -595,11 +621,11 @@ public class DominionController {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "转让领地失败");
PlayerDTO operatorDTO = PlayerDTO.select(operator.getUniqueId());
if (operatorDTO == null) {
operator.setResponse(FAIL.appendMessage("操作者信息丢失,请联系管理员"));
operator.setResponse(FAIL.addMessage("操作者信息丢失,请联系管理员"));
return;
}
if (Objects.equals(player_name, operatorDTO.getLastKnownName())) {
operator.setResponse(FAIL.appendMessage("不能将领地转让给自己"));
operator.setResponse(FAIL.addMessage("不能将领地转让给自己"));
return;
}
DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name);
@ -608,11 +634,11 @@ public class DominionController {
}
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
operator.setResponse(FAIL.appendMessage("玩家 %s 不存在", player_name));
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", player_name));
return;
}
if (dominion.getParentDomId() != -1) {
operator.setResponse(FAIL.appendMessage("子领地无法转让,你可以通过将 %s 设置为管理员来让其管理领地 %s ", player_name, dom_name));
operator.setResponse(FAIL.addMessage("子领地无法转让,你可以通过将 %s 设置为管理员来让其管理领地 %s ", player_name, dom_name));
return;
}
List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion);
@ -624,7 +650,7 @@ public class DominionController {
}
if (sub_dominions.size() > 0) {
sub_names = sub_names.substring(0, sub_names.length() - 2);
WARNING.appendMessage("(子领地:%s)", sub_names);
WARNING.addMessage("(子领地:%s)", sub_names);
}
if (operator instanceof BukkitPlayerOperator) {
Notification.warn(operator.getPlayer(), "输入 /dominion give %s %s force 确认转让", dom_name, player_name);
@ -639,6 +665,48 @@ public class DominionController {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功将领地 %s 及其所有子领地转让给 %s", dom_name, player_name));
}
/**
* 设置领地的卫星地图地块颜色
*
* @param operator 操作者
* @param color 16进制颜色 例如 #ff0000
* @param dom_name 领地名称
*/
public static void setMapColor(AbstractOperator operator, String color, String dom_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置领地地图颜色失败");
DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name);
if (dominion == null) {
return;
}
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者", dom_name));
return;
}
color = color.toUpperCase(); // 转换为大写
if (!color.matches("^#[0-9a-fA-F]{6}$")) {
operator.setResponse(FAIL.addMessage("颜色格式不正确"));
return;
}
dominion.setColor(color);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功设置领地 %s 的卫星地图颜色为 %s", dom_name, color));
}
/**
* 设置领地的卫星地图地块颜色
*
* @param operator 操作者
* @param color 16进制颜色 例如 #ff0000
*/
public static void setMapColor(AbstractOperator operator, String color) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置领地地图颜色失败");
DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("无法获取你所处的领地,请指定名称"));
return;
}
setMapColor(operator, color, dominion.getName());
}
/**
* 判断两个领地是否相交
*/
@ -716,27 +784,27 @@ public class DominionController {
int y_length = y2 - y1;
int z_length = z2 - z1;
if (x_length < 4 || y_length < 4 || z_length < 4) {
operator.setResponse(FAIL.appendMessage("领地的任意一边长度不得小于4"));
operator.setResponse(FAIL.addMessage("领地的任意一边长度不得小于4"));
return true;
}
if (x_length > Dominion.config.getLimitSizeX() && Dominion.config.getLimitSizeX() > 0) {
operator.setResponse(FAIL.appendMessage("领地X方向长度不能超过 %s", Dominion.config.getLimitSizeX()));
operator.setResponse(FAIL.addMessage("领地X方向长度不能超过 %d", Dominion.config.getLimitSizeX()));
return true;
}
if (y_length > Dominion.config.getLimitSizeY() && Dominion.config.getLimitSizeY() > 0) {
operator.setResponse(FAIL.appendMessage("领地Y方向高度不能超过 %s", Dominion.config.getLimitSizeY()));
operator.setResponse(FAIL.addMessage("领地Y方向高度不能超过 %d", Dominion.config.getLimitSizeY()));
return true;
}
if (z_length > Dominion.config.getLimitSizeZ() && Dominion.config.getLimitSizeZ() > 0) {
operator.setResponse(FAIL.appendMessage("领地Z方向长度不能超过 %s", Dominion.config.getLimitSizeZ()));
operator.setResponse(FAIL.addMessage("领地Z方向长度不能超过 %d", Dominion.config.getLimitSizeZ()));
return true;
}
if (y2 > Dominion.config.getLimitMaxY()) {
operator.setResponse(FAIL.appendMessage("领地Y坐标不能超过 %s", Dominion.config.getLimitMaxY()));
operator.setResponse(FAIL.addMessage("领地Y坐标不能超过 %d", Dominion.config.getLimitMaxY()));
return true;
}
if (y1 < Dominion.config.getLimitMinY()) {
operator.setResponse(FAIL.appendMessage("领地Y坐标不能低于 %s", Dominion.config.getLimitMinY()));
operator.setResponse(FAIL.addMessage("领地Y坐标不能低于 %d", Dominion.config.getLimitMinY()));
return true;
}
return false;
@ -751,7 +819,7 @@ public class DominionController {
return false;
}
if (parent_dom.getId() != -1 && Dominion.config.getLimitDepth() == 0) {
operator.setResponse(FAIL.appendMessage("不允许创建子领地"));
operator.setResponse(FAIL.addMessage("不允许创建子领地"));
return true;
}
if (parent_dom.getId() == -1) {
@ -763,7 +831,7 @@ public class DominionController {
level++;
}
if (level >= Dominion.config.getLimitDepth()) {
operator.setResponse(FAIL.appendMessage("子领地嵌套深度不能超过 %s", Dominion.config.getLimitDepth()));
operator.setResponse(FAIL.addMessage("子领地嵌套深度不能超过 %s", Dominion.config.getLimitDepth()));
return true;
}
return false;
@ -787,11 +855,11 @@ public class DominionController {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "");
DominionDTO dominion = DominionDTO.select(dominion_name);
if (dominion == null) {
operator.setResponse(FAIL.setMessage("领地 %s 不存在", dominion_name));
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominion_name));
return null;
}
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.setMessage("你不是领地 %s 的拥有者", dominion_name));
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者", dominion_name));
return null;
}
return dominion;

View File

@ -2,8 +2,6 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;

View File

@ -0,0 +1,218 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.*;
import java.util.Objects;
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;
import static cn.lunadeer.dominion.controllers.Apis.notOwner;
public class GroupController {
public static void createGroup(AbstractOperator operator, String domName, String groupName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建权限组 %s 失败", groupName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建权限组 %s 成功", groupName);
if (groupName.contains(" ")) {
operator.setResponse(FAIL.addMessage("权限组名称不能包含空格"));
return;
}
DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName));
return;
}
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法创建权限组", domName));
return;
}
GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group != null) {
operator.setResponse(FAIL.addMessage("领地 %s 已存在名为 %s 的权限组", domName, groupName));
return;
}
group = GroupDTO.create(groupName, dominion);
if (group == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员"));
return;
}
operator.setResponse(SUCCESS);
}
public static void deleteGroup(AbstractOperator operator, String domName, String groupName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除权限组 %s 失败", groupName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "删除权限组 %s 成功", groupName);
DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName));
return;
}
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法删除权限组", domName));
return;
}
GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName));
return;
}
group.delete();
operator.setResponse(SUCCESS);
}
public static void setGroupFlag(AbstractOperator operator, String domName, String groupName, String flag, boolean value) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置权限组 %s 的权限 %s 为 %s 失败", groupName, flag, value);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置权限组 %s 的权限 %s 为 %s 成功", groupName, flag, value);
DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) {
return;
}
GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName));
return;
}
if ((flag.equals("admin") || group.getAdmin()) && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改管理员权限组权限", domName));
return;
}
if (flag.equals("admin")) {
group = group.setAdmin(value);
} else {
Flag f = Flag.getFlag(flag);
if (f == null) {
operator.setResponse(FAIL.addMessage("未知的权限 %s", flag));
return;
}
group = group.setFlagValue(f, value);
}
if (group == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员"));
return;
}
operator.setResponse(SUCCESS);
}
public static void renameGroup(AbstractOperator operator, String domName, String oldName, String newName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "重命名权限组 %s 为 %s 失败", oldName, newName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "重命名权限组 %s 为 %s 成功", oldName, newName);
if (newName.contains(" ")) {
operator.setResponse(FAIL.addMessage("权限组名称不能包含空格"));
return;
}
DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName));
return;
}
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法重命名权限组", domName));
return;
}
GroupDTO group = GroupDTO.select(dominion.getId(), oldName);
if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, oldName));
return;
}
group = group.setName(newName);
if (group == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员"));
return;
}
operator.setResponse(SUCCESS);
}
public static void addMember(AbstractOperator operator, String domName, String groupName, String playerName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "添加成员 %s 到权限组 %s 失败", playerName, groupName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "添加成员 %s 到权限组 %s 成功", playerName, groupName);
DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName));
return;
}
GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你没有权限修改领地 %s 的权限组 %s 成员", domName, groupName));
return;
}
if (group.getAdmin() && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法添加成员到管理员权限组", domName));
return;
}
PlayerDTO player = PlayerDTO.select(playerName);
if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", playerName));
return;
}
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员,无法直接加入权限组", playerName, domName));
return;
}
if (Objects.equals(privilege.getGroupId(), group.getId())) {
operator.setResponse(FAIL.addMessage("玩家 %s 已在权限组 %s 中", playerName, groupName));
return;
}
if (notOwner(operator, dominion) && privilege.getAdmin()) {
operator.setResponse(FAIL.addMessage("%s 是管理员,你不是领地 %s 的拥有者,无法添加管理员到权限组", playerName, domName));
return;
}
privilege = privilege.setGroupId(group.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员"));
return;
}
operator.setResponse(SUCCESS);
}
public static void removeMember(AbstractOperator operator, String domName, String groupName, String playerName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "从权限组 %s 移除成员 %s 失败", groupName, playerName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "从权限组 %s 移除成员 %s 成功", groupName, playerName);
DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName));
return;
}
GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你没有权限移除领地 %s 的权限组 %s 成员", domName, groupName));
return;
}
if (group.getAdmin() && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法从管理员权限组移除成员", domName));
return;
}
PlayerDTO player = PlayerDTO.select(playerName);
if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", playerName));
return;
}
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, domName));
return;
}
if (!Objects.equals(privilege.getGroupId(), group.getId())) {
operator.setResponse(FAIL.addMessage("玩家 %s 不在权限组 %s 中", playerName, groupName));
return;
}
privilege = privilege.setGroupId(-1);
if (privilege == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员"));
return;
}
operator.setResponse(SUCCESS);
}
}

View File

@ -0,0 +1,152 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.*;
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;
import static cn.lunadeer.dominion.controllers.Apis.notOwner;
public class MemberController {
/**
* 清空玩家成员权限
*
* @param operator 操作者
* @param player_name 玩家
* @param dominionName 领地名称
*/
public static void memberRemove(AbstractOperator operator, String dominionName, String player_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "将玩家 %s 从领地 %s 移除失败", player_name, dominionName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "将玩家 %s 从领地 %s 移除成功", player_name, dominionName);
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName));
return;
}
if (privilege.getAdmin() && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法移除一个领地管理员", dominionName));
return;
}
MemberDTO.delete(player.getUuid(), dominion.getId());
operator.setResponse(SUCCESS);
}
/**
* 设置玩家成员权限
*
* @param operator 操作者
* @param player_name 玩家
* @param flag 权限名称
* @param value 权限值
* @param dominionName 领地名称
*/
public static void setMemberFlag(AbstractOperator operator, String dominionName, String player_name, String flag, boolean value) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 失败", player_name, dominionName, flag, value);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 成功", player_name, dominionName, flag, value);
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName));
return;
}
if ((flag.equals("admin") || privilege.getAdmin()) && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他玩家管理员的权限", dominionName));
return;
}
if (flag.equals("admin")) {
privilege.setAdmin(value);
} else {
Flag f = Flag.getFlag(flag);
if (f == null) {
operator.setResponse(FAIL.addMessage("未知的领地权限 %s", flag));
return;
}
privilege.setFlagValue(f, value);
}
operator.setResponse(SUCCESS);
}
public static void memberAdd(AbstractOperator operator, String dominionName, String player_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "将玩家 %s 添加到领地成员 %s 失败", player_name, dominionName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "将玩家 %s 添加到领地成员 %s 成功", player_name, dominionName);
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege != null) {
operator.setResponse(FAIL.addMessage("玩家 %s 已经是领地 %s 的成员", player_name, dominionName));
return;
}
privilege = MemberDTO.insert(new MemberDTO(player.getUuid(), dominion));
if (privilege == null) {
operator.setResponse(FAIL);
} else {
operator.setResponse(SUCCESS);
}
}
public static void applyTemplate(AbstractOperator operator, String dominionName, String playerName, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "应用模板 %s 到玩家 %s 在领地 %s 的权限成功", templateName, playerName, dominionName);
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "应用模板 %s 到玩家 %s 在领地 %s 的权限失败", templateName, playerName, dominionName);
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerDTO.select(playerName);
if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", playerName));
return;
}
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, dominionName));
return;
}
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) {
operator.setResponse(FAIL.addMessage("模板 %s 不存在", templateName));
return;
}
if (notOwner(operator, dominion) && privilege.getAdmin()) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName));
return;
}
privilege = privilege.applyTemplate(template);
if (privilege == null) {
operator.setResponse(FAIL);
} else {
operator.setResponse(SUCCESS);
}
}
}

View File

@ -2,6 +2,7 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
@ -20,6 +21,9 @@ public class PlayerController {
}
public static List<PlayerDTO> allPlayers() {
return PlayerDTO.all();
List<PlayerDTO> players = PlayerDTO.all();
// 按照名字排序
players.sort(Comparator.comparing(PlayerDTO::getLastKnownName));
return players;
}
}

View File

@ -1,178 +0,0 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.entity.Player;
import java.util.UUID;
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;
import static cn.lunadeer.dominion.controllers.Apis.notOwner;
public class PrivilegeController {
/**
* 清空玩家成员权限
*
* @param operator 操作者
* @param player_name 玩家
* @return 是否清空成功
*/
public static void clearPrivilege(AbstractOperator operator, String player_name) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion clear_privilege <玩家名称> <领地名称>"));
return;
}
clearPrivilege(operator, player_name, dominion.getName());
}
/**
* 清空玩家成员权限
*
* @param operator 操作者
* @param player_name 玩家
* @param dominionName 领地名称
* @return 是否清空成功
*/
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);
if (dominion == null) {
operator.setResponse(FAIL.appendMessage("领地 %s 不存在", dominionName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
operator.setResponse(FAIL.appendMessage("玩家 %s 不存在或没有登录过", player_name));
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());
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "清空玩家 %s 在领地 %s 的权限成功", player_name, dominionName));
}
/**
* 设置玩家成员权限
*
* @param operator 操作者
* @param player_name 玩家
* @param flag 权限名称
* @param value 权限值
* @return 是否设置成功
*/
public static void setPrivilege(AbstractOperator operator, String player_name, String flag, boolean value) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]"));
return;
}
setPrivilege(operator, player_name, flag, value, dominion.getName());
}
/**
* 设置玩家成员权限
*
* @param operator 操作者
* @param player_name 玩家
* @param flag 权限名称
* @param value 权限值
* @param dominionName 领地名称
* @return 是否设置成功
*/
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);
if (dominion == null) {
operator.setResponse(FAIL.appendMessage("领地 %s 不存在", dominionName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
operator.setResponse(FAIL.appendMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
privilege = createPlayerPrivilege(operator, player.getUuid(), dominion);
if (privilege == null) return;
}
if (flag.equals("admin")) {
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.appendMessage("你不是领地 %s 的拥有者,无法设置/取消其他玩家为管理员", dominionName));
return;
}
privilege.setAdmin(value);
} else {
Flag f = Flag.getFlag(flag);
if (f == null) {
operator.setResponse(FAIL.appendMessage("未知的领地权限 %s", flag));
return;
}
privilege.setFlagValue(f, value);
}
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 成功", player_name, dominionName, flag, value));
}
public static void createPrivilege(AbstractOperator operator, String player_name) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不在任何领地内,请指定领地名称 /dominion create_privilege <玩家名称> <领地名称>"));
return;
}
createPrivilege(operator, player_name, dominion.getName());
}
public static void createPrivilege(AbstractOperator operator, String player_name, String dominionName) {
DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在,无法创建成员权限", dominionName));
return;
}
if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "玩家 %s 不存在或没有登录过", player_name));
return;
}
if (createPlayerPrivilege(operator, player.getUuid(), dominion) != null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建玩家 %s 在领地 %s 的成员权限成功", player_name, dominionName));
}
}
private static PlayerPrivilegeDTO createPlayerPrivilege(AbstractOperator operator, UUID player, DominionDTO dom) {
XLogger.debug("operator: " + operator.getUniqueId() + " player: " + player);
if (operator.getUniqueId().equals(player)) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不能给自己设置成员权限"));
return null;
}
PlayerDTO playerDTO = PlayerDTO.select(player);
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) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建玩家成员权限失败,请联系管理员"));
return null;
}
return privilege;
}
}

View File

@ -0,0 +1,69 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import java.util.List;
public class TemplateController {
public static void createTemplate(AbstractOperator operator, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建成功");
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建失败");
if (templateName.contains(" ")) {
operator.setResponse(FAIL.addMessage("模板名称不能包含空格"));
return;
}
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId());
for (PrivilegeTemplateDTO template : templates) {
if (template.getName().equals(templateName)) {
operator.setResponse(FAIL.addMessage("已经存在名为 %s 的权限模板", templateName));
return;
}
}
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.create(operator.getUniqueId(), templateName);
if (template == null) {
operator.setResponse(FAIL.addMessage("可能是数据库错误,请联系管理员"));
return;
}
operator.setResponse(SUCCESS.addMessage("成功创建名为 %s 的权限模板", templateName));
}
public static void deleteTemplate(AbstractOperator operator, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "删除成功");
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除失败");
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) {
operator.setResponse(FAIL.addMessage("模板不存在"));
return;
}
if (!template.getCreator().equals(operator.getUniqueId())) {
operator.setResponse(FAIL.addMessage("这不是你的模板"));
return;
}
PrivilegeTemplateDTO.delete(operator.getUniqueId(), templateName);
operator.setResponse(SUCCESS);
}
public static void setTemplateFlag(AbstractOperator operator, String templateName, String flag_name, boolean value) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置成功");
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置失败");
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) {
operator.setResponse(FAIL.addMessage("模板不存在"));
return;
}
if (flag_name.equals("admin")) {
template.setAdmin(value);
} else {
Flag f = Flag.getFlag(flag_name);
if (f == null) {
operator.setResponse(FAIL.addMessage("未知的权限 %s", flag_name));
return;
}
template.setFlagValue(f, value);
}
operator.setResponse(SUCCESS.addMessage("成功设置模板 " + template.getName() + " 的权限 " + flag_name + "" + value));
}
}

View File

@ -0,0 +1,57 @@
package cn.lunadeer.dominion.cuis;
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.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class CreateDominion {
private static class createDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
public createDominionCB(Player sender) {
this.sender = sender;
}
@Override
public void handleData(String input) {
XLogger.debug("createDominionCB.run: %s", input);
autoPoints(sender);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
Map<Integer, Location> points = Dominion.pointsSelect.get(sender.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "自动选点失败");
return;
}
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) {
DominionManage.show(sender, new String[]{"list"});
}
});
DominionController.create(operator, input, points.get(0), points.get(1));
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback createDominionCB = new createDominionCB(player);
CuiTextInput view = CuiTextInput.create(createDominionCB).setText("未命名领地").title("输入要创建的领地名称");
view.setSuggestCommand("/dominion auto_create <领地名称>");
view.open(player);
}
}

View File

@ -0,0 +1,50 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.GroupController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupList;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class CreateGroup {
private static class createGroupCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public createGroupCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("createGroupCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
GroupController.createGroup(operator, dominionName, input);
GroupList.show(sender, dominionName);
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback createGroupCB = new createGroupCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(createGroupCB).setText("未命名权限组").title("输入要创建的权限组名称");
view.setSuggestCommand("/dominion group create <领地名称> <权限组名称>");
view.open(player);
}
}

View File

@ -0,0 +1,40 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.tuis.template.TemplateList;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class CreateTemplate {
private static class createTemplateCB implements CuiTextInput.InputCallback {
private final Player sender;
public createTemplateCB(Player sender) {
this.sender = sender;
}
@Override
public void handleData(String input) {
XLogger.debug("createTemplateCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
TemplateController.createTemplate(operator, input);
TemplateList.show(sender);
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player);
CuiTextInput view = CuiTextInput.create(createTemplateCB).setText("未命名模板").title("输入模板名称");
view.setSuggestCommand("/dominion template create <模板名称>");
view.open(player);
}
}

View File

@ -0,0 +1,48 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class EditJoinMessage {
private static class editJoinMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editJoinMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editJoinMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setJoinMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title("编辑欢迎提示语");
view.setSuggestCommand("/dominion set_enter_msg <提示语> [领地名称]");
view.open(player);
}
}

View File

@ -0,0 +1,48 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class EditLeaveMessage {
private static class editLeaveMessageCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public editLeaveMessageCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editLeaveMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setLeaveMessage(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title("编辑离开提示语");
view.setSuggestCommand("/dominion set_leave_msg <提示语> [领地名称]");
view.open(player);
}
}

View File

@ -0,0 +1,59 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.MemberController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class MemberAdd {
private static class memberAddCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public memberAddCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("createPrivilegeCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) {
MemberList.show(sender, dominionName);
} else {
SelectPlayer.show(sender, dominionName, 1);
}
});
MemberController.memberAdd(operator, dominionName, input);
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback createPrivilegeCB = new memberAddCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员");
view.setSuggestCommand("/dominion member add <领地名称> <玩家名称>");
view.open(player);
}
}

View File

@ -0,0 +1,41 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class RenameDominion {
private static class renameDominionCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String oldName;
public renameDominionCB(Player sender, String oldName) {
this.sender = sender;
this.oldName = oldName;
}
@Override
public void handleData(String input) {
XLogger.debug("renameDominionCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.rename(operator, oldName, input);
DominionManage.show(sender, new String[]{"manage", input});
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]);
CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title("领地重命名");
view.setSuggestCommand("/dominion rename <原领地名称> <新领地名称>");
view.open(player);
}
}

View File

@ -0,0 +1,52 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.GroupController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class RenameGroup {
private static class renameGroupCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
private final String oldName;
public renameGroupCB(Player sender, String dominionName, String oldName) {
this.sender = sender;
this.dominionName = dominionName;
this.oldName = oldName;
}
@Override
public void handleData(String input) {
XLogger.debug("renameGroupCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
GroupController.renameGroup(operator, dominionName, oldName, input);
GroupSetting.show(sender, dominionName, input);
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback renameGroupCB = new renameGroupCB(player, dominion.getName(), args[2]);
CuiTextInput view = CuiTextInput.create(renameGroupCB).setText(args[2]).title("输入新的权限组名称");
view.setSuggestCommand("/dominion group rename <领地名称> <权限组旧名称> <新名称>");
view.open(player);
}
}

View File

@ -0,0 +1,49 @@
package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class SetMapColor {
private static class setMapColorCB implements CuiTextInput.InputCallback {
private final Player sender;
private final String dominionName;
public setMapColorCB(Player sender, String dominionName) {
this.sender = sender;
this.dominionName = dominionName;
}
@Override
public void handleData(String input) {
XLogger.debug("editLeaveMessageCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
DominionController.setMapColor(operator, input, dominionName);
DominionManage.show(sender, new String[]{"manage", dominionName});
}
}
public static void open(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地不存在");
return;
}
CuiTextInput.InputCallback setMapColorCB = new SetMapColor.setMapColorCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(setMapColorCB).setText(dominion.getColor()).title("输入卫星地图地块颜色16进制");
view.setSuggestCommand("/dominion set_map_color <颜色> [领地名称]");
view.open(player);
}
}

View File

@ -3,6 +3,11 @@ package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.FieldType;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import org.bukkit.Location;
import org.bukkit.World;
@ -13,40 +18,44 @@ import java.util.*;
public class DominionDTO {
private static List<DominionDTO> query(String sql, Object... args) {
List<DominionDTO> dominions = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, args)) {
if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) {
// 如果是更新操作重新加载缓存
Cache.instance.loadDominions();
}
if (rs == null) return dominions;
while (rs.next()) {
Integer id = rs.getInt("id");
UUID owner = UUID.fromString(rs.getString("owner"));
String name = rs.getString("name");
String world = rs.getString("world");
Integer x1 = rs.getInt("x1");
Integer y1 = rs.getInt("y1");
Integer z1 = rs.getInt("z1");
Integer x2 = rs.getInt("x2");
Integer y2 = rs.getInt("y2");
Integer z2 = rs.getInt("z2");
Integer parentDomId = rs.getInt("parent_dom_id");
String tp_location = rs.getString("tp_location");
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getDominionFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId,
rs.getString("join_message"),
rs.getString("leave_message"),
flags,
tp_location
);
dominions.add(dominion);
}
try (ResultSet rs = DatabaseManager.instance.query(sql, args)) {
return getDTOFromRS(rs);
} catch (SQLException e) {
Dominion.database.handleDatabaseError("数据库操作失败: ", e, sql);
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, sql);
}
return dominions;
}
private static List<DominionDTO> getDTOFromRS(ResultSet rs) throws SQLException {
List<DominionDTO> dominions = new ArrayList<>();
if (rs == null) return dominions;
while (rs.next()) {
Integer id = rs.getInt("id");
UUID owner = UUID.fromString(rs.getString("owner"));
String name = rs.getString("name");
String world = rs.getString("world");
Integer x1 = rs.getInt("x1");
Integer y1 = rs.getInt("y1");
Integer z1 = rs.getInt("z1");
Integer x2 = rs.getInt("x2");
Integer y2 = rs.getInt("y2");
Integer z2 = rs.getInt("z2");
Integer parentDomId = rs.getInt("parent_dom_id");
String tp_location = rs.getString("tp_location");
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getDominionFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
String color = rs.getString("color");
DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId,
rs.getString("join_message"),
rs.getString("leave_message"),
flags,
tp_location,
color
);
dominions.add(dominion);
}
return dominions;
}
@ -106,73 +115,33 @@ public class DominionDTO {
}
public static DominionDTO insert(DominionDTO dominion) {
String sql = "INSERT INTO dominion (" +
"owner, name, world, x1, y1, z1, x2, y2, z2, ";
for (Flag f : Flag.getAllDominionFlags()) {
sql += f.getFlagName() + ", ";
InsertRow insert = new InsertRow().returningAll().table("dominion").onConflictDoNothing(new Field("id", null));
insert.field(dominion.owner)
.field(dominion.name)
.field(dominion.world)
.field(dominion.x1).field(dominion.y1).field(dominion.z1)
.field(dominion.x2).field(dominion.y2).field(dominion.z2)
.field(dominion.parentDomId)
.field(dominion.joinMessage).field(dominion.leaveMessage)
.field(dominion.tp_location);
for (Flag f : Flag.getDominionFlagsEnabled()) {
insert.field(new Field(f.getFlagName(), f.getDefaultValue()));
}
sql += "tp_location";
sql += ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ";
for (Flag f : Flag.getAllDominionFlags()) {
sql += f.getDefaultValue() + ", ";
try (ResultSet rs = insert.execute()) {
Cache.instance.loadDominions();
List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.size() == 0) return null;
return dominions.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString());
return null;
}
sql += "'default'";
sql += ") RETURNING *;";
List<DominionDTO> dominions = query(sql,
dominion.getOwner(),
dominion.getName(),
dominion.getWorld(),
dominion.getX1(),
dominion.getY1(),
dominion.getZ1(),
dominion.getX2(),
dominion.getY2(),
dominion.getZ2());
if (dominions.size() == 0) return null;
return dominions.get(0);
}
public static void delete(DominionDTO dominion) {
String sql = "DELETE FROM dominion WHERE id = ?;";
query(sql, dominion.getId());
}
private static DominionDTO update(DominionDTO dominion) {
String tp_location;
if (dominion.getTpLocation() == null) {
tp_location = "default";
} else {
Location loc = dominion.getTpLocation();
tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ();
}
String sql = "UPDATE dominion SET " +
"owner = ?," +
"name = ?," +
"world = ?," +
"x1 = " + dominion.getX1() + ", " +
"y1 = " + dominion.getY1() + ", " +
"z1 = " + dominion.getZ1() + ", " +
"x2 = " + dominion.getX2() + ", " +
"y2 = " + dominion.getY2() + ", " +
"z2 = " + dominion.getZ2() + ", " +
"parent_dom_id = " + dominion.getParentDomId() + ", " +
"join_message = ?," +
"leave_message = ?,";
for (Flag f : Flag.getDominionFlagsEnabled()) {
sql += f.getFlagName() + " = " + dominion.getFlagValue(f) + ",";
}
sql += "tp_location = ?" +
" WHERE id = " + dominion.getId() +
" RETURNING *;";
List<DominionDTO> dominions = query(sql,
dominion.getOwner().toString(),
dominion.getName(),
dominion.getWorld(),
dominion.getJoinMessage(),
dominion.getLeaveMessage(),
tp_location);
if (dominions.size() == 0) return null;
return dominions.get(0);
Cache.instance.loadDominions();
}
private DominionDTO(Integer id, UUID owner, String name, String world,
@ -180,39 +149,41 @@ public class DominionDTO {
Integer parentDomId,
String joinMessage, String leaveMessage,
Map<Flag, Boolean> flags,
String tp_location) {
this.id = id;
this.owner = owner;
this.name = name;
this.world = world;
this.x1 = x1;
this.y1 = y1;
this.z1 = z1;
this.x2 = x2;
this.y2 = y2;
this.z2 = z2;
this.parentDomId = parentDomId;
this.joinMessage = joinMessage;
this.leaveMessage = leaveMessage;
String tp_location,
String color) {
this.id.value = id;
this.owner.value = owner.toString();
this.name.value = name;
this.world.value = world;
this.x1.value = x1;
this.y1.value = y1;
this.z1.value = z1;
this.x2.value = x2;
this.y2.value = y2;
this.z2.value = z2;
this.parentDomId.value = parentDomId;
this.joinMessage.value = joinMessage;
this.leaveMessage.value = leaveMessage;
this.flags.putAll(flags);
this.tp_location = tp_location;
this.tp_location.value = tp_location;
this.color.value = color;
}
private DominionDTO(Integer id, UUID owner, String name, String world,
Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2,
Integer parentDomId) {
this.id = id;
this.owner = owner;
this.name = name;
this.world = world;
this.x1 = x1;
this.y1 = y1;
this.z1 = z1;
this.x2 = x2;
this.y2 = y2;
this.z2 = z2;
this.parentDomId = parentDomId;
this.id.value = id;
this.owner.value = owner.toString();
this.name.value = name;
this.world.value = world;
this.x1.value = x1;
this.y1.value = y1;
this.z1.value = z1;
this.x2.value = x2;
this.y2.value = y2;
this.z2.value = z2;
this.parentDomId.value = parentDomId;
}
public DominionDTO(UUID owner, String name, String world,
@ -220,141 +191,165 @@ public class DominionDTO {
this(null, owner, name, world, x1, y1, z1, x2, y2, z2, -1);
}
private Integer id;
private UUID owner;
private String name;
private final String world;
private Integer x1;
private Integer y1;
private Integer z1;
private Integer x2;
private Integer y2;
private Integer z2;
private Integer parentDomId = -1;
private String joinMessage = "欢迎";
private String leaveMessage = "再见";
private final Field id = new Field("id", FieldType.INT);
private final Field owner = new Field("owner", FieldType.STRING);
private final Field name = new Field("name", FieldType.STRING);
private final Field world = new Field("world", FieldType.STRING);
private final Field x1 = new Field("x1", FieldType.INT);
private final Field y1 = new Field("y1", FieldType.INT);
private final Field z1 = new Field("z1", FieldType.INT);
private final Field x2 = new Field("x2", FieldType.INT);
private final Field y2 = new Field("y2", FieldType.INT);
private final Field z2 = new Field("z2", FieldType.INT);
private final Field parentDomId = new Field("parent_dom_id", -1);
private final Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}");
private final Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~");
private final Map<Flag, Boolean> flags = new HashMap<>();
private String tp_location;
private final Field tp_location = new Field("tp_location", "default");
private final Field color = new Field("color", "#00BFFF");
// getters and setters
public Integer getId() {
return id;
}
public DominionDTO setId(Integer id) {
this.id = id;
return update(this);
return (Integer) id.value;
}
public UUID getOwner() {
return owner;
return UUID.fromString((String) owner.value);
}
private DominionDTO doUpdate(UpdateRow updateRow) {
updateRow.returningAll(id)
.table("dominion")
.where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) {
List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.size() == 0) return null;
Cache.instance.loadDominions((Integer) id.value);
return dominions.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString());
return null;
}
}
public DominionDTO setOwner(UUID owner) {
this.owner = owner;
return update(this);
this.owner.value = owner.toString();
return doUpdate(new UpdateRow().field(this.owner));
}
public String getName() {
return name;
return (String) name.value;
}
public DominionDTO setName(String name) {
this.name = name;
return update(this);
this.name.value = name;
return doUpdate(new UpdateRow().field(this.name));
}
public String getWorld() {
return world;
return (String) world.value;
}
public Integer getX1() {
return x1;
return (Integer) x1.value;
}
public DominionDTO setX1(Integer x1) {
this.x1 = x1;
return update(this);
this.x1.value = x1;
return doUpdate(new UpdateRow().field(this.x1));
}
public Integer getY1() {
return y1;
return (Integer) y1.value;
}
public DominionDTO setY1(Integer y1) {
this.y1 = y1;
return update(this);
this.y1.value = y1;
return doUpdate(new UpdateRow().field(this.y1));
}
public Integer getZ1() {
return z1;
return (Integer) z1.value;
}
public DominionDTO setZ1(Integer z1) {
this.z1 = z1;
return update(this);
this.z1.value = z1;
return doUpdate(new UpdateRow().field(this.z1));
}
public Integer getX2() {
return x2;
return (Integer) x2.value;
}
public DominionDTO setX2(Integer x2) {
this.x2 = x2;
return update(this);
this.x2.value = x2;
return doUpdate(new UpdateRow().field(this.x2));
}
public Integer getY2() {
return y2;
return (Integer) y2.value;
}
public DominionDTO setY2(Integer y2) {
this.y2 = y2;
return update(this);
this.y2.value = y2;
return doUpdate(new UpdateRow().field(this.y2));
}
public Integer getZ2() {
return z2;
return (Integer) z2.value;
}
public DominionDTO setZ2(Integer z2) {
this.z2 = z2;
return update(this);
this.z2.value = z2;
return doUpdate(new UpdateRow().field(this.z2));
}
public Integer getSquare() {
return (x2 - x1) * (z2 - z1);
return (getX2() - getX1() + 1) * (getZ2() - getZ1() + 1);
}
public Integer getVolume() {
return getSquare() * (y2 - y1);
return getSquare() * (getY2() - getY1() + 1);
}
public Integer getWidthX() {
return getX2() - getX1() + 1;
}
public Integer getHeight() {
return getY2() - getY1() + 1;
}
public Integer getWidthZ() {
return getZ2() - getZ1() + 1;
}
public Integer getParentDomId() {
return parentDomId;
return (Integer) parentDomId.value;
}
public DominionDTO setParentDomId(Integer parentDomId) {
this.parentDomId = parentDomId;
return update(this);
this.parentDomId.value = parentDomId;
return doUpdate(new UpdateRow().field(this.parentDomId));
}
public String getJoinMessage() {
return joinMessage;
return (String) joinMessage.value;
}
public DominionDTO setJoinMessage(String joinMessage) {
this.joinMessage = joinMessage;
return update(this);
this.joinMessage.value = joinMessage;
return doUpdate(new UpdateRow().field(this.joinMessage));
}
public String getLeaveMessage() {
return leaveMessage;
return (String) leaveMessage.value;
}
public DominionDTO setLeaveMessage(String leaveMessage) {
this.leaveMessage = leaveMessage;
return update(this);
this.leaveMessage.value = leaveMessage;
return doUpdate(new UpdateRow().field(this.leaveMessage));
}
public Boolean getFlagValue(Flag flag) {
@ -364,17 +359,18 @@ public class DominionDTO {
public DominionDTO setFlagValue(Flag flag, Boolean value) {
flags.put(flag, value);
return update(this);
Field flagField = new Field(flag.getFlagName(), value);
return doUpdate(new UpdateRow().field(flagField));
}
public DominionDTO setXYZ(Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) {
this.x1 = x1;
this.y1 = y1;
this.z1 = z1;
this.x2 = x2;
this.y2 = y2;
this.z2 = z2;
return update(this);
this.x1.value = x1;
this.y1.value = y1;
this.z1.value = z1;
this.x2.value = x2;
this.y2.value = y2;
this.z2.value = z2;
return doUpdate(new UpdateRow().field(this.x1).field(this.y1).field(this.z1).field(this.x2).field(this.y2).field(this.z2));
}
public Location getTpLocation() {
@ -382,8 +378,8 @@ public class DominionDTO {
return null;
} else {
// 0:0:0
String[] loc = tp_location.split(":");
World w = Dominion.instance.getServer().getWorld(world);
String[] loc = ((String) tp_location.value).split(":");
World w = Dominion.instance.getServer().getWorld(getWorld());
if (loc.length == 3 && w != null) {
return new Location(w, Integer.parseInt(loc[0]), Integer.parseInt(loc[1]), Integer.parseInt(loc[2]));
} else {
@ -395,15 +391,36 @@ public class DominionDTO {
}
public DominionDTO setTpLocation(Location loc) {
this.tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ();
return update(this);
this.tp_location.value = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ();
return doUpdate(new UpdateRow().field(tp_location));
}
public Location getLocation1() {
return new Location(Dominion.instance.getServer().getWorld(world), x1, y1, z1);
return new Location(Dominion.instance.getServer().getWorld(getWorld()), getX1(), getY1(), getZ1());
}
public Location getLocation2() {
return new Location(Dominion.instance.getServer().getWorld(world), x2, y2, z2);
return new Location(Dominion.instance.getServer().getWorld(getWorld()), getX2(), getY2(), getZ2());
}
public DominionDTO setColor(String color) {
this.color.value = color;
return doUpdate(new UpdateRow().field(this.color));
}
public int getColorR() {
return Integer.valueOf(getColor().substring(1, 3), 16);
}
public int getColorG() {
return Integer.valueOf(getColor().substring(3, 5), 16);
}
public int getColorB() {
return Integer.valueOf(getColor().substring(5, 7), 16);
}
public String getColor() {
return (String) color.value;
}
}

View File

@ -6,14 +6,16 @@ import cn.lunadeer.minecraftpluginutils.XLogger;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public enum Flag {
ANCHOR("anchor", "重生锚", "是否允许设置重生锚", false, false, true),
ANIMAL_KILLING("animal_killing", "对动物造成伤害", "是否允许对动物造成伤害", false, false, true),
ANIMAL_SPAWN("animal_spawn", "动物生成", "是否允许动物生成", true, true, false),
ANIMAL_SPAWN("animal_spawn", "动物生成(繁殖)", "是否允许动物生成(包括繁殖)", true, true, false),
ANVIL("anvil", "使用铁砧", "是否允许使用铁砧", false, false, true),
BEACON("beacon", "信标交互", "是否允许与信标交互", false, false, true),
BED("bed", "床交互", "是否允许使用床睡觉或设置重生点", false, false, true),
@ -24,14 +26,16 @@ public enum Flag {
CONTAINER("container", "一般容器", "包含:箱子/木桶/潜影盒/盔甲架/展示框", false, false, true),
CRAFT("craft", "使用工作台", "是否可以使用工作台", false, false, true),
CREEPER_EXPLODE("creeper_explode", "实体爆炸", "包含:苦力怕/凋零头颅/水晶爆炸", false, true, true),
COMPARER("comparer", "比较器交互", "是否可以与比较器交互", false, false, true),
DOOR("door", "门交互", "是否可以使用各种材质的门", false, false, true),
DYE("dye", "染色", "是否可以使用染料染色", false, false, true),
COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true),
DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true),
DRAGON_EGG("dragon_egg", "触碰龙蛋", "是否可以触碰龙蛋", false, false, true),
DYE("dye", "染色", "是否可以使用染料(对羊、狗项圈、猫项圈)染色", false, false, true),
EDIT_SIGN("edit_sign", "编辑告示牌", "是否可以编辑告示牌", false, false, true),
EGG("egg", "扔鸡蛋", "是否可以扔鸡蛋", false, false, true),
ENCHANT("enchant", "使用附魔台", "是否可以使用附魔台", false, false, true),
ENDER_MAN("ender_man", "末影人行为", "包含:末影人是否可以生成、瞬移", false, true, true),
ENDER_PEARL("ender_pearl", "投掷末影珍珠", "是否可以使用末影珍珠", false, false, true),
FEED("feed", "喂养", "是否可以喂养动物", false, false, true),
FEED("feed", "喂养动物", "是否可以喂养动物", false, false, true),
FIRE_SPREAD("fire_spread", "火焰蔓延", "是否可以火焰蔓延", false, true, true),
FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true),
FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false),
@ -39,7 +43,7 @@ public enum Flag {
HARVEST("harvest", "收获", "收获庄稼、作物", false, false, true),
HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true),
HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true),
HOPPER("hopper", "特殊容器", "包含:漏斗/熔炉/发射器", false, false, true),
HOPPER("hopper", "特殊容器", "包含:漏斗/熔炉/发射器/投掷器/高炉/烟熏炉", false, false, true),
IGNITE("ignite", "点燃", "是否可以使用打火石点火", false, false, true),
LEVER("lever", "使用拉杆", "是否可以使用拉杆", false, false, true),
MOB_DROP_ITEM("mob_drop_item", "生物战利品掉落", "生物死亡时是否产生凋落物", true, true, true),
@ -52,13 +56,15 @@ public enum Flag {
REPEATER("repeater", "中继器交互", "是否可以与中继器交互", false, false, true),
SHEAR("shear", "剪羊毛", "是否可以剪羊毛", false, false, true),
SHOOT("shoot", "发射类型武器", "包括:射箭/雪球/三叉戟", false, false, true),
SHOW_BORDER("show_border", "显示领地边界", "是否显示领地边界", false, true, true),
SHOW_BORDER("show_border", "显示领地边界", "是否显示领地边界", true, true, true),
TELEPORT("teleport", "领地传送", "是否开启领地传送", false, false, true),
TNT_EXPLODE("tnt_explode", "TNT爆炸", "TNT是否可以爆炸", false, true, true),
TRADE("trade", "村民交易", "是否可以与村民交易", false, false, true),
TRAMPLE("trample", "作物践踏", "是否可以践踏作物(关闭意味着保护耕地)", false, true, true),
VEHICLE_DESTROY("vehicle_destroy", "破坏载具", "是否可以破坏载具(主要是矿车)", false, false, true),
VEHICLE_SPAWN("vehicle_spawn", "生成载具", "是否可以生成载具(主要是矿车)", false, false, true),
VILLAGER_KILLING("villager_killing", "对村民造成伤害", "是否可以对村民造成伤害", false, false, true),
VILLAGER_SPAWN("villager_spawn", "村民繁殖", "是否允许村民繁殖", true, true, true),
WITHER_SPAWN("wither_spawn", "凋零生成", "凋零生成", false, true, true),
;
private final String flag_name;
@ -117,6 +123,26 @@ public enum Flag {
return Arrays.asList(Flag.values());
}
public static List<Flag> getDominionOnlyFlagsEnabled() {
List<Flag> flags = new ArrayList<>();
for (Flag flag : Flag.values()) {
if (!flag.dominion_only) {
continue;
}
if (!flag.enable) {
continue;
}
flags.add(flag);
}
Comparator<Object> comparator = Collator.getInstance(java.util.Locale.CHINA);
flags.sort((o1, o2) -> comparator.compare(o1.getDisplayName(), o2.getDisplayName()));
return flags;
}
public static boolean isDominionOnlyFlag(String flagName) {
return getFlag(flagName).dominion_only;
}
public static List<Flag> getDominionFlagsEnabled() {
List<Flag> flags = new ArrayList<>();
for (Flag flag : Flag.values()) {
@ -125,6 +151,8 @@ public enum Flag {
}
flags.add(flag);
}
Comparator<Object> comparator = Collator.getInstance(java.util.Locale.CHINA);
flags.sort((o1, o2) -> comparator.compare(o1.getDisplayName(), o2.getDisplayName()));
return flags;
}
@ -144,6 +172,8 @@ public enum Flag {
}
flags.add(flag);
}
Comparator<Object> comparator = Collator.getInstance(java.util.Locale.CHINA);
flags.sort((o1, o2) -> comparator.compare(o1.getDisplayName(), o2.getDisplayName()));
return flags;
}
@ -162,16 +192,50 @@ public enum Flag {
return Arrays.stream(Flag.values()).filter(flag -> flag.getFlagName().equals(flagName)).findFirst().orElse(null);
}
/*
{
flag_name: {
display_name: "",
description: "",
default_value: true,
enable: true
/*
{
flag_name: {
display_name: "",
description: "",
default_value: true,
enable: true
}
}
*/
public static JSONObject serializeToJson(Flag flag) {
JSONObject json = new JSONObject();
json.put("display_name", flag.getDisplayName());
json.put("description", flag.getDescription());
json.put("default_value", flag.getDefaultValue());
json.put("enable", flag.getEnable());
return json;
}
public static JSONObject serializeToJson() {
JSONObject json = new JSONObject();
for (Flag flag : getAllFlags()) {
JSONObject flagJson = serializeToJson(flag);
json.put(flag.getFlagName(), flagJson);
}
return json;
}
public static void deserializeFromJson(JSONObject jsonObject) {
for (Flag flag : getAllFlags()) {
try {
JSONObject flagJson = (JSONObject) jsonObject.get(flag.getFlagName());
if (flagJson != null) {
flag.setDisplayName((String) flagJson.get("display_name"));
flag.setDescription((String) flagJson.get("description"));
flag.setDefaultValue((Boolean) flagJson.get("default_value"));
flag.setEnable((Boolean) flagJson.get("enable"));
}
} catch (Exception e) {
XLogger.warn("读取权限 %s 配置失败:%s已跳过", flag.getFlagName(), e.getMessage());
}
}
*/
}
public static void loadFromJson() {
try {
@ -184,19 +248,7 @@ public enum Flag {
XLogger.warn("读取权限配置失败,已重置");
saveToJson();
}
for (Flag flag : getAllFlags()) {
try {
JSONObject flagJson = (JSONObject) jsonObject.get(flag.getFlagName());
if (flagJson != null) {
flag.setDisplayName((String) flagJson.get("display_name"));
flag.setDescription((String) flagJson.get("description"));
flag.setDefaultValue((Boolean) flagJson.get("default_value"));
flag.setEnable((Boolean) flagJson.get("enable"));
}
} catch (Exception e) {
XLogger.warn("读取权限 %s 配置失败:%s已跳过", flag.getFlagName(), e.getMessage());
}
}
deserializeFromJson(jsonObject);
saveToJson(); // 复写一遍确保文件中包含所有权限
} catch (Exception e) {
XLogger.err("读取权限配置失败:%s", e.getMessage());
@ -205,15 +257,7 @@ public enum Flag {
public static void saveToJson() {
try {
JSONObject json = new JSONObject();
for (Flag f : getAllFlags()) {
JSONObject flagJson = new JSONObject();
flagJson.put("display_name", f.getDisplayName());
flagJson.put("description", f.getDescription());
flagJson.put("default_value", f.getDefaultValue());
flagJson.put("enable", f.enable);
json.put(f.getFlagName(), flagJson);
}
JSONObject json = serializeToJson();
XLogger.debug("保存权限配置:%s", json.toJSONString());
File flagFile = new File(Dominion.instance.getDataFolder(), "flags.json");
JsonFile.saveToFile(json, flagFile);

View File

@ -0,0 +1,180 @@
package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.FieldType;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupDTO {
Field id = new Field("id", FieldType.INT);
Field domID = new Field("dom_id", FieldType.INT);
Field name = new Field("name", FieldType.STRING);
Field admin = new Field("admin", FieldType.BOOLEAN);
private final Map<Flag, Boolean> flags = new HashMap<>();
public Integer getId() {
return (Integer) id.value;
}
public Integer getDomID() {
return (Integer) domID.value;
}
public String getName() {
return (String) name.value;
}
public Boolean getAdmin() {
return (Boolean) admin.value;
}
public Boolean getFlagValue(Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag);
}
public GroupDTO setName(String name) {
this.name.value = name;
UpdateRow updateRow = new UpdateRow().field(this.name);
return doUpdate(updateRow);
}
public GroupDTO setAdmin(Boolean admin) {
this.admin.value = admin;
UpdateRow updateRow = new UpdateRow().field(this.admin);
return doUpdate(updateRow);
}
public GroupDTO setFlagValue(Flag flag, Boolean value) {
flags.put(flag, value);
Field f = new Field(flag.getFlagName(), value);
UpdateRow updateRow = new UpdateRow().field(f);
return doUpdate(updateRow);
}
public static GroupDTO create(String name, DominionDTO dominionDTO) {
GroupDTO group = new GroupDTO(name, dominionDTO.getId());
InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null));
insertRow.table("dominion_group")
.field(group.domID)
.field(group.name)
.field(group.admin);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
insertRow.field(new Field(f.getFlagName(), dominionDTO.getFlagValue(f)));
}
try (ResultSet rs = insertRow.execute()) {
List<GroupDTO> groups = getDTOFromRS(rs);
if (groups.size() == 0) return null;
Cache.instance.loadGroups(groups.get(0).getId());
return groups.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("创建权限组失败: ", e, "");
return null;
}
}
public void delete() {
delete(getId());
}
public static void delete(Integer id) {
String sql = "DELETE FROM dominion_group WHERE id = ?;";
DatabaseManager.instance.query(sql, id);
Cache.instance.loadGroups(id);
List<MemberDTO> players = MemberDTO.selectByGroupId(id);
for (MemberDTO player : players) {
player.setGroupId(-1);
}
}
public static GroupDTO select(Integer id) {
String sql = "SELECT * FROM dominion_group WHERE id = ?;";
List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, id));
if (groups.size() == 0) return null;
return groups.get(0);
}
public static GroupDTO select(Integer domID, String name) {
String sql = "SELECT * FROM dominion_group WHERE dom_id = ? AND name = ?;";
List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, domID, name));
if (groups.size() == 0) return null;
return groups.get(0);
}
public static List<GroupDTO> selectAll() {
String sql = "SELECT * FROM dominion_group;";
return getDTOFromRS(DatabaseManager.instance.query(sql));
}
public static List<GroupDTO> selectByDominionId(Integer domID) {
String sql = "SELECT * FROM dominion_group WHERE dom_id = ?;";
return getDTOFromRS(DatabaseManager.instance.query(sql, domID));
}
private GroupDTO(String name, Integer domID) {
this.domID.value = domID;
this.name.value = name;
this.admin.value = false;
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, f.getDefaultValue());
}
}
private GroupDTO(Integer id, Integer domID, String name, Boolean admin, Map<Flag, Boolean> flags) {
this.id.value = id;
this.domID.value = domID;
this.name.value = name;
this.admin.value = admin;
this.flags.putAll(flags);
}
private static List<GroupDTO> getDTOFromRS(ResultSet rs) {
List<GroupDTO> list = new ArrayList<>();
if (rs == null) return list;
try {
while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
GroupDTO group = new GroupDTO(
rs.getInt("id"),
rs.getInt("dom_id"),
rs.getString("name"),
rs.getBoolean("admin"),
flags
);
list.add(group);
}
} catch (Exception e) {
DatabaseManager.handleDatabaseError("查询权限组失败: ", e, "");
}
return list;
}
private GroupDTO doUpdate(UpdateRow updateRow) {
updateRow.returningAll(id)
.table("dominion_group")
.where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) {
List<GroupDTO> groups = getDTOFromRS(rs);
if (groups.size() == 0) return null;
Cache.instance.loadGroups((Integer) id.value);
return groups.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("更新权限组失败: ", e, "");
return null;
}
}
}

View File

@ -0,0 +1,204 @@
package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.FieldType;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import java.sql.ResultSet;
import java.util.*;
public class MemberDTO {
private static List<MemberDTO> query(String sql, Object... params) {
List<MemberDTO> players = new ArrayList<>();
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
return getDTOFromRS(rs);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql);
}
return players;
}
private static List<MemberDTO> getDTOFromRS(ResultSet rs) {
List<MemberDTO> players = new ArrayList<>();
if (rs == null) return players;
try {
while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
MemberDTO player = new MemberDTO(
rs.getInt("id"),
UUID.fromString(rs.getString("player_uuid")),
rs.getBoolean("admin"),
rs.getInt("dom_id"),
flags,
rs.getInt("group_id")
);
players.add(player);
}
} catch (Exception e) {
DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, "");
}
return players;
}
private MemberDTO doUpdate(UpdateRow updateRow) {
updateRow.returningAll(id)
.table("dominion_member")
.where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) {
List<MemberDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
Cache.instance.loadMembers(getPlayerUUID());
return players.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, "");
return null;
}
}
public static MemberDTO insert(MemberDTO player) {
InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null))
.table("dominion_member")
.field(player.playerUUID)
.field(player.admin)
.field(player.domID);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f)));
}
try (ResultSet rs = insertRow.execute()) {
Cache.instance.loadMembers(player.getPlayerUUID());
List<MemberDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
return players.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, "");
return null;
}
}
public static MemberDTO select(UUID playerUUID, Integer dom_id) {
String sql = "SELECT * FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;";
List<MemberDTO> p = query(sql, playerUUID.toString(), dom_id);
if (p.size() == 0) return null;
return p.get(0);
}
public static List<MemberDTO> select(Integer dom_id) {
String sql = "SELECT * FROM dominion_member WHERE dom_id = ?;";
return query(sql, dom_id);
}
public static void delete(UUID player, Integer domID) {
String sql = "DELETE FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;";
query(sql, player.toString(), domID);
Cache.instance.loadMembers(player);
}
public static List<MemberDTO> selectAll() {
String sql = "SELECT * FROM dominion_member;";
return query(sql);
}
public static List<MemberDTO> selectAll(UUID player) {
String sql = "SELECT * FROM dominion_member WHERE player_uuid = ?;";
return query(sql, player.toString());
}
public static List<MemberDTO> selectByGroupId(Integer groupId) {
String sql = "SELECT * FROM dominion_member WHERE group_id = ?;";
return query(sql, groupId);
}
public static List<MemberDTO> selectByDomGroupId(Integer domId, Integer groupId) {
String sql = "SELECT * FROM dominion_member WHERE group_id = ? AND dom_id = ?;";
return query(sql, groupId, domId);
}
Field id = new Field("id", FieldType.INT);
Field playerUUID = new Field("player_uuid", FieldType.STRING);
Field admin = new Field("admin", FieldType.BOOLEAN);
Field domID = new Field("dom_id", FieldType.INT);
Field groupId = new Field("group_id", FieldType.INT);
public Integer getId() {
return (Integer) id.value;
}
public UUID getPlayerUUID() {
return UUID.fromString((String) playerUUID.value);
}
public Boolean getAdmin() {
return (Boolean) admin.value;
}
public Integer getDomID() {
return (Integer) domID.value;
}
public Integer getGroupId() {
return (Integer) groupId.value;
}
private final Map<Flag, Boolean> flags = new HashMap<>();
public Boolean getFlagValue(Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag);
}
public MemberDTO setFlagValue(Flag flag, Boolean value) {
flags.put(flag, value);
Field f = new Field(flag.getFlagName(), value);
UpdateRow updateRow = new UpdateRow().field(f);
return doUpdate(updateRow);
}
public MemberDTO setAdmin(Boolean admin) {
this.admin.value = admin;
UpdateRow updateRow = new UpdateRow().field(this.admin);
return doUpdate(updateRow);
}
public MemberDTO setGroupId(Integer groupId) {
this.groupId.value = groupId;
UpdateRow updateRow = new UpdateRow().field(this.groupId);
return doUpdate(updateRow);
}
public MemberDTO applyTemplate(PrivilegeTemplateDTO template) {
this.admin.value = template.getAdmin();
UpdateRow updateRow = new UpdateRow().field(admin);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
this.flags.put(f, template.getFlagValue(f));
updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f)));
}
return doUpdate(updateRow);
}
private MemberDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map<Flag, Boolean> flags, Integer groupId) {
this.id.value = id;
this.playerUUID.value = playerUUID.toString();
this.admin.value = admin;
this.domID.value = domID;
this.groupId.value = groupId;
this.flags.putAll(flags);
}
public MemberDTO(UUID playerUUID, DominionDTO dom) {
this.id.value = null;
this.playerUUID.value = playerUUID.toString();
this.admin.value = false;
this.domID.value = dom.getId();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
this.flags.put(f, dom.getFlagValue(f));
}
}
}

View File

@ -1,10 +1,17 @@
package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@ -19,29 +26,47 @@ public class PlayerDTO {
return re;
}
public static @Nullable PlayerDTO get(OfflinePlayer player) {
if (player.getName() == null) {
return null;
}
PlayerDTO re = select(player.getUniqueId());
if (re == null) {
re = insert(new PlayerDTO(player.getUniqueId(), player.getName(), System.currentTimeMillis()));
}
return re;
}
public static List<PlayerDTO> all() {
String sql = "SELECT * FROM player_name WHERE id > 0;";
return query(sql);
}
public PlayerDTO onJoin() {
public PlayerDTO onJoin(String name) {
this.setLastKnownName(name);
return update(this);
}
private static List<PlayerDTO> query(String sql, Object... params) {
List<PlayerDTO> players = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) {
if (rs == null) return players;
while (rs.next()) {
Integer id = rs.getInt("id");
UUID uuid = UUID.fromString(rs.getString("uuid"));
String lastKnownName = rs.getString("last_known_name");
Long lastJoinAt = rs.getTimestamp("last_join_at").getTime();
PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt);
players.add(player);
}
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
return getDTOFromRS(rs);
} catch (SQLException e) {
Dominion.database.handleDatabaseError("查询玩家信息失败: ", e, sql);
DatabaseManager.handleDatabaseError("查询玩家信息失败: ", e, sql);
}
return players;
}
private static List<PlayerDTO> getDTOFromRS(ResultSet rs) throws SQLException {
List<PlayerDTO> players = new ArrayList<>();
if (rs == null) return players;
while (rs.next()) {
Integer id = rs.getInt("id");
UUID uuid = UUID.fromString(rs.getString("uuid"));
String lastKnownName = rs.getString("last_known_name");
Long lastJoinAt = rs.getTimestamp("last_join_at").getTime();
PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt);
players.add(player);
}
return players;
}
@ -72,24 +97,44 @@ public class PlayerDTO {
}
private static PlayerDTO insert(PlayerDTO player) {
String sql = "INSERT INTO player_name (uuid, last_known_name, last_join_at) " +
"VALUES" +
" (?, ?, CURRENT_TIMESTAMP) " +
"RETURNING *;";
List<PlayerDTO> players = query(sql, player.getUuid().toString(), player.getLastKnownName());
if (players.size() == 0) return null;
return players.get(0);
Field uuid = new Field("uuid", player.getUuid().toString());
Field lastKnownName = new Field("last_known_name", player.getLastKnownName());
Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now()));
InsertRow insertRow = new InsertRow()
.table("player_name")
.field(uuid)
.field(lastKnownName)
.field(lastJoinAt)
.returningAll()
.onConflictOverwrite(new Field("id", null));
try (ResultSet rs = insertRow.execute()) {
List<PlayerDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
return players.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("插入玩家信息失败: ", e, insertRow.toString());
return null;
}
}
private static PlayerDTO update(PlayerDTO player) {
String sql = "UPDATE player_name SET " +
"last_known_name = ?, " +
"last_join_at = CURRENT_TIMESTAMP " +
"WHERE uuid = ? " +
"RETURNING *;";
List<PlayerDTO> players = query(sql, player.getLastKnownName(), player.getUuid().toString());
if (players.size() == 0) return null;
return players.get(0);
Field lastKnownName = new Field("last_known_name", player.getLastKnownName());
Field uuid = new Field("uuid", player.getUuid().toString());
Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now()));
UpdateRow updateRow = new UpdateRow()
.table("player_name")
.field(lastKnownName)
.field(lastJoinAt)
.where("uuid = ?", uuid.value)
.returningAll(uuid);
try (ResultSet rs = updateRow.execute()) {
List<PlayerDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
return players.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("更新玩家信息失败: ", e, updateRow.toString());
return null;
}
}
private PlayerDTO(Integer id, UUID uuid, String lastKnownName, Long lastJoinAt) {

View File

@ -1,157 +0,0 @@
package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import java.sql.ResultSet;
import java.util.*;
public class PlayerPrivilegeDTO {
public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) {
String sql = "INSERT INTO player_privilege (player_uuid, admin, dom_id, ";
for (Flag f : Flag.getAllPrivilegeFlags()) {
sql += f.getFlagName() + ", ";
}
sql = sql.substring(0, sql.length() - 2);
sql += ") VALUES ('" + player.getPlayerUUID() + "', " + player.getAdmin() + ", " + player.getDomID() + ", ";
for (Flag f : Flag.getAllPrivilegeFlags()) {
sql += player.getFlagValue(f) + ", ";
}
sql = sql.substring(0, sql.length() - 2);
sql += ") RETURNING *;";
List<PlayerPrivilegeDTO> players = query(sql);
if (players.size() == 0) return null;
return players.get(0);
}
public static PlayerPrivilegeDTO select(UUID playerUUID, Integer dom_id) {
String sql = "SELECT * FROM player_privilege WHERE player_uuid = ? AND dom_id = ?;";
List<PlayerPrivilegeDTO> p = query(sql, playerUUID.toString(), dom_id);
if (p.size() == 0) return null;
return p.get(0);
}
public static List<PlayerPrivilegeDTO> select(Integer dom_id) {
String sql = "SELECT * FROM player_privilege WHERE dom_id = ?;";
return query(sql, dom_id);
}
public static void delete(UUID player, Integer domID) {
String sql = "DELETE FROM player_privilege WHERE player_uuid = ? AND dom_id = ?;";
query(sql, player.toString(), domID);
}
public static List<PlayerPrivilegeDTO> selectAll() {
String sql = "SELECT * FROM player_privilege;";
return query(sql);
}
public static List<PlayerPrivilegeDTO> selectAll(UUID player) {
String sql = "SELECT * FROM player_privilege WHERE player_uuid = ?;";
return query(sql, player.toString());
}
private final Integer id;
private final UUID playerUUID;
private Boolean admin;
private final Integer domID;
public Integer getId() {
return id;
}
public UUID getPlayerUUID() {
return playerUUID;
}
public Boolean getAdmin() {
return admin;
}
public Integer getDomID() {
return domID;
}
private final Map<Flag, Boolean> flags = new HashMap<>();
public Boolean getFlagValue(Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag);
}
public PlayerPrivilegeDTO setFlagValue(Flag flag, Boolean value) {
flags.put(flag, value);
return update(this);
}
public PlayerPrivilegeDTO setAdmin(Boolean admin) {
this.admin = admin;
return update(this);
}
private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map<Flag, Boolean> flags) {
this.id = id;
this.playerUUID = playerUUID;
this.admin = admin;
this.domID = domID;
this.flags.putAll(flags);
}
public PlayerPrivilegeDTO(UUID playerUUID, DominionDTO dom) {
this.id = null;
this.playerUUID = playerUUID;
this.admin = false;
this.domID = dom.getId();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
this.flags.put(f, dom.getFlagValue(f));
}
}
private static List<PlayerPrivilegeDTO> query(String sql, Object... params) {
List<PlayerPrivilegeDTO> players = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) {
if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) {
// 如果是更新操作重新加载缓存
Cache.instance.loadPlayerPrivileges();
}
if (rs == null) return players;
while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
PlayerPrivilegeDTO player = new PlayerPrivilegeDTO(
rs.getInt("id"),
UUID.fromString(rs.getString("player_uuid")),
rs.getBoolean("admin"),
rs.getInt("dom_id"),
flags
);
players.add(player);
}
} catch (Exception e) {
Dominion.database.handleDatabaseError("查询玩家权限失败: ", e, sql);
}
return players;
}
private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) {
String sql = "UPDATE player_privilege SET " +
"admin = " + player.getAdmin() + ", " +
"dom_id = " + player.getDomID() + ", ";
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
sql += f.getFlagName() + " = " + player.getFlagValue(f) + ", ";
}
sql = sql.substring(0, sql.length() - 2);
sql += " WHERE id = " + player.getId() + " " +
"RETURNING *;";
List<PlayerPrivilegeDTO> players = query(sql);
if (players.size() == 0) return null;
return players.get(0);
}
}

View File

@ -0,0 +1,142 @@
package cn.lunadeer.dominion.dtos;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import java.sql.ResultSet;
import java.util.*;
public class PrivilegeTemplateDTO {
private static List<PrivilegeTemplateDTO> query(String sql, Object... params) {
List<PrivilegeTemplateDTO> templates = new ArrayList<>();
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
return getDTOFromRS(rs);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, sql);
}
return templates;
}
private static List<PrivilegeTemplateDTO> getDTOFromRS(ResultSet rs) {
List<PrivilegeTemplateDTO> templates = new ArrayList<>();
if (rs == null) return templates;
try {
while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(
rs.getInt("id"),
UUID.fromString(rs.getString("creator")),
rs.getString("name"),
rs.getBoolean("admin"),
flags
);
templates.add(template);
}
} catch (Exception e) {
DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, null);
}
return templates;
}
public static PrivilegeTemplateDTO create(UUID creator, String name) {
Field creatorField = new Field("creator", creator.toString());
Field nameField = new Field("name", name);
InsertRow insertRow = new InsertRow().table("privilege_template").onConflictDoNothing(new Field("id", null))
.field(creatorField)
.field(nameField)
.returningAll();
try (ResultSet rs = insertRow.execute()) {
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
if (templates.size() == 0) return null;
return templates.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("创建权限模版失败: ", e, null);
return null;
}
}
private PrivilegeTemplateDTO doUpdate(UpdateRow updateRow) {
Field id = new Field("id", this.id);
updateRow.returningAll(id)
.table("privilege_template")
.where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) {
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
if (templates.size() == 0) return null;
return templates.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, null);
return null;
}
}
public static PrivilegeTemplateDTO select(UUID creator, String name) {
String sql = "SELECT * FROM privilege_template WHERE creator = ? AND name = ?;";
List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name);
if (templates.size() == 0) return null;
return templates.get(0);
}
public static List<PrivilegeTemplateDTO> selectAll(UUID creator) {
String sql = "SELECT * FROM privilege_template WHERE creator = ?;";
return query(sql, creator.toString());
}
public static void delete(UUID creator, String name) {
String sql = "DELETE FROM privilege_template WHERE creator = ? AND name = ?;";
query(sql, creator.toString(), name);
}
private PrivilegeTemplateDTO(Integer id, UUID creator, String name, Boolean admin, Map<Flag, Boolean> flags) {
this.id = id;
this.creator = creator;
this.name = name;
this.admin = admin;
this.flags.putAll(flags);
}
private Integer id;
private UUID creator;
private String name;
private Boolean admin;
private final Map<Flag, Boolean> flags = new HashMap<>();
public Integer getId() {
return id;
}
public UUID getCreator() {
return creator;
}
public String getName() {
return name;
}
public Boolean getAdmin() {
return admin;
}
public Boolean getFlagValue(Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag);
}
public PrivilegeTemplateDTO setFlagValue(Flag flag, Boolean value) {
flags.put(flag, value);
return doUpdate(new UpdateRow().field(new Field(flag.getFlagName(), value)));
}
public PrivilegeTemplateDTO setAdmin(Boolean admin) {
this.admin = admin;
return doUpdate(new UpdateRow().field(new Field("admin", admin)));
}
}

View File

@ -4,21 +4,20 @@ import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.title.Title;
import net.md_5.bungee.api.ChatMessageType;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.inventory.Inventory;
public class Apis {
public static boolean canByPass(Player player, DominionDTO dom, PlayerPrivilegeDTO prev) {
public static boolean canByPass(Player player, DominionDTO dom, MemberDTO prev) {
if (player.isOp() && Dominion.config.getLimitOpBypass()) {
return true;
}
@ -49,13 +48,23 @@ public class Apis {
if (dom == null) {
return true;
}
PlayerPrivilegeDTO prev = Cache.instance.getPlayerPrivilege(player, dom);
MemberDTO prev = Cache.instance.getMember(player, dom);
if (canByPass(player, dom, prev)) {
return true;
}
if (prev != null) {
if (prev.getFlagValue(flag)) {
return true;
if (prev.getGroupId() == -1) {
if (prev.getFlagValue(flag)) {
return true;
}
} else {
GroupDTO group = Cache.instance.getGroup(prev.getGroupId());
if (group == null) {
return false;
}
if (group.getFlagValue(flag)) {
return true;
}
}
} else {
if (dom.getFlagValue(flag)) {
@ -66,8 +75,7 @@ public class Apis {
String.format("你没有 %s (%s) 权限", flag.getDisplayName(), flag.getDescription()),
Style.style(TextColor.color(0xFF0000), TextDecoration.BOLD))
.hoverEvent(Component.text(flag.getDescription()));
// Notification.error(player, msg);
player.sendActionBar(msg);
Notification.actionBar(player, msg);
if (event != null) {
event.setCancelled(true);
}

View File

@ -3,7 +3,6 @@ package cn.lunadeer.dominion.events;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import com.destroystokyo.paper.event.entity.EndermanEscapeEvent;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.*;
@ -16,6 +15,7 @@ import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityTeleportEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import java.util.Objects;
@ -97,6 +97,9 @@ public class EnvironmentEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // trample
public void onFarmlandTrample(PlayerInteractEvent event) {
if (event.getAction() != Action.PHYSICAL) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
@ -104,11 +107,7 @@ public class EnvironmentEvents implements Listener {
if (block.getType() != FARMLAND) {
return;
}
if (event.getAction() != Action.PHYSICAL) {
return;
}
Location location = block.getLocation();
DominionDTO dom = Cache.instance.getDominion(location);
DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.TRAMPLE, event);
}
@ -133,8 +132,11 @@ public class EnvironmentEvents implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST) // ender_man escape
public void onEnderManEscape(EndermanEscapeEvent event) {
public void onEnderManEscape(EntityTeleportEvent event) {
Entity entity = event.getEntity();
if (entity.getType() != EntityType.ENDERMAN) {
return;
}
DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.ENDER_MAN, event);
}
@ -158,4 +160,14 @@ public class EnvironmentEvents implements Listener {
DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.ANIMAL_SPAWN, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // villager_spawn
public void onVillagerSpawn(CreatureSpawnEvent event) {
Entity entity = event.getEntity();
if (entity.getType() != EntityType.VILLAGER) {
return;
}
DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.VILLAGER_SPAWN, event);
}
}

View File

@ -6,17 +6,15 @@ import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Teleport;
import io.papermc.paper.event.entity.EntityDyeEvent;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityPlaceEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
@ -27,6 +25,7 @@ import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.*;
import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.material.Colorable;
import org.spigotmc.event.entity.EntityMountEvent;
import static cn.lunadeer.dominion.events.Apis.checkFlag;
@ -37,7 +36,13 @@ public class PlayerEvents implements Listener {
public void onPlayerJoin(PlayerJoinEvent event) {
Player bukkitPlayer = event.getPlayer();
PlayerDTO player = PlayerDTO.get(bukkitPlayer);
player.onJoin(); // update name
player.onJoin(bukkitPlayer.getName()); // update name
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player bukkitPlayer = event.getPlayer();
Cache.instance.onPlayerQuit(bukkitPlayer);
}
@EventHandler(priority = EventPriority.HIGHEST) // anchor
@ -97,9 +102,19 @@ public class PlayerEvents implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST) // bed
public void onBedUse(PlayerBedEnterEvent event) {
public void onBedUse(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
return;
}
Player bukkitPlayer = event.getPlayer();
DominionDTO dom = Cache.instance.getDominion(event.getBed().getLocation());
Block block = event.getClickedBlock();
if (block == null) {
return;
}
if (!(Tag.BEDS.isTagged(block.getType()))) {
return;
}
DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.BED, bukkitPlayer, event);
}
@ -150,36 +165,30 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // button
public void onButton(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
return;
}
Player player = event.getPlayer();
if (event.getClickedBlock() == null) {
return;
}
Material clicked = event.getClickedBlock().getType();
if (clicked != Material.STONE_BUTTON &&
clicked != Material.BAMBOO_BUTTON &&
clicked != Material.OAK_BUTTON &&
clicked != Material.SPRUCE_BUTTON &&
clicked != Material.BIRCH_BUTTON &&
clicked != Material.JUNGLE_BUTTON &&
clicked != Material.ACACIA_BUTTON &&
clicked != Material.DARK_OAK_BUTTON &&
clicked != Material.CRIMSON_BUTTON &&
clicked != Material.WARPED_BUTTON &&
clicked != Material.POLISHED_BLACKSTONE_BUTTON &&
clicked != Material.MANGROVE_BUTTON &&
clicked != Material.CHERRY_BUTTON) {
Block block = event.getClickedBlock();
if (!Tag.BUTTONS.isTagged(block.getType())) {
return;
}
DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player);
DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.BUTTON, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // cake
public void eatCake(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) {
if (!event.getAction().isRightClick()) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType();
if (clicked != Material.CAKE) {
return;
@ -271,7 +280,11 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // comparer
public void comparerChange(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) {
if (!event.getAction().isRightClick()) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = event.getClickedBlock().getType();
@ -285,45 +298,14 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // door
public void doorUse(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) {
if (!event.getAction().isRightClick()) {
return;
}
Material clicked = event.getClickedBlock().getType();
if (clicked != Material.IRON_DOOR &&
clicked != Material.OAK_DOOR &&
clicked != Material.SPRUCE_DOOR &&
clicked != Material.BIRCH_DOOR &&
clicked != Material.JUNGLE_DOOR &&
clicked != Material.ACACIA_DOOR &&
clicked != Material.CHERRY_DOOR &&
clicked != Material.DARK_OAK_DOOR &&
clicked != Material.MANGROVE_DOOR &&
clicked != Material.BAMBOO_DOOR &&
clicked != Material.CRIMSON_DOOR &&
clicked != Material.WARPED_DOOR &&
clicked != Material.IRON_TRAPDOOR &&
clicked != Material.OAK_TRAPDOOR &&
clicked != Material.SPRUCE_TRAPDOOR &&
clicked != Material.BIRCH_TRAPDOOR &&
clicked != Material.JUNGLE_TRAPDOOR &&
clicked != Material.ACACIA_TRAPDOOR &&
clicked != Material.CHERRY_TRAPDOOR &&
clicked != Material.DARK_OAK_TRAPDOOR &&
clicked != Material.MANGROVE_TRAPDOOR &&
clicked != Material.BAMBOO_TRAPDOOR &&
clicked != Material.CRIMSON_TRAPDOOR &&
clicked != Material.WARPED_TRAPDOOR &&
clicked != Material.OAK_FENCE_GATE &&
clicked != Material.SPRUCE_FENCE_GATE &&
clicked != Material.BIRCH_FENCE_GATE &&
clicked != Material.JUNGLE_FENCE_GATE &&
clicked != Material.ACACIA_FENCE_GATE &&
clicked != Material.CHERRY_FENCE_GATE &&
clicked != Material.DARK_OAK_FENCE_GATE &&
clicked != Material.MANGROVE_FENCE_GATE &&
clicked != Material.BAMBOO_FENCE_GATE &&
clicked != Material.CRIMSON_FENCE_GATE &&
clicked != Material.WARPED_FENCE_GATE) {
Block block = event.getClickedBlock();
if (block == null) {
return;
}
if (!Tag.DOORS.isTagged(block.getType())) {
return;
}
Player player = event.getPlayer();
@ -331,16 +313,56 @@ public class PlayerEvents implements Listener {
checkFlag(dom, Flag.DOOR, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // dye
public void dyeEvent(EntityDyeEvent event) {
Player player = event.getPlayer();
if (player == null) {
@EventHandler(priority = EventPriority.HIGHEST) // dragon_egg
public void touchDragonEdd(PlayerInteractEvent event) {
Block block = event.getClickedBlock();
if (block == null) {
return;
}
DominionDTO dom = Cache.instance.getDominion(event.getEntity().getLocation());
if (block.getType() != Material.DRAGON_EGG) {
return;
}
Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.DRAGON_EGG, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // dye
public void dyeEvent(PlayerInteractEntityEvent event) {
Player player = event.getPlayer();
Entity entity = event.getRightClicked();
if (!(entity instanceof Colorable)) {
return;
}
DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.DYE, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // edit sign
public void onSignOpen(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
return;
}
Player player = event.getPlayer();
Block block = event.getClickedBlock();
if (block == null) {
return;
}
if (!(Tag.SIGNS.isTagged(block.getType()))) {
return;
}
DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.EDIT_SIGN, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // edit sign
public void onSignEdit(SignChangeEvent event) {
Player player = event.getPlayer();
Block block = event.getBlock();
DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.EDIT_SIGN, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // egg
public void onThrowingEgg(ProjectileLaunchEvent event) {
if (!(event.getEntity().getShooter() instanceof Player)) {
@ -385,6 +407,10 @@ public class PlayerEvents implements Listener {
if (!(event.getRightClicked() instanceof Animals)) {
return;
}
// if shearing sheep instead
if (event.getPlayer().getInventory().getItem(event.getHand()).getType() == Material.SHEARS) {
return;
}
Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getDominion(event.getRightClicked().getLocation());
checkFlag(dom, Flag.FEED, player, event);
@ -418,10 +444,13 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // honey
public void honeyInteractive(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) {
if (!event.getAction().isRightClick()) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType();
if (clicked != Material.BEEHIVE && clicked != Material.BEE_NEST) {
return;
@ -473,10 +502,13 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // lever
public void onLever(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) {
if (!event.getAction().isRightClick()) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType();
if (clicked != Material.LEVER) {
return;
@ -575,26 +607,14 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // pressure
public void onPressure(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) {
if (event.getAction() != Action.PHYSICAL) {
return;
}
Block block = event.getClickedBlock();
Material clicked = block.getType();
if (clicked != Material.STONE_PRESSURE_PLATE &&
clicked != Material.LIGHT_WEIGHTED_PRESSURE_PLATE &&
clicked != Material.HEAVY_WEIGHTED_PRESSURE_PLATE &&
clicked != Material.OAK_PRESSURE_PLATE &&
clicked != Material.SPRUCE_PRESSURE_PLATE &&
clicked != Material.BIRCH_PRESSURE_PLATE &&
clicked != Material.JUNGLE_PRESSURE_PLATE &&
clicked != Material.ACACIA_PRESSURE_PLATE &&
clicked != Material.DARK_OAK_PRESSURE_PLATE &&
clicked != Material.CRIMSON_PRESSURE_PLATE &&
clicked != Material.WARPED_PRESSURE_PLATE &&
clicked != Material.POLISHED_BLACKSTONE_PRESSURE_PLATE &&
clicked != Material.MANGROVE_PRESSURE_PLATE &&
clicked != Material.CHERRY_PRESSURE_PLATE &&
clicked != Material.BAMBOO_PRESSURE_PLATE) {
if (block == null) {
return;
}
if (!Tag.PRESSURE_PLATES.isTagged(block.getType())) {
return;
}
Player player = event.getPlayer();
@ -685,4 +705,17 @@ public class PlayerEvents implements Listener {
DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.VEHICLE_SPAWN, player, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // villager_killing
public void onVillagerKilling(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Player)) {
return;
}
if (!(event.getEntity() instanceof Villager)) {
return;
}
Player player = (Player) event.getDamager();
DominionDTO dom = Cache.instance.getDominion(event.getEntity().getLocation());
checkFlag(dom, Flag.VILLAGER_KILLING, player, event);
}
}

View File

@ -1,8 +1,10 @@
package cn.lunadeer.dominion.events;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.ParticleRender;
import cn.lunadeer.minecraftpluginutils.VaultConnect;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
@ -71,30 +73,27 @@ public class SelectPointEvents implements Listener {
minY = Dominion.config.getLimitMinY();
maxY = Dominion.config.getLimitMaxY();
}
DominionDTO dominion = new DominionDTO(player.getUniqueId(), "", loc1.getWorld().getName(),
minX, minY, minZ, maxX, maxY, maxZ);
if (Dominion.config.getEconomyEnable()) {
if (!VaultConnect.instance.economyAvailable()) {
Notification.error(player, "计算价格失败,没有可用的经济插件系统,请联系服主。");
return;
}
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
count = (maxX - minX) * (maxZ - minZ);
count = dominion.getSquare();
} else {
count = (maxX - minX) * (maxY - minY) * (maxZ - minZ);
count = dominion.getVolume();
}
float price = count * Dominion.config.getEconomyPrice();
Notification.info(player, "预计领地创建价格为 %.2f %s", price, Dominion.vault.getEconomy().currencyNamePlural());
Notification.info(player, "预计领地创建价格为 %.2f %s", price, VaultConnect.instance.currencyNamePlural());
}
ParticleRender.showBoxFace(Dominion.instance, player, loc1, loc2);
Notification.info(player, "尺寸: %d x %d x %d",
Math.abs(points.get(1).getBlockX() - points.get(0).getBlockX()),
Math.abs(points.get(1).getBlockY() - points.get(0).getBlockY()),
Math.abs(points.get(1).getBlockZ() - points.get(0).getBlockZ()));
Notification.info(player, "面积: %d",
Math.abs(points.get(1).getBlockX() - points.get(0).getBlockX()) *
Math.abs(points.get(1).getBlockZ() - points.get(0).getBlockZ()));
Notification.info(player, "高度: %d",
Math.abs(points.get(1).getBlockY() - points.get(0).getBlockY()));
Notification.info(player, "体积: %d",
Math.abs(points.get(1).getBlockX() - points.get(0).getBlockX()) *
Math.abs(points.get(1).getBlockY() - points.get(0).getBlockY()) *
Math.abs(points.get(1).getBlockZ() - points.get(0).getBlockZ()));
Notification.info(player, "尺寸: %d x %d x %d", dominion.getWidthX(), dominion.getHeight(), dominion.getWidthZ());
Notification.info(player, "面积: %d", dominion.getSquare());
Notification.info(player, "高度: %d", dominion.getHeight());
Notification.info(player, "体积: %d", dominion.getVolume());
}
Dominion.pointsSelect.put(player.getUniqueId(), points);
}

View File

@ -22,10 +22,6 @@ public class ConfigManager {
_debug = _file.getBoolean("Debug", false);
XLogger.setDebug(_debug);
_db_type = _file.getString("Database.Type", "sqlite");
if (!_db_type.equals("pgsql") && !_db_type.equals("sqlite")) {
XLogger.err("当前数据库只支持 pgsql 或 sqlite已重置为 sqlite");
setDbType("sqlite");
}
_db_host = _file.getString("Database.Host", "localhost");
_db_port = _file.getString("Database.Port", "5432");
_db_name = _file.getString("Database.Name", "dominion");
@ -87,6 +83,7 @@ public class ConfigManager {
_economy_only_xz = _file.getBoolean("Economy.OnlyXZ", false);
_economy_refund = (float) _file.getDouble("Economy.Refund", 0.85);
_fly_permission_nodes = _file.getStringList("FlyPermissionNodes");
_residence_migration = _file.getBoolean("ResidenceMigration", false);
saveAll(); // 回写文件 防止文件中的数据不完整
Flag.loadFromJson();
}
@ -115,6 +112,7 @@ public class ConfigManager {
_file.set("Economy.OnlyXZ", _economy_only_xz);
_file.set("Economy.Refund", _economy_refund);
_file.set("FlyPermissionNodes", _fly_permission_nodes);
_file.set("ResidenceMigration", _residence_migration);
_plugin.saveConfig();
}
@ -171,9 +169,6 @@ public class ConfigManager {
}
public String getDbPass() {
if (_db_pass.contains("@")) {
setDbPass("'" + _db_pass + "'");
}
return _db_pass;
}
@ -351,6 +346,8 @@ public class ConfigManager {
public void setEconomyEnable(Boolean economy_enable) {
_economy_enable = economy_enable;
_file.set("Economy.Enable", economy_enable);
_plugin.saveConfig();
}
public Float getEconomyPrice() {
@ -393,6 +390,16 @@ public class ConfigManager {
_plugin.saveConfig();
}
public Boolean getResidenceMigration() {
return _residence_migration;
}
public void setResidenceMigration(Boolean residence_migration) {
_residence_migration = residence_migration;
_file.set("ResidenceMigration", residence_migration);
_plugin.saveConfig();
}
private final Dominion _plugin;
private FileConfiguration _file;
private Boolean _debug;
@ -431,4 +438,5 @@ public class ConfigManager {
private Boolean _economy_only_xz;
private Float _economy_refund;
private List<String> _fly_permission_nodes;
private Boolean _residence_migration;
}

View File

@ -1,177 +1,235 @@
package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.databse.*;
import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn;
import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import java.sql.ResultSet;
public class DatabaseTables {
public static void migrate() {
String sql = "";
// player name
sql = "CREATE TABLE IF NOT EXISTS player_name (" +
" id SERIAL PRIMARY KEY," +
" uuid VARCHAR(36) NOT NULL UNIQUE," +
" last_known_name TEXT NOT NULL," +
" last_join_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP" +
");";
Dominion.database.query(sql);
TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, "''");
TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, "'unknown'");
TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP");
CreateTable player_name = new CreateTable().ifNotExists();
player_name.table("player_name")
.field(player_name_id)
.field(player_name_uuid)
.field(player_name_last_known_name)
.field(player_name_last_join_at);
player_name.execute();
// dominion table
sql = "CREATE TABLE IF NOT EXISTS dominion (" +
" id SERIAL PRIMARY KEY," +
" owner VARCHAR(36) NOT NULL," +
" name TEXT NOT NULL UNIQUE," +
" world TEXT NOT NULL," +
" x1 INT NOT NULL," +
" y1 INT NOT NULL," +
" z1 INT NOT NULL," +
" x2 INT NOT NULL," +
" y2 INT NOT NULL," +
" z2 INT NOT NULL," +
" parent_dom_id INT NOT NULL DEFAULT -1," +
" join_message TEXT NOT NULL DEFAULT '欢迎', " +
" leave_message TEXT NOT NULL DEFAULT '再见', " +
TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, "''");
TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'");
TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, "'world'");
TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'");
TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'");
CreateTable.ForeignKey dominion_owner_fk = new CreateTable.ForeignKey(dominion_owner, "player_name", player_name_uuid, true);
CreateTable.ForeignKey dominion_parent_dom_id_fk = new CreateTable.ForeignKey(dominion_parent_dom_id, "dominion", dominion_id, true);
CreateTable dominion = new CreateTable().ifNotExists();
dominion.table("dominion")
.field(dominion_id)
.field(dominion_owner)
.field(dominion_name)
.field(dominion_world)
.field(dominion_x1)
.field(dominion_y1)
.field(dominion_z1)
.field(dominion_x2)
.field(dominion_y2)
.field(dominion_z2)
.field(dominion_parent_dom_id)
.field(dominion_join_message)
.field(dominion_leave_message)
.foreignKey(dominion_owner_fk)
.foreignKey(dominion_parent_dom_id_fk);
dominion.execute();
" anchor BOOLEAN NOT NULL DEFAULT FALSE," +
" animal_killing BOOLEAN NOT NULL DEFAULT FALSE," +
" anvil BOOLEAN NOT NULL DEFAULT FALSE," +
" beacon BOOLEAN NOT NULL DEFAULT FALSE," +
" bed BOOLEAN NOT NULL DEFAULT FALSE," +
" brew BOOLEAN NOT NULL DEFAULT FALSE," +
" break BOOLEAN NOT NULL DEFAULT FALSE," +
" button BOOLEAN NOT NULL DEFAULT FALSE," +
" cake BOOLEAN NOT NULL DEFAULT FALSE," +
" container BOOLEAN NOT NULL DEFAULT FALSE," +
" craft BOOLEAN NOT NULL DEFAULT FALSE," +
" creeper_explode BOOLEAN NOT NULL DEFAULT FALSE," +
" comparer BOOLEAN NOT NULL DEFAULT FALSE," +
" door BOOLEAN NOT NULL DEFAULT FALSE," +
" dye BOOLEAN NOT NULL DEFAULT FALSE," +
" egg BOOLEAN NOT NULL DEFAULT FALSE," +
" enchant BOOLEAN NOT NULL DEFAULT FALSE," +
" ender_pearl BOOLEAN NOT NULL DEFAULT FALSE," +
" feed BOOLEAN NOT NULL DEFAULT FALSE," +
" fire_spread BOOLEAN NOT NULL DEFAULT FALSE," +
" flow_in_protection BOOLEAN NOT NULL DEFAULT FALSE," +
" glow BOOLEAN NOT NULL DEFAULT TRUE," +
" harvest BOOLEAN NOT NULL DEFAULT FALSE," +
" honey BOOLEAN NOT NULL DEFAULT FALSE," +
" hook BOOLEAN NOT NULL DEFAULT FALSE," +
" ignite BOOLEAN NOT NULL DEFAULT FALSE," +
" lever BOOLEAN NOT NULL DEFAULT FALSE," +
" monster_killing BOOLEAN NOT NULL DEFAULT FALSE," +
" move BOOLEAN NOT NULL DEFAULT TRUE," +
" place BOOLEAN NOT NULL DEFAULT FALSE," +
" pressure BOOLEAN NOT NULL DEFAULT FALSE," +
" riding BOOLEAN NOT NULL DEFAULT FALSE," +
" repeater BOOLEAN NOT NULL DEFAULT FALSE," +
" shear BOOLEAN NOT NULL DEFAULT FALSE," +
" shoot BOOLEAN NOT NULL DEFAULT FALSE," +
" tnt_explode BOOLEAN NOT NULL DEFAULT FALSE," +
" trade BOOLEAN NOT NULL DEFAULT FALSE," +
" vehicle_destroy BOOLEAN NOT NULL DEFAULT FALSE," +
" wither_spawn BOOLEAN NOT NULL DEFAULT FALSE," +
" FOREIGN KEY (owner) REFERENCES player_name(uuid) ON DELETE CASCADE," +
" FOREIGN KEY (parent_dom_id) REFERENCES dominion(id) ON DELETE CASCADE" +
");";
Dominion.database.query(sql);
for (Flag flag : Flag.getAllDominionFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("dominion").ifNotExists().execute();
}
// player privilege
sql = "CREATE TABLE IF NOT EXISTS player_privilege (" +
" id SERIAL PRIMARY KEY," +
" player_uuid VARCHAR(36) NOT NULL," +
" dom_id INT NOT NULL," +
if (!Common.IsTableExist("dominion_member")) {
TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''");
TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true);
CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true);
CreateTable player_privilege = new CreateTable().ifNotExists();
player_privilege.table("player_privilege")
.field(player_privilege_id)
.field(player_privilege_player_uuid)
.field(player_privilege_dom_id)
.field(player_privilege_admin)
.foreignKey(player_privilege_player_uuid_fk)
.foreignKey(player_privilege_dom_id_fk)
.unique(player_privilege_player_uuid, player_privilege_dom_id);
player_privilege.execute();
" admin BOOLEAN NOT NULL DEFAULT FALSE," +
" anchor BOOLEAN NOT NULL DEFAULT FALSE," +
" animal_killing BOOLEAN NOT NULL DEFAULT FALSE," +
" anvil BOOLEAN NOT NULL DEFAULT FALSE," +
" beacon BOOLEAN NOT NULL DEFAULT FALSE," +
" bed BOOLEAN NOT NULL DEFAULT FALSE," +
" brew BOOLEAN NOT NULL DEFAULT FALSE," +
" break BOOLEAN NOT NULL DEFAULT FALSE," +
" button BOOLEAN NOT NULL DEFAULT FALSE," +
" cake BOOLEAN NOT NULL DEFAULT FALSE," +
" container BOOLEAN NOT NULL DEFAULT FALSE," +
" craft BOOLEAN NOT NULL DEFAULT FALSE," +
" comparer BOOLEAN NOT NULL DEFAULT FALSE," +
" door BOOLEAN NOT NULL DEFAULT FALSE," +
" dye BOOLEAN NOT NULL DEFAULT FALSE," +
" egg BOOLEAN NOT NULL DEFAULT FALSE," +
" enchant BOOLEAN NOT NULL DEFAULT FALSE," +
" ender_pearl BOOLEAN NOT NULL DEFAULT FALSE," +
" feed BOOLEAN NOT NULL DEFAULT FALSE," +
" glow BOOLEAN NOT NULL DEFAULT TRUE," +
" harvest BOOLEAN NOT NULL DEFAULT FALSE," +
" honey BOOLEAN NOT NULL DEFAULT FALSE," +
" hook BOOLEAN NOT NULL DEFAULT FALSE," +
" ignite BOOLEAN NOT NULL DEFAULT FALSE," +
" lever BOOLEAN NOT NULL DEFAULT FALSE," +
" monster_killing BOOLEAN NOT NULL DEFAULT FALSE," +
" move BOOLEAN NOT NULL DEFAULT TRUE," +
" place BOOLEAN NOT NULL DEFAULT FALSE," +
" pressure BOOLEAN NOT NULL DEFAULT FALSE," +
" riding BOOLEAN NOT NULL DEFAULT FALSE," +
" repeater BOOLEAN NOT NULL DEFAULT FALSE," +
" shear BOOLEAN NOT NULL DEFAULT FALSE," +
" shoot BOOLEAN NOT NULL DEFAULT FALSE," +
" trade BOOLEAN NOT NULL DEFAULT FALSE," +
" vehicle_destroy BOOLEAN NOT NULL DEFAULT FALSE," +
for (Flag flag : Flag.getAllPrivilegeFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("player_privilege").ifNotExists().execute();
}
}
" UNIQUE (player_uuid, dom_id)," +
" FOREIGN KEY (player_uuid) REFERENCES player_name(uuid) ON DELETE CASCADE," +
" FOREIGN KEY (dom_id) REFERENCES dominion(id) ON DELETE CASCADE" +
");";
Dominion.database.query(sql);
// server root player name
Field server_player_name_id_field = new Field("id", -1);
Field server_player_name_uuid_field = new Field("uuid", "00000000-0000-0000-0000-000000000000");
Field server_player_name_last_known_name_field = new Field("last_known_name", "server");
InsertRow insert_server_player_name = new InsertRow().table("player_name").onConflictDoNothing(server_player_name_id_field)
.field(server_player_name_id_field)
.field(server_player_name_uuid_field)
.field(server_player_name_last_known_name_field);
insert_server_player_name.execute();
sql = "INSERT INTO player_name (" +
"id, uuid, last_known_name" +
") VALUES (" +
"-1, '00000000-0000-0000-0000-000000000000', 'server'" +
") ON CONFLICT DO NOTHING;";
Dominion.database.query(sql);
// server root dominion
Field server_dom_id_field = new Field("id", -1);
Field server_dom_owner_field = new Field("owner", "00000000-0000-0000-0000-000000000000");
Field server_dom_name_field = new Field("name", "根领地");
Field server_dom_world_field = new Field("world", "all");
Field server_dom_x1_field = new Field("x1", -2147483648);
Field server_dom_y1_field = new Field("y1", -2147483648);
Field server_dom_z1_field = new Field("z1", -2147483648);
Field server_dom_x2_field = new Field("x2", 2147483647);
Field server_dom_y2_field = new Field("y2", 2147483647);
Field server_dom_z2_field = new Field("z2", 2147483647);
Field server_dom_parent_dom_id_field = new Field("parent_dom_id", -1);
Field server_dom_join_message_field = new Field("join_message", "欢迎");
Field server_dom_leave_message_field = new Field("leave_message", "再见");
InsertRow insert_server_dom = new InsertRow().table("dominion").onConflictDoNothing(server_dom_id_field)
.field(server_dom_id_field)
.field(server_dom_owner_field)
.field(server_dom_name_field)
.field(server_dom_world_field)
.field(server_dom_x1_field)
.field(server_dom_y1_field)
.field(server_dom_z1_field)
.field(server_dom_x2_field)
.field(server_dom_y2_field)
.field(server_dom_z2_field)
.field(server_dom_parent_dom_id_field)
.field(server_dom_join_message_field)
.field(server_dom_leave_message_field);
insert_server_dom.execute();
sql = "INSERT INTO dominion (" +
"id, owner, name, world, x1, y1, z1, x2, y2, z2, parent_dom_id, join_message, leave_message" +
") VALUES (" +
"-1, '00000000-0000-0000-0000-000000000000', '根领地', 'all', " +
"-2147483648, -2147483648, -2147483648, " +
"2147483647, 2147483647, 2147483647, -1, " +
"'欢迎', '再见'" +
") ON CONFLICT DO NOTHING;";
Dominion.database.query(sql);
// 1.18.0 dominion add tp_location
TableColumn dominion_tp_location = new TableColumn("tp_location", FieldType.STRING, false, false, true, false, "'default'");
new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute();
// 1.5.0
Dominion.database.addColumnIfNotExists("dominion", "hopper", "BOOLEAN NOT NULL DEFAULT FALSE");
Dominion.database.addColumnIfNotExists("player_privilege", "hopper", "BOOLEAN NOT NULL DEFAULT FALSE");
// 1.31.0 add privilege_template
TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, "''");
TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'");
TableColumn privilege_template_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
CreateTable.ForeignKey privilege_template_creator_fk = new CreateTable.ForeignKey(privilege_template_creator, "player_name", player_name_uuid, true);
CreateTable privilege_template = new CreateTable().ifNotExists();
privilege_template.table("privilege_template")
.field(privilege_template_id)
.field(privilege_template_creator)
.field(privilege_template_name)
.field(privilege_template_admin)
.foreignKey(privilege_template_creator_fk)
.unique(privilege_template_creator, privilege_template_name);
privilege_template.execute();
// 1.9.0
Dominion.database.addColumnIfNotExists("dominion", "vehicle_spawn", "BOOLEAN NOT NULL DEFAULT FALSE");
Dominion.database.addColumnIfNotExists("player_privilege", "vehicle_spawn", "BOOLEAN NOT NULL DEFAULT FALSE");
// 1.10.0
Dominion.database.addColumnIfNotExists("dominion", "trample", "BOOLEAN NOT NULL DEFAULT FALSE");
for (Flag flag : Flag.getAllPrivilegeFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("privilege_template").ifNotExists().execute();
}
// 1.11.0
Dominion.database.addColumnIfNotExists("dominion", "mob_drop_item", "BOOLEAN NOT NULL DEFAULT TRUE");
// 1.31.6 dominion add blue-map tile color
TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'");
new AddColumn(dominion_color).table("dominion").ifNotExists().execute();
// 1.12.0
Dominion.database.addColumnIfNotExists("dominion", "ender_man", "BOOLEAN NOT NULL DEFAULT FAlSE");
// 1.34.0 add dominion_group
if (!Common.IsTableExist("dominion_member")) {
TableColumn player_privilege_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1);
new AddColumn(player_privilege_group_id).table("player_privilege").ifNotExists().execute();
}
// 1.18.0
Dominion.database.addColumnIfNotExists("dominion", "tp_location", "TEXT NOT NULL DEFAULT 'default'");
Dominion.database.addColumnIfNotExists("dominion", "teleport", "BOOLEAN NOT NULL DEFAULT FALSE");
Dominion.database.addColumnIfNotExists("player_privilege", "teleport", "BOOLEAN NOT NULL DEFAULT FALSE");
TableColumn dominion_group_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn dominion_group_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn dominion_group_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'");
TableColumn dominion_group_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
CreateTable.ForeignKey group_dom_id_fk = new CreateTable.ForeignKey(dominion_group_dom_id, "dominion", dominion_id, true);
CreateTable group = new CreateTable().ifNotExists();
group.table("dominion_group")
.field(dominion_group_id)
.field(dominion_group_dom_id)
.field(dominion_group_name)
.field(dominion_group_admin)
.foreignKey(group_dom_id_fk)
.unique(dominion_group_dom_id, dominion_group_name);
group.execute();
for (Flag flag : Flag.getAllPrivilegeFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("dominion_group").ifNotExists().execute();
}
// 1.21
Dominion.database.addColumnIfNotExists("dominion", "show_border", "BOOLEAN NOT NULL DEFAULT TRUE");
// 1.26
Dominion.database.addColumnIfNotExists("dominion", "fly", "BOOLEAN NOT NULL DEFAULT FALSE");
Dominion.database.addColumnIfNotExists("player_privilege", "fly", "BOOLEAN NOT NULL DEFAULT FALSE");
// 1.28
Dominion.database.addColumnIfNotExists("dominion", "monster_spawn", "BOOLEAN NOT NULL DEFAULT FALSE");
Dominion.database.addColumnIfNotExists("dominion", "animal_spawn", "BOOLEAN NOT NULL DEFAULT TRUE");
// 1.35.0 migrate player_privilege -> dominion_member
TableColumn dominion_member_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn dominion_member_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''");
TableColumn dominion_member_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn dominion_member_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
TableColumn dominion_member_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1);
CreateTable.ForeignKey dominion_member_player_uuid_fk = new CreateTable.ForeignKey(dominion_member_player_uuid, "player_name", player_name_uuid, true);
CreateTable.ForeignKey dominion_member_dom_id_fk = new CreateTable.ForeignKey(dominion_member_dom_id, "dominion", dominion_id, true);
CreateTable dominion_member = new CreateTable().ifNotExists();
dominion_member.table("dominion_member")
.field(dominion_member_id)
.field(dominion_member_player_uuid)
.field(dominion_member_dom_id)
.field(dominion_member_admin)
.field(dominion_member_group_id)
.foreignKey(dominion_member_player_uuid_fk)
.foreignKey(dominion_member_dom_id_fk)
.unique(dominion_member_player_uuid, dominion_member_dom_id);
dominion_member.execute();
for (Flag flag : Flag.getAllPrivilegeFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("dominion_member").ifNotExists().execute();
}
if (Common.IsTableExist("player_privilege")) {
// migrate from player_privilege to dominion_member
String sql = "SELECT * FROM player_privilege;";
try (ResultSet rs = DatabaseManager.instance.query(sql)) {
while (rs.next()) {
String player_uuid = rs.getString("player_uuid");
int dom_id = rs.getInt("dom_id");
boolean admin = rs.getBoolean("admin");
int group_id = rs.getInt("group_id");
InsertRow insert = new InsertRow().table("dominion_member")
.field(new Field("player_uuid", player_uuid))
.field(new Field("dom_id", dom_id))
.field(new Field("group_id", group_id))
.field(new Field("admin", admin));
for (Flag flag : Flag.getAllPrivilegeFlags()) {
insert.field(new Field(flag.getFlagName(), rs.getBoolean(flag.getFlagName())));
}
insert.execute();
}
sql = "DROP TABLE player_privilege;";
DatabaseManager.instance.query(sql);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("迁移 player_privilege 到 dominion_member 失败", e, sql);
}
}
}
}

View File

@ -0,0 +1,35 @@
package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.DominionNode;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
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.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.notOp;
import static cn.lunadeer.dominion.tuis.dominion.DominionList.BuildTreeLines;
public class AllDominion {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (notOp(player)) return;
int page = getPage(args, 1);
List<DominionNode> allDominions = Cache.instance.getAllDominionTree();
ListView view = ListView.create(10, "/dominion all_dominion");
view.title("所有领地");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("所有领地"));
view.addLines(BuildTreeLines(allDominions, 0));
view.showOn(player, page);
}
}

View File

@ -2,7 +2,7 @@ package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -11,15 +11,14 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion;
public class Apis {
public static int getPage(String[] args) {
public static int getPage(String[] args, int pos) {
int page = 1;
if (args.length == 2) {
if (args.length > pos) {
try {
page = Integer.parseInt(args[1]);
page = Integer.parseInt(args[pos]);
} catch (Exception e) {
return 1;
}
@ -43,26 +42,10 @@ public class Apis {
}
}
/**
* 尝试从 arg[2] 获取领地名称
* 如果没有此参数则会尝试获取玩家当前所在位置
*
* @param player 玩家
* @param args 参数
* @return 领地信息
*/
public static DominionDTO getDominionNameArg_2(Player player, String[] args) {
if (args.length >= 3) {
return DominionDTO.select(args[2]);
} else {
return Cache.instance.getPlayerCurrentDominion(player);
}
}
public static boolean noAuthToManage(Player player, DominionDTO dominion) {
if (player.isOp()) return false;
if (!dominion.getOwner().equals(player.getUniqueId())) {
PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId());
MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) {
Notification.error(player, "你不是领地 %s 的拥有者或管理员,无权访问此页面", dominion.getName());
return true;
@ -71,14 +54,22 @@ public class Apis {
return false;
}
public static boolean notOp(CommandSender sender) {
if (!sender.isOp()) {
Notification.error(sender, "你没有权限访问此页面");
return true;
}
return false;
}
public static void printHelp(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = getPage(args);
int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion help");
view.title("领地插件命令帮助 <>表示必填参数 []表示可选参数")
.add(Line.create().append("打开交互菜单").append(Button.create("/dominion menu").setExecuteCommand("/dominion menu").build()))
.add(Line.create().append("查看帮助").append(Button.create("/dominion help [页码]").setExecuteCommand("/dominion help 1").build()))
.add(Line.create().append("打开交互菜单").append("/dominion menu"))
.add(Line.create().append("查看帮助").append("/dominion help [页码]"))
.add(Line.create().append("创建领地").append("/dominion create <领地名称>"))
.add(Line.create().append("自动创建领地").append("/dominion auto_create <领地名称>"))
.add(Line.create().append("创建子领地").append("/dominion create_sub <子领地名称> [父领地名称]"))
@ -97,18 +88,6 @@ public class Apis {
.add(Line.create().append("---[管理员指令]---"))
.add(Line.create().append("刷新缓存").append(Button.create("/dominion reload_cache").setExecuteCommand("/dominion reload_cache").build()))
.add(Line.create().append("重载配置").append(Button.create("/dominion reload_config").setExecuteCommand("/dominion reload_config").build()))
// 以下指令主要被用于 ui 触发
.add(Line.create().append("---[以下主要用于UI触发]---"))
.add(Line.create().append("列出所有领地").append(Button.create("/dominion list [页码]").setExecuteCommand("/dominion list").build()))
.add(Line.create().append("查看领地信息").append(Button.create("/dominion info [领地名称]").setExecuteCommand("/dominion info").build()))
.add(Line.create().append("查看领地权限信息").append(Button.create("/dominion flag_info <领地名称> [页码]").setExecuteCommand("/dominion flag_info").build()))
.add(Line.create().append("设置领地权限").append("/dominion set <权限名称> <true/false> [领地名称]"))
.add(Line.create().append("创建玩家特权").append("/dominion create_privilege <玩家名称> [领地名称]"))
.add(Line.create().append("设置玩家特权").append("/dominion set_privilege <玩家名称> <权限名称> <true/false> [领地名称]"))
.add(Line.create().append("重置玩家特权").append("/dominion clear_privilege <玩家名称> [领地名称]"))
.add(Line.create().append("查看领地玩家特权列表").append("/dominion privilege_list [领地名称] [页码]"))
.add(Line.create().append("查看玩家特权信息").append("/dominion privilege_info <玩家名称> [领地名称] [页码]"))
.add(Line.create().append("系统配置").append(Button.create("/dominion config [页码]").setExecuteCommand("/dominion config").build()))
.showOn(player, page);
}

View File

@ -1,60 +0,0 @@
package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
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.tuis.Apis.getDominionNameArg_1;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
public class DominionPrivilegeList {
public static void show(CommandSender sender, String[] args) {
int page = 1;
if (args.length == 3) {
try {
page = Integer.parseInt(args[2]);
} catch (Exception ignored) {
}
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = getDominionNameArg_1(player, args);
if (dominion == null) {
Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion privilege_list <领地名称>");
return;
}
ListView view = ListView.create(10, "/dominion privilege_list " + dominion.getName());
if (noAuthToManage(player, dominion)) return;
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(dominion.getId());
view.title("领地 " + dominion.getName() + " 成员列表");
view.navigator(
Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("成员列表")
);
view.add(Line.create().append(Button.create("添加成员").setExecuteCommand("/dominion select_player_create_privilege " + dominion.getName()).build()));
for (PlayerPrivilegeDTO privilege : privileges) {
PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID());
if (p_player == null) continue;
Line line = Line.create()
.append(p_player.getLastKnownName())
.append(Button.createGreen("配置权限").setExecuteCommand("/dominion privilege_info " + p_player.getLastKnownName() + " " + dominion.getName()).build());
if ((!player.getName().equals(p_player.getLastKnownName()) && !privilege.getAdmin()) || dominion.getOwner().equals(player.getUniqueId()))
line.append(Button.createRed("移除成员").setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b").build());
view.add(line);
}
view.showOn(player, page);
}
}

View File

@ -1,8 +1,11 @@
package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.ViewStyles;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -12,18 +15,36 @@ public class Menu {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = 1;
if (args.length == 2) {
try {
page = Integer.parseInt(args[1]);
} catch (Exception ignored) {
}
}
Line create = Line.create()
.append(Button.create("创建领地").setExecuteCommand("/dominion cui_create").build())
.append("以你为中心自动创建一个新的领地");
Line list = Line.create()
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append("查看我的领地");
Line template = Line.create()
.append(Button.create("模板列表").setExecuteCommand("/dominion template list").build())
.append("成员权限模板列表");
Line help = Line.create()
.append(Button.create("指令帮助").setExecuteCommand("/dominion help").build())
.append("查看指令帮助");
Line link = Line.create()
.append(Button.create("使用文档").setOpenURL("https://ssl.lunadeer.cn:14448/doc/23/").build())
.append("在浏览器中打开使用文档");
Line migrate = Line.create()
.append(Button.create("迁移数据").setExecuteCommand("/dominion migrate_list").build())
.append("把你的领地从Residence迁移到Dominion");
Line all = Line.create()
.append(Button.create("所有领地").setExecuteCommand("/dominion all_dominion").build())
.append("查看所有领地");
Line config = Line.create()
.append(Button.create("系统配置").setExecuteCommand("/dominion config").build())
.append("查看/修改系统配置");
@ -33,20 +54,25 @@ public class Menu {
Line reload_config = Line.create()
.append(Button.create("重载配置").setExecuteCommand("/dominion reload_config").build())
.append("重载配置文件");
ListView view = ListView.create(10, "/dominion");
ListView view = ListView.create(10, "/dominion menu");
view.title("Dominion 领地系统")
.navigator(Line.create().append("主菜单"))
.add(create)
.add(list)
.add(template)
.add(help)
.add(link);
if (Dominion.config.getResidenceMigration()) {
view.add(migrate);
}
if (player.isOp()) {
view.add(Line.create().append(""));
view.add(Line.create().append("---以下选项仅OP可见---"));
view.add(Line.create().append(Component.text("--- 以下选项仅OP可见 ---", ViewStyles.main_color)));
view.add(all);
view.add(config);
view.add(reload_cache);
view.add(reload_config);
}
view.showOn(player, 1);
view.showOn(player, page);
}
}

View File

@ -0,0 +1,75 @@
package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
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;
public class MigrateList {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (!Dominion.config.getResidenceMigration()) {
Notification.error(sender, "Residence 迁移功能没有开启");
return;
}
int page = Apis.getPage(args, 1);
ListView view = ListView.create(10, "/dominion migrate_list");
view.title("从 Residence 迁移数据");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("Res数据"));
List<ResMigration.ResidenceNode> res_data = Cache.instance.getResidenceData(player.getUniqueId());
if (res_data == null) {
view.add(Line.create().append("你没有可迁移的数据"));
} else {
view.addLines(BuildTreeLines(res_data, 0, page));
}
view.showOn(player, page);
}
public static List<Line> BuildTreeLines(List<ResMigration.ResidenceNode> dominionTree, Integer depth, int page) {
List<Line> lines = new ArrayList<>();
StringBuilder prefix = new StringBuilder();
for (int i = 0; i < depth; i++) {
prefix.append(" | ");
}
for (ResMigration.ResidenceNode node : dominionTree) {
TextComponent migrate = Button.create("迁移").setExecuteCommand("/dominion migrate " + node.name + " " + page).build();
Line line = Line.create();
if (depth == 0) {
line.append(migrate);
} else {
line.append(Component.text("[迁移]",
Style.style(TextColor.color(190, 190, 190),
TextDecoration.STRIKETHROUGH))
.hoverEvent(Component.text("子领地无法手动迁移,会随父领地自动迁移")));
}
line.append(prefix + node.name);
lines.add(line);
lines.addAll(BuildTreeLines(node.children, depth + 1, page));
}
return lines;
}
}

View File

@ -13,13 +13,15 @@ import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.notOp;
public class DominionConfig {
public class SysConfig {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = getPage(args);
ListView view = ListView.create(10, "/dominion config");
if (notOp(player)) return;
int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion sys_config");
view.title("系统配置");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("系统配置"));
@ -149,6 +151,15 @@ public class DominionConfig {
.append(NumChanger.create(Dominion.config.getEconomyRefund(), "/dominion set_config economy_refund", 0.01).setPageNumber(page).build());
view.add(refund);
}
if (Dominion.config.getResidenceMigration()) {
view.add(Line.create()
.append("是否允许从Residence迁移数据")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config residence_migration false " + page).build()));
} else {
view.add(Line.create()
.append("是否允许从Residence迁移数据")
.append(Button.createRed("").setExecuteCommand("/dominion set_config residence_migration true " + page).build()));
}
view.showOn(player, page);
}
}

View File

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.tuis;
package cn.lunadeer.dominion.tuis.dominion;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.DominionNode;
@ -18,19 +18,21 @@ import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.commands.Helper.playerAdminDominions;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class ListDominion {
public class DominionList {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = getPage(args);
int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion list");
// 根据id从小到大排序
List<String> admin_dominions = playerAdminDominions(sender);
view.title("我的领地列表");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("我的领地"));
view.addLines(BuildTreeLines(Cache.instance.getDominionTreeByPlayer(player.getName()), 0));
view.add(Line.create().append(Component.text("-= 以下为你拥有管理员权限的领地 =-", ViewStyles.main_color)));
List<String> admin_dominions = playerAdminDominions(sender);
if (admin_dominions.size() != 0) {
view.add(Line.create().append(""));
view.add(Line.create().append(Component.text("--- 以下为你拥有管理员权限的领地 ---", ViewStyles.main_color)));
}
for (String dominion : admin_dominions) {
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + dominion).build();
view.add(Line.create().append(manage).append(dominion));
@ -38,18 +40,18 @@ public class ListDominion {
view.showOn(player, page);
}
private static List<Line> BuildTreeLines(List<DominionNode> dominionTree, Integer depth) {
public static List<Line> BuildTreeLines(List<DominionNode> dominionTree, Integer depth) {
List<Line> lines = new ArrayList<>();
StringBuilder prefix = new StringBuilder();
for (int i = 0; i < depth; i++) {
prefix.append(" | ");
}
for (DominionNode node : dominionTree) {
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.dominion.getName()).build();
TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.dominion.getName()).build();
Line line = Line.create().append(delete).append(manage).append(prefix + node.dominion.getName());
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.getDominion().getName()).build();
TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.getDominion().getName()).build();
Line line = Line.create().append(delete).append(manage).append(prefix + node.getDominion().getName());
lines.add(line);
lines.addAll(BuildTreeLines(node.children, depth + 1));
lines.addAll(BuildTreeLines(node.getChildren(), depth + 1));
}
return lines;
}

View File

@ -1,16 +1,18 @@
package cn.lunadeer.dominion.tuis;
package cn.lunadeer.dominion.tuis.dominion;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_1;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
import static cn.lunadeer.dominion.tuis.Apis.*;
public class DominionManage {
public static void show(CommandSender sender, String[] args) {
@ -22,15 +24,22 @@ public class DominionManage {
return;
}
if (noAuthToManage(player, dominion)) return;
int page = getPage(args, 2);
Line size_info = Line.create()
.append(Button.create("详细信息").setExecuteCommand("/dominion info " + dominion.getName()).build())
.append("查看领地详细信息");
Line env_info = Line.create()
.append(Button.create("环境设置").setExecuteCommand("/dominion env_setting " + dominion.getName()).build())
.append("设置领地内的一些非玩家相关效果");
Line flag_info = Line.create()
.append(Button.create("访客权限").setExecuteCommand("/dominion flag_info " + dominion.getName()).build())
.append(Button.create("访客权限").setExecuteCommand("/dominion guest_setting " + dominion.getName()).build())
.append("访客在此领地的权限");
Line privilege_list = Line.create()
.append(Button.create("成员权限").setExecuteCommand("/dominion privilege_list " + dominion.getName()).build())
.append(Button.create("成员管理").setExecuteCommand("/dominion member list " + dominion.getName()).build())
.append("管理此领地成员的权限");
Line group_list = Line.create()
.append(Button.create("权限组").setExecuteCommand("/dominion group list " + dominion.getName()).build())
.append("管理此领地的权限组");
Line set_tp = Line.create()
.append(Button.create("设置传送点").setExecuteCommand("/dominion set_tp_location " + dominion.getName()).build())
.append("设置当前位置为此领地传送点");
@ -43,6 +52,11 @@ public class DominionManage {
Line leave_msg = Line.create()
.append(Button.create("编辑离开提示语").setExecuteCommand("/dominion cui_edit_leave_message " + dominion.getName()).build())
.append("当玩家离开领地时显示的消息");
Line map_color = Line.create()
.append(Button.create("设置颜色").setExecuteCommand("/dominion cui_set_map_color " + dominion.getName()).build())
.append(Component.text("设置卫星地图上的地块颜色")
.append(Component.text(dominion.getColor(),
TextColor.color(dominion.getColorR(), dominion.getColorG(), dominion.getColorB()))));
ListView view = ListView.create(10, "/dominion manage " + dominion.getName());
view.title("领地 " + dominion.getName() + " 管理界面")
.navigator(Line.create()
@ -50,12 +64,17 @@ public class DominionManage {
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(dominion.getName()))
.add(size_info)
.add(env_info)
.add(flag_info)
.add(privilege_list)
.add(group_list)
.add(set_tp)
.add(rename)
.add(join_msg)
.add(leave_msg)
.showOn(player, 1);
.add(leave_msg);
if (Dominion.config.getBlueMap()) {
view.add(map_color);
}
view.showOn(player, page);
}
}

View File

@ -0,0 +1,56 @@
package cn.lunadeer.dominion.tuis.dominion.manage;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class EnvSetting {
public static void show(CommandSender sender, String[] args) {
if (args.length < 2) {
Notification.error(sender, "用法: /dominion env_setting <领地名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[1]);
return;
}
int page = getPage(args, 2);
ListView view = ListView.create(10, "/dominion env_setting " + dominion.getName());
view.title("领地 " + dominion.getName() + " 环境设置")
.navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("环境设置"));
for (Flag flag : Flag.getDominionOnlyFlagsEnabled()) {
view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page));
}
view.showOn(player, page);
}
private static Line createOption(Flag flag, boolean value, String dominion_name, int page) {
if (value) {
return Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion set " + flag.getFlagName() + " false " + dominion_name + " " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
} else {
return Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion set " + flag.getFlagName() + " true " + dominion_name + " " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
}
}
}

View File

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.tuis;
package cn.lunadeer.dominion.tuis.dominion.manage;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
@ -11,36 +11,31 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class DominionFlagInfo {
public class GuestSetting {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length < 2) {
Notification.error(sender, "用法: /dominion flag_info <领地名称> [页码]");
Notification.error(sender, "用法: /dominion guest_setting <领地名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[1]);
return;
}
int page = 1;
if (args.length == 3) {
try {
page = Integer.parseInt(args[2]);
} catch (Exception ignored) {
}
}
ListView view = ListView.create(10, "/dominion flag_info " + dominion.getName());
int page = getPage(args, 2);
ListView view = ListView.create(10, "/dominion guest_setting " + dominion.getName());
view.title("领地 " + dominion.getName() + " 访客权限")
.navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("访客权限"));
for (Flag flag : Flag.getDominionFlagsEnabled()) {
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page));
}
view.showOn(player, page);

View File

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.tuis;
package cn.lunadeer.dominion.tuis.dominion.manage;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.PlayerController;
@ -15,7 +15,7 @@ import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_1;
public class DominionSizeInfo {
public class SizeInfo {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
@ -33,13 +33,13 @@ public class DominionSizeInfo {
Integer z2 = dominion.getZ2();
View view = View.create();
view.title("领地 " + dominion.getName() + " 的尺寸信息")
.subtitle("领地归属" + owner.getLastKnownName())
.addLine(Line.create().append("领地大小:").append((x2 - x1) + " x" + (y2 - y1) + " x" + (z2 - z1)))
.subtitle("领地所有者" + owner.getLastKnownName())
.addLine(Line.create().append("领地大小:").append(dominion.getWidthX() + " x " + dominion.getHeight() + " x " + dominion.getWidthZ()))
.addLine(Line.create().append("中心坐标:").append((x1 + (x2 - x1) / 2) + " " + (y1 + (y2 - y1) / 2) + " " + (z1 + (z2 - z1) / 2)))
.addLine(Line.create().append("垂直高度:").append(String.valueOf(y2 - y1)))
.addLine(Line.create().append("垂直高度:").append(String.valueOf(dominion.getHeight())))
.addLine(Line.create().append("Y轴坐标").append(y1 + " ~ " + y2))
.addLine(Line.create().append("水平面积:").append(String.valueOf((x2 - x1) * (z2 - z1))))
.addLine(Line.create().append("领地体积:").append(String.valueOf((x2 - x1) * (y2 - y1) * (z2 - z1))))
.addLine(Line.create().append("水平面积:").append(String.valueOf(dominion.getSquare())))
.addLine(Line.create().append("领地体积:").append(String.valueOf(dominion.getVolume())))
.addLine(Line.create().append("传送点坐标:").append(
dominion.getTpLocation() == null ?
"" :
@ -47,7 +47,7 @@ public class DominionSizeInfo {
))
.actionBar(Line.create()
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append(Button.create("权限列表").setExecuteCommand("/dominion flag_info " + dominion.getName()).build()))
.append(Button.create("访客权限").setExecuteCommand("/dominion guest_setting " + dominion.getName()).build()))
.showOn(player);
ParticleRender.showBoxFace(Dominion.instance, player,
dominion.getLocation1(),

View File

@ -0,0 +1,93 @@
package cn.lunadeer.dominion.tuis.dominion.manage.group;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.tuis.Apis;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
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.tuis.Apis.noAuthToManage;
public class GroupList {
public static void show(CommandSender sender, String dominionName) {
show(sender, new String[]{"", "", dominionName});
}
public static void show(CommandSender sender, String dominionName, int page) {
show(sender, new String[]{"", "", dominionName, String.valueOf(page)});
}
public static void show(CommandSender sender, String[] args) {
if (args.length < 3) {
Notification.error(sender, "用法: /dominion group list <领地名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]);
return;
}
if (noAuthToManage(player, dominion)) return;
int page = Apis.getPage(args, 3);
List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId());
ListView view = ListView.create(10, "/dominion group list " + dominion.getName());
view.title("权限组列表");
view.navigator(
Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("权限组列表")
);
Button create_btn = Button.createGreen("创建权限组")
.setHoverText("创建一个新的权限组")
.setExecuteCommand("/dominion cui_create_group " + dominion.getName());
view.add(new Line().append(create_btn.build()));
for (GroupDTO group : groups) {
Line line = new Line();
Button del = Button.createRed("删除")
.setHoverText("删除权限组 " + group.getName())
.setExecuteCommand("/dominion group delete " + dominion.getName() + " " + group.getName());
Button edit = Button.create("编辑")
.setHoverText("编辑权限组 " + group.getName())
.setExecuteCommand("/dominion group setting " + dominion.getName() + " " + group.getName());
Button add = Button.createGreen("+")
.setHoverText("添加成员到权限组 " + group.getName())
.setExecuteCommand("/dominion group select_member " + dominion.getName() + " " + group.getName() + " " + page);
line.append(del.build()).append(edit.build()).append(group.getName()).append(add.build());
view.add(line);
List<MemberDTO> players = MemberDTO.selectByGroupId(group.getId());
XLogger.debug("players: " + players.size());
for (MemberDTO playerPrivilege : players) {
PlayerDTO p = PlayerDTO.select(playerPrivilege.getPlayerUUID());
if (p == null) continue;
Button remove = Button.createRed("-")
.setHoverText("" + p.getLastKnownName() + " 移出权限组 " + group.getName())
.setExecuteCommand("/dominion group remove_member " + dominion.getName() + " " + group.getName() + " " + p.getLastKnownName() + " " + page);
Line playerLine = new Line().setDivider("");
playerLine.append(Component.text(" "));
playerLine.append(remove.build()).append(" | " + p.getLastKnownName());
view.add(playerLine);
}
view.add(new Line().append(""));
}
view.showOn(player, page);
}
}

View File

@ -0,0 +1,101 @@
package cn.lunadeer.dominion.tuis.dominion.manage.group;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.tuis.Apis;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
public class GroupSetting {
public static void show(CommandSender sender, String dominionName, String groupName) {
show(sender, new String[]{"", "", dominionName, groupName});
}
public static void show(CommandSender sender, String dominionName, String groupName, Integer page) {
show(sender, new String[]{"", "", dominionName, groupName, page.toString()});
}
public static void show(CommandSender sender, String[] args) {
if (args.length < 4) {
Notification.error(sender, "用法: /dominion group setting <领地名称> <权限组名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]);
return;
}
if (noAuthToManage(player, dominion)) return;
int page = Apis.getPage(args, 4);
GroupDTO group = GroupDTO.select(dominion.getId(), args[3]);
if (group == null) {
Notification.error(sender, "权限组 %s 不存在", args[3]);
return;
}
ListView view = ListView.create(10, "/dominion group setting " + dominion.getName() + " " + group.getName());
view.title("权限组 " + group.getName() + " 管理");
view.navigator(
Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append(Button.create("权限组列表").setExecuteCommand("/dominion group list " + dominion.getName()).build())
.append("权限组管理")
);
Button rename_btn = Button.create("重命名此权限组")
.setHoverText("重命名权限组 " + group.getName())
.setExecuteCommand("/dominion cui_rename_group " + dominion.getName() + " " + group.getName());
view.add(Line.create().append(rename_btn.build()));
if (group.getAdmin()) {
view.add(Line.create()
.append(Button.createGreen("")
.setExecuteCommand(parseCommand(dominion.getName(), group.getName(), "admin", false, page))
.build())
.append("管理员"));
view.add(createOption(Flag.GLOW, group.getFlagValue(Flag.GLOW), dominion.getName(), group.getName(), page));
} else {
view.add(Line.create()
.append(Button.createRed("")
.setExecuteCommand(parseCommand(dominion.getName(), group.getName(), "admin", true, page))
.build())
.append("管理员"));
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, group.getFlagValue(flag), dominion.getName(), group.getName(), page));
}
}
view.showOn(player, page);
}
private static Line createOption(Flag flag, boolean value, String DominionName, String groupName, int page) {
if (value) {
return Line.create()
.append(Button.createGreen("")
.setExecuteCommand(parseCommand(DominionName, groupName, flag.getFlagName(), false, page))
.build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
} else {
return Line.create()
.append(Button.createRed("")
.setExecuteCommand(parseCommand(DominionName, groupName, flag.getFlagName(), true, page))
.build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
}
}
private static String parseCommand(String dominionName, String groupName, String flagName, boolean value, int page) {
return String.format("/dominion group set_flag %s %s %s %s %d", dominionName, groupName, flagName, value, page);
}
}

View File

@ -0,0 +1,57 @@
package cn.lunadeer.dominion.tuis.dominion.manage.group;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
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.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
public class SelectMember {
public static void show(CommandSender sender, String[] args) {
if (args.length < 4) {
Notification.error(sender, "用法: /dominion group select_member <领地名称> <权限组名称> [回显页码] [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]);
return;
}
if (noAuthToManage(player, dominion)) return;
GroupDTO group = GroupDTO.select(dominion.getId(), args[3]);
if (group == null) {
Notification.error(sender, "权限组不存在");
return;
}
int backPage = getPage(args, 4);
int page = getPage(args, 5);
ListView view = ListView.create(10, "/dominion group select_member " + dominion.getName() + " " + group.getName() + " " + backPage);
view.title("选择成员");
Line sub = Line.create().append("选择成员添加到权限组 " + group.getName())
.append(Button.create("返回").setExecuteCommand("/dominion group list " + dominion.getName() + " " + backPage).build());
view.subtitle(sub);
List<MemberDTO> members = MemberDTO.selectByDomGroupId(dominion.getId(), -1);
for (MemberDTO member : members) {
PlayerDTO p = PlayerDTO.select(member.getPlayerUUID());
if (p == null) continue;
view.add(Line.create()
.append(Button.create(p.getLastKnownName())
.setExecuteCommand("/dominion group add_member " + dominion.getName() + " " + group.getName() + " " + p.getLastKnownName() + " " + backPage)
.build()));
}
view.showOn(player, page);
}
}

View File

@ -0,0 +1,119 @@
package cn.lunadeer.dominion.tuis.dominion.manage.member;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.CommandParser;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
public class MemberList {
public static void show(CommandSender sender, String dominionName, Integer page) {
show(sender, new String[]{"", "", dominionName, page.toString()});
}
public static void show(CommandSender sender, String dominionName) {
show(sender, new String[]{"", "", dominionName});
}
public static void show(CommandSender sender, String[] args) {
if (args.length < 3) {
Notification.error(sender, "用法: /dominion member list <领地名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]);
return;
}
int page = getPage(args, 3);
ListView view = ListView.create(10, "/dominion member list " + dominion.getName());
if (noAuthToManage(player, dominion)) return;
List<MemberDTO> privileges = MemberDTO.select(dominion.getId());
view.title("领地 " + dominion.getName() + " 成员列表");
view.navigator(
Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("成员列表")
);
view.add(Line.create().append(Button.create("添加成员")
.setExecuteCommand(CommandParser("/dominion member select_player %s", dominion.getName())).build()));
for (MemberDTO privilege : privileges) {
PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID());
if (p_player == null) continue;
GroupDTO group = Cache.instance.getGroup(privilege.getGroupId());
Line line = Line.create();
if (group != null) {
line.append(groupTag);
} else if (privilege.getAdmin()) {
line.append(adminTag);
} else {
if (!privilege.getFlagValue(Flag.MOVE)) {
line.append(banTag);
} else {
line.append(normalTag);
}
}
Button prev = Button.createGreen("权限")
.setHoverText("配置成员权限")
.setExecuteCommand(CommandParser("/dominion member setting %s %s", dominion.getName(), p_player.getLastKnownName()));
Button remove = Button.createRed("移除")
.setHoverText("将此成员移出(变为访客)")
.setExecuteCommand(CommandParser("/dominion member remove %s %s", dominion.getName(), p_player.getLastKnownName()));
if (!player.getUniqueId().equals(dominion.getOwner())) {
boolean disable = false;
if (group == null) {
if (privilege.getAdmin()) {
disable = true;
}
} else {
if (group.getAdmin()) {
disable = true;
}
}
if (disable) {
prev.setDisabled("你不是领地主人,无法编辑管理员权限");
remove.setDisabled("你不是领地主人,无法移除管理员");
}
}
if (group != null) {
prev.setDisabled(String.format("此成员属于权限组 %s 无法单独编辑权限", group.getName()));
}
line.append(remove.build());
line.append(prev.build());
line.append(p_player.getLastKnownName());
view.add(line);
}
view.showOn(player, page);
}
private static final TextComponent adminTag = Component.text("[A]", Style.style(TextColor.color(97, 97, 210)))
.hoverEvent(Component.text("这是一个管理员"));
private static final TextComponent normalTag = Component.text("[N]", Style.style(TextColor.color(255, 255, 255)))
.hoverEvent(Component.text("这是一个普通成员"));
private static final TextComponent banTag = Component.text("[B]", Style.style(TextColor.color(255, 67, 0)))
.hoverEvent(Component.text("这是一个黑名单成员"));
private static final TextComponent groupTag = Component.text("[G]", Style.style(TextColor.color(0, 185, 153)))
.hoverEvent(Component.text("这个成员在一个权限组里"));
}

View File

@ -1,9 +1,9 @@
package cn.lunadeer.dominion.tuis;
package cn.lunadeer.dominion.tuis.dominion.manage.member;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -13,35 +13,40 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_2;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
public class PrivilegeInfo {
// /dominion privilege_info <玩家名称> [领地名称] [页码]
public class MemberSetting {
public static void show(CommandSender sender, String dominionName, String playerName, Integer page) {
show(sender, new String[]{"", "", dominionName, playerName, page.toString()});
}
public static void show(CommandSender sender, String dominionName, String playerName) {
show(sender, new String[]{"", "", dominionName, playerName});
}
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = getDominionNameArg_2(player, args);
int page = 1;
if (args.length == 4) {
try {
page = Integer.parseInt(args[3]);
} catch (Exception ignored) {
}
}
String playerName = args[1];
if (dominion == null) {
Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion privilege_info <玩家名称> [领地名称]");
if (args.length < 3) {
Notification.error(sender, "用法: /dominion member setting <领地名称> <玩家名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]);
return;
}
ListView view = ListView.create(10, "/dominion privilege_info " + playerName + " " + dominion.getName());
if (noAuthToManage(player, dominion)) return;
int page = getPage(args, 4);
String playerName = args[3];
ListView view = ListView.create(10, "/dominion member setting " + dominion.getName() + " " + playerName);
PlayerDTO playerDTO = PlayerDTO.select(playerName);
if (playerDTO == null) {
Notification.error(sender, "玩家 %s 不存在", playerName);
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(playerDTO.getUuid(), dominion.getId());
MemberDTO privilege = MemberDTO.select(playerDTO.getUuid(), dominion.getId());
if (privilege == null) {
Notification.warn(sender, "玩家 %s 不是领地 %s 的成员", playerName, dominion.getName());
return;
@ -52,20 +57,28 @@ public class PrivilegeInfo {
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append(Button.create("成员列表").setExecuteCommand("/dominion privilege_list " + dominion.getName()).build())
.append(Button.create("成员列表").setExecuteCommand("/dominion member list " + dominion.getName()).build())
.append("成员权限")
);
view.add(Line.create().append(Button.createGreen("套用模板")
.setHoverText("选择一个权限模板套用")
.setExecuteCommand("/dominion member select_template " + dominion.getName() + " " + playerName).build()));
if (privilege.getAdmin()) {
view.add(Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion set_privilege " + playerName + " admin false " + dominion.getName() + " " + page).build())
.append(Button.createGreen("").setExecuteCommand(
parseCommand(dominion.getName(), playerName, "admin", false, page)
).build())
.append("管理员"));
view.add(createOption(Flag.GLOW, privilege.getFlagValue(Flag.GLOW), playerName, dominion.getName(), page));
} else {
view.add(Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion set_privilege " + playerName + " admin true " + dominion.getName() + " " + page).build())
.append(Button.createRed("").setExecuteCommand(
parseCommand(dominion.getName(), playerName, "admin", true, page)
).build())
.append("管理员"));
}
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page));
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page));
}
}
view.showOn(player, page);
}
@ -73,12 +86,20 @@ public class PrivilegeInfo {
private static Line createOption(Flag flag, boolean value, String player_name, String dominion_name, int page) {
if (value) {
return Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion set_privilege " + player_name + " " + flag.getFlagName() + " false " + dominion_name + " " + page).build())
.append(Button.createGreen("").setExecuteCommand(
parseCommand(dominion_name, player_name, flag.getFlagName(), false, page)
).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
} else {
return Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion set_privilege " + player_name + " " + flag.getFlagName() + " true " + dominion_name + " " + page).build())
.append(Button.createRed("").setExecuteCommand(
parseCommand(dominion_name, player_name, flag.getFlagName(), true, page)
).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
}
}
private static String parseCommand(String dominionName, String playerName, String flagName, boolean value, int page) {
return String.format("/dominion member set_flag %s %s %s %s %d", dominionName, playerName, flagName, value, page);
}
}

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis;
package cn.lunadeer.dominion.tuis.dominion.manage.member;
import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
@ -10,26 +11,29 @@ import org.bukkit.entity.Player;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.CommandParser;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class SelectPlayer {
// /dominion select_player_create_privilege <领地名称> [页码]
public static void show(CommandSender sender, String dominionName, Integer page) {
show(sender, new String[]{"", "", dominionName, page.toString()});
}
public static void show(CommandSender sender, String[] args) {
if (args.length < 3) {
Notification.error(sender, "用法: /dominion member select_player <领地名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
int page = 1;
if (args.length == 3) {
try {
page = Integer.parseInt(args[2]);
} catch (Exception ignored) {
}
}
String dominion_name = args[1];
ListView view = ListView.create(10, "/dominion select_player_create_privilege " + dominion_name);
int page = getPage(args, 3);
String dominion_name = args[2];
ListView view = ListView.create(10, "/dominion member select_player " + dominion_name);
Line sub = Line.create()
.append("只能选择已经登录过的玩家")
.append(Button.create("搜索").setExecuteCommand("/dominion cui_create_privilege " + dominion_name).build())
.append(Button.create("返回").setExecuteCommand("/dominion privilege_list " + dominion_name).build());
.append(Button.create("搜索").setExecuteCommand("/dominion cui_member_add " + dominion_name).build())
.append(Button.create("返回").setExecuteCommand("/dominion member list " + dominion_name).build());
view.title("选择玩家添加为成员").subtitle(sub);
List<PlayerDTO> players = PlayerController.allPlayers();
for (PlayerDTO p : players) {
@ -38,7 +42,7 @@ public class SelectPlayer {
}
view.add(Line.create().
append(Button.create(p.getLastKnownName())
.setExecuteCommand("/dominion create_privilege " + p.getLastKnownName() + " " + dominion_name + " b")
.setExecuteCommand(CommandParser("/dominion member add %s %s", dominion_name, p.getLastKnownName()))
.build()));
}
view.showOn(player, page);

View File

@ -0,0 +1,56 @@
package cn.lunadeer.dominion.tuis.dominion.manage.member;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.CommandParser;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class SelectTemplate {
public static void show(CommandSender sender, String[] args) {
if (args.length < 4) {
// /dominion member select_template <领地名称> <玩家名称> [页码]
Notification.error(sender, "用法: /dominion member select_template <领地名称> <玩家名称> [页码]");
return;
}
Player player = playerOnly(sender);
if (player == null) return;
String dominionName = args[2];
String playerName = args[3];
int page = getPage(args, 4);
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
ListView view = ListView.create(10, "/dominion member select_template " + dominionName + " " + playerName);
view.title("选择一个模板");
Line sub = Line.create()
.append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上")
.append(Button.create("返回").setExecuteCommand("/dominion member setting " + dominionName + " " + playerName).build());
view.subtitle(sub);
for (PrivilegeTemplateDTO template : templates) {
// /dominion member apply_template <领地名称> <成员名称> <模板名称>
view.add(Line.create()
.append(Button.create("选择")
.setExecuteCommand(CommandParser("/dominion member apply_template %s %s %s", dominionName, playerName, template.getName()))
.build())
.append(Component.text(template.getName())));
}
view.showOn(player, page);
}
}

View File

@ -0,0 +1,53 @@
package cn.lunadeer.dominion.tuis.template;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
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.tuis.Apis.getPage;
public class TemplateList {
public static void show(CommandSender sender) {
show(sender, 1);
}
public static void show(CommandSender sender, int page) {
show(sender, new String[]{"", "", String.valueOf(page)});
}
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = getPage(args, 2);
ListView view = ListView.create(10, "/dominion template list");
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
view.title("成员权限模板列表");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("模板列表"));
Button create = Button.create("创建成员权限模板").setExecuteCommand("/dominion cui_template_create")
.setHoverText("创建一个新的成员权限模板");
view.add(Line.create().append(create.build()));
for (PrivilegeTemplateDTO template : templates) {
Button manage = Button.createGreen("配置").setExecuteCommand("/dominion template setting " + template.getName());
Button delete = Button.createRed("删除").setExecuteCommand("/dominion template delete " + template.getName());
Line line = Line.create()
.append(delete.build())
.append(manage.build())
.append(template.getName());
view.add(line);
}
view.showOn(player, page);
}
}

View File

@ -0,0 +1,73 @@
package cn.lunadeer.dominion.tuis.template;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class TemplateSetting {
// /dominion template setting <模板名称> [页码]
public static void show(CommandSender sender, String templateName, int page) {
show(sender, new String[]{"", "", templateName, String.valueOf(page)});
}
public static void show(CommandSender sender, String templateName) {
show(sender, new String[]{"", "", templateName});
}
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = getPage(args, 3);
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[2]);
if (template == null) {
Notification.error(sender, "模板 %s 不存在", args[2]);
return;
}
ListView view = ListView.create(10, "/dominion template manage " + template.getName());
view.title("模板 " + args[1] + " 权限管理");
view.navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("模板列表").setExecuteCommand("/dominion template list").build())
.append("模板管理")
);
// /dominion template_set_flag <模板名称> <权限名称> <true/false> [页码]
if (template.getAdmin()) {
view.add(Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin false " + page).build())
.append("管理员"));
} else {
view.add(Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin true " + page).build())
.append("管理员"));
}
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, template.getFlagValue(flag), template.getName(), page));
}
view.showOn(player, page);
}
private static Line createOption(Flag flag, boolean value, String templateName, int page) {
if (value) {
return Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion template set_flag " + templateName + " " + flag.getFlagName() + " false " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
} else {
return Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion template set_flag " + templateName + " " + flag.getFlagName() + " true " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
}
}
}

View File

@ -0,0 +1,155 @@
package cn.lunadeer.dominion.utils;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.utils.Residence.Message;
import cn.lunadeer.dominion.utils.Residence.Permission;
import cn.lunadeer.dominion.utils.Residence.Residence;
import cn.lunadeer.dominion.utils.Residence.SaveFile;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.plugin.java.JavaPlugin;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.*;
public class ResMigration {
public static class ResidenceNode {
public UUID owner;
public World world;
public String name;
public Location loc1;
public Location loc2;
public Location tpLoc;
public String joinMessage;
public String leaveMessage;
public List<ResidenceNode> children = new ArrayList<>();
}
public static List<ResidenceNode> extractFromResidence(JavaPlugin plugin) {
List<ResidenceNode> dominions = new ArrayList<>();
File resSave = new File(plugin.getDataFolder().getParent(), "Residence");
resSave = new File(resSave, "Save");
resSave = new File(resSave, "Worlds");
if (!resSave.exists()) {
XLogger.info("Residence Save not found, skipping migration");
return dominions;
}
// list .yml files
File[] files = resSave.listFiles((dir, name) -> name.endsWith(".yml"));
if (files == null || files.length == 0) {
XLogger.info("No save files found");
return dominions;
}
for (File file : files) {
try {
dominions.addAll(processWorld(file));
} catch (Exception e) {
XLogger.err("Failed to process file: %s, %s", file.getName(), e.getMessage());
}
}
XLogger.info("Extract %d residences", dominions.size());
return dominions;
}
private static ResidenceNode parseDominion(String name, World world, Residence res, SaveFile save) {
OfflinePlayer bukkitOwner = Dominion.instance.getServer().getOfflinePlayer(UUID.fromString(res.Permissions.OwnerUUID));
PlayerDTO owner = PlayerDTO.get(bukkitOwner);
if (owner == null) {
XLogger.warn("Owner not found: " + res.Permissions.OwnerUUID);
return null;
}
String[] loc = res.Areas.values().toArray()[0].toString().split(":");
if (loc.length != 6) {
XLogger.warn("Invalid location: " + res.Areas.get("main"));
return null;
}
ResidenceNode dominionNode = new ResidenceNode();
dominionNode.owner = owner.getUuid();
dominionNode.world = world;
dominionNode.name = name;
dominionNode.joinMessage = save.Messages.get(res.Messages).EnterMessage;
dominionNode.leaveMessage = save.Messages.get(res.Messages).LeaveMessage;
dominionNode.loc1 = new Location(world, Double.parseDouble(loc[0]), Double.parseDouble(loc[1]), Double.parseDouble(loc[2]));
dominionNode.loc2 = new Location(world, Double.parseDouble(loc[3]), Double.parseDouble(loc[4]), Double.parseDouble(loc[5]));
if (res.TPLoc != null) {
String[] tpLocStr = res.TPLoc.split(":");
if (tpLocStr.length >= 3) {
dominionNode.tpLoc = new Location(world, Double.parseDouble(tpLocStr[0]), Double.parseDouble(tpLocStr[1]), Double.parseDouble(tpLocStr[2]));
}
}
if (res.Subzones != null) {
for (Map.Entry<String, Residence> entry : res.Subzones.entrySet()) {
ResidenceNode sub = parseDominion(entry.getKey(), world, entry.getValue(), save);
if (sub != null) {
dominionNode.children.add(sub);
}
}
}
return dominionNode;
}
private static Map<String, Residence> parseResYml(Map<String, Object> zones) {
Map<String, Residence> res = new HashMap<>();
for (Map.Entry<String, Object> entry : zones.entrySet()) {
Map<String, Object> zone = (Map<String, Object>) entry.getValue();
Residence residence = new Residence();
if (zone.containsKey("TPLoc")) {
residence.setTPLoc((String) zone.get("TPLoc"));
}
residence.setMessages((int) zone.get("Messages"));
Permission permission = new Permission();
permission.OwnerUUID = ((Map<String, Object>) zone.get("Permissions")).get("OwnerUUID").toString();
permission.OwnerLastKnownName = ((Map<String, Object>) zone.get("Permissions")).get("OwnerLastKnownName").toString();
residence.setPermissions(permission);
residence.setAreas((Map<String, String>) zone.get("Areas"));
if (zone.containsKey("Subzones")) {
residence.setSubzones(parseResYml((Map<String, Object>) zone.get("Subzones")));
}
res.put(entry.getKey(), residence);
}
return res;
}
private static List<ResidenceNode> processWorld(File saveFile) throws Exception {
XLogger.debug("=====================================");
XLogger.debug("Processing file: %s", saveFile.getName());
String worldName = saveFile.getName().replace("res_", "").replace(".yml", "");
World world = Dominion.instance.getServer().getWorld(worldName);
InputStream inputStream = Files.newInputStream(saveFile.toPath());
Map<String, Object> yaml = new Yaml().load(inputStream);
SaveFile save = new SaveFile();
Map<Integer, Object> Messages = (Map<Integer, Object>) yaml.get("Messages");
Map<Integer, Message> messages = new HashMap<>();
for (Map.Entry<Integer, Object> entry : Messages.entrySet()) {
Map<String, String> message = (Map<String, String>) entry.getValue();
Message msg = new Message();
msg.EnterMessage = (String) message.get("EnterMessage");
msg.LeaveMessage = (String) message.get("LeaveMessage");
messages.put(entry.getKey(), msg);
}
save.setMessages(messages);
Map<String, Object> Residences = (Map<String, Object>) yaml.get("Residences");
save.Residences = parseResYml(Residences);
inputStream.close();
List<ResidenceNode> dominions = new ArrayList<>();
for (Map.Entry<String, Residence> entry : save.Residences.entrySet()) {
String name = entry.getKey();
Residence residence = entry.getValue();
ResidenceNode dominion = parseDominion(name, world, residence, save);
dominions.add(dominion);
}
return dominions;
}
}

View File

@ -0,0 +1,24 @@
package cn.lunadeer.dominion.utils.Residence;
public class Message {
public String LeaveMessage;
public String EnterMessage;
// getters and setters
public String getLeaveMessage() {
return LeaveMessage;
}
public void setLeaveMessage(String leaveMessage) {
LeaveMessage = leaveMessage;
}
public String getEnterMessage() {
return EnterMessage;
}
public void setEnterMessage(String enterMessage) {
EnterMessage = enterMessage;
}
}

View File

@ -0,0 +1,24 @@
package cn.lunadeer.dominion.utils.Residence;
public class Permission {
public String OwnerUUID;
public String OwnerLastKnownName;
// getters and setters
public String getOwnerUUID() {
return OwnerUUID;
}
public void setOwnerUUID(String ownerUUID) {
OwnerUUID = ownerUUID;
}
public String getOwnerLastKnownName() {
return OwnerLastKnownName;
}
public void setOwnerLastKnownName(String ownerLastKnownName) {
OwnerLastKnownName = ownerLastKnownName;
}
}

View File

@ -0,0 +1,53 @@
package cn.lunadeer.dominion.utils.Residence;
import java.util.Map;
public class Residence {
public String TPLoc;
public Map<String, Residence> Subzones;
public int Messages;
public Permission Permissions;
public Map<String, String> Areas;
// getters and setters
public String getTPLoc() {
return TPLoc;
}
public void setTPLoc(String TPLoc) {
this.TPLoc = TPLoc;
}
public Map<String, Residence> getSubzones() {
return Subzones;
}
public void setSubzones(Map<String, Residence> subzones) {
Subzones = subzones;
}
public int getMessages() {
return Messages;
}
public void setMessages(int messages) {
Messages = messages;
}
public Permission getPermissions() {
return Permissions;
}
public void setPermissions(Permission permissions) {
Permissions = permissions;
}
public Map<String, String> getAreas() {
return Areas;
}
public void setAreas(Map<String, String> areas) {
Areas = areas;
}
}

View File

@ -0,0 +1,25 @@
package cn.lunadeer.dominion.utils.Residence;
import java.util.Map;
public class SaveFile {
public Map<String, Residence> Residences;
public Map<Integer, Message> Messages;
// getters and setters
public Map<String, Residence> getResidences() {
return Residences;
}
public void setResidences(Map<String, Residence> residences) {
Residences = residences;
}
public Map<Integer, Message> getMessages() {
return Messages;
}
public void setMessages(Map<Integer, Message> messages) {
Messages = messages;
}
}

View File

@ -1,40 +0,0 @@
package cn.lunadeer.dominion.utils;
import org.bukkit.Bukkit;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Time {
public static String nowStr() {
// yyyy-MM-dd HH:mm:ss
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}
/**
* 尝试获取folia的调度器
*
* @return 是否成功
*/
private static boolean tryFolia() {
try {
Bukkit.getAsyncScheduler();
return true;
} catch (Throwable ignored) {
}
return false;
}
private static Boolean IS_FOLIA = null;
/**
* 判断是否是folia核心
*
* @return 是否是folia核心
*/
public static Boolean isFolia() {
if (IS_FOLIA == null) IS_FOLIA = tryFolia();
return IS_FOLIA;
}
}

View File

@ -1,5 +1,5 @@
Database:
Type: sqlite # pgsql, sqlite
Type: sqlite # pgsql, sqlite, mysql
Host: localhost
Port: 5432
Name: dominion
@ -49,6 +49,9 @@ FlyPermissionNodes:
- essentials.fly
- cmi.command.fly
# 是否允许玩家从 Residence 迁移领地数据
ResidenceMigration: false
BlueMap: true
CheckUpdate: true

View File

@ -4,6 +4,8 @@ main: cn.lunadeer.dominion.Dominion
api-version: '1.20'
load: STARTUP
folia-supported: true
loadbefore:
- Vault
commands:
Dominion:
description: 领地插件命令